Hash :
15ff463c
Author :
Thomas de Grivel
Date :
2022-05-26T13:19:02
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 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 6129 6130 6131 6132 6133 6134 6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155 6156 6157 6158 6159 6160 6161 6162 6163 6164 6165 6166 6167 6168 6169 6170 6171 6172 6173 6174 6175 6176 6177 6178 6179 6180 6181 6182 6183 6184 6185 6186 6187 6188 6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221 6222 6223 6224 6225 6226 6227 6228 6229 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252 6253 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280 6281 6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292 6293 6294 6295 6296 6297 6298 6299 6300 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 6322 6323 6324 6325 6326 6327 6328 6329 6330 6331 6332 6333 6334 6335 6336 6337 6338 6339 6340 6341 6342 6343 6344 6345 6346 6347 6348 6349 6350 6351 6352 6353 6354 6355 6356 6357 6358 6359 6360 6361 6362 6363 6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 6429 6430 6431 6432 6433 6434 6435 6436 6437 6438 6439 6440 6441 6442 6443 6444 6445 6446 6447 6448 6449 6450 6451 6452 6453 6454 6455 6456 6457 6458 6459 6460 6461 6462 6463 6464 6465 6466 6467 6468 6469 6470 6471 6472 6473 6474 6475 6476 6477 6478 6479 6480 6481 6482 6483 6484 6485 6486 6487 6488 6489 6490 6491 6492 6493 6494 6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 6505 6506 6507 6508 6509 6510 6511 6512 6513 6514 6515 6516 6517 6518 6519 6520 6521 6522 6523 6524 6525 6526 6527 6528 6529 6530 6531 6532 6533 6534 6535 6536 6537 6538 6539 6540 6541 6542 6543 6544 6545 6546 6547 6548 6549 6550 6551 6552 6553 6554 6555 6556 6557 6558 6559 6560 6561 6562 6563 6564 6565 6566 6567 6568 6569 6570 6571 6572 6573 6574 6575 6576 6577 6578 6579 6580 6581 6582 6583 6584 6585 6586 6587 6588 6589 6590 6591 6592 6593 6594 6595 6596 6597 6598 6599 6600 6601 6602 6603 6604 6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619 6620 6621 6622 6623 6624 6625 6626 6627 6628 6629 6630 6631 6632 6633 6634 6635 6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 6715 6716 6717 6718 6719 6720 6721 6722 6723 6724 6725 6726 6727 6728 6729 6730 6731 6732 6733 6734 6735 6736 6737 6738 6739 6740 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752 6753 6754 6755 6756 6757 6758 6759 6760 6761 6762 6763 6764 6765 6766 6767 6768 6769 6770 6771 6772 6773 6774 6775 6776 6777 6778 6779 6780 6781 6782 6783 6784 6785 6786 6787 6788 6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 6799 6800 6801 6802 6803 6804 6805 6806 6807 6808 6809 6810 6811 6812 6813 6814 6815 6816 6817 6818 6819 6820 6821 6822 6823 6824 6825 6826 6827 6828 6829 6830 6831 6832 6833 6834 6835 6836 6837 6838 6839 6840 6841 6842 6843 6844 6845 6846 6847 6848 6849 6850 6851 6852 6853 6854 6855 6856 6857 6858 6859 6860 6861 6862 6863 6864 6865 6866 6867 6868 6869 6870 6871 6872 6873 6874 6875 6876 6877 6878 6879 6880 6881 6882 6883 6884 6885 6886 6887 6888 6889 6890 6891 6892 6893 6894 6895 6896 6897 6898 6899 6900 6901 6902 6903 6904 6905 6906 6907 6908 6909 6910 6911 6912 6913 6914 6915 6916 6917 6918 6919 6920 6921 6922 6923 6924 6925 6926 6927 6928 6929 6930 6931 6932 6933 6934 6935 6936 6937 6938 6939 6940 6941 6942 6943 6944 6945 6946 6947 6948 6949 6950 6951 6952 6953 6954 6955 6956 6957 6958 6959 6960 6961 6962 6963 6964 6965 6966 6967 6968 6969 6970 6971 6972 6973 6974 6975 6976 6977 6978 6979 6980 6981 6982 6983 6984 6985 6986 6987 6988 6989 6990 6991 6992 6993 6994 6995 6996 6997 6998 6999 7000 7001 7002 7003 7004 7005 7006 7007 7008 7009 7010 7011 7012 7013 7014 7015 7016 7017 7018 7019 7020 7021 7022 7023 7024 7025 7026 7027 7028 7029 7030 7031 7032 7033 7034 7035 7036 7037 7038 7039 7040 7041 7042 7043 7044 7045 7046 7047 7048 7049 7050 7051 7052 7053 7054 7055 7056 7057 7058 7059 7060 7061 7062 7063 7064 7065 7066 7067 7068 7069 7070 7071 7072 7073 7074 7075 7076 7077 7078 7079 7080 7081 7082 7083 7084 7085 7086 7087 7088 7089 7090 7091 7092 7093 7094 7095 7096 7097 7098 7099 7100 7101 7102 7103 7104 7105 7106 7107 7108 7109 7110 7111 7112 7113 7114 7115 7116 7117 7118 7119 7120 7121 7122 7123 7124 7125 7126 7127 7128 7129 7130 7131 7132 7133 7134 7135 7136 7137 7138 7139 7140 7141 7142 7143 7144 7145 7146 7147 7148 7149 7150 7151 7152 7153 7154 7155 7156 7157 7158 7159 7160 7161 7162 7163 7164 7165 7166 7167 7168 7169 7170 7171 7172 7173 7174 7175 7176 7177 7178 7179 7180 7181 7182 7183 7184 7185 7186 7187 7188 7189 7190 7191 7192 7193 7194 7195 7196 7197 7198 7199 7200 7201 7202 7203 7204 7205 7206 7207 7208 7209 7210 7211 7212 7213 7214 7215 7216 7217 7218 7219 7220 7221 7222 7223 7224 7225 7226 7227 7228 7229 7230 7231 7232 7233 7234 7235 7236 7237 7238 7239 7240 7241 7242 7243 7244 7245 7246 7247 7248 7249 7250 7251 7252 7253 7254 7255 7256 7257 7258 7259 7260 7261 7262 7263 7264 7265 7266 7267 7268 7269 7270 7271 7272 7273 7274 7275 7276 7277 7278 7279 7280 7281 7282 7283 7284 7285 7286 7287 7288 7289 7290 7291 7292 7293 7294 7295 7296 7297 7298 7299 7300 7301 7302 7303 7304 7305 7306 7307 7308 7309 7310 7311 7312 7313 7314 7315 7316 7317 7318 7319 7320 7321 7322 7323 7324 7325 7326 7327 7328 7329 7330 7331 7332 7333 7334 7335 7336 7337 7338 7339 7340 7341 7342 7343 7344 7345 7346 7347 7348 7349 7350 7351 7352 7353 7354 7355 7356 7357 7358 7359 7360 7361 7362 7363 7364 7365 7366 7367 7368 7369 7370 7371 7372 7373 7374 7375 7376 7377 7378 7379 7380 7381 7382 7383 7384 7385 7386 7387 7388 7389 7390 7391 7392 7393 7394 7395 7396 7397 7398 7399 7400 7401 7402 7403 7404 7405 7406 7407 7408 7409 7410 7411 7412 7413 7414 7415 7416 7417 7418 7419 7420 7421 7422 7423 7424 7425 7426 7427 7428 7429 7430 7431 7432 7433 7434 7435 7436 7437 7438 7439 7440 7441 7442 7443 7444 7445 7446 7447 7448 7449 7450 7451 7452 7453 7454 7455 7456 7457 7458 7459 7460 7461 7462 7463 7464 7465 7466 7467 7468 7469 7470 7471 7472 7473 7474 7475 7476 7477 7478 7479 7480 7481 7482 7483 7484 7485 7486 7487 7488 7489 7490 7491 7492 7493 7494 7495 7496 7497 7498 7499 7500 7501 7502 7503 7504 7505 7506 7507 7508 7509 7510 7511 7512 7513 7514 7515 7516 7517 7518 7519 7520 7521 7522 7523 7524 7525 7526 7527 7528 7529 7530 7531 7532 7533 7534 7535 7536 7537 7538 7539 7540 7541 7542 7543 7544 7545 7546 7547 7548 7549 7550 7551 7552 7553 7554 7555 7556 7557 7558 7559 7560 7561 7562 7563 7564 7565 7566 7567 7568 7569 7570 7571 7572 7573 7574 7575 7576 7577 7578 7579 7580 7581 7582 7583 7584 7585 7586 7587 7588 7589 7590 7591 7592 7593 7594 7595 7596 7597 7598 7599 7600 7601 7602 7603 7604 7605 7606 7607 7608 7609 7610 7611 7612 7613 7614 7615 7616 7617 7618 7619 7620 7621 7622 7623 7624 7625 7626 7627 7628 7629 7630 7631 7632 7633 7634 7635 7636 7637 7638 7639 7640 7641 7642 7643 7644 7645 7646 7647 7648 7649 7650 7651 7652 7653 7654 7655 7656 7657 7658 7659 7660 7661 7662 7663 7664 7665 7666 7667 7668 7669 7670 7671 7672 7673 7674 7675 7676 7677 7678 7679 7680 7681 7682 7683 7684 7685 7686 7687 7688 7689 7690 7691 7692 7693 7694 7695 7696 7697 7698 7699 7700 7701 7702 7703 7704 7705 7706 7707 7708 7709 7710 7711 7712 7713 7714 7715 7716 7717 7718 7719 7720 7721 7722 7723 7724 7725 7726 7727 7728 7729 7730 7731 7732 7733 7734 7735 7736 7737 7738 7739 7740 7741 7742 7743 7744 7745 7746 7747 7748 7749 7750 7751 7752 7753 7754 7755 7756 7757 7758 7759 7760 7761 7762 7763 7764 7765 7766 7767 7768 7769 7770 7771 7772 7773 7774 7775 7776 7777 7778 7779 7780 7781 7782 7783 7784 7785 7786 7787 7788 7789 7790 7791 7792 7793 7794 7795 7796 7797 7798 7799 7800 7801 7802 7803 7804 7805 7806 7807 7808 7809 7810 7811 7812 7813 7814 7815 7816 7817 7818 7819 7820 7821 7822 7823 7824 7825 7826 7827 7828 7829 7830 7831 7832 7833 7834 7835 7836 7837 7838 7839 7840 7841 7842 7843 7844 7845 7846 7847 7848 7849 7850 7851 7852 7853 7854 7855 7856 7857 7858 7859 7860 7861 7862 7863 7864 7865 7866 7867 7868 7869 7870 7871 7872 7873 7874 7875 7876 7877 7878 7879 7880 7881 7882 7883 7884 7885 7886 7887 7888 7889 7890 7891 7892 7893 7894 7895 7896 7897 7898 7899 7900 7901 7902 7903 7904 7905 7906 7907 7908 7909 7910 7911 7912 7913 7914 7915 7916 7917 7918 7919 7920 7921 7922 7923 7924 7925 7926 7927 7928 7929 7930 7931 7932 7933 7934 7935 7936 7937 7938 7939 7940 7941 7942 7943 7944 7945 7946 7947 7948 7949 7950 7951 7952 7953 7954 7955 7956 7957 7958 7959 7960 7961 7962 7963 7964 7965 7966 7967 7968 7969 7970 7971 7972 7973 7974 7975 7976 7977 7978 7979 7980 7981 7982 7983 7984 7985 7986 7987 7988 7989 7990 7991 7992 7993 7994 7995 7996 7997 7998 7999 8000 8001 8002 8003 8004 8005 8006 8007 8008 8009 8010 8011 8012 8013 8014 8015 8016 8017 8018 8019 8020 8021 8022 8023 8024 8025 8026 8027 8028 8029 8030 8031 8032 8033 8034 8035 8036 8037 8038 8039 8040 8041 8042 8043 8044 8045 8046 8047 8048 8049 8050 8051 8052 8053 8054 8055 8056 8057 8058 8059 8060 8061 8062 8063 8064 8065 8066 8067 8068 8069 8070 8071 8072 8073 8074 8075 8076 8077 8078 8079 8080 8081 8082 8083 8084 8085 8086 8087 8088 8089 8090 8091 8092 8093 8094 8095 8096 8097 8098 8099 8100 8101 8102 8103 8104 8105 8106 8107 8108 8109 8110 8111 8112 8113 8114 8115 8116 8117 8118 8119 8120 8121 8122 8123 8124 8125 8126 8127 8128 8129 8130 8131 8132 8133 8134 8135 8136 8137 8138 8139 8140 8141 8142 8143 8144 8145 8146 8147 8148 8149 8150 8151 8152 8153 8154 8155 8156 8157 8158 8159 8160 8161 8162 8163 8164 8165 8166 8167 8168 8169 8170 8171 8172 8173 8174 8175 8176 8177 8178 8179 8180 8181 8182 8183 8184 8185 8186 8187 8188 8189 8190 8191 8192 8193 8194 8195 8196 8197 8198 8199 8200 8201 8202 8203 8204 8205 8206 8207 8208 8209 8210 8211 8212 8213 8214 8215 8216 8217 8218 8219 8220 8221 8222 8223 8224 8225 8226 8227 8228 8229 8230 8231 8232 8233 8234 8235 8236 8237 8238 8239 8240 8241 8242 8243 8244 8245 8246 8247 8248 8249 8250 8251 8252 8253 8254 8255 8256 8257 8258 8259 8260 8261 8262 8263 8264 8265 8266 8267 8268 8269 8270 8271 8272 8273 8274 8275 8276 8277 8278 8279 8280 8281 8282 8283 8284 8285 8286 8287 8288 8289 8290 8291 8292 8293 8294 8295 8296 8297 8298 8299 8300 8301 8302 8303 8304 8305 8306 8307 8308 8309 8310 8311 8312 8313 8314 8315 8316 8317 8318 8319 8320 8321 8322 8323 8324 8325 8326 8327 8328 8329 8330 8331 8332 8333 8334 8335 8336 8337 8338 8339 8340 8341 8342 8343 8344 8345 8346 8347 8348 8349 8350 8351 8352 8353 8354 8355 8356 8357 8358 8359 8360 8361 8362 8363 8364 8365 8366 8367 8368 8369 8370 8371 8372 8373 8374 8375 8376 8377 8378 8379 8380 8381 8382 8383 8384 8385 8386 8387 8388 8389 8390 8391 8392 8393 8394 8395 8396 8397 8398 8399 8400 8401 8402 8403 8404 8405 8406 8407 8408 8409 8410 8411 8412 8413 8414 8415 8416 8417 8418 8419 8420 8421 8422 8423 8424 8425 8426 8427 8428 8429 8430 8431 8432 8433 8434 8435 8436 8437 8438 8439 8440 8441 8442 8443 8444 8445 8446 8447 8448 8449 8450 8451 8452 8453 8454 8455 8456 8457 8458 8459 8460 8461 8462 8463 8464 8465 8466 8467 8468 8469 8470 8471 8472 8473 8474 8475 8476 8477 8478 8479 8480 8481 8482 8483 8484 8485 8486 8487 8488 8489 8490 8491 8492 8493 8494 8495 8496 8497 8498 8499 8500 8501 8502 8503 8504 8505 8506 8507 8508 8509 8510 8511 8512 8513 8514 8515 8516 8517 8518 8519 8520 8521 8522 8523 8524 8525 8526 8527 8528 8529 8530 8531 8532 8533 8534 8535 8536 8537 8538 8539 8540 8541 8542 8543 8544 8545 8546 8547 8548 8549 8550 8551 8552 8553 8554 8555 8556 8557 8558 8559 8560 8561 8562 8563 8564 8565 8566 8567 8568 8569 8570 8571 8572 8573 8574 8575 8576 8577 8578 8579 8580 8581 8582 8583 8584 8585 8586 8587 8588 8589 8590 8591 8592 8593 8594 8595 8596 8597 8598 8599 8600 8601 8602 8603 8604 8605 8606 8607 8608 8609 8610 8611 8612 8613 8614 8615 8616 8617 8618 8619 8620 8621 8622 8623 8624 8625 8626 8627 8628 8629 8630 8631 8632 8633 8634 8635 8636 8637 8638 8639 8640 8641 8642 8643 8644 8645 8646 8647 8648 8649 8650 8651 8652 8653 8654 8655 8656 8657 8658 8659 8660 8661 8662 8663 8664 8665 8666 8667 8668 8669 8670 8671 8672 8673 8674 8675 8676 8677 8678 8679 8680 8681 8682 8683 8684 8685 8686 8687 8688 8689 8690 8691 8692 8693 8694 8695 8696 8697 8698 8699 8700 8701 8702 8703 8704 8705 8706 8707 8708 8709 8710 8711 8712 8713 8714 8715 8716 8717 8718 8719 8720 8721 8722 8723 8724 8725 8726 8727 8728 8729 8730 8731 8732 8733 8734 8735 8736 8737 8738 8739 8740 8741 8742 8743 8744 8745 8746 8747 8748 8749 8750 8751 8752 8753 8754 8755 8756 8757 8758 8759 8760 8761 8762 8763 8764 8765 8766 8767 8768 8769 8770 8771 8772 8773 8774 8775 8776 8777 8778 8779 8780 8781 8782 8783 8784 8785 8786 8787 8788 8789 8790 8791 8792 8793 8794 8795 8796 8797 8798 8799 8800 8801 8802 8803 8804 8805 8806 8807 8808 8809 8810 8811 8812 8813 8814 8815 8816 8817 8818 8819 8820 8821 8822 8823 8824 8825 8826 8827 8828 8829 8830 8831 8832 8833 8834 8835 8836 8837 8838 8839 8840 8841 8842 8843 8844 8845 8846 8847 8848 8849 8850 8851 8852 8853 8854 8855 8856 8857 8858 8859 8860 8861 8862 8863 8864 8865 8866 8867 8868 8869 8870 8871 8872 8873 8874 8875 8876 8877 8878 8879 8880 8881 8882 8883 8884 8885 8886 8887 8888 8889 8890 8891 8892 8893 8894 8895 8896 8897 8898 8899 8900 8901 8902 8903 8904 8905 8906 8907 8908 8909 8910 8911 8912 8913 8914 8915 8916 8917 8918 8919 8920 8921 8922 8923 8924 8925 8926 8927 8928 8929 8930 8931 8932 8933 8934 8935 8936 8937 8938 8939 8940 8941 8942 8943 8944 8945 8946 8947 8948 8949 8950 8951 8952 8953 8954 8955 8956 8957 8958 8959 8960 8961 8962 8963 8964 8965 8966 8967 8968 8969 8970 8971 8972 8973 8974 8975 8976 8977 8978 8979 8980 8981 8982 8983 8984 8985 8986 8987 8988 8989 8990 8991 8992 8993 8994 8995 8996 8997 8998 8999 9000 9001 9002 9003 9004 9005 9006 9007 9008 9009 9010 9011 9012 9013 9014 9015 9016 9017 9018 9019 9020 9021 9022 9023 9024 9025 9026 9027 9028 9029 9030 9031 9032 9033 9034 9035 9036 9037 9038 9039 9040 9041 9042 9043 9044 9045 9046 9047 9048 9049 9050 9051 9052 9053 9054 9055 9056 9057 9058 9059 9060 9061 9062 9063 9064 9065 9066 9067 9068 9069 9070 9071 9072 9073 9074 9075 9076 9077 9078 9079 9080 9081 9082 9083 9084 9085 9086 9087 9088 9089 9090 9091 9092 9093 9094 9095 9096 9097 9098 9099 9100 9101 9102 9103 9104 9105 9106 9107 9108 9109 9110 9111 9112 9113 9114 9115 9116 9117 9118 9119 9120 9121 9122 9123 9124 9125 9126 9127 9128 9129 9130 9131 9132 9133 9134 9135 9136 9137 9138 9139 9140 9141 9142 9143 9144 9145 9146 9147 9148 9149 9150 9151 9152 9153 9154 9155 9156 9157 9158 9159 9160 9161 9162 9163 9164 9165 9166 9167 9168 9169 9170 9171 9172 9173 9174 9175 9176 9177 9178 9179 9180 9181 9182 9183 9184 9185 9186 9187 9188 9189 9190 9191 9192 9193 9194 9195 9196 9197 9198 9199 9200 9201 9202 9203 9204 9205 9206 9207 9208 9209 9210 9211 9212 9213 9214 9215 9216 9217 9218 9219 9220 9221 9222 9223 9224 9225 9226 9227 9228 9229 9230 9231 9232 9233 9234 9235 9236 9237 9238 9239 9240 9241 9242 9243 9244 9245 9246 9247 9248 9249 9250 9251 9252 9253 9254 9255 9256 9257 9258 9259 9260 9261 9262 9263 9264 9265 9266 9267 9268 9269 9270 9271 9272 9273 9274 9275 9276 9277 9278 9279 9280 9281 9282 9283 9284 9285 9286 9287 9288 9289 9290 9291 9292 9293 9294 9295 9296 9297 9298 9299 9300 9301 9302 9303 9304 9305 9306 9307 9308 9309 9310 9311 9312 9313 9314 9315 9316 9317 9318 9319 9320 9321 9322 9323 9324 9325 9326 9327 9328 9329 9330 9331 9332 9333 9334 9335 9336 9337 9338 9339 9340 9341 9342 9343 9344 9345 9346 9347 9348 9349 9350 9351 9352 9353 9354 9355 9356 9357 9358 9359 9360 9361 9362 9363 9364 9365 9366 9367 9368 9369 9370 9371 9372 9373 9374 9375 9376 9377 9378 9379 9380 9381 9382 9383 9384 9385 9386 9387 9388 9389 9390 9391 9392 9393 9394 9395 9396 9397 9398 9399 9400 9401 9402 9403 9404 9405 9406 9407 9408 9409 9410 9411 9412 9413 9414 9415 9416 9417 9418 9419 9420 9421 9422 9423 9424 9425 9426 9427 9428 9429 9430 9431 9432 9433 9434 9435 9436 9437 9438 9439 9440 9441 9442 9443 9444 9445 9446 9447 9448 9449 9450 9451 9452 9453 9454 9455 9456 9457 9458 9459 9460 9461 9462 9463 9464 9465 9466 9467 9468 9469 9470 9471 9472 9473 9474 9475 9476 9477 9478 9479 9480 9481 9482 9483 9484 9485 9486 9487 9488 9489 9490 9491 9492 9493 9494 9495 9496 9497 9498 9499 9500 9501 9502 9503 9504 9505 9506 9507 9508 9509 9510 9511 9512 9513 9514 9515 9516 9517 9518 9519 9520 9521 9522 9523 9524 9525 9526 9527 9528 9529 9530 9531 9532 9533 9534 9535 9536 9537 9538 9539 9540 9541 9542 9543 9544 9545 9546 9547 9548 9549 9550 9551 9552 9553 9554 9555 9556 9557 9558 9559 9560 9561 9562 9563 9564 9565 9566 9567 9568 9569 9570 9571 9572 9573 9574 9575 9576 9577 9578 9579 9580 9581 9582 9583 9584 9585 9586 9587 9588 9589 9590 9591 9592 9593 9594 9595 9596 9597 9598 9599 9600 9601 9602 9603 9604 9605 9606 9607 9608 9609 9610 9611 9612 9613 9614 9615 9616 9617 9618 9619 9620 9621 9622 9623 9624 9625 9626 9627 9628 9629 9630 9631 9632 9633 9634 9635 9636 9637 9638 9639 9640 9641 9642 9643 9644 9645 9646 9647 9648 9649 9650 9651 9652 9653 9654 9655 9656 9657 9658 9659 9660 9661 9662 9663 9664 9665 9666 9667 9668 9669 9670 9671 9672 9673 9674 9675 9676 9677 9678 9679 9680 9681 9682 9683 9684 9685 9686 9687 9688 9689 9690 9691 9692 9693 9694 9695 9696 9697 9698 9699 9700 9701 9702 9703 9704 9705 9706 9707 9708 9709 9710 9711 9712 9713 9714 9715 9716 9717 9718 9719 9720 9721 9722 9723 9724 9725 9726 9727 9728 9729 9730 9731 9732 9733 9734 9735 9736 9737 9738 9739 9740 9741 9742 9743 9744 9745 9746 9747 9748 9749 9750 9751 9752 9753 9754 9755 9756 9757 9758 9759 9760 9761 9762 9763 9764 9765 9766 9767 9768 9769 9770 9771 9772 9773 9774 9775 9776 9777 9778 9779 9780 9781 9782 9783 9784 9785 9786 9787 9788 9789 9790 9791 9792 9793 9794 9795 9796 9797 9798 9799 9800 9801 9802 9803 9804 9805 9806 9807 9808 9809 9810 9811 9812 9813 9814 9815 9816 9817 9818 9819 9820 9821 9822 9823 9824 9825 9826 9827 9828 9829 9830 9831 9832 9833 9834 9835 9836 9837 9838 9839 9840 9841 9842 9843 9844 9845 9846 9847 9848 9849 9850 9851 9852 9853 9854 9855 9856 9857 9858 9859 9860 9861 9862 9863 9864 9865 9866 9867 9868 9869 9870 9871 9872 9873 9874 9875 9876 9877 9878 9879 9880 9881 9882 9883 9884 9885 9886 9887 9888 9889 9890 9891 9892 9893 9894 9895 9896 9897 9898 9899 9900 9901 9902 9903 9904 9905 9906 9907 9908 9909 9910 9911 9912 9913 9914 9915 9916 9917 9918 9919 9920 9921 9922 9923 9924 9925 9926 9927 9928 9929 9930 9931 9932 9933 9934 9935 9936 9937 9938 9939 9940 9941 9942 9943 9944 9945 9946 9947 9948 9949 9950 9951 9952 9953 9954 9955 9956 9957 9958 9959 9960 9961 9962 9963 9964 9965 9966 9967 9968 9969 9970 9971 9972 9973 9974 9975 9976 9977 9978 9979 9980 9981 9982 9983 9984 9985 9986 9987 9988 9989 9990 9991 9992 9993 9994 9995 9996 9997 9998 9999 10000 10001 10002 10003 10004 10005 10006 10007 10008 10009 10010 10011 10012 10013 10014 10015 10016 10017 10018 10019 10020 10021 10022 10023 10024 10025 10026 10027 10028 10029 10030 10031 10032 10033 10034 10035 10036 10037 10038 10039 10040 10041 10042 10043 10044 10045 10046 10047 10048 10049 10050 10051 10052 10053 10054 10055 10056 10057 10058 10059 10060 10061 10062 10063 10064 10065 10066 10067 10068 10069 10070 10071 10072 10073 10074 10075 10076 10077 10078 10079 10080 10081 10082 10083 10084 10085 10086 10087 10088 10089 10090 10091 10092 10093 10094 10095 10096 10097 10098 10099 10100 10101 10102 10103 10104 10105 10106 10107 10108 10109 10110 10111 10112 10113 10114 10115 10116 10117 10118 10119 10120 10121 10122 10123 10124 10125 10126 10127 10128 10129 10130 10131 10132 10133 10134 10135 10136 10137 10138 10139 10140 10141 10142 10143 10144 10145 10146 10147 10148 10149 10150 10151 10152 10153 10154 10155 10156 10157 10158 10159 10160 10161 10162 10163 10164 10165 10166 10167 10168 10169 10170 10171 10172 10173 10174 10175 10176 10177 10178 10179 10180 10181 10182 10183 10184 10185 10186 10187 10188 10189 10190 10191 10192 10193 10194 10195 10196 10197 10198 10199 10200 10201 10202 10203 10204 10205 10206 10207 10208 10209 10210 10211 10212 10213 10214 10215 10216 10217 10218 10219 10220 10221 10222 10223 10224 10225 10226 10227 10228 10229 10230 10231 10232 10233 10234 10235 10236 10237 10238 10239 10240 10241 10242 10243 10244 10245 10246 10247 10248 10249 10250 10251 10252 10253 10254 10255 10256 10257 10258 10259 10260 10261 10262 10263 10264 10265 10266 10267 10268 10269 10270 10271 10272 10273 10274 10275 10276 10277 10278 10279 10280 10281 10282 10283 10284 10285 10286 10287 10288 10289 10290 10291 10292 10293 10294 10295 10296 10297 10298 10299 10300 10301 10302 10303 10304 10305 10306 10307 10308 10309 10310 10311 10312 10313 10314 10315 10316 10317 10318 10319 10320 10321 10322 10323 10324 10325 10326 10327 10328 10329 10330 10331 10332 10333 10334 10335 10336 10337 10338 10339 10340 10341 10342 10343 10344 10345 10346 10347 10348 10349 10350 10351 10352 10353 10354 10355 10356 10357 10358 10359 10360 10361 10362 10363 10364 10365 10366 10367 10368 10369 10370 10371 10372 10373 10374 10375 10376 10377 10378 10379 10380 10381 10382 10383 10384 10385 10386 10387 10388 10389 10390 10391 10392 10393 10394 10395 10396 10397 10398 10399 10400 10401 10402 10403 10404 10405 10406 10407 10408 10409 10410 10411 10412 10413 10414 10415 10416 10417 10418 10419 10420 10421 10422 10423 10424 10425 10426 10427 10428 10429 10430 10431 10432 10433 10434 10435 10436 10437 10438 10439 10440 10441 10442 10443 10444 10445 10446 10447 10448 10449 10450 10451 10452 10453 10454 10455 10456 10457 10458 10459 10460 10461 10462 10463 10464 10465 10466 10467 10468 10469 10470 10471 10472 10473 10474 10475 10476 10477 10478 10479 10480 10481 10482 10483 10484 10485 10486 10487 10488 10489 10490 10491 10492 10493 10494 10495 10496 10497 10498 10499 10500 10501 10502 10503 10504 10505 10506 10507 10508 10509 10510 10511 10512 10513 10514 10515 10516 10517 10518 10519 10520 10521 10522 10523 10524 10525 10526 10527 10528 10529 10530 10531 10532 10533 10534 10535 10536 10537 10538 10539 10540 10541 10542 10543 10544 10545 10546 10547 10548 10549 10550 10551 10552 10553 10554 10555 10556 10557 10558 10559 10560 10561 10562 10563 10564 10565 10566 10567 10568 10569 10570 10571 10572 10573 10574 10575 10576 10577 10578 10579 10580 10581 10582 10583 10584 10585 10586 10587 10588 10589 10590 10591 10592 10593 10594 10595 10596 10597 10598 10599 10600 10601 10602 10603 10604 10605 10606 10607 10608 10609 10610 10611 10612 10613 10614 10615 10616 10617 10618 10619 10620 10621 10622 10623 10624 10625 10626 10627 10628 10629 10630 10631 10632 10633 10634 10635 10636 10637 10638 10639 10640 10641 10642 10643 10644 10645 10646 10647 10648 10649 10650 10651 10652 10653 10654 10655 10656 10657 10658 10659 10660 10661 10662 10663 10664 10665 10666 10667 10668 10669 10670 10671 10672 10673 10674 10675 10676 10677 10678 10679 10680 10681 10682 10683 10684 10685 10686 10687 10688 10689 10690 10691 10692 10693 10694 10695 10696 10697 10698 10699 10700 10701 10702 10703 10704 10705 10706 10707 10708 10709 10710 10711 10712 10713 10714 10715 10716 10717 10718 10719 10720 10721 10722 10723 10724 10725 10726 10727 10728 10729 10730 10731 10732 10733 10734 10735 10736 10737 10738 10739 10740 10741 10742 10743 10744 10745 10746 10747 10748 10749 10750 10751 10752 10753 10754 10755 10756 10757 10758 10759 10760 10761 10762 10763 10764 10765 10766 10767 10768 10769 10770 10771 10772 10773 10774 10775 10776 10777 10778 10779 10780 10781 10782 10783 10784 10785 10786 10787 10788 10789 10790 10791 10792 10793 10794 10795 10796 10797 10798 10799 10800 10801 10802 10803 10804 10805 10806 10807 10808 10809 10810 10811 10812 10813 10814 10815 10816 10817 10818 10819 10820 10821 10822 10823 10824 10825 10826 10827 10828 10829 10830 10831 10832 10833 10834 10835 10836 10837 10838 10839 10840 10841 10842 10843 10844 10845 10846 10847 10848 10849 10850 10851 10852 10853 10854 10855 10856 10857 10858 10859 10860 10861 10862 10863 10864 10865 10866 10867 10868 10869 10870 10871 10872 10873 10874 10875 10876 10877 10878 10879 10880 10881 10882 10883 10884 10885 10886 10887 10888 10889 10890 10891 10892 10893 10894 10895 10896 10897 10898 10899 10900 10901 10902 10903 10904 10905 10906 10907 10908 10909 10910 10911 10912 10913 10914 10915 10916 10917 10918 10919 10920 10921 10922 10923 10924 10925 10926 10927 10928 10929 10930 10931 10932 10933 10934 10935 10936 10937 10938 10939 10940 10941 10942 10943 10944 10945 10946 10947 10948 10949 10950 10951 10952 10953 10954 10955 10956 10957 10958 10959 10960 10961 10962 10963 10964 10965 10966 10967 10968 10969 10970 10971 10972 10973 10974 10975 10976 10977 10978 10979 10980 10981 10982 10983 10984 10985 10986 10987 10988 10989 10990 10991 10992 10993 10994 10995 10996 10997 10998 10999 11000 11001 11002 11003 11004 11005 11006 11007 11008 11009 11010 11011 11012 11013 11014 11015 11016 11017 11018 11019 11020 11021 11022 11023 11024 11025 11026 11027 11028 11029 11030 11031 11032 11033 11034 11035 11036 11037 11038 11039 11040 11041 11042 11043 11044 11045 11046 11047 11048 11049 11050 11051 11052 11053 11054 11055 11056 11057 11058 11059 11060 11061 11062 11063 11064 11065 11066 11067 11068 11069 11070 11071 11072 11073 11074 11075 11076 11077 11078 11079 11080 11081 11082 11083 11084 11085 11086 11087 11088 11089 11090 11091 11092 11093 11094 11095 11096 11097 11098 11099 11100 11101 11102 11103 11104 11105 11106 11107 11108 11109 11110 11111 11112 11113 11114 11115 11116 11117 11118 11119 11120 11121 11122 11123 11124 11125 11126 11127 11128 11129 11130 11131 11132 11133 11134 11135 11136 11137 11138 11139 11140 11141 11142 11143 11144 11145 11146 11147 11148 11149 11150 11151 11152 11153 11154 11155 11156 11157 11158 11159 11160 11161 11162 11163 11164 11165 11166 11167 11168 11169 11170 11171 11172 11173 11174 11175 11176 11177 11178 11179 11180 11181 11182 11183 11184 11185 11186 11187 11188 11189 11190 11191 11192 11193 11194 11195 11196 11197 11198 11199 11200 11201 11202 11203 11204 11205 11206 11207 11208 11209 11210 11211 11212 11213 11214 11215 11216 11217 11218 11219 11220 11221 11222 11223 11224 11225 11226 11227 11228 11229 11230 11231 11232 11233 11234 11235 11236 11237 11238 11239 11240 11241 11242 11243 11244 11245 11246 11247 11248 11249 11250 11251 11252 11253 11254 11255 11256 11257 11258 11259 11260 11261 11262 11263 11264 11265 11266 11267 11268 11269 11270 11271 11272 11273 11274 11275 11276 11277 11278 11279 11280 11281 11282 11283 11284 11285 11286 11287 11288 11289 11290 11291 11292 11293 11294 11295 11296 11297 11298 11299 11300 11301 11302 11303 11304 11305 11306 11307 11308 11309 11310 11311 11312 11313 11314 11315 11316 11317 11318 11319 11320 11321 11322 11323 11324 11325 11326 11327 11328 11329 11330 11331 11332 11333 11334 11335 11336 11337 11338 11339 11340 11341 11342 11343 11344 11345 11346 11347 11348 11349 11350 11351 11352 11353 11354 11355 11356 11357 11358 11359 11360 11361 11362 11363 11364 11365 11366 11367 11368 11369 11370 11371 11372 11373 11374 11375 11376 11377 11378 11379 11380 11381 11382 11383 11384 11385 11386 11387 11388 11389 11390 11391 11392 11393 11394 11395 11396 11397 11398 11399 11400 11401 11402 11403 11404 11405 11406 11407 11408 11409 11410 11411 11412 11413 11414 11415 11416 11417 11418 11419 11420 11421 11422 11423 11424 11425 11426 11427 11428 11429 11430 11431 11432 11433 11434 11435 11436 11437 11438 11439 11440 11441 11442 11443 11444 11445 11446 11447 11448 11449 11450 11451 11452 11453 11454 11455 11456 11457 11458 11459 11460 11461 11462 11463 11464 11465 11466 11467 11468 11469 11470 11471 11472 11473 11474 11475 11476 11477 11478 11479 11480 11481 11482 11483 11484 11485 11486 11487 11488 11489 11490 11491 11492 11493 11494 11495 11496 11497 11498 11499 11500 11501 11502 11503 11504 11505 11506 11507 11508 11509 11510 11511 11512 11513 11514 11515 11516 11517 11518 11519 11520 11521 11522 11523 11524 11525 11526 11527 11528 11529 11530 11531 11532 11533 11534 11535 11536 11537 11538 11539 11540 11541 11542 11543 11544 11545 11546 11547 11548 11549 11550 11551 11552 11553 11554 11555 11556 11557 11558 11559 11560 11561 11562 11563 11564 11565 11566 11567 11568 11569 11570 11571 11572 11573 11574 11575 11576 11577 11578 11579 11580 11581 11582 11583 11584 11585 11586 11587 11588 11589 11590 11591 11592 11593 11594 11595 11596 11597 11598 11599 11600 11601 11602 11603 11604 11605 11606 11607 11608 11609 11610 11611 11612 11613 11614 11615 11616 11617 11618 11619 11620 11621 11622 11623 11624 11625 11626 11627 11628 11629 11630 11631 11632 11633 11634 11635 11636 11637 11638 11639 11640 11641 11642 11643 11644 11645 11646 11647 11648 11649 11650 11651 11652 11653 11654 11655 11656 11657 11658 11659 11660 11661 11662 11663 11664 11665 11666 11667 11668 11669 11670 11671 11672 11673 11674 11675 11676 11677 11678 11679 11680 11681 11682 11683 11684 11685 11686 11687 11688 11689 11690 11691 11692 11693 11694 11695 11696 11697 11698 11699 11700 11701 11702 11703 11704 11705 11706 11707 11708 11709 11710 11711 11712 11713 11714 11715 11716 11717 11718 11719 11720 11721 11722 11723 11724 11725 11726 11727 11728 11729 11730 11731 11732 11733 11734 11735 11736 11737 11738 11739 11740 11741 11742 11743 11744 11745 11746 11747 11748 11749 11750 11751 11752 11753 11754 11755 11756 11757 11758 11759 11760 11761 11762 11763 11764 11765 11766 11767 11768 11769 11770 11771 11772 11773 11774 11775 11776 11777 11778 11779 11780 11781 11782 11783 11784 11785 11786 11787 11788 11789 11790 11791 11792 11793 11794 11795 11796 11797 11798 11799 11800 11801 11802 11803 11804 11805 11806 11807 11808 11809 11810 11811 11812 11813 11814 11815 11816 11817 11818 11819 11820 11821 11822 11823 11824 11825 11826 11827 11828 11829 11830 11831 11832 11833 11834 11835 11836 11837 11838 11839 11840 11841 11842 11843 11844 11845 11846 11847 11848 11849 11850 11851 11852 11853 11854 11855 11856 11857 11858 11859 11860 11861 11862 11863 11864 11865 11866 11867 11868 11869 11870 11871 11872 11873 11874 11875 11876 11877 11878 11879 11880 11881 11882 11883 11884 11885 11886 11887 11888 11889 11890 11891 11892 11893 11894 11895 11896 11897 11898 11899 11900 11901 11902 11903 11904 11905 11906 11907 11908 11909 11910 11911 11912 11913 11914 11915 11916 11917 11918 11919 11920 11921 11922 11923 11924 11925 11926 11927 11928 11929 11930 11931 11932 11933 11934 11935 11936 11937 11938 11939 11940 11941 11942 11943 11944 11945 11946 11947 11948 11949 11950 11951 11952 11953 11954 11955 11956 11957 11958 11959 11960 11961 11962 11963 11964 11965 11966 11967 11968 11969 11970 11971 11972 11973 11974 11975 11976 11977 11978 11979 11980 11981 11982 11983 11984 11985 11986 11987 11988 11989 11990 11991 11992 11993 11994 11995 11996 11997 11998 11999 12000 12001 12002 12003 12004 12005 12006 12007 12008 12009 12010 12011 12012 12013 12014 12015 12016 12017 12018 12019 12020 12021 12022 12023 12024 12025 12026 12027 12028 12029 12030 12031 12032 12033 12034 12035 12036 12037 12038 12039 12040 12041 12042 12043 12044 12045 12046 12047 12048 12049 12050 12051 12052 12053 12054 12055 12056 12057 12058 12059 12060 12061 12062 12063 12064 12065 12066 12067 12068 12069 12070 12071 12072 12073 12074 12075 12076 12077 12078 12079 12080 12081 12082 12083 12084 12085 12086 12087 12088 12089 12090 12091 12092 12093 12094 12095 12096 12097 12098 12099 12100 12101 12102 12103 12104 12105 12106 12107 12108 12109 12110 12111 12112 12113 12114 12115 12116 12117 12118 12119 12120 12121 12122 12123 12124 12125 12126 12127 12128 12129 12130 12131 12132 12133 12134 12135 12136 12137 12138 12139 12140 12141 12142 12143 12144 12145 12146 12147 12148 12149 12150 12151 12152 12153 12154 12155 12156 12157 12158 12159 12160 12161 12162 12163 12164 12165 12166 12167 12168 12169 12170 12171 12172 12173 12174 12175 12176 12177 12178 12179 12180 12181 12182 12183 12184 12185 12186 12187 12188 12189 12190 12191 12192 12193 12194 12195 12196 12197 12198 12199 12200 12201 12202 12203 12204 12205 12206 12207 12208 12209 12210 12211 12212 12213 12214 12215 12216 12217 12218 12219 12220 12221 12222 12223 12224 12225 12226 12227 12228 12229 12230 12231 12232 12233 12234 12235 12236 12237 12238 12239 12240 12241 12242 12243 12244 12245 12246 12247 12248 12249 12250 12251 12252 12253 12254 12255 12256 12257 12258 12259 12260 12261 12262 12263 12264 12265 12266 12267 12268 12269 12270 12271 12272 12273 12274 12275 12276 12277 12278 12279 12280 12281 12282 12283 12284 12285 12286 12287 12288 12289 12290 12291 12292 12293 12294 12295 12296 12297 12298 12299 12300 12301 12302 12303 12304 12305 12306 12307 12308 12309 12310 12311 12312 12313 12314 12315 12316 12317 12318 12319 12320 12321 12322 12323 12324 12325 12326 12327 12328 12329 12330 12331 12332 12333 12334 12335 12336 12337 12338 12339 12340 12341 12342 12343 12344 12345 12346 12347 12348 12349 12350 12351 12352 12353 12354 12355 12356 12357 12358 12359 12360 12361 12362 12363 12364 12365 12366 12367 12368 12369 12370 12371 12372 12373 12374 12375 12376 12377 12378 12379 12380 12381 12382 12383 12384 12385 12386 12387 12388 12389 12390 12391 12392 12393 12394 12395 12396 12397 12398 12399 12400 12401 12402 12403 12404 12405 12406 12407 12408 12409 12410 12411 12412 12413 12414 12415 12416 12417 12418 12419 12420 12421 12422 12423 12424 12425 12426 12427 12428 12429 12430 12431 12432 12433 12434 12435 12436 12437 12438 12439 12440 12441 12442 12443 12444 12445 12446 12447 12448 12449 12450 12451 12452 12453 12454 12455 12456 12457 12458 12459 12460 12461 12462 12463 12464 12465 12466 12467 12468 12469 12470 12471 12472 12473 12474 12475 12476 12477 12478 12479 12480 12481 12482 12483 12484 12485 12486 12487 12488 12489 12490 12491 12492 12493 12494 12495 12496 12497 12498 12499 12500 12501 12502 12503 12504 12505 12506 12507 12508 12509 12510 12511 12512 12513 12514 12515 12516 12517 12518 12519 12520 12521 12522 12523 12524 12525 12526 12527 12528 12529 12530 12531 12532 12533 12534 12535 12536 12537 12538 12539 12540 12541 12542 12543 12544 12545 12546 12547 12548 12549 12550 12551 12552 12553 12554 12555 12556 12557 12558 12559 12560 12561 12562 12563 12564 12565 12566 12567 12568 12569 12570 12571 12572 12573 12574 12575 12576 12577 12578 12579 12580 12581 12582 12583 12584 12585 12586 12587 12588 12589 12590 12591 12592 12593 12594 12595 12596 12597 12598 12599 12600 12601 12602 12603 12604 12605 12606 12607 12608 12609 12610 12611 12612 12613 12614 12615 12616 12617 12618 12619 12620 12621 12622 12623 12624 12625 12626 12627 12628 12629 12630 12631 12632 12633 12634 12635 12636 12637 12638 12639 12640 12641 12642 12643 12644 12645 12646 12647 12648 12649 12650 12651 12652 12653 12654 12655 12656 12657 12658 12659 12660 12661 12662 12663 12664 12665 12666 12667 12668 12669 12670 12671 12672 12673 12674 12675 12676 12677 12678 12679 12680 12681 12682 12683 12684 12685 12686 12687 12688 12689 12690 12691 12692 12693 12694 12695 12696 12697 12698 12699 12700 12701 12702 12703 12704 12705 12706 12707 12708 12709 12710 12711 12712 12713 12714 12715 12716 12717 12718 12719 12720 12721 12722 12723 12724 12725 12726 12727 12728 12729 12730 12731 12732 12733 12734 12735 12736 12737 12738 12739 12740 12741 12742 12743 12744 12745 12746 12747 12748 12749 12750 12751 12752 12753 12754 12755 12756 12757 12758 12759 12760 12761 12762 12763 12764 12765 12766 12767 12768 12769 12770 12771 12772 12773 12774 12775 12776 12777 12778 12779 12780 12781 12782 12783 12784 12785 12786 12787 12788 12789 12790 12791 12792 12793 12794 12795 12796 12797 12798 12799 12800 12801 12802 12803 12804 12805 12806 12807 12808 12809 12810 12811 12812 12813 12814 12815 12816 12817 12818 12819 12820 12821 12822 12823 12824 12825 12826 12827 12828 12829 12830 12831 12832 12833 12834 12835 12836 12837 12838 12839 12840 12841 12842 12843 12844 12845 12846 12847 12848 12849 12850 12851 12852 12853 12854 12855 12856 12857 12858 12859 12860 12861 12862 12863 12864 12865 12866 12867 12868 12869 12870 12871 12872 12873 12874 12875 12876 12877 12878 12879 12880 12881 12882 12883 12884 12885 12886 12887 12888 12889 12890 12891 12892 12893 12894 12895 12896 12897 12898 12899 12900 12901 12902 12903 12904 12905 12906 12907 12908 12909 12910 12911 12912 12913 12914 12915 12916 12917 12918 12919 12920 12921 12922 12923 12924 12925 12926 12927 12928 12929 12930 12931 12932 12933 12934 12935 12936 12937 12938 12939 12940 12941 12942 12943 12944 12945 12946 12947 12948 12949 12950 12951 12952 12953 12954 12955 12956 12957 12958 12959 12960 12961 12962 12963 12964 12965 12966 12967 12968 12969 12970 12971 12972 12973 12974 12975 12976 12977 12978 12979 12980 12981 12982 12983 12984 12985 12986 12987 12988 12989 12990 12991 12992 12993 12994 12995 12996 12997 12998 12999 13000 13001 13002 13003 13004 13005 13006 13007 13008 13009 13010 13011 13012 13013 13014 13015 13016 13017 13018 13019 13020 13021 13022 13023 13024 13025 13026 13027 13028 13029 13030 13031 13032 13033 13034 13035 13036 13037 13038 13039 13040 13041 13042 13043 13044 13045 13046 13047 13048 13049 13050 13051 13052 13053 13054 13055 13056 13057 13058 13059 13060 13061 13062 13063 13064 13065 13066 13067 13068 13069 13070 13071 13072 13073 13074 13075 13076 13077 13078 13079 13080 13081 13082 13083 13084 13085 13086 13087 13088 13089 13090 13091 13092 13093 13094 13095 13096 13097 13098 13099 13100 13101 13102 13103 13104 13105 13106 13107 13108 13109 13110 13111 13112 13113 13114 13115 13116 13117 13118 13119 13120 13121 13122 13123 13124 13125 13126 13127 13128 13129 13130 13131 13132 13133 13134 13135 13136 13137 13138 13139 13140 13141 13142 13143 13144 13145 13146 13147 13148 13149 13150 13151 13152 13153 13154 13155 13156 13157 13158 13159 13160 13161 13162 13163 13164 13165 13166 13167 13168 13169 13170 13171 13172 13173 13174 13175 13176 13177 13178 13179 13180 13181 13182 13183 13184 13185 13186 13187 13188 13189 13190 13191 13192 13193 13194 13195 13196 13197 13198 13199 13200 13201 13202 13203 13204 13205 13206 13207 13208 13209 13210 13211 13212 13213 13214 13215 13216 13217 13218 13219 13220 13221 13222 13223 13224 13225 13226 13227 13228 13229 13230 13231 13232 13233 13234 13235 13236 13237 13238 13239 13240 13241 13242 13243 13244 13245 13246 13247 13248 13249 13250 13251 13252 13253 13254 13255 13256 13257 13258 13259 13260 13261 13262 13263 13264 13265 13266 13267 13268 13269 13270 13271 13272 13273 13274 13275 13276 13277 13278 13279 13280 13281 13282 13283 13284 13285 13286 13287 13288 13289 13290 13291 13292 13293 13294 13295 13296 13297 13298 13299 13300 13301 13302 13303 13304 13305 13306 13307 13308 13309 13310 13311 13312 13313 13314 13315 13316 13317 13318 13319 13320 13321 13322 13323 13324 13325 13326 13327 13328 13329 13330 13331 13332 13333 13334 13335 13336 13337 13338 13339 13340 13341 13342 13343 13344 13345 13346 13347 13348 13349 13350 13351 13352 13353 13354 13355 13356 13357 13358 13359 13360 13361 13362 13363 13364 13365 13366 13367 13368 13369 13370 13371 13372 13373 13374 13375 13376 13377 13378 13379 13380 13381 13382 13383 13384 13385 13386 13387 13388 13389 13390 13391 13392 13393 13394 13395 13396 13397 13398 13399 13400 13401 13402 13403 13404 13405 13406 13407 13408 13409 13410 13411 13412 13413 13414 13415 13416 13417 13418 13419 13420 13421 13422 13423 13424 13425 13426 13427 13428 13429 13430 13431 13432 13433 13434 13435 13436 13437 13438 13439 13440 13441 13442 13443 13444 13445 13446 13447 13448 13449 13450 13451 13452 13453 13454 13455 13456 13457 13458 13459 13460 13461 13462 13463 13464 13465 13466 13467 13468 13469 13470 13471 13472 13473 13474 13475 13476 13477 13478 13479 13480 13481 13482 13483 13484 13485 13486 13487 13488 13489 13490 13491 13492 13493 13494 13495 13496 13497 13498 13499 13500 13501 13502 13503 13504 13505 13506 13507 13508 13509 13510 13511 13512 13513 13514 13515 13516 13517 13518 13519 13520 13521 13522 13523 13524 13525 13526 13527 13528 13529 13530 13531 13532 13533 13534 13535 13536 13537 13538 13539 13540 13541 13542 13543 13544 13545 13546 13547 13548 13549 13550 13551 13552 13553 13554 13555 13556 13557 13558 13559 13560 13561 13562 13563 13564 13565 13566 13567 13568 13569 13570 13571 13572 13573 13574 13575 13576 13577 13578 13579 13580 13581 13582 13583 13584 13585 13586 13587 13588 13589 13590 13591 13592 13593 13594 13595 13596 13597 13598 13599 13600 13601 13602 13603 13604 13605 13606 13607 13608 13609 13610 13611 13612 13613 13614 13615 13616 13617 13618 13619 13620 13621 13622 13623 13624 13625 13626 13627 13628 13629 13630 13631 13632 13633 13634 13635 13636 13637 13638 13639 13640 13641 13642 13643 13644 13645 13646 13647 13648 13649 13650 13651 13652 13653 13654 13655 13656 13657 13658 13659 13660 13661 13662 13663 13664 13665 13666 13667 13668 13669 13670 13671 13672 13673 13674 13675 13676 13677 13678 13679 13680 13681 13682 13683 13684 13685 13686 13687 13688 13689 13690 13691 13692 13693 13694 13695 13696 13697 13698 13699 13700 13701 13702 13703 13704 13705 13706 13707 13708 13709 13710 13711 13712 13713 13714 13715 13716 13717 13718 13719 13720 13721 13722 13723 13724 13725 13726 13727 13728 13729 13730 13731 13732 13733 13734 13735 13736 13737 13738 13739 13740 13741 13742 13743 13744 13745 13746 13747 13748 13749 13750 13751 13752 13753 13754 13755 13756 13757 13758 13759 13760 13761 13762 13763 13764 13765 13766 13767 13768 13769 13770 13771 13772 13773 13774 13775 13776 13777 13778 13779 13780 13781 13782 13783 13784 13785 13786 13787 13788 13789 13790 13791 13792 13793 13794 13795 13796 13797 13798 13799 13800 13801 13802 13803 13804 13805 13806 13807 13808 13809 13810 13811 13812 13813 13814 13815 13816 13817 13818 13819 13820 13821 13822 13823 13824 13825 13826 13827 13828 13829 13830 13831 13832 13833 13834 13835 13836 13837 13838 13839 13840 13841 13842 13843 13844 13845 13846 13847 13848 13849 13850 13851 13852 13853 13854 13855 13856 13857 13858 13859 13860 13861 13862 13863 13864 13865 13866 13867 13868 13869 13870 13871 13872 13873 13874 13875 13876 13877 13878 13879 13880 13881 13882 13883 13884 13885 13886 13887 13888 13889 13890 13891 13892 13893 13894 13895 13896 13897 13898 13899 13900 13901 13902 13903 13904 13905 13906 13907 13908 13909 13910 13911 13912 13913 13914 13915 13916 13917 13918 13919 13920 13921 13922 13923 13924 13925 13926 13927 13928 13929 13930 13931 13932 13933 13934 13935 13936 13937 13938 13939 13940 13941 13942 13943 13944 13945 13946 13947 13948 13949 13950 13951 13952 13953 13954 13955 13956 13957 13958 13959 13960 13961 13962 13963 13964 13965 13966 13967 13968 13969 13970 13971 13972 13973 13974 13975 13976 13977 13978 13979 13980 13981 13982 13983 13984 13985 13986 13987 13988 13989 13990 13991 13992 13993 13994 13995 13996 13997 13998 13999 14000 14001 14002 14003 14004 14005 14006 14007 14008 14009 14010 14011 14012 14013 14014 14015 14016 14017 14018 14019 14020 14021 14022 14023 14024 14025 14026 14027 14028 14029 14030 14031 14032 14033 14034 14035 14036 14037 14038 14039 14040 14041 14042 14043 14044 14045 14046 14047 14048 14049 14050 14051 14052 14053 14054 14055 14056 14057 14058 14059 14060 14061 14062 14063 14064 14065 14066 14067 14068 14069 14070 14071 14072 14073 14074 14075 14076 14077 14078 14079 14080 14081 14082 14083 14084 14085 14086 14087 14088 14089 14090 14091 14092 14093 14094 14095 14096 14097 14098 14099 14100 14101 14102 14103 14104 14105 14106 14107 14108 14109 14110 14111 14112 14113 14114 14115 14116 14117 14118 14119 14120 14121 14122 14123 14124 14125 14126 14127 14128 14129 14130 14131 14132 14133 14134 14135 14136 14137 14138 14139 14140 14141 14142 14143 14144 14145 14146 14147 14148 14149 14150 14151 14152 14153 14154 14155 14156 14157 14158 14159 14160 14161 14162 14163 14164 14165 14166 14167 14168 14169 14170 14171 14172 14173 14174 14175 14176 14177 14178 14179 14180 14181 14182 14183 14184 14185 14186 14187 14188 14189 14190 14191 14192 14193 14194 14195 14196 14197 14198 14199 14200 14201 14202 14203 14204 14205 14206 14207 14208 14209 14210 14211 14212 14213 14214 14215 14216 14217 14218 14219 14220 14221 14222 14223 14224 14225 14226 14227 14228 14229 14230 14231 14232 14233 14234 14235 14236 14237 14238 14239 14240 14241 14242 14243 14244 14245 14246 14247 14248 14249 14250 14251 14252 14253 14254 14255 14256 14257 14258 14259 14260 14261 14262 14263 14264 14265 14266 14267 14268 14269 14270 14271 14272 14273 14274 14275 14276 14277 14278 14279 14280 14281 14282 14283 14284 14285 14286 14287 14288 14289 14290 14291 14292 14293 14294 14295 14296 14297 14298 14299 14300 14301 14302 14303 14304 14305 14306 14307 14308 14309 14310 14311 14312 14313 14314 14315 14316 14317 14318 14319 14320 14321 14322 14323 14324 14325 14326 14327 14328 14329 14330 14331 14332 14333 14334 14335 14336 14337 14338 14339 14340 14341 14342 14343 14344 14345 14346 14347 14348 14349 14350 14351 14352 14353 14354 14355 14356 14357 14358 14359 14360 14361 14362 14363 14364 14365 14366 14367 14368 14369 14370 14371 14372 14373 14374 14375 14376 14377 14378 14379 14380 14381 14382 14383 14384 14385 14386 14387 14388 14389 14390 14391 14392 14393 14394 14395 14396 14397 14398 14399 14400 14401 14402 14403 14404 14405 14406 14407 14408 14409 14410 14411 14412 14413 14414 14415 14416 14417 14418 14419 14420 14421 14422 14423 14424 14425 14426 14427 14428 14429 14430 14431 14432 14433 14434 14435 14436 14437 14438 14439 14440 14441 14442 14443 14444 14445 14446 14447 14448 14449 14450 14451 14452 14453 14454 14455 14456 14457 14458 14459 14460 14461 14462 14463 14464 14465 14466 14467 14468 14469 14470 14471 14472 14473 14474 14475 14476 14477 14478 14479 14480 14481 14482 14483 14484 14485 14486 14487 14488 14489 14490 14491 14492 14493 14494 14495 14496 14497 14498 14499 14500 14501 14502 14503 14504 14505 14506 14507 14508 14509 14510 14511 14512 14513 14514 14515 14516 14517 14518 14519 14520 14521 14522 14523 14524 14525 14526 14527 14528 14529 14530 14531 14532 14533 14534 14535 14536 14537 14538 14539 14540 14541 14542 14543 14544 14545 14546 14547 14548 14549 14550 14551 14552 14553 14554 14555 14556 14557 14558 14559 14560 14561 14562 14563 14564 14565 14566 14567 14568 14569 14570 14571 14572 14573 14574 14575 14576 14577 14578 14579 14580 14581 14582 14583 14584 14585 14586 14587 14588 14589 14590 14591 14592 14593 14594 14595 14596 14597 14598 14599 14600 14601 14602 14603 14604 14605 14606 14607 14608 14609 14610 14611 14612 14613 14614 14615 14616 14617 14618 14619 14620 14621 14622 14623 14624 14625 14626 14627 14628 14629 14630 14631 14632 14633 14634 14635 14636 14637 14638 14639 14640 14641 14642 14643 14644 14645 14646 14647 14648 14649 14650 14651 14652 14653 14654 14655 14656 14657 14658 14659 14660 14661 14662 14663 14664 14665 14666 14667 14668 14669 14670 14671 14672 14673 14674 14675 14676 14677 14678 14679 14680 14681 14682 14683 14684 14685 14686 14687 14688 14689 14690 14691 14692 14693 14694 14695 14696 14697 14698 14699 14700 14701 14702 14703 14704 14705 14706 14707 14708 14709 14710 14711 14712 14713 14714 14715 14716 14717 14718 14719 14720 14721 14722 14723 14724 14725 14726 14727 14728 14729 14730 14731 14732 14733 14734 14735 14736 14737 14738 14739 14740 14741 14742 14743 14744 14745 14746 14747 14748 14749 14750 14751 14752 14753 14754 14755 14756 14757 14758 14759 14760 14761 14762 14763 14764 14765 14766 14767 14768 14769 14770 14771 14772 14773 14774 14775 14776 14777 14778 14779 14780 14781 14782 14783 14784 14785 14786 14787 14788 14789 14790 14791 14792 14793 14794 14795 14796 14797 14798 14799 14800 14801 14802 14803 14804 14805 14806 14807 14808 14809 14810 14811 14812 14813 14814 14815 14816 14817 14818 14819 14820 14821 14822 14823 14824 14825 14826 14827 14828 14829 14830 14831 14832 14833 14834 14835 14836 14837 14838 14839 14840 14841 14842 14843 14844 14845 14846 14847 14848 14849 14850 14851 14852 14853 14854 14855 14856 14857 14858 14859 14860 14861 14862 14863 14864 14865 14866 14867 14868 14869 14870 14871 14872 14873 14874 14875 14876 14877 14878 14879 14880 14881 14882 14883 14884 14885 14886 14887 14888 14889 14890 14891 14892 14893 14894 14895 14896 14897 14898 14899 14900 14901 14902 14903 14904 14905 14906 14907 14908 14909 14910 14911 14912 14913 14914 14915 14916 14917 14918 14919 14920 14921 14922 14923 14924 14925 14926 14927 14928 14929 14930 14931 14932 14933 14934 14935 14936 14937 14938 14939 14940 14941 14942 14943 14944 14945 14946 14947 14948 14949 14950 14951 14952 14953 14954 14955 14956 14957 14958 14959 14960 14961 14962 14963 14964 14965 14966 14967 14968 14969 14970 14971 14972 14973 14974 14975 14976 14977 14978 14979 14980 14981 14982 14983 14984 14985 14986 14987 14988 14989 14990 14991 14992 14993 14994 14995 14996 14997 14998 14999 15000 15001 15002 15003 15004 15005 15006 15007 15008 15009 15010 15011 15012 15013 15014 15015 15016 15017 15018 15019 15020 15021 15022 15023 15024 15025 15026 15027 15028 15029 15030 15031 15032 15033 15034 15035 15036 15037 15038 15039 15040 15041 15042 15043 15044 15045 15046 15047 15048 15049 15050 15051 15052 15053 15054 15055 15056 15057 15058 15059 15060 15061 15062 15063 15064 15065 15066 15067 15068 15069 15070 15071 15072 15073 15074 15075 15076 15077 15078 15079 15080 15081 15082 15083 15084 15085 15086 15087 15088 15089 15090 15091 15092 15093 15094 15095 15096 15097 15098 15099 15100 15101 15102 15103 15104 15105 15106 15107 15108 15109 15110 15111 15112 15113 15114 15115 15116 15117 15118 15119 15120 15121 15122 15123 15124 15125 15126 15127 15128 15129 15130 15131 15132 15133 15134 15135 15136 15137 15138 15139 15140 15141 15142 15143 15144 15145 15146 15147 15148 15149 15150 15151 15152 15153 15154 15155 15156 15157 15158 15159 15160 15161 15162 15163 15164 15165 15166 15167 15168 15169 15170 15171 15172 15173 15174 15175 15176 15177 15178 15179 15180 15181 15182 15183 15184 15185 15186 15187 15188 15189 15190 15191 15192 15193 15194 15195 15196 15197 15198 15199 15200 15201 15202 15203 15204 15205 15206 15207 15208 15209 15210 15211 15212 15213 15214 15215 15216 15217 15218 15219 15220 15221 15222 15223 15224 15225 15226 15227 15228 15229 15230 15231 15232 15233 15234 15235 15236 15237 15238 15239 15240 15241 15242 15243 15244 15245 15246 15247 15248 15249 15250 15251 15252 15253 15254 15255 15256 15257 15258 15259 15260 15261 15262 15263 15264 15265 15266 15267 15268 15269 15270 15271 15272 15273 15274 15275 15276 15277 15278 15279 15280 15281 15282 15283 15284 15285 15286 15287 15288 15289 15290 15291 15292 15293 15294 15295 15296 15297 15298 15299 15300 15301 15302 15303 15304 15305 15306 15307 15308 15309 15310 15311 15312 15313 15314 15315 15316 15317 15318 15319 15320 15321 15322 15323 15324 15325 15326 15327 15328 15329 15330 15331 15332 15333 15334 15335 15336 15337 15338 15339 15340 15341 15342 15343 15344 15345 15346 15347 15348 15349 15350 15351 15352 15353 15354 15355 15356 15357 15358 15359 15360 15361 15362 15363 15364 15365 15366 15367 15368 15369 15370 15371 15372 15373 15374 15375 15376 15377 15378 15379 15380 15381 15382 15383 15384 15385 15386 15387 15388 15389 15390 15391 15392 15393 15394 15395 15396 15397 15398 15399 15400 15401 15402 15403 15404 15405 15406 15407 15408 15409 15410 15411 15412 15413 15414 15415 15416 15417 15418 15419 15420 15421 15422 15423 15424 15425 15426 15427 15428 15429 15430 15431 15432 15433 15434 15435 15436 15437 15438 15439 15440 15441 15442 15443 15444 15445 15446 15447 15448 15449 15450 15451 15452 15453 15454 15455 15456 15457 15458 15459 15460 15461 15462 15463 15464 15465 15466 15467 15468 15469 15470 15471 15472 15473 15474 15475 15476 15477 15478 15479 15480 15481 15482 15483 15484 15485 15486 15487 15488 15489 15490 15491 15492 15493 15494 15495 15496 15497 15498 15499 15500 15501 15502 15503 15504 15505 15506 15507 15508 15509 15510 15511 15512 15513 15514 15515 15516 15517 15518 15519 15520 15521 15522 15523 15524 15525 15526 15527 15528 15529 15530 15531 15532 15533 15534 15535 15536 15537 15538 15539 15540 15541 15542 15543 15544 15545 15546 15547 15548 15549 15550 15551 15552 15553 15554 15555 15556 15557 15558 15559 15560 15561 15562 15563 15564 15565 15566 15567 15568 15569 15570 15571 15572 15573 15574 15575 15576 15577 15578 15579 15580 15581 15582 15583 15584 15585 15586 15587 15588 15589 15590 15591 15592 15593 15594 15595 15596 15597 15598 15599 15600 15601 15602 15603 15604 15605 15606 15607 15608 15609 15610 15611 15612 15613 15614 15615 15616 15617 15618 15619 15620 15621 15622 15623 15624 15625 15626 15627 15628 15629 15630 15631 15632 15633 15634 15635 15636 15637 15638 15639 15640 15641 15642 15643 15644 15645 15646 15647 15648 15649 15650 15651 15652 15653 15654 15655 15656 15657 15658 15659 15660 15661 15662 15663 15664 15665 15666 15667 15668 15669 15670 15671 15672 15673 15674 15675 15676 15677 15678 15679 15680 15681 15682 15683 15684 15685 15686 15687 15688 15689 15690 15691 15692 15693 15694 15695 15696 15697 15698 15699 15700 15701 15702 15703 15704 15705 15706 15707 15708 15709 15710 15711 15712 15713 15714 15715 15716 15717 15718 15719 15720 15721 15722 15723 15724 15725 15726 15727 15728 15729 15730 15731 15732 15733 15734 15735 15736 15737 15738 15739 15740 15741 15742 15743 15744 15745 15746 15747 15748 15749 15750 15751 15752 15753 15754 15755 15756 15757 15758 15759 15760 15761 15762 15763 15764 15765 15766 15767 15768 15769 15770 15771 15772 15773 15774 15775 15776 15777 15778 15779 15780 15781 15782 15783 15784 15785 15786 15787 15788 15789 15790 15791 15792 15793 15794 15795 15796 15797 15798 15799 15800 15801 15802 15803 15804 15805 15806 15807 15808 15809 15810 15811 15812 15813 15814 15815 15816 15817 15818 15819 15820 15821 15822 15823 15824 15825 15826 15827 15828 15829 15830 15831 15832 15833 15834 15835 15836 15837 15838 15839 15840 15841 15842 15843 15844 15845 15846 15847 15848 15849 15850 15851 15852 15853 15854 15855 15856 15857 15858 15859 15860 15861 15862 15863 15864 15865 15866 15867 15868 15869 15870 15871 15872 15873 15874 15875 15876 15877 15878 15879 15880 15881 15882 15883 15884 15885 15886 15887 15888 15889 15890 15891 15892 15893 15894 15895 15896 15897 15898 15899 15900 15901 15902 15903 15904 15905 15906 15907 15908 15909 15910 15911 15912 15913 15914 15915 15916 15917 15918 15919 15920 15921 15922 15923 15924 15925 15926 15927 15928 15929 15930 15931 15932 15933 15934 15935 15936 15937 15938 15939 15940 15941 15942 15943 15944 15945 15946 15947 15948 15949 15950 15951 15952 15953 15954 15955 15956 15957 15958 15959 15960 15961 15962 15963 15964 15965 15966 15967 15968 15969 15970 15971 15972 15973 15974 15975 15976 15977 15978 15979 15980 15981 15982 15983 15984 15985 15986 15987 15988 15989 15990 15991 15992 15993 15994 15995 15996 15997 15998 15999 16000 16001 16002 16003 16004 16005 16006 16007 16008 16009 16010 16011 16012 16013 16014 16015 16016 16017 16018 16019 16020 16021 16022 16023 16024 16025 16026 16027 16028 16029 16030 16031 16032 16033 16034 16035 16036 16037 16038 16039 16040 16041 16042 16043 16044 16045 16046 16047 16048 16049 16050 16051 16052 16053 16054 16055 16056 16057 16058 16059 16060 16061 16062 16063 16064 16065 16066 16067 16068 16069 16070 16071 16072 16073 16074 16075 16076 16077 16078 16079 16080 16081 16082 16083 16084 16085 16086 16087 16088 16089 16090 16091 16092 16093 16094 16095 16096 16097 16098 16099 16100 16101 16102 16103 16104 16105 16106 16107 16108 16109 16110 16111 16112 16113 16114 16115 16116 16117 16118 16119 16120 16121 16122 16123 16124 16125 16126 16127 16128 16129 16130 16131 16132 16133 16134 16135 16136 16137 16138 16139 16140 16141 16142 16143 16144 16145 16146 16147 16148 16149 16150 16151 16152 16153 16154 16155 16156 16157 16158 16159 16160 16161 16162 16163 16164 16165 16166 16167 16168 16169 16170 16171 16172 16173 16174 16175 16176 16177 16178 16179 16180 16181 16182 16183 16184 16185 16186 16187 16188 16189 16190 16191 16192 16193 16194 16195 16196 16197 16198 16199 16200 16201 16202 16203 16204 16205 16206 16207 16208 16209 16210 16211 16212 16213 16214 16215 16216 16217 16218 16219 16220 16221 16222 16223 16224 16225 16226 16227 16228 16229 16230 16231 16232 16233 16234 16235 16236 16237 16238 16239 16240 16241 16242 16243 16244 16245 16246 16247 16248 16249 16250 16251 16252 16253 16254 16255 16256 16257 16258 16259 16260 16261 16262 16263 16264 16265 16266 16267 16268 16269 16270 16271 16272 16273 16274 16275 16276 16277 16278 16279 16280 16281 16282 16283 16284 16285 16286 16287 16288 16289 16290 16291 16292 16293 16294 16295 16296 16297 16298 16299 16300 16301 16302 16303 16304 16305 16306 16307 16308 16309 16310 16311 16312 16313 16314 16315 16316 16317 16318 16319 16320 16321 16322 16323 16324 16325 16326 16327 16328 16329 16330 16331 16332 16333 16334 16335 16336 16337 16338 16339 16340 16341 16342 16343 16344 16345 16346 16347 16348 16349 16350 16351 16352 16353 16354 16355 16356 16357 16358 16359 16360 16361 16362 16363 16364 16365 16366 16367 16368 16369 16370 16371 16372 16373 16374 16375 16376 16377 16378 16379 16380 16381 16382 16383 16384 16385 16386 16387 16388 16389 16390 16391 16392 16393 16394 16395 16396 16397 16398 16399 16400 16401 16402 16403 16404 16405 16406 16407 16408 16409 16410 16411 16412 16413 16414 16415 16416 16417 16418 16419 16420 16421 16422 16423 16424 16425 16426 16427 16428 16429 16430 16431 16432 16433 16434 16435 16436 16437 16438 16439 16440 16441 16442 16443 16444 16445 16446 16447 16448 16449 16450 16451 16452 16453 16454 16455 16456 16457 16458 16459 16460 16461 16462 16463 16464 16465 16466 16467 16468 16469 16470 16471 16472 16473 16474 16475 16476 16477 16478 16479 16480 16481 16482 16483 16484 16485 16486 16487 16488 16489 16490 16491 16492 16493 16494 16495 16496 16497 16498 16499 16500 16501 16502 16503 16504 16505 16506 16507 16508 16509 16510 16511 16512 16513 16514 16515 16516 16517 16518 16519 16520 16521 16522 16523 16524 16525 16526 16527 16528 16529 16530 16531 16532 16533 16534 16535 16536 16537 16538 16539 16540 16541 16542 16543 16544 16545 16546 16547 16548 16549 16550 16551 16552 16553 16554 16555 16556 16557 16558 16559 16560 16561 16562 16563 16564 16565 16566 16567 16568 16569 16570 16571 16572 16573 16574 16575 16576 16577 16578 16579 16580 16581 16582 16583 16584 16585 16586 16587 16588 16589 16590 16591 16592 16593 16594 16595 16596 16597 16598 16599 16600 16601 16602 16603 16604 16605 16606 16607 16608 16609 16610 16611 16612 16613 16614 16615 16616 16617 16618 16619 16620 16621 16622 16623 16624 16625 16626 16627 16628 16629 16630 16631 16632 16633 16634 16635 16636 16637 16638 16639 16640 16641 16642 16643 16644 16645 16646 16647 16648 16649 16650 16651 16652 16653 16654 16655 16656 16657 16658 16659 16660 16661 16662 16663 16664 16665 16666 16667 16668 16669 16670 16671 16672 16673 16674 16675 16676 16677 16678 16679 16680 16681 16682 16683 16684 16685 16686 16687 16688 16689 16690 16691 16692 16693 16694 16695 16696 16697 16698 16699 16700 16701 16702 16703 16704 16705 16706 16707 16708 16709 16710 16711 16712 16713 16714 16715 16716 16717 16718 16719 16720 16721 16722 16723 16724 16725 16726 16727 16728 16729 16730 16731 16732 16733 16734 16735 16736 16737 16738 16739 16740 16741 16742 16743 16744 16745 16746 16747 16748 16749 16750 16751 16752 16753 16754 16755 16756 16757 16758 16759 16760 16761 16762 16763 16764 16765 16766 16767 16768 16769 16770 16771 16772 16773 16774 16775 16776 16777 16778 16779 16780 16781 16782 16783 16784 16785 16786 16787 16788 16789 16790 16791 16792 16793 16794 16795 16796 16797 16798 16799 16800 16801 16802 16803 16804 16805 16806 16807 16808 16809 16810 16811 16812 16813 16814 16815 16816 16817 16818 16819 16820 16821 16822 16823 16824 16825 16826 16827 16828 16829 16830 16831 16832 16833 16834 16835 16836 16837 16838 16839 16840 16841 16842 16843 16844 16845 16846 16847 16848 16849 16850 16851 16852 16853 16854 16855 16856 16857 16858 16859 16860 16861 16862 16863 16864 16865 16866 16867 16868 16869 16870 16871 16872 16873 16874 16875 16876 16877 16878 16879 16880 16881 16882 16883 16884 16885 16886 16887 16888 16889 16890 16891 16892 16893 16894 16895 16896 16897 16898 16899 16900 16901 16902 16903 16904 16905 16906 16907 16908 16909 16910 16911 16912 16913 16914 16915 16916 16917 16918 16919 16920 16921 16922 16923 16924 16925 16926 16927 16928 16929 16930 16931 16932 16933 16934 16935 16936 16937 16938 16939 16940 16941 16942 16943 16944 16945 16946 16947 16948 16949 16950 16951 16952 16953 16954 16955 16956 16957 16958 16959 16960 16961 16962 16963 16964 16965 16966 16967 16968 16969 16970 16971 16972 16973 16974 16975 16976 16977 16978 16979 16980 16981 16982 16983 16984 16985 16986 16987 16988 16989 16990 16991 16992 16993 16994 16995 16996 16997 16998 16999 17000 17001 17002 17003 17004 17005 17006 17007 17008 17009 17010 17011 17012 17013 17014 17015 17016 17017 17018 17019 17020 17021 17022 17023 17024 17025 17026 17027 17028 17029 17030 17031 17032 17033 17034 17035 17036 17037 17038 17039 17040 17041 17042 17043 17044 17045 17046 17047 17048 17049 17050 17051 17052 17053 17054 17055 17056 17057 17058 17059 17060 17061 17062 17063 17064 17065 17066 17067 17068 17069 17070 17071 17072 17073 17074 17075 17076 17077 17078 17079 17080 17081 17082 17083 17084 17085 17086 17087 17088 17089 17090 17091 17092 17093 17094 17095 17096 17097 17098 17099 17100 17101 17102 17103 17104 17105 17106 17107 17108 17109 17110 17111 17112 17113 17114 17115 17116 17117 17118 17119 17120 17121 17122 17123 17124 17125 17126 17127 17128 17129 17130 17131 17132 17133 17134 17135 17136 17137 17138 17139 17140 17141 17142 17143 17144 17145 17146 17147 17148 17149 17150 17151 17152 17153 17154 17155 17156 17157 17158 17159 17160 17161 17162 17163 17164 17165 17166 17167 17168 17169 17170 17171 17172 17173 17174 17175 17176 17177 17178 17179 17180 17181 17182 17183 17184 17185 17186 17187 17188 17189 17190 17191 17192 17193 17194 17195 17196 17197 17198 17199 17200 17201 17202 17203 17204 17205 17206 17207 17208 17209 17210 17211 17212 17213 17214 17215 17216 17217 17218 17219 17220 17221 17222 17223 17224 17225 17226 17227 17228 17229 17230 17231 17232 17233 17234 17235 17236 17237 17238 17239 17240 17241 17242 17243 17244 17245 17246 17247 17248 17249 17250 17251 17252 17253 17254 17255 17256 17257 17258 17259 17260 17261 17262 17263 17264 17265 17266 17267 17268 17269 17270 17271 17272 17273 17274 17275 17276 17277 17278 17279 17280 17281 17282 17283 17284 17285 17286 17287 17288 17289 17290 17291 17292 17293 17294 17295 17296 17297 17298 17299 17300 17301 17302 17303 17304 17305 17306 17307 17308 17309 17310 17311 17312 17313 17314 17315 17316 17317 17318 17319 17320 17321 17322 17323 17324 17325 17326 17327 17328 17329 17330 17331 17332 17333 17334 17335 17336 17337 17338 17339 17340 17341 17342 17343 17344 17345 17346 17347 17348 17349 17350 17351 17352 17353 17354 17355 17356 17357 17358 17359 17360 17361 17362 17363 17364 17365 17366 17367 17368 17369 17370 17371 17372 17373 17374 17375 17376 17377 17378 17379 17380 17381 17382 17383 17384 17385 17386 17387 17388 17389 17390 17391 17392 17393 17394 17395 17396 17397 17398 17399 17400 17401 17402 17403 17404 17405 17406 17407 17408 17409 17410 17411 17412 17413 17414 17415 17416 17417 17418 17419 17420 17421 17422 17423 17424 17425 17426 17427 17428 17429 17430 17431 17432 17433 17434 17435 17436 17437 17438 17439 17440 17441 17442 17443 17444 17445 17446 17447 17448 17449 17450 17451 17452 17453 17454 17455 17456 17457 17458 17459 17460 17461 17462 17463 17464 17465 17466 17467 17468 17469 17470 17471 17472 17473 17474 17475 17476 17477 17478 17479 17480 17481 17482 17483 17484 17485 17486 17487 17488 17489 17490 17491 17492 17493 17494 17495 17496 17497 17498 17499 17500 17501 17502 17503 17504 17505 17506 17507 17508 17509 17510 17511 17512 17513 17514 17515 17516 17517 17518 17519 17520 17521 17522 17523 17524 17525 17526 17527 17528 17529 17530 17531 17532 17533 17534 17535 17536 17537 17538 17539 17540 17541 17542 17543 17544 17545 17546 17547 17548 17549 17550 17551 17552 17553 17554 17555 17556 17557 17558 17559 17560 17561 17562 17563 17564 17565 17566 17567 17568 17569 17570 17571 17572 17573 17574 17575 17576 17577 17578 17579 17580 17581 17582 17583 17584 17585 17586 17587 17588 17589 17590 17591 17592 17593 17594 17595 17596 17597 17598 17599 17600 17601 17602 17603 17604 17605 17606 17607 17608 17609 17610 17611 17612 17613 17614 17615 17616 17617 17618 17619 17620 17621 17622 17623 17624 17625 17626 17627 17628 17629 17630 17631 17632 17633 17634 17635 17636 17637 17638 17639 17640 17641 17642 17643 17644 17645 17646 17647 17648 17649 17650 17651 17652 17653 17654 17655 17656 17657 17658 17659 17660 17661 17662 17663 17664 17665 17666 17667 17668 17669 17670 17671 17672 17673 17674 17675 17676 17677 17678 17679 17680 17681 17682 17683 17684 17685 17686 17687 17688 17689 17690 17691 17692 17693 17694 17695 17696 17697 17698 17699 17700 17701 17702 17703 17704 17705 17706 17707 17708 17709 17710 17711 17712 17713 17714 17715 17716 17717 17718 17719 17720 17721 17722 17723 17724 17725 17726 17727 17728 17729 17730 17731 17732 17733 17734 17735 17736 17737 17738 17739 17740 17741 17742 17743 17744 17745 17746 17747 17748 17749 17750 17751 17752 17753 17754 17755 17756 17757 17758 17759 17760 17761 17762 17763 17764 17765 17766 17767 17768 17769 17770 17771 17772 17773 17774 17775 17776 17777 17778 17779 17780 17781 17782 17783 17784 17785 17786 17787 17788 17789 17790 17791 17792 17793 17794 17795 17796 17797 17798 17799 17800 17801 17802 17803 17804 17805 17806 17807 17808 17809 17810 17811 17812 17813 17814 17815 17816 17817 17818 17819 17820 17821 17822 17823 17824 17825 17826 17827 17828 17829 17830 17831 17832 17833 17834 17835 17836 17837 17838 17839 17840 17841 17842 17843 17844 17845 17846 17847 17848 17849 17850 17851 17852 17853 17854 17855 17856 17857 17858 17859 17860 17861 17862 17863 17864 17865 17866 17867 17868 17869 17870 17871 17872 17873 17874 17875 17876 17877 17878 17879 17880 17881 17882 17883 17884 17885 17886 17887 17888 17889 17890 17891 17892 17893 17894 17895 17896 17897 17898 17899 17900 17901 17902 17903 17904 17905 17906 17907 17908 17909 17910 17911 17912 17913 17914 17915 17916 17917 17918 17919 17920 17921 17922 17923 17924 17925 17926 17927 17928 17929 17930 17931 17932 17933 17934 17935 17936 17937 17938 17939 17940 17941 17942 17943 17944 17945 17946 17947 17948 17949 17950 17951 17952 17953 17954 17955 17956 17957 17958 17959 17960 17961 17962 17963 17964 17965 17966 17967 17968 17969 17970 17971 17972 17973 17974 17975 17976 17977 17978 17979 17980 17981 17982 17983 17984 17985 17986 17987 17988 17989 17990 17991 17992 17993 17994 17995 17996 17997 17998 17999 18000 18001 18002 18003 18004 18005 18006 18007 18008 18009 18010 18011 18012 18013 18014 18015 18016 18017 18018 18019 18020 18021 18022 18023 18024 18025 18026 18027 18028 18029 18030 18031 18032 18033 18034 18035 18036 18037 18038 18039 18040 18041 18042 18043 18044 18045 18046 18047 18048 18049 18050 18051 18052 18053 18054 18055 18056 18057 18058 18059 18060 18061 18062 18063 18064 18065 18066 18067 18068 18069 18070 18071 18072 18073 18074 18075 18076 18077 18078 18079 18080 18081 18082 18083 18084 18085 18086 18087 18088 18089 18090 18091 18092 18093 18094 18095 18096 18097 18098 18099 18100 18101 18102 18103 18104 18105 18106 18107 18108 18109 18110 18111 18112 18113 18114 18115 18116 18117 18118 18119 18120 18121 18122 18123 18124 18125 18126 18127 18128 18129 18130 18131 18132 18133 18134 18135 18136 18137 18138 18139 18140 18141 18142 18143 18144 18145 18146 18147 18148 18149 18150 18151 18152 18153 18154 18155 18156 18157 18158 18159 18160 18161 18162 18163 18164 18165 18166 18167 18168 18169 18170 18171 18172 18173 18174 18175 18176 18177 18178 18179 18180 18181 18182 18183 18184 18185 18186 18187 18188 18189 18190 18191 18192 18193 18194 18195 18196 18197 18198 18199 18200 18201 18202 18203 18204 18205 18206 18207 18208 18209 18210 18211 18212 18213 18214 18215 18216 18217 18218 18219 18220 18221 18222 18223 18224 18225 18226 18227 18228 18229 18230 18231 18232 18233 18234 18235 18236 18237 18238 18239 18240 18241 18242 18243 18244 18245 18246 18247 18248 18249 18250 18251 18252 18253 18254 18255 18256 18257 18258 18259 18260 18261 18262 18263 18264 18265 18266 18267 18268 18269 18270 18271 18272 18273 18274 18275 18276 18277 18278 18279 18280 18281 18282 18283 18284 18285 18286 18287 18288 18289 18290 18291 18292 18293 18294 18295 18296 18297 18298 18299 18300 18301 18302 18303 18304 18305 18306 18307 18308 18309 18310 18311 18312 18313 18314 18315 18316 18317 18318 18319 18320 18321 18322 18323 18324 18325 18326 18327 18328 18329 18330 18331 18332 18333 18334 18335 18336 18337 18338 18339 18340 18341 18342 18343 18344 18345 18346 18347 18348 18349 18350 18351 18352 18353 18354 18355 18356 18357 18358 18359 18360 18361 18362 18363 18364 18365 18366 18367 18368 18369 18370 18371 18372 18373 18374 18375 18376 18377 18378 18379 18380 18381 18382 18383 18384 18385 18386 18387 18388 18389 18390 18391 18392 18393 18394 18395 18396 18397 18398 18399 18400 18401 18402 18403 18404 18405 18406 18407 18408 18409 18410 18411 18412 18413 18414 18415 18416 18417 18418 18419 18420 18421 18422 18423 18424 18425 18426 18427 18428 18429 18430 18431 18432 18433 18434 18435 18436 18437 18438 18439 18440 18441 18442 18443 18444 18445 18446 18447 18448 18449 18450 18451 18452 18453 18454 18455 18456 18457 18458 18459 18460 18461 18462 18463 18464 18465 18466 18467 18468 18469 18470 18471 18472 18473 18474 18475 18476 18477 18478 18479 18480 18481 18482 18483 18484 18485 18486 18487 18488 18489 18490 18491 18492 18493 18494 18495 18496 18497 18498 18499 18500 18501 18502 18503 18504 18505 18506 18507 18508 18509 18510 18511 18512 18513 18514 18515 18516 18517 18518 18519 18520 18521 18522 18523 18524 18525 18526 18527 18528 18529 18530 18531 18532 18533 18534 18535 18536 18537 18538 18539 18540 18541 18542 18543 18544 18545 18546 18547 18548 18549 18550 18551 18552 18553 18554 18555 18556 18557 18558 18559 18560 18561 18562 18563 18564 18565 18566 18567 18568 18569 18570 18571 18572 18573 18574 18575 18576 18577 18578 18579 18580 18581 18582 18583 18584 18585 18586 18587 18588 18589 18590 18591 18592 18593 18594 18595 18596 18597 18598 18599 18600 18601 18602 18603 18604 18605 18606 18607 18608 18609 18610 18611 18612 18613 18614 18615 18616 18617 18618 18619 18620 18621 18622 18623 18624 18625 18626 18627 18628 18629 18630 18631 18632 18633 18634 18635 18636 18637 18638 18639 18640 18641 18642 18643 18644 18645 18646 18647 18648 18649 18650 18651 18652 18653 18654 18655 18656 18657 18658 18659 18660 18661 18662 18663 18664 18665 18666 18667 18668 18669 18670 18671 18672 18673 18674 18675 18676 18677 18678 18679 18680 18681 18682 18683 18684 18685 18686 18687 18688 18689 18690 18691 18692 18693 18694 18695 18696 18697 18698 18699 18700 18701 18702 18703 18704 18705 18706 18707 18708 18709 18710 18711 18712 18713 18714 18715 18716 18717 18718 18719 18720 18721 18722 18723 18724 18725 18726 18727 18728 18729 18730 18731 18732 18733 18734 18735 18736 18737 18738 18739 18740 18741 18742 18743 18744 18745 18746 18747 18748 18749 18750 18751 18752 18753 18754 18755 18756 18757 18758 18759 18760 18761 18762 18763 18764 18765 18766 18767 18768 18769 18770 18771 18772 18773 18774 18775 18776 18777 18778 18779 18780 18781 18782 18783 18784 18785 18786 18787 18788 18789 18790 18791 18792 18793 18794 18795 18796 18797 18798 18799 18800 18801 18802 18803 18804 18805 18806 18807 18808 18809 18810 18811 18812 18813 18814 18815 18816 18817 18818 18819 18820 18821 18822 18823 18824 18825 18826 18827 18828 18829 18830 18831 18832 18833 18834 18835 18836 18837 18838 18839 18840 18841 18842 18843 18844 18845 18846 18847 18848 18849 18850 18851 18852 18853 18854 18855 18856 18857 18858 18859 18860 18861 18862 18863 18864 18865 18866 18867 18868 18869 18870 18871 18872 18873 18874 18875 18876 18877 18878 18879 18880 18881 18882 18883 18884 18885 18886 18887 18888 18889 18890 18891 18892 18893 18894 18895 18896 18897 18898 18899 18900 18901 18902 18903 18904 18905 18906 18907 18908 18909 18910 18911 18912 18913 18914 18915 18916 18917 18918 18919 18920 18921 18922 18923 18924 18925 18926 18927 18928 18929 18930 18931 18932 18933 18934 18935 18936 18937 18938 18939 18940 18941 18942 18943 18944 18945 18946 18947 18948 18949 18950 18951 18952 18953 18954 18955 18956 18957 18958 18959 18960 18961 18962 18963 18964 18965 18966 18967 18968 18969 18970 18971 18972 18973 18974 18975 18976 18977 18978 18979 18980 18981 18982 18983 18984 18985 18986 18987 18988 18989 18990 18991 18992 18993 18994 18995 18996 18997 18998 18999 19000 19001 19002 19003 19004 19005 19006 19007 19008 19009 19010 19011 19012 19013 19014 19015 19016 19017 19018 19019 19020 19021 19022 19023 19024 19025 19026 19027 19028 19029 19030 19031 19032 19033 19034 19035 19036 19037 19038 19039 19040 19041 19042 19043 19044 19045 19046 19047 19048 19049 19050 19051 19052 19053 19054 19055 19056 19057 19058 19059 19060 19061 19062 19063 19064 19065 19066 19067 19068 19069 19070 19071 19072 19073 19074 19075 19076 19077 19078 19079 19080 19081 19082 19083 19084 19085 19086 19087 19088 19089 19090 19091 19092 19093 19094 19095 19096 19097 19098 19099 19100 19101 19102 19103 19104 19105 19106 19107 19108 19109 19110 19111 19112 19113 19114 19115 19116 19117 19118 19119 19120 19121 19122 19123 19124 19125 19126 19127 19128 19129 19130 19131 19132 19133 19134 19135 19136 19137 19138 19139 19140 19141 19142 19143 19144 19145 19146 19147 19148 19149 19150 19151 19152 19153 19154 19155 19156 19157 19158 19159 19160 19161 19162 19163 19164 19165 19166 19167 19168 19169 19170 19171 19172 19173 19174 19175 19176 19177 19178 19179 19180 19181 19182 19183 19184 19185 19186 19187 19188 19189 19190 19191 19192 19193 19194 19195 19196 19197 19198 19199 19200 19201 19202 19203 19204 19205 19206 19207 19208 19209 19210 19211 19212 19213 19214 19215 19216 19217 19218 19219 19220 19221 19222 19223 19224 19225 19226 19227 19228 19229 19230 19231 19232 19233 19234 19235 19236 19237 19238 19239 19240 19241 19242 19243 19244 19245 19246 19247 19248 19249 19250 19251 19252 19253 19254 19255 19256 19257 19258 19259 19260 19261 19262 19263 19264 19265 19266 19267 19268 19269 19270 19271 19272 19273 19274 19275 19276 19277 19278 19279 19280 19281 19282 19283 19284 19285 19286 19287 19288 19289 19290 19291 19292 19293 19294 19295 19296 19297 19298 19299 19300 19301 19302 19303 19304 19305 19306 19307 19308 19309 19310 19311 19312 19313 19314 19315 19316 19317 19318 19319 19320 19321 19322 19323 19324 19325 19326 19327 19328 19329 19330 19331 19332 19333 19334 19335 19336 19337 19338 19339 19340 19341 19342 19343 19344 19345 19346 19347 19348 19349 19350 19351 19352 19353 19354 19355 19356 19357 19358 19359 19360 19361 19362 19363 19364 19365 19366 19367 19368 19369 19370 19371 19372 19373 19374 19375 19376 19377 19378 19379 19380 19381 19382 19383 19384 19385 19386 19387 19388 19389 19390 19391 19392 19393 19394 19395 19396 19397 19398 19399 19400 19401 19402 19403 19404 19405 19406 19407 19408 19409 19410 19411 19412 19413 19414 19415 19416 19417 19418 19419 19420 19421 19422 19423 19424 19425 19426 19427 19428 19429 19430 19431 19432 19433 19434 19435 19436 19437 19438 19439 19440 19441 19442 19443 19444 19445 19446 19447 19448 19449 19450 19451 19452 19453 19454 19455 19456 19457 19458 19459 19460 19461 19462 19463 19464 19465 19466 19467 19468 19469 19470 19471 19472 19473 19474 19475 19476 19477 19478 19479 19480 19481 19482 19483 19484 19485 19486 19487 19488 19489 19490 19491 19492 19493 19494 19495 19496 19497 19498 19499 19500 19501 19502 19503 19504 19505 19506 19507 19508 19509 19510 19511 19512 19513 19514 19515 19516 19517 19518 19519 19520 19521 19522 19523 19524 19525 19526 19527 19528 19529 19530 19531 19532 19533 19534 19535 19536 19537 19538 19539 19540 19541 19542 19543 19544 19545 19546 19547 19548 19549 19550 19551 19552 19553 19554 19555 19556 19557 19558 19559 19560 19561 19562 19563 19564 19565 19566 19567 19568 19569 19570 19571 19572 19573 19574 19575 19576 19577 19578 19579 19580 19581 19582 19583 19584 19585 19586 19587 19588 19589 19590 19591 19592 19593 19594 19595 19596 19597 19598 19599 19600 19601 19602 19603 19604 19605 19606 19607 19608 19609 19610 19611 19612 19613 19614 19615 19616 19617 19618 19619 19620 19621 19622 19623 19624 19625 19626 19627 19628 19629 19630 19631 19632 19633 19634 19635 19636 19637 19638 19639 19640 19641 19642 19643 19644 19645 19646 19647 19648 19649 19650 19651 19652 19653 19654 19655 19656 19657 19658 19659 19660 19661 19662 19663 19664 19665 19666 19667 19668 19669 19670 19671 19672 19673 19674 19675 19676 19677 19678 19679 19680 19681 19682 19683 19684 19685 19686 19687 19688 19689 19690 19691 19692 19693 19694 19695 19696 19697 19698 19699 19700 19701 19702 19703 19704 19705 19706 19707 19708 19709 19710 19711 19712 19713 19714 19715 19716 19717 19718 19719 19720 19721 19722 19723 19724 19725 19726 19727 19728 19729 19730 19731 19732 19733 19734 19735 19736 19737 19738 19739 19740 19741 19742 19743 19744 19745 19746 19747 19748 19749 19750 19751 19752 19753 19754 19755 19756 19757 19758 19759 19760 19761 19762 19763 19764 19765 19766 19767 19768 19769 19770 19771 19772 19773 19774 19775 19776 19777 19778 19779 19780 19781 19782 19783 19784 19785 19786 19787 19788 19789 19790 19791 19792 19793 19794 19795 19796 19797 19798 19799 19800 19801 19802 19803 19804 19805 19806 19807 19808 19809 19810 19811 19812 19813 19814 19815 19816 19817 19818 19819 19820 19821 19822 19823 19824 19825 19826 19827 19828 19829 19830 19831 19832 19833 19834 19835 19836 19837 19838 19839 19840 19841 19842 19843 19844 19845 19846 19847 19848 19849 19850 19851 19852 19853 19854 19855 19856 19857 19858 19859 19860 19861 19862 19863 19864 19865 19866 19867 19868 19869 19870 19871 19872 19873 19874 19875 19876 19877 19878 19879 19880 19881 19882 19883 19884 19885 19886 19887 19888 19889 19890 19891 19892 19893 19894 19895 19896 19897 19898 19899 19900 19901 19902 19903 19904 19905 19906 19907 19908 19909 19910 19911 19912 19913 19914 19915 19916 19917 19918 19919 19920 19921 19922 19923 19924 19925 19926 19927 19928 19929 19930 19931 19932 19933 19934 19935 19936 19937 19938 19939 19940 19941 19942 19943 19944 19945 19946 19947 19948 19949 19950 19951 19952 19953 19954 19955 19956 19957 19958 19959 19960 19961 19962 19963 19964 19965 19966 19967 19968 19969 19970 19971 19972 19973 19974 19975 19976 19977 19978 19979 19980 19981 19982 19983 19984 19985 19986 19987 19988 19989 19990 19991 19992 19993 19994 19995 19996 19997 19998 19999 20000 20001 20002 20003 20004 20005 20006 20007 20008 20009 20010 20011 20012 20013 20014 20015 20016 20017 20018 20019 20020 20021 20022 20023 20024 20025 20026 20027 20028 20029 20030 20031 20032 20033 20034 20035 20036 20037 20038 20039 20040 20041 20042 20043 20044 20045 20046 20047 20048 20049 20050 20051 20052 20053 20054 20055 20056 20057 20058 20059 20060 20061 20062 20063 20064 20065 20066 20067 20068 20069 20070 20071 20072 20073 20074 20075 20076 20077 20078 20079 20080 20081 20082 20083 20084 20085 20086 20087 20088 20089 20090 20091 20092 20093 20094 20095 20096 20097 20098 20099 20100 20101 20102 20103 20104 20105 20106 20107 20108 20109 20110 20111 20112 20113 20114 20115 20116 20117 20118 20119 20120 20121 20122 20123 20124 20125 20126 20127 20128 20129 20130 20131 20132 20133 20134 20135 20136 20137 20138 20139 20140 20141 20142 20143 20144 20145 20146 20147 20148 20149 20150 20151 20152 20153 20154 20155 20156 20157 20158 20159 20160 20161 20162 20163 20164 20165 20166 20167 20168 20169 20170 20171 20172 20173 20174 20175 20176 20177 20178 20179 20180 20181 20182 20183 20184 20185 20186 20187 20188 20189 20190 20191 20192 20193 20194 20195 20196 20197 20198 20199 20200 20201 20202 20203 20204 20205 20206 20207 20208 20209 20210 20211 20212 20213 20214 20215 20216 20217 20218 20219 20220 20221 20222 20223 20224 20225 20226 20227 20228 20229 20230 20231 20232 20233 20234 20235 20236 20237 20238 20239 20240 20241 20242 20243 20244 20245 20246 20247 20248 20249 20250 20251 20252 20253 20254 20255 20256 20257 20258 20259 20260 20261 20262 20263 20264 20265 20266 20267 20268 20269 20270 20271 20272 20273 20274 20275 20276 20277 20278 20279 20280 20281 20282 20283 20284 20285 20286 20287 20288 20289 20290 20291 20292 20293 20294 20295 20296 20297 20298 20299 20300 20301 20302 20303 20304 20305 20306 20307 20308 20309 20310 20311 20312 20313 20314 20315 20316 20317 20318 20319 20320 20321 20322 20323 20324 20325 20326 20327 20328 20329 20330 20331 20332 20333 20334 20335 20336 20337 20338 20339 20340 20341 20342 20343 20344 20345 20346 20347 20348 20349 20350 20351 20352 20353 20354 20355 20356 20357 20358 20359 20360 20361 20362 20363 20364 20365 20366 20367 20368 20369 20370 20371 20372 20373 20374 20375 20376 20377 20378 20379 20380 20381 20382 20383 20384 20385 20386 20387 20388 20389 20390 20391 20392 20393 20394 20395 20396 20397 20398 20399 20400 20401 20402 20403 20404 20405 20406 20407 20408 20409 20410 20411 20412 20413 20414 20415 20416 20417 20418 20419 20420 20421 20422 20423 20424 20425 20426 20427 20428 20429 20430 20431 20432 20433 20434 20435 20436 20437 20438 20439 20440 20441 20442 20443 20444 20445 20446 20447 20448 20449 20450 20451 20452 20453 20454 20455 20456 20457 20458 20459 20460 20461 20462 20463 20464 20465 20466 20467 20468 20469 20470 20471 20472 20473 20474 20475 20476 20477 20478 20479 20480 20481 20482 20483 20484 20485 20486 20487 20488 20489 20490 20491 20492 20493 20494 20495 20496 20497 20498 20499 20500 20501 20502 20503 20504 20505 20506 20507 20508 20509 20510 20511 20512 20513 20514 20515 20516 20517 20518 20519 20520 20521 20522 20523 20524 20525 20526 20527 20528 20529 20530 20531 20532 20533 20534 20535 20536 20537 20538 20539 20540 20541 20542 20543 20544 20545 20546 20547 20548 20549 20550 20551 20552 20553 20554 20555 20556 20557 20558 20559 20560 20561 20562 20563 20564 20565 20566 20567 20568 20569 20570 20571 20572 20573 20574 20575 20576 20577 20578 20579 20580 20581 20582 20583 20584 20585 20586 20587 20588 20589 20590 20591 20592 20593 20594 20595 20596 20597 20598 20599 20600 20601 20602 20603 20604 20605 20606 20607 20608 20609 20610 20611 20612 20613 20614 20615 20616 20617 20618 20619 20620 20621 20622 20623 20624 20625 20626 20627 20628 20629 20630 20631 20632 20633 20634 20635 20636 20637 20638 20639 20640 20641 20642 20643 20644 20645 20646 20647 20648 20649 20650 20651 20652 20653 20654 20655 20656 20657 20658 20659 20660 20661 20662 20663 20664 20665 20666 20667 20668 20669 20670 20671 20672 20673 20674 20675 20676 20677 20678 20679 20680 20681 20682 20683 20684 20685 20686 20687 20688 20689 20690 20691 20692 20693 20694 20695 20696 20697 20698 20699 20700 20701 20702 20703 20704 20705 20706 20707 20708 20709 20710 20711 20712 20713 20714 20715 20716 20717 20718 20719 20720 20721 20722 20723 20724 20725 20726 20727 20728 20729 20730 20731 20732 20733 20734 20735 20736 20737 20738 20739 20740 20741 20742 20743 20744 20745 20746 20747 20748 20749 20750 20751 20752 20753 20754 20755 20756 20757 20758 20759 20760 20761 20762 20763 20764 20765 20766 20767 20768 20769 20770 20771 20772 20773 20774 20775 20776 20777 20778 20779 20780 20781 20782 20783 20784 20785 20786 20787 20788 20789 20790 20791 20792 20793 20794 20795 20796 20797 20798 20799 20800 20801 20802 20803 20804 20805 20806 20807 20808 20809 20810 20811 20812 20813 20814 20815 20816 20817 20818 20819 20820 20821 20822 20823 20824 20825 20826 20827 20828 20829 20830 20831 20832 20833 20834 20835 20836 20837 20838 20839 20840 20841 20842 20843 20844 20845 20846 20847 20848 20849 20850 20851 20852 20853 20854 20855 20856 20857 20858 20859 20860 20861 20862 20863 20864 20865 20866 20867 20868 20869 20870 20871 20872 20873 20874 20875 20876 20877 20878 20879 20880 20881 20882 20883 20884 20885 20886 20887 20888 20889 20890 20891 20892 20893 20894 20895 20896 20897 20898 20899 20900 20901 20902 20903 20904 20905 20906 20907 20908 20909 20910 20911 20912 20913 20914 20915 20916 20917 20918 20919 20920 20921 20922 20923 20924 20925 20926 20927 20928 20929 20930 20931 20932 20933 20934 20935 20936 20937 20938 20939 20940 20941 20942 20943 20944 20945 20946 20947 20948 20949 20950 20951 20952 20953 20954 20955 20956 20957 20958 20959 20960 20961 20962 20963 20964 20965 20966 20967 20968 20969 20970 20971 20972 20973 20974 20975 20976 20977 20978 20979 20980 20981 20982 20983 20984 20985 20986 20987 20988 20989 20990 20991 20992 20993 20994 20995 20996 20997 20998 20999 21000 21001 21002 21003 21004 21005 21006 21007 21008 21009 21010 21011 21012 21013 21014 21015 21016 21017 21018 21019 21020 21021 21022 21023 21024 21025 21026 21027 21028 21029 21030 21031 21032 21033 21034 21035 21036 21037 21038 21039 21040 21041 21042 21043 21044 21045 21046 21047 21048 21049 21050 21051 21052 21053 21054 21055 21056 21057 21058 21059 21060 21061 21062 21063 21064 21065 21066 21067 21068 21069 21070 21071 21072 21073 21074 21075 21076 21077 21078 21079 21080 21081 21082 21083 21084 21085 21086 21087 21088 21089 21090 21091 21092 21093 21094 21095 21096 21097 21098 21099 21100 21101 21102 21103 21104 21105 21106 21107 21108 21109 21110 21111 21112 21113 21114 21115 21116 21117 21118 21119 21120 21121 21122 21123 21124 21125 21126 21127 21128 21129 21130 21131 21132 21133 21134 21135 21136 21137 21138 21139 21140 21141 21142 21143 21144 21145 21146 21147 21148 21149 21150 21151 21152 21153 21154 21155 21156 21157 21158 21159 21160 21161 21162 21163 21164 21165 21166 21167 21168 21169 21170 21171 21172 21173 21174 21175 21176 21177 21178 21179 21180 21181 21182 21183 21184 21185 21186 21187 21188 21189 21190 21191 21192 21193 21194 21195 21196 21197 21198 21199 21200 21201 21202 21203 21204 21205 21206 21207 21208 21209 21210 21211 21212 21213 21214 21215 21216 21217 21218 21219 21220 21221 21222 21223 21224 21225 21226 21227 21228 21229 21230 21231 21232 21233 21234 21235 21236 21237 21238 21239 21240 21241 21242 21243 21244 21245 21246 21247 21248 21249 21250 21251 21252 21253 21254 21255 21256 21257 21258 21259 21260 21261 21262 21263 21264 21265 21266 21267 21268 21269 21270 21271 21272 21273 21274 21275 21276 21277 21278 21279 21280 21281 21282 21283 21284 21285 21286 21287 21288 21289 21290 21291 21292 21293 21294 21295 21296 21297 21298 21299 21300 21301 21302 21303 21304 21305 21306 21307 21308 21309 21310 21311 21312 21313 21314 21315 21316 21317 21318 21319 21320 21321 21322 21323 21324 21325 21326 21327 21328 21329 21330 21331 21332 21333 21334 21335 21336 21337 21338 21339 21340 21341 21342 21343 21344 21345 21346 21347 21348 21349 21350 21351 21352 21353 21354 21355 21356 21357 21358 21359 21360 21361 21362 21363 21364 21365 21366 21367 21368 21369 21370 21371 21372 21373 21374 21375 21376 21377 21378 21379 21380 21381 21382 21383 21384 21385 21386 21387 21388 21389 21390 21391 21392 21393 21394 21395 21396 21397 21398 21399 21400 21401 21402 21403 21404 21405 21406 21407 21408 21409 21410 21411 21412 21413 21414 21415 21416 21417 21418 21419 21420 21421 21422 21423 21424 21425 21426 21427 21428 21429 21430 21431 21432 21433 21434 21435 21436 21437 21438 21439 21440 21441 21442 21443 21444 21445 21446 21447 21448 21449 21450 21451 21452 21453 21454 21455 21456 21457 21458 21459 21460 21461 21462 21463 21464 21465 21466 21467 21468 21469 21470 21471 21472 21473 21474 21475 21476 21477 21478 21479 21480 21481 21482 21483 21484 21485 21486 21487 21488 21489 21490 21491 21492 21493 21494 21495 21496 21497 21498 21499 21500 21501 21502 21503 21504 21505 21506 21507 21508 21509 21510 21511 21512 21513 21514 21515 21516 21517 21518 21519 21520 21521 21522 21523 21524 21525 21526 21527 21528 21529 21530 21531 21532 21533 21534 21535 21536 21537 21538 21539 21540 21541 21542 21543 21544 21545 21546 21547 21548 21549 21550 21551 21552 21553 21554 21555 21556 21557 21558 21559 21560 21561 21562 21563 21564 21565 21566 21567 21568 21569 21570 21571 21572 21573 21574 21575 21576 21577 21578 21579 21580 21581 21582 21583 21584 21585 21586 21587 21588 21589 21590 21591 21592 21593 21594 21595 21596 21597 21598 21599 21600 21601 21602 21603 21604 21605 21606 21607 21608 21609 21610 21611 21612 21613 21614 21615 21616 21617 21618 21619 21620 21621 21622 21623 21624 21625 21626 21627 21628 21629 21630 21631 21632 21633 21634 21635 21636 21637 21638 21639 21640 21641 21642 21643 21644 21645 21646 21647 21648 21649 21650 21651 21652 21653 21654 21655 21656 21657 21658 21659 21660 21661 21662 21663 21664 21665 21666 21667 21668 21669 21670 21671 21672 21673 21674 21675 21676 21677 21678 21679 21680 21681 21682 21683 21684 21685 21686 21687 21688 21689 21690 21691 21692 21693 21694 21695 21696 21697 21698 21699 21700 21701 21702 21703 21704 21705 21706 21707 21708 21709 21710 21711 21712 21713 21714 21715 21716 21717 21718 21719 21720 21721 21722 21723 21724 21725 21726 21727 21728 21729 21730 21731 21732 21733 21734 21735 21736 21737 21738 21739 21740 21741 21742 21743 21744 21745 21746 21747 21748 21749 21750 21751 21752 21753 21754 21755 21756 21757 21758 21759 21760 21761 21762 21763 21764 21765 21766 21767 21768 21769 21770 21771 21772 21773 21774 21775 21776 21777 21778 21779 21780 21781 21782 21783 21784 21785 21786 21787 21788 21789 21790 21791 21792 21793 21794 21795 21796 21797 21798 21799 21800 21801 21802 21803 21804 21805 21806 21807 21808 21809 21810 21811 21812 21813 21814 21815 21816 21817 21818 21819 21820 21821 21822 21823 21824 21825 21826 21827 21828 21829 21830 21831 21832 21833 21834 21835 21836 21837 21838 21839 21840 21841 21842 21843 21844 21845 21846 21847 21848 21849 21850 21851 21852 21853 21854 21855 21856 21857 21858 21859 21860 21861 21862 21863 21864 21865 21866 21867 21868 21869 21870 21871 21872 21873 21874 21875 21876 21877 21878 21879 21880 21881 21882 21883 21884 21885 21886 21887 21888 21889 21890 21891 21892 21893 21894 21895 21896 21897 21898 21899 21900 21901 21902 21903 21904 21905 21906 21907 21908 21909 21910 21911 21912 21913 21914 21915 21916 21917 21918 21919 21920 21921 21922 21923 21924 21925 21926 21927 21928 21929 21930 21931 21932 21933 21934 21935 21936 21937 21938 21939 21940 21941 21942 21943 21944 21945 21946 21947 21948 21949 21950 21951 21952 21953 21954 21955 21956 21957 21958 21959 21960 21961 21962 21963 21964 21965 21966 21967 21968 21969 21970 21971 21972 21973 21974 21975 21976 21977 21978 21979 21980 21981 21982 21983 21984 21985 21986 21987 21988 21989 21990 21991 21992 21993 21994 21995 21996 21997 21998 21999 22000 22001 22002 22003 22004 22005 22006 22007 22008 22009 22010 22011 22012 22013 22014 22015 22016 22017 22018 22019 22020 22021 22022 22023 22024 22025 22026 22027 22028 22029 22030 22031 22032 22033 22034 22035 22036 22037 22038 22039 22040 22041 22042 22043 22044 22045 22046 22047 22048 22049 22050 22051 22052 22053 22054 22055 22056 22057 22058 22059 22060 22061 22062 22063 22064 22065 22066 22067 22068 22069 22070 22071 22072 22073 22074 22075 22076 22077 22078 22079 22080 22081 22082 22083 22084 22085 22086 22087 22088 22089 22090 22091 22092 22093 22094 22095 22096 22097 22098 22099 22100 22101 22102 22103 22104 22105 22106 22107 22108 22109 22110 22111 22112 22113 22114 22115 22116 22117 22118 22119 22120 22121 22122 22123 22124 22125 22126 22127 22128 22129 22130 22131 22132 22133 22134 22135 22136 22137 22138 22139 22140 22141 22142 22143 22144 22145 22146 22147 22148 22149 22150 22151 22152 22153 22154 22155 22156 22157 22158 22159 22160 22161 22162 22163 22164 22165 22166 22167 22168 22169 22170 22171 22172 22173 22174 22175 22176 22177 22178 22179 22180 22181 22182 22183 22184 22185 22186 22187 22188 22189 22190 22191 22192 22193 22194 22195 22196 22197 22198 22199 22200 22201 22202 22203 22204 22205 22206 22207 22208 22209 22210 22211 22212 22213 22214 22215 22216 22217 22218 22219 22220 22221 22222 22223 22224 22225 22226 22227 22228 22229 22230 22231 22232 22233 22234 22235 22236 22237 22238 22239 22240 22241 22242 22243 22244 22245 22246 22247 22248 22249 22250 22251 22252 22253 22254 22255 22256 22257 22258 22259 22260 22261 22262 22263 22264 22265 22266 22267 22268 22269 22270 22271 22272 22273 22274 22275 22276 22277 22278 22279 22280 22281 22282 22283 22284 22285 22286 22287 22288 22289 22290 22291 22292 22293 22294 22295 22296 22297 22298 22299 22300 22301 22302 22303 22304 22305 22306 22307 22308 22309 22310 22311 22312 22313 22314 22315 22316 22317 22318 22319 22320 22321 22322 22323 22324 22325 22326 22327 22328 22329 22330 22331 22332 22333 22334 22335 22336 22337 22338 22339 22340 22341 22342 22343 22344 22345 22346 22347 22348 22349 22350 22351 22352 22353 22354 22355 22356 22357 22358 22359 22360 22361 22362 22363 22364 22365 22366 22367 22368 22369 22370 22371 22372 22373 22374 22375 22376 22377 22378 22379 22380 22381 22382 22383 22384 22385 22386 22387 22388 22389 22390 22391 22392 22393 22394 22395 22396 22397 22398 22399 22400 22401 22402 22403 22404 22405 22406 22407 22408 22409 22410 22411 22412 22413 22414 22415 22416 22417 22418 22419 22420 22421 22422 22423 22424 22425 22426 22427 22428 22429 22430 22431 22432 22433 22434 22435 22436 22437 22438 22439 22440 22441 22442 22443 22444 22445 22446 22447 22448 22449 22450 22451 22452 22453 22454 22455 22456 22457 22458 22459 22460 22461 22462 22463 22464 22465 22466 22467 22468 22469 22470 22471 22472 22473 22474 22475 22476 22477 22478 22479 22480 22481 22482 22483 22484 22485 22486 22487 22488 22489 22490 22491 22492 22493 22494 22495 22496 22497 22498 22499 22500 22501 22502 22503 22504 22505 22506 22507 22508 22509 22510 22511 22512 22513 22514 22515 22516 22517 22518 22519 22520 22521 22522 22523 22524 22525 22526 22527 22528 22529 22530 22531 22532 22533 22534 22535 22536 22537 22538 22539 22540 22541 22542 22543 22544 22545 22546 22547 22548 22549 22550 22551 22552 22553 22554 22555 22556 22557 22558 22559 22560 22561 22562 22563 22564 22565 22566 22567 22568 22569 22570 22571 22572 22573 22574 22575 22576 22577 22578 22579 22580 22581 22582 22583 22584 22585 22586 22587 22588 22589 22590 22591 22592 22593 22594 22595 22596 22597 22598 22599 22600 22601 22602 22603 22604 22605 22606 22607 22608 22609 22610 22611 22612 22613 22614 22615 22616 22617 22618 22619 22620 22621 22622 22623 22624 22625 22626 22627 22628 22629 22630 22631 22632 22633 22634 22635 22636 22637 22638 22639 22640 22641 22642 22643 22644 22645 22646 22647 22648 22649 22650 22651 22652 22653 22654 22655 22656 22657 22658 22659 22660 22661 22662 22663 22664 22665 22666 22667 22668 22669 22670 22671 22672 22673 22674 22675 22676 22677 22678 22679 22680 22681 22682 22683 22684 22685 22686 22687 22688 22689 22690 22691 22692 22693 22694 22695 22696 22697 22698 22699 22700 22701 22702 22703 22704 22705 22706 22707 22708 22709 22710 22711 22712 22713 22714 22715 22716 22717 22718 22719 22720 22721 22722 22723 22724 22725 22726 22727 22728 22729 22730 22731 22732 22733 22734 22735 22736 22737 22738 22739 22740 22741 22742 22743 22744 22745 22746 22747 22748 22749 22750 22751 22752 22753 22754 22755 22756 22757 22758 22759 22760 22761 22762 22763 22764 22765 22766 22767 22768 22769 22770 22771 22772 22773 22774 22775 22776 22777 22778 22779 22780 22781 22782 22783 22784 22785 22786 22787 22788 22789 22790 22791 22792 22793 22794 22795 22796 22797 22798 22799 22800 22801 22802 22803 22804 22805 22806 22807 22808 22809 22810 22811 22812 22813 22814 22815 22816 22817 22818 22819 22820 22821 22822 22823 22824 22825 22826 22827 22828 22829 22830 22831 22832 22833 22834 22835 22836 22837 22838 22839 22840 22841 22842 22843 22844 22845 22846 22847 22848 22849 22850 22851 22852 22853 22854 22855 22856 22857 22858 22859 22860 22861 22862 22863 22864 22865 22866 22867 22868 22869 22870 22871 22872 22873 22874 22875 22876 22877 22878 22879 22880 22881 22882 22883 22884 22885 22886 22887 22888 22889 22890 22891 22892 22893 22894 22895 22896 22897 22898 22899 22900 22901 22902 22903 22904 22905 22906 22907 22908 22909 22910 22911 22912 22913 22914 22915 22916 22917 22918 22919 22920 22921 22922 22923 22924 22925 22926 22927 22928 22929 22930 22931 22932 22933 22934 22935 22936 22937 22938 22939 22940 22941 22942 22943 22944 22945 22946 22947 22948 22949 22950 22951 22952 22953 22954 22955 22956 22957 22958 22959 22960 22961 22962 22963 22964 22965 22966 22967 22968 22969 22970 22971 22972 22973 22974 22975 22976 22977 22978 22979 22980 22981 22982 22983 22984 22985 22986 22987 22988 22989 22990 22991 22992 22993 22994 22995 22996 22997 22998 22999 23000 23001 23002 23003 23004 23005 23006 23007 23008 23009 23010 23011 23012 23013 23014 23015 23016 23017 23018 23019 23020 23021 23022 23023 23024 23025 23026 23027 23028 23029 23030 23031 23032 23033 23034 23035 23036 23037 23038 23039 23040 23041 23042 23043 23044 23045 23046 23047 23048 23049 23050 23051 23052 23053 23054 23055 23056 23057 23058 23059 23060 23061 23062 23063 23064 23065 23066 23067 23068 23069 23070 23071 23072 23073 23074 23075 23076 23077 23078 23079 23080 23081 23082 23083 23084 23085 23086 23087 23088 23089 23090 23091 23092 23093 23094 23095 23096 23097 23098 23099 23100 23101 23102 23103 23104 23105 23106 23107 23108 23109 23110 23111 23112 23113 23114 23115 23116 23117 23118 23119 23120 23121 23122 23123 23124 23125 23126 23127 23128 23129 23130 23131 23132 23133 23134 23135 23136 23137 23138 23139 23140 23141 23142 23143 23144 23145 23146 23147 23148 23149 23150 23151 23152 23153 23154 23155 23156 23157 23158 23159 23160 23161 23162 23163 23164 23165 23166 23167 23168 23169 23170 23171 23172 23173 23174 23175 23176 23177 23178 23179 23180 23181 23182 23183 23184 23185 23186 23187 23188 23189 23190 23191 23192 23193 23194 23195 23196 23197 23198 23199 23200 23201 23202 23203 23204 23205 23206 23207 23208 23209 23210 23211 23212 23213 23214 23215 23216 23217 23218 23219 23220 23221 23222 23223 23224 23225 23226 23227 23228 23229 23230 23231 23232 23233 23234 23235 23236 23237 23238 23239 23240 23241 23242 23243 23244 23245 23246 23247 23248 23249 23250 23251 23252 23253 23254 23255 23256 23257 23258 23259 23260 23261 23262 23263 23264 23265 23266 23267 23268 23269 23270 23271 23272 23273 23274 23275 23276 23277 23278 23279 23280 23281 23282 23283 23284 23285 23286 23287 23288 23289 23290 23291 23292 23293 23294 23295 23296 23297 23298 23299 23300 23301 23302 23303 23304 23305 23306 23307 23308 23309 23310 23311 23312 23313 23314 23315 23316 23317 23318 23319 23320 23321 23322 23323 23324 23325 23326 23327 23328 23329 23330 23331 23332 23333 23334 23335 23336 23337 23338 23339 23340 23341 23342 23343 23344 23345 23346 23347 23348 23349 23350 23351 23352 23353 23354 23355 23356 23357 23358 23359 23360 23361 23362 23363 23364 23365 23366 23367 23368 23369 23370 23371 23372 23373 23374 23375 23376 23377 23378 23379 23380 23381 23382 23383 23384 23385 23386 23387 23388 23389 23390 23391 23392 23393 23394 23395 23396 23397 23398 23399 23400 23401 23402 23403 23404 23405 23406 23407 23408 23409 23410 23411 23412 23413 23414 23415 23416 23417 23418 23419 23420 23421 23422 23423 23424 23425 23426 23427 23428 23429 23430 23431 23432 23433 23434 23435 23436 23437 23438 23439 23440 23441 23442 23443 23444 23445 23446 23447 23448 23449 23450 23451 23452 23453 23454 23455 23456 23457 23458 23459 23460 23461 23462 23463 23464 23465 23466 23467 23468 23469 23470 23471 23472 23473 23474 23475 23476 23477 23478 23479 23480 23481 23482 23483 23484 23485 23486 23487 23488 23489 23490 23491 23492 23493 23494 23495 23496 23497 23498 23499 23500 23501 23502 23503 23504 23505 23506 23507 23508 23509 23510 23511 23512 23513 23514 23515 23516 23517 23518 23519 23520 23521 23522 23523 23524 23525 23526 23527 23528 23529 23530 23531 23532 23533 23534 23535 23536 23537 23538 23539 23540 23541 23542 23543 23544 23545 23546 23547 23548 23549 23550 23551 23552 23553 23554 23555 23556 23557 23558 23559 23560 23561 23562 23563 23564 23565 23566 23567 23568 23569 23570 23571 23572 23573 23574 23575 23576 23577 23578 23579 23580 23581 23582 23583 23584 23585 23586 23587 23588 23589 23590 23591 23592 23593 23594 23595 23596 23597 23598 23599 23600 23601 23602 23603 23604 23605 23606 23607 23608 23609 23610 23611 23612 23613 23614 23615 23616 23617 23618 23619 23620 23621 23622 23623 23624 23625 23626 23627 23628 23629 23630 23631 23632 23633 23634 23635 23636 23637 23638 23639 23640 23641 23642 23643 23644 23645 23646 23647 23648 23649 23650 23651 23652 23653 23654 23655 23656 23657 23658 23659 23660 23661 23662 23663 23664 23665 23666 23667 23668 23669 23670 23671 23672 23673 23674 23675 23676 23677 23678 23679 23680 23681 23682 23683 23684 23685 23686 23687 23688 23689 23690 23691 23692 23693 23694 23695 23696 23697 23698 23699 23700 23701 23702 23703 23704 23705 23706 23707 23708 23709 23710 23711 23712 23713 23714 23715 23716 23717 23718 23719 23720 23721 23722 23723 23724 23725 23726 23727 23728 23729 23730 23731 23732 23733 23734 23735 23736 23737 23738 23739 23740 23741 23742 23743 23744 23745 23746 23747 23748 23749 23750 23751 23752 23753 23754 23755 23756 23757 23758 23759 23760 23761 23762 23763 23764 23765 23766 23767 23768 23769 23770 23771 23772 23773 23774 23775 23776 23777 23778 23779 23780 23781 23782 23783 23784 23785 23786 23787 23788 23789 23790 23791 23792 23793 23794 23795 23796 23797 23798 23799 23800 23801 23802 23803 23804 23805 23806 23807 23808 23809 23810 23811 23812 23813 23814 23815 23816 23817 23818 23819 23820 23821 23822 23823 23824 23825 23826 23827 23828 23829 23830 23831 23832 23833 23834 23835 23836 23837 23838 23839 23840 23841 23842 23843 23844 23845 23846 23847 23848 23849 23850 23851 23852 23853 23854 23855 23856 23857 23858 23859 23860 23861 23862 23863 23864 23865 23866 23867 23868 23869 23870 23871 23872 23873 23874 23875 23876 23877 23878 23879 23880 23881 23882 23883 23884 23885 23886 23887 23888 23889 23890 23891 23892 23893 23894 23895 23896 23897 23898 23899 23900 23901 23902 23903 23904 23905 23906 23907 23908 23909 23910 23911 23912 23913 23914 23915 23916 23917 23918 23919 23920 23921 23922 23923 23924 23925 23926 23927 23928 23929 23930 23931 23932 23933 23934 23935 23936 23937 23938 23939 23940 23941 23942 23943 23944 23945 23946 23947 23948 23949 23950 23951 23952 23953 23954 23955 23956 23957 23958 23959 23960 23961 23962 23963 23964 23965 23966 23967 23968 23969 23970 23971 23972 23973 23974 23975 23976 23977 23978 23979 23980 23981 23982 23983 23984 23985 23986 23987 23988 23989 23990 23991 23992 23993 23994 23995 23996 23997 23998 23999 24000 24001 24002 24003 24004 24005 24006 24007 24008 24009 24010 24011 24012 24013 24014 24015 24016 24017 24018 24019 24020 24021 24022 24023 24024 24025 24026 24027 24028 24029 24030 24031 24032 24033 24034 24035 24036 24037 24038 24039 24040 24041 24042 24043 24044 24045 24046 24047 24048 24049 24050 24051 24052 24053 24054 24055 24056 24057 24058 24059 24060 24061 24062 24063 24064 24065 24066 24067 24068 24069 24070 24071 24072 24073 24074 24075 24076 24077 24078 24079 24080 24081 24082 24083 24084 24085 24086 24087 24088 24089 24090 24091 24092 24093 24094 24095 24096 24097 24098 24099 24100 24101 24102 24103 24104 24105 24106 24107 24108 24109 24110 24111 24112 24113 24114 24115 24116 24117 24118 24119 24120 24121 24122 24123 24124 24125 24126 24127 24128 24129 24130 24131 24132 24133 24134 24135 24136 24137 24138 24139 24140 24141 24142 24143 24144 24145 24146 24147 24148 24149 24150 24151 24152 24153 24154 24155 24156 24157 24158 24159 24160 24161 24162 24163 24164 24165 24166 24167 24168 24169 24170 24171 24172 24173 24174 24175 24176 24177 24178 24179 24180 24181 24182 24183 24184 24185 24186 24187 24188 24189 24190 24191 24192 24193 24194 24195 24196 24197 24198 24199 24200 24201 24202 24203 24204 24205 24206 24207 24208 24209 24210 24211 24212 24213 24214 24215 24216 24217 24218 24219 24220 24221 24222 24223 24224 24225 24226 24227 24228 24229 24230 24231 24232 24233 24234 24235 24236 24237 24238 24239 24240 24241 24242 24243 24244 24245 24246 24247 24248 24249 24250 24251 24252 24253 24254 24255 24256 24257 24258 24259 24260 24261 24262 24263 24264 24265 24266 24267 24268 24269 24270 24271 24272 24273 24274 24275 24276 24277 24278 24279 24280 24281 24282 24283 24284 24285 24286 24287 24288 24289 24290 24291 24292 24293 24294 24295 24296 24297 24298 24299 24300 24301 24302 24303 24304 24305 24306 24307 24308 24309 24310 24311 24312 24313 24314 24315 24316 24317 24318 24319 24320 24321 24322 24323 24324 24325 24326 24327 24328 24329 24330 24331 24332 24333 24334 24335 24336 24337 24338 24339 24340 24341 24342 24343 24344 24345 24346 24347 24348 24349 24350 24351 24352 24353 24354 24355 24356 24357 24358 24359 24360 24361 24362 24363 24364 24365 24366 24367 24368 24369 24370 24371 24372 24373 24374 24375 24376 24377 24378 24379 24380 24381 24382 24383 24384 24385 24386 24387 24388 24389 24390 24391 24392 24393 24394 24395 24396 24397 24398 24399 24400 24401 24402 24403 24404 24405 24406 24407 24408 24409 24410 24411 24412 24413 24414 24415 24416 24417 24418 24419 24420 24421 24422 24423 24424 24425 24426 24427 24428 24429 24430 24431 24432 24433 24434 24435 24436 24437 24438 24439 24440 24441 24442 24443 24444 24445 24446 24447 24448 24449 24450 24451 24452 24453 24454 24455 24456 24457 24458 24459 24460 24461 24462 24463 24464 24465 24466 24467 24468 24469 24470 24471 24472 24473 24474 24475 24476 24477 24478 24479 24480 24481 24482 24483 24484 24485 24486 24487 24488 24489 24490 24491 24492 24493 24494 24495 24496 24497 24498 24499 24500 24501 24502 24503 24504 24505 24506 24507 24508 24509 24510 24511 24512 24513 24514 24515 24516 24517 24518 24519 24520 24521 24522 24523 24524 24525 24526 24527 24528 24529 24530 24531 24532 24533 24534 24535 24536 24537 24538 24539 24540 24541 24542 24543 24544 24545 24546 24547 24548 24549 24550 24551 24552 24553 24554 24555 24556 24557 24558 24559 24560 24561 24562 24563 24564 24565 24566 24567 24568 24569 24570 24571 24572 24573 24574 24575 24576 24577 24578 24579 24580 24581 24582 24583 24584 24585 24586 24587 24588 24589 24590 24591 24592 24593 24594 24595 24596 24597 24598 24599 24600 24601 24602 24603 24604 24605 24606 24607 24608 24609 24610 24611 24612 24613 24614 24615 24616 24617 24618 24619 24620 24621 24622 24623 24624 24625 24626 24627 24628 24629 24630 24631 24632 24633 24634 24635 24636 24637 24638 24639 24640 24641 24642 24643 24644 24645 24646 24647 24648 24649 24650 24651 24652 24653 24654 24655 24656 24657 24658 24659 24660 24661 24662 24663 24664 24665 24666 24667 24668 24669 24670 24671 24672 24673 24674 24675 24676 24677 24678 24679 24680 24681 24682 24683 24684 24685 24686 24687 24688 24689 24690 24691 24692 24693 24694 24695 24696 24697 24698 24699 24700 24701 24702 24703 24704 24705 24706 24707 24708 24709 24710 24711 24712 24713 24714 24715 24716 24717 24718 24719 24720 24721 24722 24723 24724 24725 24726 24727 24728 24729 24730 24731 24732 24733 24734 24735 24736 24737 24738 24739 24740 24741 24742 24743 24744 24745 24746 24747 24748 24749 24750 24751 24752 24753 24754 24755 24756 24757 24758 24759 24760 24761 24762 24763 24764 24765 24766 24767 24768 24769 24770 24771 24772 24773 24774 24775 24776 24777 24778 24779 24780 24781 24782 24783 24784 24785 24786 24787 24788 24789 24790 24791 24792 24793 24794 24795 24796 24797 24798 24799 24800 24801 24802 24803 24804 24805 24806 24807 24808 24809 24810 24811 24812 24813 24814 24815 24816 24817 24818 24819 24820 24821 24822 24823 24824 24825 24826 24827 24828 24829 24830 24831 24832 24833 24834 24835 24836 24837 24838 24839 24840 24841 24842 24843 24844 24845 24846 24847 24848 24849 24850 24851 24852 24853 24854 24855 24856 24857 24858 24859 24860 24861 24862 24863 24864 24865 24866 24867 24868 24869 24870 24871 24872 24873 24874 24875 24876 24877 24878 24879 24880 24881 24882 24883 24884 24885 24886 24887 24888 24889 24890 24891 24892 24893 24894 24895 24896 24897 24898 24899 24900 24901 24902 24903 24904 24905 24906 24907 24908 24909 24910 24911 24912 24913 24914 24915 24916 24917 24918 24919 24920 24921 24922 24923 24924 24925 24926 24927 24928 24929 24930 24931 24932 24933 24934 24935 24936 24937 24938 24939 24940 24941 24942 24943 24944 24945 24946 24947 24948 24949 24950 24951 24952 24953 24954 24955 24956 24957 24958 24959 24960 24961 24962 24963 24964 24965 24966 24967 24968 24969 24970 24971 24972 24973 24974 24975 24976 24977 24978 24979 24980 24981 24982 24983 24984 24985 24986 24987 24988 24989 24990 24991 24992 24993 24994 24995 24996 24997 24998 24999 25000 25001 25002 25003 25004 25005 25006 25007 25008 25009 25010 25011 25012 25013 25014 25015 25016 25017 25018 25019 25020 25021 25022 25023 25024 25025 25026 25027 25028 25029 25030 25031 25032 25033 25034 25035 25036 25037 25038 25039 25040 25041 25042 25043 25044 25045 25046 25047 25048 25049 25050 25051 25052 25053 25054 25055 25056 25057 25058 25059 25060 25061 25062 25063 25064 25065 25066 25067 25068 25069 25070 25071 25072 25073 25074 25075 25076 25077 25078 25079 25080 25081 25082 25083 25084 25085 25086 25087 25088 25089 25090 25091 25092 25093 25094 25095 25096 25097 25098 25099 25100 25101 25102 25103 25104 25105 25106 25107 25108 25109 25110 25111 25112 25113 25114 25115 25116 25117 25118 25119 25120 25121 25122 25123 25124 25125 25126 25127 25128 25129 25130 25131 25132 25133 25134 25135 25136 25137 25138 25139 25140 25141 25142 25143 25144 25145 25146 25147 25148 25149 25150 25151 25152 25153 25154 25155 25156 25157 25158 25159 25160 25161 25162 25163 25164 25165 25166 25167 25168 25169 25170 25171 25172 25173 25174 25175 25176 25177 25178 25179 25180 25181 25182 25183 25184 25185 25186 25187 25188 25189 25190 25191 25192 25193 25194 25195 25196 25197 25198 25199 25200 25201 25202 25203 25204 25205 25206 25207 25208 25209 25210 25211 25212 25213 25214 25215 25216 25217 25218 25219 25220 25221 25222 25223 25224 25225 25226 25227 25228 25229 25230 25231 25232 25233 25234 25235 25236 25237 25238 25239 25240 25241 25242 25243 25244 25245 25246 25247 25248 25249 25250 25251 25252 25253 25254 25255 25256 25257 25258 25259 25260 25261 25262 25263 25264 25265 25266 25267 25268 25269 25270 25271 25272 25273 25274 25275 25276 25277 25278 25279 25280 25281 25282 25283 25284 25285 25286 25287 25288 25289 25290 25291 25292 25293 25294 25295 25296 25297 25298 25299 25300 25301 25302 25303 25304 25305 25306 25307 25308 25309 25310 25311 25312 25313 25314 25315 25316 25317 25318 25319 25320 25321 25322 25323 25324 25325 25326 25327 25328 25329 25330 25331 25332 25333 25334 25335 25336 25337 25338 25339 25340 25341 25342 25343 25344 25345 25346 25347 25348 25349 25350 25351 25352 25353 25354 25355 25356 25357 25358 25359 25360 25361 25362 25363 25364 25365 25366 25367 25368 25369 25370 25371 25372 25373 25374 25375 25376 25377 25378 25379 25380 25381 25382 25383 25384 25385 25386 25387 25388 25389 25390 25391 25392 25393 25394 25395 25396 25397 25398 25399 25400 25401 25402 25403 25404 25405 25406 25407 25408 25409 25410 25411 25412 25413 25414 25415 25416 25417 25418 25419 25420 25421 25422 25423 25424 25425 25426 25427 25428 25429 25430 25431 25432 25433 25434 25435 25436 25437 25438 25439 25440 25441 25442 25443 25444 25445 25446 25447 25448 25449 25450 25451 25452 25453 25454 25455 25456 25457 25458 25459 25460 25461 25462 25463 25464 25465 25466 25467 25468 25469 25470 25471 25472 25473 25474 25475 25476 25477 25478 25479 25480 25481 25482 25483 25484 25485 25486 25487 25488 25489 25490 25491 25492 25493 25494 25495 25496 25497 25498 25499 25500 25501 25502 25503 25504 25505 25506 25507 25508 25509 25510 25511 25512 25513 25514 25515 25516 25517 25518 25519 25520 25521 25522 25523 25524 25525 25526 25527 25528 25529 25530 25531 25532 25533 25534 25535 25536 25537 25538 25539 25540 25541 25542 25543 25544 25545 25546 25547 25548 25549 25550 25551 25552 25553 25554 25555 25556 25557 25558 25559 25560 25561 25562 25563 25564 25565 25566 25567 25568 25569 25570 25571 25572 25573 25574 25575 25576 25577 25578 25579 25580 25581 25582 25583 25584 25585 25586 25587 25588 25589 25590 25591 25592 25593 25594 25595 25596 25597 25598 25599 25600 25601 25602 25603 25604 25605 25606 25607 25608 25609 25610 25611 25612 25613 25614 25615 25616 25617 25618 25619 25620 25621 25622 25623 25624 25625 25626 25627 25628 25629 25630 25631 25632 25633 25634 25635 25636 25637 25638 25639 25640 25641 25642 25643 25644 25645 25646 25647 25648 25649 25650 25651 25652 25653 25654 25655 25656 25657 25658 25659 25660 25661 25662 25663 25664 25665 25666 25667 25668 25669 25670 25671 25672 25673 25674 25675 25676 25677 25678 25679 25680 25681 25682 25683 25684 25685 25686 25687 25688 25689 25690 25691 25692 25693 25694 25695 25696 25697 25698 25699 25700 25701 25702 25703 25704 25705 25706 25707 25708 25709 25710 25711 25712 25713 25714 25715 25716 25717 25718 25719 25720 25721 25722 25723 25724 25725 25726 25727 25728 25729 25730 25731 25732 25733 25734 25735 25736 25737 25738 25739 25740 25741 25742 25743 25744 25745 25746 25747 25748 25749 25750 25751 25752 25753 25754 25755 25756 25757 25758 25759 25760 25761 25762 25763 25764 25765 25766 25767 25768 25769 25770 25771 25772 25773 25774 25775 25776 25777 25778 25779 25780 25781 25782 25783 25784 25785 25786 25787 25788 25789 25790 25791 25792 25793 25794 25795 25796 25797 25798 25799 25800 25801 25802 25803 25804 25805 25806 25807 25808 25809 25810 25811 25812 25813 25814 25815 25816 25817 25818 25819 25820 25821 25822 25823 25824 25825 25826 25827 25828 25829 25830 25831 25832 25833 25834 25835 25836 25837 25838 25839 25840 25841 25842 25843 25844 25845 25846 25847 25848 25849 25850 25851 25852 25853 25854 25855 25856 25857 25858 25859 25860 25861 25862 25863 25864 25865 25866 25867 25868 25869 25870 25871 25872 25873 25874 25875 25876 25877 25878 25879 25880 25881 25882 25883 25884 25885 25886 25887 25888 25889 25890 25891 25892 25893 25894 25895 25896 25897 25898 25899 25900 25901 25902 25903 25904 25905 25906 25907 25908 25909 25910 25911 25912 25913 25914 25915 25916 25917 25918 25919 25920 25921 25922 25923 25924 25925 25926 25927 25928 25929 25930 25931 25932 25933 25934 25935 25936 25937 25938 25939 25940 25941 25942 25943 25944 25945 25946 25947 25948 25949 25950 25951 25952 25953 25954 25955 25956 25957 25958 25959 25960 25961 25962 25963 25964 25965 25966 25967 25968 25969 25970 25971 25972 25973 25974 25975 25976 25977 25978 25979 25980 25981 25982 25983 25984 25985 25986 25987 25988 25989 25990 25991 25992 25993 25994 25995 25996 25997 25998 25999 26000 26001 26002 26003 26004 26005 26006 26007 26008 26009 26010 26011 26012 26013 26014 26015 26016 26017 26018 26019 26020 26021 26022 26023 26024 26025 26026 26027 26028 26029 26030 26031 26032 26033 26034 26035 26036 26037 26038 26039 26040 26041 26042 26043 26044 26045 26046 26047 26048 26049 26050 26051 26052 26053 26054 26055 26056 26057 26058 26059 26060 26061 26062 26063 26064 26065 26066 26067 26068 26069 26070 26071 26072 26073 26074 26075 26076 26077 26078 26079 26080 26081 26082 26083 26084 26085 26086 26087 26088 26089 26090 26091 26092 26093 26094 26095 26096 26097 26098 26099 26100 26101 26102 26103 26104 26105 26106 26107 26108 26109 26110 26111 26112 26113 26114 26115 26116 26117 26118 26119 26120 26121 26122 26123 26124 26125 26126 26127 26128 26129 26130 26131 26132 26133 26134 26135 26136 26137 26138 26139 26140 26141 26142 26143 26144 26145 26146 26147 26148 26149 26150 26151 26152 26153 26154 26155 26156 26157 26158 26159 26160 26161 26162 26163 26164 26165 26166 26167 26168 26169 26170 26171 26172 26173 26174 26175 26176 26177 26178 26179 26180 26181 26182 26183 26184 26185 26186 26187 26188 26189 26190 26191 26192 26193 26194 26195 26196 26197 26198 26199 26200 26201 26202 26203 26204 26205 26206 26207 26208 26209 26210 26211 26212 26213 26214 26215 26216 26217 26218 26219 26220 26221 26222 26223 26224 26225 26226 26227 26228 26229 26230 26231 26232 26233 26234 26235 26236 26237 26238 26239 26240 26241 26242 26243 26244 26245 26246 26247 26248 26249 26250 26251 26252 26253 26254 26255 26256 26257 26258 26259 26260 26261 26262 26263 26264 26265 26266 26267 26268 26269 26270 26271 26272 26273 26274 26275 26276 26277 26278 26279 26280 26281 26282 26283 26284 26285 26286 26287 26288 26289 26290 26291 26292 26293 26294 26295 26296 26297 26298 26299 26300 26301 26302 26303 26304 26305 26306 26307 26308 26309 26310 26311 26312 26313 26314 26315 26316 26317 26318 26319 26320 26321 26322 26323 26324 26325 26326 26327 26328 26329 26330 26331 26332 26333 26334 26335 26336 26337 26338 26339 26340 26341 26342 26343 26344 26345 26346 26347 26348 26349 26350 26351 26352 26353 26354 26355 26356 26357 26358 26359 26360 26361 26362 26363 26364 26365 26366 26367 26368 26369 26370 26371 26372 26373 26374 26375 26376 26377 26378 26379 26380 26381 26382 26383 26384 26385 26386 26387 26388 26389 26390 26391 26392 26393 26394 26395 26396 26397 26398 26399 26400 26401 26402 26403 26404 26405 26406 26407 26408 26409 26410 26411 26412 26413 26414 26415 26416 26417 26418 26419 26420 26421 26422 26423 26424 26425 26426 26427 26428 26429 26430 26431 26432 26433 26434 26435 26436 26437 26438 26439 26440 26441 26442 26443 26444 26445 26446 26447 26448 26449 26450 26451 26452 26453 26454 26455 26456 26457 26458 26459 26460 26461 26462 26463 26464 26465 26466 26467 26468 26469 26470 26471 26472 26473 26474 26475 26476 26477 26478 26479 26480 26481 26482 26483 26484 26485 26486 26487 26488 26489 26490 26491 26492 26493 26494 26495 26496 26497 26498 26499 26500 26501 26502 26503 26504 26505 26506 26507 26508 26509 26510 26511 26512 26513 26514 26515 26516 26517 26518 26519 26520 26521 26522 26523 26524 26525 26526 26527 26528 26529 26530 26531 26532 26533 26534 26535 26536 26537 26538 26539 26540 26541 26542 26543 26544 26545 26546 26547 26548 26549 26550 26551 26552 26553 26554 26555 26556 26557 26558 26559 26560 26561 26562 26563 26564 26565 26566 26567 26568 26569 26570 26571 26572 26573 26574 26575 26576 26577 26578 26579 26580 26581 26582 26583 26584 26585 26586 26587 26588 26589 26590 26591 26592 26593 26594 26595 26596 26597 26598 26599 26600 26601 26602 26603 26604 26605 26606 26607 26608 26609 26610 26611 26612 26613 26614 26615 26616 26617 26618 26619 26620 26621 26622 26623 26624 26625 26626 26627 26628 26629 26630 26631 26632 26633 26634 26635 26636 26637 26638 26639 26640 26641 26642 26643 26644 26645 26646 26647 26648 26649 26650 26651 26652 26653 26654 26655 26656 26657 26658 26659 26660 26661 26662 26663 26664 26665 26666 26667 26668 26669 26670 26671 26672 26673 26674 26675 26676 26677 26678 26679 26680 26681 26682 26683 26684 26685 26686 26687 26688 26689 26690 26691 26692 26693 26694 26695 26696 26697 26698 26699 26700 26701 26702 26703 26704 26705 26706 26707 26708 26709 26710 26711 26712 26713 26714 26715 26716 26717 26718 26719 26720 26721 26722 26723 26724 26725 26726 26727 26728 26729 26730 26731 26732 26733 26734 26735 26736 26737 26738 26739 26740 26741 26742 26743 26744 26745 26746 26747 26748 26749 26750 26751 26752 26753 26754 26755 26756 26757 26758 26759 26760 26761 26762 26763 26764 26765 26766 26767 26768 26769 26770 26771 26772 26773 26774 26775 26776 26777 26778 26779 26780 26781 26782 26783 26784 26785 26786 26787 26788 26789 26790 26791 26792 26793 26794 26795 26796 26797 26798 26799 26800 26801 26802 26803 26804 26805 26806 26807 26808 26809 26810 26811 26812 26813 26814 26815 26816 26817 26818 26819 26820 26821 26822 26823 26824 26825 26826 26827 26828 26829 26830 26831 26832 26833 26834 26835 26836 26837 26838 26839 26840 26841 26842 26843 26844 26845 26846 26847 26848 26849 26850 26851 26852 26853 26854 26855 26856 26857 26858 26859 26860 26861 26862 26863 26864 26865 26866 26867 26868 26869 26870 26871 26872 26873 26874 26875 26876 26877 26878 26879 26880 26881 26882 26883 26884 26885 26886 26887 26888 26889 26890 26891 26892 26893 26894 26895 26896 26897 26898 26899 26900 26901 26902 26903 26904 26905 26906 26907 26908 26909 26910 26911 26912 26913 26914 26915 26916 26917 26918 26919 26920 26921 26922 26923 26924 26925 26926 26927 26928 26929 26930 26931 26932 26933 26934 26935 26936 26937 26938 26939 26940 26941 26942 26943 26944 26945 26946 26947 26948 26949 26950 26951 26952 26953 26954 26955 26956 26957 26958 26959 26960 26961 26962 26963 26964 26965 26966 26967 26968 26969 26970 26971 26972 26973 26974 26975 26976 26977 26978 26979 26980 26981 26982 26983 26984 26985 26986 26987 26988 26989 26990 26991 26992 26993 26994 26995 26996 26997 26998 26999 27000 27001 27002 27003 27004 27005 27006 27007 27008 27009 27010 27011 27012 27013 27014 27015 27016 27017 27018 27019 27020 27021 27022 27023 27024 27025 27026 27027 27028 27029 27030 27031 27032 27033 27034 27035 27036 27037 27038 27039 27040 27041 27042 27043 27044 27045 27046 27047 27048 27049 27050 27051 27052 27053 27054 27055 27056 27057 27058 27059 27060 27061 27062 27063 27064 27065 27066 27067 27068 27069 27070 27071 27072 27073 27074 27075 27076 27077 27078 27079 27080 27081 27082 27083 27084 27085 27086 27087 27088 27089 27090 27091 27092 27093 27094 27095 27096 27097 27098 27099 27100 27101 27102 27103 27104 27105 27106 27107 27108 27109 27110 27111 27112 27113 27114 27115 27116 27117 27118 27119 27120 27121 27122 27123 27124 27125 27126 27127 27128 27129 27130 27131 27132 27133 27134 27135 27136 27137 27138 27139 27140 27141 27142 27143 27144 27145 27146 27147 27148 27149 27150 27151 27152 27153 27154 27155 27156 27157 27158 27159 27160 27161 27162 27163 27164 27165 27166 27167 27168 27169 27170 27171 27172 27173 27174 27175 27176 27177 27178 27179 27180 27181 27182 27183 27184 27185 27186 27187 27188 27189 27190 27191 27192 27193 27194 27195 27196 27197 27198 27199 27200 27201 27202 27203 27204 27205 27206 27207 27208 27209 27210 27211 27212 27213 27214 27215 27216 27217 27218 27219 27220 27221 27222 27223 27224 27225 27226 27227 27228 27229 27230 27231 27232 27233 27234 27235 27236 27237 27238 27239 27240 27241 27242 27243 27244 27245 27246 27247 27248 27249 27250 27251 27252 27253 27254 27255 27256 27257 27258 27259 27260 27261 27262 27263 27264 27265 27266 27267 27268 27269 27270 27271 27272 27273 27274 27275 27276 27277 27278 27279 27280 27281 27282 27283 27284 27285 27286 27287 27288 27289 27290 27291 27292 27293 27294 27295 27296 27297 27298 27299 27300 27301 27302 27303 27304 27305 27306 27307 27308 27309 27310 27311 27312 27313 27314 27315 27316 27317 27318 27319 27320 27321 27322 27323 27324 27325 27326 27327 27328 27329 27330 27331 27332 27333 27334 27335 27336 27337 27338 27339 27340 27341 27342 27343 27344 27345 27346 27347 27348 27349 27350 27351 27352 27353 27354 27355 27356 27357 27358 27359 27360 27361 27362 27363 27364 27365 27366 27367 27368 27369 27370 27371 27372 27373 27374 27375 27376 27377 27378 27379 27380 27381 27382 27383 27384 27385 27386 27387 27388 27389 27390 27391 27392 27393 27394 27395 27396 27397 27398 27399 27400 27401 27402 27403 27404 27405 27406 27407 27408 27409 27410 27411 27412 27413 27414 27415 27416 27417 27418 27419 27420 27421 27422 27423 27424 27425 27426 27427 27428 27429 27430 27431 27432 27433 27434 27435 27436 27437 27438 27439 27440 27441 27442 27443 27444 27445 27446 27447 27448 27449 27450 27451 27452 27453 27454 27455 27456 27457 27458 27459 27460 27461 27462 27463 27464 27465 27466 27467 27468 27469 27470 27471 27472 27473 27474 27475 27476 27477 27478 27479 27480 27481 27482 27483 27484 27485 27486 27487 27488 27489 27490 27491 27492 27493 27494 27495 27496 27497 27498 27499 27500 27501 27502 27503 27504 27505 27506 27507 27508 27509 27510 27511 27512 27513 27514 27515 27516 27517 27518 27519 27520 27521 27522 27523 27524 27525 27526 27527 27528 27529 27530 27531 27532 27533 27534 27535 27536 27537 27538 27539 27540 27541 27542 27543 27544 27545 27546 27547 27548 27549 27550 27551 27552 27553 27554 27555 27556 27557 27558 27559 27560 27561 27562 27563 27564 27565 27566 27567 27568 27569 27570 27571 27572 27573 27574 27575 27576 27577 27578 27579 27580 27581 27582 27583 27584 27585 27586 27587 27588 27589 27590 27591 27592 27593 27594 27595 27596 27597 27598 27599 27600 27601 27602 27603 27604 27605 27606 27607 27608 27609 27610 27611 27612 27613 27614 27615 27616 27617 27618 27619 27620 27621 27622 27623 27624 27625 27626 27627 27628 27629 27630 27631 27632 27633 27634 27635 27636 27637 27638 27639 27640 27641 27642 27643 27644 27645 27646 27647 27648 27649 27650 27651 27652 27653 27654 27655 27656 27657 27658 27659 27660 27661 27662 27663 27664 27665 27666 27667 27668 27669 27670 27671 27672 27673 27674 27675 27676 27677 27678 27679 27680 27681 27682 27683 27684 27685 27686 27687 27688 27689 27690 27691 27692 27693 27694 27695 27696 27697 27698 27699 27700 27701 27702 27703 27704 27705 27706 27707 27708 27709 27710 27711 27712 27713 27714 27715 27716 27717 27718 27719 27720 27721 27722 27723 27724 27725 27726 27727 27728 27729 27730 27731 27732 27733 27734 27735 27736 27737 27738 27739 27740 27741 27742 27743 27744 27745 27746 27747 27748 27749 27750 27751 27752 27753 27754 27755 27756 27757 27758 27759 27760 27761 27762 27763 27764 27765 27766 27767 27768 27769 27770 27771 27772 27773 27774 27775 27776 27777 27778 27779 27780 27781 27782 27783 27784 27785 27786 27787 27788 27789 27790 27791 27792 27793 27794 27795 27796 27797 27798 27799 27800 27801 27802 27803 27804 27805 27806 27807 27808 27809 27810 27811 27812 27813 27814 27815 27816 27817 27818 27819 27820 27821 27822 27823 27824 27825 27826 27827 27828 27829 27830 27831 27832 27833 27834 27835 27836 27837 27838 27839 27840 27841 27842 27843 27844 27845 27846 27847 27848 27849 27850 27851 27852 27853 27854 27855 27856 27857 27858 27859 27860 27861 27862 27863 27864 27865 27866 27867 27868 27869 27870 27871 27872 27873 27874 27875 27876 27877 27878 27879 27880 27881 27882 27883 27884 27885 27886 27887 27888 27889 27890 27891 27892 27893 27894 27895 27896 27897 27898 27899 27900 27901 27902 27903 27904 27905 27906 27907 27908 27909 27910 27911 27912 27913 27914 27915 27916 27917 27918 27919 27920 27921 27922 27923 27924 27925 27926 27927 27928 27929 27930 27931 27932 27933 27934 27935 27936 27937 27938 27939 27940 27941 27942 27943 27944 27945 27946 27947 27948 27949 27950 27951 27952 27953 27954 27955 27956 27957 27958 27959 27960 27961 27962 27963 27964 27965 27966 27967 27968 27969 27970 27971 27972 27973 27974 27975 27976 27977 27978 27979 27980 27981 27982 27983 27984 27985 27986 27987 27988 27989 27990 27991 27992 27993 27994 27995 27996 27997 27998 27999 28000 28001 28002 28003 28004 28005 28006 28007 28008 28009 28010 28011 28012 28013 28014 28015 28016 28017 28018 28019 28020 28021 28022 28023 28024 28025 28026 28027 28028 28029 28030 28031 28032 28033 28034 28035 28036 28037 28038 28039 28040 28041 28042 28043 28044 28045 28046 28047 28048 28049 28050 28051 28052 28053 28054 28055 28056 28057 28058 28059 28060 28061 28062 28063 28064 28065 28066 28067 28068 28069 28070 28071 28072 28073 28074 28075 28076 28077 28078 28079 28080 28081 28082 28083 28084 28085 28086 28087 28088 28089 28090 28091 28092 28093 28094 28095 28096 28097 28098 28099 28100 28101 28102 28103 28104 28105 28106 28107 28108 28109 28110 28111 28112 28113 28114 28115 28116 28117 28118 28119 28120 28121 28122 28123 28124 28125 28126 28127 28128 28129 28130 28131 28132 28133 28134 28135 28136 28137 28138 28139 28140 28141 28142 28143 28144 28145 28146 28147 28148 28149 28150 28151 28152 28153 28154 28155 28156 28157 28158 28159 28160 28161 28162 28163 28164 28165 28166 28167 28168 28169 28170 28171 28172 28173 28174 28175 28176 28177 28178 28179 28180 28181 28182 28183 28184 28185 28186 28187 28188 28189 28190 28191 28192 28193 28194 28195 28196 28197 28198 28199 28200 28201 28202 28203 28204 28205 28206 28207 28208 28209 28210 28211 28212 28213 28214 28215 28216 28217 28218 28219 28220 28221 28222 28223 28224 28225 28226 28227 28228 28229 28230 28231 28232 28233 28234 28235 28236 28237 28238 28239 28240 28241 28242 28243 28244 28245 28246 28247 28248 28249 28250 28251 28252 28253 28254 28255 28256 28257 28258 28259 28260 28261 28262 28263 28264 28265 28266 28267 28268 28269 28270 28271 28272 28273 28274 28275 28276 28277 28278 28279 28280 28281 28282 28283 28284 28285 28286 28287 28288 28289 28290 28291 28292 28293 28294 28295 28296 28297 28298 28299 28300 28301 28302 28303 28304 28305 28306 28307 28308 28309 28310 28311 28312 28313 28314 28315 28316 28317 28318 28319 28320 28321 28322 28323 28324 28325 28326 28327 28328 28329 28330 28331 28332 28333 28334 28335 28336 28337 28338 28339 28340 28341 28342 28343 28344 28345 28346 28347 28348 28349 28350 28351 28352 28353 28354 28355 28356 28357 28358 28359 28360 28361 28362 28363 28364 28365 28366 28367 28368 28369 28370 28371 28372 28373 28374 28375 28376 28377 28378 28379 28380 28381 28382 28383 28384 28385 28386 28387 28388 28389 28390 28391 28392 28393 28394 28395 28396 28397 28398 28399 28400 28401 28402 28403 28404 28405 28406 28407 28408 28409 28410 28411 28412 28413 28414 28415 28416 28417 28418 28419 28420 28421 28422 28423 28424 28425 28426 28427 28428 28429 28430 28431 28432 28433 28434 28435 28436 28437 28438 28439 28440 28441 28442 28443 28444 28445 28446 28447 28448 28449 28450 28451 28452 28453 28454 28455 28456 28457 28458 28459 28460 28461 28462 28463 28464 28465 28466 28467 28468 28469 28470 28471 28472 28473 28474 28475 28476 28477 28478 28479 28480 28481 28482 28483 28484 28485 28486 28487 28488 28489 28490 28491 28492 28493 28494 28495 28496 28497 28498 28499 28500 28501 28502 28503 28504 28505 28506 28507 28508 28509 28510 28511 28512 28513 28514 28515 28516 28517 28518 28519 28520 28521 28522 28523 28524 28525 28526 28527 28528 28529 28530 28531 28532 28533 28534 28535 28536 28537 28538 28539 28540 28541 28542 28543 28544 28545 28546 28547 28548 28549 28550 28551 28552 28553 28554 28555 28556 28557 28558 28559 28560 28561 28562 28563 28564 28565 28566 28567 28568 28569 28570 28571 28572 28573 28574 28575 28576 28577 28578 28579 28580 28581 28582 28583 28584 28585 28586 28587 28588 28589 28590 28591 28592 28593 28594 28595 28596 28597 28598 28599 28600 28601 28602 28603 28604 28605 28606 28607 28608 28609 28610 28611 28612 28613 28614 28615 28616 28617 28618 28619 28620 28621 28622 28623 28624 28625 28626 28627 28628 28629 28630 28631 28632 28633 28634 28635 28636 28637 28638 28639 28640 28641 28642 28643 28644 28645 28646 28647 28648 28649 28650 28651 28652 28653 28654 28655 28656 28657 28658 28659 28660 28661 28662 28663 28664 28665 28666 28667 28668 28669 28670 28671 28672 28673 28674 28675 28676 28677 28678 28679 28680 28681 28682 28683 28684 28685 28686 28687 28688 28689 28690 28691 28692 28693 28694 28695 28696 28697 28698 28699 28700 28701 28702 28703 28704 28705 28706 28707 28708 28709 28710 28711 28712 28713 28714 28715 28716 28717 28718 28719 28720 28721 28722 28723 28724 28725 28726 28727 28728 28729 28730 28731 28732 28733 28734 28735 28736 28737 28738 28739 28740 28741 28742 28743 28744 28745 28746 28747 28748 28749 28750 28751 28752 28753 28754 28755 28756 28757 28758 28759 28760 28761 28762 28763 28764 28765 28766 28767 28768 28769 28770 28771 28772 28773 28774 28775 28776 28777 28778 28779 28780 28781 28782 28783 28784 28785 28786 28787 28788 28789 28790 28791 28792 28793 28794 28795 28796 28797 28798 28799 28800 28801 28802 28803 28804 28805 28806 28807 28808 28809 28810 28811 28812 28813 28814 28815 28816 28817 28818 28819 28820 28821 28822 28823 28824 28825 28826 28827 28828 28829 28830 28831 28832 28833 28834 28835 28836 28837 28838 28839 28840 28841 28842 28843 28844 28845 28846 28847 28848 28849 28850 28851 28852 28853 28854 28855 28856 28857 28858 28859 28860 28861 28862 28863 28864 28865 28866 28867 28868 28869 28870 28871 28872 28873 28874 28875 28876 28877 28878 28879 28880 28881 28882 28883 28884 28885 28886 28887 28888 28889 28890 28891 28892 28893 28894 28895 28896 28897 28898 28899 28900 28901 28902 28903 28904 28905 28906 28907 28908 28909 28910 28911 28912 28913 28914 28915 28916 28917 28918 28919 28920 28921 28922 28923 28924 28925 28926 28927 28928 28929 28930 28931 28932 28933 28934 28935 28936 28937 28938 28939 28940 28941 28942 28943 28944 28945 28946 28947 28948 28949 28950 28951 28952 28953 28954 28955 28956 28957 28958 28959 28960 28961 28962 28963 28964 28965 28966 28967 28968 28969 28970 28971 28972 28973 28974 28975 28976 28977 28978 28979 28980 28981 28982 28983 28984 28985 28986 28987 28988 28989 28990 28991 28992 28993 28994 28995 28996 28997 28998 28999 29000 29001 29002 29003 29004 29005 29006 29007 29008 29009 29010 29011 29012 29013 29014 29015 29016 29017 29018 29019 29020 29021 29022 29023 29024 29025 29026 29027 29028 29029 29030 29031 29032 29033 29034 29035 29036 29037 29038 29039 29040 29041 29042 29043 29044 29045 29046 29047 29048 29049 29050 29051 29052 29053 29054 29055 29056 29057 29058 29059 29060 29061 29062 29063 29064 29065 29066 29067 29068 29069 29070 29071 29072 29073 29074 29075 29076 29077 29078 29079 29080 29081 29082 29083 29084 29085 29086 29087 29088 29089 29090 29091 29092 29093 29094 29095 29096 29097 29098 29099 29100 29101 29102 29103 29104 29105 29106 29107 29108 29109 29110 29111 29112 29113 29114 29115 29116 29117 29118 29119 29120 29121 29122 29123 29124 29125 29126 29127 29128 29129 29130 29131 29132 29133 29134 29135 29136 29137 29138 29139 29140 29141 29142 29143 29144 29145 29146 29147 29148 29149 29150 29151 29152 29153 29154 29155 29156 29157 29158 29159 29160 29161 29162 29163 29164 29165 29166 29167 29168 29169 29170 29171 29172 29173 29174 29175 29176 29177 29178 29179 29180 29181 29182 29183 29184 29185 29186 29187 29188 29189 29190 29191 29192 29193 29194 29195 29196 29197 29198 29199 29200 29201 29202 29203 29204 29205 29206 29207 29208 29209 29210 29211 29212 29213 29214 29215 29216 29217 29218 29219 29220 29221 29222 29223 29224 29225 29226 29227 29228 29229 29230 29231 29232 29233 29234 29235 29236 29237 29238 29239 29240 29241 29242 29243 29244 29245 29246 29247 29248 29249 29250 29251 29252 29253 29254 29255 29256 29257 29258 29259 29260 29261 29262 29263 29264 29265 29266 29267 29268 29269 29270 29271 29272 29273 29274 29275 29276 29277 29278 29279 29280 29281 29282 29283 29284 29285 29286 29287 29288 29289 29290 29291 29292 29293 29294 29295 29296 29297 29298 29299 29300 29301 29302 29303 29304 29305 29306 29307 29308 29309 29310 29311 29312 29313 29314 29315 29316 29317 29318 29319 29320 29321 29322 29323 29324 29325 29326 29327 29328 29329 29330 29331 29332 29333 29334 29335 29336 29337 29338 29339 29340 29341 29342 29343 29344 29345 29346 29347 29348 29349 29350 29351 29352 29353 29354 29355 29356 29357 29358 29359 29360 29361 29362 29363 29364 29365 29366 29367 29368 29369 29370 29371 29372 29373 29374 29375 29376 29377 29378 29379 29380 29381 29382 29383 29384 29385 29386 29387 29388 29389 29390 29391 29392 29393 29394 29395 29396 29397 29398 29399 29400 29401 29402 29403 29404 29405 29406 29407 29408 29409 29410 29411 29412 29413 29414 29415 29416 29417 29418 29419 29420 29421 29422 29423 29424 29425 29426 29427 29428 29429 29430 29431 29432 29433 29434 29435 29436 29437 29438 29439 29440 29441 29442 29443 29444 29445 29446 29447 29448 29449 29450 29451 29452 29453 29454 29455 29456 29457 29458 29459 29460 29461 29462 29463 29464 29465 29466 29467 29468 29469 29470 29471 29472 29473 29474 29475 29476 29477 29478 29479 29480 29481 29482 29483 29484 29485 29486 29487 29488 29489 29490 29491 29492 29493 29494 29495 29496 29497 29498 29499 29500 29501 29502 29503 29504 29505 29506 29507 29508 29509 29510 29511 29512 29513 29514 29515 29516 29517 29518 29519 29520 29521 29522 29523 29524 29525 29526 29527 29528 29529 29530 29531 29532 29533 29534 29535 29536 29537 29538 29539 29540 29541 29542 29543 29544 29545 29546 29547 29548 29549 29550 29551 29552 29553 29554 29555 29556 29557 29558 29559 29560 29561 29562 29563 29564 29565 29566 29567 29568 29569 29570 29571 29572 29573 29574 29575 29576 29577 29578 29579 29580 29581 29582 29583 29584 29585 29586 29587 29588 29589 29590 29591 29592 29593 29594 29595 29596 29597 29598 29599 29600 29601 29602 29603 29604 29605 29606 29607 29608 29609 29610 29611 29612 29613 29614 29615 29616 29617 29618 29619 29620 29621 29622 29623 29624 29625 29626 29627 29628 29629 29630 29631 29632 29633 29634 29635 29636 29637 29638 29639 29640 29641 29642 29643 29644 29645 29646 29647 29648 29649 29650 29651 29652 29653 29654 29655 29656 29657 29658 29659 29660 29661 29662 29663 29664 29665 29666 29667 29668 29669 29670 29671 29672 29673 29674 29675 29676 29677 29678 29679 29680 29681 29682 29683 29684 29685 29686 29687 29688 29689 29690 29691 29692 29693 29694 29695 29696 29697 29698 29699 29700 29701 29702 29703 29704 29705 29706 29707 29708 29709 29710 29711 29712 29713 29714 29715 29716 29717 29718 29719 29720 29721 29722 29723 29724 29725 29726 29727 29728 29729 29730 29731 29732 29733 29734 29735 29736 29737 29738 29739 29740 29741 29742 29743 29744 29745 29746 29747 29748 29749 29750 29751 29752 29753 29754 29755 29756 29757 29758 29759 29760 29761 29762 29763 29764 29765 29766 29767 29768 29769 29770 29771 29772 29773 29774 29775 29776 29777 29778 29779 29780 29781 29782 29783 29784 29785 29786 29787 29788 29789 29790 29791 29792 29793 29794 29795 29796 29797 29798 29799 29800 29801 29802 29803 29804 29805 29806 29807 29808 29809 29810 29811 29812 29813 29814 29815 29816 29817 29818 29819 29820 29821 29822 29823 29824 29825 29826 29827 29828 29829 29830 29831 29832 29833 29834 29835 29836 29837 29838 29839 29840 29841 29842 29843 29844 29845 29846 29847 29848 29849 29850 29851 29852 29853 29854 29855 29856 29857 29858 29859 29860 29861 29862 29863 29864 29865 29866 29867 29868 29869 29870 29871 29872 29873 29874 29875 29876 29877 29878 29879 29880 29881 29882 29883 29884 29885 29886 29887 29888 29889 29890 29891 29892 29893 29894 29895 29896 29897 29898 29899 29900 29901 29902 29903 29904 29905 29906 29907 29908 29909 29910 29911 29912 29913 29914 29915 29916 29917 29918 29919 29920 29921 29922 29923 29924 29925 29926 29927 29928 29929 29930 29931 29932 29933 29934 29935 29936 29937 29938 29939 29940 29941 29942 29943 29944 29945 29946 29947 29948 29949 29950 29951 29952 29953 29954 29955 29956 29957 29958 29959 29960 29961 29962 29963 29964 29965 29966 29967 29968 29969 29970 29971 29972 29973 29974 29975 29976 29977 29978 29979 29980 29981 29982 29983 29984 29985 29986 29987 29988 29989 29990 29991 29992 29993 29994 29995 29996 29997 29998 29999 30000 30001 30002 30003 30004 30005 30006 30007 30008 30009 30010 30011 30012 30013 30014 30015 30016 30017 30018 30019 30020 30021 30022 30023 30024 30025 30026 30027 30028 30029 30030 30031 30032 30033 30034 30035 30036 30037 30038 30039 30040 30041 30042 30043 30044 30045 30046 30047 30048 30049 30050 30051 30052 30053 30054 30055 30056 30057 30058 30059 30060 30061 30062 30063 30064 30065 30066 30067 30068 30069 30070 30071 30072 30073 30074 30075 30076 30077 30078 30079 30080 30081 30082 30083 30084 30085 30086 30087 30088 30089 30090 30091 30092 30093 30094 30095 30096 30097 30098 30099 30100 30101 30102 30103 30104 30105 30106 30107 30108 30109 30110 30111 30112 30113 30114 30115 30116 30117 30118 30119 30120 30121 30122 30123 30124 30125 30126 30127 30128 30129 30130 30131 30132 30133 30134 30135 30136 30137 30138 30139 30140 30141 30142 30143 30144 30145 30146 30147 30148 30149 30150 30151 30152 30153 30154 30155 30156 30157 30158 30159 30160 30161 30162 30163 30164 30165 30166 30167 30168 30169 30170 30171 30172 30173 30174 30175 30176 30177 30178 30179 30180 30181 30182 30183 30184 30185 30186 30187 30188 30189 30190 30191 30192 30193 30194 30195 30196 30197 30198 30199 30200 30201 30202 30203 30204 30205 30206 30207 30208 30209 30210 30211 30212 30213 30214 30215 30216 30217 30218 30219 30220 30221 30222 30223 30224 30225 30226 30227 30228 30229 30230 30231 30232 30233 30234 30235 30236 30237 30238 30239 30240 30241 30242 30243 30244 30245 30246 30247 30248 30249 30250 30251 30252 30253 30254 30255 30256 30257 30258 30259 30260 30261 30262 30263 30264 30265 30266 30267 30268 30269 30270 30271 30272 30273 30274 30275 30276 30277 30278 30279 30280 30281 30282 30283 30284 30285 30286 30287 30288 30289 30290 30291 30292 30293 30294 30295 30296 30297 30298 30299 30300 30301 30302 30303 30304 30305 30306 30307 30308 30309 30310 30311 30312 30313 30314 30315 30316 30317 30318 30319 30320 30321 30322 30323 30324 30325 30326 30327 30328 30329 30330 30331 30332 30333 30334 30335 30336 30337 30338 30339 30340 30341 30342 30343 30344 30345 30346 30347 30348 30349 30350 30351 30352 30353 30354 30355 30356 30357 30358 30359 30360 30361 30362 30363 30364 30365 30366 30367 30368 30369 30370 30371 30372 30373 30374 30375 30376 30377 30378 30379 30380 30381 30382 30383 30384 30385 30386 30387 30388 30389 30390 30391 30392 30393 30394 30395 30396 30397 30398 30399 30400 30401 30402 30403 30404 30405 30406 30407 30408 30409 30410 30411 30412 30413 30414 30415 30416 30417 30418 30419 30420 30421 30422 30423 30424 30425 30426 30427 30428 30429 30430 30431 30432 30433 30434 30435 30436 30437 30438 30439 30440 30441 30442 30443 30444 30445 30446 30447 30448 30449 30450 30451 30452 30453 30454 30455 30456 30457 30458 30459 30460 30461 30462 30463 30464 30465 30466 30467 30468 30469 30470 30471 30472 30473 30474 30475 30476 30477 30478 30479 30480 30481 30482 30483 30484 30485 30486 30487 30488 30489 30490 30491 30492 30493 30494 30495 30496 30497 30498 30499 30500 30501 30502 30503 30504 30505 30506 30507 30508 30509 30510 30511 30512 30513 30514 30515 30516 30517 30518 30519 30520 30521 30522 30523 30524 30525 30526 30527 30528 30529 30530 30531 30532 30533 30534 30535 30536 30537 30538 30539 30540 30541 30542 30543 30544 30545 30546 30547 30548 30549 30550 30551 30552 30553 30554 30555 30556 30557 30558 30559 30560 30561 30562 30563 30564 30565 30566 30567 30568 30569 30570 30571 30572 30573 30574 30575 30576 30577 30578 30579 30580 30581 30582 30583 30584 30585 30586 30587 30588 30589 30590 30591 30592 30593 30594 30595 30596 30597 30598 30599 30600 30601 30602 30603 30604 30605 30606 30607 30608 30609 30610 30611 30612 30613 30614 30615 30616 30617 30618 30619 30620 30621 30622 30623 30624 30625 30626 30627 30628 30629 30630 30631 30632 30633 30634 30635 30636 30637 30638 30639 30640 30641 30642 30643 30644 30645 30646 30647 30648 30649 30650 30651 30652 30653 30654 30655 30656 30657 30658 30659 30660 30661 30662 30663 30664 30665 30666 30667 30668 30669 30670 30671 30672 30673 30674 30675 30676 30677 30678 30679 30680 30681 30682 30683 30684 30685 30686 30687 30688 30689 30690 30691 30692 30693 30694 30695 30696 30697 30698 30699 30700 30701 30702 30703 30704 30705 30706 30707 30708 30709 30710 30711 30712 30713 30714 30715 30716 30717 30718 30719 30720 30721 30722 30723 30724 30725 30726 30727 30728 30729 30730 30731 30732 30733 30734 30735 30736 30737 30738 30739 30740 30741 30742 30743 30744 30745 30746 30747 30748 30749 30750 30751 30752 30753 30754 30755 30756 30757 30758 30759 30760 30761 30762 30763 30764 30765 30766 30767 30768 30769 30770 30771 30772 30773 30774 30775 30776 30777 30778 30779 30780 30781 30782 30783 30784 30785 30786 30787 30788 30789 30790 30791 30792 30793 30794 30795 30796 30797 30798 30799 30800 30801 30802 30803 30804 30805 30806 30807 30808 30809 30810 30811 30812 30813 30814 30815 30816 30817 30818 30819 30820 30821 30822 30823 30824 30825 30826 30827 30828 30829 30830 30831 30832 30833 30834 30835 30836 30837 30838 30839 30840 30841 30842 30843 30844 30845 30846 30847 30848 30849 30850 30851 30852 30853 30854 30855 30856 30857 30858 30859 30860 30861 30862 30863 30864 30865 30866 30867 30868 30869 30870 30871 30872 30873 30874 30875 30876 30877 30878 30879 30880 30881 30882 30883 30884 30885 30886 30887 30888 30889 30890 30891 30892 30893 30894 30895 30896 30897 30898 30899 30900 30901 30902 30903 30904 30905 30906 30907 30908 30909 30910 30911 30912 30913 30914 30915 30916 30917 30918 30919 30920 30921 30922 30923 30924 30925 30926 30927 30928 30929 30930 30931 30932 30933 30934 30935 30936 30937 30938 30939 30940 30941 30942 30943 30944 30945 30946 30947 30948 30949 30950 30951 30952 30953 30954 30955 30956 30957 30958 30959 30960 30961 30962 30963 30964 30965 30966 30967 30968 30969 30970 30971 30972 30973 30974 30975 30976 30977 30978 30979 30980 30981 30982 30983 30984 30985 30986 30987 30988 30989 30990 30991 30992 30993 30994 30995 30996 30997 30998 30999 31000 31001 31002 31003 31004 31005 31006 31007 31008 31009 31010 31011 31012 31013 31014 31015 31016 31017 31018 31019 31020 31021 31022 31023 31024 31025 31026 31027 31028 31029 31030 31031 31032 31033 31034 31035 31036 31037 31038 31039 31040 31041 31042 31043 31044 31045 31046 31047 31048 31049 31050 31051 31052 31053 31054 31055 31056 31057 31058 31059 31060 31061 31062 31063 31064 31065 31066 31067 31068 31069 31070 31071 31072 31073 31074 31075 31076 31077 31078 31079 31080 31081 31082 31083 31084 31085 31086 31087 31088 31089 31090 31091 31092 31093 31094 31095 31096 31097 31098 31099 31100 31101 31102 31103 31104 31105 31106 31107 31108 31109 31110 31111 31112 31113 31114 31115 31116 31117 31118 31119 31120 31121 31122 31123 31124 31125 31126 31127 31128 31129 31130 31131 31132 31133 31134 31135 31136 31137 31138 31139 31140 31141 31142 31143 31144 31145 31146 31147 31148 31149 31150 31151 31152 31153 31154 31155 31156 31157 31158 31159 31160 31161 31162 31163 31164 31165 31166 31167 31168 31169 31170 31171 31172 31173 31174 31175 31176 31177 31178 31179 31180 31181 31182 31183 31184 31185 31186 31187 31188 31189 31190 31191 31192 31193 31194 31195 31196 31197 31198 31199 31200 31201 31202 31203 31204 31205 31206 31207 31208 31209 31210 31211 31212 31213 31214 31215 31216 31217 31218 31219 31220 31221 31222 31223 31224 31225 31226 31227 31228 31229 31230 31231 31232 31233 31234 31235 31236 31237 31238 31239 31240 31241 31242 31243 31244 31245 31246 31247 31248 31249 31250 31251 31252 31253 31254 31255 31256 31257 31258 31259 31260 31261 31262 31263 31264 31265 31266 31267 31268 31269 31270 31271 31272 31273 31274 31275 31276 31277 31278 31279 31280 31281 31282 31283 31284 31285 31286 31287 31288 31289 31290 31291 31292 31293 31294 31295 31296 31297 31298 31299 31300 31301 31302 31303 31304 31305 31306 31307 31308 31309 31310 31311 31312 31313 31314 31315 31316 31317 31318 31319 31320 31321 31322 31323 31324 31325 31326 31327 31328 31329 31330 31331 31332 31333 31334 31335 31336 31337 31338 31339 31340 31341 31342 31343 31344 31345 31346 31347 31348 31349 31350 31351 31352 31353 31354 31355 31356 31357 31358 31359 31360 31361 31362 31363 31364 31365 31366 31367 31368 31369 31370 31371 31372 31373 31374 31375 31376 31377 31378 31379 31380 31381 31382 31383 31384 31385 31386 31387 31388 31389 31390 31391 31392 31393 31394 31395 31396 31397 31398 31399 31400 31401 31402 31403 31404 31405 31406 31407 31408 31409 31410 31411 31412 31413 31414 31415 31416 31417 31418 31419 31420 31421 31422 31423 31424 31425 31426 31427 31428 31429 31430 31431 31432 31433 31434 31435 31436 31437 31438 31439 31440 31441 31442 31443 31444 31445 31446 31447 31448 31449 31450 31451 31452 31453 31454 31455 31456 31457 31458 31459 31460 31461 31462 31463 31464 31465 31466 31467 31468 31469 31470 31471 31472 31473 31474 31475 31476 31477 31478 31479 31480 31481 31482 31483 31484 31485 31486 31487 31488 31489 31490 31491 31492 31493 31494 31495 31496 31497 31498 31499 31500 31501 31502 31503 31504 31505 31506 31507 31508 31509 31510 31511 31512 31513 31514 31515 31516 31517 31518 31519 31520 31521 31522 31523 31524 31525 31526 31527 31528 31529 31530 31531 31532 31533 31534 31535 31536 31537 31538 31539 31540 31541 31542 31543 31544 31545 31546 31547 31548 31549 31550 31551 31552 31553 31554 31555 31556 31557 31558 31559 31560 31561 31562 31563 31564 31565 31566 31567 31568 31569 31570 31571 31572 31573 31574 31575 31576 31577 31578 31579 31580 31581 31582 31583 31584 31585 31586 31587 31588 31589 31590 31591 31592 31593 31594 31595 31596 31597 31598 31599 31600 31601 31602 31603 31604 31605 31606 31607 31608 31609 31610 31611 31612 31613 31614 31615 31616 31617 31618 31619 31620 31621 31622 31623 31624 31625 31626 31627 31628 31629 31630 31631 31632 31633 31634 31635 31636 31637 31638 31639 31640 31641 31642 31643 31644 31645 31646 31647 31648 31649 31650 31651 31652 31653 31654 31655 31656 31657 31658 31659 31660 31661 31662 31663 31664 31665 31666 31667 31668 31669 31670 31671 31672 31673 31674 31675 31676 31677 31678 31679 31680 31681 31682 31683 31684 31685 31686 31687 31688 31689 31690 31691 31692 31693 31694 31695 31696 31697 31698 31699 31700 31701 31702 31703 31704 31705 31706 31707 31708 31709 31710 31711 31712 31713 31714 31715 31716 31717 31718 31719 31720 31721 31722 31723 31724 31725 31726 31727 31728 31729 31730 31731 31732 31733 31734 31735 31736 31737 31738 31739 31740 31741 31742 31743 31744 31745 31746 31747 31748 31749 31750 31751 31752 31753 31754 31755 31756 31757 31758 31759 31760 31761 31762 31763 31764 31765 31766 31767 31768 31769 31770 31771 31772 31773 31774 31775 31776 31777 31778 31779 31780 31781 31782 31783 31784 31785 31786 31787 31788 31789 31790 31791 31792 31793 31794 31795 31796 31797 31798 31799 31800 31801 31802 31803 31804 31805 31806 31807 31808 31809 31810 31811 31812 31813 31814 31815 31816 31817 31818 31819 31820 31821 31822 31823 31824 31825 31826 31827 31828 31829 31830 31831 31832 31833 31834 31835 31836 31837 31838 31839 31840 31841 31842 31843 31844 31845 31846 31847 31848 31849 31850 31851 31852 31853 31854 31855 31856 31857 31858 31859 31860 31861 31862 31863 31864 31865 31866 31867 31868 31869 31870 31871 31872 31873 31874 31875 31876 31877 31878 31879 31880 31881 31882 31883 31884 31885 31886 31887 31888 31889 31890 31891 31892 31893 31894 31895 31896 31897 31898 31899 31900 31901 31902 31903 31904 31905 31906 31907 31908 31909 31910 31911 31912 31913 31914 31915 31916 31917 31918 31919 31920 31921 31922 31923 31924 31925 31926 31927 31928 31929 31930 31931 31932 31933 31934 31935 31936 31937 31938 31939 31940 31941 31942 31943 31944 31945 31946 31947 31948 31949 31950 31951 31952 31953 31954 31955 31956 31957 31958 31959 31960 31961 31962 31963 31964 31965 31966 31967 31968 31969 31970 31971 31972 31973 31974 31975 31976 31977 31978 31979 31980 31981 31982 31983 31984 31985 31986 31987 31988 31989 31990 31991 31992 31993 31994 31995 31996 31997 31998 31999 32000 32001 32002 32003 32004 32005 32006 32007 32008 32009 32010 32011 32012 32013 32014 32015 32016 32017 32018 32019 32020 32021 32022 32023 32024 32025 32026 32027 32028 32029 32030 32031 32032 32033 32034 32035 32036 32037 32038 32039 32040 32041 32042 32043 32044 32045 32046 32047 32048 32049 32050 32051 32052 32053 32054 32055 32056 32057 32058 32059 32060 32061 32062 32063 32064 32065 32066 32067 32068 32069 32070 32071 32072 32073 32074 32075 32076 32077 32078 32079 32080 32081 32082 32083 32084 32085 32086 32087 32088 32089 32090 32091 32092 32093 32094 32095 32096 32097 32098 32099 32100 32101 32102 32103 32104 32105 32106 32107 32108 32109 32110 32111 32112 32113 32114 32115 32116 32117 32118 32119 32120 32121 32122 32123 32124 32125 32126 32127 32128 32129 32130 32131 32132 32133 32134 32135 32136 32137 32138 32139 32140 32141 32142 32143 32144 32145 32146 32147 32148 32149 32150 32151 32152 32153 32154 32155 32156 32157 32158 32159 32160 32161 32162 32163 32164 32165 32166 32167 32168 32169 32170 32171 32172 32173 32174 32175 32176 32177 32178 32179 32180 32181 32182 32183 32184 32185 32186 32187 32188 32189 32190 32191 32192 32193 32194 32195 32196 32197 32198 32199 32200 32201 32202 32203 32204 32205 32206 32207 32208 32209 32210 32211 32212 32213 32214 32215 32216 32217 32218 32219 32220 32221 32222 32223 32224 32225 32226 32227 32228 32229 32230 32231 32232 32233 32234 32235 32236 32237 32238 32239 32240 32241 32242 32243 32244 32245 32246 32247 32248 32249 32250 32251 32252 32253 32254 32255 32256 32257 32258 32259 32260 32261 32262 32263 32264 32265 32266 32267 32268 32269 32270 32271 32272 32273 32274 32275 32276 32277 32278 32279 32280 32281 32282 32283 32284 32285 32286 32287 32288 32289 32290 32291 32292 32293 32294 32295 32296 32297 32298 32299 32300 32301 32302 32303 32304 32305 32306 32307 32308 32309 32310 32311 32312 32313 32314 32315 32316 32317 32318 32319 32320 32321 32322 32323 32324 32325 32326 32327 32328 32329 32330 32331 32332 32333 32334 32335 32336 32337 32338 32339 32340 32341 32342 32343 32344 32345 32346 32347 32348 32349 32350 32351 32352 32353 32354 32355 32356 32357 32358 32359 32360 32361 32362 32363 32364 32365 32366 32367 32368 32369 32370 32371 32372 32373 32374 32375 32376 32377 32378 32379 32380 32381 32382 32383 32384 32385 32386 32387 32388 32389 32390 32391 32392 32393 32394 32395 32396 32397 32398 32399 32400 32401 32402 32403 32404 32405 32406 32407 32408 32409 32410 32411 32412 32413 32414 32415 32416 32417 32418 32419 32420 32421 32422 32423 32424 32425 32426 32427 32428 32429 32430 32431 32432 32433 32434 32435 32436 32437 32438 32439 32440 32441 32442 32443 32444 32445 32446 32447 32448 32449 32450 32451 32452 32453 32454 32455 32456 32457 32458 32459 32460 32461 32462 32463 32464 32465 32466 32467 32468 32469 32470 32471 32472 32473 32474 32475 32476 32477 32478 32479 32480 32481 32482 32483 32484 32485 32486 32487 32488 32489 32490 32491 32492 32493 32494 32495 32496 32497 32498 32499 32500 32501 32502 32503 32504 32505 32506 32507 32508 32509 32510 32511 32512 32513 32514 32515 32516 32517 32518 32519 32520 32521 32522 32523 32524 32525 32526 32527 32528 32529 32530 32531 32532 32533 32534 32535 32536 32537 32538 32539 32540 32541 32542 32543 32544 32545 32546 32547 32548 32549 32550 32551 32552 32553 32554 32555 32556 32557 32558 32559 32560 32561 32562 32563 32564 32565 32566 32567 32568 32569 32570 32571 32572 32573 32574 32575 32576 32577 32578 32579 32580 32581 32582 32583 32584 32585 32586 32587 32588 32589 32590 32591 32592 32593 32594 32595 32596 32597 32598 32599 32600 32601 32602 32603 32604 32605 32606 32607 32608 32609 32610 32611 32612 32613 32614 32615 32616 32617 32618 32619 32620 32621 32622 32623 32624 32625 32626 32627 32628 32629 32630 32631 32632 32633 32634 32635 32636 32637 32638 32639 32640 32641 32642 32643 32644 32645 32646 32647 32648 32649 32650 32651 32652 32653 32654 32655 32656 32657 32658 32659 32660 32661 32662 32663 32664 32665 32666 32667 32668 32669 32670 32671 32672 32673 32674 32675 32676 32677 32678 32679 32680 32681 32682 32683 32684 32685 32686 32687 32688 32689 32690 32691 32692 32693 32694 32695 32696 32697 32698 32699 32700 32701 32702 32703 32704 32705 32706 32707 32708 32709 32710 32711 32712 32713 32714 32715 32716 32717 32718 32719 32720 32721 32722 32723 32724 32725 32726 32727 32728 32729 32730 32731 32732 32733 32734 32735 32736 32737 32738 32739 32740 32741 32742 32743 32744 32745 32746 32747 32748 32749 32750 32751 32752 32753 32754 32755 32756 32757 32758 32759 32760 32761 32762 32763 32764 32765 32766 32767 32768 32769 32770 32771 32772 32773 32774 32775 32776 32777 32778 32779 32780 32781 32782 32783 32784 32785 32786 32787 32788 32789 32790 32791 32792 32793 32794 32795 32796 32797 32798 32799 32800 32801 32802 32803 32804 32805 32806 32807 32808 32809 32810 32811 32812 32813 32814 32815 32816 32817 32818 32819 32820 32821 32822 32823 32824 32825 32826 32827 32828 32829 32830 32831 32832 32833 32834 32835 32836 32837 32838 32839 32840 32841 32842 32843 32844 32845 32846 32847 32848 32849 32850 32851 32852 32853 32854 32855 32856 32857 32858 32859 32860 32861 32862 32863 32864 32865 32866 32867 32868 32869 32870 32871 32872 32873 32874 32875 32876 32877 32878 32879 32880 32881 32882 32883 32884 32885 32886 32887 32888 32889 32890 32891 32892 32893 32894 32895 32896 32897 32898 32899 32900 32901 32902 32903 32904 32905 32906 32907 32908 32909 32910 32911 32912 32913 32914 32915 32916 32917 32918 32919 32920 32921 32922 32923 32924 32925 32926 32927 32928 32929 32930 32931 32932 32933 32934 32935 32936 32937 32938 32939 32940 32941 32942 32943 32944 32945 32946 32947 32948 32949 32950 32951 32952 32953 32954 32955 32956 32957 32958 32959 32960 32961 32962 32963 32964 32965 32966 32967 32968 32969 32970 32971 32972 32973 32974 32975 32976 32977 32978 32979 32980 32981 32982 32983 32984 32985 32986 32987 32988 32989 32990 32991 32992 32993 32994 32995 32996 32997 32998 32999 33000 33001 33002 33003 33004 33005 33006 33007 33008 33009 33010 33011 33012 33013 33014 33015 33016 33017 33018 33019 33020 33021 33022 33023 33024 33025 33026 33027 33028 33029 33030 33031 33032 33033 33034 33035 33036 33037 33038 33039 33040 33041 33042 33043 33044 33045 33046 33047 33048 33049 33050 33051 33052 33053 33054 33055 33056 33057 33058 33059 33060 33061 33062 33063 33064 33065 33066 33067 33068 33069 33070 33071 33072 33073 33074 33075 33076 33077 33078 33079 33080 33081 33082 33083 33084 33085 33086 33087 33088 33089 33090 33091 33092 33093 33094 33095 33096 33097 33098 33099 33100 33101 33102 33103 33104 33105 33106 33107 33108 33109 33110 33111 33112 33113 33114 33115 33116 33117 33118 33119 33120 33121 33122 33123 33124 33125 33126 33127 33128 33129 33130 33131 33132 33133 33134 33135 33136 33137 33138 33139 33140 33141 33142 33143 33144 33145 33146 33147 33148 33149 33150 33151 33152 33153 33154 33155 33156 33157 33158 33159 33160 33161 33162 33163 33164 33165 33166 33167 33168 33169 33170 33171 33172 33173 33174 33175 33176 33177 33178 33179 33180 33181 33182 33183 33184 33185 33186 33187 33188 33189 33190 33191 33192 33193 33194 33195 33196 33197 33198 33199 33200 33201 33202 33203 33204 33205 33206 33207 33208 33209 33210 33211 33212 33213 33214 33215 33216 33217 33218 33219 33220 33221 33222 33223 33224 33225 33226 33227 33228 33229 33230 33231 33232 33233 33234 33235 33236 33237 33238 33239 33240 33241 33242 33243 33244 33245 33246 33247 33248 33249 33250 33251 33252 33253 33254 33255 33256 33257 33258 33259 33260 33261 33262 33263 33264 33265 33266 33267 33268 33269 33270 33271 33272 33273 33274 33275 33276 33277 33278 33279 33280 33281 33282 33283 33284 33285 33286 33287 33288 33289 33290 33291 33292 33293 33294 33295 33296 33297 33298 33299 33300 33301 33302 33303 33304 33305 33306 33307 33308 33309 33310 33311 33312 33313 33314 33315 33316 33317 33318 33319 33320 33321 33322 33323 33324 33325 33326 33327 33328 33329 33330 33331 33332 33333 33334 33335 33336 33337 33338 33339 33340 33341 33342 33343 33344 33345 33346 33347 33348 33349 33350 33351 33352 33353 33354 33355 33356 33357 33358 33359 33360 33361 33362 33363 33364 33365 33366 33367 33368 33369 33370 33371 33372 33373 33374 33375 33376 33377 33378 33379 33380 33381 33382 33383 33384 33385 33386 33387 33388 33389 33390 33391 33392 33393 33394 33395 33396 33397 33398 33399 33400 33401 33402 33403 33404 33405 33406 33407 33408 33409 33410 33411 33412 33413 33414 33415 33416 33417 33418 33419 33420 33421 33422 33423 33424 33425 33426 33427 33428 33429 33430 33431 33432 33433 33434 33435 33436 33437 33438 33439 33440 33441 33442 33443 33444 33445 33446 33447 33448 33449 33450 33451 33452 33453 33454 33455 33456 33457 33458 33459 33460 33461 33462 33463 33464 33465 33466 33467 33468 33469 33470 33471 33472 33473 33474 33475 33476 33477 33478 33479 33480 33481 33482 33483 33484 33485 33486 33487 33488 33489 33490 33491 33492 33493 33494 33495 33496 33497 33498 33499 33500 33501 33502 33503 33504 33505 33506 33507 33508 33509 33510 33511 33512 33513 33514 33515 33516 33517 33518 33519 33520 33521 33522 33523 33524 33525 33526 33527 33528 33529 33530 33531 33532 33533 33534 33535 33536 33537 33538 33539 33540 33541 33542 33543 33544 33545 33546 33547 33548 33549 33550 33551 33552 33553 33554 33555 33556 33557 33558 33559 33560 33561 33562 33563 33564 33565 33566 33567 33568 33569 33570 33571 33572 33573 33574 33575 33576 33577 33578 33579 33580 33581 33582 33583 33584 33585 33586 33587 33588 33589 33590 33591 33592 33593 33594 33595 33596 33597 33598 33599 33600 33601 33602 33603 33604 33605 33606 33607 33608 33609 33610 33611 33612 33613 33614 33615 33616 33617 33618 33619 33620 33621 33622 33623 33624 33625 33626 33627 33628 33629 33630 33631 33632 33633 33634 33635 33636 33637 33638 33639 33640 33641 33642 33643 33644 33645 33646 33647 33648 33649 33650 33651 33652 33653 33654 33655 33656 33657 33658 33659 33660 33661 33662 33663 33664 33665 33666 33667 33668 33669 33670 33671 33672 33673 33674 33675 33676 33677 33678 33679 33680 33681 33682 33683 33684 33685 33686 33687 33688 33689 33690 33691 33692 33693 33694 33695 33696 33697 33698 33699 33700 33701 33702 33703 33704 33705 33706 33707 33708 33709 33710 33711 33712 33713 33714 33715 33716 33717 33718 33719 33720
(() => {
var __create = Object.create;
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp.call(b, prop))
__defNormalProp(a, prop, b[prop]);
if (__getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(b)) {
if (__propIsEnum.call(b, prop))
__defNormalProp(a, prop, b[prop]);
}
return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
// node_modules/jquery/dist/jquery.js
var require_jquery = __commonJS({
"node_modules/jquery/dist/jquery.js"(exports, module) {
(function(global3, factory) {
"use strict";
if (typeof module === "object" && typeof module.exports === "object") {
module.exports = global3.document ? factory(global3, true) : function(w) {
if (!w.document) {
throw new Error("jQuery requires a window with a document");
}
return factory(w);
};
} else {
factory(global3);
}
})(typeof window !== "undefined" ? window : exports, function(window2, noGlobal) {
"use strict";
var arr = [];
var getProto = Object.getPrototypeOf;
var slice = arr.slice;
var flat = arr.flat ? function(array) {
return arr.flat.call(array);
} : function(array) {
return arr.concat.apply([], array);
};
var push = arr.push;
var indexOf = arr.indexOf;
var class2type = {};
var toString = class2type.toString;
var hasOwn = class2type.hasOwnProperty;
var fnToString = hasOwn.toString;
var ObjectFunctionString = fnToString.call(Object);
var support = {};
var isFunction = function isFunction2(obj) {
return typeof obj === "function" && typeof obj.nodeType !== "number" && typeof obj.item !== "function";
};
var isWindow = function isWindow2(obj) {
return obj != null && obj === obj.window;
};
var document2 = window2.document;
var preservedScriptAttributes = {
type: true,
src: true,
nonce: true,
noModule: true
};
function DOMEval(code, node, doc2) {
doc2 = doc2 || document2;
var i, val, script = doc2.createElement("script");
script.text = code;
if (node) {
for (i in preservedScriptAttributes) {
val = node[i] || node.getAttribute && node.getAttribute(i);
if (val) {
script.setAttribute(i, val);
}
}
}
doc2.head.appendChild(script).parentNode.removeChild(script);
}
function toType2(obj) {
if (obj == null) {
return obj + "";
}
return typeof obj === "object" || typeof obj === "function" ? class2type[toString.call(obj)] || "object" : typeof obj;
}
var version = "3.6.0", jQuery = function(selector, context) {
return new jQuery.fn.init(selector, context);
};
jQuery.fn = jQuery.prototype = {
jquery: version,
constructor: jQuery,
length: 0,
toArray: function() {
return slice.call(this);
},
get: function(num) {
if (num == null) {
return slice.call(this);
}
return num < 0 ? this[num + this.length] : this[num];
},
pushStack: function(elems) {
var ret = jQuery.merge(this.constructor(), elems);
ret.prevObject = this;
return ret;
},
each: function(callback) {
return jQuery.each(this, callback);
},
map: function(callback) {
return this.pushStack(jQuery.map(this, function(elem, i) {
return callback.call(elem, i, elem);
}));
},
slice: function() {
return this.pushStack(slice.apply(this, arguments));
},
first: function() {
return this.eq(0);
},
last: function() {
return this.eq(-1);
},
even: function() {
return this.pushStack(jQuery.grep(this, function(_elem, i) {
return (i + 1) % 2;
}));
},
odd: function() {
return this.pushStack(jQuery.grep(this, function(_elem, i) {
return i % 2;
}));
},
eq: function(i) {
var len = this.length, j = +i + (i < 0 ? len : 0);
return this.pushStack(j >= 0 && j < len ? [this[j]] : []);
},
end: function() {
return this.prevObject || this.constructor();
},
push,
sort: arr.sort,
splice: arr.splice
};
jQuery.extend = jQuery.fn.extend = function() {
var options, name, src, copy, copyIsArray, clone2, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false;
if (typeof target === "boolean") {
deep = target;
target = arguments[i] || {};
i++;
}
if (typeof target !== "object" && !isFunction(target)) {
target = {};
}
if (i === length) {
target = this;
i--;
}
for (; i < length; i++) {
if ((options = arguments[i]) != null) {
for (name in options) {
copy = options[name];
if (name === "__proto__" || target === copy) {
continue;
}
if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) {
src = target[name];
if (copyIsArray && !Array.isArray(src)) {
clone2 = [];
} else if (!copyIsArray && !jQuery.isPlainObject(src)) {
clone2 = {};
} else {
clone2 = src;
}
copyIsArray = false;
target[name] = jQuery.extend(deep, clone2, copy);
} else if (copy !== void 0) {
target[name] = copy;
}
}
}
}
return target;
};
jQuery.extend({
expando: "jQuery" + (version + Math.random()).replace(/\D/g, ""),
isReady: true,
error: function(msg) {
throw new Error(msg);
},
noop: function() {
},
isPlainObject: function(obj) {
var proto, Ctor;
if (!obj || toString.call(obj) !== "[object Object]") {
return false;
}
proto = getProto(obj);
if (!proto) {
return true;
}
Ctor = hasOwn.call(proto, "constructor") && proto.constructor;
return typeof Ctor === "function" && fnToString.call(Ctor) === ObjectFunctionString;
},
isEmptyObject: function(obj) {
var name;
for (name in obj) {
return false;
}
return true;
},
globalEval: function(code, options, doc2) {
DOMEval(code, { nonce: options && options.nonce }, doc2);
},
each: function(obj, callback) {
var length, i = 0;
if (isArrayLike(obj)) {
length = obj.length;
for (; i < length; i++) {
if (callback.call(obj[i], i, obj[i]) === false) {
break;
}
}
} else {
for (i in obj) {
if (callback.call(obj[i], i, obj[i]) === false) {
break;
}
}
}
return obj;
},
makeArray: function(arr2, results) {
var ret = results || [];
if (arr2 != null) {
if (isArrayLike(Object(arr2))) {
jQuery.merge(ret, typeof arr2 === "string" ? [arr2] : arr2);
} else {
push.call(ret, arr2);
}
}
return ret;
},
inArray: function(elem, arr2, i) {
return arr2 == null ? -1 : indexOf.call(arr2, elem, i);
},
merge: function(first, second) {
var len = +second.length, j = 0, i = first.length;
for (; j < len; j++) {
first[i++] = second[j];
}
first.length = i;
return first;
},
grep: function(elems, callback, invert) {
var callbackInverse, matches = [], i = 0, length = elems.length, callbackExpect = !invert;
for (; i < length; i++) {
callbackInverse = !callback(elems[i], i);
if (callbackInverse !== callbackExpect) {
matches.push(elems[i]);
}
}
return matches;
},
map: function(elems, callback, arg) {
var length, value, i = 0, ret = [];
if (isArrayLike(elems)) {
length = elems.length;
for (; i < length; i++) {
value = callback(elems[i], i, arg);
if (value != null) {
ret.push(value);
}
}
} else {
for (i in elems) {
value = callback(elems[i], i, arg);
if (value != null) {
ret.push(value);
}
}
}
return flat(ret);
},
guid: 1,
support
});
if (typeof Symbol === "function") {
jQuery.fn[Symbol.iterator] = arr[Symbol.iterator];
}
jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function(_i, name) {
class2type["[object " + name + "]"] = name.toLowerCase();
});
function isArrayLike(obj) {
var length = !!obj && "length" in obj && obj.length, type = toType2(obj);
if (isFunction(obj) || isWindow(obj)) {
return false;
}
return type === "array" || length === 0 || typeof length === "number" && length > 0 && length - 1 in obj;
}
var Sizzle = function(window3) {
var i, support2, Expr, getText, isXML, tokenize, compile, select, outermostContext, sortInput, hasDuplicate, setDocument, document3, docElem, documentIsHTML, rbuggyQSA, rbuggyMatches, matches, contains2, expando = "sizzle" + 1 * new Date(), preferredDoc = window3.document, dirruns = 0, done = 0, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), nonnativeSelectorCache = createCache(), sortOrder = function(a, b) {
if (a === b) {
hasDuplicate = true;
}
return 0;
}, hasOwn2 = {}.hasOwnProperty, arr2 = [], pop = arr2.pop, pushNative = arr2.push, push2 = arr2.push, slice2 = arr2.slice, indexOf2 = function(list, elem) {
var i2 = 0, len = list.length;
for (; i2 < len; i2++) {
if (list[i2] === elem) {
return i2;
}
}
return -1;
}, booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", whitespace = "[\\x20\\t\\r\\n\\f]", identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + "*([*^$|!~]?=)" + whitespace + `*(?:'((?:\\\\.|[^\\\\'])*)'|"((?:\\\\.|[^\\\\"])*)"|(` + identifier + "))|)" + whitespace + "*\\]", pseudos = ":(" + identifier + `)(?:\\((('((?:\\\\.|[^\\\\'])*)'|"((?:\\\\.|[^\\\\"])*)")|((?:\\\\.|[^\\\\()[\\]]|` + attributes + ")*)|.*)\\)|)", rwhitespace = new RegExp(whitespace + "+", "g"), rtrim2 = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"), rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"), rcombinators = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"), rdescend = new RegExp(whitespace + "|>"), rpseudo = new RegExp(pseudos), ridentifier = new RegExp("^" + identifier + "$"), matchExpr = {
"ID": new RegExp("^#(" + identifier + ")"),
"CLASS": new RegExp("^\\.(" + identifier + ")"),
"TAG": new RegExp("^(" + identifier + "|[*])"),
"ATTR": new RegExp("^" + attributes),
"PSEUDO": new RegExp("^" + pseudos),
"CHILD": new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i"),
"bool": new RegExp("^(?:" + booleans + ")$", "i"),
"needsContext": new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i")
}, rhtml2 = /HTML$/i, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, rnative = /^[^{]+\{\s*\[native \w/, rquickExpr2 = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, runescape = new RegExp("\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g"), funescape = function(escape, nonHex) {
var high = "0x" + escape.slice(1) - 65536;
return nonHex ? nonHex : high < 0 ? String.fromCharCode(high + 65536) : String.fromCharCode(high >> 10 | 55296, high & 1023 | 56320);
}, rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, fcssescape = function(ch, asCodePoint) {
if (asCodePoint) {
if (ch === "\0") {
return "\uFFFD";
}
return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " ";
}
return "\\" + ch;
}, unloadHandler = function() {
setDocument();
}, inDisabledFieldset = addCombinator(function(elem) {
return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
}, { dir: "parentNode", next: "legend" });
try {
push2.apply(arr2 = slice2.call(preferredDoc.childNodes), preferredDoc.childNodes);
arr2[preferredDoc.childNodes.length].nodeType;
} catch (e) {
push2 = {
apply: arr2.length ? function(target, els) {
pushNative.apply(target, slice2.call(els));
} : function(target, els) {
var j = target.length, i2 = 0;
while (target[j++] = els[i2++]) {
}
target.length = j - 1;
}
};
}
function Sizzle2(selector, context, results, seed) {
var m, i2, elem, nid, match, groups, newSelector, newContext = context && context.ownerDocument, nodeType = context ? context.nodeType : 9;
results = results || [];
if (typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11) {
return results;
}
if (!seed) {
setDocument(context);
context = context || document3;
if (documentIsHTML) {
if (nodeType !== 11 && (match = rquickExpr2.exec(selector))) {
if (m = match[1]) {
if (nodeType === 9) {
if (elem = context.getElementById(m)) {
if (elem.id === m) {
results.push(elem);
return results;
}
} else {
return results;
}
} else {
if (newContext && (elem = newContext.getElementById(m)) && contains2(context, elem) && elem.id === m) {
results.push(elem);
return results;
}
}
} else if (match[2]) {
push2.apply(results, context.getElementsByTagName(selector));
return results;
} else if ((m = match[3]) && support2.getElementsByClassName && context.getElementsByClassName) {
push2.apply(results, context.getElementsByClassName(m));
return results;
}
}
if (support2.qsa && !nonnativeSelectorCache[selector + " "] && (!rbuggyQSA || !rbuggyQSA.test(selector)) && (nodeType !== 1 || context.nodeName.toLowerCase() !== "object")) {
newSelector = selector;
newContext = context;
if (nodeType === 1 && (rdescend.test(selector) || rcombinators.test(selector))) {
newContext = rsibling.test(selector) && testContext(context.parentNode) || context;
if (newContext !== context || !support2.scope) {
if (nid = context.getAttribute("id")) {
nid = nid.replace(rcssescape, fcssescape);
} else {
context.setAttribute("id", nid = expando);
}
}
groups = tokenize(selector);
i2 = groups.length;
while (i2--) {
groups[i2] = (nid ? "#" + nid : ":scope") + " " + toSelector(groups[i2]);
}
newSelector = groups.join(",");
}
try {
push2.apply(results, newContext.querySelectorAll(newSelector));
return results;
} catch (qsaError) {
nonnativeSelectorCache(selector, true);
} finally {
if (nid === expando) {
context.removeAttribute("id");
}
}
}
}
}
return select(selector.replace(rtrim2, "$1"), context, results, seed);
}
function createCache() {
var keys = [];
function cache(key, value) {
if (keys.push(key + " ") > Expr.cacheLength) {
delete cache[keys.shift()];
}
return cache[key + " "] = value;
}
return cache;
}
function markFunction(fn2) {
fn2[expando] = true;
return fn2;
}
function assert(fn2) {
var el = document3.createElement("fieldset");
try {
return !!fn2(el);
} catch (e) {
return false;
} finally {
if (el.parentNode) {
el.parentNode.removeChild(el);
}
el = null;
}
}
function addHandle(attrs, handler) {
var arr3 = attrs.split("|"), i2 = arr3.length;
while (i2--) {
Expr.attrHandle[arr3[i2]] = handler;
}
}
function siblingCheck(a, b) {
var cur = b && a, diff = cur && a.nodeType === 1 && b.nodeType === 1 && a.sourceIndex - b.sourceIndex;
if (diff) {
return diff;
}
if (cur) {
while (cur = cur.nextSibling) {
if (cur === b) {
return -1;
}
}
}
return a ? 1 : -1;
}
function createInputPseudo(type) {
return function(elem) {
var name = elem.nodeName.toLowerCase();
return name === "input" && elem.type === type;
};
}
function createButtonPseudo(type) {
return function(elem) {
var name = elem.nodeName.toLowerCase();
return (name === "input" || name === "button") && elem.type === type;
};
}
function createDisabledPseudo(disabled) {
return function(elem) {
if ("form" in elem) {
if (elem.parentNode && elem.disabled === false) {
if ("label" in elem) {
if ("label" in elem.parentNode) {
return elem.parentNode.disabled === disabled;
} else {
return elem.disabled === disabled;
}
}
return elem.isDisabled === disabled || elem.isDisabled !== !disabled && inDisabledFieldset(elem) === disabled;
}
return elem.disabled === disabled;
} else if ("label" in elem) {
return elem.disabled === disabled;
}
return false;
};
}
function createPositionalPseudo(fn2) {
return markFunction(function(argument) {
argument = +argument;
return markFunction(function(seed, matches2) {
var j, matchIndexes = fn2([], seed.length, argument), i2 = matchIndexes.length;
while (i2--) {
if (seed[j = matchIndexes[i2]]) {
seed[j] = !(matches2[j] = seed[j]);
}
}
});
});
}
function testContext(context) {
return context && typeof context.getElementsByTagName !== "undefined" && context;
}
support2 = Sizzle2.support = {};
isXML = Sizzle2.isXML = function(elem) {
var namespace = elem && elem.namespaceURI, docElem2 = elem && (elem.ownerDocument || elem).documentElement;
return !rhtml2.test(namespace || docElem2 && docElem2.nodeName || "HTML");
};
setDocument = Sizzle2.setDocument = function(node) {
var hasCompare, subWindow, doc2 = node ? node.ownerDocument || node : preferredDoc;
if (doc2 == document3 || doc2.nodeType !== 9 || !doc2.documentElement) {
return document3;
}
document3 = doc2;
docElem = document3.documentElement;
documentIsHTML = !isXML(document3);
if (preferredDoc != document3 && (subWindow = document3.defaultView) && subWindow.top !== subWindow) {
if (subWindow.addEventListener) {
subWindow.addEventListener("unload", unloadHandler, false);
} else if (subWindow.attachEvent) {
subWindow.attachEvent("onunload", unloadHandler);
}
}
support2.scope = assert(function(el) {
docElem.appendChild(el).appendChild(document3.createElement("div"));
return typeof el.querySelectorAll !== "undefined" && !el.querySelectorAll(":scope fieldset div").length;
});
support2.attributes = assert(function(el) {
el.className = "i";
return !el.getAttribute("className");
});
support2.getElementsByTagName = assert(function(el) {
el.appendChild(document3.createComment(""));
return !el.getElementsByTagName("*").length;
});
support2.getElementsByClassName = rnative.test(document3.getElementsByClassName);
support2.getById = assert(function(el) {
docElem.appendChild(el).id = expando;
return !document3.getElementsByName || !document3.getElementsByName(expando).length;
});
if (support2.getById) {
Expr.filter["ID"] = function(id) {
var attrId = id.replace(runescape, funescape);
return function(elem) {
return elem.getAttribute("id") === attrId;
};
};
Expr.find["ID"] = function(id, context) {
if (typeof context.getElementById !== "undefined" && documentIsHTML) {
var elem = context.getElementById(id);
return elem ? [elem] : [];
}
};
} else {
Expr.filter["ID"] = function(id) {
var attrId = id.replace(runescape, funescape);
return function(elem) {
var node2 = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
return node2 && node2.value === attrId;
};
};
Expr.find["ID"] = function(id, context) {
if (typeof context.getElementById !== "undefined" && documentIsHTML) {
var node2, i2, elems, elem = context.getElementById(id);
if (elem) {
node2 = elem.getAttributeNode("id");
if (node2 && node2.value === id) {
return [elem];
}
elems = context.getElementsByName(id);
i2 = 0;
while (elem = elems[i2++]) {
node2 = elem.getAttributeNode("id");
if (node2 && node2.value === id) {
return [elem];
}
}
}
return [];
}
};
}
Expr.find["TAG"] = support2.getElementsByTagName ? function(tag, context) {
if (typeof context.getElementsByTagName !== "undefined") {
return context.getElementsByTagName(tag);
} else if (support2.qsa) {
return context.querySelectorAll(tag);
}
} : function(tag, context) {
var elem, tmp = [], i2 = 0, results = context.getElementsByTagName(tag);
if (tag === "*") {
while (elem = results[i2++]) {
if (elem.nodeType === 1) {
tmp.push(elem);
}
}
return tmp;
}
return results;
};
Expr.find["CLASS"] = support2.getElementsByClassName && function(className, context) {
if (typeof context.getElementsByClassName !== "undefined" && documentIsHTML) {
return context.getElementsByClassName(className);
}
};
rbuggyMatches = [];
rbuggyQSA = [];
if (support2.qsa = rnative.test(document3.querySelectorAll)) {
assert(function(el) {
var input;
docElem.appendChild(el).innerHTML = "<a id='" + expando + "'></a><select id='" + expando + "-\r\\' msallowcapture=''><option selected=''></option></select>";
if (el.querySelectorAll("[msallowcapture^='']").length) {
rbuggyQSA.push("[*^$]=" + whitespace + `*(?:''|"")`);
}
if (!el.querySelectorAll("[selected]").length) {
rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")");
}
if (!el.querySelectorAll("[id~=" + expando + "-]").length) {
rbuggyQSA.push("~=");
}
input = document3.createElement("input");
input.setAttribute("name", "");
el.appendChild(input);
if (!el.querySelectorAll("[name='']").length) {
rbuggyQSA.push("\\[" + whitespace + "*name" + whitespace + "*=" + whitespace + `*(?:''|"")`);
}
if (!el.querySelectorAll(":checked").length) {
rbuggyQSA.push(":checked");
}
if (!el.querySelectorAll("a#" + expando + "+*").length) {
rbuggyQSA.push(".#.+[+~]");
}
el.querySelectorAll("\\\f");
rbuggyQSA.push("[\\r\\n\\f]");
});
assert(function(el) {
el.innerHTML = "<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";
var input = document3.createElement("input");
input.setAttribute("type", "hidden");
el.appendChild(input).setAttribute("name", "D");
if (el.querySelectorAll("[name=d]").length) {
rbuggyQSA.push("name" + whitespace + "*[*^$|!~]?=");
}
if (el.querySelectorAll(":enabled").length !== 2) {
rbuggyQSA.push(":enabled", ":disabled");
}
docElem.appendChild(el).disabled = true;
if (el.querySelectorAll(":disabled").length !== 2) {
rbuggyQSA.push(":enabled", ":disabled");
}
el.querySelectorAll("*,:x");
rbuggyQSA.push(",.*:");
});
}
if (support2.matchesSelector = rnative.test(matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector)) {
assert(function(el) {
support2.disconnectedMatch = matches.call(el, "*");
matches.call(el, "[s!='']:x");
rbuggyMatches.push("!=", pseudos);
});
}
rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|"));
rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|"));
hasCompare = rnative.test(docElem.compareDocumentPosition);
contains2 = hasCompare || rnative.test(docElem.contains) ? function(a, b) {
var adown = a.nodeType === 9 ? a.documentElement : a, bup = b && b.parentNode;
return a === bup || !!(bup && bup.nodeType === 1 && (adown.contains ? adown.contains(bup) : a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16));
} : function(a, b) {
if (b) {
while (b = b.parentNode) {
if (b === a) {
return true;
}
}
}
return false;
};
sortOrder = hasCompare ? function(a, b) {
if (a === b) {
hasDuplicate = true;
return 0;
}
var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
if (compare) {
return compare;
}
compare = (a.ownerDocument || a) == (b.ownerDocument || b) ? a.compareDocumentPosition(b) : 1;
if (compare & 1 || !support2.sortDetached && b.compareDocumentPosition(a) === compare) {
if (a == document3 || a.ownerDocument == preferredDoc && contains2(preferredDoc, a)) {
return -1;
}
if (b == document3 || b.ownerDocument == preferredDoc && contains2(preferredDoc, b)) {
return 1;
}
return sortInput ? indexOf2(sortInput, a) - indexOf2(sortInput, b) : 0;
}
return compare & 4 ? -1 : 1;
} : function(a, b) {
if (a === b) {
hasDuplicate = true;
return 0;
}
var cur, i2 = 0, aup = a.parentNode, bup = b.parentNode, ap = [a], bp = [b];
if (!aup || !bup) {
return a == document3 ? -1 : b == document3 ? 1 : aup ? -1 : bup ? 1 : sortInput ? indexOf2(sortInput, a) - indexOf2(sortInput, b) : 0;
} else if (aup === bup) {
return siblingCheck(a, b);
}
cur = a;
while (cur = cur.parentNode) {
ap.unshift(cur);
}
cur = b;
while (cur = cur.parentNode) {
bp.unshift(cur);
}
while (ap[i2] === bp[i2]) {
i2++;
}
return i2 ? siblingCheck(ap[i2], bp[i2]) : ap[i2] == preferredDoc ? -1 : bp[i2] == preferredDoc ? 1 : 0;
};
return document3;
};
Sizzle2.matches = function(expr, elements) {
return Sizzle2(expr, null, null, elements);
};
Sizzle2.matchesSelector = function(elem, expr) {
setDocument(elem);
if (support2.matchesSelector && documentIsHTML && !nonnativeSelectorCache[expr + " "] && (!rbuggyMatches || !rbuggyMatches.test(expr)) && (!rbuggyQSA || !rbuggyQSA.test(expr))) {
try {
var ret = matches.call(elem, expr);
if (ret || support2.disconnectedMatch || elem.document && elem.document.nodeType !== 11) {
return ret;
}
} catch (e) {
nonnativeSelectorCache(expr, true);
}
}
return Sizzle2(expr, document3, null, [elem]).length > 0;
};
Sizzle2.contains = function(context, elem) {
if ((context.ownerDocument || context) != document3) {
setDocument(context);
}
return contains2(context, elem);
};
Sizzle2.attr = function(elem, name) {
if ((elem.ownerDocument || elem) != document3) {
setDocument(elem);
}
var fn2 = Expr.attrHandle[name.toLowerCase()], val = fn2 && hasOwn2.call(Expr.attrHandle, name.toLowerCase()) ? fn2(elem, name, !documentIsHTML) : void 0;
return val !== void 0 ? val : support2.attributes || !documentIsHTML ? elem.getAttribute(name) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null;
};
Sizzle2.escape = function(sel) {
return (sel + "").replace(rcssescape, fcssescape);
};
Sizzle2.error = function(msg) {
throw new Error("Syntax error, unrecognized expression: " + msg);
};
Sizzle2.uniqueSort = function(results) {
var elem, duplicates = [], j = 0, i2 = 0;
hasDuplicate = !support2.detectDuplicates;
sortInput = !support2.sortStable && results.slice(0);
results.sort(sortOrder);
if (hasDuplicate) {
while (elem = results[i2++]) {
if (elem === results[i2]) {
j = duplicates.push(i2);
}
}
while (j--) {
results.splice(duplicates[j], 1);
}
}
sortInput = null;
return results;
};
getText = Sizzle2.getText = function(elem) {
var node, ret = "", i2 = 0, nodeType = elem.nodeType;
if (!nodeType) {
while (node = elem[i2++]) {
ret += getText(node);
}
} else if (nodeType === 1 || nodeType === 9 || nodeType === 11) {
if (typeof elem.textContent === "string") {
return elem.textContent;
} else {
for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
ret += getText(elem);
}
}
} else if (nodeType === 3 || nodeType === 4) {
return elem.nodeValue;
}
return ret;
};
Expr = Sizzle2.selectors = {
cacheLength: 50,
createPseudo: markFunction,
match: matchExpr,
attrHandle: {},
find: {},
relative: {
">": { dir: "parentNode", first: true },
" ": { dir: "parentNode" },
"+": { dir: "previousSibling", first: true },
"~": { dir: "previousSibling" }
},
preFilter: {
"ATTR": function(match) {
match[1] = match[1].replace(runescape, funescape);
match[3] = (match[3] || match[4] || match[5] || "").replace(runescape, funescape);
if (match[2] === "~=") {
match[3] = " " + match[3] + " ";
}
return match.slice(0, 4);
},
"CHILD": function(match) {
match[1] = match[1].toLowerCase();
if (match[1].slice(0, 3) === "nth") {
if (!match[3]) {
Sizzle2.error(match[0]);
}
match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === "even" || match[3] === "odd"));
match[5] = +(match[7] + match[8] || match[3] === "odd");
} else if (match[3]) {
Sizzle2.error(match[0]);
}
return match;
},
"PSEUDO": function(match) {
var excess, unquoted = !match[6] && match[2];
if (matchExpr["CHILD"].test(match[0])) {
return null;
}
if (match[3]) {
match[2] = match[4] || match[5] || "";
} else if (unquoted && rpseudo.test(unquoted) && (excess = tokenize(unquoted, true)) && (excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) {
match[0] = match[0].slice(0, excess);
match[2] = unquoted.slice(0, excess);
}
return match.slice(0, 3);
}
},
filter: {
"TAG": function(nodeNameSelector) {
var nodeName2 = nodeNameSelector.replace(runescape, funescape).toLowerCase();
return nodeNameSelector === "*" ? function() {
return true;
} : function(elem) {
return elem.nodeName && elem.nodeName.toLowerCase() === nodeName2;
};
},
"CLASS": function(className) {
var pattern = classCache[className + " "];
return pattern || (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) && classCache(className, function(elem) {
return pattern.test(typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "");
});
},
"ATTR": function(name, operator, check) {
return function(elem) {
var result = Sizzle2.attr(elem, name);
if (result == null) {
return operator === "!=";
}
if (!operator) {
return true;
}
result += "";
return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf(check) === 0 : operator === "*=" ? check && result.indexOf(check) > -1 : operator === "$=" ? check && result.slice(-check.length) === check : operator === "~=" ? (" " + result.replace(rwhitespace, " ") + " ").indexOf(check) > -1 : operator === "|=" ? result === check || result.slice(0, check.length + 1) === check + "-" : false;
};
},
"CHILD": function(type, what, _argument, first, last) {
var simple = type.slice(0, 3) !== "nth", forward = type.slice(-4) !== "last", ofType = what === "of-type";
return first === 1 && last === 0 ? function(elem) {
return !!elem.parentNode;
} : function(elem, _context, xml) {
var cache, uniqueCache, outerCache, node, nodeIndex, start2, dir2 = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), useCache = !xml && !ofType, diff = false;
if (parent) {
if (simple) {
while (dir2) {
node = elem;
while (node = node[dir2]) {
if (ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) {
return false;
}
}
start2 = dir2 = type === "only" && !start2 && "nextSibling";
}
return true;
}
start2 = [forward ? parent.firstChild : parent.lastChild];
if (forward && useCache) {
node = parent;
outerCache = node[expando] || (node[expando] = {});
uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});
cache = uniqueCache[type] || [];
nodeIndex = cache[0] === dirruns && cache[1];
diff = nodeIndex && cache[2];
node = nodeIndex && parent.childNodes[nodeIndex];
while (node = ++nodeIndex && node && node[dir2] || (diff = nodeIndex = 0) || start2.pop()) {
if (node.nodeType === 1 && ++diff && node === elem) {
uniqueCache[type] = [dirruns, nodeIndex, diff];
break;
}
}
} else {
if (useCache) {
node = elem;
outerCache = node[expando] || (node[expando] = {});
uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});
cache = uniqueCache[type] || [];
nodeIndex = cache[0] === dirruns && cache[1];
diff = nodeIndex;
}
if (diff === false) {
while (node = ++nodeIndex && node && node[dir2] || (diff = nodeIndex = 0) || start2.pop()) {
if ((ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) && ++diff) {
if (useCache) {
outerCache = node[expando] || (node[expando] = {});
uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});
uniqueCache[type] = [dirruns, diff];
}
if (node === elem) {
break;
}
}
}
}
}
diff -= last;
return diff === first || diff % first === 0 && diff / first >= 0;
}
};
},
"PSEUDO": function(pseudo, argument) {
var args, fn2 = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || Sizzle2.error("unsupported pseudo: " + pseudo);
if (fn2[expando]) {
return fn2(argument);
}
if (fn2.length > 1) {
args = [pseudo, pseudo, "", argument];
return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? markFunction(function(seed, matches2) {
var idx, matched = fn2(seed, argument), i2 = matched.length;
while (i2--) {
idx = indexOf2(seed, matched[i2]);
seed[idx] = !(matches2[idx] = matched[i2]);
}
}) : function(elem) {
return fn2(elem, 0, args);
};
}
return fn2;
}
},
pseudos: {
"not": markFunction(function(selector) {
var input = [], results = [], matcher = compile(selector.replace(rtrim2, "$1"));
return matcher[expando] ? markFunction(function(seed, matches2, _context, xml) {
var elem, unmatched = matcher(seed, null, xml, []), i2 = seed.length;
while (i2--) {
if (elem = unmatched[i2]) {
seed[i2] = !(matches2[i2] = elem);
}
}
}) : function(elem, _context, xml) {
input[0] = elem;
matcher(input, null, xml, results);
input[0] = null;
return !results.pop();
};
}),
"has": markFunction(function(selector) {
return function(elem) {
return Sizzle2(selector, elem).length > 0;
};
}),
"contains": markFunction(function(text) {
text = text.replace(runescape, funescape);
return function(elem) {
return (elem.textContent || getText(elem)).indexOf(text) > -1;
};
}),
"lang": markFunction(function(lang) {
if (!ridentifier.test(lang || "")) {
Sizzle2.error("unsupported lang: " + lang);
}
lang = lang.replace(runescape, funescape).toLowerCase();
return function(elem) {
var elemLang;
do {
if (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) {
elemLang = elemLang.toLowerCase();
return elemLang === lang || elemLang.indexOf(lang + "-") === 0;
}
} while ((elem = elem.parentNode) && elem.nodeType === 1);
return false;
};
}),
"target": function(elem) {
var hash3 = window3.location && window3.location.hash;
return hash3 && hash3.slice(1) === elem.id;
},
"root": function(elem) {
return elem === docElem;
},
"focus": function(elem) {
return elem === document3.activeElement && (!document3.hasFocus || document3.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
},
"enabled": createDisabledPseudo(false),
"disabled": createDisabledPseudo(true),
"checked": function(elem) {
var nodeName2 = elem.nodeName.toLowerCase();
return nodeName2 === "input" && !!elem.checked || nodeName2 === "option" && !!elem.selected;
},
"selected": function(elem) {
if (elem.parentNode) {
elem.parentNode.selectedIndex;
}
return elem.selected === true;
},
"empty": function(elem) {
for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
if (elem.nodeType < 6) {
return false;
}
}
return true;
},
"parent": function(elem) {
return !Expr.pseudos["empty"](elem);
},
"header": function(elem) {
return rheader.test(elem.nodeName);
},
"input": function(elem) {
return rinputs.test(elem.nodeName);
},
"button": function(elem) {
var name = elem.nodeName.toLowerCase();
return name === "input" && elem.type === "button" || name === "button";
},
"text": function(elem) {
var attr;
return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && ((attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text");
},
"first": createPositionalPseudo(function() {
return [0];
}),
"last": createPositionalPseudo(function(_matchIndexes, length) {
return [length - 1];
}),
"eq": createPositionalPseudo(function(_matchIndexes, length, argument) {
return [argument < 0 ? argument + length : argument];
}),
"even": createPositionalPseudo(function(matchIndexes, length) {
var i2 = 0;
for (; i2 < length; i2 += 2) {
matchIndexes.push(i2);
}
return matchIndexes;
}),
"odd": createPositionalPseudo(function(matchIndexes, length) {
var i2 = 1;
for (; i2 < length; i2 += 2) {
matchIndexes.push(i2);
}
return matchIndexes;
}),
"lt": createPositionalPseudo(function(matchIndexes, length, argument) {
var i2 = argument < 0 ? argument + length : argument > length ? length : argument;
for (; --i2 >= 0; ) {
matchIndexes.push(i2);
}
return matchIndexes;
}),
"gt": createPositionalPseudo(function(matchIndexes, length, argument) {
var i2 = argument < 0 ? argument + length : argument;
for (; ++i2 < length; ) {
matchIndexes.push(i2);
}
return matchIndexes;
})
}
};
Expr.pseudos["nth"] = Expr.pseudos["eq"];
for (i in { radio: true, checkbox: true, file: true, password: true, image: true }) {
Expr.pseudos[i] = createInputPseudo(i);
}
for (i in { submit: true, reset: true }) {
Expr.pseudos[i] = createButtonPseudo(i);
}
function setFilters() {
}
setFilters.prototype = Expr.filters = Expr.pseudos;
Expr.setFilters = new setFilters();
tokenize = Sizzle2.tokenize = function(selector, parseOnly) {
var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[selector + " "];
if (cached) {
return parseOnly ? 0 : cached.slice(0);
}
soFar = selector;
groups = [];
preFilters = Expr.preFilter;
while (soFar) {
if (!matched || (match = rcomma.exec(soFar))) {
if (match) {
soFar = soFar.slice(match[0].length) || soFar;
}
groups.push(tokens = []);
}
matched = false;
if (match = rcombinators.exec(soFar)) {
matched = match.shift();
tokens.push({
value: matched,
type: match[0].replace(rtrim2, " ")
});
soFar = soFar.slice(matched.length);
}
for (type in Expr.filter) {
if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || (match = preFilters[type](match)))) {
matched = match.shift();
tokens.push({
value: matched,
type,
matches: match
});
soFar = soFar.slice(matched.length);
}
}
if (!matched) {
break;
}
}
return parseOnly ? soFar.length : soFar ? Sizzle2.error(selector) : tokenCache(selector, groups).slice(0);
};
function toSelector(tokens) {
var i2 = 0, len = tokens.length, selector = "";
for (; i2 < len; i2++) {
selector += tokens[i2].value;
}
return selector;
}
function addCombinator(matcher, combinator, base) {
var dir2 = combinator.dir, skip = combinator.next, key = skip || dir2, checkNonElements = base && key === "parentNode", doneName = done++;
return combinator.first ? function(elem, context, xml) {
while (elem = elem[dir2]) {
if (elem.nodeType === 1 || checkNonElements) {
return matcher(elem, context, xml);
}
}
return false;
} : function(elem, context, xml) {
var oldCache, uniqueCache, outerCache, newCache = [dirruns, doneName];
if (xml) {
while (elem = elem[dir2]) {
if (elem.nodeType === 1 || checkNonElements) {
if (matcher(elem, context, xml)) {
return true;
}
}
}
} else {
while (elem = elem[dir2]) {
if (elem.nodeType === 1 || checkNonElements) {
outerCache = elem[expando] || (elem[expando] = {});
uniqueCache = outerCache[elem.uniqueID] || (outerCache[elem.uniqueID] = {});
if (skip && skip === elem.nodeName.toLowerCase()) {
elem = elem[dir2] || elem;
} else if ((oldCache = uniqueCache[key]) && oldCache[0] === dirruns && oldCache[1] === doneName) {
return newCache[2] = oldCache[2];
} else {
uniqueCache[key] = newCache;
if (newCache[2] = matcher(elem, context, xml)) {
return true;
}
}
}
}
}
return false;
};
}
function elementMatcher(matchers) {
return matchers.length > 1 ? function(elem, context, xml) {
var i2 = matchers.length;
while (i2--) {
if (!matchers[i2](elem, context, xml)) {
return false;
}
}
return true;
} : matchers[0];
}
function multipleContexts(selector, contexts, results) {
var i2 = 0, len = contexts.length;
for (; i2 < len; i2++) {
Sizzle2(selector, contexts[i2], results);
}
return results;
}
function condense(unmatched, map, filter, context, xml) {
var elem, newUnmatched = [], i2 = 0, len = unmatched.length, mapped = map != null;
for (; i2 < len; i2++) {
if (elem = unmatched[i2]) {
if (!filter || filter(elem, context, xml)) {
newUnmatched.push(elem);
if (mapped) {
map.push(i2);
}
}
}
}
return newUnmatched;
}
function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) {
if (postFilter && !postFilter[expando]) {
postFilter = setMatcher(postFilter);
}
if (postFinder && !postFinder[expando]) {
postFinder = setMatcher(postFinder, postSelector);
}
return markFunction(function(seed, results, context, xml) {
var temp, i2, elem, preMap = [], postMap = [], preexisting = results.length, elems = seed || multipleContexts(selector || "*", context.nodeType ? [context] : context, []), matcherIn = preFilter && (seed || !selector) ? condense(elems, preMap, preFilter, context, xml) : elems, matcherOut = matcher ? postFinder || (seed ? preFilter : preexisting || postFilter) ? [] : results : matcherIn;
if (matcher) {
matcher(matcherIn, matcherOut, context, xml);
}
if (postFilter) {
temp = condense(matcherOut, postMap);
postFilter(temp, [], context, xml);
i2 = temp.length;
while (i2--) {
if (elem = temp[i2]) {
matcherOut[postMap[i2]] = !(matcherIn[postMap[i2]] = elem);
}
}
}
if (seed) {
if (postFinder || preFilter) {
if (postFinder) {
temp = [];
i2 = matcherOut.length;
while (i2--) {
if (elem = matcherOut[i2]) {
temp.push(matcherIn[i2] = elem);
}
}
postFinder(null, matcherOut = [], temp, xml);
}
i2 = matcherOut.length;
while (i2--) {
if ((elem = matcherOut[i2]) && (temp = postFinder ? indexOf2(seed, elem) : preMap[i2]) > -1) {
seed[temp] = !(results[temp] = elem);
}
}
}
} else {
matcherOut = condense(matcherOut === results ? matcherOut.splice(preexisting, matcherOut.length) : matcherOut);
if (postFinder) {
postFinder(null, results, matcherOut, xml);
} else {
push2.apply(results, matcherOut);
}
}
});
}
function matcherFromTokens(tokens) {
var checkContext, matcher, j, len = tokens.length, leadingRelative = Expr.relative[tokens[0].type], implicitRelative = leadingRelative || Expr.relative[" "], i2 = leadingRelative ? 1 : 0, matchContext = addCombinator(function(elem) {
return elem === checkContext;
}, implicitRelative, true), matchAnyContext = addCombinator(function(elem) {
return indexOf2(checkContext, elem) > -1;
}, implicitRelative, true), matchers = [function(elem, context, xml) {
var ret = !leadingRelative && (xml || context !== outermostContext) || ((checkContext = context).nodeType ? matchContext(elem, context, xml) : matchAnyContext(elem, context, xml));
checkContext = null;
return ret;
}];
for (; i2 < len; i2++) {
if (matcher = Expr.relative[tokens[i2].type]) {
matchers = [addCombinator(elementMatcher(matchers), matcher)];
} else {
matcher = Expr.filter[tokens[i2].type].apply(null, tokens[i2].matches);
if (matcher[expando]) {
j = ++i2;
for (; j < len; j++) {
if (Expr.relative[tokens[j].type]) {
break;
}
}
return setMatcher(i2 > 1 && elementMatcher(matchers), i2 > 1 && toSelector(tokens.slice(0, i2 - 1).concat({ value: tokens[i2 - 2].type === " " ? "*" : "" })).replace(rtrim2, "$1"), matcher, i2 < j && matcherFromTokens(tokens.slice(i2, j)), j < len && matcherFromTokens(tokens = tokens.slice(j)), j < len && toSelector(tokens));
}
matchers.push(matcher);
}
}
return elementMatcher(matchers);
}
function matcherFromGroupMatchers(elementMatchers, setMatchers) {
var bySet = setMatchers.length > 0, byElement = elementMatchers.length > 0, superMatcher = function(seed, context, xml, results, outermost) {
var elem, j, matcher, matchedCount = 0, i2 = "0", unmatched = seed && [], setMatched = [], contextBackup = outermostContext, elems = seed || byElement && Expr.find["TAG"]("*", outermost), dirrunsUnique = dirruns += contextBackup == null ? 1 : Math.random() || 0.1, len = elems.length;
if (outermost) {
outermostContext = context == document3 || context || outermost;
}
for (; i2 !== len && (elem = elems[i2]) != null; i2++) {
if (byElement && elem) {
j = 0;
if (!context && elem.ownerDocument != document3) {
setDocument(elem);
xml = !documentIsHTML;
}
while (matcher = elementMatchers[j++]) {
if (matcher(elem, context || document3, xml)) {
results.push(elem);
break;
}
}
if (outermost) {
dirruns = dirrunsUnique;
}
}
if (bySet) {
if (elem = !matcher && elem) {
matchedCount--;
}
if (seed) {
unmatched.push(elem);
}
}
}
matchedCount += i2;
if (bySet && i2 !== matchedCount) {
j = 0;
while (matcher = setMatchers[j++]) {
matcher(unmatched, setMatched, context, xml);
}
if (seed) {
if (matchedCount > 0) {
while (i2--) {
if (!(unmatched[i2] || setMatched[i2])) {
setMatched[i2] = pop.call(results);
}
}
}
setMatched = condense(setMatched);
}
push2.apply(results, setMatched);
if (outermost && !seed && setMatched.length > 0 && matchedCount + setMatchers.length > 1) {
Sizzle2.uniqueSort(results);
}
}
if (outermost) {
dirruns = dirrunsUnique;
outermostContext = contextBackup;
}
return unmatched;
};
return bySet ? markFunction(superMatcher) : superMatcher;
}
compile = Sizzle2.compile = function(selector, match) {
var i2, setMatchers = [], elementMatchers = [], cached = compilerCache[selector + " "];
if (!cached) {
if (!match) {
match = tokenize(selector);
}
i2 = match.length;
while (i2--) {
cached = matcherFromTokens(match[i2]);
if (cached[expando]) {
setMatchers.push(cached);
} else {
elementMatchers.push(cached);
}
}
cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers));
cached.selector = selector;
}
return cached;
};
select = Sizzle2.select = function(selector, context, results, seed) {
var i2, tokens, token, type, find, compiled = typeof selector === "function" && selector, match = !seed && tokenize(selector = compiled.selector || selector);
results = results || [];
if (match.length === 1) {
tokens = match[0] = match[0].slice(0);
if (tokens.length > 2 && (token = tokens[0]).type === "ID" && context.nodeType === 9 && documentIsHTML && Expr.relative[tokens[1].type]) {
context = (Expr.find["ID"](token.matches[0].replace(runescape, funescape), context) || [])[0];
if (!context) {
return results;
} else if (compiled) {
context = context.parentNode;
}
selector = selector.slice(tokens.shift().value.length);
}
i2 = matchExpr["needsContext"].test(selector) ? 0 : tokens.length;
while (i2--) {
token = tokens[i2];
if (Expr.relative[type = token.type]) {
break;
}
if (find = Expr.find[type]) {
if (seed = find(token.matches[0].replace(runescape, funescape), rsibling.test(tokens[0].type) && testContext(context.parentNode) || context)) {
tokens.splice(i2, 1);
selector = seed.length && toSelector(tokens);
if (!selector) {
push2.apply(results, seed);
return results;
}
break;
}
}
}
}
(compiled || compile(selector, match))(seed, context, !documentIsHTML, results, !context || rsibling.test(selector) && testContext(context.parentNode) || context);
return results;
};
support2.sortStable = expando.split("").sort(sortOrder).join("") === expando;
support2.detectDuplicates = !!hasDuplicate;
setDocument();
support2.sortDetached = assert(function(el) {
return el.compareDocumentPosition(document3.createElement("fieldset")) & 1;
});
if (!assert(function(el) {
el.innerHTML = "<a href='#'></a>";
return el.firstChild.getAttribute("href") === "#";
})) {
addHandle("type|href|height|width", function(elem, name, isXML2) {
if (!isXML2) {
return elem.getAttribute(name, name.toLowerCase() === "type" ? 1 : 2);
}
});
}
if (!support2.attributes || !assert(function(el) {
el.innerHTML = "<input/>";
el.firstChild.setAttribute("value", "");
return el.firstChild.getAttribute("value") === "";
})) {
addHandle("value", function(elem, _name, isXML2) {
if (!isXML2 && elem.nodeName.toLowerCase() === "input") {
return elem.defaultValue;
}
});
}
if (!assert(function(el) {
return el.getAttribute("disabled") == null;
})) {
addHandle(booleans, function(elem, name, isXML2) {
var val;
if (!isXML2) {
return elem[name] === true ? name.toLowerCase() : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null;
}
});
}
return Sizzle2;
}(window2);
jQuery.find = Sizzle;
jQuery.expr = Sizzle.selectors;
jQuery.expr[":"] = jQuery.expr.pseudos;
jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
jQuery.text = Sizzle.getText;
jQuery.isXMLDoc = Sizzle.isXML;
jQuery.contains = Sizzle.contains;
jQuery.escapeSelector = Sizzle.escape;
var dir = function(elem, dir2, until) {
var matched = [], truncate = until !== void 0;
while ((elem = elem[dir2]) && elem.nodeType !== 9) {
if (elem.nodeType === 1) {
if (truncate && jQuery(elem).is(until)) {
break;
}
matched.push(elem);
}
}
return matched;
};
var siblings = function(n, elem) {
var matched = [];
for (; n; n = n.nextSibling) {
if (n.nodeType === 1 && n !== elem) {
matched.push(n);
}
}
return matched;
};
var rneedsContext = jQuery.expr.match.needsContext;
function nodeName(elem, name) {
return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
}
var rsingleTag = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;
function winnow(elements, qualifier, not) {
if (isFunction(qualifier)) {
return jQuery.grep(elements, function(elem, i) {
return !!qualifier.call(elem, i, elem) !== not;
});
}
if (qualifier.nodeType) {
return jQuery.grep(elements, function(elem) {
return elem === qualifier !== not;
});
}
if (typeof qualifier !== "string") {
return jQuery.grep(elements, function(elem) {
return indexOf.call(qualifier, elem) > -1 !== not;
});
}
return jQuery.filter(qualifier, elements, not);
}
jQuery.filter = function(expr, elems, not) {
var elem = elems[0];
if (not) {
expr = ":not(" + expr + ")";
}
if (elems.length === 1 && elem.nodeType === 1) {
return jQuery.find.matchesSelector(elem, expr) ? [elem] : [];
}
return jQuery.find.matches(expr, jQuery.grep(elems, function(elem2) {
return elem2.nodeType === 1;
}));
};
jQuery.fn.extend({
find: function(selector) {
var i, ret, len = this.length, self2 = this;
if (typeof selector !== "string") {
return this.pushStack(jQuery(selector).filter(function() {
for (i = 0; i < len; i++) {
if (jQuery.contains(self2[i], this)) {
return true;
}
}
}));
}
ret = this.pushStack([]);
for (i = 0; i < len; i++) {
jQuery.find(selector, self2[i], ret);
}
return len > 1 ? jQuery.uniqueSort(ret) : ret;
},
filter: function(selector) {
return this.pushStack(winnow(this, selector || [], false));
},
not: function(selector) {
return this.pushStack(winnow(this, selector || [], true));
},
is: function(selector) {
return !!winnow(this, typeof selector === "string" && rneedsContext.test(selector) ? jQuery(selector) : selector || [], false).length;
}
});
var rootjQuery, rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, init = jQuery.fn.init = function(selector, context, root) {
var match, elem;
if (!selector) {
return this;
}
root = root || rootjQuery;
if (typeof selector === "string") {
if (selector[0] === "<" && selector[selector.length - 1] === ">" && selector.length >= 3) {
match = [null, selector, null];
} else {
match = rquickExpr.exec(selector);
}
if (match && (match[1] || !context)) {
if (match[1]) {
context = context instanceof jQuery ? context[0] : context;
jQuery.merge(this, jQuery.parseHTML(match[1], context && context.nodeType ? context.ownerDocument || context : document2, true));
if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {
for (match in context) {
if (isFunction(this[match])) {
this[match](context[match]);
} else {
this.attr(match, context[match]);
}
}
}
return this;
} else {
elem = document2.getElementById(match[2]);
if (elem) {
this[0] = elem;
this.length = 1;
}
return this;
}
} else if (!context || context.jquery) {
return (context || root).find(selector);
} else {
return this.constructor(context).find(selector);
}
} else if (selector.nodeType) {
this[0] = selector;
this.length = 1;
return this;
} else if (isFunction(selector)) {
return root.ready !== void 0 ? root.ready(selector) : selector(jQuery);
}
return jQuery.makeArray(selector, this);
};
init.prototype = jQuery.fn;
rootjQuery = jQuery(document2);
var rparentsprev = /^(?:parents|prev(?:Until|All))/, guaranteedUnique = {
children: true,
contents: true,
next: true,
prev: true
};
jQuery.fn.extend({
has: function(target) {
var targets = jQuery(target, this), l = targets.length;
return this.filter(function() {
var i = 0;
for (; i < l; i++) {
if (jQuery.contains(this, targets[i])) {
return true;
}
}
});
},
closest: function(selectors, context) {
var cur, i = 0, l = this.length, matched = [], targets = typeof selectors !== "string" && jQuery(selectors);
if (!rneedsContext.test(selectors)) {
for (; i < l; i++) {
for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) {
if (cur.nodeType < 11 && (targets ? targets.index(cur) > -1 : cur.nodeType === 1 && jQuery.find.matchesSelector(cur, selectors))) {
matched.push(cur);
break;
}
}
}
}
return this.pushStack(matched.length > 1 ? jQuery.uniqueSort(matched) : matched);
},
index: function(elem) {
if (!elem) {
return this[0] && this[0].parentNode ? this.first().prevAll().length : -1;
}
if (typeof elem === "string") {
return indexOf.call(jQuery(elem), this[0]);
}
return indexOf.call(this, elem.jquery ? elem[0] : elem);
},
add: function(selector, context) {
return this.pushStack(jQuery.uniqueSort(jQuery.merge(this.get(), jQuery(selector, context))));
},
addBack: function(selector) {
return this.add(selector == null ? this.prevObject : this.prevObject.filter(selector));
}
});
function sibling(cur, dir2) {
while ((cur = cur[dir2]) && cur.nodeType !== 1) {
}
return cur;
}
jQuery.each({
parent: function(elem) {
var parent = elem.parentNode;
return parent && parent.nodeType !== 11 ? parent : null;
},
parents: function(elem) {
return dir(elem, "parentNode");
},
parentsUntil: function(elem, _i, until) {
return dir(elem, "parentNode", until);
},
next: function(elem) {
return sibling(elem, "nextSibling");
},
prev: function(elem) {
return sibling(elem, "previousSibling");
},
nextAll: function(elem) {
return dir(elem, "nextSibling");
},
prevAll: function(elem) {
return dir(elem, "previousSibling");
},
nextUntil: function(elem, _i, until) {
return dir(elem, "nextSibling", until);
},
prevUntil: function(elem, _i, until) {
return dir(elem, "previousSibling", until);
},
siblings: function(elem) {
return siblings((elem.parentNode || {}).firstChild, elem);
},
children: function(elem) {
return siblings(elem.firstChild);
},
contents: function(elem) {
if (elem.contentDocument != null && getProto(elem.contentDocument)) {
return elem.contentDocument;
}
if (nodeName(elem, "template")) {
elem = elem.content || elem;
}
return jQuery.merge([], elem.childNodes);
}
}, function(name, fn2) {
jQuery.fn[name] = function(until, selector) {
var matched = jQuery.map(this, fn2, until);
if (name.slice(-5) !== "Until") {
selector = until;
}
if (selector && typeof selector === "string") {
matched = jQuery.filter(selector, matched);
}
if (this.length > 1) {
if (!guaranteedUnique[name]) {
jQuery.uniqueSort(matched);
}
if (rparentsprev.test(name)) {
matched.reverse();
}
}
return this.pushStack(matched);
};
});
var rnothtmlwhite = /[^\x20\t\r\n\f]+/g;
function createOptions(options) {
var object = {};
jQuery.each(options.match(rnothtmlwhite) || [], function(_, flag) {
object[flag] = true;
});
return object;
}
jQuery.Callbacks = function(options) {
options = typeof options === "string" ? createOptions(options) : jQuery.extend({}, options);
var firing, memory, fired, locked, list = [], queue = [], firingIndex = -1, fire = function() {
locked = locked || options.once;
fired = firing = true;
for (; queue.length; firingIndex = -1) {
memory = queue.shift();
while (++firingIndex < list.length) {
if (list[firingIndex].apply(memory[0], memory[1]) === false && options.stopOnFalse) {
firingIndex = list.length;
memory = false;
}
}
}
if (!options.memory) {
memory = false;
}
firing = false;
if (locked) {
if (memory) {
list = [];
} else {
list = "";
}
}
}, self2 = {
add: function() {
if (list) {
if (memory && !firing) {
firingIndex = list.length - 1;
queue.push(memory);
}
(function add(args) {
jQuery.each(args, function(_, arg) {
if (isFunction(arg)) {
if (!options.unique || !self2.has(arg)) {
list.push(arg);
}
} else if (arg && arg.length && toType2(arg) !== "string") {
add(arg);
}
});
})(arguments);
if (memory && !firing) {
fire();
}
}
return this;
},
remove: function() {
jQuery.each(arguments, function(_, arg) {
var index;
while ((index = jQuery.inArray(arg, list, index)) > -1) {
list.splice(index, 1);
if (index <= firingIndex) {
firingIndex--;
}
}
});
return this;
},
has: function(fn2) {
return fn2 ? jQuery.inArray(fn2, list) > -1 : list.length > 0;
},
empty: function() {
if (list) {
list = [];
}
return this;
},
disable: function() {
locked = queue = [];
list = memory = "";
return this;
},
disabled: function() {
return !list;
},
lock: function() {
locked = queue = [];
if (!memory && !firing) {
list = memory = "";
}
return this;
},
locked: function() {
return !!locked;
},
fireWith: function(context, args) {
if (!locked) {
args = args || [];
args = [context, args.slice ? args.slice() : args];
queue.push(args);
if (!firing) {
fire();
}
}
return this;
},
fire: function() {
self2.fireWith(this, arguments);
return this;
},
fired: function() {
return !!fired;
}
};
return self2;
};
function Identity(v) {
return v;
}
function Thrower(ex) {
throw ex;
}
function adoptValue(value, resolve, reject, noValue) {
var method;
try {
if (value && isFunction(method = value.promise)) {
method.call(value).done(resolve).fail(reject);
} else if (value && isFunction(method = value.then)) {
method.call(value, resolve, reject);
} else {
resolve.apply(void 0, [value].slice(noValue));
}
} catch (value2) {
reject.apply(void 0, [value2]);
}
}
jQuery.extend({
Deferred: function(func) {
var tuples = [
[
"notify",
"progress",
jQuery.Callbacks("memory"),
jQuery.Callbacks("memory"),
2
],
[
"resolve",
"done",
jQuery.Callbacks("once memory"),
jQuery.Callbacks("once memory"),
0,
"resolved"
],
[
"reject",
"fail",
jQuery.Callbacks("once memory"),
jQuery.Callbacks("once memory"),
1,
"rejected"
]
], state = "pending", promise = {
state: function() {
return state;
},
always: function() {
deferred.done(arguments).fail(arguments);
return this;
},
"catch": function(fn2) {
return promise.then(null, fn2);
},
pipe: function() {
var fns = arguments;
return jQuery.Deferred(function(newDefer) {
jQuery.each(tuples, function(_i, tuple) {
var fn2 = isFunction(fns[tuple[4]]) && fns[tuple[4]];
deferred[tuple[1]](function() {
var returned = fn2 && fn2.apply(this, arguments);
if (returned && isFunction(returned.promise)) {
returned.promise().progress(newDefer.notify).done(newDefer.resolve).fail(newDefer.reject);
} else {
newDefer[tuple[0] + "With"](this, fn2 ? [returned] : arguments);
}
});
});
fns = null;
}).promise();
},
then: function(onFulfilled, onRejected, onProgress) {
var maxDepth = 0;
function resolve(depth, deferred2, handler, special) {
return function() {
var that = this, args = arguments, mightThrow = function() {
var returned, then;
if (depth < maxDepth) {
return;
}
returned = handler.apply(that, args);
if (returned === deferred2.promise()) {
throw new TypeError("Thenable self-resolution");
}
then = returned && (typeof returned === "object" || typeof returned === "function") && returned.then;
if (isFunction(then)) {
if (special) {
then.call(returned, resolve(maxDepth, deferred2, Identity, special), resolve(maxDepth, deferred2, Thrower, special));
} else {
maxDepth++;
then.call(returned, resolve(maxDepth, deferred2, Identity, special), resolve(maxDepth, deferred2, Thrower, special), resolve(maxDepth, deferred2, Identity, deferred2.notifyWith));
}
} else {
if (handler !== Identity) {
that = void 0;
args = [returned];
}
(special || deferred2.resolveWith)(that, args);
}
}, process2 = special ? mightThrow : function() {
try {
mightThrow();
} catch (e) {
if (jQuery.Deferred.exceptionHook) {
jQuery.Deferred.exceptionHook(e, process2.stackTrace);
}
if (depth + 1 >= maxDepth) {
if (handler !== Thrower) {
that = void 0;
args = [e];
}
deferred2.rejectWith(that, args);
}
}
};
if (depth) {
process2();
} else {
if (jQuery.Deferred.getStackHook) {
process2.stackTrace = jQuery.Deferred.getStackHook();
}
window2.setTimeout(process2);
}
};
}
return jQuery.Deferred(function(newDefer) {
tuples[0][3].add(resolve(0, newDefer, isFunction(onProgress) ? onProgress : Identity, newDefer.notifyWith));
tuples[1][3].add(resolve(0, newDefer, isFunction(onFulfilled) ? onFulfilled : Identity));
tuples[2][3].add(resolve(0, newDefer, isFunction(onRejected) ? onRejected : Thrower));
}).promise();
},
promise: function(obj) {
return obj != null ? jQuery.extend(obj, promise) : promise;
}
}, deferred = {};
jQuery.each(tuples, function(i, tuple) {
var list = tuple[2], stateString = tuple[5];
promise[tuple[1]] = list.add;
if (stateString) {
list.add(function() {
state = stateString;
}, tuples[3 - i][2].disable, tuples[3 - i][3].disable, tuples[0][2].lock, tuples[0][3].lock);
}
list.add(tuple[3].fire);
deferred[tuple[0]] = function() {
deferred[tuple[0] + "With"](this === deferred ? void 0 : this, arguments);
return this;
};
deferred[tuple[0] + "With"] = list.fireWith;
});
promise.promise(deferred);
if (func) {
func.call(deferred, deferred);
}
return deferred;
},
when: function(singleValue) {
var remaining = arguments.length, i = remaining, resolveContexts = Array(i), resolveValues = slice.call(arguments), primary = jQuery.Deferred(), updateFunc = function(i2) {
return function(value) {
resolveContexts[i2] = this;
resolveValues[i2] = arguments.length > 1 ? slice.call(arguments) : value;
if (!--remaining) {
primary.resolveWith(resolveContexts, resolveValues);
}
};
};
if (remaining <= 1) {
adoptValue(singleValue, primary.done(updateFunc(i)).resolve, primary.reject, !remaining);
if (primary.state() === "pending" || isFunction(resolveValues[i] && resolveValues[i].then)) {
return primary.then();
}
}
while (i--) {
adoptValue(resolveValues[i], updateFunc(i), primary.reject);
}
return primary.promise();
}
});
var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
jQuery.Deferred.exceptionHook = function(error, stack) {
if (window2.console && window2.console.warn && error && rerrorNames.test(error.name)) {
window2.console.warn("jQuery.Deferred exception: " + error.message, error.stack, stack);
}
};
jQuery.readyException = function(error) {
window2.setTimeout(function() {
throw error;
});
};
var readyList = jQuery.Deferred();
jQuery.fn.ready = function(fn2) {
readyList.then(fn2).catch(function(error) {
jQuery.readyException(error);
});
return this;
};
jQuery.extend({
isReady: false,
readyWait: 1,
ready: function(wait) {
if (wait === true ? --jQuery.readyWait : jQuery.isReady) {
return;
}
jQuery.isReady = true;
if (wait !== true && --jQuery.readyWait > 0) {
return;
}
readyList.resolveWith(document2, [jQuery]);
}
});
jQuery.ready.then = readyList.then;
function completed() {
document2.removeEventListener("DOMContentLoaded", completed);
window2.removeEventListener("load", completed);
jQuery.ready();
}
if (document2.readyState === "complete" || document2.readyState !== "loading" && !document2.documentElement.doScroll) {
window2.setTimeout(jQuery.ready);
} else {
document2.addEventListener("DOMContentLoaded", completed);
window2.addEventListener("load", completed);
}
var access = function(elems, fn2, key, value, chainable, emptyGet, raw) {
var i = 0, len = elems.length, bulk = key == null;
if (toType2(key) === "object") {
chainable = true;
for (i in key) {
access(elems, fn2, i, key[i], true, emptyGet, raw);
}
} else if (value !== void 0) {
chainable = true;
if (!isFunction(value)) {
raw = true;
}
if (bulk) {
if (raw) {
fn2.call(elems, value);
fn2 = null;
} else {
bulk = fn2;
fn2 = function(elem, _key, value2) {
return bulk.call(jQuery(elem), value2);
};
}
}
if (fn2) {
for (; i < len; i++) {
fn2(elems[i], key, raw ? value : value.call(elems[i], i, fn2(elems[i], key)));
}
}
}
if (chainable) {
return elems;
}
if (bulk) {
return fn2.call(elems);
}
return len ? fn2(elems[0], key) : emptyGet;
};
var rmsPrefix = /^-ms-/, rdashAlpha = /-([a-z])/g;
function fcamelCase(_all, letter) {
return letter.toUpperCase();
}
function camelCase(string) {
return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase);
}
var acceptData = function(owner) {
return owner.nodeType === 1 || owner.nodeType === 9 || !+owner.nodeType;
};
function Data2() {
this.expando = jQuery.expando + Data2.uid++;
}
Data2.uid = 1;
Data2.prototype = {
cache: function(owner) {
var value = owner[this.expando];
if (!value) {
value = {};
if (acceptData(owner)) {
if (owner.nodeType) {
owner[this.expando] = value;
} else {
Object.defineProperty(owner, this.expando, {
value,
configurable: true
});
}
}
}
return value;
},
set: function(owner, data, value) {
var prop, cache = this.cache(owner);
if (typeof data === "string") {
cache[camelCase(data)] = value;
} else {
for (prop in data) {
cache[camelCase(prop)] = data[prop];
}
}
return cache;
},
get: function(owner, key) {
return key === void 0 ? this.cache(owner) : owner[this.expando] && owner[this.expando][camelCase(key)];
},
access: function(owner, key, value) {
if (key === void 0 || key && typeof key === "string" && value === void 0) {
return this.get(owner, key);
}
this.set(owner, key, value);
return value !== void 0 ? value : key;
},
remove: function(owner, key) {
var i, cache = owner[this.expando];
if (cache === void 0) {
return;
}
if (key !== void 0) {
if (Array.isArray(key)) {
key = key.map(camelCase);
} else {
key = camelCase(key);
key = key in cache ? [key] : key.match(rnothtmlwhite) || [];
}
i = key.length;
while (i--) {
delete cache[key[i]];
}
}
if (key === void 0 || jQuery.isEmptyObject(cache)) {
if (owner.nodeType) {
owner[this.expando] = void 0;
} else {
delete owner[this.expando];
}
}
},
hasData: function(owner) {
var cache = owner[this.expando];
return cache !== void 0 && !jQuery.isEmptyObject(cache);
}
};
var dataPriv = new Data2();
var dataUser = new Data2();
var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, rmultiDash = /[A-Z]/g;
function getData(data) {
if (data === "true") {
return true;
}
if (data === "false") {
return false;
}
if (data === "null") {
return null;
}
if (data === +data + "") {
return +data;
}
if (rbrace.test(data)) {
return JSON.parse(data);
}
return data;
}
function dataAttr(elem, key, data) {
var name;
if (data === void 0 && elem.nodeType === 1) {
name = "data-" + key.replace(rmultiDash, "-$&").toLowerCase();
data = elem.getAttribute(name);
if (typeof data === "string") {
try {
data = getData(data);
} catch (e) {
}
dataUser.set(elem, key, data);
} else {
data = void 0;
}
}
return data;
}
jQuery.extend({
hasData: function(elem) {
return dataUser.hasData(elem) || dataPriv.hasData(elem);
},
data: function(elem, name, data) {
return dataUser.access(elem, name, data);
},
removeData: function(elem, name) {
dataUser.remove(elem, name);
},
_data: function(elem, name, data) {
return dataPriv.access(elem, name, data);
},
_removeData: function(elem, name) {
dataPriv.remove(elem, name);
}
});
jQuery.fn.extend({
data: function(key, value) {
var i, name, data, elem = this[0], attrs = elem && elem.attributes;
if (key === void 0) {
if (this.length) {
data = dataUser.get(elem);
if (elem.nodeType === 1 && !dataPriv.get(elem, "hasDataAttrs")) {
i = attrs.length;
while (i--) {
if (attrs[i]) {
name = attrs[i].name;
if (name.indexOf("data-") === 0) {
name = camelCase(name.slice(5));
dataAttr(elem, name, data[name]);
}
}
}
dataPriv.set(elem, "hasDataAttrs", true);
}
}
return data;
}
if (typeof key === "object") {
return this.each(function() {
dataUser.set(this, key);
});
}
return access(this, function(value2) {
var data2;
if (elem && value2 === void 0) {
data2 = dataUser.get(elem, key);
if (data2 !== void 0) {
return data2;
}
data2 = dataAttr(elem, key);
if (data2 !== void 0) {
return data2;
}
return;
}
this.each(function() {
dataUser.set(this, key, value2);
});
}, null, value, arguments.length > 1, null, true);
},
removeData: function(key) {
return this.each(function() {
dataUser.remove(this, key);
});
}
});
jQuery.extend({
queue: function(elem, type, data) {
var queue;
if (elem) {
type = (type || "fx") + "queue";
queue = dataPriv.get(elem, type);
if (data) {
if (!queue || Array.isArray(data)) {
queue = dataPriv.access(elem, type, jQuery.makeArray(data));
} else {
queue.push(data);
}
}
return queue || [];
}
},
dequeue: function(elem, type) {
type = type || "fx";
var queue = jQuery.queue(elem, type), startLength = queue.length, fn2 = queue.shift(), hooks = jQuery._queueHooks(elem, type), next = function() {
jQuery.dequeue(elem, type);
};
if (fn2 === "inprogress") {
fn2 = queue.shift();
startLength--;
}
if (fn2) {
if (type === "fx") {
queue.unshift("inprogress");
}
delete hooks.stop;
fn2.call(elem, next, hooks);
}
if (!startLength && hooks) {
hooks.empty.fire();
}
},
_queueHooks: function(elem, type) {
var key = type + "queueHooks";
return dataPriv.get(elem, key) || dataPriv.access(elem, key, {
empty: jQuery.Callbacks("once memory").add(function() {
dataPriv.remove(elem, [type + "queue", key]);
})
});
}
});
jQuery.fn.extend({
queue: function(type, data) {
var setter = 2;
if (typeof type !== "string") {
data = type;
type = "fx";
setter--;
}
if (arguments.length < setter) {
return jQuery.queue(this[0], type);
}
return data === void 0 ? this : this.each(function() {
var queue = jQuery.queue(this, type, data);
jQuery._queueHooks(this, type);
if (type === "fx" && queue[0] !== "inprogress") {
jQuery.dequeue(this, type);
}
});
},
dequeue: function(type) {
return this.each(function() {
jQuery.dequeue(this, type);
});
},
clearQueue: function(type) {
return this.queue(type || "fx", []);
},
promise: function(type, obj) {
var tmp, count = 1, defer = jQuery.Deferred(), elements = this, i = this.length, resolve = function() {
if (!--count) {
defer.resolveWith(elements, [elements]);
}
};
if (typeof type !== "string") {
obj = type;
type = void 0;
}
type = type || "fx";
while (i--) {
tmp = dataPriv.get(elements[i], type + "queueHooks");
if (tmp && tmp.empty) {
count++;
tmp.empty.add(resolve);
}
}
resolve();
return defer.promise(obj);
}
});
var pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source;
var rcssNum = new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i");
var cssExpand = ["Top", "Right", "Bottom", "Left"];
var documentElement = document2.documentElement;
var isAttached = function(elem) {
return jQuery.contains(elem.ownerDocument, elem);
}, composed = { composed: true };
if (documentElement.getRootNode) {
isAttached = function(elem) {
return jQuery.contains(elem.ownerDocument, elem) || elem.getRootNode(composed) === elem.ownerDocument;
};
}
var isHiddenWithinTree = function(elem, el) {
elem = el || elem;
return elem.style.display === "none" || elem.style.display === "" && isAttached(elem) && jQuery.css(elem, "display") === "none";
};
function adjustCSS(elem, prop, valueParts, tween) {
var adjusted, scale, maxIterations = 20, currentValue = tween ? function() {
return tween.cur();
} : function() {
return jQuery.css(elem, prop, "");
}, initial = currentValue(), unit = valueParts && valueParts[3] || (jQuery.cssNumber[prop] ? "" : "px"), initialInUnit = elem.nodeType && (jQuery.cssNumber[prop] || unit !== "px" && +initial) && rcssNum.exec(jQuery.css(elem, prop));
if (initialInUnit && initialInUnit[3] !== unit) {
initial = initial / 2;
unit = unit || initialInUnit[3];
initialInUnit = +initial || 1;
while (maxIterations--) {
jQuery.style(elem, prop, initialInUnit + unit);
if ((1 - scale) * (1 - (scale = currentValue() / initial || 0.5)) <= 0) {
maxIterations = 0;
}
initialInUnit = initialInUnit / scale;
}
initialInUnit = initialInUnit * 2;
jQuery.style(elem, prop, initialInUnit + unit);
valueParts = valueParts || [];
}
if (valueParts) {
initialInUnit = +initialInUnit || +initial || 0;
adjusted = valueParts[1] ? initialInUnit + (valueParts[1] + 1) * valueParts[2] : +valueParts[2];
if (tween) {
tween.unit = unit;
tween.start = initialInUnit;
tween.end = adjusted;
}
}
return adjusted;
}
var defaultDisplayMap = {};
function getDefaultDisplay(elem) {
var temp, doc2 = elem.ownerDocument, nodeName2 = elem.nodeName, display = defaultDisplayMap[nodeName2];
if (display) {
return display;
}
temp = doc2.body.appendChild(doc2.createElement(nodeName2));
display = jQuery.css(temp, "display");
temp.parentNode.removeChild(temp);
if (display === "none") {
display = "block";
}
defaultDisplayMap[nodeName2] = display;
return display;
}
function showHide(elements, show) {
var display, elem, values = [], index = 0, length = elements.length;
for (; index < length; index++) {
elem = elements[index];
if (!elem.style) {
continue;
}
display = elem.style.display;
if (show) {
if (display === "none") {
values[index] = dataPriv.get(elem, "display") || null;
if (!values[index]) {
elem.style.display = "";
}
}
if (elem.style.display === "" && isHiddenWithinTree(elem)) {
values[index] = getDefaultDisplay(elem);
}
} else {
if (display !== "none") {
values[index] = "none";
dataPriv.set(elem, "display", display);
}
}
}
for (index = 0; index < length; index++) {
if (values[index] != null) {
elements[index].style.display = values[index];
}
}
return elements;
}
jQuery.fn.extend({
show: function() {
return showHide(this, true);
},
hide: function() {
return showHide(this);
},
toggle: function(state) {
if (typeof state === "boolean") {
return state ? this.show() : this.hide();
}
return this.each(function() {
if (isHiddenWithinTree(this)) {
jQuery(this).show();
} else {
jQuery(this).hide();
}
});
}
});
var rcheckableType = /^(?:checkbox|radio)$/i;
var rtagName = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i;
var rscriptType = /^$|^module$|\/(?:java|ecma)script/i;
(function() {
var fragment = document2.createDocumentFragment(), div = fragment.appendChild(document2.createElement("div")), input = document2.createElement("input");
input.setAttribute("type", "radio");
input.setAttribute("checked", "checked");
input.setAttribute("name", "t");
div.appendChild(input);
support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked;
div.innerHTML = "<textarea>x</textarea>";
support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue;
div.innerHTML = "<option></option>";
support.option = !!div.lastChild;
})();
var wrapMap = {
thead: [1, "<table>", "</table>"],
col: [2, "<table><colgroup>", "</colgroup></table>"],
tr: [2, "<table><tbody>", "</tbody></table>"],
td: [3, "<table><tbody><tr>", "</tr></tbody></table>"],
_default: [0, "", ""]
};
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
wrapMap.th = wrapMap.td;
if (!support.option) {
wrapMap.optgroup = wrapMap.option = [1, "<select multiple='multiple'>", "</select>"];
}
function getAll(context, tag) {
var ret;
if (typeof context.getElementsByTagName !== "undefined") {
ret = context.getElementsByTagName(tag || "*");
} else if (typeof context.querySelectorAll !== "undefined") {
ret = context.querySelectorAll(tag || "*");
} else {
ret = [];
}
if (tag === void 0 || tag && nodeName(context, tag)) {
return jQuery.merge([context], ret);
}
return ret;
}
function setGlobalEval(elems, refElements) {
var i = 0, l = elems.length;
for (; i < l; i++) {
dataPriv.set(elems[i], "globalEval", !refElements || dataPriv.get(refElements[i], "globalEval"));
}
}
var rhtml = /<|&#?\w+;/;
function buildFragment(elems, context, scripts, selection, ignored) {
var elem, tmp, tag, wrap, attached, j, fragment = context.createDocumentFragment(), nodes = [], i = 0, l = elems.length;
for (; i < l; i++) {
elem = elems[i];
if (elem || elem === 0) {
if (toType2(elem) === "object") {
jQuery.merge(nodes, elem.nodeType ? [elem] : elem);
} else if (!rhtml.test(elem)) {
nodes.push(context.createTextNode(elem));
} else {
tmp = tmp || fragment.appendChild(context.createElement("div"));
tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase();
wrap = wrapMap[tag] || wrapMap._default;
tmp.innerHTML = wrap[1] + jQuery.htmlPrefilter(elem) + wrap[2];
j = wrap[0];
while (j--) {
tmp = tmp.lastChild;
}
jQuery.merge(nodes, tmp.childNodes);
tmp = fragment.firstChild;
tmp.textContent = "";
}
}
}
fragment.textContent = "";
i = 0;
while (elem = nodes[i++]) {
if (selection && jQuery.inArray(elem, selection) > -1) {
if (ignored) {
ignored.push(elem);
}
continue;
}
attached = isAttached(elem);
tmp = getAll(fragment.appendChild(elem), "script");
if (attached) {
setGlobalEval(tmp);
}
if (scripts) {
j = 0;
while (elem = tmp[j++]) {
if (rscriptType.test(elem.type || "")) {
scripts.push(elem);
}
}
}
}
return fragment;
}
var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
function returnTrue() {
return true;
}
function returnFalse() {
return false;
}
function expectSync(elem, type) {
return elem === safeActiveElement() === (type === "focus");
}
function safeActiveElement() {
try {
return document2.activeElement;
} catch (err) {
}
}
function on(elem, types, selector, data, fn2, one) {
var origFn, type;
if (typeof types === "object") {
if (typeof selector !== "string") {
data = data || selector;
selector = void 0;
}
for (type in types) {
on(elem, type, selector, data, types[type], one);
}
return elem;
}
if (data == null && fn2 == null) {
fn2 = selector;
data = selector = void 0;
} else if (fn2 == null) {
if (typeof selector === "string") {
fn2 = data;
data = void 0;
} else {
fn2 = data;
data = selector;
selector = void 0;
}
}
if (fn2 === false) {
fn2 = returnFalse;
} else if (!fn2) {
return elem;
}
if (one === 1) {
origFn = fn2;
fn2 = function(event) {
jQuery().off(event);
return origFn.apply(this, arguments);
};
fn2.guid = origFn.guid || (origFn.guid = jQuery.guid++);
}
return elem.each(function() {
jQuery.event.add(this, types, fn2, data, selector);
});
}
jQuery.event = {
global: {},
add: function(elem, types, handler, data, selector) {
var handleObjIn, eventHandle, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = dataPriv.get(elem);
if (!acceptData(elem)) {
return;
}
if (handler.handler) {
handleObjIn = handler;
handler = handleObjIn.handler;
selector = handleObjIn.selector;
}
if (selector) {
jQuery.find.matchesSelector(documentElement, selector);
}
if (!handler.guid) {
handler.guid = jQuery.guid++;
}
if (!(events = elemData.events)) {
events = elemData.events = /* @__PURE__ */ Object.create(null);
}
if (!(eventHandle = elemData.handle)) {
eventHandle = elemData.handle = function(e) {
return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? jQuery.event.dispatch.apply(elem, arguments) : void 0;
};
}
types = (types || "").match(rnothtmlwhite) || [""];
t = types.length;
while (t--) {
tmp = rtypenamespace.exec(types[t]) || [];
type = origType = tmp[1];
namespaces = (tmp[2] || "").split(".").sort();
if (!type) {
continue;
}
special = jQuery.event.special[type] || {};
type = (selector ? special.delegateType : special.bindType) || type;
special = jQuery.event.special[type] || {};
handleObj = jQuery.extend({
type,
origType,
data,
handler,
guid: handler.guid,
selector,
needsContext: selector && jQuery.expr.match.needsContext.test(selector),
namespace: namespaces.join(".")
}, handleObjIn);
if (!(handlers = events[type])) {
handlers = events[type] = [];
handlers.delegateCount = 0;
if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) {
if (elem.addEventListener) {
elem.addEventListener(type, eventHandle);
}
}
}
if (special.add) {
special.add.call(elem, handleObj);
if (!handleObj.handler.guid) {
handleObj.handler.guid = handler.guid;
}
}
if (selector) {
handlers.splice(handlers.delegateCount++, 0, handleObj);
} else {
handlers.push(handleObj);
}
jQuery.event.global[type] = true;
}
},
remove: function(elem, types, handler, selector, mappedTypes) {
var j, origCount, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = dataPriv.hasData(elem) && dataPriv.get(elem);
if (!elemData || !(events = elemData.events)) {
return;
}
types = (types || "").match(rnothtmlwhite) || [""];
t = types.length;
while (t--) {
tmp = rtypenamespace.exec(types[t]) || [];
type = origType = tmp[1];
namespaces = (tmp[2] || "").split(".").sort();
if (!type) {
for (type in events) {
jQuery.event.remove(elem, type + types[t], handler, selector, true);
}
continue;
}
special = jQuery.event.special[type] || {};
type = (selector ? special.delegateType : special.bindType) || type;
handlers = events[type] || [];
tmp = tmp[2] && new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)");
origCount = j = handlers.length;
while (j--) {
handleObj = handlers[j];
if ((mappedTypes || origType === handleObj.origType) && (!handler || handler.guid === handleObj.guid) && (!tmp || tmp.test(handleObj.namespace)) && (!selector || selector === handleObj.selector || selector === "**" && handleObj.selector)) {
handlers.splice(j, 1);
if (handleObj.selector) {
handlers.delegateCount--;
}
if (special.remove) {
special.remove.call(elem, handleObj);
}
}
}
if (origCount && !handlers.length) {
if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) {
jQuery.removeEvent(elem, type, elemData.handle);
}
delete events[type];
}
}
if (jQuery.isEmptyObject(events)) {
dataPriv.remove(elem, "handle events");
}
},
dispatch: function(nativeEvent) {
var i, j, ret, matched, handleObj, handlerQueue, args = new Array(arguments.length), event = jQuery.event.fix(nativeEvent), handlers = (dataPriv.get(this, "events") || /* @__PURE__ */ Object.create(null))[event.type] || [], special = jQuery.event.special[event.type] || {};
args[0] = event;
for (i = 1; i < arguments.length; i++) {
args[i] = arguments[i];
}
event.delegateTarget = this;
if (special.preDispatch && special.preDispatch.call(this, event) === false) {
return;
}
handlerQueue = jQuery.event.handlers.call(this, event, handlers);
i = 0;
while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) {
event.currentTarget = matched.elem;
j = 0;
while ((handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped()) {
if (!event.rnamespace || handleObj.namespace === false || event.rnamespace.test(handleObj.namespace)) {
event.handleObj = handleObj;
event.data = handleObj.data;
ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler).apply(matched.elem, args);
if (ret !== void 0) {
if ((event.result = ret) === false) {
event.preventDefault();
event.stopPropagation();
}
}
}
}
}
if (special.postDispatch) {
special.postDispatch.call(this, event);
}
return event.result;
},
handlers: function(event, handlers) {
var i, handleObj, sel, matchedHandlers, matchedSelectors, handlerQueue = [], delegateCount = handlers.delegateCount, cur = event.target;
if (delegateCount && cur.nodeType && !(event.type === "click" && event.button >= 1)) {
for (; cur !== this; cur = cur.parentNode || this) {
if (cur.nodeType === 1 && !(event.type === "click" && cur.disabled === true)) {
matchedHandlers = [];
matchedSelectors = {};
for (i = 0; i < delegateCount; i++) {
handleObj = handlers[i];
sel = handleObj.selector + " ";
if (matchedSelectors[sel] === void 0) {
matchedSelectors[sel] = handleObj.needsContext ? jQuery(sel, this).index(cur) > -1 : jQuery.find(sel, this, null, [cur]).length;
}
if (matchedSelectors[sel]) {
matchedHandlers.push(handleObj);
}
}
if (matchedHandlers.length) {
handlerQueue.push({ elem: cur, handlers: matchedHandlers });
}
}
}
}
cur = this;
if (delegateCount < handlers.length) {
handlerQueue.push({ elem: cur, handlers: handlers.slice(delegateCount) });
}
return handlerQueue;
},
addProp: function(name, hook) {
Object.defineProperty(jQuery.Event.prototype, name, {
enumerable: true,
configurable: true,
get: isFunction(hook) ? function() {
if (this.originalEvent) {
return hook(this.originalEvent);
}
} : function() {
if (this.originalEvent) {
return this.originalEvent[name];
}
},
set: function(value) {
Object.defineProperty(this, name, {
enumerable: true,
configurable: true,
writable: true,
value
});
}
});
},
fix: function(originalEvent) {
return originalEvent[jQuery.expando] ? originalEvent : new jQuery.Event(originalEvent);
},
special: {
load: {
noBubble: true
},
click: {
setup: function(data) {
var el = this || data;
if (rcheckableType.test(el.type) && el.click && nodeName(el, "input")) {
leverageNative(el, "click", returnTrue);
}
return false;
},
trigger: function(data) {
var el = this || data;
if (rcheckableType.test(el.type) && el.click && nodeName(el, "input")) {
leverageNative(el, "click");
}
return true;
},
_default: function(event) {
var target = event.target;
return rcheckableType.test(target.type) && target.click && nodeName(target, "input") && dataPriv.get(target, "click") || nodeName(target, "a");
}
},
beforeunload: {
postDispatch: function(event) {
if (event.result !== void 0 && event.originalEvent) {
event.originalEvent.returnValue = event.result;
}
}
}
}
};
function leverageNative(el, type, expectSync2) {
if (!expectSync2) {
if (dataPriv.get(el, type) === void 0) {
jQuery.event.add(el, type, returnTrue);
}
return;
}
dataPriv.set(el, type, false);
jQuery.event.add(el, type, {
namespace: false,
handler: function(event) {
var notAsync, result, saved = dataPriv.get(this, type);
if (event.isTrigger & 1 && this[type]) {
if (!saved.length) {
saved = slice.call(arguments);
dataPriv.set(this, type, saved);
notAsync = expectSync2(this, type);
this[type]();
result = dataPriv.get(this, type);
if (saved !== result || notAsync) {
dataPriv.set(this, type, false);
} else {
result = {};
}
if (saved !== result) {
event.stopImmediatePropagation();
event.preventDefault();
return result && result.value;
}
} else if ((jQuery.event.special[type] || {}).delegateType) {
event.stopPropagation();
}
} else if (saved.length) {
dataPriv.set(this, type, {
value: jQuery.event.trigger(jQuery.extend(saved[0], jQuery.Event.prototype), saved.slice(1), this)
});
event.stopImmediatePropagation();
}
}
});
}
jQuery.removeEvent = function(elem, type, handle) {
if (elem.removeEventListener) {
elem.removeEventListener(type, handle);
}
};
jQuery.Event = function(src, props) {
if (!(this instanceof jQuery.Event)) {
return new jQuery.Event(src, props);
}
if (src && src.type) {
this.originalEvent = src;
this.type = src.type;
this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === void 0 && src.returnValue === false ? returnTrue : returnFalse;
this.target = src.target && src.target.nodeType === 3 ? src.target.parentNode : src.target;
this.currentTarget = src.currentTarget;
this.relatedTarget = src.relatedTarget;
} else {
this.type = src;
}
if (props) {
jQuery.extend(this, props);
}
this.timeStamp = src && src.timeStamp || Date.now();
this[jQuery.expando] = true;
};
jQuery.Event.prototype = {
constructor: jQuery.Event,
isDefaultPrevented: returnFalse,
isPropagationStopped: returnFalse,
isImmediatePropagationStopped: returnFalse,
isSimulated: false,
preventDefault: function() {
var e = this.originalEvent;
this.isDefaultPrevented = returnTrue;
if (e && !this.isSimulated) {
e.preventDefault();
}
},
stopPropagation: function() {
var e = this.originalEvent;
this.isPropagationStopped = returnTrue;
if (e && !this.isSimulated) {
e.stopPropagation();
}
},
stopImmediatePropagation: function() {
var e = this.originalEvent;
this.isImmediatePropagationStopped = returnTrue;
if (e && !this.isSimulated) {
e.stopImmediatePropagation();
}
this.stopPropagation();
}
};
jQuery.each({
altKey: true,
bubbles: true,
cancelable: true,
changedTouches: true,
ctrlKey: true,
detail: true,
eventPhase: true,
metaKey: true,
pageX: true,
pageY: true,
shiftKey: true,
view: true,
"char": true,
code: true,
charCode: true,
key: true,
keyCode: true,
button: true,
buttons: true,
clientX: true,
clientY: true,
offsetX: true,
offsetY: true,
pointerId: true,
pointerType: true,
screenX: true,
screenY: true,
targetTouches: true,
toElement: true,
touches: true,
which: true
}, jQuery.event.addProp);
jQuery.each({ focus: "focusin", blur: "focusout" }, function(type, delegateType) {
jQuery.event.special[type] = {
setup: function() {
leverageNative(this, type, expectSync);
return false;
},
trigger: function() {
leverageNative(this, type);
return true;
},
_default: function() {
return true;
},
delegateType
};
});
jQuery.each({
mouseenter: "mouseover",
mouseleave: "mouseout",
pointerenter: "pointerover",
pointerleave: "pointerout"
}, function(orig, fix) {
jQuery.event.special[orig] = {
delegateType: fix,
bindType: fix,
handle: function(event) {
var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj;
if (!related || related !== target && !jQuery.contains(target, related)) {
event.type = handleObj.origType;
ret = handleObj.handler.apply(this, arguments);
event.type = fix;
}
return ret;
}
};
});
jQuery.fn.extend({
on: function(types, selector, data, fn2) {
return on(this, types, selector, data, fn2);
},
one: function(types, selector, data, fn2) {
return on(this, types, selector, data, fn2, 1);
},
off: function(types, selector, fn2) {
var handleObj, type;
if (types && types.preventDefault && types.handleObj) {
handleObj = types.handleObj;
jQuery(types.delegateTarget).off(handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler);
return this;
}
if (typeof types === "object") {
for (type in types) {
this.off(type, selector, types[type]);
}
return this;
}
if (selector === false || typeof selector === "function") {
fn2 = selector;
selector = void 0;
}
if (fn2 === false) {
fn2 = returnFalse;
}
return this.each(function() {
jQuery.event.remove(this, types, fn2, selector);
});
}
});
var rnoInnerhtml = /<script|<style|<link/i, rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
function manipulationTarget(elem, content) {
if (nodeName(elem, "table") && nodeName(content.nodeType !== 11 ? content : content.firstChild, "tr")) {
return jQuery(elem).children("tbody")[0] || elem;
}
return elem;
}
function disableScript(elem) {
elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
return elem;
}
function restoreScript(elem) {
if ((elem.type || "").slice(0, 5) === "true/") {
elem.type = elem.type.slice(5);
} else {
elem.removeAttribute("type");
}
return elem;
}
function cloneCopyEvent(src, dest) {
var i, l, type, pdataOld, udataOld, udataCur, events;
if (dest.nodeType !== 1) {
return;
}
if (dataPriv.hasData(src)) {
pdataOld = dataPriv.get(src);
events = pdataOld.events;
if (events) {
dataPriv.remove(dest, "handle events");
for (type in events) {
for (i = 0, l = events[type].length; i < l; i++) {
jQuery.event.add(dest, type, events[type][i]);
}
}
}
}
if (dataUser.hasData(src)) {
udataOld = dataUser.access(src);
udataCur = jQuery.extend({}, udataOld);
dataUser.set(dest, udataCur);
}
}
function fixInput(src, dest) {
var nodeName2 = dest.nodeName.toLowerCase();
if (nodeName2 === "input" && rcheckableType.test(src.type)) {
dest.checked = src.checked;
} else if (nodeName2 === "input" || nodeName2 === "textarea") {
dest.defaultValue = src.defaultValue;
}
}
function domManip(collection, args, callback, ignored) {
args = flat(args);
var fragment, first, scripts, hasScripts, node, doc2, i = 0, l = collection.length, iNoClone = l - 1, value = args[0], valueIsFunction = isFunction(value);
if (valueIsFunction || l > 1 && typeof value === "string" && !support.checkClone && rchecked.test(value)) {
return collection.each(function(index) {
var self2 = collection.eq(index);
if (valueIsFunction) {
args[0] = value.call(this, index, self2.html());
}
domManip(self2, args, callback, ignored);
});
}
if (l) {
fragment = buildFragment(args, collection[0].ownerDocument, false, collection, ignored);
first = fragment.firstChild;
if (fragment.childNodes.length === 1) {
fragment = first;
}
if (first || ignored) {
scripts = jQuery.map(getAll(fragment, "script"), disableScript);
hasScripts = scripts.length;
for (; i < l; i++) {
node = fragment;
if (i !== iNoClone) {
node = jQuery.clone(node, true, true);
if (hasScripts) {
jQuery.merge(scripts, getAll(node, "script"));
}
}
callback.call(collection[i], node, i);
}
if (hasScripts) {
doc2 = scripts[scripts.length - 1].ownerDocument;
jQuery.map(scripts, restoreScript);
for (i = 0; i < hasScripts; i++) {
node = scripts[i];
if (rscriptType.test(node.type || "") && !dataPriv.access(node, "globalEval") && jQuery.contains(doc2, node)) {
if (node.src && (node.type || "").toLowerCase() !== "module") {
if (jQuery._evalUrl && !node.noModule) {
jQuery._evalUrl(node.src, {
nonce: node.nonce || node.getAttribute("nonce")
}, doc2);
}
} else {
DOMEval(node.textContent.replace(rcleanScript, ""), node, doc2);
}
}
}
}
}
}
return collection;
}
function remove(elem, selector, keepData) {
var node, nodes = selector ? jQuery.filter(selector, elem) : elem, i = 0;
for (; (node = nodes[i]) != null; i++) {
if (!keepData && node.nodeType === 1) {
jQuery.cleanData(getAll(node));
}
if (node.parentNode) {
if (keepData && isAttached(node)) {
setGlobalEval(getAll(node, "script"));
}
node.parentNode.removeChild(node);
}
}
return elem;
}
jQuery.extend({
htmlPrefilter: function(html) {
return html;
},
clone: function(elem, dataAndEvents, deepDataAndEvents) {
var i, l, srcElements, destElements, clone2 = elem.cloneNode(true), inPage = isAttached(elem);
if (!support.noCloneChecked && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem)) {
destElements = getAll(clone2);
srcElements = getAll(elem);
for (i = 0, l = srcElements.length; i < l; i++) {
fixInput(srcElements[i], destElements[i]);
}
}
if (dataAndEvents) {
if (deepDataAndEvents) {
srcElements = srcElements || getAll(elem);
destElements = destElements || getAll(clone2);
for (i = 0, l = srcElements.length; i < l; i++) {
cloneCopyEvent(srcElements[i], destElements[i]);
}
} else {
cloneCopyEvent(elem, clone2);
}
}
destElements = getAll(clone2, "script");
if (destElements.length > 0) {
setGlobalEval(destElements, !inPage && getAll(elem, "script"));
}
return clone2;
},
cleanData: function(elems) {
var data, elem, type, special = jQuery.event.special, i = 0;
for (; (elem = elems[i]) !== void 0; i++) {
if (acceptData(elem)) {
if (data = elem[dataPriv.expando]) {
if (data.events) {
for (type in data.events) {
if (special[type]) {
jQuery.event.remove(elem, type);
} else {
jQuery.removeEvent(elem, type, data.handle);
}
}
}
elem[dataPriv.expando] = void 0;
}
if (elem[dataUser.expando]) {
elem[dataUser.expando] = void 0;
}
}
}
}
});
jQuery.fn.extend({
detach: function(selector) {
return remove(this, selector, true);
},
remove: function(selector) {
return remove(this, selector);
},
text: function(value) {
return access(this, function(value2) {
return value2 === void 0 ? jQuery.text(this) : this.empty().each(function() {
if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
this.textContent = value2;
}
});
}, null, value, arguments.length);
},
append: function() {
return domManip(this, arguments, function(elem) {
if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
var target = manipulationTarget(this, elem);
target.appendChild(elem);
}
});
},
prepend: function() {
return domManip(this, arguments, function(elem) {
if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
var target = manipulationTarget(this, elem);
target.insertBefore(elem, target.firstChild);
}
});
},
before: function() {
return domManip(this, arguments, function(elem) {
if (this.parentNode) {
this.parentNode.insertBefore(elem, this);
}
});
},
after: function() {
return domManip(this, arguments, function(elem) {
if (this.parentNode) {
this.parentNode.insertBefore(elem, this.nextSibling);
}
});
},
empty: function() {
var elem, i = 0;
for (; (elem = this[i]) != null; i++) {
if (elem.nodeType === 1) {
jQuery.cleanData(getAll(elem, false));
elem.textContent = "";
}
}
return this;
},
clone: function(dataAndEvents, deepDataAndEvents) {
dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
return this.map(function() {
return jQuery.clone(this, dataAndEvents, deepDataAndEvents);
});
},
html: function(value) {
return access(this, function(value2) {
var elem = this[0] || {}, i = 0, l = this.length;
if (value2 === void 0 && elem.nodeType === 1) {
return elem.innerHTML;
}
if (typeof value2 === "string" && !rnoInnerhtml.test(value2) && !wrapMap[(rtagName.exec(value2) || ["", ""])[1].toLowerCase()]) {
value2 = jQuery.htmlPrefilter(value2);
try {
for (; i < l; i++) {
elem = this[i] || {};
if (elem.nodeType === 1) {
jQuery.cleanData(getAll(elem, false));
elem.innerHTML = value2;
}
}
elem = 0;
} catch (e) {
}
}
if (elem) {
this.empty().append(value2);
}
}, null, value, arguments.length);
},
replaceWith: function() {
var ignored = [];
return domManip(this, arguments, function(elem) {
var parent = this.parentNode;
if (jQuery.inArray(this, ignored) < 0) {
jQuery.cleanData(getAll(this));
if (parent) {
parent.replaceChild(elem, this);
}
}
}, ignored);
}
});
jQuery.each({
appendTo: "append",
prependTo: "prepend",
insertBefore: "before",
insertAfter: "after",
replaceAll: "replaceWith"
}, function(name, original) {
jQuery.fn[name] = function(selector) {
var elems, ret = [], insert = jQuery(selector), last = insert.length - 1, i = 0;
for (; i <= last; i++) {
elems = i === last ? this : this.clone(true);
jQuery(insert[i])[original](elems);
push.apply(ret, elems.get());
}
return this.pushStack(ret);
};
});
var rnumnonpx = new RegExp("^(" + pnum + ")(?!px)[a-z%]+$", "i");
var getStyles = function(elem) {
var view = elem.ownerDocument.defaultView;
if (!view || !view.opener) {
view = window2;
}
return view.getComputedStyle(elem);
};
var swap = function(elem, options, callback) {
var ret, name, old = {};
for (name in options) {
old[name] = elem.style[name];
elem.style[name] = options[name];
}
ret = callback.call(elem);
for (name in options) {
elem.style[name] = old[name];
}
return ret;
};
var rboxStyle = new RegExp(cssExpand.join("|"), "i");
(function() {
function computeStyleTests() {
if (!div) {
return;
}
container.style.cssText = "position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0";
div.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%";
documentElement.appendChild(container).appendChild(div);
var divStyle = window2.getComputedStyle(div);
pixelPositionVal = divStyle.top !== "1%";
reliableMarginLeftVal = roundPixelMeasures(divStyle.marginLeft) === 12;
div.style.right = "60%";
pixelBoxStylesVal = roundPixelMeasures(divStyle.right) === 36;
boxSizingReliableVal = roundPixelMeasures(divStyle.width) === 36;
div.style.position = "absolute";
scrollboxSizeVal = roundPixelMeasures(div.offsetWidth / 3) === 12;
documentElement.removeChild(container);
div = null;
}
function roundPixelMeasures(measure) {
return Math.round(parseFloat(measure));
}
var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, reliableTrDimensionsVal, reliableMarginLeftVal, container = document2.createElement("div"), div = document2.createElement("div");
if (!div.style) {
return;
}
div.style.backgroundClip = "content-box";
div.cloneNode(true).style.backgroundClip = "";
support.clearCloneStyle = div.style.backgroundClip === "content-box";
jQuery.extend(support, {
boxSizingReliable: function() {
computeStyleTests();
return boxSizingReliableVal;
},
pixelBoxStyles: function() {
computeStyleTests();
return pixelBoxStylesVal;
},
pixelPosition: function() {
computeStyleTests();
return pixelPositionVal;
},
reliableMarginLeft: function() {
computeStyleTests();
return reliableMarginLeftVal;
},
scrollboxSize: function() {
computeStyleTests();
return scrollboxSizeVal;
},
reliableTrDimensions: function() {
var table, tr, trChild, trStyle;
if (reliableTrDimensionsVal == null) {
table = document2.createElement("table");
tr = document2.createElement("tr");
trChild = document2.createElement("div");
table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
tr.style.cssText = "border:1px solid";
tr.style.height = "1px";
trChild.style.height = "9px";
trChild.style.display = "block";
documentElement.appendChild(table).appendChild(tr).appendChild(trChild);
trStyle = window2.getComputedStyle(tr);
reliableTrDimensionsVal = parseInt(trStyle.height, 10) + parseInt(trStyle.borderTopWidth, 10) + parseInt(trStyle.borderBottomWidth, 10) === tr.offsetHeight;
documentElement.removeChild(table);
}
return reliableTrDimensionsVal;
}
});
})();
function curCSS(elem, name, computed) {
var width, minWidth, maxWidth, ret, style = elem.style;
computed = computed || getStyles(elem);
if (computed) {
ret = computed.getPropertyValue(name) || computed[name];
if (ret === "" && !isAttached(elem)) {
ret = jQuery.style(elem, name);
}
if (!support.pixelBoxStyles() && rnumnonpx.test(ret) && rboxStyle.test(name)) {
width = style.width;
minWidth = style.minWidth;
maxWidth = style.maxWidth;
style.minWidth = style.maxWidth = style.width = ret;
ret = computed.width;
style.width = width;
style.minWidth = minWidth;
style.maxWidth = maxWidth;
}
}
return ret !== void 0 ? ret + "" : ret;
}
function addGetHookIf(conditionFn, hookFn) {
return {
get: function() {
if (conditionFn()) {
delete this.get;
return;
}
return (this.get = hookFn).apply(this, arguments);
}
};
}
var cssPrefixes = ["Webkit", "Moz", "ms"], emptyStyle = document2.createElement("div").style, vendorProps = {};
function vendorPropName(name) {
var capName = name[0].toUpperCase() + name.slice(1), i = cssPrefixes.length;
while (i--) {
name = cssPrefixes[i] + capName;
if (name in emptyStyle) {
return name;
}
}
}
function finalPropName(name) {
var final = jQuery.cssProps[name] || vendorProps[name];
if (final) {
return final;
}
if (name in emptyStyle) {
return name;
}
return vendorProps[name] = vendorPropName(name) || name;
}
var rdisplayswap = /^(none|table(?!-c[ea]).+)/, rcustomProp = /^--/, cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssNormalTransform = {
letterSpacing: "0",
fontWeight: "400"
};
function setPositiveNumber(_elem, value, subtract) {
var matches = rcssNum.exec(value);
return matches ? Math.max(0, matches[2] - (subtract || 0)) + (matches[3] || "px") : value;
}
function boxModelAdjustment(elem, dimension, box, isBorderBox, styles, computedVal) {
var i = dimension === "width" ? 1 : 0, extra = 0, delta = 0;
if (box === (isBorderBox ? "border" : "content")) {
return 0;
}
for (; i < 4; i += 2) {
if (box === "margin") {
delta += jQuery.css(elem, box + cssExpand[i], true, styles);
}
if (!isBorderBox) {
delta += jQuery.css(elem, "padding" + cssExpand[i], true, styles);
if (box !== "padding") {
delta += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
} else {
extra += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
}
} else {
if (box === "content") {
delta -= jQuery.css(elem, "padding" + cssExpand[i], true, styles);
}
if (box !== "margin") {
delta -= jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
}
}
}
if (!isBorderBox && computedVal >= 0) {
delta += Math.max(0, Math.ceil(elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] - computedVal - delta - extra - 0.5)) || 0;
}
return delta;
}
function getWidthOrHeight(elem, dimension, extra) {
var styles = getStyles(elem), boxSizingNeeded = !support.boxSizingReliable() || extra, isBorderBox = boxSizingNeeded && jQuery.css(elem, "boxSizing", false, styles) === "border-box", valueIsBorderBox = isBorderBox, val = curCSS(elem, dimension, styles), offsetProp = "offset" + dimension[0].toUpperCase() + dimension.slice(1);
if (rnumnonpx.test(val)) {
if (!extra) {
return val;
}
val = "auto";
}
if ((!support.boxSizingReliable() && isBorderBox || !support.reliableTrDimensions() && nodeName(elem, "tr") || val === "auto" || !parseFloat(val) && jQuery.css(elem, "display", false, styles) === "inline") && elem.getClientRects().length) {
isBorderBox = jQuery.css(elem, "boxSizing", false, styles) === "border-box";
valueIsBorderBox = offsetProp in elem;
if (valueIsBorderBox) {
val = elem[offsetProp];
}
}
val = parseFloat(val) || 0;
return val + boxModelAdjustment(elem, dimension, extra || (isBorderBox ? "border" : "content"), valueIsBorderBox, styles, val) + "px";
}
jQuery.extend({
cssHooks: {
opacity: {
get: function(elem, computed) {
if (computed) {
var ret = curCSS(elem, "opacity");
return ret === "" ? "1" : ret;
}
}
}
},
cssNumber: {
"animationIterationCount": true,
"columnCount": true,
"fillOpacity": true,
"flexGrow": true,
"flexShrink": true,
"fontWeight": true,
"gridArea": true,
"gridColumn": true,
"gridColumnEnd": true,
"gridColumnStart": true,
"gridRow": true,
"gridRowEnd": true,
"gridRowStart": true,
"lineHeight": true,
"opacity": true,
"order": true,
"orphans": true,
"widows": true,
"zIndex": true,
"zoom": true
},
cssProps: {},
style: function(elem, name, value, extra) {
if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) {
return;
}
var ret, type, hooks, origName = camelCase(name), isCustomProp = rcustomProp.test(name), style = elem.style;
if (!isCustomProp) {
name = finalPropName(origName);
}
hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];
if (value !== void 0) {
type = typeof value;
if (type === "string" && (ret = rcssNum.exec(value)) && ret[1]) {
value = adjustCSS(elem, name, ret);
type = "number";
}
if (value == null || value !== value) {
return;
}
if (type === "number" && !isCustomProp) {
value += ret && ret[3] || (jQuery.cssNumber[origName] ? "" : "px");
}
if (!support.clearCloneStyle && value === "" && name.indexOf("background") === 0) {
style[name] = "inherit";
}
if (!hooks || !("set" in hooks) || (value = hooks.set(elem, value, extra)) !== void 0) {
if (isCustomProp) {
style.setProperty(name, value);
} else {
style[name] = value;
}
}
} else {
if (hooks && "get" in hooks && (ret = hooks.get(elem, false, extra)) !== void 0) {
return ret;
}
return style[name];
}
},
css: function(elem, name, extra, styles) {
var val, num, hooks, origName = camelCase(name), isCustomProp = rcustomProp.test(name);
if (!isCustomProp) {
name = finalPropName(origName);
}
hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];
if (hooks && "get" in hooks) {
val = hooks.get(elem, true, extra);
}
if (val === void 0) {
val = curCSS(elem, name, styles);
}
if (val === "normal" && name in cssNormalTransform) {
val = cssNormalTransform[name];
}
if (extra === "" || extra) {
num = parseFloat(val);
return extra === true || isFinite(num) ? num || 0 : val;
}
return val;
}
});
jQuery.each(["height", "width"], function(_i, dimension) {
jQuery.cssHooks[dimension] = {
get: function(elem, computed, extra) {
if (computed) {
return rdisplayswap.test(jQuery.css(elem, "display")) && (!elem.getClientRects().length || !elem.getBoundingClientRect().width) ? swap(elem, cssShow, function() {
return getWidthOrHeight(elem, dimension, extra);
}) : getWidthOrHeight(elem, dimension, extra);
}
},
set: function(elem, value, extra) {
var matches, styles = getStyles(elem), scrollboxSizeBuggy = !support.scrollboxSize() && styles.position === "absolute", boxSizingNeeded = scrollboxSizeBuggy || extra, isBorderBox = boxSizingNeeded && jQuery.css(elem, "boxSizing", false, styles) === "border-box", subtract = extra ? boxModelAdjustment(elem, dimension, extra, isBorderBox, styles) : 0;
if (isBorderBox && scrollboxSizeBuggy) {
subtract -= Math.ceil(elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] - parseFloat(styles[dimension]) - boxModelAdjustment(elem, dimension, "border", false, styles) - 0.5);
}
if (subtract && (matches = rcssNum.exec(value)) && (matches[3] || "px") !== "px") {
elem.style[dimension] = value;
value = jQuery.css(elem, dimension);
}
return setPositiveNumber(elem, value, subtract);
}
};
});
jQuery.cssHooks.marginLeft = addGetHookIf(support.reliableMarginLeft, function(elem, computed) {
if (computed) {
return (parseFloat(curCSS(elem, "marginLeft")) || elem.getBoundingClientRect().left - swap(elem, { marginLeft: 0 }, function() {
return elem.getBoundingClientRect().left;
})) + "px";
}
});
jQuery.each({
margin: "",
padding: "",
border: "Width"
}, function(prefix, suffix) {
jQuery.cssHooks[prefix + suffix] = {
expand: function(value) {
var i = 0, expanded = {}, parts = typeof value === "string" ? value.split(" ") : [value];
for (; i < 4; i++) {
expanded[prefix + cssExpand[i] + suffix] = parts[i] || parts[i - 2] || parts[0];
}
return expanded;
}
};
if (prefix !== "margin") {
jQuery.cssHooks[prefix + suffix].set = setPositiveNumber;
}
});
jQuery.fn.extend({
css: function(name, value) {
return access(this, function(elem, name2, value2) {
var styles, len, map = {}, i = 0;
if (Array.isArray(name2)) {
styles = getStyles(elem);
len = name2.length;
for (; i < len; i++) {
map[name2[i]] = jQuery.css(elem, name2[i], false, styles);
}
return map;
}
return value2 !== void 0 ? jQuery.style(elem, name2, value2) : jQuery.css(elem, name2);
}, name, value, arguments.length > 1);
}
});
function Tween(elem, options, prop, end2, easing) {
return new Tween.prototype.init(elem, options, prop, end2, easing);
}
jQuery.Tween = Tween;
Tween.prototype = {
constructor: Tween,
init: function(elem, options, prop, end2, easing, unit) {
this.elem = elem;
this.prop = prop;
this.easing = easing || jQuery.easing._default;
this.options = options;
this.start = this.now = this.cur();
this.end = end2;
this.unit = unit || (jQuery.cssNumber[prop] ? "" : "px");
},
cur: function() {
var hooks = Tween.propHooks[this.prop];
return hooks && hooks.get ? hooks.get(this) : Tween.propHooks._default.get(this);
},
run: function(percent) {
var eased, hooks = Tween.propHooks[this.prop];
if (this.options.duration) {
this.pos = eased = jQuery.easing[this.easing](percent, this.options.duration * percent, 0, 1, this.options.duration);
} else {
this.pos = eased = percent;
}
this.now = (this.end - this.start) * eased + this.start;
if (this.options.step) {
this.options.step.call(this.elem, this.now, this);
}
if (hooks && hooks.set) {
hooks.set(this);
} else {
Tween.propHooks._default.set(this);
}
return this;
}
};
Tween.prototype.init.prototype = Tween.prototype;
Tween.propHooks = {
_default: {
get: function(tween) {
var result;
if (tween.elem.nodeType !== 1 || tween.elem[tween.prop] != null && tween.elem.style[tween.prop] == null) {
return tween.elem[tween.prop];
}
result = jQuery.css(tween.elem, tween.prop, "");
return !result || result === "auto" ? 0 : result;
},
set: function(tween) {
if (jQuery.fx.step[tween.prop]) {
jQuery.fx.step[tween.prop](tween);
} else if (tween.elem.nodeType === 1 && (jQuery.cssHooks[tween.prop] || tween.elem.style[finalPropName(tween.prop)] != null)) {
jQuery.style(tween.elem, tween.prop, tween.now + tween.unit);
} else {
tween.elem[tween.prop] = tween.now;
}
}
}
};
Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
set: function(tween) {
if (tween.elem.nodeType && tween.elem.parentNode) {
tween.elem[tween.prop] = tween.now;
}
}
};
jQuery.easing = {
linear: function(p) {
return p;
},
swing: function(p) {
return 0.5 - Math.cos(p * Math.PI) / 2;
},
_default: "swing"
};
jQuery.fx = Tween.prototype.init;
jQuery.fx.step = {};
var fxNow, inProgress, rfxtypes = /^(?:toggle|show|hide)$/, rrun = /queueHooks$/;
function schedule() {
if (inProgress) {
if (document2.hidden === false && window2.requestAnimationFrame) {
window2.requestAnimationFrame(schedule);
} else {
window2.setTimeout(schedule, jQuery.fx.interval);
}
jQuery.fx.tick();
}
}
function createFxNow() {
window2.setTimeout(function() {
fxNow = void 0;
});
return fxNow = Date.now();
}
function genFx(type, includeWidth) {
var which, i = 0, attrs = { height: type };
includeWidth = includeWidth ? 1 : 0;
for (; i < 4; i += 2 - includeWidth) {
which = cssExpand[i];
attrs["margin" + which] = attrs["padding" + which] = type;
}
if (includeWidth) {
attrs.opacity = attrs.width = type;
}
return attrs;
}
function createTween(value, prop, animation) {
var tween, collection = (Animation.tweeners[prop] || []).concat(Animation.tweeners["*"]), index = 0, length = collection.length;
for (; index < length; index++) {
if (tween = collection[index].call(animation, prop, value)) {
return tween;
}
}
}
function defaultPrefilter(elem, props, opts) {
var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, isBox = "width" in props || "height" in props, anim = this, orig = {}, style = elem.style, hidden = elem.nodeType && isHiddenWithinTree(elem), dataShow = dataPriv.get(elem, "fxshow");
if (!opts.queue) {
hooks = jQuery._queueHooks(elem, "fx");
if (hooks.unqueued == null) {
hooks.unqueued = 0;
oldfire = hooks.empty.fire;
hooks.empty.fire = function() {
if (!hooks.unqueued) {
oldfire();
}
};
}
hooks.unqueued++;
anim.always(function() {
anim.always(function() {
hooks.unqueued--;
if (!jQuery.queue(elem, "fx").length) {
hooks.empty.fire();
}
});
});
}
for (prop in props) {
value = props[prop];
if (rfxtypes.test(value)) {
delete props[prop];
toggle = toggle || value === "toggle";
if (value === (hidden ? "hide" : "show")) {
if (value === "show" && dataShow && dataShow[prop] !== void 0) {
hidden = true;
} else {
continue;
}
}
orig[prop] = dataShow && dataShow[prop] || jQuery.style(elem, prop);
}
}
propTween = !jQuery.isEmptyObject(props);
if (!propTween && jQuery.isEmptyObject(orig)) {
return;
}
if (isBox && elem.nodeType === 1) {
opts.overflow = [style.overflow, style.overflowX, style.overflowY];
restoreDisplay = dataShow && dataShow.display;
if (restoreDisplay == null) {
restoreDisplay = dataPriv.get(elem, "display");
}
display = jQuery.css(elem, "display");
if (display === "none") {
if (restoreDisplay) {
display = restoreDisplay;
} else {
showHide([elem], true);
restoreDisplay = elem.style.display || restoreDisplay;
display = jQuery.css(elem, "display");
showHide([elem]);
}
}
if (display === "inline" || display === "inline-block" && restoreDisplay != null) {
if (jQuery.css(elem, "float") === "none") {
if (!propTween) {
anim.done(function() {
style.display = restoreDisplay;
});
if (restoreDisplay == null) {
display = style.display;
restoreDisplay = display === "none" ? "" : display;
}
}
style.display = "inline-block";
}
}
}
if (opts.overflow) {
style.overflow = "hidden";
anim.always(function() {
style.overflow = opts.overflow[0];
style.overflowX = opts.overflow[1];
style.overflowY = opts.overflow[2];
});
}
propTween = false;
for (prop in orig) {
if (!propTween) {
if (dataShow) {
if ("hidden" in dataShow) {
hidden = dataShow.hidden;
}
} else {
dataShow = dataPriv.access(elem, "fxshow", { display: restoreDisplay });
}
if (toggle) {
dataShow.hidden = !hidden;
}
if (hidden) {
showHide([elem], true);
}
anim.done(function() {
if (!hidden) {
showHide([elem]);
}
dataPriv.remove(elem, "fxshow");
for (prop in orig) {
jQuery.style(elem, prop, orig[prop]);
}
});
}
propTween = createTween(hidden ? dataShow[prop] : 0, prop, anim);
if (!(prop in dataShow)) {
dataShow[prop] = propTween.start;
if (hidden) {
propTween.end = propTween.start;
propTween.start = 0;
}
}
}
}
function propFilter(props, specialEasing) {
var index, name, easing, value, hooks;
for (index in props) {
name = camelCase(index);
easing = specialEasing[name];
value = props[index];
if (Array.isArray(value)) {
easing = value[1];
value = props[index] = value[0];
}
if (index !== name) {
props[name] = value;
delete props[index];
}
hooks = jQuery.cssHooks[name];
if (hooks && "expand" in hooks) {
value = hooks.expand(value);
delete props[name];
for (index in value) {
if (!(index in props)) {
props[index] = value[index];
specialEasing[index] = easing;
}
}
} else {
specialEasing[name] = easing;
}
}
}
function Animation(elem, properties, options) {
var result, stopped, index = 0, length = Animation.prefilters.length, deferred = jQuery.Deferred().always(function() {
delete tick.elem;
}), tick = function() {
if (stopped) {
return false;
}
var currentTime = fxNow || createFxNow(), remaining = Math.max(0, animation.startTime + animation.duration - currentTime), temp = remaining / animation.duration || 0, percent = 1 - temp, index2 = 0, length2 = animation.tweens.length;
for (; index2 < length2; index2++) {
animation.tweens[index2].run(percent);
}
deferred.notifyWith(elem, [animation, percent, remaining]);
if (percent < 1 && length2) {
return remaining;
}
if (!length2) {
deferred.notifyWith(elem, [animation, 1, 0]);
}
deferred.resolveWith(elem, [animation]);
return false;
}, animation = deferred.promise({
elem,
props: jQuery.extend({}, properties),
opts: jQuery.extend(true, {
specialEasing: {},
easing: jQuery.easing._default
}, options),
originalProperties: properties,
originalOptions: options,
startTime: fxNow || createFxNow(),
duration: options.duration,
tweens: [],
createTween: function(prop, end2) {
var tween = jQuery.Tween(elem, animation.opts, prop, end2, animation.opts.specialEasing[prop] || animation.opts.easing);
animation.tweens.push(tween);
return tween;
},
stop: function(gotoEnd) {
var index2 = 0, length2 = gotoEnd ? animation.tweens.length : 0;
if (stopped) {
return this;
}
stopped = true;
for (; index2 < length2; index2++) {
animation.tweens[index2].run(1);
}
if (gotoEnd) {
deferred.notifyWith(elem, [animation, 1, 0]);
deferred.resolveWith(elem, [animation, gotoEnd]);
} else {
deferred.rejectWith(elem, [animation, gotoEnd]);
}
return this;
}
}), props = animation.props;
propFilter(props, animation.opts.specialEasing);
for (; index < length; index++) {
result = Animation.prefilters[index].call(animation, elem, props, animation.opts);
if (result) {
if (isFunction(result.stop)) {
jQuery._queueHooks(animation.elem, animation.opts.queue).stop = result.stop.bind(result);
}
return result;
}
}
jQuery.map(props, createTween, animation);
if (isFunction(animation.opts.start)) {
animation.opts.start.call(elem, animation);
}
animation.progress(animation.opts.progress).done(animation.opts.done, animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always);
jQuery.fx.timer(jQuery.extend(tick, {
elem,
anim: animation,
queue: animation.opts.queue
}));
return animation;
}
jQuery.Animation = jQuery.extend(Animation, {
tweeners: {
"*": [function(prop, value) {
var tween = this.createTween(prop, value);
adjustCSS(tween.elem, prop, rcssNum.exec(value), tween);
return tween;
}]
},
tweener: function(props, callback) {
if (isFunction(props)) {
callback = props;
props = ["*"];
} else {
props = props.match(rnothtmlwhite);
}
var prop, index = 0, length = props.length;
for (; index < length; index++) {
prop = props[index];
Animation.tweeners[prop] = Animation.tweeners[prop] || [];
Animation.tweeners[prop].unshift(callback);
}
},
prefilters: [defaultPrefilter],
prefilter: function(callback, prepend) {
if (prepend) {
Animation.prefilters.unshift(callback);
} else {
Animation.prefilters.push(callback);
}
}
});
jQuery.speed = function(speed, easing, fn2) {
var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
complete: fn2 || !fn2 && easing || isFunction(speed) && speed,
duration: speed,
easing: fn2 && easing || easing && !isFunction(easing) && easing
};
if (jQuery.fx.off) {
opt.duration = 0;
} else {
if (typeof opt.duration !== "number") {
if (opt.duration in jQuery.fx.speeds) {
opt.duration = jQuery.fx.speeds[opt.duration];
} else {
opt.duration = jQuery.fx.speeds._default;
}
}
}
if (opt.queue == null || opt.queue === true) {
opt.queue = "fx";
}
opt.old = opt.complete;
opt.complete = function() {
if (isFunction(opt.old)) {
opt.old.call(this);
}
if (opt.queue) {
jQuery.dequeue(this, opt.queue);
}
};
return opt;
};
jQuery.fn.extend({
fadeTo: function(speed, to, easing, callback) {
return this.filter(isHiddenWithinTree).css("opacity", 0).show().end().animate({ opacity: to }, speed, easing, callback);
},
animate: function(prop, speed, easing, callback) {
var empty = jQuery.isEmptyObject(prop), optall = jQuery.speed(speed, easing, callback), doAnimation = function() {
var anim = Animation(this, jQuery.extend({}, prop), optall);
if (empty || dataPriv.get(this, "finish")) {
anim.stop(true);
}
};
doAnimation.finish = doAnimation;
return empty || optall.queue === false ? this.each(doAnimation) : this.queue(optall.queue, doAnimation);
},
stop: function(type, clearQueue, gotoEnd) {
var stopQueue = function(hooks) {
var stop = hooks.stop;
delete hooks.stop;
stop(gotoEnd);
};
if (typeof type !== "string") {
gotoEnd = clearQueue;
clearQueue = type;
type = void 0;
}
if (clearQueue) {
this.queue(type || "fx", []);
}
return this.each(function() {
var dequeue = true, index = type != null && type + "queueHooks", timers = jQuery.timers, data = dataPriv.get(this);
if (index) {
if (data[index] && data[index].stop) {
stopQueue(data[index]);
}
} else {
for (index in data) {
if (data[index] && data[index].stop && rrun.test(index)) {
stopQueue(data[index]);
}
}
}
for (index = timers.length; index--; ) {
if (timers[index].elem === this && (type == null || timers[index].queue === type)) {
timers[index].anim.stop(gotoEnd);
dequeue = false;
timers.splice(index, 1);
}
}
if (dequeue || !gotoEnd) {
jQuery.dequeue(this, type);
}
});
},
finish: function(type) {
if (type !== false) {
type = type || "fx";
}
return this.each(function() {
var index, data = dataPriv.get(this), queue = data[type + "queue"], hooks = data[type + "queueHooks"], timers = jQuery.timers, length = queue ? queue.length : 0;
data.finish = true;
jQuery.queue(this, type, []);
if (hooks && hooks.stop) {
hooks.stop.call(this, true);
}
for (index = timers.length; index--; ) {
if (timers[index].elem === this && timers[index].queue === type) {
timers[index].anim.stop(true);
timers.splice(index, 1);
}
}
for (index = 0; index < length; index++) {
if (queue[index] && queue[index].finish) {
queue[index].finish.call(this);
}
}
delete data.finish;
});
}
});
jQuery.each(["toggle", "show", "hide"], function(_i, name) {
var cssFn = jQuery.fn[name];
jQuery.fn[name] = function(speed, easing, callback) {
return speed == null || typeof speed === "boolean" ? cssFn.apply(this, arguments) : this.animate(genFx(name, true), speed, easing, callback);
};
});
jQuery.each({
slideDown: genFx("show"),
slideUp: genFx("hide"),
slideToggle: genFx("toggle"),
fadeIn: { opacity: "show" },
fadeOut: { opacity: "hide" },
fadeToggle: { opacity: "toggle" }
}, function(name, props) {
jQuery.fn[name] = function(speed, easing, callback) {
return this.animate(props, speed, easing, callback);
};
});
jQuery.timers = [];
jQuery.fx.tick = function() {
var timer, i = 0, timers = jQuery.timers;
fxNow = Date.now();
for (; i < timers.length; i++) {
timer = timers[i];
if (!timer() && timers[i] === timer) {
timers.splice(i--, 1);
}
}
if (!timers.length) {
jQuery.fx.stop();
}
fxNow = void 0;
};
jQuery.fx.timer = function(timer) {
jQuery.timers.push(timer);
jQuery.fx.start();
};
jQuery.fx.interval = 13;
jQuery.fx.start = function() {
if (inProgress) {
return;
}
inProgress = true;
schedule();
};
jQuery.fx.stop = function() {
inProgress = null;
};
jQuery.fx.speeds = {
slow: 600,
fast: 200,
_default: 400
};
jQuery.fn.delay = function(time, type) {
time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
type = type || "fx";
return this.queue(type, function(next, hooks) {
var timeout = window2.setTimeout(next, time);
hooks.stop = function() {
window2.clearTimeout(timeout);
};
});
};
(function() {
var input = document2.createElement("input"), select = document2.createElement("select"), opt = select.appendChild(document2.createElement("option"));
input.type = "checkbox";
support.checkOn = input.value !== "";
support.optSelected = opt.selected;
input = document2.createElement("input");
input.value = "t";
input.type = "radio";
support.radioValue = input.value === "t";
})();
var boolHook, attrHandle = jQuery.expr.attrHandle;
jQuery.fn.extend({
attr: function(name, value) {
return access(this, jQuery.attr, name, value, arguments.length > 1);
},
removeAttr: function(name) {
return this.each(function() {
jQuery.removeAttr(this, name);
});
}
});
jQuery.extend({
attr: function(elem, name, value) {
var ret, hooks, nType = elem.nodeType;
if (nType === 3 || nType === 8 || nType === 2) {
return;
}
if (typeof elem.getAttribute === "undefined") {
return jQuery.prop(elem, name, value);
}
if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
hooks = jQuery.attrHooks[name.toLowerCase()] || (jQuery.expr.match.bool.test(name) ? boolHook : void 0);
}
if (value !== void 0) {
if (value === null) {
jQuery.removeAttr(elem, name);
return;
}
if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== void 0) {
return ret;
}
elem.setAttribute(name, value + "");
return value;
}
if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
return ret;
}
ret = jQuery.find.attr(elem, name);
return ret == null ? void 0 : ret;
},
attrHooks: {
type: {
set: function(elem, value) {
if (!support.radioValue && value === "radio" && nodeName(elem, "input")) {
var val = elem.value;
elem.setAttribute("type", value);
if (val) {
elem.value = val;
}
return value;
}
}
}
},
removeAttr: function(elem, value) {
var name, i = 0, attrNames = value && value.match(rnothtmlwhite);
if (attrNames && elem.nodeType === 1) {
while (name = attrNames[i++]) {
elem.removeAttribute(name);
}
}
}
});
boolHook = {
set: function(elem, value, name) {
if (value === false) {
jQuery.removeAttr(elem, name);
} else {
elem.setAttribute(name, name);
}
return name;
}
};
jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function(_i, name) {
var getter = attrHandle[name] || jQuery.find.attr;
attrHandle[name] = function(elem, name2, isXML) {
var ret, handle, lowercaseName = name2.toLowerCase();
if (!isXML) {
handle = attrHandle[lowercaseName];
attrHandle[lowercaseName] = ret;
ret = getter(elem, name2, isXML) != null ? lowercaseName : null;
attrHandle[lowercaseName] = handle;
}
return ret;
};
});
var rfocusable = /^(?:input|select|textarea|button)$/i, rclickable = /^(?:a|area)$/i;
jQuery.fn.extend({
prop: function(name, value) {
return access(this, jQuery.prop, name, value, arguments.length > 1);
},
removeProp: function(name) {
return this.each(function() {
delete this[jQuery.propFix[name] || name];
});
}
});
jQuery.extend({
prop: function(elem, name, value) {
var ret, hooks, nType = elem.nodeType;
if (nType === 3 || nType === 8 || nType === 2) {
return;
}
if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
name = jQuery.propFix[name] || name;
hooks = jQuery.propHooks[name];
}
if (value !== void 0) {
if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== void 0) {
return ret;
}
return elem[name] = value;
}
if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
return ret;
}
return elem[name];
},
propHooks: {
tabIndex: {
get: function(elem) {
var tabindex = jQuery.find.attr(elem, "tabindex");
if (tabindex) {
return parseInt(tabindex, 10);
}
if (rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href) {
return 0;
}
return -1;
}
}
},
propFix: {
"for": "htmlFor",
"class": "className"
}
});
if (!support.optSelected) {
jQuery.propHooks.selected = {
get: function(elem) {
var parent = elem.parentNode;
if (parent && parent.parentNode) {
parent.parentNode.selectedIndex;
}
return null;
},
set: function(elem) {
var parent = elem.parentNode;
if (parent) {
parent.selectedIndex;
if (parent.parentNode) {
parent.parentNode.selectedIndex;
}
}
}
};
}
jQuery.each([
"tabIndex",
"readOnly",
"maxLength",
"cellSpacing",
"cellPadding",
"rowSpan",
"colSpan",
"useMap",
"frameBorder",
"contentEditable"
], function() {
jQuery.propFix[this.toLowerCase()] = this;
});
function stripAndCollapse(value) {
var tokens = value.match(rnothtmlwhite) || [];
return tokens.join(" ");
}
function getClass(elem) {
return elem.getAttribute && elem.getAttribute("class") || "";
}
function classesToArray(value) {
if (Array.isArray(value)) {
return value;
}
if (typeof value === "string") {
return value.match(rnothtmlwhite) || [];
}
return [];
}
jQuery.fn.extend({
addClass: function(value) {
var classes, elem, cur, curValue, clazz, j, finalValue, i = 0;
if (isFunction(value)) {
return this.each(function(j2) {
jQuery(this).addClass(value.call(this, j2, getClass(this)));
});
}
classes = classesToArray(value);
if (classes.length) {
while (elem = this[i++]) {
curValue = getClass(elem);
cur = elem.nodeType === 1 && " " + stripAndCollapse(curValue) + " ";
if (cur) {
j = 0;
while (clazz = classes[j++]) {
if (cur.indexOf(" " + clazz + " ") < 0) {
cur += clazz + " ";
}
}
finalValue = stripAndCollapse(cur);
if (curValue !== finalValue) {
elem.setAttribute("class", finalValue);
}
}
}
}
return this;
},
removeClass: function(value) {
var classes, elem, cur, curValue, clazz, j, finalValue, i = 0;
if (isFunction(value)) {
return this.each(function(j2) {
jQuery(this).removeClass(value.call(this, j2, getClass(this)));
});
}
if (!arguments.length) {
return this.attr("class", "");
}
classes = classesToArray(value);
if (classes.length) {
while (elem = this[i++]) {
curValue = getClass(elem);
cur = elem.nodeType === 1 && " " + stripAndCollapse(curValue) + " ";
if (cur) {
j = 0;
while (clazz = classes[j++]) {
while (cur.indexOf(" " + clazz + " ") > -1) {
cur = cur.replace(" " + clazz + " ", " ");
}
}
finalValue = stripAndCollapse(cur);
if (curValue !== finalValue) {
elem.setAttribute("class", finalValue);
}
}
}
}
return this;
},
toggleClass: function(value, stateVal) {
var type = typeof value, isValidValue = type === "string" || Array.isArray(value);
if (typeof stateVal === "boolean" && isValidValue) {
return stateVal ? this.addClass(value) : this.removeClass(value);
}
if (isFunction(value)) {
return this.each(function(i) {
jQuery(this).toggleClass(value.call(this, i, getClass(this), stateVal), stateVal);
});
}
return this.each(function() {
var className, i, self2, classNames;
if (isValidValue) {
i = 0;
self2 = jQuery(this);
classNames = classesToArray(value);
while (className = classNames[i++]) {
if (self2.hasClass(className)) {
self2.removeClass(className);
} else {
self2.addClass(className);
}
}
} else if (value === void 0 || type === "boolean") {
className = getClass(this);
if (className) {
dataPriv.set(this, "__className__", className);
}
if (this.setAttribute) {
this.setAttribute("class", className || value === false ? "" : dataPriv.get(this, "__className__") || "");
}
}
});
},
hasClass: function(selector) {
var className, elem, i = 0;
className = " " + selector + " ";
while (elem = this[i++]) {
if (elem.nodeType === 1 && (" " + stripAndCollapse(getClass(elem)) + " ").indexOf(className) > -1) {
return true;
}
}
return false;
}
});
var rreturn = /\r/g;
jQuery.fn.extend({
val: function(value) {
var hooks, ret, valueIsFunction, elem = this[0];
if (!arguments.length) {
if (elem) {
hooks = jQuery.valHooks[elem.type] || jQuery.valHooks[elem.nodeName.toLowerCase()];
if (hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== void 0) {
return ret;
}
ret = elem.value;
if (typeof ret === "string") {
return ret.replace(rreturn, "");
}
return ret == null ? "" : ret;
}
return;
}
valueIsFunction = isFunction(value);
return this.each(function(i) {
var val;
if (this.nodeType !== 1) {
return;
}
if (valueIsFunction) {
val = value.call(this, i, jQuery(this).val());
} else {
val = value;
}
if (val == null) {
val = "";
} else if (typeof val === "number") {
val += "";
} else if (Array.isArray(val)) {
val = jQuery.map(val, function(value2) {
return value2 == null ? "" : value2 + "";
});
}
hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()];
if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === void 0) {
this.value = val;
}
});
}
});
jQuery.extend({
valHooks: {
option: {
get: function(elem) {
var val = jQuery.find.attr(elem, "value");
return val != null ? val : stripAndCollapse(jQuery.text(elem));
}
},
select: {
get: function(elem) {
var value, option, i, options = elem.options, index = elem.selectedIndex, one = elem.type === "select-one", values = one ? null : [], max2 = one ? index + 1 : options.length;
if (index < 0) {
i = max2;
} else {
i = one ? index : 0;
}
for (; i < max2; i++) {
option = options[i];
if ((option.selected || i === index) && !option.disabled && (!option.parentNode.disabled || !nodeName(option.parentNode, "optgroup"))) {
value = jQuery(option).val();
if (one) {
return value;
}
values.push(value);
}
}
return values;
},
set: function(elem, value) {
var optionSet, option, options = elem.options, values = jQuery.makeArray(value), i = options.length;
while (i--) {
option = options[i];
if (option.selected = jQuery.inArray(jQuery.valHooks.option.get(option), values) > -1) {
optionSet = true;
}
}
if (!optionSet) {
elem.selectedIndex = -1;
}
return values;
}
}
}
});
jQuery.each(["radio", "checkbox"], function() {
jQuery.valHooks[this] = {
set: function(elem, value) {
if (Array.isArray(value)) {
return elem.checked = jQuery.inArray(jQuery(elem).val(), value) > -1;
}
}
};
if (!support.checkOn) {
jQuery.valHooks[this].get = function(elem) {
return elem.getAttribute("value") === null ? "on" : elem.value;
};
}
});
support.focusin = "onfocusin" in window2;
var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, stopPropagationCallback = function(e) {
e.stopPropagation();
};
jQuery.extend(jQuery.event, {
trigger: function(event, data, elem, onlyHandlers) {
var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, eventPath = [elem || document2], type = hasOwn.call(event, "type") ? event.type : event, namespaces = hasOwn.call(event, "namespace") ? event.namespace.split(".") : [];
cur = lastElement = tmp = elem = elem || document2;
if (elem.nodeType === 3 || elem.nodeType === 8) {
return;
}
if (rfocusMorph.test(type + jQuery.event.triggered)) {
return;
}
if (type.indexOf(".") > -1) {
namespaces = type.split(".");
type = namespaces.shift();
namespaces.sort();
}
ontype = type.indexOf(":") < 0 && "on" + type;
event = event[jQuery.expando] ? event : new jQuery.Event(type, typeof event === "object" && event);
event.isTrigger = onlyHandlers ? 2 : 3;
event.namespace = namespaces.join(".");
event.rnamespace = event.namespace ? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
event.result = void 0;
if (!event.target) {
event.target = elem;
}
data = data == null ? [event] : jQuery.makeArray(data, [event]);
special = jQuery.event.special[type] || {};
if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) {
return;
}
if (!onlyHandlers && !special.noBubble && !isWindow(elem)) {
bubbleType = special.delegateType || type;
if (!rfocusMorph.test(bubbleType + type)) {
cur = cur.parentNode;
}
for (; cur; cur = cur.parentNode) {
eventPath.push(cur);
tmp = cur;
}
if (tmp === (elem.ownerDocument || document2)) {
eventPath.push(tmp.defaultView || tmp.parentWindow || window2);
}
}
i = 0;
while ((cur = eventPath[i++]) && !event.isPropagationStopped()) {
lastElement = cur;
event.type = i > 1 ? bubbleType : special.bindType || type;
handle = (dataPriv.get(cur, "events") || /* @__PURE__ */ Object.create(null))[event.type] && dataPriv.get(cur, "handle");
if (handle) {
handle.apply(cur, data);
}
handle = ontype && cur[ontype];
if (handle && handle.apply && acceptData(cur)) {
event.result = handle.apply(cur, data);
if (event.result === false) {
event.preventDefault();
}
}
}
event.type = type;
if (!onlyHandlers && !event.isDefaultPrevented()) {
if ((!special._default || special._default.apply(eventPath.pop(), data) === false) && acceptData(elem)) {
if (ontype && isFunction(elem[type]) && !isWindow(elem)) {
tmp = elem[ontype];
if (tmp) {
elem[ontype] = null;
}
jQuery.event.triggered = type;
if (event.isPropagationStopped()) {
lastElement.addEventListener(type, stopPropagationCallback);
}
elem[type]();
if (event.isPropagationStopped()) {
lastElement.removeEventListener(type, stopPropagationCallback);
}
jQuery.event.triggered = void 0;
if (tmp) {
elem[ontype] = tmp;
}
}
}
}
return event.result;
},
simulate: function(type, elem, event) {
var e = jQuery.extend(new jQuery.Event(), event, {
type,
isSimulated: true
});
jQuery.event.trigger(e, null, elem);
}
});
jQuery.fn.extend({
trigger: function(type, data) {
return this.each(function() {
jQuery.event.trigger(type, data, this);
});
},
triggerHandler: function(type, data) {
var elem = this[0];
if (elem) {
return jQuery.event.trigger(type, data, elem, true);
}
}
});
if (!support.focusin) {
jQuery.each({ focus: "focusin", blur: "focusout" }, function(orig, fix) {
var handler = function(event) {
jQuery.event.simulate(fix, event.target, jQuery.event.fix(event));
};
jQuery.event.special[fix] = {
setup: function() {
var doc2 = this.ownerDocument || this.document || this, attaches = dataPriv.access(doc2, fix);
if (!attaches) {
doc2.addEventListener(orig, handler, true);
}
dataPriv.access(doc2, fix, (attaches || 0) + 1);
},
teardown: function() {
var doc2 = this.ownerDocument || this.document || this, attaches = dataPriv.access(doc2, fix) - 1;
if (!attaches) {
doc2.removeEventListener(orig, handler, true);
dataPriv.remove(doc2, fix);
} else {
dataPriv.access(doc2, fix, attaches);
}
}
};
});
}
var location2 = window2.location;
var nonce = { guid: Date.now() };
var rquery = /\?/;
jQuery.parseXML = function(data) {
var xml, parserErrorElem;
if (!data || typeof data !== "string") {
return null;
}
try {
xml = new window2.DOMParser().parseFromString(data, "text/xml");
} catch (e) {
}
parserErrorElem = xml && xml.getElementsByTagName("parsererror")[0];
if (!xml || parserErrorElem) {
jQuery.error("Invalid XML: " + (parserErrorElem ? jQuery.map(parserErrorElem.childNodes, function(el) {
return el.textContent;
}).join("\n") : data));
}
return xml;
};
var rbracket = /\[\]$/, rCRLF = /\r?\n/g, rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, rsubmittable = /^(?:input|select|textarea|keygen)/i;
function buildParams(prefix, obj, traditional, add) {
var name;
if (Array.isArray(obj)) {
jQuery.each(obj, function(i, v) {
if (traditional || rbracket.test(prefix)) {
add(prefix, v);
} else {
buildParams(prefix + "[" + (typeof v === "object" && v != null ? i : "") + "]", v, traditional, add);
}
});
} else if (!traditional && toType2(obj) === "object") {
for (name in obj) {
buildParams(prefix + "[" + name + "]", obj[name], traditional, add);
}
} else {
add(prefix, obj);
}
}
jQuery.param = function(a, traditional) {
var prefix, s = [], add = function(key, valueOrFunction) {
var value = isFunction(valueOrFunction) ? valueOrFunction() : valueOrFunction;
s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value == null ? "" : value);
};
if (a == null) {
return "";
}
if (Array.isArray(a) || a.jquery && !jQuery.isPlainObject(a)) {
jQuery.each(a, function() {
add(this.name, this.value);
});
} else {
for (prefix in a) {
buildParams(prefix, a[prefix], traditional, add);
}
}
return s.join("&");
};
jQuery.fn.extend({
serialize: function() {
return jQuery.param(this.serializeArray());
},
serializeArray: function() {
return this.map(function() {
var elements = jQuery.prop(this, "elements");
return elements ? jQuery.makeArray(elements) : this;
}).filter(function() {
var type = this.type;
return this.name && !jQuery(this).is(":disabled") && rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) && (this.checked || !rcheckableType.test(type));
}).map(function(_i, elem) {
var val = jQuery(this).val();
if (val == null) {
return null;
}
if (Array.isArray(val)) {
return jQuery.map(val, function(val2) {
return { name: elem.name, value: val2.replace(rCRLF, "\r\n") };
});
}
return { name: elem.name, value: val.replace(rCRLF, "\r\n") };
}).get();
}
});
var r20 = /%20/g, rhash = /#.*$/, rantiCache = /([?&])_=[^&]*/, rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, rnoContent = /^(?:GET|HEAD)$/, rprotocol = /^\/\//, prefilters = {}, transports = {}, allTypes = "*/".concat("*"), originAnchor = document2.createElement("a");
originAnchor.href = location2.href;
function addToPrefiltersOrTransports(structure) {
return function(dataTypeExpression, func) {
if (typeof dataTypeExpression !== "string") {
func = dataTypeExpression;
dataTypeExpression = "*";
}
var dataType, i = 0, dataTypes = dataTypeExpression.toLowerCase().match(rnothtmlwhite) || [];
if (isFunction(func)) {
while (dataType = dataTypes[i++]) {
if (dataType[0] === "+") {
dataType = dataType.slice(1) || "*";
(structure[dataType] = structure[dataType] || []).unshift(func);
} else {
(structure[dataType] = structure[dataType] || []).push(func);
}
}
}
};
}
function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) {
var inspected = {}, seekingTransport = structure === transports;
function inspect(dataType) {
var selected;
inspected[dataType] = true;
jQuery.each(structure[dataType] || [], function(_, prefilterOrFactory) {
var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR);
if (typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[dataTypeOrTransport]) {
options.dataTypes.unshift(dataTypeOrTransport);
inspect(dataTypeOrTransport);
return false;
} else if (seekingTransport) {
return !(selected = dataTypeOrTransport);
}
});
return selected;
}
return inspect(options.dataTypes[0]) || !inspected["*"] && inspect("*");
}
function ajaxExtend(target, src) {
var key, deep, flatOptions = jQuery.ajaxSettings.flatOptions || {};
for (key in src) {
if (src[key] !== void 0) {
(flatOptions[key] ? target : deep || (deep = {}))[key] = src[key];
}
}
if (deep) {
jQuery.extend(true, target, deep);
}
return target;
}
function ajaxHandleResponses(s, jqXHR, responses) {
var ct, type, finalDataType, firstDataType, contents = s.contents, dataTypes = s.dataTypes;
while (dataTypes[0] === "*") {
dataTypes.shift();
if (ct === void 0) {
ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
}
}
if (ct) {
for (type in contents) {
if (contents[type] && contents[type].test(ct)) {
dataTypes.unshift(type);
break;
}
}
}
if (dataTypes[0] in responses) {
finalDataType = dataTypes[0];
} else {
for (type in responses) {
if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) {
finalDataType = type;
break;
}
if (!firstDataType) {
firstDataType = type;
}
}
finalDataType = finalDataType || firstDataType;
}
if (finalDataType) {
if (finalDataType !== dataTypes[0]) {
dataTypes.unshift(finalDataType);
}
return responses[finalDataType];
}
}
function ajaxConvert(s, response, jqXHR, isSuccess) {
var conv2, current, conv, tmp, prev, converters = {}, dataTypes = s.dataTypes.slice();
if (dataTypes[1]) {
for (conv in s.converters) {
converters[conv.toLowerCase()] = s.converters[conv];
}
}
current = dataTypes.shift();
while (current) {
if (s.responseFields[current]) {
jqXHR[s.responseFields[current]] = response;
}
if (!prev && isSuccess && s.dataFilter) {
response = s.dataFilter(response, s.dataType);
}
prev = current;
current = dataTypes.shift();
if (current) {
if (current === "*") {
current = prev;
} else if (prev !== "*" && prev !== current) {
conv = converters[prev + " " + current] || converters["* " + current];
if (!conv) {
for (conv2 in converters) {
tmp = conv2.split(" ");
if (tmp[1] === current) {
conv = converters[prev + " " + tmp[0]] || converters["* " + tmp[0]];
if (conv) {
if (conv === true) {
conv = converters[conv2];
} else if (converters[conv2] !== true) {
current = tmp[0];
dataTypes.unshift(tmp[1]);
}
break;
}
}
}
}
if (conv !== true) {
if (conv && s.throws) {
response = conv(response);
} else {
try {
response = conv(response);
} catch (e) {
return {
state: "parsererror",
error: conv ? e : "No conversion from " + prev + " to " + current
};
}
}
}
}
}
}
return { state: "success", data: response };
}
jQuery.extend({
active: 0,
lastModified: {},
etag: {},
ajaxSettings: {
url: location2.href,
type: "GET",
isLocal: rlocalProtocol.test(location2.protocol),
global: true,
processData: true,
async: true,
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
accepts: {
"*": allTypes,
text: "text/plain",
html: "text/html",
xml: "application/xml, text/xml",
json: "application/json, text/javascript"
},
contents: {
xml: /\bxml\b/,
html: /\bhtml/,
json: /\bjson\b/
},
responseFields: {
xml: "responseXML",
text: "responseText",
json: "responseJSON"
},
converters: {
"* text": String,
"text html": true,
"text json": JSON.parse,
"text xml": jQuery.parseXML
},
flatOptions: {
url: true,
context: true
}
},
ajaxSetup: function(target, settings) {
return settings ? ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) : ajaxExtend(jQuery.ajaxSettings, target);
},
ajaxPrefilter: addToPrefiltersOrTransports(prefilters),
ajaxTransport: addToPrefiltersOrTransports(transports),
ajax: function(url, options) {
if (typeof url === "object") {
options = url;
url = void 0;
}
options = options || {};
var transport, cacheURL, responseHeadersString, responseHeaders, timeoutTimer, urlAnchor, completed2, fireGlobals, i, uncached, s = jQuery.ajaxSetup({}, options), callbackContext = s.context || s, globalEventContext = s.context && (callbackContext.nodeType || callbackContext.jquery) ? jQuery(callbackContext) : jQuery.event, deferred = jQuery.Deferred(), completeDeferred = jQuery.Callbacks("once memory"), statusCode = s.statusCode || {}, requestHeaders = {}, requestHeadersNames = {}, strAbort = "canceled", jqXHR = {
readyState: 0,
getResponseHeader: function(key) {
var match;
if (completed2) {
if (!responseHeaders) {
responseHeaders = {};
while (match = rheaders.exec(responseHeadersString)) {
responseHeaders[match[1].toLowerCase() + " "] = (responseHeaders[match[1].toLowerCase() + " "] || []).concat(match[2]);
}
}
match = responseHeaders[key.toLowerCase() + " "];
}
return match == null ? null : match.join(", ");
},
getAllResponseHeaders: function() {
return completed2 ? responseHeadersString : null;
},
setRequestHeader: function(name, value) {
if (completed2 == null) {
name = requestHeadersNames[name.toLowerCase()] = requestHeadersNames[name.toLowerCase()] || name;
requestHeaders[name] = value;
}
return this;
},
overrideMimeType: function(type) {
if (completed2 == null) {
s.mimeType = type;
}
return this;
},
statusCode: function(map) {
var code;
if (map) {
if (completed2) {
jqXHR.always(map[jqXHR.status]);
} else {
for (code in map) {
statusCode[code] = [statusCode[code], map[code]];
}
}
}
return this;
},
abort: function(statusText) {
var finalText = statusText || strAbort;
if (transport) {
transport.abort(finalText);
}
done(0, finalText);
return this;
}
};
deferred.promise(jqXHR);
s.url = ((url || s.url || location2.href) + "").replace(rprotocol, location2.protocol + "//");
s.type = options.method || options.type || s.method || s.type;
s.dataTypes = (s.dataType || "*").toLowerCase().match(rnothtmlwhite) || [""];
if (s.crossDomain == null) {
urlAnchor = document2.createElement("a");
try {
urlAnchor.href = s.url;
urlAnchor.href = urlAnchor.href;
s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== urlAnchor.protocol + "//" + urlAnchor.host;
} catch (e) {
s.crossDomain = true;
}
}
if (s.data && s.processData && typeof s.data !== "string") {
s.data = jQuery.param(s.data, s.traditional);
}
inspectPrefiltersOrTransports(prefilters, s, options, jqXHR);
if (completed2) {
return jqXHR;
}
fireGlobals = jQuery.event && s.global;
if (fireGlobals && jQuery.active++ === 0) {
jQuery.event.trigger("ajaxStart");
}
s.type = s.type.toUpperCase();
s.hasContent = !rnoContent.test(s.type);
cacheURL = s.url.replace(rhash, "");
if (!s.hasContent) {
uncached = s.url.slice(cacheURL.length);
if (s.data && (s.processData || typeof s.data === "string")) {
cacheURL += (rquery.test(cacheURL) ? "&" : "?") + s.data;
delete s.data;
}
if (s.cache === false) {
cacheURL = cacheURL.replace(rantiCache, "$1");
uncached = (rquery.test(cacheURL) ? "&" : "?") + "_=" + nonce.guid++ + uncached;
}
s.url = cacheURL + uncached;
} else if (s.data && s.processData && (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0) {
s.data = s.data.replace(r20, "+");
}
if (s.ifModified) {
if (jQuery.lastModified[cacheURL]) {
jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[cacheURL]);
}
if (jQuery.etag[cacheURL]) {
jqXHR.setRequestHeader("If-None-Match", jQuery.etag[cacheURL]);
}
}
if (s.data && s.hasContent && s.contentType !== false || options.contentType) {
jqXHR.setRequestHeader("Content-Type", s.contentType);
}
jqXHR.setRequestHeader("Accept", s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? s.accepts[s.dataTypes[0]] + (s.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "") : s.accepts["*"]);
for (i in s.headers) {
jqXHR.setRequestHeader(i, s.headers[i]);
}
if (s.beforeSend && (s.beforeSend.call(callbackContext, jqXHR, s) === false || completed2)) {
return jqXHR.abort();
}
strAbort = "abort";
completeDeferred.add(s.complete);
jqXHR.done(s.success);
jqXHR.fail(s.error);
transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR);
if (!transport) {
done(-1, "No Transport");
} else {
jqXHR.readyState = 1;
if (fireGlobals) {
globalEventContext.trigger("ajaxSend", [jqXHR, s]);
}
if (completed2) {
return jqXHR;
}
if (s.async && s.timeout > 0) {
timeoutTimer = window2.setTimeout(function() {
jqXHR.abort("timeout");
}, s.timeout);
}
try {
completed2 = false;
transport.send(requestHeaders, done);
} catch (e) {
if (completed2) {
throw e;
}
done(-1, e);
}
}
function done(status, nativeStatusText, responses, headers) {
var isSuccess, success, error, response, modified, statusText = nativeStatusText;
if (completed2) {
return;
}
completed2 = true;
if (timeoutTimer) {
window2.clearTimeout(timeoutTimer);
}
transport = void 0;
responseHeadersString = headers || "";
jqXHR.readyState = status > 0 ? 4 : 0;
isSuccess = status >= 200 && status < 300 || status === 304;
if (responses) {
response = ajaxHandleResponses(s, jqXHR, responses);
}
if (!isSuccess && jQuery.inArray("script", s.dataTypes) > -1 && jQuery.inArray("json", s.dataTypes) < 0) {
s.converters["text script"] = function() {
};
}
response = ajaxConvert(s, response, jqXHR, isSuccess);
if (isSuccess) {
if (s.ifModified) {
modified = jqXHR.getResponseHeader("Last-Modified");
if (modified) {
jQuery.lastModified[cacheURL] = modified;
}
modified = jqXHR.getResponseHeader("etag");
if (modified) {
jQuery.etag[cacheURL] = modified;
}
}
if (status === 204 || s.type === "HEAD") {
statusText = "nocontent";
} else if (status === 304) {
statusText = "notmodified";
} else {
statusText = response.state;
success = response.data;
error = response.error;
isSuccess = !error;
}
} else {
error = statusText;
if (status || !statusText) {
statusText = "error";
if (status < 0) {
status = 0;
}
}
}
jqXHR.status = status;
jqXHR.statusText = (nativeStatusText || statusText) + "";
if (isSuccess) {
deferred.resolveWith(callbackContext, [success, statusText, jqXHR]);
} else {
deferred.rejectWith(callbackContext, [jqXHR, statusText, error]);
}
jqXHR.statusCode(statusCode);
statusCode = void 0;
if (fireGlobals) {
globalEventContext.trigger(isSuccess ? "ajaxSuccess" : "ajaxError", [jqXHR, s, isSuccess ? success : error]);
}
completeDeferred.fireWith(callbackContext, [jqXHR, statusText]);
if (fireGlobals) {
globalEventContext.trigger("ajaxComplete", [jqXHR, s]);
if (!--jQuery.active) {
jQuery.event.trigger("ajaxStop");
}
}
}
return jqXHR;
},
getJSON: function(url, data, callback) {
return jQuery.get(url, data, callback, "json");
},
getScript: function(url, callback) {
return jQuery.get(url, void 0, callback, "script");
}
});
jQuery.each(["get", "post"], function(_i, method) {
jQuery[method] = function(url, data, callback, type) {
if (isFunction(data)) {
type = type || callback;
callback = data;
data = void 0;
}
return jQuery.ajax(jQuery.extend({
url,
type: method,
dataType: type,
data,
success: callback
}, jQuery.isPlainObject(url) && url));
};
});
jQuery.ajaxPrefilter(function(s) {
var i;
for (i in s.headers) {
if (i.toLowerCase() === "content-type") {
s.contentType = s.headers[i] || "";
}
}
});
jQuery._evalUrl = function(url, options, doc2) {
return jQuery.ajax({
url,
type: "GET",
dataType: "script",
cache: true,
async: false,
global: false,
converters: {
"text script": function() {
}
},
dataFilter: function(response) {
jQuery.globalEval(response, options, doc2);
}
});
};
jQuery.fn.extend({
wrapAll: function(html) {
var wrap;
if (this[0]) {
if (isFunction(html)) {
html = html.call(this[0]);
}
wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true);
if (this[0].parentNode) {
wrap.insertBefore(this[0]);
}
wrap.map(function() {
var elem = this;
while (elem.firstElementChild) {
elem = elem.firstElementChild;
}
return elem;
}).append(this);
}
return this;
},
wrapInner: function(html) {
if (isFunction(html)) {
return this.each(function(i) {
jQuery(this).wrapInner(html.call(this, i));
});
}
return this.each(function() {
var self2 = jQuery(this), contents = self2.contents();
if (contents.length) {
contents.wrapAll(html);
} else {
self2.append(html);
}
});
},
wrap: function(html) {
var htmlIsFunction = isFunction(html);
return this.each(function(i) {
jQuery(this).wrapAll(htmlIsFunction ? html.call(this, i) : html);
});
},
unwrap: function(selector) {
this.parent(selector).not("body").each(function() {
jQuery(this).replaceWith(this.childNodes);
});
return this;
}
});
jQuery.expr.pseudos.hidden = function(elem) {
return !jQuery.expr.pseudos.visible(elem);
};
jQuery.expr.pseudos.visible = function(elem) {
return !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);
};
jQuery.ajaxSettings.xhr = function() {
try {
return new window2.XMLHttpRequest();
} catch (e) {
}
};
var xhrSuccessStatus = {
0: 200,
1223: 204
}, xhrSupported = jQuery.ajaxSettings.xhr();
support.cors = !!xhrSupported && "withCredentials" in xhrSupported;
support.ajax = xhrSupported = !!xhrSupported;
jQuery.ajaxTransport(function(options) {
var callback, errorCallback;
if (support.cors || xhrSupported && !options.crossDomain) {
return {
send: function(headers, complete) {
var i, xhr = options.xhr();
xhr.open(options.type, options.url, options.async, options.username, options.password);
if (options.xhrFields) {
for (i in options.xhrFields) {
xhr[i] = options.xhrFields[i];
}
}
if (options.mimeType && xhr.overrideMimeType) {
xhr.overrideMimeType(options.mimeType);
}
if (!options.crossDomain && !headers["X-Requested-With"]) {
headers["X-Requested-With"] = "XMLHttpRequest";
}
for (i in headers) {
xhr.setRequestHeader(i, headers[i]);
}
callback = function(type) {
return function() {
if (callback) {
callback = errorCallback = xhr.onload = xhr.onerror = xhr.onabort = xhr.ontimeout = xhr.onreadystatechange = null;
if (type === "abort") {
xhr.abort();
} else if (type === "error") {
if (typeof xhr.status !== "number") {
complete(0, "error");
} else {
complete(xhr.status, xhr.statusText);
}
} else {
complete(xhrSuccessStatus[xhr.status] || xhr.status, xhr.statusText, (xhr.responseType || "text") !== "text" || typeof xhr.responseText !== "string" ? { binary: xhr.response } : { text: xhr.responseText }, xhr.getAllResponseHeaders());
}
}
};
};
xhr.onload = callback();
errorCallback = xhr.onerror = xhr.ontimeout = callback("error");
if (xhr.onabort !== void 0) {
xhr.onabort = errorCallback;
} else {
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
window2.setTimeout(function() {
if (callback) {
errorCallback();
}
});
}
};
}
callback = callback("abort");
try {
xhr.send(options.hasContent && options.data || null);
} catch (e) {
if (callback) {
throw e;
}
}
},
abort: function() {
if (callback) {
callback();
}
}
};
}
});
jQuery.ajaxPrefilter(function(s) {
if (s.crossDomain) {
s.contents.script = false;
}
});
jQuery.ajaxSetup({
accepts: {
script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
},
contents: {
script: /\b(?:java|ecma)script\b/
},
converters: {
"text script": function(text) {
jQuery.globalEval(text);
return text;
}
}
});
jQuery.ajaxPrefilter("script", function(s) {
if (s.cache === void 0) {
s.cache = false;
}
if (s.crossDomain) {
s.type = "GET";
}
});
jQuery.ajaxTransport("script", function(s) {
if (s.crossDomain || s.scriptAttrs) {
var script, callback;
return {
send: function(_, complete) {
script = jQuery("<script>").attr(s.scriptAttrs || {}).prop({ charset: s.scriptCharset, src: s.url }).on("load error", callback = function(evt) {
script.remove();
callback = null;
if (evt) {
complete(evt.type === "error" ? 404 : 200, evt.type);
}
});
document2.head.appendChild(script[0]);
},
abort: function() {
if (callback) {
callback();
}
}
};
}
});
var oldCallbacks = [], rjsonp = /(=)\?(?=&|$)|\?\?/;
jQuery.ajaxSetup({
jsonp: "callback",
jsonpCallback: function() {
var callback = oldCallbacks.pop() || jQuery.expando + "_" + nonce.guid++;
this[callback] = true;
return callback;
}
});
jQuery.ajaxPrefilter("json jsonp", function(s, originalSettings, jqXHR) {
var callbackName, overwritten, responseContainer, jsonProp = s.jsonp !== false && (rjsonp.test(s.url) ? "url" : typeof s.data === "string" && (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0 && rjsonp.test(s.data) && "data");
if (jsonProp || s.dataTypes[0] === "jsonp") {
callbackName = s.jsonpCallback = isFunction(s.jsonpCallback) ? s.jsonpCallback() : s.jsonpCallback;
if (jsonProp) {
s[jsonProp] = s[jsonProp].replace(rjsonp, "$1" + callbackName);
} else if (s.jsonp !== false) {
s.url += (rquery.test(s.url) ? "&" : "?") + s.jsonp + "=" + callbackName;
}
s.converters["script json"] = function() {
if (!responseContainer) {
jQuery.error(callbackName + " was not called");
}
return responseContainer[0];
};
s.dataTypes[0] = "json";
overwritten = window2[callbackName];
window2[callbackName] = function() {
responseContainer = arguments;
};
jqXHR.always(function() {
if (overwritten === void 0) {
jQuery(window2).removeProp(callbackName);
} else {
window2[callbackName] = overwritten;
}
if (s[callbackName]) {
s.jsonpCallback = originalSettings.jsonpCallback;
oldCallbacks.push(callbackName);
}
if (responseContainer && isFunction(overwritten)) {
overwritten(responseContainer[0]);
}
responseContainer = overwritten = void 0;
});
return "script";
}
});
support.createHTMLDocument = function() {
var body = document2.implementation.createHTMLDocument("").body;
body.innerHTML = "<form></form><form></form>";
return body.childNodes.length === 2;
}();
jQuery.parseHTML = function(data, context, keepScripts) {
if (typeof data !== "string") {
return [];
}
if (typeof context === "boolean") {
keepScripts = context;
context = false;
}
var base, parsed, scripts;
if (!context) {
if (support.createHTMLDocument) {
context = document2.implementation.createHTMLDocument("");
base = context.createElement("base");
base.href = document2.location.href;
context.head.appendChild(base);
} else {
context = document2;
}
}
parsed = rsingleTag.exec(data);
scripts = !keepScripts && [];
if (parsed) {
return [context.createElement(parsed[1])];
}
parsed = buildFragment([data], context, scripts);
if (scripts && scripts.length) {
jQuery(scripts).remove();
}
return jQuery.merge([], parsed.childNodes);
};
jQuery.fn.load = function(url, params, callback) {
var selector, type, response, self2 = this, off = url.indexOf(" ");
if (off > -1) {
selector = stripAndCollapse(url.slice(off));
url = url.slice(0, off);
}
if (isFunction(params)) {
callback = params;
params = void 0;
} else if (params && typeof params === "object") {
type = "POST";
}
if (self2.length > 0) {
jQuery.ajax({
url,
type: type || "GET",
dataType: "html",
data: params
}).done(function(responseText) {
response = arguments;
self2.html(selector ? jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) : responseText);
}).always(callback && function(jqXHR, status) {
self2.each(function() {
callback.apply(this, response || [jqXHR.responseText, status, jqXHR]);
});
});
}
return this;
};
jQuery.expr.pseudos.animated = function(elem) {
return jQuery.grep(jQuery.timers, function(fn2) {
return elem === fn2.elem;
}).length;
};
jQuery.offset = {
setOffset: function(elem, options, i) {
var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, position = jQuery.css(elem, "position"), curElem = jQuery(elem), props = {};
if (position === "static") {
elem.style.position = "relative";
}
curOffset = curElem.offset();
curCSSTop = jQuery.css(elem, "top");
curCSSLeft = jQuery.css(elem, "left");
calculatePosition = (position === "absolute" || position === "fixed") && (curCSSTop + curCSSLeft).indexOf("auto") > -1;
if (calculatePosition) {
curPosition = curElem.position();
curTop = curPosition.top;
curLeft = curPosition.left;
} else {
curTop = parseFloat(curCSSTop) || 0;
curLeft = parseFloat(curCSSLeft) || 0;
}
if (isFunction(options)) {
options = options.call(elem, i, jQuery.extend({}, curOffset));
}
if (options.top != null) {
props.top = options.top - curOffset.top + curTop;
}
if (options.left != null) {
props.left = options.left - curOffset.left + curLeft;
}
if ("using" in options) {
options.using.call(elem, props);
} else {
curElem.css(props);
}
}
};
jQuery.fn.extend({
offset: function(options) {
if (arguments.length) {
return options === void 0 ? this : this.each(function(i) {
jQuery.offset.setOffset(this, options, i);
});
}
var rect, win, elem = this[0];
if (!elem) {
return;
}
if (!elem.getClientRects().length) {
return { top: 0, left: 0 };
}
rect = elem.getBoundingClientRect();
win = elem.ownerDocument.defaultView;
return {
top: rect.top + win.pageYOffset,
left: rect.left + win.pageXOffset
};
},
position: function() {
if (!this[0]) {
return;
}
var offsetParent, offset2, doc2, elem = this[0], parentOffset = { top: 0, left: 0 };
if (jQuery.css(elem, "position") === "fixed") {
offset2 = elem.getBoundingClientRect();
} else {
offset2 = this.offset();
doc2 = elem.ownerDocument;
offsetParent = elem.offsetParent || doc2.documentElement;
while (offsetParent && (offsetParent === doc2.body || offsetParent === doc2.documentElement) && jQuery.css(offsetParent, "position") === "static") {
offsetParent = offsetParent.parentNode;
}
if (offsetParent && offsetParent !== elem && offsetParent.nodeType === 1) {
parentOffset = jQuery(offsetParent).offset();
parentOffset.top += jQuery.css(offsetParent, "borderTopWidth", true);
parentOffset.left += jQuery.css(offsetParent, "borderLeftWidth", true);
}
}
return {
top: offset2.top - parentOffset.top - jQuery.css(elem, "marginTop", true),
left: offset2.left - parentOffset.left - jQuery.css(elem, "marginLeft", true)
};
},
offsetParent: function() {
return this.map(function() {
var offsetParent = this.offsetParent;
while (offsetParent && jQuery.css(offsetParent, "position") === "static") {
offsetParent = offsetParent.offsetParent;
}
return offsetParent || documentElement;
});
}
});
jQuery.each({ scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function(method, prop) {
var top2 = prop === "pageYOffset";
jQuery.fn[method] = function(val) {
return access(this, function(elem, method2, val2) {
var win;
if (isWindow(elem)) {
win = elem;
} else if (elem.nodeType === 9) {
win = elem.defaultView;
}
if (val2 === void 0) {
return win ? win[prop] : elem[method2];
}
if (win) {
win.scrollTo(!top2 ? val2 : win.pageXOffset, top2 ? val2 : win.pageYOffset);
} else {
elem[method2] = val2;
}
}, method, val, arguments.length);
};
});
jQuery.each(["top", "left"], function(_i, prop) {
jQuery.cssHooks[prop] = addGetHookIf(support.pixelPosition, function(elem, computed) {
if (computed) {
computed = curCSS(elem, prop);
return rnumnonpx.test(computed) ? jQuery(elem).position()[prop] + "px" : computed;
}
});
});
jQuery.each({ Height: "height", Width: "width" }, function(name, type) {
jQuery.each({
padding: "inner" + name,
content: type,
"": "outer" + name
}, function(defaultExtra, funcName) {
jQuery.fn[funcName] = function(margin, value) {
var chainable = arguments.length && (defaultExtra || typeof margin !== "boolean"), extra = defaultExtra || (margin === true || value === true ? "margin" : "border");
return access(this, function(elem, type2, value2) {
var doc2;
if (isWindow(elem)) {
return funcName.indexOf("outer") === 0 ? elem["inner" + name] : elem.document.documentElement["client" + name];
}
if (elem.nodeType === 9) {
doc2 = elem.documentElement;
return Math.max(elem.body["scroll" + name], doc2["scroll" + name], elem.body["offset" + name], doc2["offset" + name], doc2["client" + name]);
}
return value2 === void 0 ? jQuery.css(elem, type2, extra) : jQuery.style(elem, type2, value2, extra);
}, type, chainable ? margin : void 0, chainable);
};
});
});
jQuery.each([
"ajaxStart",
"ajaxStop",
"ajaxComplete",
"ajaxError",
"ajaxSuccess",
"ajaxSend"
], function(_i, type) {
jQuery.fn[type] = function(fn2) {
return this.on(type, fn2);
};
});
jQuery.fn.extend({
bind: function(types, data, fn2) {
return this.on(types, null, data, fn2);
},
unbind: function(types, fn2) {
return this.off(types, null, fn2);
},
delegate: function(selector, types, data, fn2) {
return this.on(types, selector, data, fn2);
},
undelegate: function(selector, types, fn2) {
return arguments.length === 1 ? this.off(selector, "**") : this.off(types, selector || "**", fn2);
},
hover: function(fnOver, fnOut) {
return this.mouseenter(fnOver).mouseleave(fnOut || fnOver);
}
});
jQuery.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "), function(_i, name) {
jQuery.fn[name] = function(data, fn2) {
return arguments.length > 0 ? this.on(name, null, data, fn2) : this.trigger(name);
};
});
var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
jQuery.proxy = function(fn2, context) {
var tmp, args, proxy;
if (typeof context === "string") {
tmp = fn2[context];
context = fn2;
fn2 = tmp;
}
if (!isFunction(fn2)) {
return void 0;
}
args = slice.call(arguments, 2);
proxy = function() {
return fn2.apply(context || this, args.concat(slice.call(arguments)));
};
proxy.guid = fn2.guid = fn2.guid || jQuery.guid++;
return proxy;
};
jQuery.holdReady = function(hold) {
if (hold) {
jQuery.readyWait++;
} else {
jQuery.ready(true);
}
};
jQuery.isArray = Array.isArray;
jQuery.parseJSON = JSON.parse;
jQuery.nodeName = nodeName;
jQuery.isFunction = isFunction;
jQuery.isWindow = isWindow;
jQuery.camelCase = camelCase;
jQuery.type = toType2;
jQuery.now = Date.now;
jQuery.isNumeric = function(obj) {
var type = jQuery.type(obj);
return (type === "number" || type === "string") && !isNaN(obj - parseFloat(obj));
};
jQuery.trim = function(text) {
return text == null ? "" : (text + "").replace(rtrim, "");
};
if (typeof define === "function" && define.amd) {
define("jquery", [], function() {
return jQuery;
});
}
var _jQuery = window2.jQuery, _$ = window2.$;
jQuery.noConflict = function(deep) {
if (window2.$ === jQuery) {
window2.$ = _$;
}
if (deep && window2.jQuery === jQuery) {
window2.jQuery = _jQuery;
}
return jQuery;
};
if (typeof noGlobal === "undefined") {
window2.jQuery = window2.$ = jQuery;
}
return jQuery;
});
}
});
// vendor/prism.js
var require_prism = __commonJS({
"vendor/prism.js"(exports, module) {
var _self = typeof window !== "undefined" ? window : typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope ? self : {};
var Prism = function(_self2) {
var lang = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i;
var uniqueId = 0;
var plainTextGrammar = {};
var _ = {
manual: _self2.Prism && _self2.Prism.manual,
disableWorkerMessageHandler: _self2.Prism && _self2.Prism.disableWorkerMessageHandler,
util: {
encode: function encode(tokens) {
if (tokens instanceof Token) {
return new Token(tokens.type, encode(tokens.content), tokens.alias);
} else if (Array.isArray(tokens)) {
return tokens.map(encode);
} else {
return tokens.replace(/&/g, "&").replace(/</g, "<").replace(/\u00a0/g, " ");
}
},
type: function(o) {
return Object.prototype.toString.call(o).slice(8, -1);
},
objId: function(obj) {
if (!obj["__id"]) {
Object.defineProperty(obj, "__id", { value: ++uniqueId });
}
return obj["__id"];
},
clone: function deepClone(o, visited) {
visited = visited || {};
var clone2;
var id;
switch (_.util.type(o)) {
case "Object":
id = _.util.objId(o);
if (visited[id]) {
return visited[id];
}
clone2 = {};
visited[id] = clone2;
for (var key in o) {
if (o.hasOwnProperty(key)) {
clone2[key] = deepClone(o[key], visited);
}
}
return clone2;
case "Array":
id = _.util.objId(o);
if (visited[id]) {
return visited[id];
}
clone2 = [];
visited[id] = clone2;
o.forEach(function(v, i) {
clone2[i] = deepClone(v, visited);
});
return clone2;
default:
return o;
}
},
getLanguage: function(element) {
while (element) {
var m = lang.exec(element.className);
if (m) {
return m[1].toLowerCase();
}
element = element.parentElement;
}
return "none";
},
setLanguage: function(element, language) {
element.className = element.className.replace(RegExp(lang, "gi"), "");
element.classList.add("language-" + language);
},
currentScript: function() {
if (typeof document === "undefined") {
return null;
}
if ("currentScript" in document && 1 < 2) {
return document.currentScript;
}
try {
throw new Error();
} catch (err) {
var src = (/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(err.stack) || [])[1];
if (src) {
var scripts = document.getElementsByTagName("script");
for (var i in scripts) {
if (scripts[i].src == src) {
return scripts[i];
}
}
}
return null;
}
},
isActive: function(element, className, defaultActivation) {
var no = "no-" + className;
while (element) {
var classList = element.classList;
if (classList.contains(className)) {
return true;
}
if (classList.contains(no)) {
return false;
}
element = element.parentElement;
}
return !!defaultActivation;
}
},
languages: {
plain: plainTextGrammar,
plaintext: plainTextGrammar,
text: plainTextGrammar,
txt: plainTextGrammar,
extend: function(id, redef) {
var lang2 = _.util.clone(_.languages[id]);
for (var key in redef) {
lang2[key] = redef[key];
}
return lang2;
},
insertBefore: function(inside, before, insert, root) {
root = root || _.languages;
var grammar = root[inside];
var ret = {};
for (var token in grammar) {
if (grammar.hasOwnProperty(token)) {
if (token == before) {
for (var newToken in insert) {
if (insert.hasOwnProperty(newToken)) {
ret[newToken] = insert[newToken];
}
}
}
if (!insert.hasOwnProperty(token)) {
ret[token] = grammar[token];
}
}
}
var old = root[inside];
root[inside] = ret;
_.languages.DFS(_.languages, function(key, value) {
if (value === old && key != inside) {
this[key] = ret;
}
});
return ret;
},
DFS: function DFS(o, callback, type, visited) {
visited = visited || {};
var objId = _.util.objId;
for (var i in o) {
if (o.hasOwnProperty(i)) {
callback.call(o, i, o[i], type || i);
var property = o[i];
var propertyType = _.util.type(property);
if (propertyType === "Object" && !visited[objId(property)]) {
visited[objId(property)] = true;
DFS(property, callback, null, visited);
} else if (propertyType === "Array" && !visited[objId(property)]) {
visited[objId(property)] = true;
DFS(property, callback, i, visited);
}
}
}
}
},
plugins: {},
highlightAll: function(async, callback) {
_.highlightAllUnder(document, async, callback);
},
highlightAllUnder: function(container, async, callback) {
var env = {
callback,
container,
selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'
};
_.hooks.run("before-highlightall", env);
env.elements = Array.prototype.slice.apply(env.container.querySelectorAll(env.selector));
_.hooks.run("before-all-elements-highlight", env);
for (var i = 0, element; element = env.elements[i++]; ) {
_.highlightElement(element, async === true, env.callback);
}
},
highlightElement: function(element, async, callback) {
var language = _.util.getLanguage(element);
var grammar = _.languages[language];
_.util.setLanguage(element, language);
var parent = element.parentElement;
if (parent && parent.nodeName.toLowerCase() === "pre") {
_.util.setLanguage(parent, language);
}
var code = element.textContent;
var env = {
element,
language,
grammar,
code
};
function insertHighlightedCode(highlightedCode) {
env.highlightedCode = highlightedCode;
_.hooks.run("before-insert", env);
env.element.innerHTML = env.highlightedCode;
_.hooks.run("after-highlight", env);
_.hooks.run("complete", env);
callback && callback.call(env.element);
}
_.hooks.run("before-sanity-check", env);
parent = env.element.parentElement;
if (parent && parent.nodeName.toLowerCase() === "pre" && !parent.hasAttribute("tabindex")) {
parent.setAttribute("tabindex", "0");
}
if (!env.code) {
_.hooks.run("complete", env);
callback && callback.call(env.element);
return;
}
_.hooks.run("before-highlight", env);
if (!env.grammar) {
insertHighlightedCode(_.util.encode(env.code));
return;
}
if (async && _self2.Worker) {
var worker = new Worker(_.filename);
worker.onmessage = function(evt) {
insertHighlightedCode(evt.data);
};
worker.postMessage(JSON.stringify({
language: env.language,
code: env.code,
immediateClose: true
}));
} else {
insertHighlightedCode(_.highlight(env.code, env.grammar, env.language));
}
},
highlight: function(text, grammar, language) {
var env = {
code: text,
grammar,
language
};
_.hooks.run("before-tokenize", env);
if (!env.grammar) {
throw new Error('The language "' + env.language + '" has no grammar.');
}
env.tokens = _.tokenize(env.code, env.grammar);
_.hooks.run("after-tokenize", env);
return Token.stringify(_.util.encode(env.tokens), env.language);
},
tokenize: function(text, grammar) {
var rest = grammar.rest;
if (rest) {
for (var token in rest) {
grammar[token] = rest[token];
}
delete grammar.rest;
}
var tokenList = new LinkedList();
addAfter(tokenList, tokenList.head, text);
matchGrammar(text, tokenList, grammar, tokenList.head, 0);
return toArray(tokenList);
},
hooks: {
all: {},
add: function(name, callback) {
var hooks = _.hooks.all;
hooks[name] = hooks[name] || [];
hooks[name].push(callback);
},
run: function(name, env) {
var callbacks = _.hooks.all[name];
if (!callbacks || !callbacks.length) {
return;
}
for (var i = 0, callback; callback = callbacks[i++]; ) {
callback(env);
}
}
},
Token
};
_self2.Prism = _;
function Token(type, content, alias, matchedStr) {
this.type = type;
this.content = content;
this.alias = alias;
this.length = (matchedStr || "").length | 0;
}
Token.stringify = function stringify(o, language) {
if (typeof o == "string") {
return o;
}
if (Array.isArray(o)) {
var s = "";
o.forEach(function(e) {
s += stringify(e, language);
});
return s;
}
var env = {
type: o.type,
content: stringify(o.content, language),
tag: "span",
classes: ["token", o.type],
attributes: {},
language
};
var aliases = o.alias;
if (aliases) {
if (Array.isArray(aliases)) {
Array.prototype.push.apply(env.classes, aliases);
} else {
env.classes.push(aliases);
}
}
_.hooks.run("wrap", env);
var attributes = "";
for (var name in env.attributes) {
attributes += " " + name + '="' + (env.attributes[name] || "").replace(/"/g, """) + '"';
}
return "<" + env.tag + ' class="' + env.classes.join(" ") + '"' + attributes + ">" + env.content + "</" + env.tag + ">";
};
function matchPattern(pattern, pos, text, lookbehind) {
pattern.lastIndex = pos;
var match = pattern.exec(text);
if (match && lookbehind && match[1]) {
var lookbehindLength = match[1].length;
match.index += lookbehindLength;
match[0] = match[0].slice(lookbehindLength);
}
return match;
}
function matchGrammar(text, tokenList, grammar, startNode, startPos, rematch) {
for (var token in grammar) {
if (!grammar.hasOwnProperty(token) || !grammar[token]) {
continue;
}
var patterns = grammar[token];
patterns = Array.isArray(patterns) ? patterns : [patterns];
for (var j = 0; j < patterns.length; ++j) {
if (rematch && rematch.cause == token + "," + j) {
return;
}
var patternObj = patterns[j];
var inside = patternObj.inside;
var lookbehind = !!patternObj.lookbehind;
var greedy = !!patternObj.greedy;
var alias = patternObj.alias;
if (greedy && !patternObj.pattern.global) {
var flags = patternObj.pattern.toString().match(/[imsuy]*$/)[0];
patternObj.pattern = RegExp(patternObj.pattern.source, flags + "g");
}
var pattern = patternObj.pattern || patternObj;
for (var currentNode = startNode.next, pos = startPos; currentNode !== tokenList.tail; pos += currentNode.value.length, currentNode = currentNode.next) {
if (rematch && pos >= rematch.reach) {
break;
}
var str = currentNode.value;
if (tokenList.length > text.length) {
return;
}
if (str instanceof Token) {
continue;
}
var removeCount = 1;
var match;
if (greedy) {
match = matchPattern(pattern, pos, text, lookbehind);
if (!match || match.index >= text.length) {
break;
}
var from = match.index;
var to = match.index + match[0].length;
var p = pos;
p += currentNode.value.length;
while (from >= p) {
currentNode = currentNode.next;
p += currentNode.value.length;
}
p -= currentNode.value.length;
pos = p;
if (currentNode.value instanceof Token) {
continue;
}
for (var k = currentNode; k !== tokenList.tail && (p < to || typeof k.value === "string"); k = k.next) {
removeCount++;
p += k.value.length;
}
removeCount--;
str = text.slice(pos, p);
match.index -= pos;
} else {
match = matchPattern(pattern, 0, str, lookbehind);
if (!match) {
continue;
}
}
var from = match.index;
var matchStr = match[0];
var before = str.slice(0, from);
var after = str.slice(from + matchStr.length);
var reach = pos + str.length;
if (rematch && reach > rematch.reach) {
rematch.reach = reach;
}
var removeFrom = currentNode.prev;
if (before) {
removeFrom = addAfter(tokenList, removeFrom, before);
pos += before.length;
}
removeRange(tokenList, removeFrom, removeCount);
var wrapped = new Token(token, inside ? _.tokenize(matchStr, inside) : matchStr, alias, matchStr);
currentNode = addAfter(tokenList, removeFrom, wrapped);
if (after) {
addAfter(tokenList, currentNode, after);
}
if (removeCount > 1) {
var nestedRematch = {
cause: token + "," + j,
reach
};
matchGrammar(text, tokenList, grammar, currentNode.prev, pos, nestedRematch);
if (rematch && nestedRematch.reach > rematch.reach) {
rematch.reach = nestedRematch.reach;
}
}
}
}
}
}
function LinkedList() {
var head = { value: null, prev: null, next: null };
var tail = { value: null, prev: head, next: null };
head.next = tail;
this.head = head;
this.tail = tail;
this.length = 0;
}
function addAfter(list, node, value) {
var next = node.next;
var newNode = { value, prev: node, next };
node.next = newNode;
next.prev = newNode;
list.length++;
return newNode;
}
function removeRange(list, node, count) {
var next = node.next;
for (var i = 0; i < count && next !== list.tail; i++) {
next = next.next;
}
node.next = next;
next.prev = node;
list.length -= i;
}
function toArray(list) {
var array = [];
var node = list.head.next;
while (node !== list.tail) {
array.push(node.value);
node = node.next;
}
return array;
}
if (!_self2.document) {
if (!_self2.addEventListener) {
return _;
}
if (!_.disableWorkerMessageHandler) {
_self2.addEventListener("message", function(evt) {
var message = JSON.parse(evt.data);
var lang2 = message.language;
var code = message.code;
var immediateClose = message.immediateClose;
_self2.postMessage(_.highlight(code, _.languages[lang2], lang2));
if (immediateClose) {
_self2.close();
}
}, false);
}
return _;
}
var script = _.util.currentScript();
if (script) {
_.filename = script.src;
if (script.hasAttribute("data-manual")) {
_.manual = true;
}
}
function highlightAutomaticallyCallback() {
if (!_.manual) {
_.highlightAll();
}
}
if (!_.manual) {
var readyState = document.readyState;
if (readyState === "loading" || readyState === "interactive" && script && script.defer) {
document.addEventListener("DOMContentLoaded", highlightAutomaticallyCallback);
} else {
if (window.requestAnimationFrame) {
window.requestAnimationFrame(highlightAutomaticallyCallback);
} else {
window.setTimeout(highlightAutomaticallyCallback, 16);
}
}
}
return _;
}(_self);
if (typeof module !== "undefined" && module.exports) {
module.exports = Prism;
}
if (typeof global !== "undefined") {
global.Prism = Prism;
}
Prism.languages.markup = {
"comment": {
pattern: /<!--(?:(?!<!--)[\s\S])*?-->/,
greedy: true
},
"prolog": {
pattern: /<\?[\s\S]+?\?>/,
greedy: true
},
"doctype": {
pattern: /<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,
greedy: true,
inside: {
"internal-subset": {
pattern: /(^[^\[]*\[)[\s\S]+(?=\]>$)/,
lookbehind: true,
greedy: true,
inside: null
},
"string": {
pattern: /"[^"]*"|'[^']*'/,
greedy: true
},
"punctuation": /^<!|>$|[[\]]/,
"doctype-tag": /^DOCTYPE/i,
"name": /[^\s<>'"]+/
}
},
"cdata": {
pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i,
greedy: true
},
"tag": {
pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,
greedy: true,
inside: {
"tag": {
pattern: /^<\/?[^\s>\/]+/,
inside: {
"punctuation": /^<\/?/,
"namespace": /^[^\s>\/:]+:/
}
},
"special-attr": [],
"attr-value": {
pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,
inside: {
"punctuation": [
{
pattern: /^=/,
alias: "attr-equals"
},
{
pattern: /^(\s*)["']|["']$/,
lookbehind: true
}
]
}
},
"punctuation": /\/?>/,
"attr-name": {
pattern: /[^\s>\/]+/,
inside: {
"namespace": /^[^\s>\/:]+:/
}
}
}
},
"entity": [
{
pattern: /&[\da-z]{1,8};/i,
alias: "named-entity"
},
/&#x?[\da-f]{1,8};/i
]
};
Prism.languages.markup["tag"].inside["attr-value"].inside["entity"] = Prism.languages.markup["entity"];
Prism.languages.markup["doctype"].inside["internal-subset"].inside = Prism.languages.markup;
Prism.hooks.add("wrap", function(env) {
if (env.type === "entity") {
env.attributes["title"] = env.content.replace(/&/, "&");
}
});
Object.defineProperty(Prism.languages.markup.tag, "addInlined", {
value: function addInlined(tagName, lang) {
var includedCdataInside = {};
includedCdataInside["language-" + lang] = {
pattern: /(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,
lookbehind: true,
inside: Prism.languages[lang]
};
includedCdataInside["cdata"] = /^<!\[CDATA\[|\]\]>$/i;
var inside = {
"included-cdata": {
pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i,
inside: includedCdataInside
}
};
inside["language-" + lang] = {
pattern: /[\s\S]+/,
inside: Prism.languages[lang]
};
var def = {};
def[tagName] = {
pattern: RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g, function() {
return tagName;
}), "i"),
lookbehind: true,
greedy: true,
inside
};
Prism.languages.insertBefore("markup", "cdata", def);
}
});
Object.defineProperty(Prism.languages.markup.tag, "addAttribute", {
value: function(attrName, lang) {
Prism.languages.markup.tag.inside["special-attr"].push({
pattern: RegExp(/(^|["'\s])/.source + "(?:" + attrName + ")" + /\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source, "i"),
lookbehind: true,
inside: {
"attr-name": /^[^\s=]+/,
"attr-value": {
pattern: /=[\s\S]+/,
inside: {
"value": {
pattern: /(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,
lookbehind: true,
alias: [lang, "language-" + lang],
inside: Prism.languages[lang]
},
"punctuation": [
{
pattern: /^=/,
alias: "attr-equals"
},
/"|'/
]
}
}
}
});
}
});
Prism.languages.html = Prism.languages.markup;
Prism.languages.mathml = Prism.languages.markup;
Prism.languages.svg = Prism.languages.markup;
Prism.languages.xml = Prism.languages.extend("markup", {});
Prism.languages.ssml = Prism.languages.xml;
Prism.languages.atom = Prism.languages.xml;
Prism.languages.rss = Prism.languages.xml;
(function(Prism2) {
var string = /(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;
Prism2.languages.css = {
"comment": /\/\*[\s\S]*?\*\//,
"atrule": {
pattern: RegExp("@[\\w-](?:" + /[^;{\s"']|\s+(?!\s)/.source + "|" + string.source + ")*?" + /(?:;|(?=\s*\{))/.source),
inside: {
"rule": /^@[\w-]+/,
"selector-function-argument": {
pattern: /(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,
lookbehind: true,
alias: "selector"
},
"keyword": {
pattern: /(^|[^\w-])(?:and|not|only|or)(?![\w-])/,
lookbehind: true
}
}
},
"url": {
pattern: RegExp("\\burl\\((?:" + string.source + "|" + /(?:[^\\\r\n()"']|\\[\s\S])*/.source + ")\\)", "i"),
greedy: true,
inside: {
"function": /^url/i,
"punctuation": /^\(|\)$/,
"string": {
pattern: RegExp("^" + string.source + "$"),
alias: "url"
}
}
},
"selector": {
pattern: RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|` + string.source + ")*(?=\\s*\\{)"),
lookbehind: true
},
"string": {
pattern: string,
greedy: true
},
"property": {
pattern: /(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,
lookbehind: true
},
"important": /!important\b/i,
"function": {
pattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,
lookbehind: true
},
"punctuation": /[(){};:,]/
};
Prism2.languages.css["atrule"].inside.rest = Prism2.languages.css;
var markup = Prism2.languages.markup;
if (markup) {
markup.tag.addInlined("style", "css");
markup.tag.addAttribute("style", "css");
}
})(Prism);
Prism.languages.clike = {
"comment": [
{
pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
lookbehind: true,
greedy: true
},
{
pattern: /(^|[^\\:])\/\/.*/,
lookbehind: true,
greedy: true
}
],
"string": {
pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"class-name": {
pattern: /(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,
lookbehind: true,
inside: {
"punctuation": /[.\\]/
}
},
"keyword": /\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,
"boolean": /\b(?:false|true)\b/,
"function": /\b\w+(?=\()/,
"number": /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
"operator": /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,
"punctuation": /[{}[\];(),.:]/
};
Prism.languages.javascript = Prism.languages.extend("clike", {
"class-name": [
Prism.languages.clike["class-name"],
{
pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,
lookbehind: true
}
],
"keyword": [
{
pattern: /((?:^|\})\s*)catch\b/,
lookbehind: true
},
{
pattern: /(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,
lookbehind: true
}
],
"function": /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,
"number": {
pattern: RegExp(/(^|[^\w$])/.source + "(?:" + (/NaN|Infinity/.source + "|" + /0[bB][01]+(?:_[01]+)*n?/.source + "|" + /0[oO][0-7]+(?:_[0-7]+)*n?/.source + "|" + /0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source + "|" + /\d+(?:_\d+)*n/.source + "|" + /(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source) + ")" + /(?![\w$])/.source),
lookbehind: true
},
"operator": /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/
});
Prism.languages.javascript["class-name"][0].pattern = /(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;
Prism.languages.insertBefore("javascript", "keyword", {
"regex": {
pattern: RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source + /\//.source + "(?:" + /(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source + "|" + /(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source + ")" + /(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),
lookbehind: true,
greedy: true,
inside: {
"regex-source": {
pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/,
lookbehind: true,
alias: "language-regex",
inside: Prism.languages.regex
},
"regex-delimiter": /^\/|\/$/,
"regex-flags": /^[a-z]+$/
}
},
"function-variable": {
pattern: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,
alias: "function"
},
"parameter": [
{
pattern: /(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,
lookbehind: true,
inside: Prism.languages.javascript
},
{
pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,
lookbehind: true,
inside: Prism.languages.javascript
},
{
pattern: /(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,
lookbehind: true,
inside: Prism.languages.javascript
},
{
pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,
lookbehind: true,
inside: Prism.languages.javascript
}
],
"constant": /\b[A-Z](?:[A-Z_]|\dx?)*\b/
});
Prism.languages.insertBefore("javascript", "string", {
"hashbang": {
pattern: /^#!.*/,
greedy: true,
alias: "comment"
},
"template-string": {
pattern: /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,
greedy: true,
inside: {
"template-punctuation": {
pattern: /^`|`$/,
alias: "string"
},
"interpolation": {
pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,
lookbehind: true,
inside: {
"interpolation-punctuation": {
pattern: /^\$\{|\}$/,
alias: "punctuation"
},
rest: Prism.languages.javascript
}
},
"string": /[\s\S]+/
}
},
"string-property": {
pattern: /((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,
lookbehind: true,
greedy: true,
alias: "property"
}
});
Prism.languages.insertBefore("javascript", "operator", {
"literal-property": {
pattern: /((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,
lookbehind: true,
alias: "property"
}
});
if (Prism.languages.markup) {
Prism.languages.markup.tag.addInlined("script", "javascript");
Prism.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source, "javascript");
}
Prism.languages.js = Prism.languages.javascript;
Prism.languages.abap = {
"comment": /^\*.*/m,
"string": /(`|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
"string-template": {
pattern: /([|}])(?:\\.|[^\\|{\r\n])*(?=[|{])/,
lookbehind: true,
alias: "string"
},
"eol-comment": {
pattern: /(^|\s)".*/m,
lookbehind: true,
alias: "comment"
},
"keyword": {
pattern: /(\s|\.|^)(?:\*-INPUT|\?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING|ACCESSPOLICY|ACCORDING|ACOS|ACTIVATION|ACTUAL|ADD|ADD-CORRESPONDING|ADJACENT|AFTER|ALIAS|ALIASES|ALIGN|ALL|ALLOCATE|ALPHA|ANALYSIS|ANALYZER|AND|ANY|APPEND|APPENDAGE|APPENDING|APPLICATION|ARCHIVE|AREA|ARITHMETIC|AS|ASCENDING|ASIN|ASPECT|ASSERT|ASSIGN|ASSIGNED|ASSIGNING|ASSOCIATION|ASYNCHRONOUS|AT|ATAN|ATTRIBUTES|AUTHORITY|AUTHORITY-CHECK|AVG|BACK|BACKGROUND|BACKUP|BACKWARD|BADI|BASE|BEFORE|BEGIN|BETWEEN|BIG|BINARY|BINDING|BIT|BIT-AND|BIT-NOT|BIT-OR|BIT-XOR|BLACK|BLANK|BLANKS|BLOB|BLOCK|BLOCKS|BLUE|BOUND|BOUNDARIES|BOUNDS|BOXED|BREAK-POINT|BT|BUFFER|BY|BYPASSING|BYTE|BYTE-CA|BYTE-CN|BYTE-CO|BYTE-CS|BYTE-NA|BYTE-NS|BYTE-ORDER|C|CA|CALL|CALLING|CASE|CAST|CASTING|CATCH|CEIL|CENTER|CENTERED|CHAIN|CHAIN-INPUT|CHAIN-REQUEST|CHANGE|CHANGING|CHANNELS|CHAR-TO-HEX|CHARACTER|CHARLEN|CHECK|CHECKBOX|CIRCULAR|CI_|CLASS|CLASS-CODING|CLASS-DATA|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|CLEANUP|CLEAR|CLIENT|CLOB|CLOCK|CLOSE|CN|CNT|CO|COALESCE|CODE|CODING|COLLECT|COLOR|COLUMN|COLUMNS|COL_BACKGROUND|COL_GROUP|COL_HEADING|COL_KEY|COL_NEGATIVE|COL_NORMAL|COL_POSITIVE|COL_TOTAL|COMMENT|COMMENTS|COMMIT|COMMON|COMMUNICATION|COMPARING|COMPONENT|COMPONENTS|COMPRESSION|COMPUTE|CONCAT|CONCATENATE|COND|CONDENSE|CONDITION|CONNECT|CONNECTION|CONSTANTS|CONTEXT|CONTEXTS|CONTINUE|CONTROL|CONTROLS|CONV|CONVERSION|CONVERT|COPIES|COPY|CORRESPONDING|COS|COSH|COUNT|COUNTRY|COVER|CP|CPI|CREATE|CREATING|CRITICAL|CS|CURRENCY|CURRENCY_CONVERSION|CURRENT|CURSOR|CURSOR-SELECTION|CUSTOMER|CUSTOMER-FUNCTION|DANGEROUS|DATA|DATABASE|DATAINFO|DATASET|DATE|DAYLIGHT|DBMAXLEN|DD\/MM\/YY|DD\/MM\/YYYY|DDMMYY|DEALLOCATE|DECIMALS|DECIMAL_SHIFT|DECLARATIONS|DEEP|DEFAULT|DEFERRED|DEFINE|DEFINING|DEFINITION|DELETE|DELETING|DEMAND|DEPARTMENT|DESCENDING|DESCRIBE|DESTINATION|DETAIL|DIALOG|DIRECTORY|DISCONNECT|DISPLAY|DISPLAY-MODE|DISTANCE|DISTINCT|DIV|DIVIDE|DIVIDE-CORRESPONDING|DIVISION|DO|DUMMY|DUPLICATE|DUPLICATES|DURATION|DURING|DYNAMIC|DYNPRO|E|EACH|EDIT|EDITOR-CALL|ELSE|ELSEIF|EMPTY|ENABLED|ENABLING|ENCODING|END|END-ENHANCEMENT-SECTION|END-LINES|END-OF-DEFINITION|END-OF-FILE|END-OF-PAGE|END-OF-SELECTION|ENDAT|ENDCASE|ENDCATCH|ENDCHAIN|ENDCLASS|ENDDO|ENDENHANCEMENT|ENDEXEC|ENDFOR|ENDFORM|ENDFUNCTION|ENDIAN|ENDIF|ENDING|ENDINTERFACE|ENDLOOP|ENDMETHOD|ENDMODULE|ENDON|ENDPROVIDE|ENDSELECT|ENDTRY|ENDWHILE|ENGINEERING|ENHANCEMENT|ENHANCEMENT-POINT|ENHANCEMENT-SECTION|ENHANCEMENTS|ENTRIES|ENTRY|ENVIRONMENT|EQ|EQUAL|EQUIV|ERRORMESSAGE|ERRORS|ESCAPE|ESCAPING|EVENT|EVENTS|EXACT|EXCEPT|EXCEPTION|EXCEPTION-TABLE|EXCEPTIONS|EXCLUDE|EXCLUDING|EXEC|EXECUTE|EXISTS|EXIT|EXIT-COMMAND|EXP|EXPAND|EXPANDING|EXPIRATION|EXPLICIT|EXPONENT|EXPORT|EXPORTING|EXTEND|EXTENDED|EXTENSION|EXTRACT|FAIL|FETCH|FIELD|FIELD-GROUPS|FIELD-SYMBOL|FIELD-SYMBOLS|FIELDS|FILE|FILTER|FILTER-TABLE|FILTERS|FINAL|FIND|FIRST|FIRST-LINE|FIXED-POINT|FKEQ|FKGE|FLOOR|FLUSH|FONT|FOR|FORM|FORMAT|FORWARD|FOUND|FRAC|FRAME|FRAMES|FREE|FRIENDS|FROM|FUNCTION|FUNCTION-POOL|FUNCTIONALITY|FURTHER|GAPS|GE|GENERATE|GET|GIVING|GKEQ|GKGE|GLOBAL|GRANT|GREATER|GREEN|GROUP|GROUPS|GT|HANDLE|HANDLER|HARMLESS|HASHED|HAVING|HDB|HEAD-LINES|HEADER|HEADERS|HEADING|HELP-ID|HELP-REQUEST|HIDE|HIGH|HINT|HOLD|HOTSPOT|I|ICON|ID|IDENTIFICATION|IDENTIFIER|IDS|IF|IGNORE|IGNORING|IMMEDIATELY|IMPLEMENTATION|IMPLEMENTATIONS|IMPLEMENTED|IMPLICIT|IMPORT|IMPORTING|IN|INACTIVE|INCL|INCLUDE|INCLUDES|INCLUDING|INCREMENT|INDEX|INDEX-LINE|INFOTYPES|INHERITING|INIT|INITIAL|INITIALIZATION|INNER|INOUT|INPUT|INSERT|INSTANCES|INTENSIFIED|INTERFACE|INTERFACE-POOL|INTERFACES|INTERNAL|INTERVALS|INTO|INVERSE|INVERTED-DATE|IS|ISO|ITERATOR|ITNO|JOB|JOIN|KEEP|KEEPING|KERNEL|KEY|KEYS|KEYWORDS|KIND|LANGUAGE|LAST|LATE|LAYOUT|LE|LEADING|LEAVE|LEFT|LEFT-JUSTIFIED|LEFTPLUS|LEFTSPACE|LEGACY|LENGTH|LESS|LET|LEVEL|LEVELS|LIKE|LINE|LINE-COUNT|LINE-SELECTION|LINE-SIZE|LINEFEED|LINES|LIST|LIST-PROCESSING|LISTBOX|LITTLE|LLANG|LOAD|LOAD-OF-PROGRAM|LOB|LOCAL|LOCALE|LOCATOR|LOG|LOG-POINT|LOG10|LOGFILE|LOGICAL|LONG|LOOP|LOW|LOWER|LPAD|LPI|LT|M|MAIL|MAIN|MAJOR-ID|MAPPING|MARGIN|MARK|MASK|MATCH|MATCHCODE|MAX|MAXIMUM|MEDIUM|MEMBERS|MEMORY|MESH|MESSAGE|MESSAGE-ID|MESSAGES|MESSAGING|METHOD|METHODS|MIN|MINIMUM|MINOR-ID|MM\/DD\/YY|MM\/DD\/YYYY|MMDDYY|MOD|MODE|MODIF|MODIFIER|MODIFY|MODULE|MOVE|MOVE-CORRESPONDING|MULTIPLY|MULTIPLY-CORRESPONDING|NA|NAME|NAMETAB|NATIVE|NB|NE|NESTED|NESTING|NEW|NEW-LINE|NEW-PAGE|NEW-SECTION|NEXT|NO|NO-DISPLAY|NO-EXTENSION|NO-GAP|NO-GAPS|NO-GROUPING|NO-HEADING|NO-SCROLLING|NO-SIGN|NO-TITLE|NO-TOPOFPAGE|NO-ZERO|NODE|NODES|NON-UNICODE|NON-UNIQUE|NOT|NP|NS|NULL|NUMBER|NUMOFCHAR|O|OBJECT|OBJECTS|OBLIGATORY|OCCURRENCE|OCCURRENCES|OCCURS|OF|OFF|OFFSET|OLE|ON|ONLY|OPEN|OPTION|OPTIONAL|OPTIONS|OR|ORDER|OTHER|OTHERS|OUT|OUTER|OUTPUT|OUTPUT-LENGTH|OVERFLOW|OVERLAY|PACK|PACKAGE|PAD|PADDING|PAGE|PAGES|PARAMETER|PARAMETER-TABLE|PARAMETERS|PART|PARTIALLY|PATTERN|PERCENTAGE|PERFORM|PERFORMING|PERSON|PF|PF-STATUS|PINK|PLACES|POOL|POSITION|POS_HIGH|POS_LOW|PRAGMAS|PRECOMPILED|PREFERRED|PRESERVING|PRIMARY|PRINT|PRINT-CONTROL|PRIORITY|PRIVATE|PROCEDURE|PROCESS|PROGRAM|PROPERTY|PROTECTED|PROVIDE|PUBLIC|PUSHBUTTON|PUT|QUEUE-ONLY|QUICKINFO|RADIOBUTTON|RAISE|RAISING|RANGE|RANGES|RAW|READ|READ-ONLY|READER|RECEIVE|RECEIVED|RECEIVER|RECEIVING|RED|REDEFINITION|REDUCE|REDUCED|REF|REFERENCE|REFRESH|REGEX|REJECT|REMOTE|RENAMING|REPLACE|REPLACEMENT|REPLACING|REPORT|REQUEST|REQUESTED|RESERVE|RESET|RESOLUTION|RESPECTING|RESPONSIBLE|RESULT|RESULTS|RESUMABLE|RESUME|RETRY|RETURN|RETURNCODE|RETURNING|RIGHT|RIGHT-JUSTIFIED|RIGHTPLUS|RIGHTSPACE|RISK|RMC_COMMUNICATION_FAILURE|RMC_INVALID_STATUS|RMC_SYSTEM_FAILURE|ROLE|ROLLBACK|ROUND|ROWS|RTTI|RUN|SAP|SAP-SPOOL|SAVING|SCALE_PRESERVING|SCALE_PRESERVING_SCIENTIFIC|SCAN|SCIENTIFIC|SCIENTIFIC_WITH_LEADING_ZERO|SCREEN|SCROLL|SCROLL-BOUNDARY|SCROLLING|SEARCH|SECONDARY|SECONDS|SECTION|SELECT|SELECT-OPTIONS|SELECTION|SELECTION-SCREEN|SELECTION-SET|SELECTION-SETS|SELECTION-TABLE|SELECTIONS|SELECTOR|SEND|SEPARATE|SEPARATED|SET|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN|SIGN_AS_POSTFIX|SIMPLE|SIN|SINGLE|SINH|SIZE|SKIP|SKIPPING|SMART|SOME|SORT|SORTABLE|SORTED|SOURCE|SPACE|SPECIFIED|SPLIT|SPOOL|SPOTS|SQL|SQLSCRIPT|SQRT|STABLE|STAMP|STANDARD|START-OF-SELECTION|STARTING|STATE|STATEMENT|STATEMENTS|STATIC|STATICS|STATUSINFO|STEP-LOOP|STOP|STRLEN|STRUCTURE|STRUCTURES|STYLE|SUBKEY|SUBMATCHES|SUBMIT|SUBROUTINE|SUBSCREEN|SUBSTRING|SUBTRACT|SUBTRACT-CORRESPONDING|SUFFIX|SUM|SUMMARY|SUMMING|SUPPLIED|SUPPLY|SUPPRESS|SWITCH|SWITCHSTATES|SYMBOL|SYNCPOINTS|SYNTAX|SYNTAX-CHECK|SYNTAX-TRACE|SYSTEM-CALL|SYSTEM-EXCEPTIONS|SYSTEM-EXIT|TAB|TABBED|TABLE|TABLES|TABLEVIEW|TABSTRIP|TAN|TANH|TARGET|TASK|TASKS|TEST|TESTING|TEXT|TEXTPOOL|THEN|THROW|TIME|TIMES|TIMESTAMP|TIMEZONE|TITLE|TITLE-LINES|TITLEBAR|TO|TOKENIZATION|TOKENS|TOP-LINES|TOP-OF-PAGE|TRACE-FILE|TRACE-TABLE|TRAILING|TRANSACTION|TRANSFER|TRANSFORMATION|TRANSLATE|TRANSPORTING|TRMAC|TRUNC|TRUNCATE|TRUNCATION|TRY|TYPE|TYPE-POOL|TYPE-POOLS|TYPES|ULINE|UNASSIGN|UNDER|UNICODE|UNION|UNIQUE|UNIT|UNIT_CONVERSION|UNIX|UNPACK|UNTIL|UNWIND|UP|UPDATE|UPPER|USER|USER-COMMAND|USING|UTF-8|VALID|VALUE|VALUE-REQUEST|VALUES|VARY|VARYING|VERIFICATION-MESSAGE|VERSION|VIA|VIEW|VISIBLE|WAIT|WARNING|WHEN|WHENEVER|WHERE|WHILE|WIDTH|WINDOW|WINDOWS|WITH|WITH-HEADING|WITH-TITLE|WITHOUT|WORD|WORK|WRITE|WRITER|X|XML|XOR|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE)(?![\w-])/i,
lookbehind: true
},
"number": /\b\d+\b/,
"operator": {
pattern: /(\s)(?:\*\*?|<[=>]?|>=?|\?=|[-+\/=])(?=\s)/,
lookbehind: true
},
"string-operator": {
pattern: /(\s)&&?(?=\s)/,
lookbehind: true,
alias: "keyword"
},
"token-operator": [{
pattern: /(\w)(?:->?|=>|[~|{}])(?=\w)/,
lookbehind: true,
alias: "punctuation"
}, {
pattern: /[|{}]/,
alias: "punctuation"
}],
"punctuation": /[,.:()]/
};
(function(Prism2) {
var coreRules = "(?:ALPHA|BIT|CHAR|CR|CRLF|CTL|DIGIT|DQUOTE|HEXDIG|HTAB|LF|LWSP|OCTET|SP|VCHAR|WSP)";
Prism2.languages.abnf = {
"comment": /;.*/,
"string": {
pattern: /(?:%[is])?"[^"\n\r]*"/,
greedy: true,
inside: {
"punctuation": /^%[is]/
}
},
"range": {
pattern: /%(?:b[01]+-[01]+|d\d+-\d+|x[A-F\d]+-[A-F\d]+)/i,
alias: "number"
},
"terminal": {
pattern: /%(?:b[01]+(?:\.[01]+)*|d\d+(?:\.\d+)*|x[A-F\d]+(?:\.[A-F\d]+)*)/i,
alias: "number"
},
"repetition": {
pattern: /(^|[^\w-])(?:\d*\*\d*|\d+)/,
lookbehind: true,
alias: "operator"
},
"definition": {
pattern: /(^[ \t]*)(?:[a-z][\w-]*|<[^<>\r\n]*>)(?=\s*=)/m,
lookbehind: true,
alias: "keyword",
inside: {
"punctuation": /<|>/
}
},
"core-rule": {
pattern: RegExp("(?:(^|[^<\\w-])" + coreRules + "|<" + coreRules + ">)(?![\\w-])", "i"),
lookbehind: true,
alias: ["rule", "constant"],
inside: {
"punctuation": /<|>/
}
},
"rule": {
pattern: /(^|[^<\w-])[a-z][\w-]*|<[^<>\r\n]*>/i,
lookbehind: true,
inside: {
"punctuation": /<|>/
}
},
"operator": /=\/?|\//,
"punctuation": /[()\[\]]/
};
})(Prism);
Prism.languages.actionscript = Prism.languages.extend("javascript", {
"keyword": /\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,
"operator": /\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/
});
Prism.languages.actionscript["class-name"].alias = "function";
delete Prism.languages.actionscript["parameter"];
delete Prism.languages.actionscript["literal-property"];
if (Prism.languages.markup) {
Prism.languages.insertBefore("actionscript", "string", {
"xml": {
pattern: /(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,
lookbehind: true,
inside: Prism.languages.markup
}
});
}
Prism.languages.ada = {
"comment": /--.*/,
"string": /"(?:""|[^"\r\f\n])*"/,
"number": [
{
pattern: /\b\d(?:_?\d)*#[\dA-F](?:_?[\dA-F])*(?:\.[\dA-F](?:_?[\dA-F])*)?#(?:E[+-]?\d(?:_?\d)*)?/i
},
{
pattern: /\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i
}
],
"attribute": {
pattern: /\b'\w+/,
alias: "attr-name"
},
"keyword": /\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|new|not|null|of|or|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|return|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i,
"boolean": /\b(?:false|true)\b/i,
"operator": /<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/,
"punctuation": /\.\.?|[,;():]/,
"char": /'.'/,
"variable": /\b[a-z](?:\w)*\b/i
};
(function(Prism2) {
Prism2.languages.agda = {
"comment": /\{-[\s\S]*?(?:-\}|$)|--.*/,
"string": {
pattern: /"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,
greedy: true
},
"punctuation": /[(){}⦃⦄.;@]/,
"class-name": {
pattern: /((?:data|record) +)\S+/,
lookbehind: true
},
"function": {
pattern: /(^[ \t]*)(?!\s)[^:\r\n]+(?=:)/m,
lookbehind: true
},
"operator": {
pattern: /(^\s*|\s)(?:[=|:∀→λ\\?_]|->)(?=\s)/,
lookbehind: true
},
"keyword": /\b(?:Set|abstract|constructor|data|eta-equality|field|forall|hiding|import|in|inductive|infix|infixl|infixr|instance|let|macro|module|mutual|no-eta-equality|open|overlap|pattern|postulate|primitive|private|public|quote|quoteContext|quoteGoal|quoteTerm|record|renaming|rewrite|syntax|tactic|unquote|unquoteDecl|unquoteDef|using|variable|where|with)\b/
};
})(Prism);
Prism.languages.al = {
"comment": /\/\/.*|\/\*[\s\S]*?\*\//,
"string": {
pattern: /'(?:''|[^'\r\n])*'(?!')|"(?:""|[^"\r\n])*"(?!")/,
greedy: true
},
"function": {
pattern: /(\b(?:event|procedure|trigger)\s+|(?:^|[^.])\.\s*)[a-z_]\w*(?=\s*\()/i,
lookbehind: true
},
"keyword": [
/\b(?:array|asserterror|begin|break|case|do|downto|else|end|event|exit|for|foreach|function|if|implements|in|indataset|interface|internal|local|of|procedure|program|protected|repeat|runonclient|securityfiltering|suppressdispose|temporary|then|to|trigger|until|var|while|with|withevents)\b/i,
/\b(?:action|actions|addafter|addbefore|addfirst|addlast|area|assembly|chartpart|codeunit|column|controladdin|cuegroup|customizes|dataitem|dataset|dotnet|elements|enum|enumextension|extends|field|fieldattribute|fieldelement|fieldgroup|fieldgroups|fields|filter|fixed|grid|group|key|keys|label|labels|layout|modify|moveafter|movebefore|movefirst|movelast|page|pagecustomization|pageextension|part|profile|query|repeater|report|requestpage|schema|separator|systempart|table|tableelement|tableextension|textattribute|textelement|type|usercontrol|value|xmlport)\b/i
],
"number": /\b(?:0x[\da-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)(?:F|LL?|U(?:LL?)?)?\b/i,
"boolean": /\b(?:false|true)\b/i,
"variable": /\b(?:Curr(?:FieldNo|Page|Report)|x?Rec|RequestOptionsPage)\b/,
"class-name": /\b(?:automation|biginteger|bigtext|blob|boolean|byte|char|clienttype|code|completiontriggererrorlevel|connectiontype|database|dataclassification|datascope|date|dateformula|datetime|decimal|defaultlayout|dialog|dictionary|dotnetassembly|dotnettypedeclaration|duration|errorinfo|errortype|executioncontext|executionmode|fieldclass|fieldref|fieldtype|file|filterpagebuilder|guid|httpclient|httpcontent|httpheaders|httprequestmessage|httpresponsemessage|instream|integer|joker|jsonarray|jsonobject|jsontoken|jsonvalue|keyref|list|moduledependencyinfo|moduleinfo|none|notification|notificationscope|objecttype|option|outstream|pageresult|record|recordid|recordref|reportformat|securityfilter|sessionsettings|tableconnectiontype|tablefilter|testaction|testfield|testfilterfield|testpage|testpermissions|testrequestpage|text|textbuilder|textconst|textencoding|time|transactionmodel|transactiontype|variant|verbosity|version|view|views|webserviceactioncontext|webserviceactionresultcode|xmlattribute|xmlattributecollection|xmlcdata|xmlcomment|xmldeclaration|xmldocument|xmldocumenttype|xmlelement|xmlnamespacemanager|xmlnametable|xmlnode|xmlnodelist|xmlprocessinginstruction|xmlreadoptions|xmltext|xmlwriteoptions)\b/i,
"operator": /\.\.|:[=:]|[-+*/]=?|<>|[<>]=?|=|\b(?:and|div|mod|not|or|xor)\b/i,
"punctuation": /[()\[\]{}:.;,]/
};
Prism.languages.antlr4 = {
"comment": /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,
"string": {
pattern: /'(?:\\.|[^\\'\r\n])*'/,
greedy: true
},
"character-class": {
pattern: /\[(?:\\.|[^\\\]\r\n])*\]/,
greedy: true,
alias: "regex",
inside: {
"range": {
pattern: /([^[]|(?:^|[^\\])(?:\\\\)*\\\[)-(?!\])/,
lookbehind: true,
alias: "punctuation"
},
"escape": /\\(?:u(?:[a-fA-F\d]{4}|\{[a-fA-F\d]+\})|[pP]\{[=\w-]+\}|[^\r\nupP])/,
"punctuation": /[\[\]]/
}
},
"action": {
pattern: /\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\}/,
greedy: true,
inside: {
"content": {
pattern: /(\{)[\s\S]+(?=\})/,
lookbehind: true
},
"punctuation": /[{}]/
}
},
"command": {
pattern: /(->\s*(?!\s))(?:\s*(?:,\s*)?\b[a-z]\w*(?:\s*\([^()\r\n]*\))?)+(?=\s*;)/i,
lookbehind: true,
inside: {
"function": /\b\w+(?=\s*(?:[,(]|$))/,
"punctuation": /[,()]/
}
},
"annotation": {
pattern: /@\w+(?:::\w+)*/,
alias: "keyword"
},
"label": {
pattern: /#[ \t]*\w+/,
alias: "punctuation"
},
"keyword": /\b(?:catch|channels|finally|fragment|grammar|import|lexer|locals|mode|options|parser|returns|throws|tokens)\b/,
"definition": [
{
pattern: /\b[a-z]\w*(?=\s*:)/,
alias: ["rule", "class-name"]
},
{
pattern: /\b[A-Z]\w*(?=\s*:)/,
alias: ["token", "constant"]
}
],
"constant": /\b[A-Z][A-Z_]*\b/,
"operator": /\.\.|->|[|~]|[*+?]\??/,
"punctuation": /[;:()=]/
};
Prism.languages.g4 = Prism.languages.antlr4;
Prism.languages.apacheconf = {
"comment": /#.*/,
"directive-inline": {
pattern: /(^[\t ]*)\b(?:AcceptFilter|AcceptPathInfo|AccessFileName|Action|Add(?:Alt|AltByEncoding|AltByType|Charset|DefaultCharset|Description|Encoding|Handler|Icon|IconByEncoding|IconByType|InputFilter|Language|ModuleInfo|OutputFilter|OutputFilterByType|Type)|Alias|AliasMatch|Allow(?:CONNECT|EncodedSlashes|Methods|Override|OverrideList)?|Anonymous(?:_LogEmail|_MustGiveEmail|_NoUserID|_VerifyEmail)?|AsyncRequestWorkerFactor|Auth(?:BasicAuthoritative|BasicFake|BasicProvider|BasicUseDigestAlgorithm|DBDUserPWQuery|DBDUserRealmQuery|DBMGroupFile|DBMType|DBMUserFile|Digest(?:Algorithm|Domain|NonceLifetime|Provider|Qop|ShmemSize)|Form(?:Authoritative|Body|DisableNoStore|FakeBasicAuth|Location|LoginRequiredLocation|LoginSuccessLocation|LogoutLocation|Method|Mimetype|Password|Provider|SitePassphrase|Size|Username)|GroupFile|LDAP(?:AuthorizePrefix|BindAuthoritative|BindDN|BindPassword|CharsetConfig|CompareAsUser|CompareDNOnServer|DereferenceAliases|GroupAttribute|GroupAttributeIsDN|InitialBindAsUser|InitialBindPattern|MaxSubGroupDepth|RemoteUserAttribute|RemoteUserIsDN|SearchAsUser|SubGroupAttribute|SubGroupClass|Url)|Merging|Name|nCache(?:Context|Enable|ProvideFor|SOCache|Timeout)|nzFcgiCheckAuthnProvider|nzFcgiDefineProvider|Type|UserFile|zDBDLoginToReferer|zDBDQuery|zDBDRedirectQuery|zDBMType|zSendForbiddenOnFailure)|BalancerGrowth|BalancerInherit|BalancerMember|BalancerPersist|BrowserMatch|BrowserMatchNoCase|BufferedLogs|BufferSize|Cache(?:DefaultExpire|DetailHeader|DirLength|DirLevels|Disable|Enable|File|Header|IgnoreCacheControl|IgnoreHeaders|IgnoreNoLastMod|IgnoreQueryString|IgnoreURLSessionIdentifiers|KeyBaseURL|LastModifiedFactor|Lock|LockMaxAge|LockPath|MaxExpire|MaxFileSize|MinExpire|MinFileSize|NegotiatedDocs|QuickHandler|ReadSize|ReadTime|Root|Socache(?:MaxSize|MaxTime|MinTime|ReadSize|ReadTime)?|StaleOnError|StoreExpired|StoreNoStore|StorePrivate)|CGIDScriptTimeout|CGIMapExtension|CharsetDefault|CharsetOptions|CharsetSourceEnc|CheckCaseOnly|CheckSpelling|ChrootDir|ContentDigest|CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking|CoreDumpDirectory|CustomLog|Dav|DavDepthInfinity|DavGenericLockDB|DavLockDB|DavMinTimeout|DBDExptime|DBDInitSQL|DBDKeep|DBDMax|DBDMin|DBDParams|DBDPersist|DBDPrepareSQL|DBDriver|DefaultIcon|DefaultLanguage|DefaultRuntimeDir|DefaultType|Define|Deflate(?:BufferSize|CompressionLevel|FilterNote|InflateLimitRequestBody|InflateRatio(?:Burst|Limit)|MemLevel|WindowSize)|Deny|DirectoryCheckHandler|DirectoryIndex|DirectoryIndexRedirect|DirectorySlash|DocumentRoot|DTracePrivileges|DumpIOInput|DumpIOOutput|EnableExceptionHook|EnableMMAP|EnableSendfile|Error|ErrorDocument|ErrorLog|ErrorLogFormat|Example|ExpiresActive|ExpiresByType|ExpiresDefault|ExtendedStatus|ExtFilterDefine|ExtFilterOptions|FallbackResource|FileETag|FilterChain|FilterDeclare|FilterProtocol|FilterProvider|FilterTrace|ForceLanguagePriority|ForceType|ForensicLog|GprofDir|GracefulShutdownTimeout|Group|Header|HeaderName|Heartbeat(?:Address|Listen|MaxServers|Storage)|HostnameLookups|IdentityCheck|IdentityCheckTimeout|ImapBase|ImapDefault|ImapMenu|Include|IncludeOptional|Index(?:HeadInsert|Ignore|IgnoreReset|Options|OrderDefault|StyleSheet)|InputSed|ISAPI(?:AppendLogToErrors|AppendLogToQuery|CacheFile|FakeAsync|LogNotSupported|ReadAheadBuffer)|KeepAlive|KeepAliveTimeout|KeptBodySize|LanguagePriority|LDAP(?:CacheEntries|CacheTTL|ConnectionPoolTTL|ConnectionTimeout|LibraryDebug|OpCacheEntries|OpCacheTTL|ReferralHopLimit|Referrals|Retries|RetryDelay|SharedCacheFile|SharedCacheSize|Timeout|TrustedClientCert|TrustedGlobalCert|TrustedMode|VerifyServerCert)|Limit(?:InternalRecursion|Request(?:Body|Fields|FieldSize|Line)|XMLRequestBody)|Listen|ListenBackLog|LoadFile|LoadModule|LogFormat|LogLevel|LogMessage|LuaAuthzProvider|LuaCodeCache|Lua(?:Hook(?:AccessChecker|AuthChecker|CheckUserID|Fixups|InsertFilter|Log|MapToStorage|TranslateName|TypeChecker)|Inherit|InputFilter|MapHandler|OutputFilter|PackageCPath|PackagePath|QuickHandler|Root|Scope)|Max(?:ConnectionsPerChild|KeepAliveRequests|MemFree|RangeOverlaps|RangeReversals|Ranges|RequestWorkers|SpareServers|SpareThreads|Threads)|MergeTrailers|MetaDir|MetaFiles|MetaSuffix|MimeMagicFile|MinSpareServers|MinSpareThreads|MMapFile|ModemStandard|ModMimeUsePathInfo|MultiviewsMatch|Mutex|NameVirtualHost|NoProxy|NWSSLTrustedCerts|NWSSLUpgradeable|Options|Order|OutputSed|PassEnv|PidFile|PrivilegesMode|Protocol|ProtocolEcho|Proxy(?:AddHeaders|BadHeader|Block|Domain|ErrorOverride|ExpressDBMFile|ExpressDBMType|ExpressEnable|FtpDirCharset|FtpEscapeWildcards|FtpListOnWildcard|HTML(?:BufSize|CharsetOut|DocType|Enable|Events|Extended|Fixups|Interp|Links|Meta|StripComments|URLMap)|IOBufferSize|MaxForwards|Pass(?:Inherit|InterpolateEnv|Match|Reverse|ReverseCookieDomain|ReverseCookiePath)?|PreserveHost|ReceiveBufferSize|Remote|RemoteMatch|Requests|SCGIInternalRedirect|SCGISendfile|Set|SourceAddress|Status|Timeout|Via)|ReadmeName|ReceiveBufferSize|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ReflectorHeader|RemoteIP(?:Header|InternalProxy|InternalProxyList|ProxiesHeader|TrustedProxy|TrustedProxyList)|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|RequestHeader|RequestReadTimeout|Require|Rewrite(?:Base|Cond|Engine|Map|Options|Rule)|RLimitCPU|RLimitMEM|RLimitNPROC|Satisfy|ScoreBoardFile|Script(?:Alias|AliasMatch|InterpreterSource|Log|LogBuffer|LogLength|Sock)?|SecureListen|SeeRequestTail|SendBufferSize|Server(?:Admin|Alias|Limit|Name|Path|Root|Signature|Tokens)|Session(?:Cookie(?:Name|Name2|Remove)|Crypto(?:Cipher|Driver|Passphrase|PassphraseFile)|DBD(?:CookieName|CookieName2|CookieRemove|DeleteLabel|InsertLabel|PerUser|SelectLabel|UpdateLabel)|Env|Exclude|Header|Include|MaxAge)?|SetEnv|SetEnvIf|SetEnvIfExpr|SetEnvIfNoCase|SetHandler|SetInputFilter|SetOutputFilter|SSIEndTag|SSIErrorMsg|SSIETag|SSILastModified|SSILegacyExprParser|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|SSL(?:CACertificateFile|CACertificatePath|CADNRequestFile|CADNRequestPath|CARevocationCheck|CARevocationFile|CARevocationPath|CertificateChainFile|CertificateFile|CertificateKeyFile|CipherSuite|Compression|CryptoDevice|Engine|FIPS|HonorCipherOrder|InsecureRenegotiation|OCSP(?:DefaultResponder|Enable|OverrideResponder|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|UseRequestNonce)|OpenSSLConfCmd|Options|PassPhraseDialog|Protocol|Proxy(?:CACertificateFile|CACertificatePath|CARevocation(?:Check|File|Path)|CheckPeer(?:CN|Expire|Name)|CipherSuite|Engine|MachineCertificate(?:ChainFile|File|Path)|Protocol|Verify|VerifyDepth)|RandomSeed|RenegBufferSize|Require|RequireSSL|Session(?:Cache|CacheTimeout|TicketKeyFile|Tickets)|SRPUnknownUserSeed|SRPVerifierFile|Stapling(?:Cache|ErrorCacheTimeout|FakeTryLater|ForceURL|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|ReturnResponderErrors|StandardCacheTimeout)|StrictSNIVHostCheck|UserName|UseStapling|VerifyClient|VerifyDepth)|StartServers|StartThreads|Substitute|Suexec|SuexecUserGroup|ThreadLimit|ThreadsPerChild|ThreadStackSize|TimeOut|TraceEnable|TransferLog|TypesConfig|UnDefine|UndefMacro|UnsetEnv|Use|UseCanonicalName|UseCanonicalPhysicalPort|User|UserDir|VHostCGIMode|VHostCGIPrivs|VHostGroup|VHostPrivs|VHostSecure|VHostUser|Virtual(?:DocumentRoot|ScriptAlias)(?:IP)?|WatchdogInterval|XBitHack|xml2EncAlias|xml2EncDefault|xml2StartParse)\b/im,
lookbehind: true,
alias: "property"
},
"directive-block": {
pattern: /<\/?\b(?:Auth[nz]ProviderAlias|Directory|DirectoryMatch|Else|ElseIf|Files|FilesMatch|If|IfDefine|IfModule|IfVersion|Limit|LimitExcept|Location|LocationMatch|Macro|Proxy|Require(?:All|Any|None)|VirtualHost)\b.*>/i,
inside: {
"directive-block": {
pattern: /^<\/?\w+/,
inside: {
"punctuation": /^<\/?/
},
alias: "tag"
},
"directive-block-parameter": {
pattern: /.*[^>]/,
inside: {
"punctuation": /:/,
"string": {
pattern: /("|').*\1/,
inside: {
"variable": /[$%]\{?(?:\w\.?[-+:]?)+\}?/
}
}
},
alias: "attr-value"
},
"punctuation": />/
},
alias: "tag"
},
"directive-flags": {
pattern: /\[(?:[\w=],?)+\]/,
alias: "keyword"
},
"string": {
pattern: /("|').*\1/,
inside: {
"variable": /[$%]\{?(?:\w\.?[-+:]?)+\}?/
}
},
"variable": /[$%]\{?(?:\w\.?[-+:]?)+\}?/,
"regex": /\^?.*\$|\^.*\$?/
};
Prism.languages.sql = {
"comment": {
pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,
lookbehind: true
},
"variable": [
{
pattern: /@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,
greedy: true
},
/@[\w.$]+/
],
"string": {
pattern: /(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,
greedy: true,
lookbehind: true
},
"identifier": {
pattern: /(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,
greedy: true,
lookbehind: true,
inside: {
"punctuation": /^`|`$/
}
},
"function": /\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,
"keyword": /\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,
"boolean": /\b(?:FALSE|NULL|TRUE)\b/i,
"number": /\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,
"operator": /[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,
"punctuation": /[;[\]()`,.]/
};
(function(Prism2) {
var keywords = /\b(?:(?:after|before)(?=\s+[a-z])|abstract|activate|and|any|array|as|asc|autonomous|begin|bigdecimal|blob|boolean|break|bulk|by|byte|case|cast|catch|char|class|collect|commit|const|continue|currency|date|datetime|decimal|default|delete|desc|do|double|else|end|enum|exception|exit|export|extends|final|finally|float|for|from|get(?=\s*[{};])|global|goto|group|having|hint|if|implements|import|in|inner|insert|instanceof|int|integer|interface|into|join|like|limit|list|long|loop|map|merge|new|not|null|nulls|number|object|of|on|or|outer|override|package|parallel|pragma|private|protected|public|retrieve|return|rollback|select|set|short|sObject|sort|static|string|super|switch|synchronized|system|testmethod|then|this|throw|time|transaction|transient|trigger|try|undelete|update|upsert|using|virtual|void|webservice|when|where|while|(?:inherited|with|without)\s+sharing)\b/i;
var className = /\b(?:(?=[a-z_]\w*\s*[<\[])|(?!<keyword>))[A-Z_]\w*(?:\s*\.\s*[A-Z_]\w*)*\b(?:\s*(?:\[\s*\]|<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>))*/.source.replace(/<keyword>/g, function() {
return keywords.source;
});
function insertClassName(pattern) {
return RegExp(pattern.replace(/<CLASS-NAME>/g, function() {
return className;
}), "i");
}
var classNameInside = {
"keyword": keywords,
"punctuation": /[()\[\]{};,:.<>]/
};
Prism2.languages.apex = {
"comment": Prism2.languages.clike.comment,
"string": Prism2.languages.clike.string,
"sql": {
pattern: /((?:[=,({:]|\breturn)\s*)\[[^\[\]]*\]/i,
lookbehind: true,
greedy: true,
alias: "language-sql",
inside: Prism2.languages.sql
},
"annotation": {
pattern: /@\w+\b/,
alias: "punctuation"
},
"class-name": [
{
pattern: insertClassName(/(\b(?:class|enum|extends|implements|instanceof|interface|new|trigger\s+\w+\s+on)\s+)<CLASS-NAME>/.source),
lookbehind: true,
inside: classNameInside
},
{
pattern: insertClassName(/(\(\s*)<CLASS-NAME>(?=\s*\)\s*[\w(])/.source),
lookbehind: true,
inside: classNameInside
},
{
pattern: insertClassName(/<CLASS-NAME>(?=\s*\w+\s*[;=,(){:])/.source),
inside: classNameInside
}
],
"trigger": {
pattern: /(\btrigger\s+)\w+\b/i,
lookbehind: true,
alias: "class-name"
},
"keyword": keywords,
"function": /\b[a-z_]\w*(?=\s*\()/i,
"boolean": /\b(?:false|true)\b/i,
"number": /(?:\B\.\d+|\b\d+(?:\.\d+|L)?)\b/i,
"operator": /[!=](?:==?)?|\?\.?|&&|\|\||--|\+\+|[-+*/^&|]=?|:|<<?=?|>{1,3}=?/,
"punctuation": /[()\[\]{};,.]/
};
})(Prism);
Prism.languages.apl = {
"comment": /(?:⍝|#[! ]).*$/m,
"string": {
pattern: /'(?:[^'\r\n]|'')*'/,
greedy: true
},
"number": /¯?(?:\d*\.?\b\d+(?:e[+¯]?\d+)?|¯|∞)(?:j¯?(?:(?:\d+(?:\.\d+)?|\.\d+)(?:e[+¯]?\d+)?|¯|∞))?/i,
"statement": /:[A-Z][a-z][A-Za-z]*\b/,
"system-function": {
pattern: /⎕[A-Z]+/i,
alias: "function"
},
"constant": /[⍬⌾#⎕⍞]/,
"function": /[-+×÷⌈⌊∣|⍳⍸?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⊆⊇⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⍯↗¤→]/,
"monadic-operator": {
pattern: /[\\\/⌿⍀¨⍨⌶&∥]/,
alias: "operator"
},
"dyadic-operator": {
pattern: /[.⍣⍠⍤∘⌸@⌺⍥]/,
alias: "operator"
},
"assignment": {
pattern: /←/,
alias: "keyword"
},
"punctuation": /[\[;\]()◇⋄]/,
"dfn": {
pattern: /[{}⍺⍵⍶⍹∇⍫:]/,
alias: "builtin"
}
};
Prism.languages.applescript = {
"comment": [
/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,
/--.+/,
/#.+/
],
"string": /"(?:\\.|[^"\\\r\n])*"/,
"number": /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?\b/i,
"operator": [
/[&=≠≤≥*+\-\/÷^]|[<>]=?/,
/\b(?:(?:begin|end|start)s? with|(?:contains?|(?:does not|doesn't) contain)|(?:is|isn't|is not) (?:contained by|in)|(?:(?:is|isn't|is not) )?(?:greater|less) than(?: or equal)?(?: to)?|(?:comes|(?:does not|doesn't) come) (?:after|before)|(?:is|isn't|is not) equal(?: to)?|(?:(?:does not|doesn't) equal|equal to|equals|is not|isn't)|(?:a )?(?:ref(?: to)?|reference to)|(?:and|as|div|mod|not|or))\b/
],
"keyword": /\b(?:about|above|after|against|apart from|around|aside from|at|back|before|beginning|behind|below|beneath|beside|between|but|by|considering|continue|copy|does|eighth|else|end|equal|error|every|exit|false|fifth|first|for|fourth|from|front|get|given|global|if|ignoring|in|instead of|into|is|it|its|last|local|me|middle|my|ninth|of|on|onto|out of|over|prop|property|put|repeat|return|returning|second|set|seventh|since|sixth|some|tell|tenth|that|the|then|third|through|thru|timeout|times|to|transaction|true|try|until|where|while|whose|with|without)\b/,
"class-name": /\b(?:POSIX file|RGB color|alias|application|boolean|centimeters|centimetres|class|constant|cubic centimeters|cubic centimetres|cubic feet|cubic inches|cubic meters|cubic metres|cubic yards|date|degrees Celsius|degrees Fahrenheit|degrees Kelvin|feet|file|gallons|grams|inches|integer|kilograms|kilometers|kilometres|list|liters|litres|meters|metres|miles|number|ounces|pounds|quarts|real|record|reference|script|square feet|square kilometers|square kilometres|square meters|square metres|square miles|square yards|text|yards)\b/,
"punctuation": /[{}():,¬«»《》]/
};
Prism.languages.aql = {
"comment": /\/\/.*|\/\*[\s\S]*?\*\//,
"property": {
pattern: /([{,]\s*)(?:(?!\d)\w+|(["'´`])(?:(?!\2)[^\\\r\n]|\\.)*\2)(?=\s*:)/,
lookbehind: true,
greedy: true
},
"string": {
pattern: /(["'])(?:(?!\1)[^\\\r\n]|\\.)*\1/,
greedy: true
},
"identifier": {
pattern: /([´`])(?:(?!\1)[^\\\r\n]|\\.)*\1/,
greedy: true
},
"variable": /@@?\w+/,
"keyword": [
{
pattern: /(\bWITH\s+)COUNT(?=\s+INTO\b)/i,
lookbehind: true
},
/\b(?:AGGREGATE|ALL|AND|ANY|ASC|COLLECT|DESC|DISTINCT|FILTER|FOR|GRAPH|IN|INBOUND|INSERT|INTO|K_PATHS|K_SHORTEST_PATHS|LET|LIKE|LIMIT|NONE|NOT|NULL|OR|OUTBOUND|REMOVE|REPLACE|RETURN|SHORTEST_PATH|SORT|UPDATE|UPSERT|WINDOW|WITH)\b/i,
{
pattern: /(^|[^\w.[])(?:KEEP|PRUNE|SEARCH|TO)\b/i,
lookbehind: true
},
{
pattern: /(^|[^\w.[])(?:CURRENT|NEW|OLD)\b/,
lookbehind: true
},
{
pattern: /\bOPTIONS(?=\s*\{)/i
}
],
"function": /\b(?!\d)\w+(?=\s*\()/,
"boolean": /\b(?:false|true)\b/i,
"range": {
pattern: /\.\./,
alias: "operator"
},
"number": [
/\b0b[01]+/i,
/\b0x[0-9a-f]+/i,
/(?:\B\.\d+|\b(?:0|[1-9]\d*)(?:\.\d+)?)(?:e[+-]?\d+)?/i
],
"operator": /\*{2,}|[=!]~|[!=<>]=?|&&|\|\||[-+*/%]/,
"punctuation": /::|[?.:,;()[\]{}]/
};
Prism.languages.c = Prism.languages.extend("clike", {
"comment": {
pattern: /\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,
greedy: true
},
"string": {
pattern: /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,
greedy: true
},
"class-name": {
pattern: /(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,
lookbehind: true
},
"keyword": /\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,
"function": /\b[a-z_]\w*(?=\s*\()/i,
"number": /(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,
"operator": />>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/
});
Prism.languages.insertBefore("c", "string", {
"char": {
pattern: /'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,
greedy: true
}
});
Prism.languages.insertBefore("c", "string", {
"macro": {
pattern: /(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,
lookbehind: true,
greedy: true,
alias: "property",
inside: {
"string": [
{
pattern: /^(#\s*include\s*)<[^>]+>/,
lookbehind: true
},
Prism.languages.c["string"]
],
"char": Prism.languages.c["char"],
"comment": Prism.languages.c["comment"],
"macro-name": [
{
pattern: /(^#\s*define\s+)\w+\b(?!\()/i,
lookbehind: true
},
{
pattern: /(^#\s*define\s+)\w+\b(?=\()/i,
lookbehind: true,
alias: "function"
}
],
"directive": {
pattern: /^(#\s*)[a-z]+/,
lookbehind: true,
alias: "keyword"
},
"directive-hash": /^#/,
"punctuation": /##|\\(?=[\r\n])/,
"expression": {
pattern: /\S[\s\S]*/,
inside: Prism.languages.c
}
}
}
});
Prism.languages.insertBefore("c", "function", {
"constant": /\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/
});
delete Prism.languages.c["boolean"];
(function(Prism2) {
var keyword = /\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/;
var modName = /\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g, function() {
return keyword.source;
});
Prism2.languages.cpp = Prism2.languages.extend("c", {
"class-name": [
{
pattern: RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g, function() {
return keyword.source;
})),
lookbehind: true
},
/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,
/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,
/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/
],
"keyword": keyword,
"number": {
pattern: /(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,
greedy: true
},
"operator": />>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,
"boolean": /\b(?:false|true)\b/
});
Prism2.languages.insertBefore("cpp", "string", {
"module": {
pattern: RegExp(/(\b(?:import|module)\s+)/.source + "(?:" + /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source + "|" + /<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g, function() {
return modName;
}) + ")"),
lookbehind: true,
greedy: true,
inside: {
"string": /^[<"][\s\S]+/,
"operator": /:/,
"punctuation": /\./
}
},
"raw-string": {
pattern: /R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,
alias: "string",
greedy: true
}
});
Prism2.languages.insertBefore("cpp", "keyword", {
"generic-function": {
pattern: /\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,
inside: {
"function": /^\w+/,
"generic": {
pattern: /<[\s\S]+/,
alias: "class-name",
inside: Prism2.languages.cpp
}
}
}
});
Prism2.languages.insertBefore("cpp", "operator", {
"double-colon": {
pattern: /::/,
alias: "punctuation"
}
});
Prism2.languages.insertBefore("cpp", "class-name", {
"base-clause": {
pattern: /(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,
lookbehind: true,
greedy: true,
inside: Prism2.languages.extend("cpp", {})
}
});
Prism2.languages.insertBefore("inside", "double-colon", {
"class-name": /\b[a-z_]\w*\b(?!\s*::)/i
}, Prism2.languages.cpp["base-clause"]);
})(Prism);
Prism.languages.arduino = Prism.languages.extend("cpp", {
"keyword": /\b(?:String|array|bool|boolean|break|byte|case|catch|continue|default|do|double|else|finally|for|function|goto|if|in|instanceof|int|integer|long|loop|new|null|return|setup|string|switch|throw|try|void|while|word)\b/,
"constant": /\b(?:ANALOG_MESSAGE|DEFAULT|DIGITAL_MESSAGE|EXTERNAL|FIRMATA_STRING|HIGH|INPUT|INPUT_PULLUP|INTERNAL|INTERNAL1V1|INTERNAL2V56|LED_BUILTIN|LOW|OUTPUT|REPORT_ANALOG|REPORT_DIGITAL|SET_PIN_MODE|SYSEX_START|SYSTEM_RESET)\b/,
"builtin": /\b(?:Audio|BSSID|Bridge|Client|Console|EEPROM|Esplora|EsploraTFT|Ethernet|EthernetClient|EthernetServer|EthernetUDP|File|FileIO|FileSystem|Firmata|GPRS|GSM|GSMBand|GSMClient|GSMModem|GSMPIN|GSMScanner|GSMServer|GSMVoiceCall|GSM_SMS|HttpClient|IPAddress|IRread|Keyboard|KeyboardController|LiquidCrystal|LiquidCrystal_I2C|Mailbox|Mouse|MouseController|PImage|Process|RSSI|RobotControl|RobotMotor|SD|SPI|SSID|Scheduler|Serial|Server|Servo|SoftwareSerial|Stepper|Stream|TFT|Task|USBHost|WiFi|WiFiClient|WiFiServer|WiFiUDP|Wire|YunClient|YunServer|abs|addParameter|analogRead|analogReadResolution|analogReference|analogWrite|analogWriteResolution|answerCall|attach|attachGPRS|attachInterrupt|attached|autoscroll|available|background|beep|begin|beginPacket|beginSD|beginSMS|beginSpeaker|beginTFT|beginTransmission|beginWrite|bit|bitClear|bitRead|bitSet|bitWrite|blink|blinkVersion|buffer|changePIN|checkPIN|checkPUK|checkReg|circle|cityNameRead|cityNameWrite|clear|clearScreen|click|close|compassRead|config|connect|connected|constrain|cos|countryNameRead|countryNameWrite|createChar|cursor|debugPrint|delay|delayMicroseconds|detach|detachInterrupt|digitalRead|digitalWrite|disconnect|display|displayLogos|drawBMP|drawCompass|encryptionType|end|endPacket|endSMS|endTransmission|endWrite|exists|exitValue|fill|find|findUntil|flush|gatewayIP|get|getAsynchronously|getBand|getButton|getCurrentCarrier|getIMEI|getKey|getModifiers|getOemKey|getPINUsed|getResult|getSignalStrength|getSocket|getVoiceCallStatus|getXChange|getYChange|hangCall|height|highByte|home|image|interrupts|isActionDone|isDirectory|isListening|isPIN|isPressed|isValid|keyPressed|keyReleased|keyboardRead|knobRead|leftToRight|line|lineFollowConfig|listen|listenOnLocalhost|loadImage|localIP|lowByte|macAddress|maintain|map|max|messageAvailable|micros|millis|min|mkdir|motorsStop|motorsWrite|mouseDragged|mouseMoved|mousePressed|mouseReleased|move|noAutoscroll|noBlink|noBuffer|noCursor|noDisplay|noFill|noInterrupts|noListenOnLocalhost|noStroke|noTone|onReceive|onRequest|open|openNextFile|overflow|parseCommand|parseFloat|parseInt|parsePacket|pauseMode|peek|pinMode|playFile|playMelody|point|pointTo|position|pow|prepare|press|print|printFirmwareVersion|printVersion|println|process|processInput|pulseIn|put|random|randomSeed|read|readAccelerometer|readBlue|readButton|readBytes|readBytesUntil|readGreen|readJoystickButton|readJoystickSwitch|readJoystickX|readJoystickY|readLightSensor|readMessage|readMicrophone|readNetworks|readRed|readSlider|readString|readStringUntil|readTemperature|ready|rect|release|releaseAll|remoteIP|remoteNumber|remotePort|remove|requestFrom|retrieveCallingNumber|rewindDirectory|rightToLeft|rmdir|robotNameRead|robotNameWrite|run|runAsynchronously|runShellCommand|runShellCommandAsynchronously|running|scanNetworks|scrollDisplayLeft|scrollDisplayRight|seek|sendAnalog|sendDigitalPortPair|sendDigitalPorts|sendString|sendSysex|serialEvent|setBand|setBitOrder|setClockDivider|setCursor|setDNS|setDataMode|setFirmwareVersion|setMode|setPINUsed|setSpeed|setTextSize|setTimeout|shiftIn|shiftOut|shutdown|sin|size|sqrt|startLoop|step|stop|stroke|subnetMask|switchPIN|tan|tempoWrite|text|tone|transfer|tuneWrite|turn|updateIR|userNameRead|userNameWrite|voiceCall|waitContinue|width|write|writeBlue|writeGreen|writeJSON|writeMessage|writeMicroseconds|writeRGB|writeRed|yield)\b/
});
Prism.languages.ino = Prism.languages.arduino;
Prism.languages.arff = {
"comment": /%.*/,
"string": {
pattern: /(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"keyword": /@(?:attribute|data|end|relation)\b/i,
"number": /\b\d+(?:\.\d+)?\b/,
"punctuation": /[{},]/
};
Prism.languages.armasm = {
"comment": {
pattern: /;.*/,
greedy: true
},
"string": {
pattern: /"(?:[^"\r\n]|"")*"/,
greedy: true,
inside: {
"variable": {
pattern: /((?:^|[^$])(?:\${2})*)\$\w+/,
lookbehind: true
}
}
},
"char": {
pattern: /'(?:[^'\r\n]{0,4}|'')'/,
greedy: true
},
"version-symbol": {
pattern: /\|[\w@]+\|/,
greedy: true,
alias: "property"
},
"boolean": /\b(?:FALSE|TRUE)\b/,
"directive": {
pattern: /\b(?:ALIAS|ALIGN|AREA|ARM|ASSERT|ATTR|CN|CODE|CODE16|CODE32|COMMON|CP|DATA|DCB|DCD|DCDO|DCDU|DCFD|DCFDU|DCI|DCQ|DCQU|DCW|DCWU|DN|ELIF|ELSE|END|ENDFUNC|ENDIF|ENDP|ENTRY|EQU|EXPORT|EXPORTAS|EXTERN|FIELD|FILL|FN|FUNCTION|GBLA|GBLL|GBLS|GET|GLOBAL|IF|IMPORT|INCBIN|INCLUDE|INFO|KEEP|LCLA|LCLL|LCLS|LTORG|MACRO|MAP|MEND|MEXIT|NOFP|OPT|PRESERVE8|PROC|QN|READONLY|RELOC|REQUIRE|REQUIRE8|RLIST|ROUT|SETA|SETL|SETS|SN|SPACE|SUBT|THUMB|THUMBX|TTL|WEND|WHILE)\b/,
alias: "property"
},
"instruction": {
pattern: /((?:^|(?:^|[^\\])(?:\r\n?|\n))[ \t]*(?:(?:[A-Z][A-Z0-9_]*[a-z]\w*|[a-z]\w*|\d+)[ \t]+)?)\b[A-Z.]+\b/,
lookbehind: true,
alias: "keyword"
},
"variable": /\$\w+/,
"number": /(?:\b[2-9]_\d+|(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e-?\d+)?|\b0(?:[fd]_|x)[0-9a-f]+|&[0-9a-f]+)\b/i,
"register": {
pattern: /\b(?:r\d|lr)\b/,
alias: "symbol"
},
"operator": /<>|<<|>>|&&|\|\||[=!<>/]=?|[+\-*%#?&|^]|:[A-Z]+:/,
"punctuation": /[()[\],]/
};
Prism.languages["arm-asm"] = Prism.languages.armasm;
(function(Prism2) {
var createLanguageString = function(lang, pattern) {
return {
pattern: RegExp(/\{!/.source + "(?:" + (pattern || lang) + ")" + /$[\s\S]*\}/.source, "m"),
greedy: true,
inside: {
"embedded": {
pattern: /(^\{!\w+\b)[\s\S]+(?=\}$)/,
lookbehind: true,
alias: "language-" + lang,
inside: Prism2.languages[lang]
},
"string": /[\s\S]+/
}
};
};
Prism2.languages.arturo = {
"comment": {
pattern: /;.*/,
greedy: true
},
"character": {
pattern: /`.`/,
alias: "char",
greedy: true
},
"number": {
pattern: /\b\d+(?:\.\d+(?:\.\d+(?:-[\w+-]+)?)?)?\b/
},
"string": {
pattern: /"(?:[^"\\\r\n]|\\.)*"/,
greedy: true
},
"regex": {
pattern: /\{\/.*?\/\}/,
greedy: true
},
"html-string": createLanguageString("html"),
"css-string": createLanguageString("css"),
"js-string": createLanguageString("js"),
"md-string": createLanguageString("md"),
"sql-string": createLanguageString("sql"),
"sh-string": createLanguageString("shell", "sh"),
"multistring": {
pattern: /».*|\{:[\s\S]*?:\}|\{[\s\S]*?\}|^-{6}$[\s\S]*/m,
alias: "string",
greedy: true
},
"label": {
pattern: /\w+\b\??:/,
alias: "property"
},
"literal": {
pattern: /'(?:\w+\b\??:?)/,
alias: "constant"
},
"type": {
pattern: /:(?:\w+\b\??:?)/,
alias: "class-name"
},
"color": /#\w+/,
"predicate": {
pattern: /\b(?:all|and|any|ascii|attr|attribute|attributeLabel|binary|block|char|contains|database|date|dictionary|empty|equal|even|every|exists|false|floating|function|greater|greaterOrEqual|if|in|inline|integer|is|key|label|leap|less|lessOrEqual|literal|logical|lower|nand|negative|nor|not|notEqual|null|numeric|odd|or|path|pathLabel|positive|prefix|prime|regex|same|set|some|sorted|standalone|string|subset|suffix|superset|symbol|symbolLiteral|true|try|type|unless|upper|when|whitespace|word|xnor|xor|zero)\?/,
alias: "keyword"
},
"builtin-function": {
pattern: /\b(?:abs|acos|acosh|acsec|acsech|actan|actanh|add|after|alert|alias|and|angle|append|arg|args|arity|array|as|asec|asech|asin|asinh|atan|atan2|atanh|attr|attrs|average|before|benchmark|blend|break|call|capitalize|case|ceil|chop|clear|clip|close|color|combine|conj|continue|copy|cos|cosh|crc|csec|csech|ctan|ctanh|cursor|darken|dec|decode|define|delete|desaturate|deviation|dialog|dictionary|difference|digest|digits|div|do|download|drop|dup|e|else|empty|encode|ensure|env|escape|execute|exit|exp|extend|extract|factors|fdiv|filter|first|flatten|floor|fold|from|function|gamma|gcd|get|goto|hash|hypot|if|inc|indent|index|infinity|info|input|insert|inspect|intersection|invert|jaro|join|keys|kurtosis|last|let|levenshtein|lighten|list|ln|log|loop|lower|mail|map|match|max|median|min|mod|module|mul|nand|neg|new|nor|normalize|not|now|null|open|or|outdent|pad|palette|panic|path|pause|permissions|permutate|pi|pop|popup|pow|powerset|powmod|prefix|print|prints|process|product|query|random|range|read|relative|remove|rename|render|repeat|replace|request|return|reverse|round|sample|saturate|script|sec|sech|select|serve|set|shl|shr|shuffle|sin|sinh|size|skewness|slice|sort|spin|split|sqrt|squeeze|stack|strip|sub|suffix|sum|switch|symbols|symlink|sys|take|tan|tanh|terminal|terminate|to|truncate|try|type|unclip|union|unique|unless|until|unzip|upper|values|var|variance|volume|webview|while|with|wordwrap|write|xnor|xor|zip)\b/,
alias: "keyword"
},
"sugar": {
pattern: /->|=>|\||::/,
alias: "operator"
},
"punctuation": /[()[\],]/,
"symbol": {
pattern: /<:|-:|ø|@|#|\+|\||\*|\$|---|-|%|\/|\.\.|\^|~|=|<|>|\\/
},
"boolean": {
pattern: /\b(?:false|maybe|true)\b/
}
};
Prism2.languages.art = Prism2.languages["arturo"];
})(Prism);
(function(Prism2) {
var attributes = {
pattern: /(^[ \t]*)\[(?!\[)(?:(["'$`])(?:(?!\2)[^\\]|\\.)*\2|\[(?:[^\[\]\\]|\\.)*\]|[^\[\]\\"'$`]|\\.)*\]/m,
lookbehind: true,
inside: {
"quoted": {
pattern: /([$`])(?:(?!\1)[^\\]|\\.)*\1/,
inside: {
"punctuation": /^[$`]|[$`]$/
}
},
"interpreted": {
pattern: /'(?:[^'\\]|\\.)*'/,
inside: {
"punctuation": /^'|'$/
}
},
"string": /"(?:[^"\\]|\\.)*"/,
"variable": /\w+(?==)/,
"punctuation": /^\[|\]$|,/,
"operator": /=/,
"attr-value": /(?!^\s+$).+/
}
};
var asciidoc = Prism2.languages.asciidoc = {
"comment-block": {
pattern: /^(\/{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1/m,
alias: "comment"
},
"table": {
pattern: /^\|={3,}(?:(?:\r?\n|\r(?!\n)).*)*?(?:\r?\n|\r)\|={3,}$/m,
inside: {
"specifiers": {
pattern: /(?:(?:(?:\d+(?:\.\d+)?|\.\d+)[+*](?:[<^>](?:\.[<^>])?|\.[<^>])?|[<^>](?:\.[<^>])?|\.[<^>])[a-z]*|[a-z]+)(?=\|)/,
alias: "attr-value"
},
"punctuation": {
pattern: /(^|[^\\])[|!]=*/,
lookbehind: true
}
}
},
"passthrough-block": {
pattern: /^(\+{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,
inside: {
"punctuation": /^\++|\++$/
}
},
"literal-block": {
pattern: /^(-{4,}|\.{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,
inside: {
"punctuation": /^(?:-+|\.+)|(?:-+|\.+)$/
}
},
"other-block": {
pattern: /^(--|\*{4,}|_{4,}|={4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,
inside: {
"punctuation": /^(?:-+|\*+|_+|=+)|(?:-+|\*+|_+|=+)$/
}
},
"list-punctuation": {
pattern: /(^[ \t]*)(?:-|\*{1,5}|\.{1,5}|(?:[a-z]|\d+)\.|[xvi]+\))(?= )/im,
lookbehind: true,
alias: "punctuation"
},
"list-label": {
pattern: /(^[ \t]*)[a-z\d].+(?::{2,4}|;;)(?=\s)/im,
lookbehind: true,
alias: "symbol"
},
"indented-block": {
pattern: /((\r?\n|\r)\2)([ \t]+)\S.*(?:(?:\r?\n|\r)\3.+)*(?=\2{2}|$)/,
lookbehind: true
},
"comment": /^\/\/.*/m,
"title": {
pattern: /^.+(?:\r?\n|\r)(?:={3,}|-{3,}|~{3,}|\^{3,}|\+{3,})$|^={1,5} .+|^\.(?![\s.]).*/m,
alias: "important",
inside: {
"punctuation": /^(?:\.|=+)|(?:=+|-+|~+|\^+|\++)$/
}
},
"attribute-entry": {
pattern: /^:[^:\r\n]+:(?: .*?(?: \+(?:\r?\n|\r).*?)*)?$/m,
alias: "tag"
},
"attributes": attributes,
"hr": {
pattern: /^'{3,}$/m,
alias: "punctuation"
},
"page-break": {
pattern: /^<{3,}$/m,
alias: "punctuation"
},
"admonition": {
pattern: /^(?:CAUTION|IMPORTANT|NOTE|TIP|WARNING):/m,
alias: "keyword"
},
"callout": [
{
pattern: /(^[ \t]*)<?\d*>/m,
lookbehind: true,
alias: "symbol"
},
{
pattern: /<\d+>/,
alias: "symbol"
}
],
"macro": {
pattern: /\b[a-z\d][a-z\d-]*::?(?:[^\s\[\]]*\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,
inside: {
"function": /^[a-z\d-]+(?=:)/,
"punctuation": /^::?/,
"attributes": {
pattern: /(?:\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,
inside: attributes.inside
}
}
},
"inline": {
pattern: /(^|[^\\])(?:(?:\B\[(?:[^\]\\"']|(["'])(?:(?!\2)[^\\]|\\.)*\2|\\.)*\])?(?:\b_(?!\s)(?: _|[^_\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: _|[^_\\\r\n]|\\.)+)*_\b|\B``(?!\s).+?(?:(?:\r?\n|\r).+?)*''\B|\B`(?!\s)(?:[^`'\s]|\s+\S)+['`]\B|\B(['*+#])(?!\s)(?: \3|(?!\3)[^\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: \3|(?!\3)[^\\\r\n]|\\.)+)*\3\B)|(?:\[(?:[^\]\\"']|(["'])(?:(?!\4)[^\\]|\\.)*\4|\\.)*\])?(?:(__|\*\*|\+\+\+?|##|\$\$|[~^]).+?(?:(?:\r?\n|\r).+?)*\5|\{[^}\r\n]+\}|\[\[\[?.+?(?:(?:\r?\n|\r).+?)*\]?\]\]|<<.+?(?:(?:\r?\n|\r).+?)*>>|\(\(\(?.+?(?:(?:\r?\n|\r).+?)*\)?\)\)))/m,
lookbehind: true,
inside: {
"attributes": attributes,
"url": {
pattern: /^(?:\[\[\[?.+?\]?\]\]|<<.+?>>)$/,
inside: {
"punctuation": /^(?:\[\[\[?|<<)|(?:\]\]\]?|>>)$/
}
},
"attribute-ref": {
pattern: /^\{.+\}$/,
inside: {
"variable": {
pattern: /(^\{)[a-z\d,+_-]+/,
lookbehind: true
},
"operator": /^[=?!#%@$]|!(?=[:}])/,
"punctuation": /^\{|\}$|::?/
}
},
"italic": {
pattern: /^(['_])[\s\S]+\1$/,
inside: {
"punctuation": /^(?:''?|__?)|(?:''?|__?)$/
}
},
"bold": {
pattern: /^\*[\s\S]+\*$/,
inside: {
punctuation: /^\*\*?|\*\*?$/
}
},
"punctuation": /^(?:``?|\+{1,3}|##?|\$\$|[~^]|\(\(\(?)|(?:''?|\+{1,3}|##?|\$\$|[~^`]|\)?\)\))$/
}
},
"replacement": {
pattern: /\((?:C|R|TM)\)/,
alias: "builtin"
},
"entity": /&#?[\da-z]{1,8};/i,
"line-continuation": {
pattern: /(^| )\+$/m,
lookbehind: true,
alias: "punctuation"
}
};
function copyFromAsciiDoc(keys) {
keys = keys.split(" ");
var o = {};
for (var i = 0, l = keys.length; i < l; i++) {
o[keys[i]] = asciidoc[keys[i]];
}
return o;
}
attributes.inside["interpreted"].inside.rest = copyFromAsciiDoc("macro inline replacement entity");
asciidoc["passthrough-block"].inside.rest = copyFromAsciiDoc("macro");
asciidoc["literal-block"].inside.rest = copyFromAsciiDoc("callout");
asciidoc["table"].inside.rest = copyFromAsciiDoc("comment-block passthrough-block literal-block other-block list-punctuation indented-block comment title attribute-entry attributes hr page-break admonition list-label callout macro inline replacement entity line-continuation");
asciidoc["other-block"].inside.rest = copyFromAsciiDoc("table list-punctuation indented-block comment attribute-entry attributes hr page-break admonition list-label macro inline replacement entity line-continuation");
asciidoc["title"].inside.rest = copyFromAsciiDoc("macro inline replacement entity");
Prism2.hooks.add("wrap", function(env) {
if (env.type === "entity") {
env.attributes["title"] = env.content.replace(/&/, "&");
}
});
Prism2.languages.adoc = Prism2.languages.asciidoc;
})(Prism);
(function(Prism2) {
function replace(pattern, replacements) {
return pattern.replace(/<<(\d+)>>/g, function(m, index) {
return "(?:" + replacements[+index] + ")";
});
}
function re(pattern, replacements, flags) {
return RegExp(replace(pattern, replacements), flags || "");
}
function nested(pattern, depthLog2) {
for (var i = 0; i < depthLog2; i++) {
pattern = pattern.replace(/<<self>>/g, function() {
return "(?:" + pattern + ")";
});
}
return pattern.replace(/<<self>>/g, "[^\\s\\S]");
}
var keywordKinds = {
type: "bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",
typeDeclaration: "class enum interface record struct",
contextual: "add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",
other: "abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield"
};
function keywordsToPattern(words) {
return "\\b(?:" + words.trim().replace(/ /g, "|") + ")\\b";
}
var typeDeclarationKeywords = keywordsToPattern(keywordKinds.typeDeclaration);
var keywords = RegExp(keywordsToPattern(keywordKinds.type + " " + keywordKinds.typeDeclaration + " " + keywordKinds.contextual + " " + keywordKinds.other));
var nonTypeKeywords = keywordsToPattern(keywordKinds.typeDeclaration + " " + keywordKinds.contextual + " " + keywordKinds.other);
var nonContextualKeywords = keywordsToPattern(keywordKinds.type + " " + keywordKinds.typeDeclaration + " " + keywordKinds.other);
var generic = nested(/<(?:[^<>;=+\-*/%&|^]|<<self>>)*>/.source, 2);
var nestedRound = nested(/\((?:[^()]|<<self>>)*\)/.source, 2);
var name = /@?\b[A-Za-z_]\w*\b/.source;
var genericName = replace(/<<0>>(?:\s*<<1>>)?/.source, [name, generic]);
var identifier = replace(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source, [nonTypeKeywords, genericName]);
var array = /\[\s*(?:,\s*)*\]/.source;
var typeExpressionWithoutTuple = replace(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source, [identifier, array]);
var tupleElement = replace(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source, [generic, nestedRound, array]);
var tuple = replace(/\(<<0>>+(?:,<<0>>+)+\)/.source, [tupleElement]);
var typeExpression = replace(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source, [tuple, identifier, array]);
var typeInside = {
"keyword": keywords,
"punctuation": /[<>()?,.:[\]]/
};
var character = /'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source;
var regularString = /"(?:\\.|[^\\"\r\n])*"/.source;
var verbatimString = /@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;
Prism2.languages.csharp = Prism2.languages.extend("clike", {
"string": [
{
pattern: re(/(^|[^$\\])<<0>>/.source, [verbatimString]),
lookbehind: true,
greedy: true
},
{
pattern: re(/(^|[^@$\\])<<0>>/.source, [regularString]),
lookbehind: true,
greedy: true
}
],
"class-name": [
{
pattern: re(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source, [identifier]),
lookbehind: true,
inside: typeInside
},
{
pattern: re(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source, [name, typeExpression]),
lookbehind: true,
inside: typeInside
},
{
pattern: re(/(\busing\s+)<<0>>(?=\s*=)/.source, [name]),
lookbehind: true
},
{
pattern: re(/(\b<<0>>\s+)<<1>>/.source, [typeDeclarationKeywords, genericName]),
lookbehind: true,
inside: typeInside
},
{
pattern: re(/(\bcatch\s*\(\s*)<<0>>/.source, [identifier]),
lookbehind: true,
inside: typeInside
},
{
pattern: re(/(\bwhere\s+)<<0>>/.source, [name]),
lookbehind: true
},
{
pattern: re(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source, [typeExpressionWithoutTuple]),
lookbehind: true,
inside: typeInside
},
{
pattern: re(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source, [typeExpression, nonContextualKeywords, name]),
inside: typeInside
}
],
"keyword": keywords,
"number": /(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,
"operator": />>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,
"punctuation": /\?\.?|::|[{}[\];(),.:]/
});
Prism2.languages.insertBefore("csharp", "number", {
"range": {
pattern: /\.\./,
alias: "operator"
}
});
Prism2.languages.insertBefore("csharp", "punctuation", {
"named-parameter": {
pattern: re(/([(,]\s*)<<0>>(?=\s*:)/.source, [name]),
lookbehind: true,
alias: "punctuation"
}
});
Prism2.languages.insertBefore("csharp", "class-name", {
"namespace": {
pattern: re(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source, [name]),
lookbehind: true,
inside: {
"punctuation": /\./
}
},
"type-expression": {
pattern: re(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source, [nestedRound]),
lookbehind: true,
alias: "class-name",
inside: typeInside
},
"return-type": {
pattern: re(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source, [typeExpression, identifier]),
inside: typeInside,
alias: "class-name"
},
"constructor-invocation": {
pattern: re(/(\bnew\s+)<<0>>(?=\s*[[({])/.source, [typeExpression]),
lookbehind: true,
inside: typeInside,
alias: "class-name"
},
"generic-method": {
pattern: re(/<<0>>\s*<<1>>(?=\s*\()/.source, [name, generic]),
inside: {
"function": re(/^<<0>>/.source, [name]),
"generic": {
pattern: RegExp(generic),
alias: "class-name",
inside: typeInside
}
}
},
"type-list": {
pattern: re(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source, [typeDeclarationKeywords, genericName, name, typeExpression, keywords.source, nestedRound, /\bnew\s*\(\s*\)/.source]),
lookbehind: true,
inside: {
"record-arguments": {
pattern: re(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source, [genericName, nestedRound]),
lookbehind: true,
greedy: true,
inside: Prism2.languages.csharp
},
"keyword": keywords,
"class-name": {
pattern: RegExp(typeExpression),
greedy: true,
inside: typeInside
},
"punctuation": /[,()]/
}
},
"preprocessor": {
pattern: /(^[\t ]*)#.*/m,
lookbehind: true,
alias: "property",
inside: {
"directive": {
pattern: /(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,
lookbehind: true,
alias: "keyword"
}
}
}
});
var regularStringOrCharacter = regularString + "|" + character;
var regularStringCharacterOrComment = replace(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source, [regularStringOrCharacter]);
var roundExpression = nested(replace(/[^"'/()]|<<0>>|\(<<self>>*\)/.source, [regularStringCharacterOrComment]), 2);
var attrTarget = /\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source;
var attr = replace(/<<0>>(?:\s*\(<<1>>*\))?/.source, [identifier, roundExpression]);
Prism2.languages.insertBefore("csharp", "class-name", {
"attribute": {
pattern: re(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source, [attrTarget, attr]),
lookbehind: true,
greedy: true,
inside: {
"target": {
pattern: re(/^<<0>>(?=\s*:)/.source, [attrTarget]),
alias: "keyword"
},
"attribute-arguments": {
pattern: re(/\(<<0>>*\)/.source, [roundExpression]),
inside: Prism2.languages.csharp
},
"class-name": {
pattern: RegExp(identifier),
inside: {
"punctuation": /\./
}
},
"punctuation": /[:,]/
}
}
});
var formatString = /:[^}\r\n]+/.source;
var mInterpolationRound = nested(replace(/[^"'/()]|<<0>>|\(<<self>>*\)/.source, [regularStringCharacterOrComment]), 2);
var mInterpolation = replace(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source, [mInterpolationRound, formatString]);
var sInterpolationRound = nested(replace(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<<self>>*\)/.source, [regularStringOrCharacter]), 2);
var sInterpolation = replace(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source, [sInterpolationRound, formatString]);
function createInterpolationInside(interpolation, interpolationRound) {
return {
"interpolation": {
pattern: re(/((?:^|[^{])(?:\{\{)*)<<0>>/.source, [interpolation]),
lookbehind: true,
inside: {
"format-string": {
pattern: re(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source, [interpolationRound, formatString]),
lookbehind: true,
inside: {
"punctuation": /^:/
}
},
"punctuation": /^\{|\}$/,
"expression": {
pattern: /[\s\S]+/,
alias: "language-csharp",
inside: Prism2.languages.csharp
}
}
},
"string": /[\s\S]+/
};
}
Prism2.languages.insertBefore("csharp", "string", {
"interpolation-string": [
{
pattern: re(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source, [mInterpolation]),
lookbehind: true,
greedy: true,
inside: createInterpolationInside(mInterpolation, mInterpolationRound)
},
{
pattern: re(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source, [sInterpolation]),
lookbehind: true,
greedy: true,
inside: createInterpolationInside(sInterpolation, sInterpolationRound)
}
],
"char": {
pattern: RegExp(character),
greedy: true
}
});
Prism2.languages.dotnet = Prism2.languages.cs = Prism2.languages.csharp;
})(Prism);
Prism.languages.aspnet = Prism.languages.extend("markup", {
"page-directive": {
pattern: /<%\s*@.*%>/,
alias: "tag",
inside: {
"page-directive": {
pattern: /<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,
alias: "tag"
},
rest: Prism.languages.markup.tag.inside
}
},
"directive": {
pattern: /<%.*%>/,
alias: "tag",
inside: {
"directive": {
pattern: /<%\s*?[$=%#:]{0,2}|%>/,
alias: "tag"
},
rest: Prism.languages.csharp
}
}
});
Prism.languages.aspnet.tag.pattern = /<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/;
Prism.languages.insertBefore("inside", "punctuation", {
"directive": Prism.languages.aspnet["directive"]
}, Prism.languages.aspnet.tag.inside["attr-value"]);
Prism.languages.insertBefore("aspnet", "comment", {
"asp-comment": {
pattern: /<%--[\s\S]*?--%>/,
alias: ["asp", "comment"]
}
});
Prism.languages.insertBefore("aspnet", Prism.languages.javascript ? "script" : "tag", {
"asp-script": {
pattern: /(<script(?=.*runat=['"]?server\b)[^>]*>)[\s\S]*?(?=<\/script>)/i,
lookbehind: true,
alias: ["asp", "script"],
inside: Prism.languages.csharp || {}
}
});
Prism.languages.asm6502 = {
"comment": /;.*/,
"directive": {
pattern: /\.\w+(?= )/,
alias: "property"
},
"string": /(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,
"op-code": {
pattern: /\b(?:ADC|AND|ASL|BCC|BCS|BEQ|BIT|BMI|BNE|BPL|BRK|BVC|BVS|CLC|CLD|CLI|CLV|CMP|CPX|CPY|DEC|DEX|DEY|EOR|INC|INX|INY|JMP|JSR|LDA|LDX|LDY|LSR|NOP|ORA|PHA|PHP|PLA|PLP|ROL|ROR|RTI|RTS|SBC|SEC|SED|SEI|STA|STX|STY|TAX|TAY|TSX|TXA|TXS|TYA|adc|and|asl|bcc|bcs|beq|bit|bmi|bne|bpl|brk|bvc|bvs|clc|cld|cli|clv|cmp|cpx|cpy|dec|dex|dey|eor|inc|inx|iny|jmp|jsr|lda|ldx|ldy|lsr|nop|ora|pha|php|pla|plp|rol|ror|rti|rts|sbc|sec|sed|sei|sta|stx|sty|tax|tay|tsx|txa|txs|tya)\b/,
alias: "keyword"
},
"hex-number": {
pattern: /#?\$[\da-f]{1,4}\b/i,
alias: "number"
},
"binary-number": {
pattern: /#?%[01]+\b/,
alias: "number"
},
"decimal-number": {
pattern: /#?\b\d+\b/,
alias: "number"
},
"register": {
pattern: /\b[xya]\b/i,
alias: "variable"
},
"punctuation": /[(),:]/
};
Prism.languages.asmatmel = {
"comment": {
pattern: /;.*/,
greedy: true
},
"string": {
pattern: /(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"constant": /\b(?:PORT[A-Z]|DDR[A-Z]|(?:DD|P)[A-Z](?:\d|[0-2]\d|3[01]))\b/,
"directive": {
pattern: /\.\w+(?= )/,
alias: "property"
},
"r-register": {
pattern: /\br(?:\d|[12]\d|3[01])\b/,
alias: "variable"
},
"op-code": {
pattern: /\b(?:ADC|ADD|ADIW|AND|ANDI|ASR|BCLR|BLD|BRBC|BRBS|BRCC|BRCS|BREAK|BREQ|BRGE|BRHC|BRHS|BRID|BRIE|BRLO|BRLT|BRMI|BRNE|BRPL|BRSH|BRTC|BRTS|BRVC|BRVS|BSET|BST|CALL|CBI|CBR|CLC|CLH|CLI|CLN|CLR|CLS|CLT|CLV|CLZ|COM|CP|CPC|CPI|CPSE|DEC|DES|EICALL|EIJMP|ELPM|EOR|FMUL|FMULS|FMULSU|ICALL|IJMP|IN|INC|JMP|LAC|LAS|LAT|LD|LD[A-Za-z0-9]|LPM|LSL|LSR|MOV|MOVW|MUL|MULS|MULSU|NEG|NOP|OR|ORI|OUT|POP|PUSH|RCALL|RET|RETI|RJMP|ROL|ROR|SBC|SBCI|SBI|SBIC|SBIS|SBIW|SBR|SBRC|SBRS|SEC|SEH|SEI|SEN|SER|SES|SET|SEV|SEZ|SLEEP|SPM|ST|ST[A-Z0-9]|SUB|SUBI|SWAP|TST|WDR|XCH|adc|add|adiw|and|andi|asr|bclr|bld|brbc|brbs|brcc|brcs|break|breq|brge|brhc|brhs|brid|brie|brlo|brlt|brmi|brne|brpl|brsh|brtc|brts|brvc|brvs|bset|bst|call|cbi|cbr|clc|clh|cli|cln|clr|cls|clt|clv|clz|com|cp|cpc|cpi|cpse|dec|des|eicall|eijmp|elpm|eor|fmul|fmuls|fmulsu|icall|ijmp|in|inc|jmp|lac|las|lat|ld|ld[a-z0-9]|lpm|lsl|lsr|mov|movw|mul|muls|mulsu|neg|nop|or|ori|out|pop|push|rcall|ret|reti|rjmp|rol|ror|sbc|sbci|sbi|sbic|sbis|sbiw|sbr|sbrc|sbrs|sec|seh|sei|sen|ser|ses|set|sev|sez|sleep|spm|st|st[a-zA-Z0-9]|sub|subi|swap|tst|wdr|xch)\b/,
alias: "keyword"
},
"hex-number": {
pattern: /#?\$[\da-f]{2,4}\b/i,
alias: "number"
},
"binary-number": {
pattern: /#?%[01]+\b/,
alias: "number"
},
"decimal-number": {
pattern: /#?\b\d+\b/,
alias: "number"
},
"register": {
pattern: /\b[acznvshtixy]\b/i,
alias: "variable"
},
"operator": />>=?|<<=?|&[&=]?|\|[\|=]?|[-+*/%^!=<>?]=?/,
"punctuation": /[(),:]/
};
Prism.languages.autohotkey = {
"comment": [
{
pattern: /(^|\s);.*/,
lookbehind: true
},
{
pattern: /(^[\t ]*)\/\*(?:[\r\n](?![ \t]*\*\/)|[^\r\n])*(?:[\r\n][ \t]*\*\/)?/m,
lookbehind: true,
greedy: true
}
],
"tag": {
pattern: /^([ \t]*)[^\s,`":]+(?=:[ \t]*$)/m,
lookbehind: true
},
"string": /"(?:[^"\n\r]|"")*"/,
"variable": /%\w+%/,
"number": /\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,
"operator": /\?|\/\/?=?|:=|\|[=|]?|&[=&]?|\+[=+]?|-[=-]?|\*[=*]?|<(?:<=?|>|=)?|>>?=?|[.^!=~]=?|\b(?:AND|NOT|OR)\b/,
"boolean": /\b(?:false|true)\b/,
"command": {
pattern: /\b(?:AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetRegView|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\b/i,
alias: "selector"
},
"constant": /\b(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_fileencoding|a_formatfloat|a_formatinteger|a_gui|a_guicontrol|a_guicontrolevent|a_guievent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_is64bitos|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_isunicode|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|a_priorkey|a_programfiles|a_programs|a_programscommon|a_ptrsize|a_regview|a_screendpi|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scripthwnd|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel|programfiles)\b/i,
"builtin": /\b(?:abs|acos|asc|asin|atan|ceil|chr|class|comobjactive|comobjarray|comobjconnect|comobjcreate|comobjerror|comobjflags|comobjget|comobjquery|comobjtype|comobjvalue|cos|dllcall|exp|fileexist|Fileopen|floor|format|il_add|il_create|il_destroy|instr|isfunc|islabel|IsObject|ln|log|ltrim|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|mod|numget|numput|onmessage|regexmatch|regexreplace|registercallback|round|rtrim|sb_seticon|sb_setparts|sb_settext|sin|sqrt|strlen|strreplace|strsplit|substr|tan|tv_add|tv_delete|tv_get|tv_getchild|tv_getcount|tv_getnext|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist|__Call|__Get|__New|__Set)\b/i,
"symbol": /\b(?:alt|altdown|altup|appskey|backspace|browser_back|browser_favorites|browser_forward|browser_home|browser_refresh|browser_search|browser_stop|bs|capslock|ctrl|ctrlbreak|ctrldown|ctrlup|del|delete|down|end|enter|esc|escape|f1|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f2|f20|f21|f22|f23|f24|f3|f4|f5|f6|f7|f8|f9|home|ins|insert|joy1|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy2|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy3|joy30|joy31|joy32|joy4|joy5|joy6|joy7|joy8|joy9|joyaxes|joybuttons|joyinfo|joyname|joypov|joyr|joyu|joyv|joyx|joyy|joyz|lalt|launch_app1|launch_app2|launch_mail|launch_media|lbutton|lcontrol|lctrl|left|lshift|lwin|lwindown|lwinup|mbutton|media_next|media_play_pause|media_prev|media_stop|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadadd|numpadclear|numpaddel|numpaddiv|numpaddot|numpaddown|numpadend|numpadenter|numpadhome|numpadins|numpadleft|numpadmult|numpadpgdn|numpadpgup|numpadright|numpadsub|numpadup|pgdn|pgup|printscreen|ralt|rbutton|rcontrol|rctrl|right|rshift|rwin|rwindown|rwinup|scrolllock|shift|shiftdown|shiftup|space|tab|up|volume_down|volume_mute|volume_up|wheeldown|wheelleft|wheelright|wheelup|xbutton1|xbutton2)\b/i,
"directive": {
pattern: /#[a-z]+\b/i,
alias: "important"
},
"keyword": /\b(?:Abort|AboveNormal|Add|ahk_class|ahk_exe|ahk_group|ahk_id|ahk_pid|All|Alnum|Alpha|AltSubmit|AltTab|AltTabAndMenu|AltTabMenu|AltTabMenuDismiss|AlwaysOnTop|AutoSize|Background|BackgroundTrans|BelowNormal|between|BitAnd|BitNot|BitOr|BitShiftLeft|BitShiftRight|BitXOr|Bold|Border|Button|ByRef|Catch|Checkbox|Checked|CheckedGray|Choose|ChooseString|Close|Color|ComboBox|Contains|ControlList|Count|Date|DateTime|Days|DDL|Default|DeleteAll|Delimiter|Deref|Destroy|Digit|Disable|Disabled|DropDownList|Edit|Eject|Else|Enable|Enabled|Error|Exist|Expand|ExStyle|FileSystem|Finally|First|Flash|Float|FloatFast|Focus|Font|for|global|Grid|Group|GroupBox|GuiClose|GuiContextMenu|GuiDropFiles|GuiEscape|GuiSize|Hdr|Hidden|Hide|High|HKCC|HKCR|HKCU|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE|HKEY_USERS|HKLM|HKU|Hours|HScroll|Icon|IconSmall|ID|IDLast|If|IfEqual|IfExist|IfGreater|IfGreaterOrEqual|IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Ignore|ImageList|in|Integer|IntegerFast|Interrupt|is|italic|Join|Label|LastFound|LastFoundExist|Limit|Lines|List|ListBox|ListView|local|Lock|Logoff|Low|Lower|Lowercase|MainWindow|Margin|Maximize|MaximizeBox|MaxSize|Minimize|MinimizeBox|MinMax|MinSize|Minutes|MonthCal|Mouse|Move|Multi|NA|No|NoActivate|NoDefault|NoHide|NoIcon|NoMainWindow|norm|Normal|NoSort|NoSortHdr|NoStandard|Not|NoTab|NoTimers|Number|Off|Ok|On|OwnDialogs|Owner|Parse|Password|Picture|Pixel|Pos|Pow|Priority|ProcessName|Radio|Range|Read|ReadOnly|Realtime|Redraw|Region|REG_BINARY|REG_DWORD|REG_EXPAND_SZ|REG_MULTI_SZ|REG_SZ|Relative|Rename|Report|Resize|Restore|Retry|RGB|Screen|Seconds|Section|Serial|SetLabel|ShiftAltTab|Show|Single|Slider|SortDesc|Standard|static|Status|StatusBar|StatusCD|strike|Style|Submit|SysMenu|Tab2|TabStop|Text|Theme|Throw|Tile|ToggleCheck|ToggleEnable|ToolWindow|Top|Topmost|TransColor|Transparent|Tray|TreeView|Try|TryAgain|Type|UnCheck|underline|Unicode|Unlock|Until|UpDown|Upper|Uppercase|UseErrorLevel|Vis|VisFirst|Visible|VScroll|Wait|WaitClose|WantCtrlA|WantF2|WantReturn|While|Wrap|Xdigit|xm|xp|xs|Yes|ym|yp|ys)\b/i,
"function": /[^(); \t,\n+*\-=?>:\\\/<&%\[\]]+(?=\()/,
"punctuation": /[{}[\]():,]/
};
Prism.languages.autoit = {
"comment": [
/;.*/,
{
pattern: /(^[\t ]*)#(?:comments-start|cs)[\s\S]*?^[ \t]*#(?:ce|comments-end)/m,
lookbehind: true
}
],
"url": {
pattern: /(^[\t ]*#include\s+)(?:<[^\r\n>]+>|"[^\r\n"]+")/m,
lookbehind: true
},
"string": {
pattern: /(["'])(?:\1\1|(?!\1)[^\r\n])*\1/,
greedy: true,
inside: {
"variable": /([%$@])\w+\1/
}
},
"directive": {
pattern: /(^[\t ]*)#[\w-]+/m,
lookbehind: true,
alias: "keyword"
},
"function": /\b\w+(?=\()/,
"variable": /[$@]\w+/,
"keyword": /\b(?:Case|Const|Continue(?:Case|Loop)|Default|Dim|Do|Else(?:If)?|End(?:Func|If|Select|Switch|With)|Enum|Exit(?:Loop)?|For|Func|Global|If|In|Local|Next|Null|ReDim|Select|Static|Step|Switch|Then|To|Until|Volatile|WEnd|While|With)\b/i,
"number": /\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,
"boolean": /\b(?:False|True)\b/i,
"operator": /<[=>]?|[-+*\/=&>]=?|[?^]|\b(?:And|Not|Or)\b/i,
"punctuation": /[\[\]().,:]/
};
(function(Prism2) {
function replace(pattern, replacements) {
return pattern.replace(/<<(\d+)>>/g, function(m, index) {
return replacements[+index];
});
}
function re(pattern, replacements, flags) {
return RegExp(replace(pattern, replacements), flags || "");
}
var types = /bool|clip|float|int|string|val/.source;
var internals = [
/is(?:bool|clip|float|int|string)|defined|(?:(?:internal)?function|var)?exists?/.source,
/apply|assert|default|eval|import|nop|select|undefined/.source,
/opt_(?:allowfloataudio|avipadscanlines|dwchannelmask|enable_(?:b64a|planartopackedrgb|v210|y3_10_10|y3_10_16)|usewaveextensible|vdubplanarhack)|set(?:cachemode|maxcpu|memorymax|planarlegacyalignment|workingdir)/.source,
/hex(?:value)?|value/.source,
/abs|ceil|continued(?:denominator|numerator)?|exp|floor|fmod|frac|log(?:10)?|max|min|muldiv|pi|pow|rand|round|sign|spline|sqrt/.source,
/a?sinh?|a?cosh?|a?tan[2h]?/.source,
/(?:bit(?:and|not|x?or|[lr]?shift[aslu]?|sh[lr]|sa[lr]|[lr]rotatel?|ro[rl]|te?st|set(?:count)?|cl(?:ea)?r|ch(?:an)?ge?))/.source,
/average(?:[bgr]|chroma[uv]|luma)|(?:[rgb]|chroma[uv]|luma|rgb|[yuv](?=difference(?:fromprevious|tonext)))difference(?:fromprevious|tonext)?|[yuvrgb]plane(?:median|min|max|minmaxdifference)/.source,
/getprocessinfo|logmsg|script(?:dir(?:utf8)?|file(?:utf8)?|name(?:utf8)?)|setlogparams/.source,
/chr|(?:fill|find|left|mid|replace|rev|right)str|format|[lu]case|ord|str(?:cmpi?|fromutf8|len|toutf8)|time|trim(?:all|left|right)/.source,
/isversionorgreater|version(?:number|string)/.source,
/buildpixeltype|colorspacenametopixeltype/.source,
/addautoloaddir|on(?:cpu|cuda)|prefetch|setfiltermtmode/.source
].join("|");
var properties = [
/has(?:audio|video)/.source,
/height|width/.source,
/frame(?:count|rate)|framerate(?:denominator|numerator)/.source,
/getparity|is(?:field|frame)based/.source,
/bitspercomponent|componentsize|hasalpha|is(?:planar(?:rgba?)?|interleaved|rgb(?:24|32|48|64)?|y(?:8|u(?:va?|y2))?|yv(?:12|16|24|411)|420|422|444|packedrgb)|numcomponents|pixeltype/.source,
/audio(?:bits|channels|duration|length(?:[fs]|hi|lo)?|rate)|isaudio(?:float|int)/.source
].join("|");
var filters = [
/avi(?:file)?source|directshowsource|image(?:reader|source|sourceanim)|opendmlsource|segmented(?:avisource|directshowsource)|wavsource/.source,
/coloryuv|convertbacktoyuy2|convertto(?:RGB(?:24|32|48|64)|(?:planar)?RGBA?|Y8?|YV(?:12|16|24|411)|YUVA?(?:411|420|422|444)|YUY2)|fixluminance|gr[ae]yscale|invert|levels|limiter|mergea?rgb|merge(?:chroma|luma)|rgbadjust|show(?:alpha|blue|green|red)|swapuv|tweak|[uv]toy8?|ytouv/.source,
/(?:colorkey|reset)mask|layer|mask(?:hs)?|merge|overlay|subtract/.source,
/addborders|(?:bicubic|bilinear|blackman|gauss|lanczos4|lanczos|point|sinc|spline(?:16|36|64))resize|crop(?:bottom)?|flip(?:horizontal|vertical)|(?:horizontal|vertical)?reduceby2|letterbox|skewrows|turn(?:180|left|right)/.source,
/blur|fixbrokenchromaupsampling|generalconvolution|(?:spatial|temporal)soften|sharpen/.source,
/trim|(?:un)?alignedsplice|(?:assume|assumescaled|change|convert)FPS|(?:delete|duplicate)frame|dissolve|fade(?:in|io|out)[02]?|freezeframe|interleave|loop|reverse|select(?:even|odd|(?:range)?every)/.source,
/assume[bt]ff|assume(?:field|frame)based|bob|complementparity|doubleweave|peculiarblend|pulldown|separate(?:columns|fields|rows)|swapfields|weave(?:columns|rows)?/.source,
/amplify(?:db)?|assumesamplerate|audiodub(?:ex)?|audiotrim|convertaudioto(?:(?:8|16|24|32)bit|float)|converttomono|delayaudio|ensurevbrmp3sync|get(?:left|right)?channel|kill(?:audio|video)|mergechannels|mixaudio|monotostereo|normalize|resampleaudio|ssrc|supereq|timestretch/.source,
/animate|applyrange|conditional(?:filter|reader|select)|frameevaluate|scriptclip|tcp(?:server|source)|writefile(?:end|if|start)?/.source,
/imagewriter/.source,
/blackness|blankclip|colorbars(?:hd)?|compare|dumpfiltergraph|echo|histogram|info|messageclip|preroll|setgraphanalysis|show(?:framenumber|smpte|time)|showfiveversions|stack(?:horizontal|vertical)|subtitle|tone|version/.source
].join("|");
var allinternals = [internals, properties, filters].join("|");
Prism2.languages.avisynth = {
"comment": [
{
pattern: /(^|[^\\])\[\*(?:[^\[*]|\[(?!\*)|\*(?!\])|\[\*(?:[^\[*]|\[(?!\*)|\*(?!\]))*\*\])*\*\]/,
lookbehind: true,
greedy: true
},
{
pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
lookbehind: true,
greedy: true
},
{
pattern: /(^|[^\\$])#.*/,
lookbehind: true,
greedy: true
}
],
"argument": {
pattern: re(/\b(?:<<0>>)\s+("?)\w+\1/.source, [types], "i"),
inside: {
"keyword": /^\w+/
}
},
"argument-label": {
pattern: /([,(][\s\\]*)\w+\s*=(?!=)/,
lookbehind: true,
inside: {
"argument-name": {
pattern: /^\w+/,
alias: "punctuation"
},
"punctuation": /=$/
}
},
"string": [
{
pattern: /"""[\s\S]*?"""/,
greedy: true
},
{
pattern: /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,
greedy: true,
inside: {
"constant": {
pattern: /\b(?:DEFAULT_MT_MODE|(?:MAINSCRIPT|PROGRAM|SCRIPT)DIR|(?:MACHINE|USER)_(?:CLASSIC|PLUS)_PLUGINS)\b/
}
}
}
],
"variable": /\b(?:last)\b/i,
"boolean": /\b(?:false|no|true|yes)\b/i,
"keyword": /\b(?:catch|else|for|function|global|if|return|try|while|__END__)\b/i,
"constant": /\bMT_(?:MULTI_INSTANCE|NICE_FILTER|SERIALIZED|SPECIAL_MT)\b/,
"builtin-function": {
pattern: re(/\b(?:<<0>>)\b/.source, [allinternals], "i"),
alias: "function"
},
"type-cast": {
pattern: re(/\b(?:<<0>>)(?=\s*\()/.source, [types], "i"),
alias: "keyword"
},
"function": {
pattern: /\b[a-z_]\w*(?=\s*\()|(\.)[a-z_]\w*\b/i,
lookbehind: true
},
"line-continuation": {
pattern: /(^[ \t]*)\\|\\(?=[ \t]*$)/m,
lookbehind: true,
alias: "punctuation"
},
"number": /\B\$(?:[\da-f]{6}|[\da-f]{8})\b|(?:(?:\b|\B-)\d+(?:\.\d*)?\b|\B\.\d+\b)/i,
"operator": /\+\+?|[!=<>]=?|&&|\|\||[?:*/%-]/,
"punctuation": /[{}\[\]();,.]/
};
Prism2.languages.avs = Prism2.languages.avisynth;
})(Prism);
Prism.languages["avro-idl"] = {
"comment": {
pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
greedy: true
},
"string": {
pattern: /(^|[^\\])"(?:[^\r\n"\\]|\\.)*"/,
lookbehind: true,
greedy: true
},
"annotation": {
pattern: /@(?:[$\w.-]|`[^\r\n`]+`)+/,
greedy: true,
alias: "function"
},
"function-identifier": {
pattern: /`[^\r\n`]+`(?=\s*\()/,
greedy: true,
alias: "function"
},
"identifier": {
pattern: /`[^\r\n`]+`/,
greedy: true
},
"class-name": {
pattern: /(\b(?:enum|error|protocol|record|throws)\b\s+)[$\w]+/,
lookbehind: true,
greedy: true
},
"keyword": /\b(?:array|boolean|bytes|date|decimal|double|enum|error|false|fixed|float|idl|import|int|local_timestamp_ms|long|map|null|oneway|protocol|record|schema|string|throws|time_ms|timestamp_ms|true|union|uuid|void)\b/,
"function": /\b[a-z_]\w*(?=\s*\()/i,
"number": [
{
pattern: /(^|[^\w.])-?(?:(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|0x(?:[a-f0-9]+(?:\.[a-f0-9]*)?|\.[a-f0-9]+)(?:p[+-]?\d+)?)[dfl]?(?![\w.])/i,
lookbehind: true
},
/-?\b(?:Infinity|NaN)\b/
],
"operator": /=/,
"punctuation": /[()\[\]{}<>.:,;-]/
};
Prism.languages.avdl = Prism.languages["avro-idl"];
Prism.languages.awk = {
"hashbang": {
pattern: /^#!.*/,
greedy: true,
alias: "comment"
},
"comment": {
pattern: /#.*/,
greedy: true
},
"string": {
pattern: /(^|[^\\])"(?:[^\\"\r\n]|\\.)*"/,
lookbehind: true,
greedy: true
},
"regex": {
pattern: /((?:^|[^\w\s)])\s*)\/(?:[^\/\\\r\n]|\\.)*\//,
lookbehind: true,
greedy: true
},
"variable": /\$\w+/,
"keyword": /\b(?:BEGIN|BEGINFILE|END|ENDFILE|break|case|continue|default|delete|do|else|exit|for|function|getline|if|in|next|nextfile|printf?|return|switch|while)\b|@(?:include|load)\b/,
"function": /\b[a-z_]\w*(?=\s*\()/i,
"number": /\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[a-fA-F0-9]+)\b/,
"operator": /--|\+\+|!?~|>&|>>|<<|(?:\*\*|[<>!=+\-*/%^])=?|&&|\|[|&]|[?:]/,
"punctuation": /[()[\]{},;]/
};
Prism.languages.gawk = Prism.languages.awk;
(function(Prism2) {
var envVars = "\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b";
var commandAfterHeredoc = {
pattern: /(^(["']?)\w+\2)[ \t]+\S.*/,
lookbehind: true,
alias: "punctuation",
inside: null
};
var insideString = {
"bash": commandAfterHeredoc,
"environment": {
pattern: RegExp("\\$" + envVars),
alias: "constant"
},
"variable": [
{
pattern: /\$?\(\([\s\S]+?\)\)/,
greedy: true,
inside: {
"variable": [
{
pattern: /(^\$\(\([\s\S]+)\)\)/,
lookbehind: true
},
/^\$\(\(/
],
"number": /\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,
"operator": /--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,
"punctuation": /\(\(?|\)\)?|,|;/
}
},
{
pattern: /\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,
greedy: true,
inside: {
"variable": /^\$\(|^`|\)$|`$/
}
},
{
pattern: /\$\{[^}]+\}/,
greedy: true,
inside: {
"operator": /:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,
"punctuation": /[\[\]]/,
"environment": {
pattern: RegExp("(\\{)" + envVars),
lookbehind: true,
alias: "constant"
}
}
},
/\$(?:\w+|[#?*!@$])/
],
"entity": /\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/
};
Prism2.languages.bash = {
"shebang": {
pattern: /^#!\s*\/.*/,
alias: "important"
},
"comment": {
pattern: /(^|[^"{\\$])#.*/,
lookbehind: true
},
"function-name": [
{
pattern: /(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,
lookbehind: true,
alias: "function"
},
{
pattern: /\b[\w-]+(?=\s*\(\s*\)\s*\{)/,
alias: "function"
}
],
"for-or-select": {
pattern: /(\b(?:for|select)\s+)\w+(?=\s+in\s)/,
alias: "variable",
lookbehind: true
},
"assign-left": {
pattern: /(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,
inside: {
"environment": {
pattern: RegExp("(^|[\\s;|&]|[<>]\\()" + envVars),
lookbehind: true,
alias: "constant"
}
},
alias: "variable",
lookbehind: true
},
"string": [
{
pattern: /((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,
lookbehind: true,
greedy: true,
inside: insideString
},
{
pattern: /((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,
lookbehind: true,
greedy: true,
inside: {
"bash": commandAfterHeredoc
}
},
{
pattern: /(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,
lookbehind: true,
greedy: true,
inside: insideString
},
{
pattern: /(^|[^$\\])'[^']*'/,
lookbehind: true,
greedy: true
},
{
pattern: /\$'(?:[^'\\]|\\[\s\S])*'/,
greedy: true,
inside: {
"entity": insideString.entity
}
}
],
"environment": {
pattern: RegExp("\\$?" + envVars),
alias: "constant"
},
"variable": insideString.variable,
"function": {
pattern: /(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,
lookbehind: true
},
"keyword": {
pattern: /(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,
lookbehind: true
},
"builtin": {
pattern: /(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,
lookbehind: true,
alias: "class-name"
},
"boolean": {
pattern: /(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,
lookbehind: true
},
"file-descriptor": {
pattern: /\B&\d\b/,
alias: "important"
},
"operator": {
pattern: /\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,
inside: {
"file-descriptor": {
pattern: /^\d/,
alias: "important"
}
}
},
"punctuation": /\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,
"number": {
pattern: /(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,
lookbehind: true
}
};
commandAfterHeredoc.inside = Prism2.languages.bash;
var toBeCopied = [
"comment",
"function-name",
"for-or-select",
"assign-left",
"string",
"environment",
"function",
"keyword",
"builtin",
"boolean",
"file-descriptor",
"operator",
"punctuation",
"number"
];
var inside = insideString.variable[1].inside;
for (var i = 0; i < toBeCopied.length; i++) {
inside[toBeCopied[i]] = Prism2.languages.bash[toBeCopied[i]];
}
Prism2.languages.shell = Prism2.languages.bash;
})(Prism);
Prism.languages.basic = {
"comment": {
pattern: /(?:!|REM\b).+/i,
inside: {
"keyword": /^REM/i
}
},
"string": {
pattern: /"(?:""|[!#$%&'()*,\/:;<=>?^\w +\-.])*"/,
greedy: true
},
"number": /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,
"keyword": /\b(?:AS|BEEP|BLOAD|BSAVE|CALL(?: ABSOLUTE)?|CASE|CHAIN|CHDIR|CLEAR|CLOSE|CLS|COM|COMMON|CONST|DATA|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DIM|DO|DOUBLE|ELSE|ELSEIF|END|ENVIRON|ERASE|ERROR|EXIT|FIELD|FILES|FOR|FUNCTION|GET|GOSUB|GOTO|IF|INPUT|INTEGER|IOCTL|KEY|KILL|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|MKDIR|NAME|NEXT|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPTION BASE|OUT|POKE|PUT|READ|REDIM|REM|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SELECT CASE|SHARED|SHELL|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|SUB|SWAP|SYSTEM|THEN|TIMER|TO|TROFF|TRON|TYPE|UNLOCK|UNTIL|USING|VIEW PRINT|WAIT|WEND|WHILE|WRITE)(?:\$|\b)/i,
"function": /\b(?:ABS|ACCESS|ACOS|ANGLE|AREA|ARITHMETIC|ARRAY|ASIN|ASK|AT|ATN|BASE|BEGIN|BREAK|CAUSE|CEIL|CHR|CLIP|COLLATE|COLOR|CON|COS|COSH|COT|CSC|DATE|DATUM|DEBUG|DECIMAL|DEF|DEG|DEGREES|DELETE|DET|DEVICE|DISPLAY|DOT|ELAPSED|EPS|ERASABLE|EXLINE|EXP|EXTERNAL|EXTYPE|FILETYPE|FIXED|FP|GO|GRAPH|HANDLER|IDN|IMAGE|IN|INT|INTERNAL|IP|IS|KEYED|LBOUND|LCASE|LEFT|LEN|LENGTH|LET|LINE|LINES|LOG|LOG10|LOG2|LTRIM|MARGIN|MAT|MAX|MAXNUM|MID|MIN|MISSING|MOD|NATIVE|NUL|NUMERIC|OF|OPTION|ORD|ORGANIZATION|OUTIN|OUTPUT|PI|POINT|POINTER|POINTS|POS|PRINT|PROGRAM|PROMPT|RAD|RADIANS|RANDOMIZE|RECORD|RECSIZE|RECTYPE|RELATIVE|REMAINDER|REPEAT|REST|RETRY|REWRITE|RIGHT|RND|ROUND|RTRIM|SAME|SEC|SELECT|SEQUENTIAL|SET|SETTER|SGN|SIN|SINH|SIZE|SKIP|SQR|STANDARD|STATUS|STR|STREAM|STYLE|TAB|TAN|TANH|TEMPLATE|TEXT|THERE|TIME|TIMEOUT|TRACE|TRANSFORM|TRUNCATE|UBOUND|UCASE|USE|VAL|VARIABLE|VIEWPORT|WHEN|WINDOW|WITH|ZER|ZONEWIDTH)(?:\$|\b)/i,
"operator": /<[=>]?|>=?|[+\-*\/^=&]|\b(?:AND|EQV|IMP|NOT|OR|XOR)\b/i,
"punctuation": /[,;:()]/
};
(function(Prism2) {
var variable = /%%?[~:\w]+%?|!\S+!/;
var parameter = {
pattern: /\/[a-z?]+(?=[ :]|$):?|-[a-z]\b|--[a-z-]+\b/im,
alias: "attr-name",
inside: {
"punctuation": /:/
}
};
var string = /"(?:[\\"]"|[^"])*"(?!")/;
var number = /(?:\b|-)\d+\b/;
Prism2.languages.batch = {
"comment": [
/^::.*/m,
{
pattern: /((?:^|[&(])[ \t]*)rem\b(?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,
lookbehind: true
}
],
"label": {
pattern: /^:.*/m,
alias: "property"
},
"command": [
{
pattern: /((?:^|[&(])[ \t]*)for(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* \S+ in \([^)]+\) do/im,
lookbehind: true,
inside: {
"keyword": /\b(?:do|in)\b|^for\b/i,
"string": string,
"parameter": parameter,
"variable": variable,
"number": number,
"punctuation": /[()',]/
}
},
{
pattern: /((?:^|[&(])[ \t]*)if(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:not )?(?:cmdextversion \d+|defined \w+|errorlevel \d+|exist \S+|(?:"[^"]*"|(?!")(?:(?!==)\S)+)?(?:==| (?:equ|geq|gtr|leq|lss|neq) )(?:"[^"]*"|[^\s"]\S*))/im,
lookbehind: true,
inside: {
"keyword": /\b(?:cmdextversion|defined|errorlevel|exist|not)\b|^if\b/i,
"string": string,
"parameter": parameter,
"variable": variable,
"number": number,
"operator": /\^|==|\b(?:equ|geq|gtr|leq|lss|neq)\b/i
}
},
{
pattern: /((?:^|[&()])[ \t]*)else\b/im,
lookbehind: true,
inside: {
"keyword": /^else\b/i
}
},
{
pattern: /((?:^|[&(])[ \t]*)set(?: \/[a-z](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,
lookbehind: true,
inside: {
"keyword": /^set\b/i,
"string": string,
"parameter": parameter,
"variable": [
variable,
/\w+(?=(?:[*\/%+\-&^|]|<<|>>)?=)/
],
"number": number,
"operator": /[*\/%+\-&^|]=?|<<=?|>>=?|[!~_=]/,
"punctuation": /[()',]/
}
},
{
pattern: /((?:^|[&(])[ \t]*@?)\w+\b(?:"(?:[\\"]"|[^"])*"(?!")|[^"^&)\r\n]|\^(?:\r\n|[\s\S]))*/m,
lookbehind: true,
inside: {
"keyword": /^\w+\b/,
"string": string,
"parameter": parameter,
"label": {
pattern: /(^\s*):\S+/m,
lookbehind: true,
alias: "property"
},
"variable": variable,
"number": number,
"operator": /\^/
}
}
],
"operator": /[&@]/,
"punctuation": /[()']/
};
})(Prism);
Prism.languages.bbcode = {
"tag": {
pattern: /\[\/?[^\s=\]]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))?(?:\s+[^\s=\]]+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))*\s*\]/,
inside: {
"tag": {
pattern: /^\[\/?[^\s=\]]+/,
inside: {
"punctuation": /^\[\/?/
}
},
"attr-value": {
pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+)/,
inside: {
"punctuation": [
/^=/,
{
pattern: /^(\s*)["']|["']$/,
lookbehind: true
}
]
}
},
"punctuation": /\]/,
"attr-name": /[^\s=\]]+/
}
}
};
Prism.languages.shortcode = Prism.languages.bbcode;
Prism.languages.bicep = {
"comment": [
{
pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
lookbehind: true,
greedy: true
},
{
pattern: /(^|[^\\:])\/\/.*/,
lookbehind: true,
greedy: true
}
],
"property": [
{
pattern: /([\r\n][ \t]*)[a-z_]\w*(?=[ \t]*:)/i,
lookbehind: true
},
{
pattern: /([\r\n][ \t]*)'(?:\\.|\$(?!\{)|[^'\\\r\n$])*'(?=[ \t]*:)/,
lookbehind: true,
greedy: true
}
],
"string": [
{
pattern: /'''[^'][\s\S]*?'''/,
greedy: true
},
{
pattern: /(^|[^\\'])'(?:\\.|\$(?!\{)|[^'\\\r\n$])*'/,
lookbehind: true,
greedy: true
}
],
"interpolated-string": {
pattern: /(^|[^\\'])'(?:\\.|\$(?:(?!\{)|\{[^{}\r\n]*\})|[^'\\\r\n$])*'/,
lookbehind: true,
greedy: true,
inside: {
"interpolation": {
pattern: /\$\{[^{}\r\n]*\}/,
inside: {
"expression": {
pattern: /(^\$\{)[\s\S]+(?=\}$)/,
lookbehind: true
},
"punctuation": /^\$\{|\}$/
}
},
"string": /[\s\S]+/
}
},
"datatype": {
pattern: /(\b(?:output|param)\b[ \t]+\w+[ \t]+)\w+\b/,
lookbehind: true,
alias: "class-name"
},
"boolean": /\b(?:false|true)\b/,
"keyword": /\b(?:existing|for|if|in|module|null|output|param|resource|targetScope|var)\b/,
"decorator": /@\w+\b/,
"function": /\b[a-z_]\w*(?=[ \t]*\()/i,
"number": /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,
"operator": /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/,
"punctuation": /[{}[\];(),.:]/
};
Prism.languages.bicep["interpolated-string"].inside["interpolation"].inside["expression"].inside = Prism.languages.bicep;
Prism.languages.birb = Prism.languages.extend("clike", {
"string": {
pattern: /r?("|')(?:\\.|(?!\1)[^\\])*\1/,
greedy: true
},
"class-name": [
/\b[A-Z](?:[\d_]*[a-zA-Z]\w*)?\b/,
/\b(?:[A-Z]\w*|(?!(?:var|void)\b)[a-z]\w*)(?=\s+\w+\s*[;,=()])/
],
"keyword": /\b(?:assert|break|case|class|const|default|else|enum|final|follows|for|grab|if|nest|new|next|noSeeb|return|static|switch|throw|var|void|while)\b/,
"operator": /\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?|:/,
"variable": /\b[a-z_]\w*\b/
});
Prism.languages.insertBefore("birb", "function", {
"metadata": {
pattern: /<\w+>/,
greedy: true,
alias: "symbol"
}
});
Prism.languages.bison = Prism.languages.extend("c", {});
Prism.languages.insertBefore("bison", "comment", {
"bison": {
pattern: /^(?:[^%]|%(?!%))*%%[\s\S]*?%%/,
inside: {
"c": {
pattern: /%\{[\s\S]*?%\}|\{(?:\{[^}]*\}|[^{}])*\}/,
inside: {
"delimiter": {
pattern: /^%?\{|%?\}$/,
alias: "punctuation"
},
"bison-variable": {
pattern: /[$@](?:<[^\s>]+>)?[\w$]+/,
alias: "variable",
inside: {
"punctuation": /<|>/
}
},
rest: Prism.languages.c
}
},
"comment": Prism.languages.c.comment,
"string": Prism.languages.c.string,
"property": /\S+(?=:)/,
"keyword": /%\w+/,
"number": {
pattern: /(^|[^@])\b(?:0x[\da-f]+|\d+)/i,
lookbehind: true
},
"punctuation": /%[%?]|[|:;\[\]<>]/
}
}
});
Prism.languages.bnf = {
"string": {
pattern: /"[^\r\n"]*"|'[^\r\n']*'/
},
"definition": {
pattern: /<[^<>\r\n\t]+>(?=\s*::=)/,
alias: ["rule", "keyword"],
inside: {
"punctuation": /^<|>$/
}
},
"rule": {
pattern: /<[^<>\r\n\t]+>/,
inside: {
"punctuation": /^<|>$/
}
},
"operator": /::=|[|()[\]{}*+?]|\.{3}/
};
Prism.languages.rbnf = Prism.languages.bnf;
Prism.languages.brainfuck = {
"pointer": {
pattern: /<|>/,
alias: "keyword"
},
"increment": {
pattern: /\+/,
alias: "inserted"
},
"decrement": {
pattern: /-/,
alias: "deleted"
},
"branching": {
pattern: /\[|\]/,
alias: "important"
},
"operator": /[.,]/,
"comment": /\S+/
};
Prism.languages.brightscript = {
"comment": /(?:\brem|').*/i,
"directive-statement": {
pattern: /(^[\t ]*)#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if).*/im,
lookbehind: true,
alias: "property",
inside: {
"error-message": {
pattern: /(^#error).+/,
lookbehind: true
},
"directive": {
pattern: /^#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if)/,
alias: "keyword"
},
"expression": {
pattern: /[\s\S]+/,
inside: null
}
}
},
"property": {
pattern: /([\r\n{,][\t ]*)(?:(?!\d)\w+|"(?:[^"\r\n]|"")*"(?!"))(?=[ \t]*:)/,
lookbehind: true,
greedy: true
},
"string": {
pattern: /"(?:[^"\r\n]|"")*"(?!")/,
greedy: true
},
"class-name": {
pattern: /(\bAs[\t ]+)\w+/i,
lookbehind: true
},
"keyword": /\b(?:As|Dim|Each|Else|Elseif|End|Exit|For|Function|Goto|If|In|Print|Return|Step|Stop|Sub|Then|To|While)\b/i,
"boolean": /\b(?:false|true)\b/i,
"function": /\b(?!\d)\w+(?=[\t ]*\()/,
"number": /(?:\b\d+(?:\.\d+)?(?:[ed][+-]\d+)?|&h[a-f\d]+)\b[%&!#]?/i,
"operator": /--|\+\+|>>=?|<<=?|<>|[-+*/\\<>]=?|[:^=?]|\b(?:and|mod|not|or)\b/i,
"punctuation": /[.,;()[\]{}]/,
"constant": /\b(?:LINE_NUM)\b/i
};
Prism.languages.brightscript["directive-statement"].inside.expression.inside = Prism.languages.brightscript;
Prism.languages.bro = {
"comment": {
pattern: /(^|[^\\$])#.*/,
lookbehind: true,
inside: {
"italic": /\b(?:FIXME|TODO|XXX)\b/
}
},
"string": {
pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"boolean": /\b[TF]\b/,
"function": {
pattern: /(\b(?:event|function|hook)[ \t]+)\w+(?:::\w+)?/,
lookbehind: true
},
"builtin": /(?:@(?:load(?:-(?:plugin|sigs))?|unload|prefixes|ifn?def|else|(?:end)?if|DIR|FILENAME))|(?:&?(?:add_func|create_expire|default|delete_func|encrypt|error_handler|expire_func|group|log|mergeable|optional|persistent|priority|raw_output|read_expire|redef|rotate_interval|rotate_size|synchronized|type_column|write_expire))/,
"constant": {
pattern: /(\bconst[ \t]+)\w+/i,
lookbehind: true
},
"keyword": /\b(?:add|addr|alarm|any|bool|break|const|continue|count|delete|double|else|enum|event|export|file|for|function|global|hook|if|in|int|interval|local|module|next|of|opaque|pattern|port|print|record|return|schedule|set|string|subnet|table|time|timeout|using|vector|when)\b/,
"operator": /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&|\|\|?|\?|\*|\/|~|\^|%/,
"number": /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
"punctuation": /[{}[\];(),.:]/
};
Prism.languages.bsl = {
"comment": /\/\/.*/,
"string": [
{
pattern: /"(?:[^"]|"")*"(?!")/,
greedy: true
},
{
pattern: /'(?:[^'\r\n\\]|\\.)*'/
}
],
"keyword": [
{
pattern: /(^|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:пока|для|новый|прервать|попытка|исключение|вызватьисключение|иначе|конецпопытки|неопределено|функция|перем|возврат|конецфункции|если|иначеесли|процедура|конецпроцедуры|тогда|знач|экспорт|конецесли|из|каждого|истина|ложь|по|цикл|конеццикла|выполнить)(?![\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])/i,
lookbehind: true
},
{
pattern: /\b(?:break|do|each|else|elseif|enddo|endfunction|endif|endprocedure|endtry|except|execute|export|false|for|function|if|in|new|null|procedure|raise|return|then|to|true|try|undefined|val|var|while)\b/i
}
],
"number": {
pattern: /(^(?=\d)|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?/i,
lookbehind: true
},
"operator": [
/[<>+\-*/]=?|[%=]/,
{
pattern: /(^|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:и|или|не)(?![\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])/i,
lookbehind: true
},
{
pattern: /\b(?:and|not|or)\b/i
}
],
"punctuation": /\(\.|\.\)|[()\[\]:;,.]/,
"directive": [
{
pattern: /^([ \t]*)&.*/m,
lookbehind: true,
greedy: true,
alias: "important"
},
{
pattern: /^([ \t]*)#.*/gm,
lookbehind: true,
greedy: true,
alias: "important"
}
]
};
Prism.languages.oscript = Prism.languages["bsl"];
Prism.languages.cfscript = Prism.languages.extend("clike", {
"comment": [
{
pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
lookbehind: true,
inside: {
"annotation": {
pattern: /(?:^|[^.])@[\w\.]+/,
alias: "punctuation"
}
}
},
{
pattern: /(^|[^\\:])\/\/.*/,
lookbehind: true,
greedy: true
}
],
"keyword": /\b(?:abstract|break|catch|component|continue|default|do|else|extends|final|finally|for|function|if|in|include|package|private|property|public|remote|required|rethrow|return|static|switch|throw|try|var|while|xml)\b(?!\s*=)/,
"operator": [
/\+\+|--|&&|\|\||::|=>|[!=]==|[-+*/%&|^!=<>]=?|\?(?:\.|:)?|:/,
/\b(?:and|contains|eq|equal|eqv|gt|gte|imp|is|lt|lte|mod|not|or|xor)\b/
],
"scope": {
pattern: /\b(?:application|arguments|cgi|client|cookie|local|session|super|this|variables)\b/,
alias: "global"
},
"type": {
pattern: /\b(?:any|array|binary|boolean|date|guid|numeric|query|string|struct|uuid|void|xml)\b/,
alias: "builtin"
}
});
Prism.languages.insertBefore("cfscript", "keyword", {
"function-variable": {
pattern: /[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,
alias: "function"
}
});
delete Prism.languages.cfscript["class-name"];
Prism.languages.cfc = Prism.languages["cfscript"];
Prism.languages.chaiscript = Prism.languages.extend("clike", {
"string": {
pattern: /(^|[^\\])'(?:[^'\\]|\\[\s\S])*'/,
lookbehind: true,
greedy: true
},
"class-name": [
{
pattern: /(\bclass\s+)\w+/,
lookbehind: true
},
{
pattern: /(\b(?:attr|def)\s+)\w+(?=\s*::)/,
lookbehind: true
}
],
"keyword": /\b(?:attr|auto|break|case|catch|class|continue|def|default|else|finally|for|fun|global|if|return|switch|this|try|var|while)\b/,
"number": [
Prism.languages.cpp.number,
/\b(?:Infinity|NaN)\b/
],
"operator": />>=?|<<=?|\|\||&&|:[:=]?|--|\+\+|[=!<>+\-*/%|&^]=?|[?~]|`[^`\r\n]{1,4}`/
});
Prism.languages.insertBefore("chaiscript", "operator", {
"parameter-type": {
pattern: /([,(]\s*)\w+(?=\s+\w)/,
lookbehind: true,
alias: "class-name"
}
});
Prism.languages.insertBefore("chaiscript", "string", {
"string-interpolation": {
pattern: /(^|[^\\])"(?:[^"$\\]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*"/,
lookbehind: true,
greedy: true,
inside: {
"interpolation": {
pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\}/,
lookbehind: true,
inside: {
"interpolation-expression": {
pattern: /(^\$\{)[\s\S]+(?=\}$)/,
lookbehind: true,
inside: Prism.languages.chaiscript
},
"interpolation-punctuation": {
pattern: /^\$\{|\}$/,
alias: "punctuation"
}
}
},
"string": /[\s\S]+/
}
}
});
Prism.languages.cil = {
"comment": /\/\/.*/,
"string": {
pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"directive": {
pattern: /(^|\W)\.[a-z]+(?=\s)/,
lookbehind: true,
alias: "class-name"
},
"variable": /\[[\w\.]+\]/,
"keyword": /\b(?:abstract|ansi|assembly|auto|autochar|beforefieldinit|bool|bstr|byvalstr|catch|char|cil|class|currency|date|decimal|default|enum|error|explicit|extends|extern|famandassem|family|famorassem|final(?:ly)?|float32|float64|hidebysig|u?int(?:8|16|32|64)?|iant|idispatch|implements|import|initonly|instance|interface|iunknown|literal|lpstr|lpstruct|lptstr|lpwstr|managed|method|native(?:Type)?|nested|newslot|object(?:ref)?|pinvokeimpl|private|privatescope|public|reqsecobj|rtspecialname|runtime|sealed|sequential|serializable|specialname|static|string|struct|syschar|tbstr|unicode|unmanagedexp|unsigned|value(?:type)?|variant|virtual|void)\b/,
"function": /\b(?:(?:constrained|no|readonly|tail|unaligned|volatile)\.)?(?:conv\.(?:[iu][1248]?|ovf\.[iu][1248]?(?:\.un)?|r\.un|r4|r8)|ldc\.(?:i4(?:\.\d+|\.[mM]1|\.s)?|i8|r4|r8)|ldelem(?:\.[iu][1248]?|\.r[48]|\.ref|a)?|ldind\.(?:[iu][1248]?|r[48]|ref)|stelem\.?(?:i[1248]?|r[48]|ref)?|stind\.(?:i[1248]?|r[48]|ref)?|end(?:fault|filter|finally)|ldarg(?:\.[0-3s]|a(?:\.s)?)?|ldloc(?:\.\d+|\.s)?|sub(?:\.ovf(?:\.un)?)?|mul(?:\.ovf(?:\.un)?)?|add(?:\.ovf(?:\.un)?)?|stloc(?:\.[0-3s])?|refany(?:type|val)|blt(?:\.un)?(?:\.s)?|ble(?:\.un)?(?:\.s)?|bgt(?:\.un)?(?:\.s)?|bge(?:\.un)?(?:\.s)?|unbox(?:\.any)?|init(?:blk|obj)|call(?:i|virt)?|brfalse(?:\.s)?|bne\.un(?:\.s)?|ldloca(?:\.s)?|brzero(?:\.s)?|brtrue(?:\.s)?|brnull(?:\.s)?|brinst(?:\.s)?|starg(?:\.s)?|leave(?:\.s)?|shr(?:\.un)?|rem(?:\.un)?|div(?:\.un)?|clt(?:\.un)?|alignment|castclass|ldvirtftn|beq(?:\.s)?|ckfinite|ldsflda|ldtoken|localloc|mkrefany|rethrow|cgt\.un|arglist|switch|stsfld|sizeof|newobj|newarr|ldsfld|ldnull|ldflda|isinst|throw|stobj|stfld|ldstr|ldobj|ldlen|ldftn|ldfld|cpobj|cpblk|break|br\.s|xor|shl|ret|pop|not|nop|neg|jmp|dup|cgt|ceq|box|and|or|br)\b/,
"boolean": /\b(?:false|true)\b/,
"number": /\b-?(?:0x[0-9a-f]+|\d+)(?:\.[0-9a-f]+)?\b/i,
"punctuation": /[{}[\];(),:=]|IL_[0-9A-Za-z]+/
};
Prism.languages.clojure = {
"comment": {
pattern: /;.*/,
greedy: true
},
"string": {
pattern: /"(?:[^"\\]|\\.)*"/,
greedy: true
},
"char": /\\\w+/,
"symbol": {
pattern: /(^|[\s()\[\]{},])::?[\w*+!?'<>=/.-]+/,
lookbehind: true
},
"keyword": {
pattern: /(\()(?:-|->|->>|\.|\.\.|\*|\/|\+|<|<=|=|==|>|>=|accessor|agent|agent-errors|aget|alength|all-ns|alter|and|append-child|apply|array-map|aset|aset-boolean|aset-byte|aset-char|aset-double|aset-float|aset-int|aset-long|aset-short|assert|assoc|await|await-for|bean|binding|bit-and|bit-not|bit-or|bit-shift-left|bit-shift-right|bit-xor|boolean|branch\?|butlast|byte|cast|char|children|class|clear-agent-errors|comment|commute|comp|comparator|complement|concat|cond|conj|cons|constantly|construct-proxy|contains\?|count|create-ns|create-struct|cycle|dec|declare|def|def-|definline|definterface|defmacro|defmethod|defmulti|defn|defn-|defonce|defproject|defprotocol|defrecord|defstruct|deftype|deref|difference|disj|dissoc|distinct|do|doall|doc|dorun|doseq|dosync|dotimes|doto|double|down|drop|drop-while|edit|end\?|ensure|eval|every\?|false\?|ffirst|file-seq|filter|find|find-doc|find-ns|find-var|first|float|flush|fn|fnseq|for|frest|gensym|get|get-proxy-class|hash-map|hash-set|identical\?|identity|if|if-let|if-not|import|in-ns|inc|index|insert-child|insert-left|insert-right|inspect-table|inspect-tree|instance\?|int|interleave|intersection|into|into-array|iterate|join|key|keys|keyword|keyword\?|last|lazy-cat|lazy-cons|left|lefts|let|line-seq|list|list\*|load|load-file|locking|long|loop|macroexpand|macroexpand-1|make-array|make-node|map|map-invert|map\?|mapcat|max|max-key|memfn|merge|merge-with|meta|min|min-key|monitor-enter|name|namespace|neg\?|new|newline|next|nil\?|node|not|not-any\?|not-every\?|not=|ns|ns-imports|ns-interns|ns-map|ns-name|ns-publics|ns-refers|ns-resolve|ns-unmap|nth|nthrest|or|parse|partial|path|peek|pop|pos\?|pr|pr-str|print|print-str|println|println-str|prn|prn-str|project|proxy|proxy-mappings|quot|quote|rand|rand-int|range|re-find|re-groups|re-matcher|re-matches|re-pattern|re-seq|read|read-line|recur|reduce|ref|ref-set|refer|rem|remove|remove-method|remove-ns|rename|rename-keys|repeat|replace|replicate|resolve|rest|resultset-seq|reverse|rfirst|right|rights|root|rrest|rseq|second|select|select-keys|send|send-off|seq|seq-zip|seq\?|set|set!|short|slurp|some|sort|sort-by|sorted-map|sorted-map-by|sorted-set|special-symbol\?|split-at|split-with|str|string\?|struct|struct-map|subs|subvec|symbol|symbol\?|sync|take|take-nth|take-while|test|throw|time|to-array|to-array-2d|tree-seq|true\?|try|union|up|update-proxy|val|vals|var|var-get|var-set|var\?|vector|vector-zip|vector\?|when|when-first|when-let|when-not|with-local-vars|with-meta|with-open|with-out-str|xml-seq|xml-zip|zero\?|zipmap|zipper)(?=[\s)]|$)/,
lookbehind: true
},
"boolean": /\b(?:false|nil|true)\b/,
"number": {
pattern: /(^|[^\w$@])(?:\d+(?:[/.]\d+)?(?:e[+-]?\d+)?|0x[a-f0-9]+|[1-9]\d?r[a-z0-9]+)[lmn]?(?![\w$@])/i,
lookbehind: true
},
"function": {
pattern: /((?:^|[^'])\()[\w*+!?'<>=/.-]+(?=[\s)]|$)/,
lookbehind: true
},
"operator": /[#@^`~]/,
"punctuation": /[{}\[\](),]/
};
Prism.languages.cmake = {
"comment": /#.*/,
"string": {
pattern: /"(?:[^\\"]|\\.)*"/,
greedy: true,
inside: {
"interpolation": {
pattern: /\$\{(?:[^{}$]|\$\{[^{}$]*\})*\}/,
inside: {
"punctuation": /\$\{|\}/,
"variable": /\w+/
}
}
}
},
"variable": /\b(?:CMAKE_\w+|\w+_(?:(?:BINARY|SOURCE)_DIR|DESCRIPTION|HOMEPAGE_URL|ROOT|VERSION(?:_MAJOR|_MINOR|_PATCH|_TWEAK)?)|(?:ANDROID|APPLE|BORLAND|BUILD_SHARED_LIBS|CACHE|CPACK_(?:ABSOLUTE_DESTINATION_FILES|COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY|ERROR_ON_ABSOLUTE_INSTALL_DESTINATION|INCLUDE_TOPLEVEL_DIRECTORY|INSTALL_DEFAULT_DIRECTORY_PERMISSIONS|INSTALL_SCRIPT|PACKAGING_INSTALL_PREFIX|SET_DESTDIR|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|CTEST_(?:BINARY_DIRECTORY|BUILD_COMMAND|BUILD_NAME|BZR_COMMAND|BZR_UPDATE_OPTIONS|CHANGE_ID|CHECKOUT_COMMAND|CONFIGURATION_TYPE|CONFIGURE_COMMAND|COVERAGE_COMMAND|COVERAGE_EXTRA_FLAGS|CURL_OPTIONS|CUSTOM_(?:COVERAGE_EXCLUDE|ERROR_EXCEPTION|ERROR_MATCH|ERROR_POST_CONTEXT|ERROR_PRE_CONTEXT|MAXIMUM_FAILED_TEST_OUTPUT_SIZE|MAXIMUM_NUMBER_OF_(?:ERRORS|WARNINGS)|MAXIMUM_PASSED_TEST_OUTPUT_SIZE|MEMCHECK_IGNORE|POST_MEMCHECK|POST_TEST|PRE_MEMCHECK|PRE_TEST|TESTS_IGNORE|WARNING_EXCEPTION|WARNING_MATCH)|CVS_CHECKOUT|CVS_COMMAND|CVS_UPDATE_OPTIONS|DROP_LOCATION|DROP_METHOD|DROP_SITE|DROP_SITE_CDASH|DROP_SITE_PASSWORD|DROP_SITE_USER|EXTRA_COVERAGE_GLOB|GIT_COMMAND|GIT_INIT_SUBMODULES|GIT_UPDATE_CUSTOM|GIT_UPDATE_OPTIONS|HG_COMMAND|HG_UPDATE_OPTIONS|LABELS_FOR_SUBPROJECTS|MEMORYCHECK_(?:COMMAND|COMMAND_OPTIONS|SANITIZER_OPTIONS|SUPPRESSIONS_FILE|TYPE)|NIGHTLY_START_TIME|P4_CLIENT|P4_COMMAND|P4_OPTIONS|P4_UPDATE_OPTIONS|RUN_CURRENT_SCRIPT|SCP_COMMAND|SITE|SOURCE_DIRECTORY|SUBMIT_URL|SVN_COMMAND|SVN_OPTIONS|SVN_UPDATE_OPTIONS|TEST_LOAD|TEST_TIMEOUT|TRIGGER_SITE|UPDATE_COMMAND|UPDATE_OPTIONS|UPDATE_VERSION_ONLY|USE_LAUNCHERS)|CYGWIN|ENV|EXECUTABLE_OUTPUT_PATH|GHS-MULTI|IOS|LIBRARY_OUTPUT_PATH|MINGW|MSVC(?:10|11|12|14|60|70|71|80|90|_IDE|_TOOLSET_VERSION|_VERSION)?|MSYS|PROJECT_NAME|UNIX|WIN32|WINCE|WINDOWS_PHONE|WINDOWS_STORE|XCODE))\b/,
"property": /\b(?:cxx_\w+|(?:ARCHIVE_OUTPUT_(?:DIRECTORY|NAME)|COMPILE_DEFINITIONS|COMPILE_PDB_NAME|COMPILE_PDB_OUTPUT_DIRECTORY|EXCLUDE_FROM_DEFAULT_BUILD|IMPORTED_(?:IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_LANGUAGES|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|NO_SONAME|OBJECTS|SONAME)|INTERPROCEDURAL_OPTIMIZATION|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_OUTPUT_NAME|LINK_FLAGS|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|MAP_IMPORTED_CONFIG|OSX_ARCHITECTURES|OUTPUT_NAME|PDB_NAME|PDB_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_NAME|STATIC_LIBRARY_FLAGS|VS_CSHARP|VS_DOTNET_REFERENCEPROP|VS_DOTNET_REFERENCE|VS_GLOBAL_SECTION_POST|VS_GLOBAL_SECTION_PRE|VS_GLOBAL|XCODE_ATTRIBUTE)_\w+|\w+_(?:CLANG_TIDY|COMPILER_LAUNCHER|CPPCHECK|CPPLINT|INCLUDE_WHAT_YOU_USE|OUTPUT_NAME|POSTFIX|VISIBILITY_PRESET)|ABSTRACT|ADDITIONAL_MAKE_CLEAN_FILES|ADVANCED|ALIASED_TARGET|ALLOW_DUPLICATE_CUSTOM_TARGETS|ANDROID_(?:ANT_ADDITIONAL_OPTIONS|API|API_MIN|ARCH|ASSETS_DIRECTORIES|GUI|JAR_DEPENDENCIES|NATIVE_LIB_DEPENDENCIES|NATIVE_LIB_DIRECTORIES|PROCESS_MAX|PROGUARD|PROGUARD_CONFIG_PATH|SECURE_PROPS_PATH|SKIP_ANT_STEP|STL_TYPE)|ARCHIVE_OUTPUT_DIRECTORY|ATTACHED_FILES|ATTACHED_FILES_ON_FAIL|AUTOGEN_(?:BUILD_DIR|ORIGIN_DEPENDS|PARALLEL|SOURCE_GROUP|TARGETS_FOLDER|TARGET_DEPENDS)|AUTOMOC|AUTOMOC_(?:COMPILER_PREDEFINES|DEPEND_FILTERS|EXECUTABLE|MACRO_NAMES|MOC_OPTIONS|SOURCE_GROUP|TARGETS_FOLDER)|AUTORCC|AUTORCC_EXECUTABLE|AUTORCC_OPTIONS|AUTORCC_SOURCE_GROUP|AUTOUIC|AUTOUIC_EXECUTABLE|AUTOUIC_OPTIONS|AUTOUIC_SEARCH_PATHS|BINARY_DIR|BUILDSYSTEM_TARGETS|BUILD_RPATH|BUILD_RPATH_USE_ORIGIN|BUILD_WITH_INSTALL_NAME_DIR|BUILD_WITH_INSTALL_RPATH|BUNDLE|BUNDLE_EXTENSION|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMMON_LANGUAGE_RUNTIME|COMPATIBLE_INTERFACE_(?:BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|COMPILE_(?:DEFINITIONS|FEATURES|FLAGS|OPTIONS|PDB_NAME|PDB_OUTPUT_DIRECTORY)|COST|CPACK_DESKTOP_SHORTCUTS|CPACK_NEVER_OVERWRITE|CPACK_PERMANENT|CPACK_STARTUP_SHORTCUTS|CPACK_START_MENU_SHORTCUTS|CPACK_WIX_ACL|CROSSCOMPILING_EMULATOR|CUDA_EXTENSIONS|CUDA_PTX_COMPILATION|CUDA_RESOLVE_DEVICE_SYMBOLS|CUDA_SEPARABLE_COMPILATION|CUDA_STANDARD|CUDA_STANDARD_REQUIRED|CXX_EXTENSIONS|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_EXTENSIONS|C_STANDARD|C_STANDARD_REQUIRED|DEBUG_CONFIGURATIONS|DEFINE_SYMBOL|DEFINITIONS|DEPENDS|DEPLOYMENT_ADDITIONAL_FILES|DEPLOYMENT_REMOTE_DIRECTORY|DISABLED|DISABLED_FEATURES|ECLIPSE_EXTRA_CPROJECT_CONTENTS|ECLIPSE_EXTRA_NATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|ENABLE_EXPORTS|ENVIRONMENT|EXCLUDE_FROM_ALL|EXCLUDE_FROM_DEFAULT_BUILD|EXPORT_NAME|EXPORT_PROPERTIES|EXTERNAL_OBJECT|EchoString|FAIL_REGULAR_EXPRESSION|FIND_LIBRARY_USE_LIB32_PATHS|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_LIBX32_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|FIXTURES_CLEANUP|FIXTURES_REQUIRED|FIXTURES_SETUP|FOLDER|FRAMEWORK|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GENERATED|GENERATOR_FILE_NAME|GENERATOR_IS_MULTI_CONFIG|GHS_INTEGRITY_APP|GHS_NO_SOURCE_GROUP_FILE|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|GNUtoMS|HAS_CXX|HEADER_FILE_ONLY|HELPSTRING|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|IMPORTED|IMPORTED_(?:COMMON_LANGUAGE_RUNTIME|CONFIGURATIONS|GLOBAL|IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_(?:LANGUAGES|LIBRARIES|MULTIPLICITY)|LOCATION|NO_SONAME|OBJECTS|SONAME)|IMPORT_PREFIX|IMPORT_SUFFIX|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE_(?:AUTOUIC_OPTIONS|COMPILE_DEFINITIONS|COMPILE_FEATURES|COMPILE_OPTIONS|INCLUDE_DIRECTORIES|LINK_DEPENDS|LINK_DIRECTORIES|LINK_LIBRARIES|LINK_OPTIONS|POSITION_INDEPENDENT_CODE|SOURCES|SYSTEM_INCLUDE_DIRECTORIES)|INTERPROCEDURAL_OPTIMIZATION|IN_TRY_COMPILE|IOS_INSTALL_COMBINED|JOB_POOLS|JOB_POOL_COMPILE|JOB_POOL_LINK|KEEP_EXTENSION|LABELS|LANGUAGE|LIBRARY_OUTPUT_DIRECTORY|LINKER_LANGUAGE|LINK_(?:DEPENDS|DEPENDS_NO_SHARED|DIRECTORIES|FLAGS|INTERFACE_LIBRARIES|INTERFACE_MULTIPLICITY|LIBRARIES|OPTIONS|SEARCH_END_STATIC|SEARCH_START_STATIC|WHAT_YOU_USE)|LISTFILE_STACK|LOCATION|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_PACKAGE_LOCATION|MACOSX_RPATH|MACROS|MANUALLY_ADDED_DEPENDENCIES|MEASUREMENT|MODIFIED|NAME|NO_SONAME|NO_SYSTEM_FROM_IMPORTED|OBJECT_DEPENDS|OBJECT_OUTPUTS|OSX_ARCHITECTURES|OUTPUT_NAME|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PARENT_DIRECTORY|PASS_REGULAR_EXPRESSION|PDB_NAME|PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|POST_INSTALL_SCRIPT|PREDEFINED_TARGETS_FOLDER|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE_HEADER|PROCESSORS|PROCESSOR_AFFINITY|PROJECT_LABEL|PUBLIC_HEADER|REPORT_UNDEFINED_PROPERTIES|REQUIRED_FILES|RESOURCE|RESOURCE_LOCK|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|RULE_MESSAGES|RUNTIME_OUTPUT_DIRECTORY|RUN_SERIAL|SKIP_AUTOGEN|SKIP_AUTOMOC|SKIP_AUTORCC|SKIP_AUTOUIC|SKIP_BUILD_RPATH|SKIP_RETURN_CODE|SOURCES|SOURCE_DIR|SOVERSION|STATIC_LIBRARY_FLAGS|STATIC_LIBRARY_OPTIONS|STRINGS|SUBDIRECTORIES|SUFFIX|SYMBOLIC|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_MESSAGES|TARGET_SUPPORTS_SHARED_LIBS|TESTS|TEST_INCLUDE_FILE|TEST_INCLUDE_FILES|TIMEOUT|TIMEOUT_AFTER_MATCH|TYPE|USE_FOLDERS|VALUE|VARIABLES|VERSION|VISIBILITY_INLINES_HIDDEN|VS_(?:CONFIGURATION_TYPE|COPY_TO_OUT_DIR|DEBUGGER_(?:COMMAND|COMMAND_ARGUMENTS|ENVIRONMENT|WORKING_DIRECTORY)|DEPLOYMENT_CONTENT|DEPLOYMENT_LOCATION|DOTNET_REFERENCES|DOTNET_REFERENCES_COPY_LOCAL|INCLUDE_IN_VSIX|IOT_STARTUP_TASK|KEYWORD|RESOURCE_GENERATOR|SCC_AUXPATH|SCC_LOCALPATH|SCC_PROJECTNAME|SCC_PROVIDER|SDK_REFERENCES|SHADER_(?:DISABLE_OPTIMIZATIONS|ENABLE_DEBUG|ENTRYPOINT|FLAGS|MODEL|OBJECT_FILE_NAME|OUTPUT_HEADER_FILE|TYPE|VARIABLE_NAME)|STARTUP_PROJECT|TOOL_OVERRIDE|USER_PROPS|WINRT_COMPONENT|WINRT_EXTENSIONS|WINRT_REFERENCES|XAML_TYPE)|WILL_FAIL|WIN32_EXECUTABLE|WINDOWS_EXPORT_ALL_SYMBOLS|WORKING_DIRECTORY|WRAP_EXCLUDE|XCODE_(?:EMIT_EFFECTIVE_PLATFORM_NAME|EXPLICIT_FILE_TYPE|FILE_ATTRIBUTES|LAST_KNOWN_FILE_TYPE|PRODUCT_TYPE|SCHEME_(?:ADDRESS_SANITIZER|ADDRESS_SANITIZER_USE_AFTER_RETURN|ARGUMENTS|DISABLE_MAIN_THREAD_CHECKER|DYNAMIC_LIBRARY_LOADS|DYNAMIC_LINKER_API_USAGE|ENVIRONMENT|EXECUTABLE|GUARD_MALLOC|MAIN_THREAD_CHECKER_STOP|MALLOC_GUARD_EDGES|MALLOC_SCRIBBLE|MALLOC_STACK|THREAD_SANITIZER(?:_STOP)?|UNDEFINED_BEHAVIOUR_SANITIZER(?:_STOP)?|ZOMBIE_OBJECTS))|XCTEST)\b/,
"keyword": /\b(?:add_compile_definitions|add_compile_options|add_custom_command|add_custom_target|add_definitions|add_dependencies|add_executable|add_library|add_link_options|add_subdirectory|add_test|aux_source_directory|break|build_command|build_name|cmake_host_system_information|cmake_minimum_required|cmake_parse_arguments|cmake_policy|configure_file|continue|create_test_sourcelist|ctest_build|ctest_configure|ctest_coverage|ctest_empty_binary_directory|ctest_memcheck|ctest_read_custom_files|ctest_run_script|ctest_sleep|ctest_start|ctest_submit|ctest_test|ctest_update|ctest_upload|define_property|else|elseif|enable_language|enable_testing|endforeach|endfunction|endif|endmacro|endwhile|exec_program|execute_process|export|export_library_dependencies|file|find_file|find_library|find_package|find_path|find_program|fltk_wrap_ui|foreach|function|get_cmake_property|get_directory_property|get_filename_component|get_property|get_source_file_property|get_target_property|get_test_property|if|include|include_directories|include_external_msproject|include_guard|include_regular_expression|install|install_files|install_programs|install_targets|link_directories|link_libraries|list|load_cache|load_command|macro|make_directory|mark_as_advanced|math|message|option|output_required_files|project|qt_wrap_cpp|qt_wrap_ui|remove|remove_definitions|return|separate_arguments|set|set_directory_properties|set_property|set_source_files_properties|set_target_properties|set_tests_properties|site_name|source_group|string|subdir_depends|subdirs|target_compile_definitions|target_compile_features|target_compile_options|target_include_directories|target_link_directories|target_link_libraries|target_link_options|target_sources|try_compile|try_run|unset|use_mangled_mesa|utility_source|variable_requires|variable_watch|while|write_file)(?=\s*\()\b/,
"boolean": /\b(?:FALSE|OFF|ON|TRUE)\b/,
"namespace": /\b(?:INTERFACE|PRIVATE|PROPERTIES|PUBLIC|SHARED|STATIC|TARGET_OBJECTS)\b/,
"operator": /\b(?:AND|DEFINED|EQUAL|GREATER|LESS|MATCHES|NOT|OR|STREQUAL|STRGREATER|STRLESS|VERSION_EQUAL|VERSION_GREATER|VERSION_LESS)\b/,
"inserted": {
pattern: /\b\w+::\w+\b/,
alias: "class-name"
},
"number": /\b\d+(?:\.\d+)*\b/,
"function": /\b[a-z_]\w*(?=\s*\()\b/i,
"punctuation": /[()>}]|\$[<{]/
};
Prism.languages.cobol = {
"comment": {
pattern: /\*>.*|(^[ \t]*)\*.*/m,
lookbehind: true,
greedy: true
},
"string": {
pattern: /[xzgn]?(?:"(?:[^\r\n"]|"")*"(?!")|'(?:[^\r\n']|'')*'(?!'))/i,
greedy: true
},
"level": {
pattern: /(^[ \t]*)\d+\b/m,
lookbehind: true,
greedy: true,
alias: "number"
},
"class-name": {
pattern: /(\bpic(?:ture)?\s+)(?:(?:[-\w$/,:*+<>]|\.(?!\s|$))(?:\(\d+\))?)+/i,
lookbehind: true,
inside: {
"number": {
pattern: /(\()\d+/,
lookbehind: true
},
"punctuation": /[()]/
}
},
"keyword": {
pattern: /(^|[^\w-])(?:ABORT|ACCEPT|ACCESS|ADD|ADDRESS|ADVANCING|AFTER|ALIGNED|ALL|ALPHABET|ALPHABETIC|ALPHABETIC-LOWER|ALPHABETIC-UPPER|ALPHANUMERIC|ALPHANUMERIC-EDITED|ALSO|ALTER|ALTERNATE|ANY|ARE|AREA|AREAS|AS|ASCENDING|ASCII|ASSIGN|ASSOCIATED-DATA|ASSOCIATED-DATA-LENGTH|AT|ATTRIBUTE|AUTHOR|AUTO|AUTO-SKIP|BACKGROUND-COLOR|BACKGROUND-COLOUR|BASIS|BEEP|BEFORE|BEGINNING|BELL|BINARY|BIT|BLANK|BLINK|BLOCK|BOTTOM|BOUNDS|BY|BYFUNCTION|BYTITLE|CALL|CANCEL|CAPABLE|CCSVERSION|CD|CF|CH|CHAINING|CHANGED|CHANNEL|CHARACTER|CHARACTERS|CLASS|CLASS-ID|CLOCK-UNITS|CLOSE|CLOSE-DISPOSITION|COBOL|CODE|CODE-SET|COL|COLLATING|COLUMN|COM-REG|COMMA|COMMITMENT|COMMON|COMMUNICATION|COMP|COMP-1|COMP-2|COMP-3|COMP-4|COMP-5|COMPUTATIONAL|COMPUTATIONAL-1|COMPUTATIONAL-2|COMPUTATIONAL-3|COMPUTATIONAL-4|COMPUTATIONAL-5|COMPUTE|CONFIGURATION|CONTAINS|CONTENT|CONTINUE|CONTROL|CONTROL-POINT|CONTROLS|CONVENTION|CONVERTING|COPY|CORR|CORRESPONDING|COUNT|CRUNCH|CURRENCY|CURSOR|DATA|DATA-BASE|DATE|DATE-COMPILED|DATE-WRITTEN|DAY|DAY-OF-WEEK|DBCS|DE|DEBUG-CONTENTS|DEBUG-ITEM|DEBUG-LINE|DEBUG-NAME|DEBUG-SUB-1|DEBUG-SUB-2|DEBUG-SUB-3|DEBUGGING|DECIMAL-POINT|DECLARATIVES|DEFAULT|DEFAULT-DISPLAY|DEFINITION|DELETE|DELIMITED|DELIMITER|DEPENDING|DESCENDING|DESTINATION|DETAIL|DFHRESP|DFHVALUE|DISABLE|DISK|DISPLAY|DISPLAY-1|DIVIDE|DIVISION|DONTCARE|DOUBLE|DOWN|DUPLICATES|DYNAMIC|EBCDIC|EGCS|EGI|ELSE|EMI|EMPTY-CHECK|ENABLE|END|END-ACCEPT|END-ADD|END-CALL|END-COMPUTE|END-DELETE|END-DIVIDE|END-EVALUATE|END-IF|END-MULTIPLY|END-OF-PAGE|END-PERFORM|END-READ|END-RECEIVE|END-RETURN|END-REWRITE|END-SEARCH|END-START|END-STRING|END-SUBTRACT|END-UNSTRING|END-WRITE|ENDING|ENTER|ENTRY|ENTRY-PROCEDURE|ENVIRONMENT|EOL|EOP|EOS|ERASE|ERROR|ESCAPE|ESI|EVALUATE|EVENT|EVERY|EXCEPTION|EXCLUSIVE|EXHIBIT|EXIT|EXPORT|EXTEND|EXTENDED|EXTERNAL|FD|FILE|FILE-CONTROL|FILLER|FINAL|FIRST|FOOTING|FOR|FOREGROUND-COLOR|FOREGROUND-COLOUR|FROM|FULL|FUNCTION|FUNCTION-POINTER|FUNCTIONNAME|GENERATE|GIVING|GLOBAL|GO|GOBACK|GRID|GROUP|HEADING|HIGH-VALUE|HIGH-VALUES|HIGHLIGHT|I-O|I-O-CONTROL|ID|IDENTIFICATION|IF|IMPLICIT|IMPORT|IN|INDEX|INDEXED|INDICATE|INITIAL|INITIALIZE|INITIATE|INPUT|INPUT-OUTPUT|INSPECT|INSTALLATION|INTEGER|INTO|INVALID|INVOKE|IS|JUST|JUSTIFIED|KANJI|KEPT|KEY|KEYBOARD|LABEL|LANGUAGE|LAST|LB|LD|LEADING|LEFT|LEFTLINE|LENGTH|LENGTH-CHECK|LIBACCESS|LIBPARAMETER|LIBRARY|LIMIT|LIMITS|LINAGE|LINAGE-COUNTER|LINE|LINE-COUNTER|LINES|LINKAGE|LIST|LOCAL|LOCAL-STORAGE|LOCK|LONG-DATE|LONG-TIME|LOW-VALUE|LOW-VALUES|LOWER|LOWLIGHT|MEMORY|MERGE|MESSAGE|MMDDYYYY|MODE|MODULES|MORE-LABELS|MOVE|MULTIPLE|MULTIPLY|NAMED|NATIONAL|NATIONAL-EDITED|NATIVE|NEGATIVE|NETWORK|NEXT|NO|NO-ECHO|NULL|NULLS|NUMBER|NUMERIC|NUMERIC-DATE|NUMERIC-EDITED|NUMERIC-TIME|OBJECT-COMPUTER|OCCURS|ODT|OF|OFF|OMITTED|ON|OPEN|OPTIONAL|ORDER|ORDERLY|ORGANIZATION|OTHER|OUTPUT|OVERFLOW|OVERLINE|OWN|PACKED-DECIMAL|PADDING|PAGE|PAGE-COUNTER|PASSWORD|PERFORM|PF|PH|PIC|PICTURE|PLUS|POINTER|PORT|POSITION|POSITIVE|PRINTER|PRINTING|PRIVATE|PROCEDURE|PROCEDURE-POINTER|PROCEDURES|PROCEED|PROCESS|PROGRAM|PROGRAM-ID|PROGRAM-LIBRARY|PROMPT|PURGE|QUEUE|QUOTE|QUOTES|RANDOM|RD|READ|READER|REAL|RECEIVE|RECEIVED|RECORD|RECORDING|RECORDS|RECURSIVE|REDEFINES|REEL|REF|REFERENCE|REFERENCES|RELATIVE|RELEASE|REMAINDER|REMARKS|REMOTE|REMOVAL|REMOVE|RENAMES|REPLACE|REPLACING|REPORT|REPORTING|REPORTS|REQUIRED|RERUN|RESERVE|RESET|RETURN|RETURN-CODE|RETURNING|REVERSE-VIDEO|REVERSED|REWIND|REWRITE|RF|RH|RIGHT|ROUNDED|RUN|SAME|SAVE|SCREEN|SD|SEARCH|SECTION|SECURE|SECURITY|SEGMENT|SEGMENT-LIMIT|SELECT|SEND|SENTENCE|SEPARATE|SEQUENCE|SEQUENTIAL|SET|SHARED|SHAREDBYALL|SHAREDBYRUNUNIT|SHARING|SHIFT-IN|SHIFT-OUT|SHORT-DATE|SIGN|SIZE|SORT|SORT-CONTROL|SORT-CORE-SIZE|SORT-FILE-SIZE|SORT-MERGE|SORT-MESSAGE|SORT-MODE-SIZE|SORT-RETURN|SOURCE|SOURCE-COMPUTER|SPACE|SPACES|SPECIAL-NAMES|STANDARD|STANDARD-1|STANDARD-2|START|STATUS|STOP|STRING|SUB-QUEUE-1|SUB-QUEUE-2|SUB-QUEUE-3|SUBTRACT|SUM|SUPPRESS|SYMBOL|SYMBOLIC|SYNC|SYNCHRONIZED|TABLE|TALLY|TALLYING|TAPE|TASK|TERMINAL|TERMINATE|TEST|TEXT|THEN|THREAD|THREAD-LOCAL|THROUGH|THRU|TIME|TIMER|TIMES|TITLE|TO|TODAYS-DATE|TODAYS-NAME|TOP|TRAILING|TRUNCATED|TYPE|TYPEDEF|UNDERLINE|UNIT|UNSTRING|UNTIL|UP|UPON|USAGE|USE|USING|VALUE|VALUES|VARYING|VIRTUAL|WAIT|WHEN|WHEN-COMPILED|WITH|WORDS|WORKING-STORAGE|WRITE|YEAR|YYYYDDD|YYYYMMDD|ZERO-FILL|ZEROES|ZEROS)(?![\w-])/i,
lookbehind: true
},
"boolean": {
pattern: /(^|[^\w-])(?:false|true)(?![\w-])/i,
lookbehind: true
},
"number": {
pattern: /(^|[^\w-])(?:[+-]?(?:(?:\d+(?:[.,]\d+)?|[.,]\d+)(?:e[+-]?\d+)?|zero))(?![\w-])/i,
lookbehind: true
},
"operator": [
/<>|[<>]=?|[=+*/&]/,
{
pattern: /(^|[^\w-])(?:-|and|equal|greater|less|not|or|than)(?![\w-])/i,
lookbehind: true
}
],
"punctuation": /[.:,()]/
};
(function(Prism2) {
var comment = /#(?!\{).+/;
var interpolation = {
pattern: /#\{[^}]+\}/,
alias: "variable"
};
Prism2.languages.coffeescript = Prism2.languages.extend("javascript", {
"comment": comment,
"string": [
{
pattern: /'(?:\\[\s\S]|[^\\'])*'/,
greedy: true
},
{
pattern: /"(?:\\[\s\S]|[^\\"])*"/,
greedy: true,
inside: {
"interpolation": interpolation
}
}
],
"keyword": /\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,
"class-member": {
pattern: /@(?!\d)\w+/,
alias: "variable"
}
});
Prism2.languages.insertBefore("coffeescript", "comment", {
"multiline-comment": {
pattern: /###[\s\S]+?###/,
alias: "comment"
},
"block-regex": {
pattern: /\/{3}[\s\S]*?\/{3}/,
alias: "regex",
inside: {
"comment": comment,
"interpolation": interpolation
}
}
});
Prism2.languages.insertBefore("coffeescript", "string", {
"inline-javascript": {
pattern: /`(?:\\[\s\S]|[^\\`])*`/,
inside: {
"delimiter": {
pattern: /^`|`$/,
alias: "punctuation"
},
"script": {
pattern: /[\s\S]+/,
alias: "language-javascript",
inside: Prism2.languages.javascript
}
}
},
"multiline-string": [
{
pattern: /'''[\s\S]*?'''/,
greedy: true,
alias: "string"
},
{
pattern: /"""[\s\S]*?"""/,
greedy: true,
alias: "string",
inside: {
interpolation
}
}
]
});
Prism2.languages.insertBefore("coffeescript", "keyword", {
"property": /(?!\d)\w+(?=\s*:(?!:))/
});
delete Prism2.languages.coffeescript["template-string"];
Prism2.languages.coffee = Prism2.languages.coffeescript;
})(Prism);
Prism.languages.concurnas = {
"comment": {
pattern: /(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\/\/.*)/,
lookbehind: true,
greedy: true
},
"langext": {
pattern: /\b\w+\s*\|\|[\s\S]+?\|\|/,
greedy: true,
inside: {
"class-name": /^\w+/,
"string": {
pattern: /(^\s*\|\|)[\s\S]+(?=\|\|$)/,
lookbehind: true
},
"punctuation": /\|\|/
}
},
"function": {
pattern: /((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/,
lookbehind: true
},
"keyword": /\b(?:abstract|actor|also|annotation|assert|async|await|bool|boolean|break|byte|case|catch|changed|char|class|closed|constant|continue|def|default|del|double|elif|else|enum|every|extends|false|finally|float|for|from|global|gpudef|gpukernel|if|import|in|init|inject|int|lambda|local|long|loop|match|new|nodefault|null|of|onchange|open|out|override|package|parfor|parforsync|post|pre|private|protected|provide|provider|public|return|shared|short|single|size_t|sizeof|super|sync|this|throw|trait|trans|transient|true|try|typedef|unchecked|using|val|var|void|while|with)\b/,
"boolean": /\b(?:false|true)\b/,
"number": /\b0b[01][01_]*L?\b|\b0x(?:[\da-f_]*\.)?[\da-f_p+-]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfls]?/i,
"punctuation": /[{}[\];(),.:]/,
"operator": /<==|>==|=>|->|<-|<>|&==|&<>|\?:?|\.\?|\+\+|--|[-+*/=<>]=?|[!^~]|\b(?:and|as|band|bor|bxor|comp|is|isnot|mod|or)\b=?/,
"annotation": {
pattern: /@(?:\w+:)?(?:\w+|\[[^\]]+\])?/,
alias: "builtin"
}
};
Prism.languages.insertBefore("concurnas", "langext", {
"regex-literal": {
pattern: /\br("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true,
inside: {
"interpolation": {
pattern: /((?:^|[^\\])(?:\\{2})*)\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,
lookbehind: true,
inside: Prism.languages.concurnas
},
"regex": /[\s\S]+/
}
},
"string-literal": {
pattern: /(?:\B|\bs)("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true,
inside: {
"interpolation": {
pattern: /((?:^|[^\\])(?:\\{2})*)\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,
lookbehind: true,
inside: Prism.languages.concurnas
},
"string": /[\s\S]+/
}
}
});
Prism.languages.conc = Prism.languages.concurnas;
(function(Prism2) {
function value(source) {
return RegExp(/([ \t])/.source + "(?:" + source + ")" + /(?=[\s;]|$)/.source, "i");
}
Prism2.languages.csp = {
"directive": {
pattern: /(^|[\s;])(?:base-uri|block-all-mixed-content|(?:child|connect|default|font|frame|img|manifest|media|object|prefetch|script|style|worker)-src|disown-opener|form-action|frame-(?:ancestors|options)|input-protection(?:-(?:clip|selectors))?|navigate-to|plugin-types|policy-uri|referrer|reflected-xss|report-(?:to|uri)|require-sri-for|sandbox|(?:script|style)-src-(?:attr|elem)|upgrade-insecure-requests)(?=[\s;]|$)/i,
lookbehind: true,
alias: "property"
},
"scheme": {
pattern: value(/[a-z][a-z0-9.+-]*:/.source),
lookbehind: true
},
"none": {
pattern: value(/'none'/.source),
lookbehind: true,
alias: "keyword"
},
"nonce": {
pattern: value(/'nonce-[-+/\w=]+'/.source),
lookbehind: true,
alias: "number"
},
"hash": {
pattern: value(/'sha(?:256|384|512)-[-+/\w=]+'/.source),
lookbehind: true,
alias: "number"
},
"host": {
pattern: value(/[a-z][a-z0-9.+-]*:\/\/[^\s;,']*/.source + "|" + /\*[^\s;,']*/.source + "|" + /[a-z0-9-]+(?:\.[a-z0-9-]+)+(?::[\d*]+)?(?:\/[^\s;,']*)?/.source),
lookbehind: true,
alias: "url",
inside: {
"important": /\*/
}
},
"keyword": [
{
pattern: value(/'unsafe-[a-z-]+'/.source),
lookbehind: true,
alias: "unsafe"
},
{
pattern: value(/'[a-z-]+'/.source),
lookbehind: true,
alias: "safe"
}
],
"punctuation": /;/
};
})(Prism);
(function(Prism2) {
var single_token_suffix = /(?:(?!\s)[\d$+<=a-zA-Z\x80-\uFFFF])+/.source;
var multi_token_infix = /[^{}@#]+/.source;
var multi_token_suffix = /\{[^}#@]*\}/.source;
var multi_token = multi_token_infix + multi_token_suffix;
var timer_units = /(?:h|hours|hrs|m|min|minutes)/.source;
var amount_group_impl = {
pattern: /\{[^{}]*\}/,
inside: {
"amount": {
pattern: /([\{|])[^{}|*%]+/,
lookbehind: true,
alias: "number"
},
"unit": {
pattern: /(%)[^}]+/,
lookbehind: true,
alias: "symbol"
},
"servings-scaler": {
pattern: /\*/,
alias: "operator"
},
"servings-alternative-separator": {
pattern: /\|/,
alias: "operator"
},
"unit-separator": {
pattern: /(?:%|(\*)%)/,
lookbehind: true,
alias: "operator"
},
"punctuation": /[{}]/
}
};
Prism2.languages.cooklang = {
"comment": {
pattern: /\[-[\s\S]*?-\]|--.*/,
greedy: true
},
"meta": {
pattern: />>.*:.*/,
inside: {
"property": {
pattern: /(>>\s*)[^\s:](?:[^:]*[^\s:])?/,
lookbehind: true
}
}
},
"cookware-group": {
pattern: new RegExp("#(?:" + multi_token + "|" + single_token_suffix + ")"),
inside: {
"cookware": {
pattern: new RegExp("(^#)(?:" + multi_token_infix + ")"),
lookbehind: true,
alias: "variable"
},
"cookware-keyword": {
pattern: /^#/,
alias: "keyword"
},
"quantity-group": {
pattern: new RegExp(/\{[^{}@#]*\}/),
inside: {
"quantity": {
pattern: new RegExp(/(^\{)/.source + multi_token_infix),
lookbehind: true,
alias: "number"
},
"punctuation": /[{}]/
}
}
}
},
"ingredient-group": {
pattern: new RegExp("@(?:" + multi_token + "|" + single_token_suffix + ")"),
inside: {
"ingredient": {
pattern: new RegExp("(^@)(?:" + multi_token_infix + ")"),
lookbehind: true,
alias: "variable"
},
"ingredient-keyword": {
pattern: /^@/,
alias: "keyword"
},
"amount-group": amount_group_impl
}
},
"timer-group": {
pattern: /~(?!\s)[^@#~{}]*\{[^{}]*\}/,
inside: {
"timer": {
pattern: /(^~)[^{]+/,
lookbehind: true,
alias: "variable"
},
"duration-group": {
pattern: /\{[^{}]*\}/,
inside: {
"punctuation": /[{}]/,
"unit": {
pattern: new RegExp(/(%\s*)/.source + timer_units + /\b/.source),
lookbehind: true,
alias: "symbol"
},
"operator": /%/,
"duration": {
pattern: /\d+/,
alias: "number"
}
}
},
"timer-keyword": {
pattern: /^~/,
alias: "keyword"
}
}
}
};
})(Prism);
(function(Prism2) {
var commentSource = /\(\*(?:[^(*]|\((?!\*)|\*(?!\))|<self>)*\*\)/.source;
for (var i = 0; i < 2; i++) {
commentSource = commentSource.replace(/<self>/g, function() {
return commentSource;
});
}
commentSource = commentSource.replace(/<self>/g, "[]");
Prism2.languages.coq = {
"comment": RegExp(commentSource),
"string": {
pattern: /"(?:[^"]|"")*"(?!")/,
greedy: true
},
"attribute": [
{
pattern: RegExp(/#\[(?:[^\[\]("]|"(?:[^"]|"")*"(?!")|\((?!\*)|<comment>)*\]/.source.replace(/<comment>/g, function() {
return commentSource;
})),
greedy: true,
alias: "attr-name",
inside: {
"comment": RegExp(commentSource),
"string": {
pattern: /"(?:[^"]|"")*"(?!")/,
greedy: true
},
"operator": /=/,
"punctuation": /^#\[|\]$|[,()]/
}
},
{
pattern: /\b(?:Cumulative|Global|Local|Monomorphic|NonCumulative|Polymorphic|Private|Program)\b/,
alias: "attr-name"
}
],
"keyword": /\b(?:Abort|About|Add|Admit|Admitted|All|Arguments|As|Assumptions|Axiom|Axioms|Back|BackTo|Backtrace|BinOp|BinOpSpec|BinRel|Bind|Blacklist|Canonical|Case|Cd|Check|Class|Classes|Close|CoFixpoint|CoInductive|Coercion|Coercions|Collection|Combined|Compute|Conjecture|Conjectures|Constant|Constants|Constraint|Constructors|Context|Corollary|Create|CstOp|Custom|Cut|Debug|Declare|Defined|Definition|Delimit|Dependencies|Dependent|Derive|Diffs|Drop|Elimination|End|Entry|Equality|Eval|Example|Existential|Existentials|Existing|Export|Extern|Extraction|Fact|Fail|Field|File|Firstorder|Fixpoint|Flags|Focus|From|Funclass|Function|Functional|GC|Generalizable|Goal|Grab|Grammar|Graph|Guarded|Haskell|Heap|Hide|Hint|HintDb|Hints|Hypotheses|Hypothesis|IF|Identity|Immediate|Implicit|Implicits|Import|Include|Induction|Inductive|Infix|Info|Initial|InjTyp|Inline|Inspect|Instance|Instances|Intro|Intros|Inversion|Inversion_clear|JSON|Language|Left|Lemma|Let|Lia|Libraries|Library|Load|LoadPath|Locate|Ltac|Ltac2|ML|Match|Method|Minimality|Module|Modules|Morphism|Next|NoInline|Notation|Number|OCaml|Obligation|Obligations|Opaque|Open|Optimize|Parameter|Parameters|Parametric|Path|Paths|Prenex|Preterm|Primitive|Print|Profile|Projections|Proof|Prop|PropBinOp|PropOp|PropUOp|Property|Proposition|Pwd|Qed|Quit|Rec|Record|Recursive|Redirect|Reduction|Register|Relation|Remark|Remove|Require|Reserved|Reset|Resolve|Restart|Rewrite|Right|Ring|Rings|SProp|Saturate|Save|Scheme|Scope|Scopes|Search|SearchHead|SearchPattern|SearchRewrite|Section|Separate|Set|Setoid|Show|Signatures|Solve|Solver|Sort|Sortclass|Sorted|Spec|Step|Strategies|Strategy|String|Structure|SubClass|Subgraph|SuchThat|Tactic|Term|TestCompile|Theorem|Time|Timeout|To|Transparent|Type|Typeclasses|Types|Typing|UnOp|UnOpSpec|Undelimit|Undo|Unfocus|Unfocused|Unfold|Universe|Universes|Unshelve|Variable|Variables|Variant|Verbose|View|Visibility|Zify|_|apply|as|at|by|cofix|else|end|exists|exists2|fix|for|forall|fun|if|in|let|match|measure|move|removed|return|struct|then|using|wf|where|with)\b/,
"number": /\b(?:0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]+)?(?:p[+-]?\d[\d_]*)?|\d[\d_]*(?:\.[\d_]+)?(?:e[+-]?\d[\d_]*)?)\b/i,
"punct": {
pattern: /@\{|\{\||\[=|:>/,
alias: "punctuation"
},
"operator": /\/\\|\\\/|\.{2,3}|:{1,2}=|\*\*|[-=]>|<(?:->?|[+:=>]|<:)|>(?:=|->)|\|[-|]?|[-!%&*+/<=>?@^~']/,
"punctuation": /\.\(|`\(|@\{|`\{|\{\||\[=|:>|[:.,;(){}\[\]]/
};
})(Prism);
(function(Prism2) {
Prism2.languages.ruby = Prism2.languages.extend("clike", {
"comment": {
pattern: /#.*|^=begin\s[\s\S]*?^=end/m,
greedy: true
},
"class-name": {
pattern: /(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,
lookbehind: true,
inside: {
"punctuation": /[.\\]/
}
},
"keyword": /\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,
"operator": /\.{2,3}|&\.|===|<?=>|[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,
"punctuation": /[(){}[\].,;]/
});
Prism2.languages.insertBefore("ruby", "operator", {
"double-colon": {
pattern: /::/,
alias: "punctuation"
}
});
var interpolation = {
pattern: /((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,
lookbehind: true,
inside: {
"content": {
pattern: /^(#\{)[\s\S]+(?=\}$)/,
lookbehind: true,
inside: Prism2.languages.ruby
},
"delimiter": {
pattern: /^#\{|\}$/,
alias: "punctuation"
}
}
};
delete Prism2.languages.ruby.function;
var percentExpression = "(?:" + [
/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,
/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,
/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,
/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,
/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source
].join("|") + ")";
var symbolName = /(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;
Prism2.languages.insertBefore("ruby", "keyword", {
"regex-literal": [
{
pattern: RegExp(/%r/.source + percentExpression + /[egimnosux]{0,6}/.source),
greedy: true,
inside: {
"interpolation": interpolation,
"regex": /[\s\S]+/
}
},
{
pattern: /(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,
lookbehind: true,
greedy: true,
inside: {
"interpolation": interpolation,
"regex": /[\s\S]+/
}
}
],
"variable": /[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,
"symbol": [
{
pattern: RegExp(/(^|[^:]):/.source + symbolName),
lookbehind: true,
greedy: true
},
{
pattern: RegExp(/([\r\n{(,][ \t]*)/.source + symbolName + /(?=:(?!:))/.source),
lookbehind: true,
greedy: true
}
],
"method-definition": {
pattern: /(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,
lookbehind: true,
inside: {
"function": /\b\w+$/,
"keyword": /^self\b/,
"class-name": /^\w+/,
"punctuation": /\./
}
}
});
Prism2.languages.insertBefore("ruby", "string", {
"string-literal": [
{
pattern: RegExp(/%[qQiIwWs]?/.source + percentExpression),
greedy: true,
inside: {
"interpolation": interpolation,
"string": /[\s\S]+/
}
},
{
pattern: /("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,
greedy: true,
inside: {
"interpolation": interpolation,
"string": /[\s\S]+/
}
},
{
pattern: /<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,
alias: "heredoc-string",
greedy: true,
inside: {
"delimiter": {
pattern: /^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,
inside: {
"symbol": /\b\w+/,
"punctuation": /^<<[-~]?/
}
},
"interpolation": interpolation,
"string": /[\s\S]+/
}
},
{
pattern: /<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,
alias: "heredoc-string",
greedy: true,
inside: {
"delimiter": {
pattern: /^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,
inside: {
"symbol": /\b\w+/,
"punctuation": /^<<[-~]?'|'$/
}
},
"string": /[\s\S]+/
}
}
],
"command-literal": [
{
pattern: RegExp(/%x/.source + percentExpression),
greedy: true,
inside: {
"interpolation": interpolation,
"command": {
pattern: /[\s\S]+/,
alias: "string"
}
}
},
{
pattern: /`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,
greedy: true,
inside: {
"interpolation": interpolation,
"command": {
pattern: /[\s\S]+/,
alias: "string"
}
}
}
]
});
delete Prism2.languages.ruby.string;
Prism2.languages.insertBefore("ruby", "number", {
"builtin": /\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,
"constant": /\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/
});
Prism2.languages.rb = Prism2.languages.ruby;
})(Prism);
(function(Prism2) {
Prism2.languages.crystal = Prism2.languages.extend("ruby", {
"keyword": [
/\b(?:__DIR__|__END_LINE__|__FILE__|__LINE__|abstract|alias|annotation|as|asm|begin|break|case|class|def|do|else|elsif|end|ensure|enum|extend|for|fun|if|ifdef|include|instance_sizeof|lib|macro|module|next|of|out|pointerof|private|protected|ptr|require|rescue|return|select|self|sizeof|struct|super|then|type|typeof|undef|uninitialized|union|unless|until|when|while|with|yield)\b/,
{
pattern: /(\.\s*)(?:is_a|responds_to)\?/,
lookbehind: true
}
],
"number": /\b(?:0b[01_]*[01]|0o[0-7_]*[0-7]|0x[\da-fA-F_]*[\da-fA-F]|(?:\d(?:[\d_]*\d)?)(?:\.[\d_]*\d)?(?:[eE][+-]?[\d_]*\d)?)(?:_(?:[uif](?:8|16|32|64))?)?\b/,
"operator": [
/->/,
Prism2.languages.ruby.operator
],
"punctuation": /[(){}[\].,;\\]/
});
Prism2.languages.insertBefore("crystal", "string-literal", {
"attribute": {
pattern: /@\[.*?\]/,
inside: {
"delimiter": {
pattern: /^@\[|\]$/,
alias: "punctuation"
},
"attribute": {
pattern: /^(\s*)\w+/,
lookbehind: true,
alias: "class-name"
},
"args": {
pattern: /\S(?:[\s\S]*\S)?/,
inside: Prism2.languages.crystal
}
}
},
"expansion": {
pattern: /\{(?:\{.*?\}|%.*?%)\}/,
inside: {
"content": {
pattern: /^(\{.)[\s\S]+(?=.\}$)/,
lookbehind: true,
inside: Prism2.languages.crystal
},
"delimiter": {
pattern: /^\{[\{%]|[\}%]\}$/,
alias: "operator"
}
}
},
"char": {
pattern: /'(?:[^\\\r\n]{1,2}|\\(?:.|u(?:[A-Fa-f0-9]{1,4}|\{[A-Fa-f0-9]{1,6}\})))'/,
greedy: true
}
});
})(Prism);
(function(Prism2) {
var string = /("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;
var selectorInside;
Prism2.languages.css.selector = {
pattern: Prism2.languages.css.selector.pattern,
lookbehind: true,
inside: selectorInside = {
"pseudo-element": /:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,
"pseudo-class": /:[-\w]+/,
"class": /\.[-\w]+/,
"id": /#[-\w]+/,
"attribute": {
pattern: RegExp(`\\[(?:[^[\\]"']|` + string.source + ")*\\]"),
greedy: true,
inside: {
"punctuation": /^\[|\]$/,
"case-sensitivity": {
pattern: /(\s)[si]$/i,
lookbehind: true,
alias: "keyword"
},
"namespace": {
pattern: /^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,
lookbehind: true,
inside: {
"punctuation": /\|$/
}
},
"attr-name": {
pattern: /^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,
lookbehind: true
},
"attr-value": [
string,
{
pattern: /(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,
lookbehind: true
}
],
"operator": /[|~*^$]?=/
}
},
"n-th": [
{
pattern: /(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,
lookbehind: true,
inside: {
"number": /[\dn]+/,
"operator": /[+-]/
}
},
{
pattern: /(\(\s*)(?:even|odd)(?=\s*\))/i,
lookbehind: true
}
],
"combinator": />|\+|~|\|\|/,
"punctuation": /[(),]/
}
};
Prism2.languages.css["atrule"].inside["selector-function-argument"].inside = selectorInside;
Prism2.languages.insertBefore("css", "property", {
"variable": {
pattern: /(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,
lookbehind: true
}
});
var unit = {
pattern: /(\b\d+)(?:%|[a-z]+(?![\w-]))/,
lookbehind: true
};
var number = {
pattern: /(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,
lookbehind: true
};
Prism2.languages.insertBefore("css", "function", {
"operator": {
pattern: /(\s)[+\-*\/](?=\s)/,
lookbehind: true
},
"hexcode": {
pattern: /\B#[\da-f]{3,8}\b/i,
alias: "color"
},
"color": [
{
pattern: /(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,
lookbehind: true
},
{
pattern: /\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,
inside: {
"unit": unit,
"number": number,
"function": /[\w-]+(?=\()/,
"punctuation": /[(),]/
}
}
],
"entity": /\\[\da-f]{1,8}/i,
"unit": unit,
"number": number
});
})(Prism);
Prism.languages.csv = {
"value": /[^\r\n,"]+|"(?:[^"]|"")*"(?!")/,
"punctuation": /,/
};
(function(Prism2) {
var stringEscape = /\\(?:(?!\2)|\2(?:[^()\r\n]|\([^()]*\)))/.source;
var stringTypes = /"""(?:[^\\"]|"(?!""\2)|<esc>)*"""/.source + "|" + /'''(?:[^\\']|'(?!''\2)|<esc>)*'''/.source + "|" + /"(?:[^\\\r\n"]|"(?!\2)|<esc>)*"/.source + "|" + /'(?:[^\\\r\n']|'(?!\2)|<esc>)*'/.source;
var stringLiteral = "(?:" + stringTypes.replace(/<esc>/g, stringEscape) + ")";
Prism2.languages.cue = {
"comment": {
pattern: /\/\/.*/,
greedy: true
},
"string-literal": {
pattern: RegExp(/(^|[^#"'\\])(#*)/.source + stringLiteral + /(?!["'])\2/.source),
lookbehind: true,
greedy: true,
inside: {
"escape": {
pattern: /(?=[\s\S]*["'](#*)$)\\\1(?:U[a-fA-F0-9]{1,8}|u[a-fA-F0-9]{1,4}|x[a-fA-F0-9]{1,2}|\d{2,3}|[^(])/,
greedy: true,
alias: "string"
},
"interpolation": {
pattern: /(?=[\s\S]*["'](#*)$)\\\1\([^()]*\)/,
greedy: true,
inside: {
"punctuation": /^\\#*\(|\)$/,
"expression": {
pattern: /[\s\S]+/,
inside: null
}
}
},
"string": /[\s\S]+/
}
},
"keyword": {
pattern: /(^|[^\w$])(?:for|if|import|in|let|null|package)(?![\w$])/,
lookbehind: true
},
"boolean": {
pattern: /(^|[^\w$])(?:false|true)(?![\w$])/,
lookbehind: true
},
"builtin": {
pattern: /(^|[^\w$])(?:bool|bytes|float|float(?:32|64)|u?int(?:8|16|32|64|128)?|number|rune|string)(?![\w$])/,
lookbehind: true
},
"attribute": {
pattern: /@[\w$]+(?=\s*\()/,
alias: "function"
},
"function": {
pattern: /(^|[^\w$])[a-z_$][\w$]*(?=\s*\()/i,
lookbehind: true
},
"number": {
pattern: /(^|[^\w$.])(?:0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|0[xX][0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*|(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[eE][+-]?\d+(?:_\d+)*)?(?:[KMGTP]i?)?)(?![\w$])/,
lookbehind: true
},
"operator": /\.{3}|_\|_|&&?|\|\|?|[=!]~|[<>=!]=?|[+\-*/?]/,
"punctuation": /[()[\]{},.:]/
};
Prism2.languages.cue["string-literal"].inside.interpolation.inside.expression.inside = Prism2.languages.cue;
})(Prism);
Prism.languages.cypher = {
"comment": /\/\/.*/,
"string": {
pattern: /"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/,
greedy: true
},
"class-name": {
pattern: /(:\s*)(?:\w+|`(?:[^`\\\r\n])*`)(?=\s*[{):])/,
lookbehind: true,
greedy: true
},
"relationship": {
pattern: /(-\[\s*(?:\w+\s*|`(?:[^`\\\r\n])*`\s*)?:\s*|\|\s*:\s*)(?:\w+|`(?:[^`\\\r\n])*`)/,
lookbehind: true,
greedy: true,
alias: "property"
},
"identifier": {
pattern: /`(?:[^`\\\r\n])*`/,
greedy: true
},
"variable": /\$\w+/,
"keyword": /\b(?:ADD|ALL|AND|AS|ASC|ASCENDING|ASSERT|BY|CALL|CASE|COMMIT|CONSTRAINT|CONTAINS|CREATE|CSV|DELETE|DESC|DESCENDING|DETACH|DISTINCT|DO|DROP|ELSE|END|ENDS|EXISTS|FOR|FOREACH|IN|INDEX|IS|JOIN|KEY|LIMIT|LOAD|MANDATORY|MATCH|MERGE|NODE|NOT|OF|ON|OPTIONAL|OR|ORDER(?=\s+BY)|PERIODIC|REMOVE|REQUIRE|RETURN|SCALAR|SCAN|SET|SKIP|START|STARTS|THEN|UNION|UNIQUE|UNWIND|USING|WHEN|WHERE|WITH|XOR|YIELD)\b/i,
"function": /\b\w+\b(?=\s*\()/,
"boolean": /\b(?:false|null|true)\b/i,
"number": /\b(?:0x[\da-fA-F]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)\b/,
"operator": /:|<--?|--?>?|<>|=~?|[<>]=?|[+*/%^|]|\.\.\.?/,
"punctuation": /[()[\]{},;.]/
};
Prism.languages.d = Prism.languages.extend("clike", {
"comment": [
{
pattern: /^\s*#!.+/,
greedy: true
},
{
pattern: RegExp(/(^|[^\\])/.source + "(?:" + [
/\/\+(?:\/\+(?:[^+]|\+(?!\/))*\+\/|(?!\/\+)[\s\S])*?\+\//.source,
/\/\/.*/.source,
/\/\*[\s\S]*?\*\//.source
].join("|") + ")"),
lookbehind: true,
greedy: true
}
],
"string": [
{
pattern: RegExp([
/\b[rx]"(?:\\[\s\S]|[^\\"])*"[cwd]?/.source,
/\bq"(?:\[[\s\S]*?\]|\([\s\S]*?\)|<[\s\S]*?>|\{[\s\S]*?\})"/.source,
/\bq"((?!\d)\w+)$[\s\S]*?^\1"/.source,
/\bq"(.)[\s\S]*?\2"/.source,
/(["`])(?:\\[\s\S]|(?!\3)[^\\])*\3[cwd]?/.source
].join("|"), "m"),
greedy: true
},
{
pattern: /\bq\{(?:\{[^{}]*\}|[^{}])*\}/,
greedy: true,
alias: "token-string"
}
],
"keyword": /\$|\b(?:__(?:(?:DATE|EOF|FILE|FUNCTION|LINE|MODULE|PRETTY_FUNCTION|TIMESTAMP|TIME|VENDOR|VERSION)__|gshared|parameters|traits|vector)|abstract|alias|align|asm|assert|auto|body|bool|break|byte|case|cast|catch|cdouble|cent|cfloat|char|class|const|continue|creal|dchar|debug|default|delegate|delete|deprecated|do|double|dstring|else|enum|export|extern|false|final|finally|float|for|foreach|foreach_reverse|function|goto|idouble|if|ifloat|immutable|import|inout|int|interface|invariant|ireal|lazy|long|macro|mixin|module|new|nothrow|null|out|override|package|pragma|private|protected|ptrdiff_t|public|pure|real|ref|return|scope|shared|short|size_t|static|string|struct|super|switch|synchronized|template|this|throw|true|try|typedef|typeid|typeof|ubyte|ucent|uint|ulong|union|unittest|ushort|version|void|volatile|wchar|while|with|wstring)\b/,
"number": [
/\b0x\.?[a-f\d_]+(?:(?!\.\.)\.[a-f\d_]*)?(?:p[+-]?[a-f\d_]+)?[ulfi]{0,4}/i,
{
pattern: /((?:\.\.)?)(?:\b0b\.?|\b|\.)\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:e[+-]?\d[\d_]*)?[ulfi]{0,4}/i,
lookbehind: true
}
],
"operator": /\|[|=]?|&[&=]?|\+[+=]?|-[-=]?|\.?\.\.|=[>=]?|!(?:i[ns]\b|<>?=?|>=?|=)?|\bi[ns]\b|(?:<[<>]?|>>?>?|\^\^|[*\/%^~])=?/
});
Prism.languages.insertBefore("d", "string", {
"char": /'(?:\\(?:\W|\w+)|[^\\])'/
});
Prism.languages.insertBefore("d", "keyword", {
"property": /\B@\w*/
});
Prism.languages.insertBefore("d", "function", {
"register": {
pattern: /\b(?:[ABCD][LHX]|E?(?:BP|DI|SI|SP)|[BS]PL|[ECSDGF]S|CR[0234]|[DS]IL|DR[012367]|E[ABCD]X|X?MM[0-7]|R(?:1[0-5]|[89])[BWD]?|R[ABCD]X|R[BS]P|R[DS]I|TR[3-7]|XMM(?:1[0-5]|[89])|YMM(?:1[0-5]|\d))\b|\bST(?:\([0-7]\)|\b)/,
alias: "variable"
}
});
(function(Prism2) {
var keywords = [
/\b(?:async|sync|yield)\*/,
/\b(?:abstract|assert|async|await|break|case|catch|class|const|continue|covariant|default|deferred|do|dynamic|else|enum|export|extends|extension|external|factory|final|finally|for|get|hide|if|implements|import|in|interface|library|mixin|new|null|on|operator|part|rethrow|return|set|show|static|super|switch|sync|this|throw|try|typedef|var|void|while|with|yield)\b/
];
var packagePrefix = /(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source;
var className = {
pattern: RegExp(packagePrefix + /[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),
lookbehind: true,
inside: {
"namespace": {
pattern: /^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,
inside: {
"punctuation": /\./
}
}
}
};
Prism2.languages.dart = Prism2.languages.extend("clike", {
"class-name": [
className,
{
pattern: RegExp(packagePrefix + /[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),
lookbehind: true,
inside: className.inside
}
],
"keyword": keywords,
"operator": /\bis!|\b(?:as|is)\b|\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?/
});
Prism2.languages.insertBefore("dart", "string", {
"string-literal": {
pattern: /r?(?:("""|''')[\s\S]*?\1|(["'])(?:\\.|(?!\2)[^\\\r\n])*\2(?!\2))/,
greedy: true,
inside: {
"interpolation": {
pattern: /((?:^|[^\\])(?:\\{2})*)\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,
lookbehind: true,
inside: {
"punctuation": /^\$\{?|\}$/,
"expression": {
pattern: /[\s\S]+/,
inside: Prism2.languages.dart
}
}
},
"string": /[\s\S]+/
}
},
"string": void 0
});
Prism2.languages.insertBefore("dart", "class-name", {
"metadata": {
pattern: /@\w+/,
alias: "function"
}
});
Prism2.languages.insertBefore("dart", "class-name", {
"generics": {
pattern: /<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,
inside: {
"class-name": className,
"keyword": keywords,
"punctuation": /[<>(),.:]/,
"operator": /[?&|]/
}
}
});
})(Prism);
(function(Prism2) {
Prism2.languages.dataweave = {
"url": /\b[A-Za-z]+:\/\/[\w/:.?=&-]+|\burn:[\w:.?=&-]+/,
"property": {
pattern: /(?:\b\w+#)?(?:"(?:\\.|[^\\"\r\n])*"|\b\w+)(?=\s*[:@])/,
greedy: true
},
"string": {
pattern: /(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,
greedy: true
},
"mime-type": /\b(?:application|audio|image|multipart|text|video)\/[\w+-]+/,
"date": {
pattern: /\|[\w:+-]+\|/,
greedy: true
},
"comment": [
{
pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
lookbehind: true,
greedy: true
},
{
pattern: /(^|[^\\:])\/\/.*/,
lookbehind: true,
greedy: true
}
],
"regex": {
pattern: /\/(?:[^\\\/\r\n]|\\[^\r\n])+\//,
greedy: true
},
"keyword": /\b(?:and|as|at|case|do|else|fun|if|input|is|match|not|ns|null|or|output|type|unless|update|using|var)\b/,
"function": /\b[A-Z_]\w*(?=\s*\()/i,
"number": /-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,
"punctuation": /[{}[\];(),.:@]/,
"operator": /<<|>>|->|[<>~=]=?|!=|--?-?|\+\+?|!|\?/,
"boolean": /\b(?:false|true)\b/
};
})(Prism);
Prism.languages.dax = {
"comment": {
pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/).*)/,
lookbehind: true
},
"data-field": {
pattern: /'(?:[^']|'')*'(?!')(?:\[[ \w\xA0-\uFFFF]+\])?|\w+\[[ \w\xA0-\uFFFF]+\]/,
alias: "symbol"
},
"measure": {
pattern: /\[[ \w\xA0-\uFFFF]+\]/,
alias: "constant"
},
"string": {
pattern: /"(?:[^"]|"")*"(?!")/,
greedy: true
},
"function": /\b(?:ABS|ACOS|ACOSH|ACOT|ACOTH|ADDCOLUMNS|ADDMISSINGITEMS|ALL|ALLCROSSFILTERED|ALLEXCEPT|ALLNOBLANKROW|ALLSELECTED|AND|APPROXIMATEDISTINCTCOUNT|ASIN|ASINH|ATAN|ATANH|AVERAGE|AVERAGEA|AVERAGEX|BETA\.DIST|BETA\.INV|BLANK|CALCULATE|CALCULATETABLE|CALENDAR|CALENDARAUTO|CEILING|CHISQ\.DIST|CHISQ\.DIST\.RT|CHISQ\.INV|CHISQ\.INV\.RT|CLOSINGBALANCEMONTH|CLOSINGBALANCEQUARTER|CLOSINGBALANCEYEAR|COALESCE|COMBIN|COMBINA|COMBINEVALUES|CONCATENATE|CONCATENATEX|CONFIDENCE\.NORM|CONFIDENCE\.T|CONTAINS|CONTAINSROW|CONTAINSSTRING|CONTAINSSTRINGEXACT|CONVERT|COS|COSH|COT|COTH|COUNT|COUNTA|COUNTAX|COUNTBLANK|COUNTROWS|COUNTX|CROSSFILTER|CROSSJOIN|CURRENCY|CURRENTGROUP|CUSTOMDATA|DATATABLE|DATE|DATEADD|DATEDIFF|DATESBETWEEN|DATESINPERIOD|DATESMTD|DATESQTD|DATESYTD|DATEVALUE|DAY|DEGREES|DETAILROWS|DISTINCT|DISTINCTCOUNT|DISTINCTCOUNTNOBLANK|DIVIDE|EARLIER|EARLIEST|EDATE|ENDOFMONTH|ENDOFQUARTER|ENDOFYEAR|EOMONTH|ERROR|EVEN|EXACT|EXCEPT|EXP|EXPON\.DIST|FACT|FALSE|FILTER|FILTERS|FIND|FIRSTDATE|FIRSTNONBLANK|FIRSTNONBLANKVALUE|FIXED|FLOOR|FORMAT|GCD|GENERATE|GENERATEALL|GENERATESERIES|GEOMEAN|GEOMEANX|GROUPBY|HASONEFILTER|HASONEVALUE|HOUR|IF|IF\.EAGER|IFERROR|IGNORE|INT|INTERSECT|ISBLANK|ISCROSSFILTERED|ISEMPTY|ISERROR|ISEVEN|ISFILTERED|ISINSCOPE|ISLOGICAL|ISNONTEXT|ISNUMBER|ISO\.CEILING|ISODD|ISONORAFTER|ISSELECTEDMEASURE|ISSUBTOTAL|ISTEXT|KEEPFILTERS|KEYWORDMATCH|LASTDATE|LASTNONBLANK|LASTNONBLANKVALUE|LCM|LEFT|LEN|LN|LOG|LOG10|LOOKUPVALUE|LOWER|MAX|MAXA|MAXX|MEDIAN|MEDIANX|MID|MIN|MINA|MINUTE|MINX|MOD|MONTH|MROUND|NATURALINNERJOIN|NATURALLEFTOUTERJOIN|NEXTDAY|NEXTMONTH|NEXTQUARTER|NEXTYEAR|NONVISUAL|NORM\.DIST|NORM\.INV|NORM\.S\.DIST|NORM\.S\.INV|NOT|NOW|ODD|OPENINGBALANCEMONTH|OPENINGBALANCEQUARTER|OPENINGBALANCEYEAR|OR|PARALLELPERIOD|PATH|PATHCONTAINS|PATHITEM|PATHITEMREVERSE|PATHLENGTH|PERCENTILE\.EXC|PERCENTILE\.INC|PERCENTILEX\.EXC|PERCENTILEX\.INC|PERMUT|PI|POISSON\.DIST|POWER|PREVIOUSDAY|PREVIOUSMONTH|PREVIOUSQUARTER|PREVIOUSYEAR|PRODUCT|PRODUCTX|QUARTER|QUOTIENT|RADIANS|RAND|RANDBETWEEN|RANK\.EQ|RANKX|RELATED|RELATEDTABLE|REMOVEFILTERS|REPLACE|REPT|RIGHT|ROLLUP|ROLLUPADDISSUBTOTAL|ROLLUPGROUP|ROLLUPISSUBTOTAL|ROUND|ROUNDDOWN|ROUNDUP|ROW|SAMEPERIODLASTYEAR|SAMPLE|SEARCH|SECOND|SELECTCOLUMNS|SELECTEDMEASURE|SELECTEDMEASUREFORMATSTRING|SELECTEDMEASURENAME|SELECTEDVALUE|SIGN|SIN|SINH|SQRT|SQRTPI|STARTOFMONTH|STARTOFQUARTER|STARTOFYEAR|STDEV\.P|STDEV\.S|STDEVX\.P|STDEVX\.S|SUBSTITUTE|SUBSTITUTEWITHINDEX|SUM|SUMMARIZE|SUMMARIZECOLUMNS|SUMX|SWITCH|T\.DIST|T\.DIST\.2T|T\.DIST\.RT|T\.INV|T\.INV\.2T|TAN|TANH|TIME|TIMEVALUE|TODAY|TOPN|TOPNPERLEVEL|TOPNSKIP|TOTALMTD|TOTALQTD|TOTALYTD|TREATAS|TRIM|TRUE|TRUNC|UNICHAR|UNICODE|UNION|UPPER|USERELATIONSHIP|USERNAME|USEROBJECTID|USERPRINCIPALNAME|UTCNOW|UTCTODAY|VALUE|VALUES|VAR\.P|VAR\.S|VARX\.P|VARX\.S|WEEKDAY|WEEKNUM|XIRR|XNPV|YEAR|YEARFRAC)(?=\s*\()/i,
"keyword": /\b(?:DEFINE|EVALUATE|MEASURE|ORDER\s+BY|RETURN|VAR|START\s+AT|ASC|DESC)\b/i,
"boolean": {
pattern: /\b(?:FALSE|NULL|TRUE)\b/i,
alias: "constant"
},
"number": /\b\d+(?:\.\d*)?|\B\.\d+\b/,
"operator": /:=|[-+*\/=^]|&&?|\|\||<(?:=>?|<|>)?|>[>=]?|\b(?:IN|NOT)\b/i,
"punctuation": /[;\[\](){}`,.]/
};
Prism.languages.dhall = {
"comment": /--.*|\{-(?:[^-{]|-(?!\})|\{(?!-)|\{-(?:[^-{]|-(?!\})|\{(?!-))*-\})*-\}/,
"string": {
pattern: /"(?:[^"\\]|\\.)*"|''(?:[^']|'(?!')|'''|''\$\{)*''(?!'|\$)/,
greedy: true,
inside: {
"interpolation": {
pattern: /\$\{[^{}]*\}/,
inside: {
"expression": {
pattern: /(^\$\{)[\s\S]+(?=\}$)/,
lookbehind: true,
alias: "language-dhall",
inside: null
},
"punctuation": /\$\{|\}/
}
}
}
},
"label": {
pattern: /`[^`]*`/,
greedy: true
},
"url": {
pattern: /\bhttps?:\/\/[\w.:%!$&'*+;=@~-]+(?:\/[\w.:%!$&'*+;=@~-]*)*(?:\?[/?\w.:%!$&'*+;=@~-]*)?/,
greedy: true
},
"env": {
pattern: /\benv:(?:(?!\d)\w+|"(?:[^"\\=]|\\.)*")/,
greedy: true,
inside: {
"function": /^env/,
"operator": /^:/,
"variable": /[\s\S]+/
}
},
"hash": {
pattern: /\bsha256:[\da-fA-F]{64}\b/,
inside: {
"function": /sha256/,
"operator": /:/,
"number": /[\da-fA-F]{64}/
}
},
"keyword": /\b(?:as|assert|else|forall|if|in|let|merge|missing|then|toMap|using|with)\b|\u2200/,
"builtin": /\b(?:None|Some)\b/,
"boolean": /\b(?:False|True)\b/,
"number": /\bNaN\b|-?\bInfinity\b|[+-]?\b(?:0x[\da-fA-F]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/,
"operator": /\/\\|\/\/\\\\|&&|\|\||===|[!=]=|\/\/|->|\+\+|::|[+*#@=:?<>|\\\u2227\u2a53\u2261\u2afd\u03bb\u2192]/,
"punctuation": /\.\.|[{}\[\](),./]/,
"class-name": /\b[A-Z]\w*\b/
};
Prism.languages.dhall.string.inside.interpolation.inside.expression.inside = Prism.languages.dhall;
(function(Prism2) {
Prism2.languages.diff = {
"coord": [
/^(?:\*{3}|-{3}|\+{3}).*$/m,
/^@@.*@@$/m,
/^\d.*$/m
]
};
var PREFIXES = {
"deleted-sign": "-",
"deleted-arrow": "<",
"inserted-sign": "+",
"inserted-arrow": ">",
"unchanged": " ",
"diff": "!"
};
Object.keys(PREFIXES).forEach(function(name) {
var prefix = PREFIXES[name];
var alias = [];
if (!/^\w+$/.test(name)) {
alias.push(/\w+/.exec(name)[0]);
}
if (name === "diff") {
alias.push("bold");
}
Prism2.languages.diff[name] = {
pattern: RegExp("^(?:[" + prefix + "].*(?:\r\n?|\n|(?![\\s\\S])))+", "m"),
alias,
inside: {
"line": {
pattern: /(.)(?=[\s\S]).*(?:\r\n?|\n)?/,
lookbehind: true
},
"prefix": {
pattern: /[\s\S]/,
alias: /\w+/.exec(name)[0]
}
}
};
});
Object.defineProperty(Prism2.languages.diff, "PREFIXES", {
value: PREFIXES
});
})(Prism);
(function(Prism2) {
function getPlaceholder(language, index) {
return "___" + language.toUpperCase() + index + "___";
}
Object.defineProperties(Prism2.languages["markup-templating"] = {}, {
buildPlaceholders: {
value: function(env, language, placeholderPattern, replaceFilter) {
if (env.language !== language) {
return;
}
var tokenStack = env.tokenStack = [];
env.code = env.code.replace(placeholderPattern, function(match) {
if (typeof replaceFilter === "function" && !replaceFilter(match)) {
return match;
}
var i = tokenStack.length;
var placeholder;
while (env.code.indexOf(placeholder = getPlaceholder(language, i)) !== -1) {
++i;
}
tokenStack[i] = match;
return placeholder;
});
env.grammar = Prism2.languages.markup;
}
},
tokenizePlaceholders: {
value: function(env, language) {
if (env.language !== language || !env.tokenStack) {
return;
}
env.grammar = Prism2.languages[language];
var j = 0;
var keys = Object.keys(env.tokenStack);
function walkTokens(tokens) {
for (var i = 0; i < tokens.length; i++) {
if (j >= keys.length) {
break;
}
var token = tokens[i];
if (typeof token === "string" || token.content && typeof token.content === "string") {
var k = keys[j];
var t = env.tokenStack[k];
var s = typeof token === "string" ? token : token.content;
var placeholder = getPlaceholder(language, k);
var index = s.indexOf(placeholder);
if (index > -1) {
++j;
var before = s.substring(0, index);
var middle = new Prism2.Token(language, Prism2.tokenize(t, env.grammar), "language-" + language, t);
var after = s.substring(index + placeholder.length);
var replacement = [];
if (before) {
replacement.push.apply(replacement, walkTokens([before]));
}
replacement.push(middle);
if (after) {
replacement.push.apply(replacement, walkTokens([after]));
}
if (typeof token === "string") {
tokens.splice.apply(tokens, [i, 1].concat(replacement));
} else {
token.content = replacement;
}
}
} else if (token.content) {
walkTokens(token.content);
}
}
return tokens;
}
walkTokens(env.tokens);
}
}
});
})(Prism);
(function(Prism2) {
Prism2.languages.django = {
"comment": /^\{#[\s\S]*?#\}$/,
"tag": {
pattern: /(^\{%[+-]?\s*)\w+/,
lookbehind: true,
alias: "keyword"
},
"delimiter": {
pattern: /^\{[{%][+-]?|[+-]?[}%]\}$/,
alias: "punctuation"
},
"string": {
pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"filter": {
pattern: /(\|)\w+/,
lookbehind: true,
alias: "function"
},
"test": {
pattern: /(\bis\s+(?:not\s+)?)(?!not\b)\w+/,
lookbehind: true,
alias: "function"
},
"function": /\b[a-z_]\w+(?=\s*\()/i,
"keyword": /\b(?:and|as|by|else|for|if|import|in|is|loop|not|or|recursive|with|without)\b/,
"operator": /[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,
"number": /\b\d+(?:\.\d+)?\b/,
"boolean": /[Ff]alse|[Nn]one|[Tt]rue/,
"variable": /\b\w+\b/,
"punctuation": /[{}[\](),.:;]/
};
var pattern = /\{\{[\s\S]*?\}\}|\{%[\s\S]*?%\}|\{#[\s\S]*?#\}/g;
var markupTemplating = Prism2.languages["markup-templating"];
Prism2.hooks.add("before-tokenize", function(env) {
markupTemplating.buildPlaceholders(env, "django", pattern);
});
Prism2.hooks.add("after-tokenize", function(env) {
markupTemplating.tokenizePlaceholders(env, "django");
});
Prism2.languages.jinja2 = Prism2.languages.django;
Prism2.hooks.add("before-tokenize", function(env) {
markupTemplating.buildPlaceholders(env, "jinja2", pattern);
});
Prism2.hooks.add("after-tokenize", function(env) {
markupTemplating.tokenizePlaceholders(env, "jinja2");
});
})(Prism);
Prism.languages["dns-zone-file"] = {
"comment": /;.*/,
"string": {
pattern: /"(?:\\.|[^"\\\r\n])*"/,
greedy: true
},
"variable": [
{
pattern: /(^\$ORIGIN[ \t]+)\S+/m,
lookbehind: true
},
{
pattern: /(^|\s)@(?=\s|$)/,
lookbehind: true
}
],
"keyword": /^\$(?:INCLUDE|ORIGIN|TTL)(?=\s|$)/m,
"class": {
pattern: /(^|\s)(?:CH|CS|HS|IN)(?=\s|$)/,
lookbehind: true,
alias: "keyword"
},
"type": {
pattern: /(^|\s)(?:A|A6|AAAA|AFSDB|APL|ATMA|CAA|CDNSKEY|CDS|CERT|CNAME|DHCID|DLV|DNAME|DNSKEY|DS|EID|GID|GPOS|HINFO|HIP|IPSECKEY|ISDN|KEY|KX|LOC|MAILA|MAILB|MB|MD|MF|MG|MINFO|MR|MX|NAPTR|NB|NBSTAT|NIMLOC|NINFO|NS|NSAP|NSAP-PTR|NSEC|NSEC3|NSEC3PARAM|NULL|NXT|OPENPGPKEY|PTR|PX|RKEY|RP|RRSIG|RT|SIG|SINK|SMIMEA|SOA|SPF|SRV|SSHFP|TA|TKEY|TLSA|TSIG|TXT|UID|UINFO|UNSPEC|URI|WKS|X25)(?=\s|$)/,
lookbehind: true,
alias: "keyword"
},
"punctuation": /[()]/
};
Prism.languages["dns-zone"] = Prism.languages["dns-zone-file"];
(function(Prism2) {
var spaceAfterBackSlash = /\\[\r\n](?:\s|\\[\r\n]|#.*(?!.))*(?![\s#]|\\[\r\n])/.source;
var space = /(?:[ \t]+(?![ \t])(?:<SP_BS>)?|<SP_BS>)/.source.replace(/<SP_BS>/g, function() {
return spaceAfterBackSlash;
});
var string = /"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"|'(?:[^'\\\r\n]|\\(?:\r\n|[\s\S]))*'/.source;
var option = /--[\w-]+=(?:<STR>|(?!["'])(?:[^\s\\]|\\.)+)/.source.replace(/<STR>/g, function() {
return string;
});
var stringRule = {
pattern: RegExp(string),
greedy: true
};
var commentRule = {
pattern: /(^[ \t]*)#.*/m,
lookbehind: true,
greedy: true
};
function re(source, flags) {
source = source.replace(/<OPT>/g, function() {
return option;
}).replace(/<SP>/g, function() {
return space;
});
return RegExp(source, flags);
}
Prism2.languages.docker = {
"instruction": {
pattern: /(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,
lookbehind: true,
greedy: true,
inside: {
"options": {
pattern: re(/(^(?:ONBUILD<SP>)?\w+<SP>)<OPT>(?:<SP><OPT>)*/.source, "i"),
lookbehind: true,
greedy: true,
inside: {
"property": {
pattern: /(^|\s)--[\w-]+/,
lookbehind: true
},
"string": [
stringRule,
{
pattern: /(=)(?!["'])(?:[^\s\\]|\\.)+/,
lookbehind: true
}
],
"operator": /\\$/m,
"punctuation": /=/
}
},
"keyword": [
{
pattern: re(/(^(?:ONBUILD<SP>)?HEALTHCHECK<SP>(?:<OPT><SP>)*)(?:CMD|NONE)\b/.source, "i"),
lookbehind: true,
greedy: true
},
{
pattern: re(/(^(?:ONBUILD<SP>)?FROM<SP>(?:<OPT><SP>)*(?!--)[^ \t\\]+<SP>)AS/.source, "i"),
lookbehind: true,
greedy: true
},
{
pattern: re(/(^ONBUILD<SP>)\w+/.source, "i"),
lookbehind: true,
greedy: true
},
{
pattern: /^\w+/,
greedy: true
}
],
"comment": commentRule,
"string": stringRule,
"variable": /\$(?:\w+|\{[^{}"'\\]*\})/,
"operator": /\\$/m
}
},
"comment": commentRule
};
Prism2.languages.dockerfile = Prism2.languages.docker;
})(Prism);
(function(Prism2) {
var ID = "(?:" + [
/[a-zA-Z_\x80-\uFFFF][\w\x80-\uFFFF]*/.source,
/-?(?:\.\d+|\d+(?:\.\d*)?)/.source,
/"[^"\\]*(?:\\[\s\S][^"\\]*)*"/.source,
/<(?:[^<>]|(?!<!--)<(?:[^<>"']|"[^"]*"|'[^']*')+>|<!--(?:[^-]|-(?!->))*-->)*>/.source
].join("|") + ")";
var IDInside = {
"markup": {
pattern: /(^<)[\s\S]+(?=>$)/,
lookbehind: true,
alias: ["language-markup", "language-html", "language-xml"],
inside: Prism2.languages.markup
}
};
function withID(source, flags) {
return RegExp(source.replace(/<ID>/g, function() {
return ID;
}), flags);
}
Prism2.languages.dot = {
"comment": {
pattern: /\/\/.*|\/\*[\s\S]*?\*\/|^#.*/m,
greedy: true
},
"graph-name": {
pattern: withID(/(\b(?:digraph|graph|subgraph)[ \t\r\n]+)<ID>/.source, "i"),
lookbehind: true,
greedy: true,
alias: "class-name",
inside: IDInside
},
"attr-value": {
pattern: withID(/(=[ \t\r\n]*)<ID>/.source),
lookbehind: true,
greedy: true,
inside: IDInside
},
"attr-name": {
pattern: withID(/([\[;, \t\r\n])<ID>(?=[ \t\r\n]*=)/.source),
lookbehind: true,
greedy: true,
inside: IDInside
},
"keyword": /\b(?:digraph|edge|graph|node|strict|subgraph)\b/i,
"compass-point": {
pattern: /(:[ \t\r\n]*)(?:[ewc_]|[ns][ew]?)(?![\w\x80-\uFFFF])/,
lookbehind: true,
alias: "builtin"
},
"node": {
pattern: withID(/(^|[^-.\w\x80-\uFFFF\\])<ID>/.source),
lookbehind: true,
greedy: true,
inside: IDInside
},
"operator": /[=:]|-[->]/,
"punctuation": /[\[\]{};,]/
};
Prism2.languages.gv = Prism2.languages.dot;
})(Prism);
Prism.languages.ebnf = {
"comment": /\(\*[\s\S]*?\*\)/,
"string": {
pattern: /"[^"\r\n]*"|'[^'\r\n]*'/,
greedy: true
},
"special": {
pattern: /\?[^?\r\n]*\?/,
greedy: true,
alias: "class-name"
},
"definition": {
pattern: /^([\t ]*)[a-z]\w*(?:[ \t]+[a-z]\w*)*(?=\s*=)/im,
lookbehind: true,
alias: ["rule", "keyword"]
},
"rule": /\b[a-z]\w*(?:[ \t]+[a-z]\w*)*\b/i,
"punctuation": /\([:/]|[:/]\)|[.,;()[\]{}]/,
"operator": /[-=|*/!]/
};
Prism.languages.editorconfig = {
"comment": /[;#].*/,
"section": {
pattern: /(^[ \t]*)\[.+\]/m,
lookbehind: true,
alias: "selector",
inside: {
"regex": /\\\\[\[\]{},!?.*]/,
"operator": /[!?]|\.\.|\*{1,2}/,
"punctuation": /[\[\]{},]/
}
},
"key": {
pattern: /(^[ \t]*)[^\s=]+(?=[ \t]*=)/m,
lookbehind: true,
alias: "attr-name"
},
"value": {
pattern: /=.*/,
alias: "attr-value",
inside: {
"punctuation": /^=/
}
}
};
Prism.languages.eiffel = {
"comment": /--.*/,
"string": [
{
pattern: /"([^[]*)\[[\s\S]*?\]\1"/,
greedy: true
},
{
pattern: /"([^{]*)\{[\s\S]*?\}\1"/,
greedy: true
},
{
pattern: /"(?:%(?:(?!\n)\s)*\n\s*%|%\S|[^%"\r\n])*"/,
greedy: true
}
],
"char": /'(?:%.|[^%'\r\n])+'/,
"keyword": /\b(?:across|agent|alias|all|and|as|assign|attached|attribute|check|class|convert|create|Current|debug|deferred|detachable|do|else|elseif|end|ensure|expanded|export|external|feature|from|frozen|if|implies|inherit|inspect|invariant|like|local|loop|not|note|obsolete|old|once|or|Precursor|redefine|rename|require|rescue|Result|retry|select|separate|some|then|undefine|until|variant|Void|when|xor)\b/i,
"boolean": /\b(?:False|True)\b/i,
"class-name": /\b[A-Z][\dA-Z_]*\b/,
"number": [
/\b0[xcb][\da-f](?:_*[\da-f])*\b/i,
/(?:\b\d(?:_*\d)*)?\.(?:(?:\d(?:_*\d)*)?e[+-]?)?\d(?:_*\d)*\b|\b\d(?:_*\d)*\b\.?/i
],
"punctuation": /:=|<<|>>|\(\||\|\)|->|\.(?=\w)|[{}[\];(),:?]/,
"operator": /\\\\|\|\.\.\||\.\.|\/[~\/=]?|[><]=?|[-+*^=~]/
};
(function(Prism2) {
Prism2.languages.ejs = {
"delimiter": {
pattern: /^<%[-_=]?|[-_]?%>$/,
alias: "punctuation"
},
"comment": /^#[\s\S]*/,
"language-javascript": {
pattern: /[\s\S]+/,
inside: Prism2.languages.javascript
}
};
Prism2.hooks.add("before-tokenize", function(env) {
var ejsPattern = /<%(?!%)[\s\S]+?%>/g;
Prism2.languages["markup-templating"].buildPlaceholders(env, "ejs", ejsPattern);
});
Prism2.hooks.add("after-tokenize", function(env) {
Prism2.languages["markup-templating"].tokenizePlaceholders(env, "ejs");
});
Prism2.languages.eta = Prism2.languages.ejs;
})(Prism);
Prism.languages.elixir = {
"doc": {
pattern: /@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,
inside: {
"attribute": /^@\w+/,
"string": /['"][\s\S]+/
}
},
"comment": {
pattern: /#.*/,
greedy: true
},
"regex": {
pattern: /~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,
greedy: true
},
"string": [
{
pattern: /~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,
greedy: true,
inside: {}
},
{
pattern: /("""|''')[\s\S]*?\1/,
greedy: true,
inside: {}
},
{
pattern: /("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
greedy: true,
inside: {}
}
],
"atom": {
pattern: /(^|[^:]):\w+/,
lookbehind: true,
alias: "symbol"
},
"module": {
pattern: /\b[A-Z]\w*\b/,
alias: "class-name"
},
"attr-name": /\b\w+\??:(?!:)/,
"argument": {
pattern: /(^|[^&])&\d+/,
lookbehind: true,
alias: "variable"
},
"attribute": {
pattern: /@\w+/,
alias: "variable"
},
"function": /\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d))/,
"number": /\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,
"keyword": /\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\b/,
"boolean": /\b(?:false|nil|true)\b/,
"operator": [
/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,
{
pattern: /([^<])<(?!<)/,
lookbehind: true
},
{
pattern: /([^>])>(?!>)/,
lookbehind: true
}
],
"punctuation": /<<|>>|[.,%\[\]{}()]/
};
Prism.languages.elixir.string.forEach(function(o) {
o.inside = {
"interpolation": {
pattern: /#\{[^}]+\}/,
inside: {
"delimiter": {
pattern: /^#\{|\}$/,
alias: "punctuation"
},
rest: Prism.languages.elixir
}
}
};
});
Prism.languages.elm = {
"comment": /--.*|\{-[\s\S]*?-\}/,
"char": {
pattern: /'(?:[^\\'\r\n]|\\(?:[abfnrtv\\']|\d+|x[0-9a-fA-F]+|u\{[0-9a-fA-F]+\}))'/,
greedy: true
},
"string": [
{
pattern: /"""[\s\S]*?"""/,
greedy: true
},
{
pattern: /"(?:[^\\"\r\n]|\\.)*"/,
greedy: true
}
],
"import-statement": {
pattern: /(^[\t ]*)import\s+[A-Z]\w*(?:\.[A-Z]\w*)*(?:\s+as\s+(?:[A-Z]\w*)(?:\.[A-Z]\w*)*)?(?:\s+exposing\s+)?/m,
lookbehind: true,
inside: {
"keyword": /\b(?:as|exposing|import)\b/
}
},
"keyword": /\b(?:alias|as|case|else|exposing|if|in|infixl|infixr|let|module|of|then|type)\b/,
"builtin": /\b(?:abs|acos|always|asin|atan|atan2|ceiling|clamp|compare|cos|curry|degrees|e|flip|floor|fromPolar|identity|isInfinite|isNaN|logBase|max|min|negate|never|not|pi|radians|rem|round|sin|sqrt|tan|toFloat|toPolar|toString|truncate|turns|uncurry|xor)\b/,
"number": /\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[0-9a-f]+)\b/i,
"operator": /\s\.\s|[+\-/*=.$<>:&|^?%#@~!]{2,}|[+\-/*=$<>:&|^?%#@~!]/,
"hvariable": /\b(?:[A-Z]\w*\.)*[a-z]\w*\b/,
"constant": /\b(?:[A-Z]\w*\.)*[A-Z]\w*\b/,
"punctuation": /[{}[\]|(),.:]/
};
Prism.languages.lua = {
"comment": /^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,
"string": {
pattern: /(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,
greedy: true
},
"number": /\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,
"keyword": /\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,
"function": /(?!\d)\w+(?=\s*(?:[({]))/,
"operator": [
/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,
{
pattern: /(^|[^.])\.\.(?!\.)/,
lookbehind: true
}
],
"punctuation": /[\[\](){},;]|\.+|:+/
};
(function(Prism2) {
Prism2.languages.etlua = {
"delimiter": {
pattern: /^<%[-=]?|-?%>$/,
alias: "punctuation"
},
"language-lua": {
pattern: /[\s\S]+/,
inside: Prism2.languages.lua
}
};
Prism2.hooks.add("before-tokenize", function(env) {
var pattern = /<%[\s\S]+?%>/g;
Prism2.languages["markup-templating"].buildPlaceholders(env, "etlua", pattern);
});
Prism2.hooks.add("after-tokenize", function(env) {
Prism2.languages["markup-templating"].tokenizePlaceholders(env, "etlua");
});
})(Prism);
(function(Prism2) {
Prism2.languages.erb = {
"delimiter": {
pattern: /^(\s*)<%=?|%>(?=\s*$)/,
lookbehind: true,
alias: "punctuation"
},
"ruby": {
pattern: /\s*\S[\s\S]*/,
alias: "language-ruby",
inside: Prism2.languages.ruby
}
};
Prism2.hooks.add("before-tokenize", function(env) {
var erbPattern = /<%=?(?:[^\r\n]|[\r\n](?!=begin)|[\r\n]=begin\s(?:[^\r\n]|[\r\n](?!=end))*[\r\n]=end)+?%>/g;
Prism2.languages["markup-templating"].buildPlaceholders(env, "erb", erbPattern);
});
Prism2.hooks.add("after-tokenize", function(env) {
Prism2.languages["markup-templating"].tokenizePlaceholders(env, "erb");
});
})(Prism);
Prism.languages.erlang = {
"comment": /%.+/,
"string": {
pattern: /"(?:\\.|[^\\"\r\n])*"/,
greedy: true
},
"quoted-function": {
pattern: /'(?:\\.|[^\\'\r\n])+'(?=\()/,
alias: "function"
},
"quoted-atom": {
pattern: /'(?:\\.|[^\\'\r\n])+'/,
alias: "atom"
},
"boolean": /\b(?:false|true)\b/,
"keyword": /\b(?:after|begin|case|catch|end|fun|if|of|receive|try|when)\b/,
"number": [
/\$\\?./,
/\b\d+#[a-z0-9]+/i,
/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i
],
"function": /\b[a-z][\w@]*(?=\()/,
"variable": {
pattern: /(^|[^@])(?:\b|\?)[A-Z_][\w@]*/,
lookbehind: true
},
"operator": [
/[=\/<>:]=|=[:\/]=|\+\+?|--?|[=*\/!]|\b(?:and|andalso|band|bnot|bor|bsl|bsr|bxor|div|not|or|orelse|rem|xor)\b/,
{
pattern: /(^|[^<])<(?!<)/,
lookbehind: true
},
{
pattern: /(^|[^>])>(?!>)/,
lookbehind: true
}
],
"atom": /\b[a-z][\w@]*/,
"punctuation": /[()[\]{}:;,.#|]|<<|>>/
};
Prism.languages["excel-formula"] = {
"comment": {
pattern: /(\bN\(\s*)"(?:[^"]|"")*"(?=\s*\))/i,
lookbehind: true,
greedy: true
},
"string": {
pattern: /"(?:[^"]|"")*"(?!")/,
greedy: true
},
"reference": {
pattern: /(?:'[^']*'|(?:[^\s()[\]{}<>*?"';,$&]*\[[^^\s()[\]{}<>*?"']+\])?\w+)!/,
greedy: true,
alias: "string",
inside: {
"operator": /!$/,
"punctuation": /'/,
"sheet": {
pattern: /[^[\]]+$/,
alias: "function"
},
"file": {
pattern: /\[[^[\]]+\]$/,
inside: {
"punctuation": /[[\]]/
}
},
"path": /[\s\S]+/
}
},
"function-name": {
pattern: /\b[A-Z]\w*(?=\()/i,
alias: "builtin"
},
"range": {
pattern: /\$?\b(?:[A-Z]+\$?\d+:\$?[A-Z]+\$?\d+|[A-Z]+:\$?[A-Z]+|\d+:\$?\d+)\b/i,
alias: "selector",
inside: {
"operator": /:/,
"cell": /\$?[A-Z]+\$?\d+/i,
"column": /\$?[A-Z]+/i,
"row": /\$?\d+/
}
},
"cell": {
pattern: /\b[A-Z]+\d+\b|\$[A-Za-z]+\$?\d+\b|\b[A-Za-z]+\$\d+\b/,
alias: "selector"
},
"number": /(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?\b/i,
"boolean": /\b(?:FALSE|TRUE)\b/i,
"operator": /[-+*/^%=&,]|<[=>]?|>=?/,
"punctuation": /[[\]();{}|]/
};
Prism.languages["xlsx"] = Prism.languages["xls"] = Prism.languages["excel-formula"];
Prism.languages.fsharp = Prism.languages.extend("clike", {
"comment": [
{
pattern: /(^|[^\\])\(\*(?!\))[\s\S]*?\*\)/,
lookbehind: true,
greedy: true
},
{
pattern: /(^|[^\\:])\/\/.*/,
lookbehind: true,
greedy: true
}
],
"string": {
pattern: /(?:"""[\s\S]*?"""|@"(?:""|[^"])*"|"(?:\\[\s\S]|[^\\"])*")B?/,
greedy: true
},
"class-name": {
pattern: /(\b(?:exception|inherit|interface|new|of|type)\s+|\w\s*:\s*|\s:\??>\s*)[.\w]+\b(?:\s*(?:->|\*)\s*[.\w]+\b)*(?!\s*[:.])/,
lookbehind: true,
inside: {
"operator": /->|\*/,
"punctuation": /\./
}
},
"keyword": /\b(?:let|return|use|yield)(?:!\B|\b)|\b(?:abstract|and|as|asr|assert|atomic|base|begin|break|checked|class|component|const|constraint|constructor|continue|default|delegate|do|done|downcast|downto|eager|elif|else|end|event|exception|extern|external|false|finally|fixed|for|fun|function|functor|global|if|in|include|inherit|inline|interface|internal|land|lazy|lor|lsl|lsr|lxor|match|member|method|mixin|mod|module|mutable|namespace|new|not|null|object|of|open|or|override|parallel|private|process|protected|public|pure|rec|sealed|select|sig|static|struct|tailcall|then|to|trait|true|try|type|upcast|val|virtual|void|volatile|when|while|with)\b/,
"number": [
/\b0x[\da-fA-F]+(?:LF|lf|un)?\b/,
/\b0b[01]+(?:uy|y)?\b/,
/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[fm]|e[+-]?\d+)?\b/i,
/\b\d+(?:[IlLsy]|UL|u[lsy]?)?\b/
],
"operator": /([<>~&^])\1\1|([*.:<>&])\2|<-|->|[!=:]=|<?\|{1,3}>?|\??(?:<=|>=|<>|[-+*/%=<>])\??|[!?^&]|~[+~-]|:>|:\?>?/
});
Prism.languages.insertBefore("fsharp", "keyword", {
"preprocessor": {
pattern: /(^[\t ]*)#.*/m,
lookbehind: true,
alias: "property",
inside: {
"directive": {
pattern: /(^#)\b(?:else|endif|if|light|line|nowarn)\b/,
lookbehind: true,
alias: "keyword"
}
}
}
});
Prism.languages.insertBefore("fsharp", "punctuation", {
"computation-expression": {
pattern: /\b[_a-z]\w*(?=\s*\{)/i,
alias: "keyword"
}
});
Prism.languages.insertBefore("fsharp", "string", {
"annotation": {
pattern: /\[<.+?>\]/,
greedy: true,
inside: {
"punctuation": /^\[<|>\]$/,
"class-name": {
pattern: /^\w+$|(^|;\s*)[A-Z]\w*(?=\()/,
lookbehind: true
},
"annotation-content": {
pattern: /[\s\S]+/,
inside: Prism.languages.fsharp
}
}
},
"char": {
pattern: /'(?:[^\\']|\\(?:.|\d{3}|x[a-fA-F\d]{2}|u[a-fA-F\d]{4}|U[a-fA-F\d]{8}))'B?/,
greedy: true
}
});
(function(Prism2) {
var comment_inside = {
"function": /\b(?:BUGS?|FIX(?:MES?)?|NOTES?|TODOS?|XX+|HACKS?|WARN(?:ING)?|\?{2,}|!{2,})\b/
};
var string_inside = {
"number": /\\[^\s']|%\w/
};
var factor = {
"comment": [
{
pattern: /(^|\s)(?:! .*|!$)/,
lookbehind: true,
inside: comment_inside
},
{
pattern: /(^|\s)\/\*\s[\s\S]*?\*\/(?=\s|$)/,
lookbehind: true,
greedy: true,
inside: comment_inside
},
{
pattern: /(^|\s)!\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,
lookbehind: true,
greedy: true,
inside: comment_inside
}
],
"number": [
{
pattern: /(^|\s)[+-]?\d+(?=\s|$)/,
lookbehind: true
},
{
pattern: /(^|\s)[+-]?0(?:b[01]+|o[0-7]+|d\d+|x[\dA-F]+)(?=\s|$)/i,
lookbehind: true
},
{
pattern: /(^|\s)[+-]?\d+\/\d+\.?(?=\s|$)/,
lookbehind: true
},
{
pattern: /(^|\s)\+?\d+\+\d+\/\d+(?=\s|$)/,
lookbehind: true
},
{
pattern: /(^|\s)-\d+-\d+\/\d+(?=\s|$)/,
lookbehind: true
},
{
pattern: /(^|\s)[+-]?(?:\d*\.\d+|\d+\.\d*|\d+)(?:e[+-]?\d+)?(?=\s|$)/i,
lookbehind: true
},
{
pattern: /(^|\s)NAN:\s+[\da-fA-F]+(?=\s|$)/,
lookbehind: true
},
{
pattern: /(^|\s)[+-]?0(?:b1\.[01]*|o1\.[0-7]*|d1\.\d*|x1\.[\dA-F]*)p\d+(?=\s|$)/i,
lookbehind: true
}
],
"regexp": {
pattern: /(^|\s)R\/\s(?:\\\S|[^\\/])*\/(?:[idmsr]*|[idmsr]+-[idmsr]+)(?=\s|$)/,
lookbehind: true,
alias: "number",
inside: {
"variable": /\\\S/,
"keyword": /[+?*\[\]^$(){}.|]/,
"operator": {
pattern: /(\/)[idmsr]+(?:-[idmsr]+)?/,
lookbehind: true
}
}
},
"boolean": {
pattern: /(^|\s)[tf](?=\s|$)/,
lookbehind: true
},
"custom-string": {
pattern: /(^|\s)[A-Z0-9\-]+"\s(?:\\\S|[^"\\])*"/,
lookbehind: true,
greedy: true,
alias: "string",
inside: {
"number": /\\\S|%\w|\//
}
},
"multiline-string": [
{
pattern: /(^|\s)STRING:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*;(?=\s|$)/,
lookbehind: true,
greedy: true,
alias: "string",
inside: {
"number": string_inside.number,
"semicolon-or-setlocal": {
pattern: /([\r\n][ \t]*);(?=\s|$)/,
lookbehind: true,
alias: "function"
}
}
},
{
pattern: /(^|\s)HEREDOC:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*\S+(?=\s|$)/,
lookbehind: true,
greedy: true,
alias: "string",
inside: string_inside
},
{
pattern: /(^|\s)\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,
lookbehind: true,
greedy: true,
alias: "string",
inside: string_inside
}
],
"special-using": {
pattern: /(^|\s)USING:(?:\s\S+)*(?=\s+;(?:\s|$))/,
lookbehind: true,
alias: "function",
inside: {
"string": {
pattern: /(\s)[^:\s]+/,
lookbehind: true
}
}
},
"stack-effect-delimiter": [
{
pattern: /(^|\s)(?:call|eval|execute)?\((?=\s)/,
lookbehind: true,
alias: "operator"
},
{
pattern: /(\s)--(?=\s)/,
lookbehind: true,
alias: "operator"
},
{
pattern: /(\s)\)(?=\s|$)/,
lookbehind: true,
alias: "operator"
}
],
"combinators": {
pattern: null,
lookbehind: true,
alias: "keyword"
},
"kernel-builtin": {
pattern: null,
lookbehind: true,
alias: "variable"
},
"sequences-builtin": {
pattern: null,
lookbehind: true,
alias: "variable"
},
"math-builtin": {
pattern: null,
lookbehind: true,
alias: "variable"
},
"constructor-word": {
pattern: /(^|\s)<(?!=+>|-+>)\S+>(?=\s|$)/,
lookbehind: true,
alias: "keyword"
},
"other-builtin-syntax": {
pattern: null,
lookbehind: true,
alias: "operator"
},
"conventionally-named-word": {
pattern: /(^|\s)(?!")(?:(?:change|new|set|with)-\S+|\$\S+|>[^>\s]+|[^:>\s]+>|[^>\s]+>[^>\s]+|\+[^+\s]+\+|[^?\s]+\?|\?[^?\s]+|[^>\s]+>>|>>[^>\s]+|[^<\s]+<<|\([^()\s]+\)|[^!\s]+!|[^*\s]\S*\*|[^.\s]\S*\.)(?=\s|$)/,
lookbehind: true,
alias: "keyword"
},
"colon-syntax": {
pattern: /(^|\s)(?:[A-Z0-9\-]+#?)?:{1,2}\s+(?:;\S+|(?!;)\S+)(?=\s|$)/,
lookbehind: true,
greedy: true,
alias: "function"
},
"semicolon-or-setlocal": {
pattern: /(\s)(?:;|:>)(?=\s|$)/,
lookbehind: true,
alias: "function"
},
"curly-brace-literal-delimiter": [
{
pattern: /(^|\s)[a-z]*\{(?=\s)/i,
lookbehind: true,
alias: "operator"
},
{
pattern: /(\s)\}(?=\s|$)/,
lookbehind: true,
alias: "operator"
}
],
"quotation-delimiter": [
{
pattern: /(^|\s)\[(?=\s)/,
lookbehind: true,
alias: "operator"
},
{
pattern: /(\s)\](?=\s|$)/,
lookbehind: true,
alias: "operator"
}
],
"normal-word": {
pattern: /(^|\s)[^"\s]\S*(?=\s|$)/,
lookbehind: true
},
"string": {
pattern: /"(?:\\\S|[^"\\])*"/,
greedy: true,
inside: string_inside
}
};
var escape = function(str) {
return (str + "").replace(/([.?*+\^$\[\]\\(){}|\-])/g, "\\$1");
};
var arrToWordsRegExp = function(arr) {
return new RegExp("(^|\\s)(?:" + arr.map(escape).join("|") + ")(?=\\s|$)");
};
var builtins = {
"kernel-builtin": [
"or",
"2nipd",
"4drop",
"tuck",
"wrapper",
"nip",
"wrapper?",
"callstack>array",
"die",
"dupd",
"callstack",
"callstack?",
"3dup",
"hashcode",
"pick",
"4nip",
"build",
">boolean",
"nipd",
"clone",
"5nip",
"eq?",
"?",
"=",
"swapd",
"2over",
"clear",
"2dup",
"get-retainstack",
"not",
"tuple?",
"dup",
"3nipd",
"call",
"-rotd",
"object",
"drop",
"assert=",
"assert?",
"-rot",
"execute",
"boa",
"get-callstack",
"curried?",
"3drop",
"pickd",
"overd",
"over",
"roll",
"3nip",
"swap",
"and",
"2nip",
"rotd",
"throw",
"(clone)",
"hashcode*",
"spin",
"reach",
"4dup",
"equal?",
"get-datastack",
"assert",
"2drop",
"<wrapper>",
"boolean?",
"identity-hashcode",
"identity-tuple?",
"null",
"composed?",
"new",
"5drop",
"rot",
"-roll",
"xor",
"identity-tuple",
"boolean"
],
"other-builtin-syntax": [
"=======",
"recursive",
"flushable",
">>",
"<<<<<<",
"M\\",
"B",
"PRIVATE>",
"\\",
"======",
"final",
"inline",
"delimiter",
"deprecated",
"<PRIVATE",
">>>>>>",
"<<<<<<<",
"parse-complex",
"malformed-complex",
"read-only",
">>>>>>>",
"call-next-method",
"<<",
"foldable",
"$",
"$[",
"${"
],
"sequences-builtin": [
"member-eq?",
"mismatch",
"append",
"assert-sequence=",
"longer",
"repetition",
"clone-like",
"3sequence",
"assert-sequence?",
"last-index-from",
"reversed",
"index-from",
"cut*",
"pad-tail",
"join-as",
"remove-eq!",
"concat-as",
"but-last",
"snip",
"nths",
"nth",
"sequence",
"longest",
"slice?",
"<slice>",
"remove-nth",
"tail-slice",
"empty?",
"tail*",
"member?",
"virtual-sequence?",
"set-length",
"drop-prefix",
"iota",
"unclip",
"bounds-error?",
"unclip-last-slice",
"non-negative-integer-expected",
"non-negative-integer-expected?",
"midpoint@",
"longer?",
"?set-nth",
"?first",
"rest-slice",
"prepend-as",
"prepend",
"fourth",
"sift",
"subseq-start",
"new-sequence",
"?last",
"like",
"first4",
"1sequence",
"reverse",
"slice",
"virtual@",
"repetition?",
"set-last",
"index",
"4sequence",
"max-length",
"set-second",
"immutable-sequence",
"first2",
"first3",
"supremum",
"unclip-slice",
"suffix!",
"insert-nth",
"tail",
"3append",
"short",
"suffix",
"concat",
"flip",
"immutable?",
"reverse!",
"2sequence",
"sum",
"delete-all",
"indices",
"snip-slice",
"<iota>",
"check-slice",
"sequence?",
"head",
"append-as",
"halves",
"sequence=",
"collapse-slice",
"?second",
"slice-error?",
"product",
"bounds-check?",
"bounds-check",
"immutable",
"virtual-exemplar",
"harvest",
"remove",
"pad-head",
"last",
"set-fourth",
"cartesian-product",
"remove-eq",
"shorten",
"shorter",
"reversed?",
"shorter?",
"shortest",
"head-slice",
"pop*",
"tail-slice*",
"but-last-slice",
"iota?",
"append!",
"cut-slice",
"new-resizable",
"head-slice*",
"sequence-hashcode",
"pop",
"set-nth",
"?nth",
"second",
"join",
"immutable-sequence?",
"<reversed>",
"3append-as",
"virtual-sequence",
"subseq?",
"remove-nth!",
"length",
"last-index",
"lengthen",
"assert-sequence",
"copy",
"move",
"third",
"first",
"tail?",
"set-first",
"prefix",
"bounds-error",
"<repetition>",
"exchange",
"surround",
"cut",
"min-length",
"set-third",
"push-all",
"head?",
"subseq-start-from",
"delete-slice",
"rest",
"sum-lengths",
"head*",
"infimum",
"remove!",
"glue",
"slice-error",
"subseq",
"push",
"replace-slice",
"subseq-as",
"unclip-last"
],
"math-builtin": [
"number=",
"next-power-of-2",
"?1+",
"fp-special?",
"imaginary-part",
"float>bits",
"number?",
"fp-infinity?",
"bignum?",
"fp-snan?",
"denominator",
"gcd",
"*",
"+",
"fp-bitwise=",
"-",
"u>=",
"/",
">=",
"bitand",
"power-of-2?",
"log2-expects-positive",
"neg?",
"<",
"log2",
">",
"integer?",
"number",
"bits>double",
"2/",
"zero?",
"bits>float",
"float?",
"shift",
"ratio?",
"rect>",
"even?",
"ratio",
"fp-sign",
"bitnot",
">fixnum",
"complex?",
"/i",
"integer>fixnum",
"/f",
"sgn",
">bignum",
"next-float",
"u<",
"u>",
"mod",
"recip",
"rational",
">float",
"2^",
"integer",
"fixnum?",
"neg",
"fixnum",
"sq",
"bignum",
">rect",
"bit?",
"fp-qnan?",
"simple-gcd",
"complex",
"<fp-nan>",
"real",
">fraction",
"double>bits",
"bitor",
"rem",
"fp-nan-payload",
"real-part",
"log2-expects-positive?",
"prev-float",
"align",
"unordered?",
"float",
"fp-nan?",
"abs",
"bitxor",
"integer>fixnum-strict",
"u<=",
"odd?",
"<=",
"/mod",
">integer",
"real?",
"rational?",
"numerator"
]
};
Object.keys(builtins).forEach(function(k) {
factor[k].pattern = arrToWordsRegExp(builtins[k]);
});
var combinators = [
"2bi",
"while",
"2tri",
"bi*",
"4dip",
"both?",
"same?",
"tri@",
"curry",
"prepose",
"3bi",
"?if",
"tri*",
"2keep",
"3keep",
"curried",
"2keepd",
"when",
"2bi*",
"2tri*",
"4keep",
"bi@",
"keepdd",
"do",
"unless*",
"tri-curry",
"if*",
"loop",
"bi-curry*",
"when*",
"2bi@",
"2tri@",
"with",
"2with",
"either?",
"bi",
"until",
"3dip",
"3curry",
"tri-curry*",
"tri-curry@",
"bi-curry",
"keepd",
"compose",
"2dip",
"if",
"3tri",
"unless",
"tuple",
"keep",
"2curry",
"tri",
"most",
"while*",
"dip",
"composed",
"bi-curry@",
"find-last-from",
"trim-head-slice",
"map-as",
"each-from",
"none?",
"trim-tail",
"partition",
"if-empty",
"accumulate*",
"reject!",
"find-from",
"accumulate-as",
"collector-for-as",
"reject",
"map",
"map-sum",
"accumulate!",
"2each-from",
"follow",
"supremum-by",
"map!",
"unless-empty",
"collector",
"padding",
"reduce-index",
"replicate-as",
"infimum-by",
"trim-tail-slice",
"count",
"find-index",
"filter",
"accumulate*!",
"reject-as",
"map-integers",
"map-find",
"reduce",
"selector",
"interleave",
"2map",
"filter-as",
"binary-reduce",
"map-index-as",
"find",
"produce",
"filter!",
"replicate",
"cartesian-map",
"cartesian-each",
"find-index-from",
"map-find-last",
"3map-as",
"3map",
"find-last",
"selector-as",
"2map-as",
"2map-reduce",
"accumulate",
"each",
"each-index",
"accumulate*-as",
"when-empty",
"all?",
"collector-as",
"push-either",
"new-like",
"collector-for",
"2selector",
"push-if",
"2all?",
"map-reduce",
"3each",
"any?",
"trim-slice",
"2reduce",
"change-nth",
"produce-as",
"2each",
"trim",
"trim-head",
"cartesian-find",
"map-index",
"if-zero",
"each-integer",
"unless-zero",
"(find-integer)",
"when-zero",
"find-last-integer",
"(all-integers?)",
"times",
"(each-integer)",
"find-integer",
"all-integers?",
"unless-negative",
"if-positive",
"when-positive",
"when-negative",
"unless-positive",
"if-negative",
"case",
"2cleave",
"cond>quot",
"case>quot",
"3cleave",
"wrong-values",
"to-fixed-point",
"alist>quot",
"cond",
"cleave",
"call-effect",
"recursive-hashcode",
"spread",
"deep-spread>quot",
"2||",
"0||",
"n||",
"0&&",
"2&&",
"3||",
"1||",
"1&&",
"n&&",
"3&&",
"smart-unless*",
"keep-inputs",
"reduce-outputs",
"smart-when*",
"cleave>array",
"smart-with",
"smart-apply",
"smart-if",
"inputs/outputs",
"output>sequence-n",
"map-outputs",
"map-reduce-outputs",
"dropping",
"output>array",
"smart-map-reduce",
"smart-2map-reduce",
"output>array-n",
"nullary",
"input<sequence",
"append-outputs",
"drop-inputs",
"inputs",
"smart-2reduce",
"drop-outputs",
"smart-reduce",
"preserving",
"smart-when",
"outputs",
"append-outputs-as",
"smart-unless",
"smart-if*",
"sum-outputs",
"input<sequence-unsafe",
"output>sequence"
];
factor.combinators.pattern = arrToWordsRegExp(combinators);
Prism2.languages.factor = factor;
})(Prism);
(function(Prism2) {
Prism2.languages["false"] = {
"comment": {
pattern: /\{[^}]*\}/
},
"string": {
pattern: /"[^"]*"/,
greedy: true
},
"character-code": {
pattern: /'(?:[^\r]|\r\n?)/,
alias: "number"
},
"assembler-code": {
pattern: /\d+`/,
alias: "important"
},
"number": /\d+/,
"operator": /[-!#$%&'*+,./:;=>?@\\^_`|~ßø]/,
"punctuation": /\[|\]/,
"variable": /[a-z]/,
"non-standard": {
pattern: /[()<BDO®]/,
alias: "bold"
}
};
})(Prism);
Prism.languages["firestore-security-rules"] = Prism.languages.extend("clike", {
"comment": /\/\/.*/,
"keyword": /\b(?:allow|function|if|match|null|return|rules_version|service)\b/,
"operator": /&&|\|\||[<>!=]=?|[-+*/%]|\b(?:in|is)\b/
});
delete Prism.languages["firestore-security-rules"]["class-name"];
Prism.languages.insertBefore("firestore-security-rules", "keyword", {
"path": {
pattern: /(^|[\s(),])(?:\/(?:[\w\xA0-\uFFFF]+|\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)))+/,
lookbehind: true,
greedy: true,
inside: {
"variable": {
pattern: /\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)/,
inside: {
"operator": /=/,
"keyword": /\*\*/,
"punctuation": /[.$(){}]/
}
},
"punctuation": /\//
}
},
"method": {
pattern: /(\ballow\s+)[a-z]+(?:\s*,\s*[a-z]+)*(?=\s*[:;])/,
lookbehind: true,
alias: "builtin",
inside: {
"punctuation": /,/
}
}
});
(function(Prism2) {
Prism2.languages.flow = Prism2.languages.extend("javascript", {});
Prism2.languages.insertBefore("flow", "keyword", {
"type": [
{
pattern: /\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,
alias: "class-name"
}
]
});
Prism2.languages.flow["function-variable"].pattern = /(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i;
delete Prism2.languages.flow["parameter"];
Prism2.languages.insertBefore("flow", "operator", {
"flow-punctuation": {
pattern: /\{\||\|\}/,
alias: "punctuation"
}
});
if (!Array.isArray(Prism2.languages.flow.keyword)) {
Prism2.languages.flow.keyword = [Prism2.languages.flow.keyword];
}
Prism2.languages.flow.keyword.unshift({
pattern: /(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,
lookbehind: true
}, {
pattern: /(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,
lookbehind: true
});
})(Prism);
Prism.languages.fortran = {
"quoted-number": {
pattern: /[BOZ](['"])[A-F0-9]+\1/i,
alias: "number"
},
"string": {
pattern: /(?:\b\w+_)?(['"])(?:\1\1|&(?:\r\n?|\n)(?:[ \t]*!.*(?:\r\n?|\n)|(?![ \t]*!))|(?!\1).)*(?:\1|&)/,
inside: {
"comment": {
pattern: /(&(?:\r\n?|\n)\s*)!.*/,
lookbehind: true
}
}
},
"comment": {
pattern: /!.*/,
greedy: true
},
"boolean": /\.(?:FALSE|TRUE)\.(?:_\w+)?/i,
"number": /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[ED][+-]?\d+)?(?:_\w+)?/i,
"keyword": [
/\b(?:CHARACTER|COMPLEX|DOUBLE ?PRECISION|INTEGER|LOGICAL|REAL)\b/i,
/\b(?:END ?)?(?:BLOCK ?DATA|DO|FILE|FORALL|FUNCTION|IF|INTERFACE|MODULE(?! PROCEDURE)|PROGRAM|SELECT|SUBROUTINE|TYPE|WHERE)\b/i,
/\b(?:ALLOCATABLE|ALLOCATE|BACKSPACE|CALL|CASE|CLOSE|COMMON|CONTAINS|CONTINUE|CYCLE|DATA|DEALLOCATE|DIMENSION|DO|END|EQUIVALENCE|EXIT|EXTERNAL|FORMAT|GO ?TO|IMPLICIT(?: NONE)?|INQUIRE|INTENT|INTRINSIC|MODULE PROCEDURE|NAMELIST|NULLIFY|OPEN|OPTIONAL|PARAMETER|POINTER|PRINT|PRIVATE|PUBLIC|READ|RETURN|REWIND|SAVE|SELECT|STOP|TARGET|WHILE|WRITE)\b/i,
/\b(?:ASSIGNMENT|DEFAULT|ELEMENTAL|ELSE|ELSEIF|ELSEWHERE|ENTRY|IN|INCLUDE|INOUT|KIND|NULL|ONLY|OPERATOR|OUT|PURE|RECURSIVE|RESULT|SEQUENCE|STAT|THEN|USE)\b/i
],
"operator": [
/\*\*|\/\/|=>|[=\/]=|[<>]=?|::|[+\-*=%]|\.[A-Z]+\./i,
{
pattern: /(^|(?!\().)\/(?!\))/,
lookbehind: true
}
],
"punctuation": /\(\/|\/\)|[(),;:&]/
};
(function(Prism2) {
var FTL_EXPR = /[^<()"']|\((?:<expr>)*\)|<(?!#--)|<#--(?:[^-]|-(?!->))*-->|"(?:[^\\"]|\\.)*"|'(?:[^\\']|\\.)*'/.source;
for (var i = 0; i < 2; i++) {
FTL_EXPR = FTL_EXPR.replace(/<expr>/g, function() {
return FTL_EXPR;
});
}
FTL_EXPR = FTL_EXPR.replace(/<expr>/g, /[^\s\S]/.source);
var ftl = {
"comment": /<#--[\s\S]*?-->/,
"string": [
{
pattern: /\br("|')(?:(?!\1)[^\\]|\\.)*\1/,
greedy: true
},
{
pattern: RegExp(/("|')(?:(?!\1|\$\{)[^\\]|\\.|\$\{(?:(?!\})(?:<expr>))*\})*\1/.source.replace(/<expr>/g, function() {
return FTL_EXPR;
})),
greedy: true,
inside: {
"interpolation": {
pattern: RegExp(/((?:^|[^\\])(?:\\\\)*)\$\{(?:(?!\})(?:<expr>))*\}/.source.replace(/<expr>/g, function() {
return FTL_EXPR;
})),
lookbehind: true,
inside: {
"interpolation-punctuation": {
pattern: /^\$\{|\}$/,
alias: "punctuation"
},
rest: null
}
}
}
}
],
"keyword": /\b(?:as)\b/,
"boolean": /\b(?:false|true)\b/,
"builtin-function": {
pattern: /((?:^|[^?])\?\s*)\w+/,
lookbehind: true,
alias: "function"
},
"function": /\b\w+(?=\s*\()/,
"number": /\b\d+(?:\.\d+)?\b/,
"operator": /\.\.[<*!]?|->|--|\+\+|&&|\|\||\?{1,2}|[-+*/%!=<>]=?|\b(?:gt|gte|lt|lte)\b/,
"punctuation": /[,;.:()[\]{}]/
};
ftl.string[1].inside.interpolation.inside.rest = ftl;
Prism2.languages.ftl = {
"ftl-comment": {
pattern: /^<#--[\s\S]*/,
alias: "comment"
},
"ftl-directive": {
pattern: /^<[\s\S]+>$/,
inside: {
"directive": {
pattern: /(^<\/?)[#@][a-z]\w*/i,
lookbehind: true,
alias: "keyword"
},
"punctuation": /^<\/?|\/?>$/,
"content": {
pattern: /\s*\S[\s\S]*/,
alias: "ftl",
inside: ftl
}
}
},
"ftl-interpolation": {
pattern: /^\$\{[\s\S]*\}$/,
inside: {
"punctuation": /^\$\{|\}$/,
"content": {
pattern: /\s*\S[\s\S]*/,
alias: "ftl",
inside: ftl
}
}
}
};
Prism2.hooks.add("before-tokenize", function(env) {
var pattern = RegExp(/<#--[\s\S]*?-->|<\/?[#@][a-zA-Z](?:<expr>)*?>|\$\{(?:<expr>)*?\}/.source.replace(/<expr>/g, function() {
return FTL_EXPR;
}), "gi");
Prism2.languages["markup-templating"].buildPlaceholders(env, "ftl", pattern);
});
Prism2.hooks.add("after-tokenize", function(env) {
Prism2.languages["markup-templating"].tokenizePlaceholders(env, "ftl");
});
})(Prism);
Prism.languages.gamemakerlanguage = Prism.languages.gml = Prism.languages.extend("clike", {
"keyword": /\b(?:break|case|continue|default|do|else|enum|exit|for|globalvar|if|repeat|return|switch|until|var|while)\b/,
"number": /(?:\b0x[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ulf]{0,4}/i,
"operator": /--|\+\+|[-+%/=]=?|!=|\*\*?=?|<[<=>]?|>[=>]?|&&?|\^\^?|\|\|?|~|\b(?:and|at|not|or|with|xor)\b/,
"constant": /\b(?:GM_build_date|GM_version|action_(?:continue|restart|reverse|stop)|all|gamespeed_(?:fps|microseconds)|global|local|noone|other|pi|pointer_(?:invalid|null)|self|timezone_(?:local|utc)|undefined|ev_(?:create|destroy|step|alarm|keyboard|mouse|collision|other|draw|draw_(?:begin|end|post|pre)|keypress|keyrelease|trigger|(?:left|middle|no|right)_button|(?:left|middle|right)_press|(?:left|middle|right)_release|mouse_(?:enter|leave|wheel_down|wheel_up)|global_(?:left|middle|right)_button|global_(?:left|middle|right)_press|global_(?:left|middle|right)_release|joystick(?:1|2)_(?:button1|button2|button3|button4|button5|button6|button7|button8|down|left|right|up)|outside|boundary|game_start|game_end|room_start|room_end|no_more_lives|animation_end|end_of_path|no_more_health|user\d|gui|gui_begin|gui_end|step_(?:begin|end|normal))|vk_(?:alt|anykey|backspace|control|delete|down|end|enter|escape|home|insert|left|nokey|pagedown|pageup|pause|printscreen|return|right|shift|space|tab|up|f\d|numpad\d|add|decimal|divide|lalt|lcontrol|lshift|multiply|ralt|rcontrol|rshift|subtract)|achievement_(?:filter_(?:all_players|favorites_only|friends_only)|friends_info|info|leaderboard_info|our_info|pic_loaded|show_(?:achievement|bank|friend_picker|leaderboard|profile|purchase_prompt|ui)|type_challenge|type_score_challenge)|asset_(?:font|object|path|room|script|shader|sound|sprite|tiles|timeline|unknown)|audio_(?:3d|falloff_(?:exponent_distance|exponent_distance_clamped|inverse_distance|inverse_distance_clamped|linear_distance|linear_distance_clamped|none)|mono|new_system|old_system|stereo)|bm_(?:add|complex|dest_alpha|dest_color|dest_colour|inv_dest_alpha|inv_dest_color|inv_dest_colour|inv_src_alpha|inv_src_color|inv_src_colour|max|normal|one|src_alpha|src_alpha_sat|src_color|src_colour|subtract|zero)|browser_(?:chrome|firefox|ie|ie_mobile|not_a_browser|opera|safari|safari_mobile|tizen|unknown|windows_store)|buffer_(?:bool|f16|f32|f64|fast|fixed|generalerror|grow|invalidtype|network|outofbounds|outofspace|s16|s32|s8|seek_end|seek_relative|seek_start|string|text|u16|u32|u64|u8|vbuffer|wrap)|c_(?:aqua|black|blue|dkgray|fuchsia|gray|green|lime|ltgray|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)|cmpfunc_(?:always|equal|greater|greaterequal|less|lessequal|never|notequal)|cr_(?:appstart|arrow|beam|cross|default|drag|handpoint|hourglass|none|size_all|size_nesw|size_ns|size_nwse|size_we|uparrow)|cull_(?:clockwise|counterclockwise|noculling)|device_(?:emulator|tablet)|device_ios_(?:ipad|ipad_retina|iphone|iphone5|iphone6|iphone6plus|iphone_retina|unknown)|display_(?:landscape|landscape_flipped|portrait|portrait_flipped)|dll_(?:cdecl|cdel|stdcall)|ds_type_(?:grid|list|map|priority|queue|stack)|ef_(?:cloud|ellipse|explosion|firework|flare|rain|ring|smoke|smokeup|snow|spark|star)|fa_(?:archive|bottom|center|directory|hidden|left|middle|readonly|right|sysfile|top|volumeid)|fb_login_(?:default|fallback_to_webview|forcing_safari|forcing_webview|no_fallback_to_webview|use_system_account)|iap_(?:available|canceled|ev_consume|ev_product|ev_purchase|ev_restore|ev_storeload|failed|purchased|refunded|status_available|status_loading|status_processing|status_restoring|status_unavailable|status_uninitialised|storeload_failed|storeload_ok|unavailable)|leaderboard_type_(?:number|time_mins_secs)|lighttype_(?:dir|point)|matrix_(?:projection|view|world)|mb_(?:any|left|middle|none|right)|network_(?:config_(?:connect_timeout|disable_reliable_udp|enable_reliable_udp|use_non_blocking_socket)|socket_(?:bluetooth|tcp|udp)|type_(?:connect|data|disconnect|non_blocking_connect))|of_challenge_(?:lose|tie|win)|os_(?:android|ios|linux|macosx|ps3|ps4|psvita|unknown|uwp|win32|win8native|windows|winphone|xboxone)|phy_debug_render_(?:aabb|collision_pairs|coms|core_shapes|joints|obb|shapes)|phy_joint_(?:anchor_1_x|anchor_1_y|anchor_2_x|anchor_2_y|angle|angle_limits|damping_ratio|frequency|length_1|length_2|lower_angle_limit|max_force|max_length|max_motor_force|max_motor_torque|max_torque|motor_force|motor_speed|motor_torque|reaction_force_x|reaction_force_y|reaction_torque|speed|translation|upper_angle_limit)|phy_particle_data_flag_(?:category|color|colour|position|typeflags|velocity)|phy_particle_flag_(?:colormixing|colourmixing|elastic|powder|spring|tensile|viscous|wall|water|zombie)|phy_particle_group_flag_(?:rigid|solid)|pr_(?:linelist|linestrip|pointlist|trianglefan|trianglelist|trianglestrip)|ps_(?:distr|shape)_(?:diamond|ellipse|gaussian|invgaussian|line|linear|rectangle)|pt_shape_(?:circle|cloud|disk|explosion|flare|line|pixel|ring|smoke|snow|spark|sphere|square|star)|ty_(?:real|string)|gp_(?:face\d|axislh|axislv|axisrh|axisrv|padd|padl|padr|padu|select|shoulderl|shoulderlb|shoulderr|shoulderrb|start|stickl|stickr)|lb_disp_(?:none|numeric|time_ms|time_sec)|lb_sort_(?:ascending|descending|none)|ov_(?:achievements|community|friends|gamegroup|players|settings)|ugc_(?:filetype_(?:community|microtrans)|list_(?:Favorited|Followed|Published|Subscribed|UsedOrPlayed|VotedDown|VotedOn|VotedUp|WillVoteLater)|match_(?:AllGuides|Artwork|Collections|ControllerBindings|IntegratedGuides|Items|Items_Mtx|Items_ReadyToUse|Screenshots|UsableInGame|Videos|WebGuides)|query_(?:AcceptedForGameRankedByAcceptanceDate|CreatedByFriendsRankedByPublicationDate|FavoritedByFriendsRankedByPublicationDate|NotYetRated)|query_RankedBy(?:NumTimesReported|PublicationDate|TextSearch|TotalVotesAsc|Trend|Vote|VotesUp)|result_success|sortorder_CreationOrder(?:Asc|Desc)|sortorder_(?:ForModeration|LastUpdatedDesc|SubscriptionDateDesc|TitleAsc|VoteScoreDesc)|visibility_(?:friends_only|private|public))|vertex_usage_(?:binormal|blendindices|blendweight|color|colour|depth|fog|normal|position|psize|sample|tangent|texcoord|textcoord)|vertex_type_(?:float\d|color|colour|ubyte4)|input_type|layerelementtype_(?:background|instance|oldtilemap|particlesystem|sprite|tile|tilemap|undefined)|se_(?:chorus|compressor|echo|equalizer|flanger|gargle|none|reverb)|text_type|tile_(?:flip|index_mask|mirror|rotate)|(?:obj|rm|scr|spr)\w+)\b/,
"variable": /\b(?:alarm|application_surface|async_load|background_(?:alpha|blend|color|colour|foreground|height|hspeed|htiled|index|showcolor|showcolour|visible|vspeed|vtiled|width|x|xscale|y|yscale)|bbox_(?:bottom|left|right|top)|browser_(?:height|width)|caption_(?:health|lives|score)|current_(?:day|hour|minute|month|second|time|weekday|year)|cursor_sprite|debug_mode|delta_time|direction|display_aa|error_(?:last|occurred)|event_(?:action|number|object|type)|fps|fps_real|friction|game_(?:display|project|save)_(?:id|name)|gamemaker_(?:pro|registered|version)|gravity|gravity_direction|(?:h|v)speed|health|iap_data|id|image_(?:alpha|angle|blend|depth|index|number|speed|xscale|yscale)|instance_(?:count|id)|keyboard_(?:key|lastchar|lastkey|string)|layer|lives|mask_index|mouse_(?:button|lastbutton|x|y)|object_index|os_(?:browser|device|type|version)|path_(?:endaction|index|orientation|position|positionprevious|scale|speed)|persistent|phy_(?:rotation|(?:col_normal|collision|com|linear_velocity|position|speed)_(?:x|y)|angular_(?:damping|velocity)|position_(?:x|y)previous|speed|linear_damping|bullet|fixed_rotation|active|mass|inertia|dynamic|kinematic|sleeping|collision_points)|pointer_(?:invalid|null)|room|room_(?:caption|first|height|last|persistent|speed|width)|score|secure_mode|show_(?:health|lives|score)|solid|speed|sprite_(?:height|index|width|xoffset|yoffset)|temp_directory|timeline_(?:index|loop|position|running|speed)|transition_(?:color|kind|steps)|undefined|view_(?:angle|current|enabled|(?:h|v)(?:border|speed)|(?:h|w|x|y)port|(?:h|w|x|y)view|object|surface_id|visible)|visible|webgl_enabled|working_directory|(?:x|y)(?:previous|start)|x|y|argument(?:_relitive|_count|\d)|argument|global|local|other|self)\b/
});
Prism.languages.gap = {
"shell": {
pattern: /^gap>[\s\S]*?(?=^gap>|$(?![\s\S]))/m,
greedy: true,
inside: {
"gap": {
pattern: /^(gap>).+(?:(?:\r(?:\n|(?!\n))|\n)>.*)*/,
lookbehind: true,
inside: null
},
"punctuation": /^gap>/
}
},
"comment": {
pattern: /#.*/,
greedy: true
},
"string": {
pattern: /(^|[^\\'"])(?:'(?:[^\r\n\\']|\\.){1,10}'|"(?:[^\r\n\\"]|\\.)*"(?!")|"""[\s\S]*?""")/,
lookbehind: true,
greedy: true,
inside: {
"continuation": {
pattern: /([\r\n])>/,
lookbehind: true,
alias: "punctuation"
}
}
},
"keyword": /\b(?:Assert|Info|IsBound|QUIT|TryNextMethod|Unbind|and|atomic|break|continue|do|elif|else|end|fi|for|function|if|in|local|mod|not|od|or|quit|readonly|readwrite|rec|repeat|return|then|until|while)\b/,
"boolean": /\b(?:false|true)\b/,
"function": /\b[a-z_]\w*(?=\s*\()/i,
"number": {
pattern: /(^|[^\w.]|\.\.)(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?:_[a-z]?)?(?=$|[^\w.]|\.\.)/,
lookbehind: true
},
"continuation": {
pattern: /([\r\n])>/,
lookbehind: true,
alias: "punctuation"
},
"operator": /->|[-+*/^~=!]|<>|[<>]=?|:=|\.\./,
"punctuation": /[()[\]{},;.:]/
};
Prism.languages.gap.shell.inside.gap.inside = Prism.languages.gap;
Prism.languages.gcode = {
"comment": /;.*|\B\(.*?\)\B/,
"string": {
pattern: /"(?:""|[^"])*"/,
greedy: true
},
"keyword": /\b[GM]\d+(?:\.\d+)?\b/,
"property": /\b[A-Z]/,
"checksum": {
pattern: /(\*)\d+/,
lookbehind: true,
alias: "number"
},
"punctuation": /[:*]/
};
Prism.languages.gdscript = {
"comment": /#.*/,
"string": {
pattern: /@?(?:("|')(?:(?!\1)[^\n\\]|\\[\s\S])*\1(?!"|')|"""(?:[^\\]|\\[\s\S])*?""")/,
greedy: true
},
"class-name": {
pattern: /(^(?:class|class_name|extends)[ \t]+|^export\([ \t]*|\bas[ \t]+|(?:\b(?:const|var)[ \t]|[,(])[ \t]*\w+[ \t]*:[ \t]*|->[ \t]*)[a-zA-Z_]\w*/m,
lookbehind: true
},
"keyword": /\b(?:and|as|assert|break|breakpoint|class|class_name|const|continue|elif|else|enum|export|extends|for|func|if|in|is|master|mastersync|match|not|null|onready|or|pass|preload|puppet|puppetsync|remote|remotesync|return|self|setget|signal|static|tool|var|while|yield)\b/,
"function": /\b[a-z_]\w*(?=[ \t]*\()/i,
"variable": /\$\w+/,
"number": [
/\b0b[01_]+\b|\b0x[\da-fA-F_]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.[\d_]+)(?:e[+-]?[\d_]+)?\b/,
/\b(?:INF|NAN|PI|TAU)\b/
],
"constant": /\b[A-Z][A-Z_\d]*\b/,
"boolean": /\b(?:false|true)\b/,
"operator": /->|:=|&&|\|\||<<|>>|[-+*/%&|!<>=]=?|[~^]/,
"punctuation": /[.:,;()[\]{}]/
};
Prism.languages.gedcom = {
"line-value": {
pattern: /(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?\w+ ).+/m,
lookbehind: true,
inside: {
"pointer": {
pattern: /^@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@$/,
alias: "variable"
}
}
},
"record": {
pattern: /(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?)\w+/m,
lookbehind: true,
alias: "tag"
},
"level": {
pattern: /(^[\t ]*)\d+/m,
lookbehind: true,
alias: "number"
},
"pointer": {
pattern: /@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@/,
alias: "variable"
}
};
Prism.languages.gettext = {
"comment": [
{
pattern: /# .*/,
greedy: true,
alias: "translator-comment"
},
{
pattern: /#\..*/,
greedy: true,
alias: "extracted-comment"
},
{
pattern: /#:.*/,
greedy: true,
alias: "reference-comment"
},
{
pattern: /#,.*/,
greedy: true,
alias: "flag-comment"
},
{
pattern: /#\|.*/,
greedy: true,
alias: "previously-untranslated-comment"
},
{
pattern: /#.*/,
greedy: true
}
],
"string": {
pattern: /(^|[^\\])"(?:[^"\\]|\\.)*"/,
lookbehind: true,
greedy: true
},
"keyword": /^msg(?:ctxt|id|id_plural|str)\b/m,
"number": /\b\d+\b/,
"punctuation": /[\[\]]/
};
Prism.languages.po = Prism.languages.gettext;
(function(Prism2) {
var tableRow = /(?:\r?\n|\r)[ \t]*\|.+\|(?:(?!\|).)*/.source;
Prism2.languages.gherkin = {
"pystring": {
pattern: /("""|''')[\s\S]+?\1/,
alias: "string"
},
"comment": {
pattern: /(^[ \t]*)#.*/m,
lookbehind: true
},
"tag": {
pattern: /(^[ \t]*)@\S*/m,
lookbehind: true
},
"feature": {
pattern: /((?:^|\r?\n|\r)[ \t]*)(?:Ability|Ahoy matey!|Arwedd|Aspekt|Besigheid Behoefte|Business Need|Caracteristica|Característica|Egenskab|Egenskap|Eiginleiki|Feature|Fīča|Fitur|Fonctionnalité|Fonksyonalite|Funcionalidade|Funcionalitat|Functionalitate|Funcţionalitate|Funcționalitate|Functionaliteit|Fungsi|Funkcia|Funkcija|Funkcionalitāte|Funkcionalnost|Funkcja|Funksie|Funktionalität|Funktionalitéit|Funzionalità|Hwaet|Hwæt|Jellemző|Karakteristik|Lastnost|Mak|Mogucnost|laH|Mogućnost|Moznosti|Možnosti|OH HAI|Omadus|Ominaisuus|Osobina|Özellik|Potrzeba biznesowa|perbogh|poQbogh malja'|Požadavek|Požiadavka|Pretty much|Qap|Qu'meH 'ut|Savybė|Tính năng|Trajto|Vermoë|Vlastnosť|Właściwość|Značilnost|Δυνατότητα|Λειτουργία|Могућност|Мөмкинлек|Особина|Свойство|Үзенчәлеклелек|Функционал|Функционалност|Функция|Функціонал|תכונה|خاصية|خصوصیت|صلاحیت|کاروبار کی ضرورت|وِیژگی|रूप लेख|ਖਾਸੀਅਤ|ਨਕਸ਼ ਨੁਹਾਰ|ਮੁਹਾਂਦਰਾ|గుణము|ಹೆಚ್ಚಳ|ความต้องการทางธุรกิจ|ความสามารถ|โครงหลัก|기능|フィーチャ|功能|機能):(?:[^:\r\n]+(?:\r?\n|\r|$))*/,
lookbehind: true,
inside: {
"important": {
pattern: /(:)[^\r\n]+/,
lookbehind: true
},
"keyword": /[^:\r\n]+:/
}
},
"scenario": {
pattern: /(^[ \t]*)(?:Abstract Scenario|Abstrakt Scenario|Achtergrond|Aer|Ær|Agtergrond|All y'all|Antecedentes|Antecedents|Atburðarás|Atburðarásir|Awww, look mate|B4|Background|Baggrund|Bakgrund|Bakgrunn|Bakgrunnur|Beispiele|Beispiller|Bối cảnh|Cefndir|Cenario|Cenário|Cenario de Fundo|Cenário de Fundo|Cenarios|Cenários|Contesto|Context|Contexte|Contexto|Conto|Contoh|Contone|Dæmi|Dasar|Dead men tell no tales|Delineacao do Cenario|Delineação do Cenário|Dis is what went down|Dữ liệu|Dyagram Senaryo|Dyagram senaryo|Egzanp|Ejemplos|Eksempler|Ekzemploj|Enghreifftiau|Esbozo do escenario|Escenari|Escenario|Esempi|Esquema de l'escenari|Esquema del escenario|Esquema do Cenario|Esquema do Cenário|EXAMPLZ|Examples|Exempel|Exemple|Exemples|Exemplos|First off|Fono|Forgatókönyv|Forgatókönyv vázlat|Fundo|Geçmiş|Grundlage|Hannergrond|ghantoH|Háttér|Heave to|Istorik|Juhtumid|Keadaan|Khung kịch bản|Khung tình huống|Kịch bản|Koncept|Konsep skenario|Kontèks|Kontekst|Kontekstas|Konteksts|Kontext|Konturo de la scenaro|Latar Belakang|lut chovnatlh|lut|lutmey|Lýsing Atburðarásar|Lýsing Dæma|MISHUN SRSLY|MISHUN|Menggariskan Senario|mo'|Náčrt Scenára|Náčrt Scénáře|Náčrt Scenáru|Oris scenarija|Örnekler|Osnova|Osnova Scenára|Osnova scénáře|Osnutek|Ozadje|Paraugs|Pavyzdžiai|Példák|Piemēri|Plan du scénario|Plan du Scénario|Plan Senaryo|Plan senaryo|Plang vum Szenario|Pozadí|Pozadie|Pozadina|Príklady|Příklady|Primer|Primeri|Primjeri|Przykłady|Raamstsenaarium|Reckon it's like|Rerefons|Scenár|Scénář|Scenarie|Scenarij|Scenarijai|Scenarijaus šablonas|Scenariji|Scenārijs|Scenārijs pēc parauga|Scenarijus|Scenario|Scénario|Scenario Amlinellol|Scenario Outline|Scenario Template|Scenariomal|Scenariomall|Scenarios|Scenariu|Scenariusz|Scenaro|Schema dello scenario|Se ðe|Se the|Se þe|Senario|Senaryo Deskripsyon|Senaryo deskripsyon|Senaryo|Senaryo taslağı|Shiver me timbers|Situācija|Situai|Situasie Uiteensetting|Situasie|Skenario konsep|Skenario|Skica|Structura scenariu|Structură scenariu|Struktura scenarija|Stsenaarium|Swa hwaer swa|Swa|Swa hwær swa|Szablon scenariusza|Szenario|Szenariogrundriss|Tapaukset|Tapaus|Tapausaihio|Taust|Tausta|Template Keadaan|Template Senario|Template Situai|The thing of it is|Tình huống|Variantai|Voorbeelde|Voorbeelden|Wharrimean is|Yo-ho-ho|You'll wanna|Założenia|Παραδείγματα|Περιγραφή Σεναρίου|Σενάρια|Σενάριο|Υπόβαθρο|Кереш|Контекст|Концепт|Мисаллар|Мисоллар|Основа|Передумова|Позадина|Предистория|Предыстория|Приклади|Пример|Примери|Примеры|Рамка на сценарий|Скица|Структура сценарија|Структура сценария|Структура сценарію|Сценарий|Сценарий структураси|Сценарийның төзелеше|Сценарији|Сценарио|Сценарій|Тарих|Үрнәкләр|דוגמאות|רקע|תבנית תרחיש|תרחיש|الخلفية|الگوی سناریو|امثلة|پس منظر|زمینه|سناریو|سيناريو|سيناريو مخطط|مثالیں|منظر نامے کا خاکہ|منظرنامہ|نمونه ها|उदाहरण|परिदृश्य|परिदृश्य रूपरेखा|पृष्ठभूमि|ਉਦਾਹਰਨਾਂ|ਪਟਕਥਾ|ਪਟਕਥਾ ਢਾਂਚਾ|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਿਛੋਕੜ|ఉదాహరణలు|కథనం|నేపథ్యం|సన్నివేశం|ಉದಾಹರಣೆಗಳು|ಕಥಾಸಾರಾಂಶ|ವಿವರಣೆ|ಹಿನ್ನೆಲೆ|โครงสร้างของเหตุการณ์|ชุดของตัวอย่าง|ชุดของเหตุการณ์|แนวคิด|สรุปเหตุการณ์|เหตุการณ์|배경|시나리오|시나리오 개요|예|サンプル|シナリオ|シナリオアウトライン|シナリオテンプレ|シナリオテンプレート|テンプレ|例|例子|剧本|剧本大纲|劇本|劇本大綱|场景|场景大纲|場景|場景大綱|背景):[^:\r\n]*/m,
lookbehind: true,
inside: {
"important": {
pattern: /(:)[^\r\n]*/,
lookbehind: true
},
"keyword": /[^:\r\n]+:/
}
},
"table-body": {
pattern: RegExp("(" + tableRow + ")(?:" + tableRow + ")+"),
lookbehind: true,
inside: {
"outline": {
pattern: /<[^>]+>/,
alias: "variable"
},
"td": {
pattern: /\s*[^\s|][^|]*/,
alias: "string"
},
"punctuation": /\|/
}
},
"table-head": {
pattern: RegExp(tableRow),
inside: {
"th": {
pattern: /\s*[^\s|][^|]*/,
alias: "variable"
},
"punctuation": /\|/
}
},
"atrule": {
pattern: /(^[ \t]+)(?:'a|'ach|'ej|7|a|A také|A taktiež|A tiež|A zároveň|Aber|Ac|Adott|Akkor|Ak|Aleshores|Ale|Ali|Allora|Alors|Als|Ama|Amennyiben|Amikor|Ampak|an|AN|Ananging|And y'all|And|Angenommen|Anrhegedig a|An|Apabila|Atès|Atesa|Atunci|Avast!|Aye|A|awer|Bagi|Banjur|Bet|Biết|Blimey!|Buh|But at the end of the day I reckon|But y'all|But|BUT|Cal|Când|Cand|Cando|Ce|Cuando|Če|Ða ðe|Ða|Dadas|Dada|Dados|Dado|DaH ghu' bejlu'|dann|Dann|Dano|Dan|Dar|Dat fiind|Data|Date fiind|Date|Dati fiind|Dati|Daţi fiind|Dați fiind|DEN|Dato|De|Den youse gotta|Dengan|Diberi|Diyelim ki|Donada|Donat|Donitaĵo|Do|Dun|Duota|Ðurh|Eeldades|Ef|Eğer ki|Entao|Então|Entón|E|En|Entonces|Epi|És|Etant donnée|Etant donné|Et|Étant données|Étant donnée|Étant donné|Etant données|Etant donnés|Étant donnés|Fakat|Gangway!|Gdy|Gegeben seien|Gegeben sei|Gegeven|Gegewe|ghu' noblu'|Gitt|Given y'all|Given|Givet|Givun|Ha|Cho|I CAN HAZ|In|Ir|It's just unbelievable|I|Ja|Jeśli|Jeżeli|Kad|Kada|Kadar|Kai|Kaj|Když|Keď|Kemudian|Ketika|Khi|Kiedy|Ko|Kuid|Kui|Kun|Lan|latlh|Le sa a|Let go and haul|Le|Lè sa a|Lè|Logo|Lorsqu'<|Lorsque|mä|Maar|Mais|Mając|Ma|Majd|Maka|Manawa|Mas|Men|Menawa|Mutta|Nalika|Nalikaning|Nanging|Når|När|Nato|Nhưng|Niin|Njuk|O zaman|Och|Og|Oletetaan|Ond|Onda|Oraz|Pak|Pero|Però|Podano|Pokiaľ|Pokud|Potem|Potom|Privzeto|Pryd|Quan|Quand|Quando|qaSDI'|Så|Sed|Se|Siis|Sipoze ke|Sipoze Ke|Sipoze|Si|Şi|Și|Soit|Stel|Tada|Tad|Takrat|Tak|Tapi|Ter|Tetapi|Tha the|Tha|Then y'all|Then|Thì|Thurh|Toda|Too right|Un|Und|ugeholl|Và|vaj|Vendar|Ve|wann|Wanneer|WEN|Wenn|When y'all|When|Wtedy|Wun|Y'know|Yeah nah|Yna|Youse know like when|Youse know when youse got|Y|Za predpokladu|Za předpokladu|Zadan|Zadani|Zadano|Zadate|Zadato|Zakładając|Zaradi|Zatati|Þa þe|Þa|Þá|Þegar|Þurh|Αλλά|Δεδομένου|Και|Όταν|Τότε|А також|Агар|Але|Али|Аммо|А|Әгәр|Әйтик|Әмма|Бирок|Ва|Вә|Дадено|Дано|Допустим|Если|Задате|Задати|Задато|И|І|К тому же|Када|Кад|Когато|Когда|Коли|Ләкин|Лекин|Нәтиҗәдә|Нехай|Но|Онда|Припустимо, що|Припустимо|Пусть|Также|Та|Тогда|Тоді|То|Унда|Һәм|Якщо|אבל|אזי|אז|בהינתן|וגם|כאשר|آنگاه|اذاً|اگر|اما|اور|با فرض|بالفرض|بفرض|پھر|تب|ثم|جب|عندما|فرض کیا|لكن|لیکن|متى|هنگامی|و|अगर|और|कदा|किन्तु|चूंकि|जब|तथा|तदा|तब|परन्तु|पर|यदि|ਅਤੇ|ਜਦੋਂ|ਜਿਵੇਂ ਕਿ|ਜੇਕਰ|ਤਦ|ਪਰ|అప్పుడు|ఈ పరిస్థితిలో|కాని|చెప్పబడినది|మరియు|ಆದರೆ|ನಂತರ|ನೀಡಿದ|ಮತ್ತು|ಸ್ಥಿತಿಯನ್ನು|กำหนดให้|ดังนั้น|แต่|เมื่อ|และ|그러면<|그리고<|단<|만약<|만일<|먼저<|조건<|하지만<|かつ<|しかし<|ただし<|ならば<|もし<|並且<|但し<|但是<|假如<|假定<|假設<|假设<|前提<|同时<|同時<|并且<|当<|當<|而且<|那么<|那麼<)(?=[ \t])/m,
lookbehind: true
},
"string": {
pattern: /"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,
inside: {
"outline": {
pattern: /<[^>]+>/,
alias: "variable"
}
}
},
"outline": {
pattern: /<[^>]+>/,
alias: "variable"
}
};
})(Prism);
Prism.languages.git = {
"comment": /^#.*/m,
"deleted": /^[-–].*/m,
"inserted": /^\+.*/m,
"string": /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
"command": {
pattern: /^.*\$ git .*$/m,
inside: {
"parameter": /\s--?\w+/
}
},
"coord": /^@@.*@@$/m,
"commit-sha1": /^commit \w{40}$/m
};
Prism.languages.glsl = Prism.languages.extend("c", {
"keyword": /\b(?:active|asm|atomic_uint|attribute|[ibdu]?vec[234]|bool|break|buffer|case|cast|centroid|class|coherent|common|const|continue|d?mat[234](?:x[234])?|default|discard|do|double|else|enum|extern|external|false|filter|fixed|flat|float|for|fvec[234]|goto|half|highp|hvec[234]|[iu]?sampler2DMS(?:Array)?|[iu]?sampler2DRect|[iu]?samplerBuffer|[iu]?samplerCube|[iu]?samplerCubeArray|[iu]?sampler[123]D|[iu]?sampler[12]DArray|[iu]?image2DMS(?:Array)?|[iu]?image2DRect|[iu]?imageBuffer|[iu]?imageCube|[iu]?imageCubeArray|[iu]?image[123]D|[iu]?image[12]DArray|if|in|inline|inout|input|int|interface|invariant|layout|long|lowp|mediump|namespace|noinline|noperspective|out|output|partition|patch|precise|precision|public|readonly|resource|restrict|return|sample|sampler[12]DArrayShadow|sampler[12]DShadow|sampler2DRectShadow|sampler3DRect|samplerCubeArrayShadow|samplerCubeShadow|shared|short|sizeof|smooth|static|struct|subroutine|superp|switch|template|this|true|typedef|uint|uniform|union|unsigned|using|varying|void|volatile|while|writeonly)\b/
});
Prism.languages.gn = {
"comment": {
pattern: /#.*/,
greedy: true
},
"string-literal": {
pattern: /(^|[^\\"])"(?:[^\r\n"\\]|\\.)*"/,
lookbehind: true,
greedy: true,
inside: {
"interpolation": {
pattern: /((?:^|[^\\])(?:\\{2})*)\$(?:\{[\s\S]*?\}|[a-zA-Z_]\w*|0x[a-fA-F0-9]{2})/,
lookbehind: true,
inside: {
"number": /^\$0x[\s\S]{2}$/,
"variable": /^\$\w+$/,
"interpolation-punctuation": {
pattern: /^\$\{|\}$/,
alias: "punctuation"
},
"expression": {
pattern: /[\s\S]+/,
inside: null
}
}
},
"string": /[\s\S]+/
}
},
"keyword": /\b(?:else|if)\b/,
"boolean": /\b(?:false|true)\b/,
"builtin-function": {
pattern: /\b(?:assert|defined|foreach|import|pool|print|template|tool|toolchain)(?=\s*\()/i,
alias: "keyword"
},
"function": /\b[a-z_]\w*(?=\s*\()/i,
"constant": /\b(?:current_cpu|current_os|current_toolchain|default_toolchain|host_cpu|host_os|root_build_dir|root_gen_dir|root_out_dir|target_cpu|target_gen_dir|target_os|target_out_dir)\b/,
"number": /-?\b\d+\b/,
"operator": /[-+!=<>]=?|&&|\|\|/,
"punctuation": /[(){}[\],.]/
};
Prism.languages.gn["string-literal"].inside["interpolation"].inside["expression"].inside = Prism.languages.gn;
Prism.languages.gni = Prism.languages.gn;
Prism.languages["linker-script"] = {
"comment": {
pattern: /(^|\s)\/\*[\s\S]*?(?:$|\*\/)/,
lookbehind: true,
greedy: true
},
"identifier": {
pattern: /"[^"\r\n]*"/,
greedy: true
},
"location-counter": {
pattern: /\B\.\B/,
alias: "important"
},
"section": {
pattern: /(^|[^\w*])\.\w+\b/,
lookbehind: true,
alias: "keyword"
},
"function": /\b[A-Z][A-Z_]*(?=\s*\()/,
"number": /\b(?:0[xX][a-fA-F0-9]+|\d+)[KM]?\b/,
"operator": />>=?|<<=?|->|\+\+|--|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?/,
"punctuation": /[(){},;]/
};
Prism.languages["ld"] = Prism.languages["linker-script"];
Prism.languages.go = Prism.languages.extend("clike", {
"string": {
pattern: /(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,
lookbehind: true,
greedy: true
},
"keyword": /\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,
"boolean": /\b(?:_|false|iota|nil|true)\b/,
"number": [
/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,
/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,
/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i
],
"operator": /[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,
"builtin": /\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/
});
Prism.languages.insertBefore("go", "string", {
"char": {
pattern: /'(?:\\.|[^'\\\r\n]){0,10}'/,
greedy: true
}
});
delete Prism.languages.go["class-name"];
Prism.languages["go-mod"] = Prism.languages["go-module"] = {
"comment": {
pattern: /\/\/.*/,
greedy: true
},
"version": {
pattern: /(^|[\s()[\],])v\d+\.\d+\.\d+(?:[+-][-+.\w]*)?(?![^\s()[\],])/,
lookbehind: true,
alias: "number"
},
"go-version": {
pattern: /((?:^|\s)go\s+)\d+(?:\.\d+){1,2}/,
lookbehind: true,
alias: "number"
},
"keyword": {
pattern: /^([ \t]*)(?:exclude|go|module|replace|require|retract)\b/m,
lookbehind: true
},
"operator": /=>/,
"punctuation": /[()[\],]/
};
(function(Prism2) {
var interpolation = {
pattern: /((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,
lookbehind: true,
inside: {
"interpolation-punctuation": {
pattern: /^\$\{?|\}$/,
alias: "punctuation"
},
"expression": {
pattern: /[\s\S]+/,
inside: null
}
}
};
Prism2.languages.gradle = Prism2.languages.extend("clike", {
"string": {
pattern: /'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,
greedy: true
},
"keyword": /\b(?:apply|def|dependencies|else|if|implementation|import|plugin|plugins|project|repositories|repository|sourceSets|tasks|val)\b/,
"number": /\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,
"operator": {
pattern: /(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,
lookbehind: true
},
"punctuation": /\.+|[{}[\];(),:$]/
});
Prism2.languages.insertBefore("gradle", "string", {
"shebang": {
pattern: /#!.+/,
alias: "comment",
greedy: true
},
"interpolation-string": {
pattern: /"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,
greedy: true,
inside: {
"interpolation": interpolation,
"string": /[\s\S]+/
}
}
});
Prism2.languages.insertBefore("gradle", "punctuation", {
"spock-block": /\b(?:and|cleanup|expect|given|setup|then|when|where):/
});
Prism2.languages.insertBefore("gradle", "function", {
"annotation": {
pattern: /(^|[^.])@\w+/,
lookbehind: true,
alias: "punctuation"
}
});
interpolation.inside.expression.inside = Prism2.languages.gradle;
})(Prism);
Prism.languages.graphql = {
"comment": /#.*/,
"description": {
pattern: /(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,
greedy: true,
alias: "string",
inside: {
"language-markdown": {
pattern: /(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,
lookbehind: true,
inside: Prism.languages.markdown
}
}
},
"string": {
pattern: /"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,
greedy: true
},
"number": /(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,
"boolean": /\b(?:false|true)\b/,
"variable": /\$[a-z_]\w*/i,
"directive": {
pattern: /@[a-z_]\w*/i,
alias: "function"
},
"attr-name": {
pattern: /\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,
greedy: true
},
"atom-input": {
pattern: /\b[A-Z]\w*Input\b/,
alias: "class-name"
},
"scalar": /\b(?:Boolean|Float|ID|Int|String)\b/,
"constant": /\b[A-Z][A-Z_\d]*\b/,
"class-name": {
pattern: /(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,
lookbehind: true
},
"fragment": {
pattern: /(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,
lookbehind: true,
alias: "function"
},
"definition-mutation": {
pattern: /(\bmutation\s+)[a-zA-Z_]\w*/,
lookbehind: true,
alias: "function"
},
"definition-query": {
pattern: /(\bquery\s+)[a-zA-Z_]\w*/,
lookbehind: true,
alias: "function"
},
"keyword": /\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,
"operator": /[!=|&]|\.{3}/,
"property-query": /\w+(?=\s*\()/,
"object": /\w+(?=\s*\{)/,
"punctuation": /[!(){}\[\]:=,]/,
"property": /\w+/
};
Prism.hooks.add("after-tokenize", function afterTokenizeGraphql(env) {
if (env.language !== "graphql") {
return;
}
var validTokens = env.tokens.filter(function(token) {
return typeof token !== "string" && token.type !== "comment" && token.type !== "scalar";
});
var currentIndex = 0;
function getToken(offset2) {
return validTokens[currentIndex + offset2];
}
function isTokenType(types, offset2) {
offset2 = offset2 || 0;
for (var i2 = 0; i2 < types.length; i2++) {
var token = getToken(i2 + offset2);
if (!token || token.type !== types[i2]) {
return false;
}
}
return true;
}
function findClosingBracket(open, close) {
var stackHeight = 1;
for (var i2 = currentIndex; i2 < validTokens.length; i2++) {
var token = validTokens[i2];
var content = token.content;
if (token.type === "punctuation" && typeof content === "string") {
if (open.test(content)) {
stackHeight++;
} else if (close.test(content)) {
stackHeight--;
if (stackHeight === 0) {
return i2;
}
}
}
}
return -1;
}
function addAlias(token, alias) {
var aliases = token.alias;
if (!aliases) {
token.alias = aliases = [];
} else if (!Array.isArray(aliases)) {
token.alias = aliases = [aliases];
}
aliases.push(alias);
}
for (; currentIndex < validTokens.length; ) {
var startToken = validTokens[currentIndex++];
if (startToken.type === "keyword" && startToken.content === "mutation") {
var inputVariables = [];
if (isTokenType(["definition-mutation", "punctuation"]) && getToken(1).content === "(") {
currentIndex += 2;
var definitionEnd = findClosingBracket(/^\($/, /^\)$/);
if (definitionEnd === -1) {
continue;
}
for (; currentIndex < definitionEnd; currentIndex++) {
var t = getToken(0);
if (t.type === "variable") {
addAlias(t, "variable-input");
inputVariables.push(t.content);
}
}
currentIndex = definitionEnd + 1;
}
if (isTokenType(["punctuation", "property-query"]) && getToken(0).content === "{") {
currentIndex++;
addAlias(getToken(0), "property-mutation");
if (inputVariables.length > 0) {
var mutationEnd = findClosingBracket(/^\{$/, /^\}$/);
if (mutationEnd === -1) {
continue;
}
for (var i = currentIndex; i < mutationEnd; i++) {
var varToken = validTokens[i];
if (varToken.type === "variable" && inputVariables.indexOf(varToken.content) >= 0) {
addAlias(varToken, "variable-input");
}
}
}
}
}
}
});
(function(Prism2) {
var interpolation = {
pattern: /((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,
lookbehind: true,
inside: {
"interpolation-punctuation": {
pattern: /^\$\{?|\}$/,
alias: "punctuation"
},
"expression": {
pattern: /[\s\S]+/,
inside: null
}
}
};
Prism2.languages.groovy = Prism2.languages.extend("clike", {
"string": {
pattern: /'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,
greedy: true
},
"keyword": /\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,
"number": /\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,
"operator": {
pattern: /(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,
lookbehind: true
},
"punctuation": /\.+|[{}[\];(),:$]/
});
Prism2.languages.insertBefore("groovy", "string", {
"shebang": {
pattern: /#!.+/,
alias: "comment",
greedy: true
},
"interpolation-string": {
pattern: /"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,
greedy: true,
inside: {
"interpolation": interpolation,
"string": /[\s\S]+/
}
}
});
Prism2.languages.insertBefore("groovy", "punctuation", {
"spock-block": /\b(?:and|cleanup|expect|given|setup|then|when|where):/
});
Prism2.languages.insertBefore("groovy", "function", {
"annotation": {
pattern: /(^|[^.])@\w+/,
lookbehind: true,
alias: "punctuation"
}
});
interpolation.inside.expression.inside = Prism2.languages.groovy;
})(Prism);
(function(Prism2) {
Prism2.languages.haml = {
"multiline-comment": {
pattern: /((?:^|\r?\n|\r)([\t ]*))(?:\/|-#).*(?:(?:\r?\n|\r)\2[\t ].+)*/,
lookbehind: true,
alias: "comment"
},
"multiline-code": [
{
pattern: /((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*,[\t ]*(?:(?:\r?\n|\r)\2[\t ].*,[\t ]*)*(?:(?:\r?\n|\r)\2[\t ].+)/,
lookbehind: true,
inside: Prism2.languages.ruby
},
{
pattern: /((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*\|[\t ]*(?:(?:\r?\n|\r)\2[\t ].*\|[\t ]*)*/,
lookbehind: true,
inside: Prism2.languages.ruby
}
],
"filter": {
pattern: /((?:^|\r?\n|\r)([\t ]*)):[\w-]+(?:(?:\r?\n|\r)(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/,
lookbehind: true,
inside: {
"filter-name": {
pattern: /^:[\w-]+/,
alias: "symbol"
}
}
},
"markup": {
pattern: /((?:^|\r?\n|\r)[\t ]*)<.+/,
lookbehind: true,
inside: Prism2.languages.markup
},
"doctype": {
pattern: /((?:^|\r?\n|\r)[\t ]*)!!!(?: .+)?/,
lookbehind: true
},
"tag": {
pattern: /((?:^|\r?\n|\r)[\t ]*)[%.#][\w\-#.]*[\w\-](?:\([^)]+\)|\{(?:\{[^}]+\}|[^{}])+\}|\[[^\]]+\])*[\/<>]*/,
lookbehind: true,
inside: {
"attributes": [
{
pattern: /(^|[^#])\{(?:\{[^}]+\}|[^{}])+\}/,
lookbehind: true,
inside: Prism2.languages.ruby
},
{
pattern: /\([^)]+\)/,
inside: {
"attr-value": {
pattern: /(=\s*)(?:"(?:\\.|[^\\"\r\n])*"|[^)\s]+)/,
lookbehind: true
},
"attr-name": /[\w:-]+(?=\s*!?=|\s*[,)])/,
"punctuation": /[=(),]/
}
},
{
pattern: /\[[^\]]+\]/,
inside: Prism2.languages.ruby
}
],
"punctuation": /[<>]/
}
},
"code": {
pattern: /((?:^|\r?\n|\r)[\t ]*(?:[~-]|[&!]?=)).+/,
lookbehind: true,
inside: Prism2.languages.ruby
},
"interpolation": {
pattern: /#\{[^}]+\}/,
inside: {
"delimiter": {
pattern: /^#\{|\}$/,
alias: "punctuation"
},
"ruby": {
pattern: /[\s\S]+/,
inside: Prism2.languages.ruby
}
}
},
"punctuation": {
pattern: /((?:^|\r?\n|\r)[\t ]*)[~=\-&!]+/,
lookbehind: true
}
};
var filter_pattern = "((?:^|\\r?\\n|\\r)([\\t ]*)):{{filter_name}}(?:(?:\\r?\\n|\\r)(?:\\2[\\t ].+|\\s*?(?=\\r?\\n|\\r)))+";
var filters = [
"css",
{ filter: "coffee", language: "coffeescript" },
"erb",
"javascript",
"less",
"markdown",
"ruby",
"scss",
"textile"
];
var all_filters = {};
for (var i = 0, l = filters.length; i < l; i++) {
var filter = filters[i];
filter = typeof filter === "string" ? { filter, language: filter } : filter;
if (Prism2.languages[filter.language]) {
all_filters["filter-" + filter.filter] = {
pattern: RegExp(filter_pattern.replace("{{filter_name}}", function() {
return filter.filter;
})),
lookbehind: true,
inside: {
"filter-name": {
pattern: /^:[\w-]+/,
alias: "symbol"
},
"text": {
pattern: /[\s\S]+/,
alias: [filter.language, "language-" + filter.language],
inside: Prism2.languages[filter.language]
}
}
};
}
}
Prism2.languages.insertBefore("haml", "filter", all_filters);
})(Prism);
(function(Prism2) {
Prism2.languages.handlebars = {
"comment": /\{\{![\s\S]*?\}\}/,
"delimiter": {
pattern: /^\{\{\{?|\}\}\}?$/,
alias: "punctuation"
},
"string": /(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,
"number": /\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,
"boolean": /\b(?:false|true)\b/,
"block": {
pattern: /^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,
lookbehind: true,
alias: "keyword"
},
"brackets": {
pattern: /\[[^\]]+\]/,
inside: {
punctuation: /\[|\]/,
variable: /[\s\S]+/
}
},
"punctuation": /[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,
"variable": /[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/
};
Prism2.hooks.add("before-tokenize", function(env) {
var handlebarsPattern = /\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g;
Prism2.languages["markup-templating"].buildPlaceholders(env, "handlebars", handlebarsPattern);
});
Prism2.hooks.add("after-tokenize", function(env) {
Prism2.languages["markup-templating"].tokenizePlaceholders(env, "handlebars");
});
Prism2.languages.hbs = Prism2.languages.handlebars;
Prism2.languages.mustache = Prism2.languages.handlebars;
})(Prism);
Prism.languages.haskell = {
"comment": {
pattern: /(^|[^-!#$%*+=?&@|~.:<>^\\\/])(?:--(?:(?=.)[^-!#$%*+=?&@|~.:<>^\\\/].*|$)|\{-[\s\S]*?-\})/m,
lookbehind: true
},
"char": {
pattern: /'(?:[^\\']|\\(?:[abfnrtv\\"'&]|\^[A-Z@[\]^_]|ACK|BEL|BS|CAN|CR|DC1|DC2|DC3|DC4|DEL|DLE|EM|ENQ|EOT|ESC|ETB|ETX|FF|FS|GS|HT|LF|NAK|NUL|RS|SI|SO|SOH|SP|STX|SUB|SYN|US|VT|\d+|o[0-7]+|x[0-9a-fA-F]+))'/,
alias: "string"
},
"string": {
pattern: /"(?:[^\\"]|\\(?:\S|\s+\\))*"/,
greedy: true
},
"keyword": /\b(?:case|class|data|deriving|do|else|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b/,
"import-statement": {
pattern: /(^[\t ]*)import\s+(?:qualified\s+)?(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*(?:\s+as\s+(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,
lookbehind: true,
inside: {
"keyword": /\b(?:as|hiding|import|qualified)\b/,
"punctuation": /\./
}
},
"builtin": /\b(?:abs|acos|acosh|all|and|any|appendFile|approxRational|asTypeOf|asin|asinh|atan|atan2|atanh|basicIORun|break|catch|ceiling|chr|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|denominator|digitToInt|div|divMod|drop|dropWhile|either|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromDouble|fromEnum|fromInt|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|group|head|id|inRange|index|init|intToDigit|interact|ioError|isAlpha|isAlphaNum|isAscii|isControl|isDenormalized|isDigit|isHexDigit|isIEEE|isInfinite|isLower|isNaN|isNegativeZero|isOctDigit|isPrint|isSpace|isUpper|iterate|last|lcm|length|lex|lexDigits|lexLitChar|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|numerator|odd|or|ord|otherwise|pack|pi|pred|primExitWith|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|range|rangeSize|read|readDec|readFile|readFloat|readHex|readIO|readInt|readList|readLitChar|readLn|readOct|readParen|readSigned|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showInt|showList|showLitChar|showParen|showSigned|showString|shows|showsPrec|significand|signum|sin|sinh|snd|sort|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|threadToIOResult|toEnum|toInt|toInteger|toLower|toRational|toUpper|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\b/,
"number": /\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0o[0-7]+|0x[0-9a-f]+)\b/i,
"operator": [
{
pattern: /`(?:[A-Z][\w']*\.)*[_a-z][\w']*`/,
greedy: true
},
{
pattern: /(\s)\.(?=\s)/,
lookbehind: true
},
/[-!#$%*+=?&@|~:<>^\\\/][-!#$%*+=?&@|~.:<>^\\\/]*|\.[-!#$%*+=?&@|~.:<>^\\\/]+/
],
"hvariable": {
pattern: /\b(?:[A-Z][\w']*\.)*[_a-z][\w']*/,
inside: {
"punctuation": /\./
}
},
"constant": {
pattern: /\b(?:[A-Z][\w']*\.)*[A-Z][\w']*/,
inside: {
"punctuation": /\./
}
},
"punctuation": /[{}[\];(),.:]/
};
Prism.languages.hs = Prism.languages.haskell;
Prism.languages.haxe = Prism.languages.extend("clike", {
"string": {
pattern: /"(?:[^"\\]|\\[\s\S])*"/,
greedy: true
},
"class-name": [
{
pattern: /(\b(?:abstract|class|enum|extends|implements|interface|new|typedef)\s+)[A-Z_]\w*/,
lookbehind: true
},
/\b[A-Z]\w*/
],
"keyword": /\bthis\b|\b(?:abstract|as|break|case|cast|catch|class|continue|default|do|dynamic|else|enum|extends|extern|final|for|from|function|if|implements|import|in|inline|interface|macro|new|null|operator|overload|override|package|private|public|return|static|super|switch|throw|to|try|typedef|untyped|using|var|while)(?!\.)\b/,
"function": {
pattern: /\b[a-z_]\w*(?=\s*(?:<[^<>]*>\s*)?\()/i,
greedy: true
},
"operator": /\.{3}|\+\+|--|&&|\|\||->|=>|(?:<<?|>{1,3}|[-+*/%!=&|^])=?|[?:~]/
});
Prism.languages.insertBefore("haxe", "string", {
"string-interpolation": {
pattern: /'(?:[^'\\]|\\[\s\S])*'/,
greedy: true,
inside: {
"interpolation": {
pattern: /(^|[^\\])\$(?:\w+|\{[^{}]+\})/,
lookbehind: true,
inside: {
"interpolation-punctuation": {
pattern: /^\$\{?|\}$/,
alias: "punctuation"
},
"expression": {
pattern: /[\s\S]+/,
inside: Prism.languages.haxe
}
}
},
"string": /[\s\S]+/
}
}
});
Prism.languages.insertBefore("haxe", "class-name", {
"regex": {
pattern: /~\/(?:[^\/\\\r\n]|\\.)+\/[a-z]*/,
greedy: true,
inside: {
"regex-flags": /\b[a-z]+$/,
"regex-source": {
pattern: /^(~\/)[\s\S]+(?=\/$)/,
lookbehind: true,
alias: "language-regex",
inside: Prism.languages.regex
},
"regex-delimiter": /^~\/|\/$/
}
}
});
Prism.languages.insertBefore("haxe", "keyword", {
"preprocessor": {
pattern: /#(?:else|elseif|end|if)\b.*/,
alias: "property"
},
"metadata": {
pattern: /@:?[\w.]+/,
alias: "symbol"
},
"reification": {
pattern: /\$(?:\w+|(?=\{))/,
alias: "important"
}
});
Prism.languages.hcl = {
"comment": /(?:\/\/|#).*|\/\*[\s\S]*?(?:\*\/|$)/,
"heredoc": {
pattern: /<<-?(\w+\b)[\s\S]*?^[ \t]*\1/m,
greedy: true,
alias: "string"
},
"keyword": [
{
pattern: /(?:data|resource)\s+(?:"(?:\\[\s\S]|[^\\"])*")(?=\s+"[\w-]+"\s+\{)/i,
inside: {
"type": {
pattern: /(resource|data|\s+)(?:"(?:\\[\s\S]|[^\\"])*")/i,
lookbehind: true,
alias: "variable"
}
}
},
{
pattern: /(?:backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+(?=\{)/i,
inside: {
"type": {
pattern: /(backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+/i,
lookbehind: true,
alias: "variable"
}
}
},
/[\w-]+(?=\s+\{)/
],
"property": [
/[-\w\.]+(?=\s*=(?!=))/,
/"(?:\\[\s\S]|[^\\"])+"(?=\s*[:=])/
],
"string": {
pattern: /"(?:[^\\$"]|\\[\s\S]|\$(?:(?=")|\$+(?!\$)|[^"${])|\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\})*"/,
greedy: true,
inside: {
"interpolation": {
pattern: /(^|[^$])\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\}/,
lookbehind: true,
inside: {
"type": {
pattern: /(\b(?:count|data|local|module|path|self|terraform|var)\b\.)[\w\*]+/i,
lookbehind: true,
alias: "variable"
},
"keyword": /\b(?:count|data|local|module|path|self|terraform|var)\b/i,
"function": /\w+(?=\()/,
"string": {
pattern: /"(?:\\[\s\S]|[^\\"])*"/,
greedy: true
},
"number": /\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,
"punctuation": /[!\$#%&'()*+,.\/;<=>@\[\\\]^`{|}~?:]/
}
}
}
},
"number": /\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,
"boolean": /\b(?:false|true)\b/i,
"punctuation": /[=\[\]{}]/
};
Prism.languages.hlsl = Prism.languages.extend("c", {
"class-name": [
Prism.languages.c["class-name"],
/\b(?:AppendStructuredBuffer|BlendState|Buffer|ByteAddressBuffer|CompileShader|ComputeShader|ConsumeStructuredBuffer|DepthStencilState|DepthStencilView|DomainShader|GeometryShader|Hullshader|InputPatch|LineStream|OutputPatch|PixelShader|PointStream|RWBuffer|RWByteAddressBuffer|RWStructuredBuffer|RWTexture(?:1D|1DArray|2D|2DArray|3D)|RasterizerState|RenderTargetView|SamplerComparisonState|SamplerState|StructuredBuffer|Texture(?:1D|1DArray|2D|2DArray|2DMS|2DMSArray|3D|Cube|CubeArray)|TriangleStream|VertexShader)\b/
],
"keyword": [
/\b(?:asm|asm_fragment|auto|break|case|catch|cbuffer|centroid|char|class|column_major|compile|compile_fragment|const|const_cast|continue|default|delete|discard|do|dynamic_cast|else|enum|explicit|export|extern|for|friend|fxgroup|goto|groupshared|if|in|inline|inout|interface|line|lineadj|linear|long|matrix|mutable|namespace|new|nointerpolation|noperspective|operator|out|packoffset|pass|pixelfragment|point|precise|private|protected|public|register|reinterpret_cast|return|row_major|sample|sampler|shared|short|signed|sizeof|snorm|stateblock|stateblock_state|static|static_cast|string|struct|switch|tbuffer|technique|technique10|technique11|template|texture|this|throw|triangle|triangleadj|try|typedef|typename|uniform|union|unorm|unsigned|using|vector|vertexfragment|virtual|void|volatile|while)\b/,
/\b(?:bool|double|dword|float|half|int|min(?:10float|12int|16(?:float|int|uint))|uint)(?:[1-4](?:x[1-4])?)?\b/
],
"number": /(?:(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?|\b0x[\da-fA-F]+)[fFhHlLuU]?\b/,
"boolean": /\b(?:false|true)\b/
});
Prism.languages.hoon = {
"comment": {
pattern: /::.*/,
greedy: true
},
"string": {
pattern: /"[^"]*"|'[^']*'/,
greedy: true
},
"constant": /%(?:\.[ny]|[\w-]+)/,
"class-name": /@(?:[a-z0-9-]*[a-z0-9])?|\*/i,
"function": /(?:\+[-+] {2})?(?:[a-z](?:[a-z0-9-]*[a-z0-9])?)/,
"keyword": /\.[\^\+\*=\?]|![><:\.=\?!]|=[>|:,\.\-\^<+;/~\*\?]|\?[>|:\.\-\^<\+&~=@!]|\|[\$_%:\.\-\^~\*=@\?]|\+[|\$\+\*]|:[_\-\^\+~\*]|%[_:\.\-\^\+~\*=]|\^[|:\.\-\+&~\*=\?]|\$[|_%:<>\-\^&~@=\?]|;[:<\+;\/~\*=]|~[>|\$_%<\+\/&=\?!]|--|==/
};
(function(Prism2) {
function headerValueOf(name) {
return RegExp("(^(?:" + name + "):[ ]*(?![ ]))[^]+", "i");
}
Prism2.languages.http = {
"request-line": {
pattern: /^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,
inside: {
"method": {
pattern: /^[A-Z]+\b/,
alias: "property"
},
"request-target": {
pattern: /^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,
lookbehind: true,
alias: "url",
inside: Prism2.languages.uri
},
"http-version": {
pattern: /^(\s)HTTP\/[\d.]+/,
lookbehind: true,
alias: "property"
}
}
},
"response-status": {
pattern: /^HTTP\/[\d.]+ \d+ .+/m,
inside: {
"http-version": {
pattern: /^HTTP\/[\d.]+/,
alias: "property"
},
"status-code": {
pattern: /^(\s)\d+(?=\s)/,
lookbehind: true,
alias: "number"
},
"reason-phrase": {
pattern: /^(\s).+/,
lookbehind: true,
alias: "string"
}
}
},
"header": {
pattern: /^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,
inside: {
"header-value": [
{
pattern: headerValueOf(/Content-Security-Policy/.source),
lookbehind: true,
alias: ["csp", "languages-csp"],
inside: Prism2.languages.csp
},
{
pattern: headerValueOf(/Public-Key-Pins(?:-Report-Only)?/.source),
lookbehind: true,
alias: ["hpkp", "languages-hpkp"],
inside: Prism2.languages.hpkp
},
{
pattern: headerValueOf(/Strict-Transport-Security/.source),
lookbehind: true,
alias: ["hsts", "languages-hsts"],
inside: Prism2.languages.hsts
},
{
pattern: headerValueOf(/[^:]+/.source),
lookbehind: true
}
],
"header-name": {
pattern: /^[^:]+/,
alias: "keyword"
},
"punctuation": /^:/
}
}
};
var langs = Prism2.languages;
var httpLanguages = {
"application/javascript": langs.javascript,
"application/json": langs.json || langs.javascript,
"application/xml": langs.xml,
"text/xml": langs.xml,
"text/html": langs.html,
"text/css": langs.css,
"text/plain": langs.plain
};
var suffixTypes = {
"application/json": true,
"application/xml": true
};
function getSuffixPattern(contentType2) {
var suffix = contentType2.replace(/^[a-z]+\//, "");
var suffixPattern = "\\w+/(?:[\\w.-]+\\+)+" + suffix + "(?![+\\w.-])";
return "(?:" + contentType2 + "|" + suffixPattern + ")";
}
var options;
for (var contentType in httpLanguages) {
if (httpLanguages[contentType]) {
options = options || {};
var pattern = suffixTypes[contentType] ? getSuffixPattern(contentType) : contentType;
options[contentType.replace(/\//g, "-")] = {
pattern: RegExp("(" + /content-type:\s*/.source + pattern + /(?:(?:\r\n?|\n)[\w-].*)*(?:\r(?:\n|(?!\n))|\n)/.source + ")" + /[^ \t\w-][\s\S]*/.source, "i"),
lookbehind: true,
inside: httpLanguages[contentType]
};
}
}
if (options) {
Prism2.languages.insertBefore("http", "header", options);
}
})(Prism);
Prism.languages.hpkp = {
"directive": {
pattern: /\b(?:includeSubDomains|max-age|pin-sha256|preload|report-to|report-uri|strict)(?=[\s;=]|$)/i,
alias: "property"
},
"operator": /=/,
"punctuation": /;/
};
Prism.languages.hsts = {
"directive": {
pattern: /\b(?:includeSubDomains|max-age|preload)(?=[\s;=]|$)/i,
alias: "property"
},
"operator": /=/,
"punctuation": /;/
};
Prism.languages.ichigojam = {
"comment": /(?:\B'|REM)(?:[^\n\r]*)/i,
"string": {
pattern: /"(?:""|[!#$%&'()*,\/:;<=>?^\w +\-.])*"/,
greedy: true
},
"number": /\B#[0-9A-F]+|\B`[01]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,
"keyword": /\b(?:BEEP|BPS|CASE|CLEAR|CLK|CLO|CLP|CLS|CLT|CLV|CONT|COPY|ELSE|END|FILE|FILES|FOR|GOSUB|GOTO|GSB|IF|INPUT|KBD|LED|LET|LIST|LOAD|LOCATE|LRUN|NEW|NEXT|OUT|PLAY|POKE|PRINT|PWM|REM|RENUM|RESET|RETURN|RIGHT|RTN|RUN|SAVE|SCROLL|SLEEP|SRND|STEP|STOP|SUB|TEMPO|THEN|TO|UART|VIDEO|WAIT)(?:\$|\b)/i,
"function": /\b(?:ABS|ANA|ASC|BIN|BTN|DEC|END|FREE|HELP|HEX|I2CR|I2CW|IN|INKEY|LEN|LINE|PEEK|RND|SCR|SOUND|STR|TICK|USR|VER|VPEEK|ZER)(?:\$|\b)/i,
"label": /(?:\B@\S+)/,
"operator": /<[=>]?|>=?|\|\||&&|[+\-*\/=|&^~!]|\b(?:AND|NOT|OR)\b/i,
"punctuation": /[\[,;:()\]]/
};
Prism.languages.icon = {
"comment": /#.*/,
"string": {
pattern: /(["'])(?:(?!\1)[^\\\r\n_]|\\.|_(?!\1)(?:\r\n|[\s\S]))*\1/,
greedy: true
},
"number": /\b(?:\d+r[a-z\d]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b|\.\d+\b/i,
"builtin-keyword": {
pattern: /&(?:allocated|ascii|clock|collections|cset|current|date|dateline|digits|dump|e|error(?:number|text|value)?|errout|fail|features|file|host|input|lcase|letters|level|line|main|null|output|phi|pi|pos|progname|random|regions|source|storage|subject|time|trace|ucase|version)\b/,
alias: "variable"
},
"directive": {
pattern: /\$\w+/,
alias: "builtin"
},
"keyword": /\b(?:break|by|case|create|default|do|else|end|every|fail|global|if|initial|invocable|link|local|next|not|of|procedure|record|repeat|return|static|suspend|then|to|until|while)\b/,
"function": /\b(?!\d)\w+(?=\s*[({]|\s*!\s*\[)/,
"operator": /[+-]:(?!=)|(?:[\/?@^%&]|\+\+?|--?|==?=?|~==?=?|\*\*?|\|\|\|?|<(?:->?|<?=?)|>>?=?)(?::=)?|:(?:=:?)?|[!.\\|~]/,
"punctuation": /[\[\](){},;]/
};
(function(Prism2) {
function nested(source, level) {
if (level <= 0) {
return /[]/.source;
} else {
return source.replace(/<SELF>/g, function() {
return nested(source, level - 1);
});
}
}
var stringPattern = /'[{}:=,](?:[^']|'')*'(?!')/;
var escape = {
pattern: /''/,
greedy: true,
alias: "operator"
};
var string = {
pattern: stringPattern,
greedy: true,
inside: {
"escape": escape
}
};
var argumentSource = nested(/\{(?:[^{}']|'(?![{},'])|''|<STR>|<SELF>)*\}/.source.replace(/<STR>/g, function() {
return stringPattern.source;
}), 8);
var nestedMessage = {
pattern: RegExp(argumentSource),
inside: {
"message": {
pattern: /^(\{)[\s\S]+(?=\}$)/,
lookbehind: true,
inside: null
},
"message-delimiter": {
pattern: /./,
alias: "punctuation"
}
}
};
Prism2.languages["icu-message-format"] = {
"argument": {
pattern: RegExp(argumentSource),
greedy: true,
inside: {
"content": {
pattern: /^(\{)[\s\S]+(?=\}$)/,
lookbehind: true,
inside: {
"argument-name": {
pattern: /^(\s*)[^{}:=,\s]+/,
lookbehind: true
},
"choice-style": {
pattern: /^(\s*,\s*choice\s*,\s*)\S(?:[\s\S]*\S)?/,
lookbehind: true,
inside: {
"punctuation": /\|/,
"range": {
pattern: /^(\s*)[+-]?(?:\d+(?:\.\d*)?|\u221e)\s*[<#\u2264]/,
lookbehind: true,
inside: {
"operator": /[<#\u2264]/,
"number": /\S+/
}
},
rest: null
}
},
"plural-style": {
pattern: /^(\s*,\s*(?:plural|selectordinal)\s*,\s*)\S(?:[\s\S]*\S)?/,
lookbehind: true,
inside: {
"offset": /^offset:\s*\d+/,
"nested-message": nestedMessage,
"selector": {
pattern: /=\d+|[^{}:=,\s]+/,
inside: {
"keyword": /^(?:few|many|one|other|two|zero)$/
}
}
}
},
"select-style": {
pattern: /^(\s*,\s*select\s*,\s*)\S(?:[\s\S]*\S)?/,
lookbehind: true,
inside: {
"nested-message": nestedMessage,
"selector": {
pattern: /[^{}:=,\s]+/,
inside: {
"keyword": /^other$/
}
}
}
},
"keyword": /\b(?:choice|plural|select|selectordinal)\b/,
"arg-type": {
pattern: /\b(?:date|duration|number|ordinal|spellout|time)\b/,
alias: "keyword"
},
"arg-skeleton": {
pattern: /(,\s*)::[^{}:=,\s]+/,
lookbehind: true
},
"arg-style": {
pattern: /(,\s*)(?:currency|full|integer|long|medium|percent|short)(?=\s*$)/,
lookbehind: true
},
"arg-style-text": {
pattern: RegExp(/(^\s*,\s*(?=\S))/.source + nested(/(?:[^{}']|'[^']*'|\{(?:<SELF>)?\})+/.source, 8) + "$"),
lookbehind: true,
alias: "string"
},
"punctuation": /,/
}
},
"argument-delimiter": {
pattern: /./,
alias: "operator"
}
}
},
"escape": escape,
"string": string
};
nestedMessage.inside.message.inside = Prism2.languages["icu-message-format"];
Prism2.languages["icu-message-format"].argument.inside.content.inside["choice-style"].inside.rest = Prism2.languages["icu-message-format"];
})(Prism);
Prism.languages.idris = Prism.languages.extend("haskell", {
"comment": {
pattern: /(?:(?:--|\|\|\|).*$|\{-[\s\S]*?-\})/m
},
"keyword": /\b(?:Type|case|class|codata|constructor|corecord|data|do|dsl|else|export|if|implementation|implicit|import|impossible|in|infix|infixl|infixr|instance|interface|let|module|mutual|namespace|of|parameters|partial|postulate|private|proof|public|quoteGoal|record|rewrite|syntax|then|total|using|where|with)\b/,
"builtin": void 0
});
Prism.languages.insertBefore("idris", "keyword", {
"import-statement": {
pattern: /(^\s*import\s+)(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*/m,
lookbehind: true,
inside: {
"punctuation": /\./
}
}
});
Prism.languages.idr = Prism.languages.idris;
(function(Prism2) {
Prism2.languages.ignore = {
"comment": /^#.*/m,
"entry": {
pattern: /\S(?:.*(?:(?:\\ )|\S))?/,
alias: "string",
inside: {
"operator": /^!|\*\*?|\?/,
"regex": {
pattern: /(^|[^\\])\[[^\[\]]*\]/,
lookbehind: true
},
"punctuation": /\//
}
}
};
Prism2.languages.gitignore = Prism2.languages.ignore;
Prism2.languages.hgignore = Prism2.languages.ignore;
Prism2.languages.npmignore = Prism2.languages.ignore;
})(Prism);
Prism.languages.inform7 = {
"string": {
pattern: /"[^"]*"/,
inside: {
"substitution": {
pattern: /\[[^\[\]]+\]/,
inside: {
"delimiter": {
pattern: /\[|\]/,
alias: "punctuation"
}
}
}
}
},
"comment": {
pattern: /\[[^\[\]]+\]/,
greedy: true
},
"title": {
pattern: /^[ \t]*(?:book|chapter|part(?! of)|section|table|volume)\b.+/im,
alias: "important"
},
"number": {
pattern: /(^|[^-])(?:\b\d+(?:\.\d+)?(?:\^\d+)?(?:(?!\d)\w+)?|\b(?:eight|eleven|five|four|nine|one|seven|six|ten|three|twelve|two))\b(?!-)/i,
lookbehind: true
},
"verb": {
pattern: /(^|[^-])\b(?:answering|applying to|are|asking|attacking|be(?:ing)?|burning|buying|called|carries|carry(?! out)|carrying|climbing|closing|conceal(?:ing|s)?|consulting|contain(?:ing|s)?|cutting|drinking|dropping|eating|enclos(?:es?|ing)|entering|examining|exiting|getting|giving|going|ha(?:s|ve|ving)|hold(?:ing|s)?|impl(?:ies|y)|incorporat(?:es?|ing)|inserting|is|jumping|kissing|listening|locking|looking|mean(?:ing|s)?|opening|provid(?:es?|ing)|pulling|pushing|putting|relat(?:es?|ing)|removing|searching|see(?:ing|s)?|setting|showing|singing|sleeping|smelling|squeezing|support(?:ing|s)?|swearing|switching|taking|tasting|telling|thinking|throwing|touching|turning|tying|unlock(?:ing|s)?|var(?:ies|y|ying)|waiting|waking|waving|wear(?:ing|s)?)\b(?!-)/i,
lookbehind: true,
alias: "operator"
},
"keyword": {
pattern: /(^|[^-])\b(?:after|before|carry out|check|continue the action|definition(?= *:)|do nothing|else|end (?:if|the story|unless)|every turn|if|include|instead(?: of)?|let|move|no|now|otherwise|repeat|report|resume the story|rule for|running through|say(?:ing)?|stop the action|test|try(?:ing)?|understand|unless|use|when|while|yes)\b(?!-)/i,
lookbehind: true
},
"property": {
pattern: /(^|[^-])\b(?:adjacent(?! to)|carried|closed|concealed|contained|dark|described|edible|empty|enclosed|enterable|even|female|fixed in place|full|handled|held|improper-named|incorporated|inedible|invisible|lighted|lit|lock(?:able|ed)|male|marked for listing|mentioned|negative|neuter|non-(?:empty|full|recurring)|odd|opaque|open(?:able)?|plural-named|portable|positive|privately-named|proper-named|provided|publically-named|pushable between rooms|recurring|related|rubbing|scenery|seen|singular-named|supported|swinging|switch(?:able|ed(?: off| on)?)|touch(?:able|ed)|transparent|unconcealed|undescribed|unlit|unlocked|unmarked for listing|unmentioned|unopenable|untouchable|unvisited|variable|visible|visited|wearable|worn)\b(?!-)/i,
lookbehind: true,
alias: "symbol"
},
"position": {
pattern: /(^|[^-])\b(?:above|adjacent to|back side of|below|between|down|east|everywhere|front side|here|in|inside(?: from)?|north(?:east|west)?|nowhere|on(?: top of)?|other side|outside(?: from)?|parts? of|regionally in|south(?:east|west)?|through|up|west|within)\b(?!-)/i,
lookbehind: true,
alias: "keyword"
},
"type": {
pattern: /(^|[^-])\b(?:actions?|activit(?:ies|y)|actors?|animals?|backdrops?|containers?|devices?|directions?|doors?|holders?|kinds?|lists?|m[ae]n|nobody|nothing|nouns?|numbers?|objects?|people|persons?|player(?:'s holdall)?|regions?|relations?|rooms?|rule(?:book)?s?|scenes?|someone|something|supporters?|tables?|texts?|things?|time|vehicles?|wom[ae]n)\b(?!-)/i,
lookbehind: true,
alias: "variable"
},
"punctuation": /[.,:;(){}]/
};
Prism.languages.inform7["string"].inside["substitution"].inside.rest = Prism.languages.inform7;
Prism.languages.inform7["string"].inside["substitution"].inside.rest.text = {
pattern: /\S(?:\s*\S)*/,
alias: "comment"
};
Prism.languages.ini = {
"comment": {
pattern: /(^[ \f\t\v]*)[#;][^\n\r]*/m,
lookbehind: true
},
"section": {
pattern: /(^[ \f\t\v]*)\[[^\n\r\]]*\]?/m,
lookbehind: true,
inside: {
"section-name": {
pattern: /(^\[[ \f\t\v]*)[^ \f\t\v\]]+(?:[ \f\t\v]+[^ \f\t\v\]]+)*/,
lookbehind: true,
alias: "selector"
},
"punctuation": /\[|\]/
}
},
"key": {
pattern: /(^[ \f\t\v]*)[^ \f\n\r\t\v=]+(?:[ \f\t\v]+[^ \f\n\r\t\v=]+)*(?=[ \f\t\v]*=)/m,
lookbehind: true,
alias: "attr-name"
},
"value": {
pattern: /(=[ \f\t\v]*)[^ \f\n\r\t\v]+(?:[ \f\t\v]+[^ \f\n\r\t\v]+)*/,
lookbehind: true,
alias: "attr-value",
inside: {
"inner-value": {
pattern: /^("|').+(?=\1$)/,
lookbehind: true
}
}
},
"punctuation": /=/
};
Prism.languages.io = {
"comment": {
pattern: /(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\/\/.*|#.*)/,
lookbehind: true,
greedy: true
},
"triple-quoted-string": {
pattern: /"""(?:\\[\s\S]|(?!""")[^\\])*"""/,
greedy: true,
alias: "string"
},
"string": {
pattern: /"(?:\\.|[^\\\r\n"])*"/,
greedy: true
},
"keyword": /\b(?:activate|activeCoroCount|asString|block|break|call|catch|clone|collectGarbage|compileString|continue|do|doFile|doMessage|doString|else|elseif|exit|for|foreach|forward|getEnvironmentVariable|getSlot|hasSlot|if|ifFalse|ifNil|ifNilEval|ifTrue|isActive|isNil|isResumable|list|message|method|parent|pass|pause|perform|performWithArgList|print|println|proto|raise|raiseResumable|removeSlot|resend|resume|schedulerSleepSeconds|self|sender|setSchedulerSleepSeconds|setSlot|shallowCopy|slotNames|super|system|then|thisBlock|thisContext|try|type|uniqueId|updateSlot|wait|while|write|yield)\b/,
"builtin": /\b(?:Array|AudioDevice|AudioMixer|BigNum|Block|Box|Buffer|CFunction|CGI|Color|Curses|DBM|DNSResolver|DOConnection|DOProxy|DOServer|Date|Directory|Duration|DynLib|Error|Exception|FFT|File|Fnmatch|Font|Future|GL|GLE|GLScissor|GLU|GLUCylinder|GLUQuadric|GLUSphere|GLUT|Host|Image|Importer|LinkList|List|Lobby|Locals|MD5|MP3Decoder|MP3Encoder|Map|Message|Movie|Notification|Number|Object|OpenGL|Point|Protos|Random|Regex|SGML|SGMLElement|SGMLParser|SQLite|Sequence|Server|ShowMessage|SleepyCat|SleepyCatCursor|Socket|SocketManager|Sound|Soup|Store|String|Tree|UDPSender|UPDReceiver|URL|User|Warning|WeakLink)\b/,
"boolean": /\b(?:false|nil|true)\b/,
"number": /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?/i,
"operator": /[=!*/%+\-^&|]=|>>?=?|<<?=?|:?:?=|\+\+?|--?|\*\*?|\/\/?|%|\|\|?|&&?|\b(?:and|not|or|return)\b|@@?|\?\??|\.\./,
"punctuation": /[{}[\];(),.:]/
};
Prism.languages.j = {
"comment": {
pattern: /\bNB\..*/,
greedy: true
},
"string": {
pattern: /'(?:''|[^'\r\n])*'/,
greedy: true
},
"keyword": /\b(?:(?:CR|LF|adverb|conjunction|def|define|dyad|monad|noun|verb)\b|(?:assert|break|case|catch[dt]?|continue|do|else|elseif|end|fcase|for|for_\w+|goto_\w+|if|label_\w+|return|select|throw|try|while|whilst)\.)/,
"verb": {
pattern: /(?!\^:|;\.|[=!][.:])(?:\{(?:\.|::?)?|p(?:\.\.?|:)|[=!\]]|[<>+*\-%$|,#][.:]?|[?^]\.?|[;\[]:?|[~}"i][.:]|[ACeEIjLor]\.|(?:[_\/\\qsux]|_?\d):)/,
alias: "keyword"
},
"number": /\b_?(?:(?!\d:)\d+(?:\.\d+)?(?:(?:ad|ar|[ejpx])_?\d+(?:\.\d+)?)*(?:b_?[\da-z]+(?:\.[\da-z]+)?)?|_\b(?!\.))/,
"adverb": {
pattern: /[~}]|[\/\\]\.?|[bfM]\.|t[.:]/,
alias: "builtin"
},
"operator": /[=a][.:]|_\./,
"conjunction": {
pattern: /&(?:\.:?|:)?|[.:@][.:]?|[!D][.:]|[;dHT]\.|`:?|[\^LS]:|"/,
alias: "variable"
},
"punctuation": /[()]/
};
(function(Prism2) {
var keywords = /\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/;
var classNamePrefix = /(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source;
var className = {
pattern: RegExp(/(^|[^\w.])/.source + classNamePrefix + /[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),
lookbehind: true,
inside: {
"namespace": {
pattern: /^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,
inside: {
"punctuation": /\./
}
},
"punctuation": /\./
}
};
Prism2.languages.java = Prism2.languages.extend("clike", {
"string": {
pattern: /(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,
lookbehind: true,
greedy: true
},
"class-name": [
className,
{
pattern: RegExp(/(^|[^\w.])/.source + classNamePrefix + /[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),
lookbehind: true,
inside: className.inside
},
{
pattern: RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source + classNamePrefix + /[A-Z]\w*\b/.source),
lookbehind: true,
inside: className.inside
}
],
"keyword": keywords,
"function": [
Prism2.languages.clike.function,
{
pattern: /(::\s*)[a-z_]\w*/,
lookbehind: true
}
],
"number": /\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,
"operator": {
pattern: /(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,
lookbehind: true
}
});
Prism2.languages.insertBefore("java", "string", {
"triple-quoted-string": {
pattern: /"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,
greedy: true,
alias: "string"
},
"char": {
pattern: /'(?:\\.|[^'\\\r\n]){1,6}'/,
greedy: true
}
});
Prism2.languages.insertBefore("java", "class-name", {
"annotation": {
pattern: /(^|[^.])@\w+(?:\s*\.\s*\w+)*/,
lookbehind: true,
alias: "punctuation"
},
"generics": {
pattern: /<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,
inside: {
"class-name": className,
"keyword": keywords,
"punctuation": /[<>(),.:]/,
"operator": /[?&|]/
}
},
"import": [
{
pattern: RegExp(/(\bimport\s+)/.source + classNamePrefix + /(?:[A-Z]\w*|\*)(?=\s*;)/.source),
lookbehind: true,
inside: {
"namespace": className.inside.namespace,
"punctuation": /\./,
"operator": /\*/,
"class-name": /\w+/
}
},
{
pattern: RegExp(/(\bimport\s+static\s+)/.source + classNamePrefix + /(?:\w+|\*)(?=\s*;)/.source),
lookbehind: true,
alias: "static",
inside: {
"namespace": className.inside.namespace,
"static": /\b\w+$/,
"punctuation": /\./,
"operator": /\*/,
"class-name": /\w+/
}
}
],
"namespace": {
pattern: RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!<keyword>)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(/<keyword>/g, function() {
return keywords.source;
})),
lookbehind: true,
inside: {
"punctuation": /\./
}
}
});
})(Prism);
(function(Prism2) {
var comment = /\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/;
var constant = [
{
pattern: /\b(?:false|true)\b/i,
alias: "boolean"
},
{
pattern: /(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,
greedy: true,
lookbehind: true
},
{
pattern: /(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,
greedy: true,
lookbehind: true
},
/\b(?:null)\b/i,
/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/
];
var number = /\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i;
var operator = /<?=>|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/;
var punctuation = /[{}\[\](),:;]/;
Prism2.languages.php = {
"delimiter": {
pattern: /\?>$|^<\?(?:php(?=\s)|=)?/i,
alias: "important"
},
"comment": comment,
"variable": /\$+(?:\w+\b|(?=\{))/,
"package": {
pattern: /(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,
lookbehind: true,
inside: {
"punctuation": /\\/
}
},
"class-name-definition": {
pattern: /(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,
lookbehind: true,
alias: "class-name"
},
"function-definition": {
pattern: /(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,
lookbehind: true,
alias: "function"
},
"keyword": [
{
pattern: /(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,
alias: "type-casting",
greedy: true,
lookbehind: true
},
{
pattern: /([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,
alias: "type-hint",
greedy: true,
lookbehind: true
},
{
pattern: /(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,
alias: "return-type",
greedy: true,
lookbehind: true
},
{
pattern: /\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,
alias: "type-declaration",
greedy: true
},
{
pattern: /(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,
alias: "type-declaration",
greedy: true,
lookbehind: true
},
{
pattern: /\b(?:parent|self|static)(?=\s*::)/i,
alias: "static-context",
greedy: true
},
{
pattern: /(\byield\s+)from\b/i,
lookbehind: true
},
/\bclass\b/i,
{
pattern: /((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,
lookbehind: true
}
],
"argument-name": {
pattern: /([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,
lookbehind: true
},
"class-name": [
{
pattern: /(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,
greedy: true,
lookbehind: true
},
{
pattern: /(\|\s*)\b[a-z_]\w*(?!\\)\b/i,
greedy: true,
lookbehind: true
},
{
pattern: /\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,
greedy: true
},
{
pattern: /(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,
alias: "class-name-fully-qualified",
greedy: true,
lookbehind: true,
inside: {
"punctuation": /\\/
}
},
{
pattern: /(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,
alias: "class-name-fully-qualified",
greedy: true,
inside: {
"punctuation": /\\/
}
},
{
pattern: /(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,
alias: "class-name-fully-qualified",
greedy: true,
lookbehind: true,
inside: {
"punctuation": /\\/
}
},
{
pattern: /\b[a-z_]\w*(?=\s*\$)/i,
alias: "type-declaration",
greedy: true
},
{
pattern: /(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,
alias: ["class-name-fully-qualified", "type-declaration"],
greedy: true,
inside: {
"punctuation": /\\/
}
},
{
pattern: /\b[a-z_]\w*(?=\s*::)/i,
alias: "static-context",
greedy: true
},
{
pattern: /(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,
alias: ["class-name-fully-qualified", "static-context"],
greedy: true,
inside: {
"punctuation": /\\/
}
},
{
pattern: /([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,
alias: "type-hint",
greedy: true,
lookbehind: true
},
{
pattern: /([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,
alias: ["class-name-fully-qualified", "type-hint"],
greedy: true,
lookbehind: true,
inside: {
"punctuation": /\\/
}
},
{
pattern: /(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,
alias: "return-type",
greedy: true,
lookbehind: true
},
{
pattern: /(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,
alias: ["class-name-fully-qualified", "return-type"],
greedy: true,
lookbehind: true,
inside: {
"punctuation": /\\/
}
}
],
"constant": constant,
"function": {
pattern: /(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,
lookbehind: true,
inside: {
"punctuation": /\\/
}
},
"property": {
pattern: /(->\s*)\w+/,
lookbehind: true
},
"number": number,
"operator": operator,
"punctuation": punctuation
};
var string_interpolation = {
pattern: /\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,
lookbehind: true,
inside: Prism2.languages.php
};
var string = [
{
pattern: /<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,
alias: "nowdoc-string",
greedy: true,
inside: {
"delimiter": {
pattern: /^<<<'[^']+'|[a-z_]\w*;$/i,
alias: "symbol",
inside: {
"punctuation": /^<<<'?|[';]$/
}
}
}
},
{
pattern: /<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,
alias: "heredoc-string",
greedy: true,
inside: {
"delimiter": {
pattern: /^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,
alias: "symbol",
inside: {
"punctuation": /^<<<"?|[";]$/
}
},
"interpolation": string_interpolation
}
},
{
pattern: /`(?:\\[\s\S]|[^\\`])*`/,
alias: "backtick-quoted-string",
greedy: true
},
{
pattern: /'(?:\\[\s\S]|[^\\'])*'/,
alias: "single-quoted-string",
greedy: true
},
{
pattern: /"(?:\\[\s\S]|[^\\"])*"/,
alias: "double-quoted-string",
greedy: true,
inside: {
"interpolation": string_interpolation
}
}
];
Prism2.languages.insertBefore("php", "variable", {
"string": string,
"attribute": {
pattern: /#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,
greedy: true,
inside: {
"attribute-content": {
pattern: /^(#\[)[\s\S]+(?=\]$)/,
lookbehind: true,
inside: {
"comment": comment,
"string": string,
"attribute-class-name": [
{
pattern: /([^:]|^)\b[a-z_]\w*(?!\\)\b/i,
alias: "class-name",
greedy: true,
lookbehind: true
},
{
pattern: /([^:]|^)(?:\\?\b[a-z_]\w*)+/i,
alias: [
"class-name",
"class-name-fully-qualified"
],
greedy: true,
lookbehind: true,
inside: {
"punctuation": /\\/
}
}
],
"constant": constant,
"number": number,
"operator": operator,
"punctuation": punctuation
}
},
"delimiter": {
pattern: /^#\[|\]$/,
alias: "punctuation"
}
}
}
});
Prism2.hooks.add("before-tokenize", function(env) {
if (!/<\?/.test(env.code)) {
return;
}
var phpPattern = /<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g;
Prism2.languages["markup-templating"].buildPlaceholders(env, "php", phpPattern);
});
Prism2.hooks.add("after-tokenize", function(env) {
Prism2.languages["markup-templating"].tokenizePlaceholders(env, "php");
});
})(Prism);
(function(Prism2) {
var javaDocLike = Prism2.languages.javadoclike = {
"parameter": {
pattern: /(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,
lookbehind: true
},
"keyword": {
pattern: /(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,
lookbehind: true
},
"punctuation": /[{}]/
};
function docCommentSupport(lang, callback) {
var tokenName = "doc-comment";
var grammar = Prism2.languages[lang];
if (!grammar) {
return;
}
var token = grammar[tokenName];
if (!token) {
var definition = {};
definition[tokenName] = {
pattern: /(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,
lookbehind: true,
alias: "comment"
};
grammar = Prism2.languages.insertBefore(lang, "comment", definition);
token = grammar[tokenName];
}
if (token instanceof RegExp) {
token = grammar[tokenName] = { pattern: token };
}
if (Array.isArray(token)) {
for (var i = 0, l = token.length; i < l; i++) {
if (token[i] instanceof RegExp) {
token[i] = { pattern: token[i] };
}
callback(token[i]);
}
} else {
callback(token);
}
}
function addSupport(languages, docLanguage) {
if (typeof languages === "string") {
languages = [languages];
}
languages.forEach(function(lang) {
docCommentSupport(lang, function(pattern) {
if (!pattern.inside) {
pattern.inside = {};
}
pattern.inside.rest = docLanguage;
});
});
}
Object.defineProperty(javaDocLike, "addSupport", { value: addSupport });
javaDocLike.addSupport(["java", "javascript", "php"], javaDocLike);
})(Prism);
(function(Prism2) {
var codeLinePattern = /(^(?:[\t ]*(?:\*\s*)*))[^*\s].*$/m;
var memberReference = /#\s*\w+(?:\s*\([^()]*\))?/.source;
var reference2 = /(?:\b[a-zA-Z]\w+\s*\.\s*)*\b[A-Z]\w*(?:\s*<mem>)?|<mem>/.source.replace(/<mem>/g, function() {
return memberReference;
});
Prism2.languages.javadoc = Prism2.languages.extend("javadoclike", {});
Prism2.languages.insertBefore("javadoc", "keyword", {
"reference": {
pattern: RegExp(/(@(?:exception|link|linkplain|see|throws|value)\s+(?:\*\s*)?)/.source + "(?:" + reference2 + ")"),
lookbehind: true,
inside: {
"function": {
pattern: /(#\s*)\w+(?=\s*\()/,
lookbehind: true
},
"field": {
pattern: /(#\s*)\w+/,
lookbehind: true
},
"namespace": {
pattern: /\b(?:[a-z]\w*\s*\.\s*)+/,
inside: {
"punctuation": /\./
}
},
"class-name": /\b[A-Z]\w*/,
"keyword": Prism2.languages.java.keyword,
"punctuation": /[#()[\],.]/
}
},
"class-name": {
pattern: /(@param\s+)<[A-Z]\w*>/,
lookbehind: true,
inside: {
"punctuation": /[.<>]/
}
},
"code-section": [
{
pattern: /(\{@code\s+(?!\s))(?:[^\s{}]|\s+(?![\s}])|\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\})+(?=\s*\})/,
lookbehind: true,
inside: {
"code": {
pattern: codeLinePattern,
lookbehind: true,
inside: Prism2.languages.java,
alias: "language-java"
}
}
},
{
pattern: /(<(code|pre|tt)>(?!<code>)\s*)\S(?:\S|\s+\S)*?(?=\s*<\/\2>)/,
lookbehind: true,
inside: {
"line": {
pattern: codeLinePattern,
lookbehind: true,
inside: {
"tag": Prism2.languages.markup.tag,
"entity": Prism2.languages.markup.entity,
"code": {
pattern: /.+/,
inside: Prism2.languages.java,
alias: "language-java"
}
}
}
}
}
],
"tag": Prism2.languages.markup.tag,
"entity": Prism2.languages.markup.entity
});
Prism2.languages.javadoclike.addSupport("java", Prism2.languages.javadoc);
})(Prism);
Prism.languages.javastacktrace = {
"summary": {
pattern: /^([\t ]*)(?:(?:Caused by:|Suppressed:|Exception in thread "[^"]*")[\t ]+)?[\w$.]+(?::.*)?$/m,
lookbehind: true,
inside: {
"keyword": {
pattern: /^([\t ]*)(?:(?:Caused by|Suppressed)(?=:)|Exception in thread)/m,
lookbehind: true
},
"string": {
pattern: /^(\s*)"[^"]*"/,
lookbehind: true
},
"exceptions": {
pattern: /^(:?\s*)[\w$.]+(?=:|$)/,
lookbehind: true,
inside: {
"class-name": /[\w$]+$/,
"namespace": /\b[a-z]\w*\b/,
"punctuation": /\./
}
},
"message": {
pattern: /(:\s*)\S.*/,
lookbehind: true,
alias: "string"
},
"punctuation": /:/
}
},
"stack-frame": {
pattern: /^([\t ]*)at (?:[\w$./]|@[\w$.+-]*\/)+(?:<init>)?\([^()]*\)/m,
lookbehind: true,
inside: {
"keyword": {
pattern: /^(\s*)at(?= )/,
lookbehind: true
},
"source": [
{
pattern: /(\()\w+\.\w+:\d+(?=\))/,
lookbehind: true,
inside: {
"file": /^\w+\.\w+/,
"punctuation": /:/,
"line-number": {
pattern: /\b\d+\b/,
alias: "number"
}
}
},
{
pattern: /(\()[^()]*(?=\))/,
lookbehind: true,
inside: {
"keyword": /^(?:Native Method|Unknown Source)$/
}
}
],
"class-name": /[\w$]+(?=\.(?:<init>|[\w$]+)\()/,
"function": /(?:<init>|[\w$]+)(?=\()/,
"class-loader": {
pattern: /(\s)[a-z]\w*(?:\.[a-z]\w*)*(?=\/[\w@$.]*\/)/,
lookbehind: true,
alias: "namespace",
inside: {
"punctuation": /\./
}
},
"module": {
pattern: /([\s/])[a-z]\w*(?:\.[a-z]\w*)*(?:@[\w$.+-]*)?(?=\/)/,
lookbehind: true,
inside: {
"version": {
pattern: /(@)[\s\S]+/,
lookbehind: true,
alias: "number"
},
"punctuation": /[@.]/
}
},
"namespace": {
pattern: /(?:\b[a-z]\w*\.)+/,
inside: {
"punctuation": /\./
}
},
"punctuation": /[()/.]/
}
},
"more": {
pattern: /^([\t ]*)\.{3} \d+ [a-z]+(?: [a-z]+)*/m,
lookbehind: true,
inside: {
"punctuation": /\.{3}/,
"number": /\d+/,
"keyword": /\b[a-z]+(?: [a-z]+)*\b/
}
}
};
Prism.languages.jexl = {
"string": /(["'])(?:\\[\s\S]|(?!\1)[^\\])*\1/,
"transform": {
pattern: /(\|\s*)[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][\wа-яА-Я\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*/,
alias: "function",
lookbehind: true
},
"function": /[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][\wа-яА-Я\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*\s*(?=\()/,
"number": /\b\d+(?:\.\d+)?\b|\B\.\d+\b/,
"operator": /[<>!]=?|-|\+|&&|==|\|\|?|\/\/?|[?:*^%]/,
"boolean": /\b(?:false|true)\b/,
"keyword": /\bin\b/,
"punctuation": /[{}[\](),.]/
};
Prism.languages.jolie = Prism.languages.extend("clike", {
"string": {
pattern: /(^|[^\\])"(?:\\[\s\S]|[^"\\])*"/,
lookbehind: true,
greedy: true
},
"class-name": {
pattern: /((?:\b(?:as|courier|embed|in|inputPort|outputPort|service)\b|@)[ \t]*)\w+/,
lookbehind: true
},
"keyword": /\b(?:as|cH|comp|concurrent|constants|courier|cset|csets|default|define|else|embed|embedded|execution|exit|extender|for|foreach|forward|from|global|if|import|in|include|init|inputPort|install|instanceof|interface|is_defined|linkIn|linkOut|main|new|nullProcess|outputPort|over|private|provide|public|scope|sequential|service|single|spawn|synchronized|this|throw|throws|type|undef|until|while|with)\b/,
"function": /\b[a-z_]\w*(?=[ \t]*[@(])/i,
"number": /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?l?/i,
"operator": /-[-=>]?|\+[+=]?|<[<=]?|[>=*!]=?|&&|\|\||[?\/%^@|]/,
"punctuation": /[()[\]{},;.:]/,
"builtin": /\b(?:Byte|any|bool|char|double|enum|float|int|length|long|ranges|regex|string|undefined|void)\b/
});
Prism.languages.insertBefore("jolie", "keyword", {
"aggregates": {
pattern: /(\bAggregates\s*:\s*)(?:\w+(?:\s+with\s+\w+)?\s*,\s*)*\w+(?:\s+with\s+\w+)?/,
lookbehind: true,
inside: {
"keyword": /\bwith\b/,
"class-name": /\w+/,
"punctuation": /,/
}
},
"redirects": {
pattern: /(\bRedirects\s*:\s*)(?:\w+\s*=>\s*\w+\s*,\s*)*(?:\w+\s*=>\s*\w+)/,
lookbehind: true,
inside: {
"punctuation": /,/,
"class-name": /\w+/,
"operator": /=>/
}
},
"property": {
pattern: /\b(?:Aggregates|[Ii]nterfaces|Java|Javascript|Jolie|[Ll]ocation|OneWay|[Pp]rotocol|Redirects|RequestResponse)\b(?=[ \t]*:)/
}
});
(function(Prism2) {
var interpolation = /\\\((?:[^()]|\([^()]*\))*\)/.source;
var string = RegExp(/(^|[^\\])"(?:[^"\r\n\\]|\\[^\r\n(]|__)*"/.source.replace(/__/g, function() {
return interpolation;
}));
var stringInterpolation = {
"interpolation": {
pattern: RegExp(/((?:^|[^\\])(?:\\{2})*)/.source + interpolation),
lookbehind: true,
inside: {
"content": {
pattern: /^(\\\()[\s\S]+(?=\)$)/,
lookbehind: true,
inside: null
},
"punctuation": /^\\\(|\)$/
}
}
};
var jq = Prism2.languages.jq = {
"comment": /#.*/,
"property": {
pattern: RegExp(string.source + /(?=\s*:(?!:))/.source),
lookbehind: true,
greedy: true,
inside: stringInterpolation
},
"string": {
pattern: string,
lookbehind: true,
greedy: true,
inside: stringInterpolation
},
"function": {
pattern: /(\bdef\s+)[a-z_]\w+/i,
lookbehind: true
},
"variable": /\B\$\w+/,
"property-literal": {
pattern: /\b[a-z_]\w*(?=\s*:(?!:))/i,
alias: "property"
},
"keyword": /\b(?:as|break|catch|def|elif|else|end|foreach|if|import|include|label|module|modulemeta|null|reduce|then|try|while)\b/,
"boolean": /\b(?:false|true)\b/,
"number": /(?:\b\d+\.|\B\.)?\b\d+(?:[eE][+-]?\d+)?\b/,
"operator": [
{
pattern: /\|=?/,
alias: "pipe"
},
/\.\.|[!=<>]?=|\?\/\/|\/\/=?|[-+*/%]=?|[<>?]|\b(?:and|not|or)\b/
],
"c-style-function": {
pattern: /\b[a-z_]\w*(?=\s*\()/i,
alias: "function"
},
"punctuation": /::|[()\[\]{},:;]|\.(?=\s*[\[\w$])/,
"dot": {
pattern: /\./,
alias: "important"
}
};
stringInterpolation.interpolation.inside.content.inside = jq;
})(Prism);
(function(Prism2) {
Prism2.languages.typescript = Prism2.languages.extend("javascript", {
"class-name": {
pattern: /(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,
lookbehind: true,
greedy: true,
inside: null
},
"builtin": /\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/
});
Prism2.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/, /\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/, /\btype\b(?=\s*(?:[\{*]|$))/);
delete Prism2.languages.typescript["parameter"];
delete Prism2.languages.typescript["literal-property"];
var typeInside = Prism2.languages.extend("typescript", {});
delete typeInside["class-name"];
Prism2.languages.typescript["class-name"].inside = typeInside;
Prism2.languages.insertBefore("typescript", "function", {
"decorator": {
pattern: /@[$\w\xA0-\uFFFF]+/,
inside: {
"at": {
pattern: /^@/,
alias: "operator"
},
"function": /^[\s\S]+/
}
},
"generic-function": {
pattern: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,
greedy: true,
inside: {
"function": /^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,
"generic": {
pattern: /<[\s\S]+/,
alias: "class-name",
inside: typeInside
}
}
}
});
Prism2.languages.ts = Prism2.languages.typescript;
})(Prism);
(function(Prism2) {
var javascript = Prism2.languages.javascript;
var type = /\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source;
var parameterPrefix = "(@(?:arg|argument|param|property)\\s+(?:" + type + "\\s+)?)";
Prism2.languages.jsdoc = Prism2.languages.extend("javadoclike", {
"parameter": {
pattern: RegExp(parameterPrefix + /(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),
lookbehind: true,
inside: {
"punctuation": /\./
}
}
});
Prism2.languages.insertBefore("jsdoc", "keyword", {
"optional-parameter": {
pattern: RegExp(parameterPrefix + /\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),
lookbehind: true,
inside: {
"parameter": {
pattern: /(^\[)[$\w\xA0-\uFFFF\.]+/,
lookbehind: true,
inside: {
"punctuation": /\./
}
},
"code": {
pattern: /(=)[\s\S]*(?=\]$)/,
lookbehind: true,
inside: javascript,
alias: "language-javascript"
},
"punctuation": /[=[\]]/
}
},
"class-name": [
{
pattern: RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?:<TYPE>\s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(/<TYPE>/g, function() {
return type;
})),
lookbehind: true,
inside: {
"punctuation": /\./
}
},
{
pattern: RegExp("(@[a-z]+\\s+)" + type),
lookbehind: true,
inside: {
"string": javascript.string,
"number": javascript.number,
"boolean": javascript.boolean,
"keyword": Prism2.languages.typescript.keyword,
"operator": /=>|\.\.\.|[&|?:*]/,
"punctuation": /[.,;=<>{}()[\]]/
}
}
],
"example": {
pattern: /(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,
lookbehind: true,
inside: {
"code": {
pattern: /^([\t ]*(?:\*\s*)?)\S.*$/m,
lookbehind: true,
inside: javascript,
alias: "language-javascript"
}
}
}
});
Prism2.languages.javadoclike.addSupport("javascript", Prism2.languages.jsdoc);
})(Prism);
(function(Prism2) {
Prism2.languages.insertBefore("javascript", "function-variable", {
"method-variable": {
pattern: RegExp("(\\.\\s*)" + Prism2.languages.javascript["function-variable"].pattern.source),
lookbehind: true,
alias: ["function-variable", "method", "function", "property-access"]
}
});
Prism2.languages.insertBefore("javascript", "function", {
"method": {
pattern: RegExp("(\\.\\s*)" + Prism2.languages.javascript["function"].source),
lookbehind: true,
alias: ["function", "property-access"]
}
});
Prism2.languages.insertBefore("javascript", "constant", {
"known-class-name": [
{
pattern: /\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,
alias: "class-name"
},
{
pattern: /\b(?:[A-Z]\w*)Error\b/,
alias: "class-name"
}
]
});
function withId(source, flags) {
return RegExp(source.replace(/<ID>/g, function() {
return /(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source;
}), flags);
}
Prism2.languages.insertBefore("javascript", "keyword", {
"imports": {
pattern: withId(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source),
lookbehind: true,
inside: Prism2.languages.javascript
},
"exports": {
pattern: withId(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),
lookbehind: true,
inside: Prism2.languages.javascript
}
});
Prism2.languages.javascript["keyword"].unshift({
pattern: /\b(?:as|default|export|from|import)\b/,
alias: "module"
}, {
pattern: /\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,
alias: "control-flow"
}, {
pattern: /\bnull\b/,
alias: ["null", "nil"]
}, {
pattern: /\bundefined\b/,
alias: "nil"
});
Prism2.languages.insertBefore("javascript", "operator", {
"spread": {
pattern: /\.{3}/,
alias: "operator"
},
"arrow": {
pattern: /=>/,
alias: "operator"
}
});
Prism2.languages.insertBefore("javascript", "punctuation", {
"property-access": {
pattern: withId(/(\.\s*)#?<ID>/.source),
lookbehind: true
},
"maybe-class-name": {
pattern: /(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,
lookbehind: true
},
"dom": {
pattern: /\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,
alias: "variable"
},
"console": {
pattern: /\bconsole(?=\s*\.)/,
alias: "class-name"
}
});
var maybeClassNameTokens = ["function", "function-variable", "method", "method-variable", "property-access"];
for (var i = 0; i < maybeClassNameTokens.length; i++) {
var token = maybeClassNameTokens[i];
var value = Prism2.languages.javascript[token];
if (Prism2.util.type(value) === "RegExp") {
value = Prism2.languages.javascript[token] = {
pattern: value
};
}
var inside = value.inside || {};
value.inside = inside;
inside["maybe-class-name"] = /^[A-Z][\s\S]*/;
}
})(Prism);
Prism.languages.json = {
"property": {
pattern: /(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,
lookbehind: true,
greedy: true
},
"string": {
pattern: /(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,
lookbehind: true,
greedy: true
},
"comment": {
pattern: /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,
greedy: true
},
"number": /-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,
"punctuation": /[{}[\],]/,
"operator": /:/,
"boolean": /\b(?:false|true)\b/,
"null": {
pattern: /\bnull\b/,
alias: "keyword"
}
};
Prism.languages.webmanifest = Prism.languages.json;
(function(Prism2) {
var string = /("|')(?:\\(?:\r\n?|\n|.)|(?!\1)[^\\\r\n])*\1/;
Prism2.languages.json5 = Prism2.languages.extend("json", {
"property": [
{
pattern: RegExp(string.source + "(?=\\s*:)"),
greedy: true
},
{
pattern: /(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/,
alias: "unquoted"
}
],
"string": {
pattern: string,
greedy: true
},
"number": /[+-]?\b(?:NaN|Infinity|0x[a-fA-F\d]+)\b|[+-]?(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+\b)?/
});
})(Prism);
Prism.languages.jsonp = Prism.languages.extend("json", {
"punctuation": /[{}[\]();,.]/
});
Prism.languages.insertBefore("jsonp", "punctuation", {
"function": /(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*\()/
});
Prism.languages.jsstacktrace = {
"error-message": {
pattern: /^\S.*/m,
alias: "string"
},
"stack-frame": {
pattern: /(^[ \t]+)at[ \t].*/m,
lookbehind: true,
inside: {
"not-my-code": {
pattern: /^at[ \t]+(?!\s)(?:node\.js|<unknown>|.*(?:node_modules|\(<anonymous>\)|\(<unknown>|<anonymous>$|\(internal\/|\(node\.js)).*/m,
alias: "comment"
},
"filename": {
pattern: /(\bat\s+(?!\s)|\()(?:[a-zA-Z]:)?[^():]+(?=:)/,
lookbehind: true,
alias: "url"
},
"function": {
pattern: /(\bat\s+(?:new\s+)?)(?!\s)[_$a-zA-Z\xA0-\uFFFF<][.$\w\xA0-\uFFFF<>]*/,
lookbehind: true,
inside: {
"punctuation": /\./
}
},
"punctuation": /[()]/,
"keyword": /\b(?:at|new)\b/,
"alias": {
pattern: /\[(?:as\s+)?(?!\s)[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\]/,
alias: "variable"
},
"line-number": {
pattern: /:\d+(?::\d+)?\b/,
alias: "number",
inside: {
"punctuation": /:/
}
}
}
}
};
(function(Prism2) {
var templateString = Prism2.languages.javascript["template-string"];
var templateLiteralPattern = templateString.pattern.source;
var interpolationObject = templateString.inside["interpolation"];
var interpolationPunctuationObject = interpolationObject.inside["interpolation-punctuation"];
var interpolationPattern = interpolationObject.pattern.source;
function createTemplate(language, tag) {
if (!Prism2.languages[language]) {
return void 0;
}
return {
pattern: RegExp("((?:" + tag + ")\\s*)" + templateLiteralPattern),
lookbehind: true,
greedy: true,
inside: {
"template-punctuation": {
pattern: /^`|`$/,
alias: "string"
},
"embedded-code": {
pattern: /[\s\S]+/,
alias: language
}
}
};
}
Prism2.languages.javascript["template-string"] = [
createTemplate("css", /\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),
createTemplate("html", /\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),
createTemplate("svg", /\bsvg/.source),
createTemplate("markdown", /\b(?:markdown|md)/.source),
createTemplate("graphql", /\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),
createTemplate("sql", /\bsql/.source),
templateString
].filter(Boolean);
function getPlaceholder(counter, language) {
return "___" + language.toUpperCase() + "_" + counter + "___";
}
function tokenizeWithHooks(code, grammar, language) {
var env = {
code,
grammar,
language
};
Prism2.hooks.run("before-tokenize", env);
env.tokens = Prism2.tokenize(env.code, env.grammar);
Prism2.hooks.run("after-tokenize", env);
return env.tokens;
}
function tokenizeInterpolationExpression(expression) {
var tempGrammar = {};
tempGrammar["interpolation-punctuation"] = interpolationPunctuationObject;
var tokens = Prism2.tokenize(expression, tempGrammar);
if (tokens.length === 3) {
var args = [1, 1];
args.push.apply(args, tokenizeWithHooks(tokens[1], Prism2.languages.javascript, "javascript"));
tokens.splice.apply(tokens, args);
}
return new Prism2.Token("interpolation", tokens, interpolationObject.alias, expression);
}
function tokenizeEmbedded(code, grammar, language) {
var _tokens = Prism2.tokenize(code, {
"interpolation": {
pattern: RegExp(interpolationPattern),
lookbehind: true
}
});
var placeholderCounter = 0;
var placeholderMap = {};
var embeddedCode = _tokens.map(function(token) {
if (typeof token === "string") {
return token;
} else {
var interpolationExpression = token.content;
var placeholder;
while (code.indexOf(placeholder = getPlaceholder(placeholderCounter++, language)) !== -1) {
}
placeholderMap[placeholder] = interpolationExpression;
return placeholder;
}
}).join("");
var embeddedTokens = tokenizeWithHooks(embeddedCode, grammar, language);
var placeholders = Object.keys(placeholderMap);
placeholderCounter = 0;
function walkTokens(tokens) {
for (var i = 0; i < tokens.length; i++) {
if (placeholderCounter >= placeholders.length) {
return;
}
var token = tokens[i];
if (typeof token === "string" || typeof token.content === "string") {
var placeholder = placeholders[placeholderCounter];
var s = typeof token === "string" ? token : token.content;
var index = s.indexOf(placeholder);
if (index !== -1) {
++placeholderCounter;
var before = s.substring(0, index);
var middle = tokenizeInterpolationExpression(placeholderMap[placeholder]);
var after = s.substring(index + placeholder.length);
var replacement = [];
if (before) {
replacement.push(before);
}
replacement.push(middle);
if (after) {
var afterTokens = [after];
walkTokens(afterTokens);
replacement.push.apply(replacement, afterTokens);
}
if (typeof token === "string") {
tokens.splice.apply(tokens, [i, 1].concat(replacement));
i += replacement.length - 1;
} else {
token.content = replacement;
}
}
} else {
var content = token.content;
if (Array.isArray(content)) {
walkTokens(content);
} else {
walkTokens([content]);
}
}
}
}
walkTokens(embeddedTokens);
return new Prism2.Token(language, embeddedTokens, "language-" + language, code);
}
var supportedLanguages = {
"javascript": true,
"js": true,
"typescript": true,
"ts": true,
"jsx": true,
"tsx": true
};
Prism2.hooks.add("after-tokenize", function(env) {
if (!(env.language in supportedLanguages)) {
return;
}
function findTemplateStrings(tokens) {
for (var i = 0, l = tokens.length; i < l; i++) {
var token = tokens[i];
if (typeof token === "string") {
continue;
}
var content = token.content;
if (!Array.isArray(content)) {
if (typeof content !== "string") {
findTemplateStrings([content]);
}
continue;
}
if (token.type === "template-string") {
var embedded = content[1];
if (content.length === 3 && typeof embedded !== "string" && embedded.type === "embedded-code") {
var code = stringContent(embedded);
var alias = embedded.alias;
var language = Array.isArray(alias) ? alias[0] : alias;
var grammar = Prism2.languages[language];
if (!grammar) {
continue;
}
content[1] = tokenizeEmbedded(code, grammar, language);
}
} else {
findTemplateStrings(content);
}
}
}
findTemplateStrings(env.tokens);
});
function stringContent(value) {
if (typeof value === "string") {
return value;
} else if (Array.isArray(value)) {
return value.map(stringContent).join("");
} else {
return stringContent(value.content);
}
}
})(Prism);
Prism.languages.julia = {
"comment": {
pattern: /(^|[^\\])(?:#=(?:[^#=]|=(?!#)|#(?!=)|#=(?:[^#=]|=(?!#)|#(?!=))*=#)*=#|#.*)/,
lookbehind: true
},
"regex": {
pattern: /r"(?:\\.|[^"\\\r\n])*"[imsx]{0,4}/,
greedy: true
},
"string": {
pattern: /"""[\s\S]+?"""|(?:\b\w+)?"(?:\\.|[^"\\\r\n])*"|`(?:[^\\`\r\n]|\\.)*`/,
greedy: true
},
"char": {
pattern: /(^|[^\w'])'(?:\\[^\r\n][^'\r\n]*|[^\\\r\n])'/,
lookbehind: true,
greedy: true
},
"keyword": /\b(?:abstract|baremodule|begin|bitstype|break|catch|ccall|const|continue|do|else|elseif|end|export|finally|for|function|global|if|immutable|import|importall|in|let|local|macro|module|print|println|quote|return|struct|try|type|typealias|using|while)\b/,
"boolean": /\b(?:false|true)\b/,
"number": /(?:\b(?=\d)|\B(?=\.))(?:0[box])?(?:[\da-f]+(?:_[\da-f]+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[efp][+-]?\d+(?:_\d+)*)?j?/i,
"operator": /&&|\|\||[-+*^%÷⊻&$\\]=?|\/[\/=]?|!=?=?|\|[=>]?|<(?:<=?|[=:|])?|>(?:=|>>?=?)?|==?=?|[~≠≤≥'√∛]/,
"punctuation": /::?|[{}[\]();,.?]/,
"constant": /\b(?:(?:Inf|NaN)(?:16|32|64)?|im|pi)\b|[πℯ]/
};
Prism.languages.keepalived = {
"comment": {
pattern: /[#!].*/,
greedy: true
},
"string": {
pattern: /(^|[^\\])(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/,
lookbehind: true,
greedy: true
},
"ip": {
pattern: RegExp(/\b(?:(?:(?:[\da-f]{1,4}:){7}[\da-f]{1,4}|(?:[\da-f]{1,4}:){6}:[\da-f]{1,4}|(?:[\da-f]{1,4}:){5}:(?:[\da-f]{1,4}:)?[\da-f]{1,4}|(?:[\da-f]{1,4}:){4}:(?:[\da-f]{1,4}:){0,2}[\da-f]{1,4}|(?:[\da-f]{1,4}:){3}:(?:[\da-f]{1,4}:){0,3}[\da-f]{1,4}|(?:[\da-f]{1,4}:){2}:(?:[\da-f]{1,4}:){0,4}[\da-f]{1,4}|(?:[\da-f]{1,4}:){6}<ipv4>|(?:[\da-f]{1,4}:){0,5}:<ipv4>|::(?:[\da-f]{1,4}:){0,5}<ipv4>|[\da-f]{1,4}::(?:[\da-f]{1,4}:){0,5}[\da-f]{1,4}|::(?:[\da-f]{1,4}:){0,6}[\da-f]{1,4}|(?:[\da-f]{1,4}:){1,7}:)(?:\/\d{1,3})?|<ipv4>(?:\/\d{1,2})?)\b/.source.replace(/<ipv4>/g, function() {
return /(?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d))/.source;
}), "i"),
alias: "number"
},
"path": {
pattern: /(\s)\/(?:[^\/\s]+\/)*[^\/\s]*|\b[a-zA-Z]:\\(?:[^\\\s]+\\)*[^\\\s]*/,
lookbehind: true,
alias: "string"
},
"variable": /\$\{?\w+\}?/,
"email": {
pattern: /[\w-]+@[\w-]+(?:\.[\w-]{2,3}){1,2}/,
alias: "string"
},
"conditional-configuration": {
pattern: /@\^?[\w-]+/,
alias: "variable"
},
"operator": /=/,
"property": /\b(?:BFD_CHECK|DNS_CHECK|FILE_CHECK|HTTP_GET|MISC_CHECK|NAME|PING_CHECK|SCRIPTS|SMTP_CHECK|SSL|SSL_GET|TCP_CHECK|UDP_CHECK|accept|advert_int|alpha|auth_pass|auth_type|authentication|bfd_cpu_affinity|bfd_instance|bfd_no_swap|bfd_priority|bfd_process_name|bfd_rlimit_rttime|bfd_rt_priority|bind_if|bind_port|bindto|ca|certificate|check_unicast_src|checker|checker_cpu_affinity|checker_log_all_failures|checker_no_swap|checker_priority|checker_rlimit_rttime|checker_rt_priority|child_wait_time|connect_ip|connect_port|connect_timeout|dbus_service_name|debug|default_interface|delay|delay_before_retry|delay_loop|digest|dont_track_primary|dynamic|dynamic_interfaces|enable_(?:dbus|script_security|sni|snmp_checker|snmp_rfc|snmp_rfcv2|snmp_rfcv3|snmp_vrrp|traps)|end|fall|fast_recovery|file|flag-[123]|fork_delay|full_command|fwmark|garp_group|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|global_defs|global_tracking|gna_interval|group|ha_suspend|hashed|helo_name|higher_prio_send_advert|hoplimit|http_protocol|hysteresis|idle_tx|include|inhibit_on_failure|init_fail|init_file|instance|interface|interfaces|interval|ip_family|ipvs_process_name|keepalived.conf|kernel_rx_buf_size|key|linkbeat_interfaces|linkbeat_use_polling|log_all_failures|log_unknown_vrids|lower_prio_no_advert|lthreshold|lvs_flush|lvs_flush_onstop|lvs_method|lvs_netlink_cmd_rcv_bufs|lvs_netlink_cmd_rcv_bufs_force|lvs_netlink_monitor_rcv_bufs|lvs_netlink_monitor_rcv_bufs_force|lvs_notify_fifo|lvs_notify_fifo_script|lvs_sched|lvs_sync_daemon|max_auto_priority|max_hops|mcast_src_ip|mh-fallback|mh-port|min_auto_priority_delay|min_rx|min_tx|misc_dynamic|misc_path|misc_timeout|multiplier|name|namespace_with_ipsets|native_ipv6|neighbor_ip|net_namespace|net_namespace_ipvs|nftables|nftables_counters|nftables_ifindex|nftables_priority|no_accept|no_checker_emails|no_email_faults|nopreempt|notification_email|notification_email_from|notify|notify_backup|notify_deleted|notify_down|notify_fault|notify_fifo|notify_fifo_script|notify_master|notify_master_rx_lower_pri|notify_priority_changes|notify_stop|notify_up|old_unicast_checksum|omega|ops|param_match|passive|password|path|persistence_engine|persistence_granularity|persistence_timeout|preempt|preempt_delay|priority|process|process_monitor_rcv_bufs|process_monitor_rcv_bufs_force|process_name|process_names|promote_secondaries|protocol|proxy_arp|proxy_arp_pvlan|quorum|quorum_down|quorum_max|quorum_up|random_seed|real_server|regex|regex_max_offset|regex_min_offset|regex_no_match|regex_options|regex_stack|reload_repeat|reload_time_file|require_reply|retry|rise|router_id|rs_init_notifies|script|script_user|sh-fallback|sh-port|shutdown_script|shutdown_script_timeout|skip_check_adv_addr|smtp_alert|smtp_alert_checker|smtp_alert_vrrp|smtp_connect_timeout|smtp_helo_name|smtp_server|snmp_socket|sorry_server|sorry_server_inhibit|sorry_server_lvs_method|source_ip|start|startup_script|startup_script_timeout|state|static_ipaddress|static_routes|static_rules|status_code|step|strict_mode|sync_group_tracking_weight|terminate_delay|timeout|track_bfd|track_file|track_group|track_interface|track_process|track_script|track_src_ip|ttl|type|umask|unicast_peer|unicast_src_ip|unicast_ttl|url|use_ipvlan|use_pid_dir|use_vmac|user|uthreshold|val[123]|version|virtual_ipaddress|virtual_ipaddress_excluded|virtual_router_id|virtual_routes|virtual_rules|virtual_server|virtual_server_group|virtualhost|vmac_xmit_base|vrrp|vrrp_(?:check_unicast_src|cpu_affinity|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|gna_interval|higher_prio_send_advert|instance|ipsets|iptables|lower_prio_no_advert|mcast_group4|mcast_group6|min_garp|netlink_cmd_rcv_bufs|netlink_cmd_rcv_bufs_force|netlink_monitor_rcv_bufs|netlink_monitor_rcv_bufs_force|no_swap|notify_fifo|notify_fifo_script|notify_priority_changes|priority|process_name|rlimit_rttime|rt_priority|rx_bufs_multiplier|rx_bufs_policy|script|skip_check_adv_addr|startup_delay|strict|sync_group|track_process|version)|warmup|weight)\b/,
"constant": /\b(?:A|AAAA|AH|BACKUP|CNAME|DR|MASTER|MX|NAT|NS|PASS|SCTP|SOA|TCP|TUN|TXT|UDP|dh|fo|lblc|lblcr|lc|mh|nq|ovf|rr|sed|sh|wlc|wrr)\b/,
"number": {
pattern: /(^|[^\w.-])-?\d+(?:\.\d+)?/,
lookbehind: true
},
"boolean": /\b(?:false|no|off|on|true|yes)\b/,
"punctuation": /[\{\}]/
};
Prism.languages.keyman = {
"comment": {
pattern: /\bc .*/i,
greedy: true
},
"string": {
pattern: /"[^"\r\n]*"|'[^'\r\n]*'/,
greedy: true
},
"virtual-key": {
pattern: /\[\s*(?:(?:ALT|CAPS|CTRL|LALT|LCTRL|NCAPS|RALT|RCTRL|SHIFT)\s+)*(?:[TKU]_[\w?]+|[A-E]\d\d?|"[^"\r\n]*"|'[^'\r\n]*')\s*\]/i,
greedy: true,
alias: "function"
},
"header-keyword": {
pattern: /&\w+/,
alias: "bold"
},
"header-statement": {
pattern: /\b(?:bitmap|bitmaps|caps always off|caps on only|copyright|hotkey|language|layout|message|name|shift frees caps|version)\b/i,
alias: "bold"
},
"rule-keyword": {
pattern: /\b(?:any|baselayout|beep|call|context|deadkey|dk|if|index|layer|notany|nul|outs|platform|reset|return|save|set|store|use)\b/i,
alias: "keyword"
},
"structural-keyword": {
pattern: /\b(?:ansi|begin|group|match|newcontext|nomatch|postkeystroke|readonly|unicode|using keys)\b/i,
alias: "keyword"
},
"compile-target": {
pattern: /\$(?:keyman|keymanonly|keymanweb|kmfl|weaver):/i,
alias: "property"
},
"number": /\b(?:U\+[\dA-F]+|d\d+|x[\da-f]+|\d+)\b/i,
"operator": /[+>\\$]|\.\./,
"punctuation": /[()=,]/
};
(function(Prism2) {
Prism2.languages.kotlin = Prism2.languages.extend("clike", {
"keyword": {
pattern: /(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,
lookbehind: true
},
"function": [
{
pattern: /(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,
greedy: true
},
{
pattern: /(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,
lookbehind: true,
greedy: true
}
],
"number": /\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,
"operator": /\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/
});
delete Prism2.languages.kotlin["class-name"];
var interpolationInside = {
"interpolation-punctuation": {
pattern: /^\$\{?|\}$/,
alias: "punctuation"
},
"expression": {
pattern: /[\s\S]+/,
inside: Prism2.languages.kotlin
}
};
Prism2.languages.insertBefore("kotlin", "string", {
"string-literal": [
{
pattern: /"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,
alias: "multiline",
inside: {
"interpolation": {
pattern: /\$(?:[a-z_]\w*|\{[^{}]*\})/i,
inside: interpolationInside
},
"string": /[\s\S]+/
}
},
{
pattern: /"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,
alias: "singleline",
inside: {
"interpolation": {
pattern: /((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,
lookbehind: true,
inside: interpolationInside
},
"string": /[\s\S]+/
}
}
],
"char": {
pattern: /'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,
greedy: true
}
});
delete Prism2.languages.kotlin["string"];
Prism2.languages.insertBefore("kotlin", "keyword", {
"annotation": {
pattern: /\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,
alias: "builtin"
}
});
Prism2.languages.insertBefore("kotlin", "function", {
"label": {
pattern: /\b\w+@|@\w+\b/,
alias: "symbol"
}
});
Prism2.languages.kt = Prism2.languages.kotlin;
Prism2.languages.kts = Prism2.languages.kotlin;
})(Prism);
(function(Prism2) {
var nonId = /\s\x00-\x1f\x22-\x2f\x3a-\x3f\x5b-\x5e\x60\x7b-\x7e/.source;
function wrapId(pattern, flags) {
return RegExp(pattern.replace(/<nonId>/g, nonId), flags);
}
Prism2.languages.kumir = {
"comment": {
pattern: /\|.*/
},
"prolog": {
pattern: /#.*/,
greedy: true
},
"string": {
pattern: /"[^\n\r"]*"|'[^\n\r']*'/,
greedy: true
},
"boolean": {
pattern: wrapId(/(^|[<nonId>])(?:да|нет)(?=[<nonId>]|$)/.source),
lookbehind: true
},
"operator-word": {
pattern: wrapId(/(^|[<nonId>])(?:и|или|не)(?=[<nonId>]|$)/.source),
lookbehind: true,
alias: "keyword"
},
"system-variable": {
pattern: wrapId(/(^|[<nonId>])знач(?=[<nonId>]|$)/.source),
lookbehind: true,
alias: "keyword"
},
"type": [
{
pattern: wrapId(/(^|[<nonId>])(?:вещ|лит|лог|сим|цел)(?:\x20*таб)?(?=[<nonId>]|$)/.source),
lookbehind: true,
alias: "builtin"
},
{
pattern: wrapId(/(^|[<nonId>])(?:компл|сканкод|файл|цвет)(?=[<nonId>]|$)/.source),
lookbehind: true,
alias: "important"
}
],
"keyword": {
pattern: wrapId(/(^|[<nonId>])(?:алг|арг(?:\x20*рез)?|ввод|ВКЛЮЧИТЬ|вс[её]|выбор|вывод|выход|дано|для|до|дс|если|иначе|исп|использовать|кон(?:(?:\x20+|_)исп)?|кц(?:(?:\x20+|_)при)?|надо|нач|нс|нц|от|пауза|пока|при|раза?|рез|стоп|таб|то|утв|шаг)(?=[<nonId>]|$)/.source),
lookbehind: true
},
"name": {
pattern: wrapId(/(^|[<nonId>])[^\d<nonId>][^<nonId>]*(?:\x20+[^<nonId>]+)*(?=[<nonId>]|$)/.source),
lookbehind: true
},
"number": {
pattern: wrapId(/(^|[<nonId>])(?:\B\$[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)(?=[<nonId>]|$)/.source, "i"),
lookbehind: true
},
"punctuation": /:=|[(),:;\[\]]/,
"operator-char": {
pattern: /\*\*?|<[=>]?|>=?|[-+/=]/,
alias: "operator"
}
};
Prism2.languages.kum = Prism2.languages.kumir;
})(Prism);
Prism.languages.kusto = {
"comment": {
pattern: /\/\/.*/,
greedy: true
},
"string": {
pattern: /```[\s\S]*?```|[hH]?(?:"(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\.)*'|@(?:"[^\r\n"]*"|'[^\r\n']*'))/,
greedy: true
},
"verb": {
pattern: /(\|\s*)[a-z][\w-]*/i,
lookbehind: true,
alias: "keyword"
},
"command": {
pattern: /\.[a-z][a-z\d-]*\b/,
alias: "keyword"
},
"class-name": /\b(?:bool|datetime|decimal|dynamic|guid|int|long|real|string|timespan)\b/,
"keyword": /\b(?:access|alias|and|anti|as|asc|auto|between|by|(?:contains|(?:ends|starts)with|has(?:perfix|suffix)?)(?:_cs)?|database|declare|desc|external|from|fullouter|has_all|in|ingestion|inline|inner|innerunique|into|(?:left|right)(?:anti(?:semi)?|inner|outer|semi)?|let|like|local|not|of|on|or|pattern|print|query_parameters|range|restrict|schema|set|step|table|tables|to|view|where|with|matches\s+regex|nulls\s+(?:first|last))(?![\w-])/,
"boolean": /\b(?:false|null|true)\b/,
"function": /\b[a-z_]\w*(?=\s*\()/,
"datetime": [
{
pattern: /\b(?:(?:Fri|Friday|Mon|Monday|Sat|Saturday|Sun|Sunday|Thu|Thursday|Tue|Tuesday|Wed|Wednesday)\s*,\s*)?\d{1,2}(?:\s+|-)(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)(?:\s+|-)\d{2}\s+\d{2}:\d{2}(?::\d{2})?(?:\s*(?:\b(?:[A-Z]|(?:[ECMT][DS]|GM|U)T)|[+-]\d{4}))?\b/,
alias: "number"
},
{
pattern: /[+-]?\b(?:\d{4}-\d{2}-\d{2}(?:[ T]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)?|\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)Z?/,
alias: "number"
}
],
"number": /\b(?:0x[0-9A-Fa-f]+|\d+(?:\.\d+)?(?:[Ee][+-]?\d+)?)(?:(?:min|sec|[mnµ]s|[dhms]|microsecond|tick)\b)?|[+-]?\binf\b/,
"operator": /=>|[!=]~|[!=<>]=?|[-+*/%|]|\.\./,
"punctuation": /[()\[\]{},;.:]/
};
(function(Prism2) {
var funcPattern = /\\(?:[^a-z()[\]]|[a-z*]+)/i;
var insideEqu = {
"equation-command": {
pattern: funcPattern,
alias: "regex"
}
};
Prism2.languages.latex = {
"comment": /%.*/,
"cdata": {
pattern: /(\\begin\{((?:lstlisting|verbatim)\*?)\})[\s\S]*?(?=\\end\{\2\})/,
lookbehind: true
},
"equation": [
{
pattern: /\$\$(?:\\[\s\S]|[^\\$])+\$\$|\$(?:\\[\s\S]|[^\\$])+\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/,
inside: insideEqu,
alias: "string"
},
{
pattern: /(\\begin\{((?:align|eqnarray|equation|gather|math|multline)\*?)\})[\s\S]*?(?=\\end\{\2\})/,
lookbehind: true,
inside: insideEqu,
alias: "string"
}
],
"keyword": {
pattern: /(\\(?:begin|cite|documentclass|end|label|ref|usepackage)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,
lookbehind: true
},
"url": {
pattern: /(\\url\{)[^}]+(?=\})/,
lookbehind: true
},
"headline": {
pattern: /(\\(?:chapter|frametitle|paragraph|part|section|subparagraph|subsection|subsubparagraph|subsubsection|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\})/,
lookbehind: true,
alias: "class-name"
},
"function": {
pattern: funcPattern,
alias: "selector"
},
"punctuation": /[[\]{}&]/
};
Prism2.languages.tex = Prism2.languages.latex;
Prism2.languages.context = Prism2.languages.latex;
})(Prism);
(function(Prism2) {
Prism2.languages.latte = {
"comment": /^\{\*[\s\S]*/,
"latte-tag": {
pattern: /(^\{(?:\/(?=[a-z]))?)(?:[=_]|[a-z]\w*\b(?!\())/i,
lookbehind: true,
alias: "important"
},
"delimiter": {
pattern: /^\{\/?|\}$/,
alias: "punctuation"
},
"php": {
pattern: /\S(?:[\s\S]*\S)?/,
alias: "language-php",
inside: Prism2.languages.php
}
};
var markupLatte = Prism2.languages.extend("markup", {});
Prism2.languages.insertBefore("inside", "attr-value", {
"n-attr": {
pattern: /n:[\w-]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+))?/,
inside: {
"attr-name": {
pattern: /^[^\s=]+/,
alias: "important"
},
"attr-value": {
pattern: /=[\s\S]+/,
inside: {
"punctuation": [
/^=/,
{
pattern: /^(\s*)["']|["']$/,
lookbehind: true
}
],
"php": {
pattern: /\S(?:[\s\S]*\S)?/,
inside: Prism2.languages.php
}
}
}
}
}
}, markupLatte.tag);
Prism2.hooks.add("before-tokenize", function(env) {
if (env.language !== "latte") {
return;
}
var lattePattern = /\{\*[\s\S]*?\*\}|\{[^'"\s{}*](?:[^"'/{}]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|\/\*(?:[^*]|\*(?!\/))*\*\/)*\}/g;
Prism2.languages["markup-templating"].buildPlaceholders(env, "latte", lattePattern);
env.grammar = markupLatte;
});
Prism2.hooks.add("after-tokenize", function(env) {
Prism2.languages["markup-templating"].tokenizePlaceholders(env, "latte");
});
})(Prism);
Prism.languages.less = Prism.languages.extend("css", {
"comment": [
/\/\*[\s\S]*?\*\//,
{
pattern: /(^|[^\\])\/\/.*/,
lookbehind: true
}
],
"atrule": {
pattern: /@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,
inside: {
"punctuation": /[:()]/
}
},
"selector": {
pattern: /(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,
inside: {
"variable": /@+[\w-]+/
}
},
"property": /(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,
"operator": /[+\-*\/]/
});
Prism.languages.insertBefore("less", "property", {
"variable": [
{
pattern: /@[\w-]+\s*:/,
inside: {
"punctuation": /:/
}
},
/@@?[\w-]+/
],
"mixin-usage": {
pattern: /([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,
lookbehind: true,
alias: "function"
}
});
(function(Prism2) {
Prism2.languages.scheme = {
"comment": /;.*|#;\s*(?:\((?:[^()]|\([^()]*\))*\)|\[(?:[^\[\]]|\[[^\[\]]*\])*\])|#\|(?:[^#|]|#(?!\|)|\|(?!#)|#\|(?:[^#|]|#(?!\|)|\|(?!#))*\|#)*\|#/,
"string": {
pattern: /"(?:[^"\\]|\\.)*"/,
greedy: true
},
"symbol": {
pattern: /'[^()\[\]#'\s]+/,
greedy: true
},
"char": {
pattern: /#\\(?:[ux][a-fA-F\d]+\b|[-a-zA-Z]+\b|[\uD800-\uDBFF][\uDC00-\uDFFF]|\S)/,
greedy: true
},
"lambda-parameter": [
{
pattern: /((?:^|[^'`#])[(\[]lambda\s+)(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)/,
lookbehind: true
},
{
pattern: /((?:^|[^'`#])[(\[]lambda\s+[(\[])[^()\[\]']+/,
lookbehind: true
}
],
"keyword": {
pattern: /((?:^|[^'`#])[(\[])(?:begin|case(?:-lambda)?|cond(?:-expand)?|define(?:-library|-macro|-record-type|-syntax|-values)?|defmacro|delay(?:-force)?|do|else|except|export|guard|if|import|include(?:-ci|-library-declarations)?|lambda|let(?:rec)?(?:-syntax|-values|\*)?|let\*-values|only|parameterize|prefix|(?:quasi-?)?quote|rename|set!|syntax-(?:case|rules)|unless|unquote(?:-splicing)?|when)(?=[()\[\]\s]|$)/,
lookbehind: true
},
"builtin": {
pattern: /((?:^|[^'`#])[(\[])(?:abs|and|append|apply|assoc|ass[qv]|binary-port\?|boolean=?\?|bytevector(?:-append|-copy|-copy!|-length|-u8-ref|-u8-set!|\?)?|caar|cadr|call-with-(?:current-continuation|port|values)|call\/cc|car|cdar|cddr|cdr|ceiling|char(?:->integer|-ready\?|\?|<\?|<=\?|=\?|>\?|>=\?)|close-(?:input-port|output-port|port)|complex\?|cons|current-(?:error|input|output)-port|denominator|dynamic-wind|eof-object\??|eq\?|equal\?|eqv\?|error|error-object(?:-irritants|-message|\?)|eval|even\?|exact(?:-integer-sqrt|-integer\?|\?)?|expt|features|file-error\?|floor(?:-quotient|-remainder|\/)?|flush-output-port|for-each|gcd|get-output-(?:bytevector|string)|inexact\??|input-port(?:-open\?|\?)|integer(?:->char|\?)|lcm|length|list(?:->string|->vector|-copy|-ref|-set!|-tail|\?)?|make-(?:bytevector|list|parameter|string|vector)|map|max|member|memq|memv|min|modulo|negative\?|newline|not|null\?|number(?:->string|\?)|numerator|odd\?|open-(?:input|output)-(?:bytevector|string)|or|output-port(?:-open\?|\?)|pair\?|peek-char|peek-u8|port\?|positive\?|procedure\?|quotient|raise|raise-continuable|rational\?|rationalize|read-(?:bytevector|bytevector!|char|error\?|line|string|u8)|real\?|remainder|reverse|round|set-c[ad]r!|square|string(?:->list|->number|->symbol|->utf8|->vector|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?|<\?|<=\?|=\?|>\?|>=\?)?|substring|symbol(?:->string|\?|=\?)|syntax-error|textual-port\?|truncate(?:-quotient|-remainder|\/)?|u8-ready\?|utf8->string|values|vector(?:->list|->string|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?)?|with-exception-handler|write-(?:bytevector|char|string|u8)|zero\?)(?=[()\[\]\s]|$)/,
lookbehind: true
},
"operator": {
pattern: /((?:^|[^'`#])[(\[])(?:[-+*%/]|[<>]=?|=>?)(?=[()\[\]\s]|$)/,
lookbehind: true
},
"number": {
pattern: RegExp(SortedBNF({
"<ureal dec>": /\d+(?:\/\d+)|(?:\d+(?:\.\d*)?|\.\d+)(?:[esfdl][+-]?\d+)?/.source,
"<real dec>": /[+-]?<ureal dec>|[+-](?:inf|nan)\.0/.source,
"<imaginary dec>": /[+-](?:<ureal dec>|(?:inf|nan)\.0)?i/.source,
"<complex dec>": /<real dec>(?:@<real dec>|<imaginary dec>)?|<imaginary dec>/.source,
"<num dec>": /(?:#d(?:#[ei])?|#[ei](?:#d)?)?<complex dec>/.source,
"<ureal box>": /[0-9a-f]+(?:\/[0-9a-f]+)?/.source,
"<real box>": /[+-]?<ureal box>|[+-](?:inf|nan)\.0/.source,
"<imaginary box>": /[+-](?:<ureal box>|(?:inf|nan)\.0)?i/.source,
"<complex box>": /<real box>(?:@<real box>|<imaginary box>)?|<imaginary box>/.source,
"<num box>": /#[box](?:#[ei])?|(?:#[ei])?#[box]<complex box>/.source,
"<number>": /(^|[()\[\]\s])(?:<num dec>|<num box>)(?=[()\[\]\s]|$)/.source
}), "i"),
lookbehind: true
},
"boolean": {
pattern: /(^|[()\[\]\s])#(?:[ft]|false|true)(?=[()\[\]\s]|$)/,
lookbehind: true
},
"function": {
pattern: /((?:^|[^'`#])[(\[])(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)(?=[()\[\]\s]|$)/,
lookbehind: true
},
"identifier": {
pattern: /(^|[()\[\]\s])\|(?:[^\\|]|\\.)*\|(?=[()\[\]\s]|$)/,
lookbehind: true,
greedy: true
},
"punctuation": /[()\[\]']/
};
function SortedBNF(grammar) {
for (var key in grammar) {
grammar[key] = grammar[key].replace(/<[\w\s]+>/g, function(key2) {
return "(?:" + grammar[key2].trim() + ")";
});
}
return grammar[key];
}
})(Prism);
(function(Prism2) {
var schemeExpression = /\((?:[^();"#\\]|\\[\s\S]|;.*(?!.)|"(?:[^"\\]|\\.)*"|#(?:\{(?:(?!#\})[\s\S])*#\}|[^{])|<expr>)*\)/.source;
var recursivenessLog2 = 5;
for (var i = 0; i < recursivenessLog2; i++) {
schemeExpression = schemeExpression.replace(/<expr>/g, function() {
return schemeExpression;
});
}
schemeExpression = schemeExpression.replace(/<expr>/g, /[^\s\S]/.source);
var lilypond = Prism2.languages.lilypond = {
"comment": /%(?:(?!\{).*|\{[\s\S]*?%\})/,
"embedded-scheme": {
pattern: RegExp(/(^|[=\s])#(?:"(?:[^"\\]|\\.)*"|[^\s()"]*(?:[^\s()]|<expr>))/.source.replace(/<expr>/g, function() {
return schemeExpression;
}), "m"),
lookbehind: true,
greedy: true,
inside: {
"scheme": {
pattern: /^(#)[\s\S]+$/,
lookbehind: true,
alias: "language-scheme",
inside: {
"embedded-lilypond": {
pattern: /#\{[\s\S]*?#\}/,
greedy: true,
inside: {
"punctuation": /^#\{|#\}$/,
"lilypond": {
pattern: /[\s\S]+/,
alias: "language-lilypond",
inside: null
}
}
},
rest: Prism2.languages.scheme
}
},
"punctuation": /#/
}
},
"string": {
pattern: /"(?:[^"\\]|\\.)*"/,
greedy: true
},
"class-name": {
pattern: /(\\new\s+)[\w-]+/,
lookbehind: true
},
"keyword": {
pattern: /\\[a-z][-\w]*/i,
inside: {
"punctuation": /^\\/
}
},
"operator": /[=|]|<<|>>/,
"punctuation": {
pattern: /(^|[a-z\d])(?:'+|,+|[_^]?-[_^]?(?:[-+^!>._]|(?=\d))|[_^]\.?|[.!])|[{}()[\]<>^~]|\\[()[\]<>\\!]|--|__/,
lookbehind: true
},
"number": /\b\d+(?:\/\d+)?\b/
};
lilypond["embedded-scheme"].inside["scheme"].inside["embedded-lilypond"].inside["lilypond"].inside = lilypond;
Prism2.languages.ly = lilypond;
})(Prism);
Prism.languages.liquid = {
"comment": {
pattern: /(^\{%\s*comment\s*%\})[\s\S]+(?=\{%\s*endcomment\s*%\}$)/,
lookbehind: true
},
"delimiter": {
pattern: /^\{(?:\{\{|[%\{])-?|-?(?:\}\}|[%\}])\}$/,
alias: "punctuation"
},
"string": {
pattern: /"[^"]*"|'[^']*'/,
greedy: true
},
"keyword": /\b(?:as|assign|break|(?:end)?(?:capture|case|comment|for|form|if|paginate|raw|style|tablerow|unless)|continue|cycle|decrement|echo|else|elsif|in|include|increment|limit|liquid|offset|range|render|reversed|section|when|with)\b/,
"object": /\b(?:address|all_country_option_tags|article|block|blog|cart|checkout|collection|color|country|country_option_tags|currency|current_page|current_tags|customer|customer_address|date|discount_allocation|discount_application|external_video|filter|filter_value|font|forloop|fulfillment|generic_file|gift_card|group|handle|image|line_item|link|linklist|localization|location|measurement|media|metafield|model|model_source|order|page|page_description|page_image|page_title|part|policy|product|product_option|recommendations|request|robots|routes|rule|script|search|selling_plan|selling_plan_allocation|selling_plan_group|shipping_method|shop|shop_locale|sitemap|store_availability|tax_line|template|theme|transaction|unit_price_measurement|user_agent|variant|video|video_source)\b/,
"function": [
{
pattern: /(\|\s*)\w+/,
lookbehind: true,
alias: "filter"
},
{
pattern: /(\.\s*)(?:first|last|size)/,
lookbehind: true
}
],
"boolean": /\b(?:false|nil|true)\b/,
"range": {
pattern: /\.\./,
alias: "operator"
},
"number": /\b\d+(?:\.\d+)?\b/,
"operator": /[!=]=|<>|[<>]=?|[|?:=-]|\b(?:and|contains(?=\s)|or)\b/,
"punctuation": /[.,\[\]()]/,
"empty": {
pattern: /\bempty\b/,
alias: "keyword"
}
};
Prism.hooks.add("before-tokenize", function(env) {
var liquidPattern = /\{%\s*comment\s*%\}[\s\S]*?\{%\s*endcomment\s*%\}|\{(?:%[\s\S]*?%|\{\{[\s\S]*?\}\}|\{[\s\S]*?\})\}/g;
var insideRaw = false;
Prism.languages["markup-templating"].buildPlaceholders(env, "liquid", liquidPattern, function(match) {
var tagMatch = /^\{%-?\s*(\w+)/.exec(match);
if (tagMatch) {
var tag = tagMatch[1];
if (tag === "raw" && !insideRaw) {
insideRaw = true;
return true;
} else if (tag === "endraw") {
insideRaw = false;
return true;
}
}
return !insideRaw;
});
});
Prism.hooks.add("after-tokenize", function(env) {
Prism.languages["markup-templating"].tokenizePlaceholders(env, "liquid");
});
(function(Prism2) {
function simple_form(name) {
return RegExp(/(\()/.source + "(?:" + name + ")" + /(?=[\s\)])/.source);
}
function primitive(pattern) {
return RegExp(/([\s([])/.source + "(?:" + pattern + ")" + /(?=[\s)])/.source);
}
var symbol = /(?!\d)[-+*/~!@$%^=<>{}\w]+/.source;
var marker = "&" + symbol;
var par = "(\\()";
var endpar = "(?=\\))";
var space = "(?=\\s)";
var nestedPar = /(?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\))*\))*\))*/.source;
var language = {
heading: {
pattern: /;;;.*/,
alias: ["comment", "title"]
},
comment: /;.*/,
string: {
pattern: /"(?:[^"\\]|\\.)*"/,
greedy: true,
inside: {
argument: /[-A-Z]+(?=[.,\s])/,
symbol: RegExp("`" + symbol + "'")
}
},
"quoted-symbol": {
pattern: RegExp("#?'" + symbol),
alias: ["variable", "symbol"]
},
"lisp-property": {
pattern: RegExp(":" + symbol),
alias: "property"
},
splice: {
pattern: RegExp(",@?" + symbol),
alias: ["symbol", "variable"]
},
keyword: [
{
pattern: RegExp(par + "(?:and|(?:cl-)?letf|cl-loop|cond|cons|error|if|(?:lexical-)?let\\*?|message|not|null|or|provide|require|setq|unless|use-package|when|while)" + space),
lookbehind: true
},
{
pattern: RegExp(par + "(?:append|by|collect|concat|do|finally|for|in|return)" + space),
lookbehind: true
}
],
declare: {
pattern: simple_form(/declare/.source),
lookbehind: true,
alias: "keyword"
},
interactive: {
pattern: simple_form(/interactive/.source),
lookbehind: true,
alias: "keyword"
},
boolean: {
pattern: primitive(/nil|t/.source),
lookbehind: true
},
number: {
pattern: primitive(/[-+]?\d+(?:\.\d*)?/.source),
lookbehind: true
},
defvar: {
pattern: RegExp(par + "def(?:const|custom|group|var)\\s+" + symbol),
lookbehind: true,
inside: {
keyword: /^def[a-z]+/,
variable: RegExp(symbol)
}
},
defun: {
pattern: RegExp(par + /(?:cl-)?(?:defmacro|defun\*?)\s+/.source + symbol + /\s+\(/.source + nestedPar + /\)/.source),
lookbehind: true,
greedy: true,
inside: {
keyword: /^(?:cl-)?def\S+/,
arguments: null,
function: {
pattern: RegExp("(^\\s)" + symbol),
lookbehind: true
},
punctuation: /[()]/
}
},
lambda: {
pattern: RegExp(par + "lambda\\s+\\(\\s*(?:&?" + symbol + "(?:\\s+&?" + symbol + ")*\\s*)?\\)"),
lookbehind: true,
greedy: true,
inside: {
keyword: /^lambda/,
arguments: null,
punctuation: /[()]/
}
},
car: {
pattern: RegExp(par + symbol),
lookbehind: true
},
punctuation: [
/(?:['`,]?\(|[)\[\]])/,
{
pattern: /(\s)\.(?=\s)/,
lookbehind: true
}
]
};
var arg = {
"lisp-marker": RegExp(marker),
"varform": {
pattern: RegExp(/\(/.source + symbol + /\s+(?=\S)/.source + nestedPar + /\)/.source),
inside: language
},
"argument": {
pattern: RegExp(/(^|[\s(])/.source + symbol),
lookbehind: true,
alias: "variable"
},
rest: language
};
var forms = "\\S+(?:\\s+\\S+)*";
var arglist = {
pattern: RegExp(par + nestedPar + endpar),
lookbehind: true,
inside: {
"rest-vars": {
pattern: RegExp("&(?:body|rest)\\s+" + forms),
inside: arg
},
"other-marker-vars": {
pattern: RegExp("&(?:aux|optional)\\s+" + forms),
inside: arg
},
keys: {
pattern: RegExp("&key\\s+" + forms + "(?:\\s+&allow-other-keys)?"),
inside: arg
},
argument: {
pattern: RegExp(symbol),
alias: "variable"
},
punctuation: /[()]/
}
};
language["lambda"].inside.arguments = arglist;
language["defun"].inside.arguments = Prism2.util.clone(arglist);
language["defun"].inside.arguments.inside.sublist = arglist;
Prism2.languages.lisp = language;
Prism2.languages.elisp = language;
Prism2.languages.emacs = language;
Prism2.languages["emacs-lisp"] = language;
})(Prism);
Prism.languages.livescript = {
"comment": [
{
pattern: /(^|[^\\])\/\*[\s\S]*?\*\//,
lookbehind: true
},
{
pattern: /(^|[^\\])#.*/,
lookbehind: true
}
],
"interpolated-string": {
pattern: /(^|[^"])("""|")(?:\\[\s\S]|(?!\2)[^\\])*\2(?!")/,
lookbehind: true,
greedy: true,
inside: {
"variable": {
pattern: /(^|[^\\])#[a-z_](?:-?[a-z]|[\d_])*/m,
lookbehind: true
},
"interpolation": {
pattern: /(^|[^\\])#\{[^}]+\}/m,
lookbehind: true,
inside: {
"interpolation-punctuation": {
pattern: /^#\{|\}$/,
alias: "variable"
}
}
},
"string": /[\s\S]+/
}
},
"string": [
{
pattern: /('''|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,
greedy: true
},
{
pattern: /<\[[\s\S]*?\]>/,
greedy: true
},
/\\[^\s,;\])}]+/
],
"regex": [
{
pattern: /\/\/(?:\[[^\r\n\]]*\]|\\.|(?!\/\/)[^\\\[])+\/\/[gimyu]{0,5}/,
greedy: true,
inside: {
"comment": {
pattern: /(^|[^\\])#.*/,
lookbehind: true
}
}
},
{
pattern: /\/(?:\[[^\r\n\]]*\]|\\.|[^/\\\r\n\[])+\/[gimyu]{0,5}/,
greedy: true
}
],
"keyword": {
pattern: /(^|(?!-).)\b(?:break|case|catch|class|const|continue|default|do|else|extends|fallthrough|finally|for(?: ever)?|function|if|implements|it|let|loop|new|null|otherwise|own|return|super|switch|that|then|this|throw|try|unless|until|var|void|when|while|yield)(?!-)\b/m,
lookbehind: true
},
"keyword-operator": {
pattern: /(^|[^-])\b(?:(?:delete|require|typeof)!|(?:and|by|delete|export|from|import(?: all)?|in|instanceof|is(?: not|nt)?|not|of|or|til|to|typeof|with|xor)(?!-)\b)/m,
lookbehind: true,
alias: "operator"
},
"boolean": {
pattern: /(^|[^-])\b(?:false|no|off|on|true|yes)(?!-)\b/m,
lookbehind: true
},
"argument": {
pattern: /(^|(?!\.&\.)[^&])&(?!&)\d*/m,
lookbehind: true,
alias: "variable"
},
"number": /\b(?:\d+~[\da-z]+|\d[\d_]*(?:\.\d[\d_]*)?(?:[a-z]\w*)?)/i,
"identifier": /[a-z_](?:-?[a-z]|[\d_])*/i,
"operator": [
{
pattern: /( )\.(?= )/,
lookbehind: true
},
/\.(?:[=~]|\.\.?)|\.(?:[&|^]|<<|>>>?)\.|:(?:=|:=?)|&&|\|[|>]|<(?:<<?<?|--?!?|~~?!?|[|=?])?|>[>=?]?|-(?:->?|>)?|\+\+?|@@?|%%?|\*\*?|!(?:~?=|--?>|~?~>)?|~(?:~?>|=)?|==?|\^\^?|[\/?]/
],
"punctuation": /[(){}\[\]|.,:;`]/
};
Prism.languages.livescript["interpolated-string"].inside["interpolation"].inside.rest = Prism.languages.livescript;
(function(Prism2) {
Prism2.languages.llvm = {
"comment": /;.*/,
"string": {
pattern: /"[^"]*"/,
greedy: true
},
"boolean": /\b(?:false|true)\b/,
"variable": /[%@!#](?:(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+|\d+)/i,
"label": /(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+:/i,
"type": {
pattern: /\b(?:double|float|fp128|half|i[1-9]\d*|label|metadata|ppc_fp128|token|void|x86_fp80|x86_mmx)\b/,
alias: "class-name"
},
"keyword": /\b[a-z_][a-z_0-9]*\b/,
"number": /[+-]?\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-Fa-f]+\b|\b0xK[\dA-Fa-f]{20}\b|\b0x[ML][\dA-Fa-f]{32}\b|\b0xH[\dA-Fa-f]{4}\b/,
"punctuation": /[{}[\];(),.!*=<>]/
};
})(Prism);
Prism.languages.log = {
"string": {
pattern: /"(?:[^"\\\r\n]|\\.)*"|'(?![st] | \w)(?:[^'\\\r\n]|\\.)*'/,
greedy: true
},
"exception": {
pattern: /(^|[^\w.])[a-z][\w.]*(?:Error|Exception):.*(?:(?:\r\n?|\n)[ \t]*(?:at[ \t].+|\.{3}.*|Caused by:.*))+(?:(?:\r\n?|\n)[ \t]*\.\.\. .*)?/,
lookbehind: true,
greedy: true,
alias: ["javastacktrace", "language-javastacktrace"],
inside: Prism.languages["javastacktrace"] || {
"keyword": /\bat\b/,
"function": /[a-z_][\w$]*(?=\()/,
"punctuation": /[.:()]/
}
},
"level": [
{
pattern: /\b(?:ALERT|CRIT|CRITICAL|EMERG|EMERGENCY|ERR|ERROR|FAILURE|FATAL|SEVERE)\b/,
alias: ["error", "important"]
},
{
pattern: /\b(?:WARN|WARNING|WRN)\b/,
alias: ["warning", "important"]
},
{
pattern: /\b(?:DISPLAY|INF|INFO|NOTICE|STATUS)\b/,
alias: ["info", "keyword"]
},
{
pattern: /\b(?:DBG|DEBUG|FINE)\b/,
alias: ["debug", "keyword"]
},
{
pattern: /\b(?:FINER|FINEST|TRACE|TRC|VERBOSE|VRB)\b/,
alias: ["trace", "comment"]
}
],
"property": {
pattern: /((?:^|[\]|])[ \t]*)[a-z_](?:[\w-]|\b\/\b)*(?:[. ]\(?\w(?:[\w-]|\b\/\b)*\)?)*:(?=\s)/im,
lookbehind: true
},
"separator": {
pattern: /(^|[^-+])-{3,}|={3,}|\*{3,}|- - /m,
lookbehind: true,
alias: "comment"
},
"url": /\b(?:file|ftp|https?):\/\/[^\s|,;'"]*[^\s|,;'">.]/,
"email": {
pattern: /(^|\s)[-\w+.]+@[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+(?=\s)/,
lookbehind: true,
alias: "url"
},
"ip-address": {
pattern: /\b(?:\d{1,3}(?:\.\d{1,3}){3})\b/,
alias: "constant"
},
"mac-address": {
pattern: /\b[a-f0-9]{2}(?::[a-f0-9]{2}){5}\b/i,
alias: "constant"
},
"domain": {
pattern: /(^|\s)[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)*\.[a-z][a-z0-9-]+(?=\s)/,
lookbehind: true,
alias: "constant"
},
"uuid": {
pattern: /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i,
alias: "constant"
},
"hash": {
pattern: /\b(?:[a-f0-9]{32}){1,2}\b/i,
alias: "constant"
},
"file-path": {
pattern: /\b[a-z]:[\\/][^\s|,;:(){}\[\]"']+|(^|[\s:\[\](>|])\.{0,2}\/\w[^\s|,;:(){}\[\]"']*/i,
lookbehind: true,
greedy: true,
alias: "string"
},
"date": {
pattern: RegExp(/\b\d{4}[-/]\d{2}[-/]\d{2}(?:T(?=\d{1,2}:)|(?=\s\d{1,2}:))/.source + "|" + /\b\d{1,4}[-/ ](?:\d{1,2}|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)[-/ ]\d{2,4}T?\b/.source + "|" + /\b(?:(?:Fri|Mon|Sat|Sun|Thu|Tue|Wed)(?:\s{1,2}(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep))?|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)\s{1,2}\d{1,2}\b/.source, "i"),
alias: "number"
},
"time": {
pattern: /\b\d{1,2}:\d{1,2}:\d{1,2}(?:[.,:]\d+)?(?:\s?[+-]\d{2}:?\d{2}|Z)?\b/,
alias: "number"
},
"boolean": /\b(?:false|null|true)\b/i,
"number": {
pattern: /(^|[^.\w])(?:0x[a-f0-9]+|0o[0-7]+|0b[01]+|v?\d[\da-f]*(?:\.\d+)*(?:e[+-]?\d+)?[a-z]{0,3}\b)\b(?!\.\w)/i,
lookbehind: true
},
"operator": /[;:?<=>~/@!$%&+\-|^(){}*#]/,
"punctuation": /[\[\].,]/
};
Prism.languages.lolcode = {
"comment": [
/\bOBTW\s[\s\S]*?\sTLDR\b/,
/\bBTW.+/
],
"string": {
pattern: /"(?::.|[^":])*"/,
inside: {
"variable": /:\{[^}]+\}/,
"symbol": [
/:\([a-f\d]+\)/i,
/:\[[^\]]+\]/,
/:[)>o":]/
]
},
greedy: true
},
"number": /(?:\B-)?(?:\b\d+(?:\.\d*)?|\B\.\d+)/,
"symbol": {
pattern: /(^|\s)(?:A )?(?:BUKKIT|NOOB|NUMBAR|NUMBR|TROOF|YARN)(?=\s|,|$)/,
lookbehind: true,
inside: {
"keyword": /A(?=\s)/
}
},
"label": {
pattern: /((?:^|\s)(?:IM IN YR|IM OUTTA YR) )[a-zA-Z]\w*/,
lookbehind: true,
alias: "string"
},
"function": {
pattern: /((?:^|\s)(?:HOW IZ I|I IZ|IZ) )[a-zA-Z]\w*/,
lookbehind: true
},
"keyword": [
{
pattern: /(^|\s)(?:AN|FOUND YR|GIMMEH|GTFO|HAI|HAS A|HOW IZ I|I HAS A|I IZ|IF U SAY SO|IM IN YR|IM OUTTA YR|IS NOW(?: A)?|ITZ(?: A)?|IZ|KTHX|KTHXBYE|LIEK(?: A)?|MAEK|MEBBE|MKAY|NERFIN|NO WAI|O HAI IM|O RLY\?|OIC|OMG|OMGWTF|R|SMOOSH|SRS|TIL|UPPIN|VISIBLE|WILE|WTF\?|YA RLY|YR)(?=\s|,|$)/,
lookbehind: true
},
/'Z(?=\s|,|$)/
],
"boolean": {
pattern: /(^|\s)(?:FAIL|WIN)(?=\s|,|$)/,
lookbehind: true
},
"variable": {
pattern: /(^|\s)IT(?=\s|,|$)/,
lookbehind: true
},
"operator": {
pattern: /(^|\s)(?:NOT|BOTH SAEM|DIFFRINT|(?:ALL|ANY|BIGGR|BOTH|DIFF|EITHER|MOD|PRODUKT|QUOSHUNT|SMALLR|SUM|WON) OF)(?=\s|,|$)/,
lookbehind: true
},
"punctuation": /\.{3}|…|,|!/
};
Prism.languages.magma = {
"output": {
pattern: /^(>.*(?:\r(?:\n|(?!\n))|\n))(?!>)(?:.+|(?:\r(?:\n|(?!\n))|\n)(?!>).*)(?:(?:\r(?:\n|(?!\n))|\n)(?!>).*)*/m,
lookbehind: true,
greedy: true
},
"comment": {
pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
greedy: true
},
"string": {
pattern: /(^|[^\\"])"(?:[^\r\n\\"]|\\.)*"/,
lookbehind: true,
greedy: true
},
"keyword": /\b(?:_|adj|and|assert|assert2|assert3|assigned|break|by|case|cat|catch|clear|cmpeq|cmpne|continue|declare|default|delete|diff|div|do|elif|else|end|eq|error|eval|exists|exit|for|forall|forward|fprintf|freeze|function|ge|gt|if|iload|import|in|intrinsic|is|join|le|load|local|lt|meet|mod|ne|not|notadj|notin|notsubset|or|print|printf|procedure|quit|random|read|readi|repeat|require|requirege|requirerange|restore|return|save|sdiff|select|subset|then|time|to|try|until|vprint|vprintf|vtime|when|where|while|xor)\b/,
"boolean": /\b(?:false|true)\b/,
"generator": {
pattern: /\b[a-z_]\w*(?=\s*<)/i,
alias: "class-name"
},
"function": /\b[a-z_]\w*(?=\s*\()/i,
"number": {
pattern: /(^|[^\w.]|\.\.)(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?:_[a-z]?)?(?=$|[^\w.]|\.\.)/,
lookbehind: true
},
"operator": /->|[-+*/^~!|#=]|:=|\.\./,
"punctuation": /[()[\]{}<>,;.:]/
};
Prism.languages.makefile = {
"comment": {
pattern: /(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,
lookbehind: true
},
"string": {
pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"builtin-target": {
pattern: /\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,
alias: "builtin"
},
"target": {
pattern: /^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,
alias: "symbol",
inside: {
"variable": /\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/
}
},
"variable": /\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,
"keyword": /-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,
"function": {
pattern: /(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,
lookbehind: true
},
"operator": /(?:::|[?:+!])?=|[|@]/,
"punctuation": /[:;(){}]/
};
(function(Prism2) {
var inner = /(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;
function createInline(pattern) {
pattern = pattern.replace(/<inner>/g, function() {
return inner;
});
return RegExp(/((?:^|[^\\])(?:\\{2})*)/.source + "(?:" + pattern + ")");
}
var tableCell = /(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source;
var tableRow = /\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g, function() {
return tableCell;
});
var tableLine = /\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;
Prism2.languages.markdown = Prism2.languages.extend("markup", {});
Prism2.languages.insertBefore("markdown", "prolog", {
"front-matter-block": {
pattern: /(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,
lookbehind: true,
greedy: true,
inside: {
"punctuation": /^---|---$/,
"front-matter": {
pattern: /\S+(?:\s+\S+)*/,
alias: ["yaml", "language-yaml"],
inside: Prism2.languages.yaml
}
}
},
"blockquote": {
pattern: /^>(?:[\t ]*>)*/m,
alias: "punctuation"
},
"table": {
pattern: RegExp("^" + tableRow + tableLine + "(?:" + tableRow + ")*", "m"),
inside: {
"table-data-rows": {
pattern: RegExp("^(" + tableRow + tableLine + ")(?:" + tableRow + ")*$"),
lookbehind: true,
inside: {
"table-data": {
pattern: RegExp(tableCell),
inside: Prism2.languages.markdown
},
"punctuation": /\|/
}
},
"table-line": {
pattern: RegExp("^(" + tableRow + ")" + tableLine + "$"),
lookbehind: true,
inside: {
"punctuation": /\||:?-{3,}:?/
}
},
"table-header-row": {
pattern: RegExp("^" + tableRow + "$"),
inside: {
"table-header": {
pattern: RegExp(tableCell),
alias: "important",
inside: Prism2.languages.markdown
},
"punctuation": /\|/
}
}
}
},
"code": [
{
pattern: /((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,
lookbehind: true,
alias: "keyword"
},
{
pattern: /^```[\s\S]*?^```$/m,
greedy: true,
inside: {
"code-block": {
pattern: /^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,
lookbehind: true
},
"code-language": {
pattern: /^(```).+/,
lookbehind: true
},
"punctuation": /```/
}
}
],
"title": [
{
pattern: /\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,
alias: "important",
inside: {
punctuation: /==+$|--+$/
}
},
{
pattern: /(^\s*)#.+/m,
lookbehind: true,
alias: "important",
inside: {
punctuation: /^#+|#+$/
}
}
],
"hr": {
pattern: /(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,
lookbehind: true,
alias: "punctuation"
},
"list": {
pattern: /(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,
lookbehind: true,
alias: "punctuation"
},
"url-reference": {
pattern: /!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,
inside: {
"variable": {
pattern: /^(!?\[)[^\]]+/,
lookbehind: true
},
"string": /(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,
"punctuation": /^[\[\]!:]|[<>]/
},
alias: "url"
},
"bold": {
pattern: createInline(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source),
lookbehind: true,
greedy: true,
inside: {
"content": {
pattern: /(^..)[\s\S]+(?=..$)/,
lookbehind: true,
inside: {}
},
"punctuation": /\*\*|__/
}
},
"italic": {
pattern: createInline(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source),
lookbehind: true,
greedy: true,
inside: {
"content": {
pattern: /(^.)[\s\S]+(?=.$)/,
lookbehind: true,
inside: {}
},
"punctuation": /[*_]/
}
},
"strike": {
pattern: createInline(/(~~?)(?:(?!~)<inner>)+\2/.source),
lookbehind: true,
greedy: true,
inside: {
"content": {
pattern: /(^~~?)[\s\S]+(?=\1$)/,
lookbehind: true,
inside: {}
},
"punctuation": /~~?/
}
},
"code-snippet": {
pattern: /(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,
lookbehind: true,
greedy: true,
alias: ["code", "keyword"]
},
"url": {
pattern: createInline(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source),
lookbehind: true,
greedy: true,
inside: {
"operator": /^!/,
"content": {
pattern: /(^\[)[^\]]+(?=\])/,
lookbehind: true,
inside: {}
},
"variable": {
pattern: /(^\][ \t]?\[)[^\]]+(?=\]$)/,
lookbehind: true
},
"url": {
pattern: /(^\]\()[^\s)]+/,
lookbehind: true
},
"string": {
pattern: /(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,
lookbehind: true
}
}
}
});
["url", "bold", "italic", "strike"].forEach(function(token) {
["url", "bold", "italic", "strike", "code-snippet"].forEach(function(inside) {
if (token !== inside) {
Prism2.languages.markdown[token].inside.content.inside[inside] = Prism2.languages.markdown[inside];
}
});
});
Prism2.hooks.add("after-tokenize", function(env) {
if (env.language !== "markdown" && env.language !== "md") {
return;
}
function walkTokens(tokens) {
if (!tokens || typeof tokens === "string") {
return;
}
for (var i = 0, l = tokens.length; i < l; i++) {
var token = tokens[i];
if (token.type !== "code") {
walkTokens(token.content);
continue;
}
var codeLang = token.content[1];
var codeBlock = token.content[3];
if (codeLang && codeBlock && codeLang.type === "code-language" && codeBlock.type === "code-block" && typeof codeLang.content === "string") {
var lang = codeLang.content.replace(/\b#/g, "sharp").replace(/\b\+\+/g, "pp");
lang = (/[a-z][\w-]*/i.exec(lang) || [""])[0].toLowerCase();
var alias = "language-" + lang;
if (!codeBlock.alias) {
codeBlock.alias = [alias];
} else if (typeof codeBlock.alias === "string") {
codeBlock.alias = [codeBlock.alias, alias];
} else {
codeBlock.alias.push(alias);
}
}
}
}
walkTokens(env.tokens);
});
Prism2.hooks.add("wrap", function(env) {
if (env.type !== "code-block") {
return;
}
var codeLang = "";
for (var i = 0, l = env.classes.length; i < l; i++) {
var cls = env.classes[i];
var match = /language-(.+)/.exec(cls);
if (match) {
codeLang = match[1];
break;
}
}
var grammar = Prism2.languages[codeLang];
if (!grammar) {
if (codeLang && codeLang !== "none" && Prism2.plugins.autoloader) {
var id = "md-" + new Date().valueOf() + "-" + Math.floor(Math.random() * 1e16);
env.attributes["id"] = id;
Prism2.plugins.autoloader.loadLanguages(codeLang, function() {
var ele = document.getElementById(id);
if (ele) {
ele.innerHTML = Prism2.highlight(ele.textContent, Prism2.languages[codeLang], codeLang);
}
});
}
} else {
env.content = Prism2.highlight(textContent(env.content), grammar, codeLang);
}
});
var tagPattern = RegExp(Prism2.languages.markup.tag.pattern.source, "gi");
var KNOWN_ENTITY_NAMES = {
"amp": "&",
"lt": "<",
"gt": ">",
"quot": '"'
};
var fromCodePoint = String.fromCodePoint || String.fromCharCode;
function textContent(html) {
var text = html.replace(tagPattern, "");
text = text.replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi, function(m, code) {
code = code.toLowerCase();
if (code[0] === "#") {
var value;
if (code[1] === "x") {
value = parseInt(code.slice(2), 16);
} else {
value = Number(code.slice(1));
}
return fromCodePoint(value);
} else {
var known = KNOWN_ENTITY_NAMES[code];
if (known) {
return known;
}
return m;
}
});
return text;
}
Prism2.languages.md = Prism2.languages.markdown;
})(Prism);
(function(Prism2) {
var orgType = /\b(?:(?:col|row)?vector|matrix|scalar)\b/.source;
var type = /\bvoid\b|<org>|\b(?:complex|numeric|pointer(?:\s*\([^()]*\))?|real|string|(?:class|struct)\s+\w+|transmorphic)(?:\s*<org>)?/.source.replace(/<org>/g, orgType);
Prism2.languages.mata = {
"comment": {
pattern: /\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//,
greedy: true
},
"string": {
pattern: /"[^"\r\n]*"|[‘`']".*?"[’`']/,
greedy: true
},
"class-name": {
pattern: /(\b(?:class|extends|struct)\s+)\w+(?=\s*(?:\{|\bextends\b))/,
lookbehind: true
},
"type": {
pattern: RegExp(type),
alias: "class-name",
inside: {
"punctuation": /[()]/,
"keyword": /\b(?:class|function|struct|void)\b/
}
},
"keyword": /\b(?:break|class|continue|do|else|end|extends|external|final|for|function|goto|if|pragma|private|protected|public|return|static|struct|unset|unused|version|virtual|while)\b/,
"constant": /\bNULL\b/,
"number": {
pattern: /(^|[^\w.])(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|\d[a-f0-9]*(?:\.[a-f0-9]+)?x[+-]?\d+)i?(?![\w.])/i,
lookbehind: true
},
"missing": {
pattern: /(^|[^\w.])(?:\.[a-z]?)(?![\w.])/,
lookbehind: true,
alias: "symbol"
},
"function": /\b[a-z_]\w*(?=\s*\()/i,
"operator": /\.\.|\+\+|--|&&|\|\||:?(?:[!=<>]=|[+\-*/^<>&|:])|[!?=\\#’`']/,
"punctuation": /[()[\]{},;.]/
};
})(Prism);
Prism.languages.matlab = {
"comment": [
/%\{[\s\S]*?\}%/,
/%.+/
],
"string": {
pattern: /\B'(?:''|[^'\r\n])*'/,
greedy: true
},
"number": /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?(?:[ij])?|\b[ij]\b/,
"keyword": /\b(?:NaN|break|case|catch|continue|else|elseif|end|for|function|if|inf|otherwise|parfor|pause|pi|return|switch|try|while)\b/,
"function": /\b(?!\d)\w+(?=\s*\()/,
"operator": /\.?[*^\/\\']|[+\-:@]|[<>=~]=?|&&?|\|\|?/,
"punctuation": /\.{3}|[.,;\[\](){}!]/
};
(function(Prism2) {
var keywords = /\b(?:about|and|animate|as|at|attributes|by|case|catch|collect|continue|coordsys|do|else|exit|fn|for|from|function|global|if|in|local|macroscript|mapped|max|not|of|off|on|or|parameters|persistent|plugin|rcmenu|return|rollout|set|struct|then|throw|to|tool|try|undo|utility|when|where|while|with)\b/i;
Prism2.languages.maxscript = {
"comment": {
pattern: /\/\*[\s\S]*?(?:\*\/|$)|--.*/,
greedy: true
},
"string": {
pattern: /(^|[^"\\@])(?:"(?:[^"\\]|\\[\s\S])*"|@"[^"]*")/,
lookbehind: true,
greedy: true
},
"path": {
pattern: /\$(?:[\w/\\.*?]|'[^']*')*/,
greedy: true,
alias: "string"
},
"function-call": {
pattern: RegExp("((?:" + (/^/.source + "|" + /[;=<>+\-*/^({\[]/.source + "|" + /\b(?:and|by|case|catch|collect|do|else|if|in|not|or|return|then|to|try|where|while|with)\b/.source) + ")[ ]*)(?!" + keywords.source + ")" + /[a-z_]\w*\b/.source + "(?=[ ]*(?:" + ("(?!" + keywords.source + ")" + /[a-z_]/.source + "|" + /\d|-\.?\d/.source + "|" + /[({'"$@#?]/.source) + "))", "im"),
lookbehind: true,
greedy: true,
alias: "function"
},
"function-definition": {
pattern: /(\b(?:fn|function)\s+)\w+\b/i,
lookbehind: true,
alias: "function"
},
"argument": {
pattern: /\b[a-z_]\w*(?=:)/i,
alias: "attr-name"
},
"keyword": keywords,
"boolean": /\b(?:false|true)\b/,
"time": {
pattern: /(^|[^\w.])(?:(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?[msft])+|\d+:\d+(?:\.\d*)?)(?![\w.:])/,
lookbehind: true,
alias: "number"
},
"number": [
{
pattern: /(^|[^\w.])(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?|0x[a-fA-F0-9]+)(?![\w.:])/,
lookbehind: true
},
/\b(?:e|pi)\b/
],
"constant": /\b(?:dontcollect|ok|silentValue|undefined|unsupplied)\b/,
"color": {
pattern: /\b(?:black|blue|brown|gray|green|orange|red|white|yellow)\b/i,
alias: "constant"
},
"operator": /[-+*/<>=!]=?|[&^?]|#(?!\()/,
"punctuation": /[()\[\]{}.:,;]|#(?=\()|\\$/m
};
})(Prism);
Prism.languages.mel = {
"comment": {
pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
greedy: true
},
"code": {
pattern: /`(?:\\.|[^\\`])*`/,
greedy: true,
alias: "italic",
inside: {
"delimiter": {
pattern: /^`|`$/,
alias: "punctuation"
},
"statement": {
pattern: /[\s\S]+/,
inside: null
}
}
},
"string": {
pattern: /"(?:\\.|[^\\"\r\n])*"/,
greedy: true
},
"variable": /\$\w+/,
"number": /\b0x[\da-fA-F]+\b|\b\d+(?:\.\d*)?|\B\.\d+/,
"flag": {
pattern: /-[^\d\W]\w*/,
alias: "operator"
},
"keyword": /\b(?:break|case|continue|default|do|else|float|for|global|if|in|int|matrix|proc|return|string|switch|vector|while)\b/,
"function": {
pattern: /((?:^|[{;])[ \t]*)[a-z_]\w*\b(?!\s*(?:\.(?!\.)|[[{=]))|\b[a-z_]\w*(?=[ \t]*\()/im,
lookbehind: true,
greedy: true
},
"tensor-punctuation": {
pattern: /<<|>>/,
alias: "punctuation"
},
"operator": /\+[+=]?|-[-=]?|&&|\|\||[<>]=?|[*\/!=]=?|[%^]/,
"punctuation": /[.,:;?\[\](){}]/
};
Prism.languages.mel["code"].inside["statement"].inside = Prism.languages.mel;
Prism.languages.mermaid = {
"comment": {
pattern: /%%.*/,
greedy: true
},
"style": {
pattern: /^([ \t]*(?:classDef|linkStyle|style)[ \t]+[\w$-]+[ \t]+)\w.*[^\s;]/m,
lookbehind: true,
inside: {
"property": /\b\w[\w-]*(?=[ \t]*:)/,
"operator": /:/,
"punctuation": /,/
}
},
"inter-arrow-label": {
pattern: /([^<>ox.=-])(?:-[-.]|==)(?![<>ox.=-])[ \t]*(?:"[^"\r\n]*"|[^\s".=-](?:[^\r\n.=-]*[^\s.=-])?)[ \t]*(?:\.+->?|--+[->]|==+[=>])(?![<>ox.=-])/,
lookbehind: true,
greedy: true,
inside: {
"arrow": {
pattern: /(?:\.+->?|--+[->]|==+[=>])$/,
alias: "operator"
},
"label": {
pattern: /^([\s\S]{2}[ \t]*)\S(?:[\s\S]*\S)?/,
lookbehind: true,
alias: "property"
},
"arrow-head": {
pattern: /^\S+/,
alias: ["arrow", "operator"]
}
}
},
"arrow": [
{
pattern: /(^|[^{}|o.-])[|}][|o](?:--|\.\.)[|o][|{](?![{}|o.-])/,
lookbehind: true,
alias: "operator"
},
{
pattern: /(^|[^<>ox.=-])(?:[<ox](?:==+|--+|-\.*-)[>ox]?|(?:==+|--+|-\.*-)[>ox]|===+|---+|-\.+-)(?![<>ox.=-])/,
lookbehind: true,
alias: "operator"
},
{
pattern: /(^|[^<>()x-])(?:--?(?:>>|[x>)])(?![<>()x])|(?:<<|[x<(])--?(?!-))/,
lookbehind: true,
alias: "operator"
},
{
pattern: /(^|[^<>|*o.-])(?:[*o]--|--[*o]|<\|?(?:--|\.\.)|(?:--|\.\.)\|?>|--|\.\.)(?![<>|*o.-])/,
lookbehind: true,
alias: "operator"
}
],
"label": {
pattern: /(^|[^|<])\|(?:[^\r\n"|]|"[^"\r\n]*")+\|/,
lookbehind: true,
greedy: true,
alias: "property"
},
"text": {
pattern: /(?:[(\[{]+|\b>)(?:[^\r\n"()\[\]{}]|"[^"\r\n]*")+(?:[)\]}]+|>)/,
alias: "string"
},
"string": {
pattern: /"[^"\r\n]*"/,
greedy: true
},
"annotation": {
pattern: /<<(?:abstract|choice|enumeration|fork|interface|join|service)>>|\[\[(?:choice|fork|join)\]\]/i,
alias: "important"
},
"keyword": [
{
pattern: /(^[ \t]*)(?:action|callback|class|classDef|classDiagram|click|direction|erDiagram|flowchart|gantt|gitGraph|graph|journey|link|linkStyle|pie|requirementDiagram|sequenceDiagram|stateDiagram|stateDiagram-v2|style|subgraph)(?![\w$-])/m,
lookbehind: true,
greedy: true
},
{
pattern: /(^[ \t]*)(?:activate|alt|and|as|autonumber|deactivate|else|end(?:[ \t]+note)?|loop|opt|par|participant|rect|state|note[ \t]+(?:over|(?:left|right)[ \t]+of))(?![\w$-])/im,
lookbehind: true,
greedy: true
}
],
"entity": /#[a-z0-9]+;/,
"operator": {
pattern: /(\w[ \t]*)&(?=[ \t]*\w)|:::|:/,
lookbehind: true
},
"punctuation": /[(){};]/
};
Prism.languages.mizar = {
"comment": /::.+/,
"keyword": /@proof\b|\b(?:according|aggregate|all|and|antonym|are|as|associativity|assume|asymmetry|attr|be|begin|being|by|canceled|case|cases|clusters?|coherence|commutativity|compatibility|connectedness|consider|consistency|constructors|contradiction|correctness|def|deffunc|define|definitions?|defpred|do|does|end|environ|equals|ex|exactly|existence|for|from|func|given|hence|hereby|holds|idempotence|identity|iff?|implies|involutiveness|irreflexivity|is|it|let|means|mode|non|not|notations?|now|of|or|otherwise|over|per|pred|prefix|projectivity|proof|provided|qua|reconsider|redefine|reduce|reducibility|reflexivity|registrations?|requirements|reserve|sch|schemes?|section|selector|set|sethood|st|struct|such|suppose|symmetry|synonym|take|that|the|then|theorems?|thesis|thus|to|transitivity|uniqueness|vocabular(?:ies|y)|when|where|with|wrt)\b/,
"parameter": {
pattern: /\$(?:10|\d)/,
alias: "variable"
},
"variable": /\b\w+(?=:)/,
"number": /(?:\b|-)\d+\b/,
"operator": /\.\.\.|->|&|\.?=/,
"punctuation": /\(#|#\)|[,:;\[\](){}]/
};
(function(Prism2) {
var operators = [
"$eq",
"$gt",
"$gte",
"$in",
"$lt",
"$lte",
"$ne",
"$nin",
"$and",
"$not",
"$nor",
"$or",
"$exists",
"$type",
"$expr",
"$jsonSchema",
"$mod",
"$regex",
"$text",
"$where",
"$geoIntersects",
"$geoWithin",
"$near",
"$nearSphere",
"$all",
"$elemMatch",
"$size",
"$bitsAllClear",
"$bitsAllSet",
"$bitsAnyClear",
"$bitsAnySet",
"$comment",
"$elemMatch",
"$meta",
"$slice",
"$currentDate",
"$inc",
"$min",
"$max",
"$mul",
"$rename",
"$set",
"$setOnInsert",
"$unset",
"$addToSet",
"$pop",
"$pull",
"$push",
"$pullAll",
"$each",
"$position",
"$slice",
"$sort",
"$bit",
"$addFields",
"$bucket",
"$bucketAuto",
"$collStats",
"$count",
"$currentOp",
"$facet",
"$geoNear",
"$graphLookup",
"$group",
"$indexStats",
"$limit",
"$listLocalSessions",
"$listSessions",
"$lookup",
"$match",
"$merge",
"$out",
"$planCacheStats",
"$project",
"$redact",
"$replaceRoot",
"$replaceWith",
"$sample",
"$set",
"$skip",
"$sort",
"$sortByCount",
"$unionWith",
"$unset",
"$unwind",
"$setWindowFields",
"$abs",
"$accumulator",
"$acos",
"$acosh",
"$add",
"$addToSet",
"$allElementsTrue",
"$and",
"$anyElementTrue",
"$arrayElemAt",
"$arrayToObject",
"$asin",
"$asinh",
"$atan",
"$atan2",
"$atanh",
"$avg",
"$binarySize",
"$bsonSize",
"$ceil",
"$cmp",
"$concat",
"$concatArrays",
"$cond",
"$convert",
"$cos",
"$dateFromParts",
"$dateToParts",
"$dateFromString",
"$dateToString",
"$dayOfMonth",
"$dayOfWeek",
"$dayOfYear",
"$degreesToRadians",
"$divide",
"$eq",
"$exp",
"$filter",
"$first",
"$floor",
"$function",
"$gt",
"$gte",
"$hour",
"$ifNull",
"$in",
"$indexOfArray",
"$indexOfBytes",
"$indexOfCP",
"$isArray",
"$isNumber",
"$isoDayOfWeek",
"$isoWeek",
"$isoWeekYear",
"$last",
"$last",
"$let",
"$literal",
"$ln",
"$log",
"$log10",
"$lt",
"$lte",
"$ltrim",
"$map",
"$max",
"$mergeObjects",
"$meta",
"$min",
"$millisecond",
"$minute",
"$mod",
"$month",
"$multiply",
"$ne",
"$not",
"$objectToArray",
"$or",
"$pow",
"$push",
"$radiansToDegrees",
"$range",
"$reduce",
"$regexFind",
"$regexFindAll",
"$regexMatch",
"$replaceOne",
"$replaceAll",
"$reverseArray",
"$round",
"$rtrim",
"$second",
"$setDifference",
"$setEquals",
"$setIntersection",
"$setIsSubset",
"$setUnion",
"$size",
"$sin",
"$slice",
"$split",
"$sqrt",
"$stdDevPop",
"$stdDevSamp",
"$strcasecmp",
"$strLenBytes",
"$strLenCP",
"$substr",
"$substrBytes",
"$substrCP",
"$subtract",
"$sum",
"$switch",
"$tan",
"$toBool",
"$toDate",
"$toDecimal",
"$toDouble",
"$toInt",
"$toLong",
"$toObjectId",
"$toString",
"$toLower",
"$toUpper",
"$trim",
"$trunc",
"$type",
"$week",
"$year",
"$zip",
"$count",
"$dateAdd",
"$dateDiff",
"$dateSubtract",
"$dateTrunc",
"$getField",
"$rand",
"$sampleRate",
"$setField",
"$unsetField",
"$comment",
"$explain",
"$hint",
"$max",
"$maxTimeMS",
"$min",
"$orderby",
"$query",
"$returnKey",
"$showDiskLoc",
"$natural"
];
var builtinFunctions = [
"ObjectId",
"Code",
"BinData",
"DBRef",
"Timestamp",
"NumberLong",
"NumberDecimal",
"MaxKey",
"MinKey",
"RegExp",
"ISODate",
"UUID"
];
operators = operators.map(function(operator) {
return operator.replace("$", "\\$");
});
var operatorsSource = "(?:" + operators.join("|") + ")\\b";
Prism2.languages.mongodb = Prism2.languages.extend("javascript", {});
Prism2.languages.insertBefore("mongodb", "string", {
"property": {
pattern: /(?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)(?=\s*:)/,
greedy: true,
inside: {
"keyword": RegExp(`^(['"])?` + operatorsSource + "(?:\\1)?$")
}
}
});
Prism2.languages.mongodb.string.inside = {
url: {
pattern: /https?:\/\/[-\w@:%.+~#=]{1,256}\.[a-z0-9()]{1,6}\b[-\w()@:%+.~#?&/=]*/i,
greedy: true
},
entity: {
pattern: /\b(?:(?:[01]?\d\d?|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d\d?|2[0-4]\d|25[0-5])\b/,
greedy: true
}
};
Prism2.languages.insertBefore("mongodb", "constant", {
"builtin": {
pattern: RegExp("\\b(?:" + builtinFunctions.join("|") + ")\\b"),
alias: "keyword"
}
});
})(Prism);
Prism.languages.monkey = {
"comment": {
pattern: /^#Rem\s[\s\S]*?^#End|'.+/im,
greedy: true
},
"string": {
pattern: /"[^"\r\n]*"/,
greedy: true
},
"preprocessor": {
pattern: /(^[ \t]*)#.+/m,
lookbehind: true,
greedy: true,
alias: "property"
},
"function": /\b\w+(?=\()/,
"type-char": {
pattern: /\b[?%#$]/,
alias: "class-name"
},
"number": {
pattern: /((?:\.\.)?)(?:(?:\b|\B-\.?|\B\.)\d+(?:(?!\.\.)\.\d*)?|\$[\da-f]+)/i,
lookbehind: true
},
"keyword": /\b(?:Abstract|Array|Bool|Case|Catch|Class|Const|Continue|Default|Eachin|Else|ElseIf|End|EndIf|Exit|Extends|Extern|False|Field|Final|Float|For|Forever|Function|Global|If|Implements|Import|Inline|Int|Interface|Local|Method|Module|New|Next|Null|Object|Private|Property|Public|Repeat|Return|Select|Self|Step|Strict|String|Super|Then|Throw|To|True|Try|Until|Void|Wend|While)\b/i,
"operator": /\.\.|<[=>]?|>=?|:?=|(?:[+\-*\/&~|]|\b(?:Mod|Shl|Shr)\b)=?|\b(?:And|Not|Or)\b/i,
"punctuation": /[.,:;()\[\]]/
};
Prism.languages.moonscript = {
"comment": /--.*/,
"string": [
{
pattern: /'[^']*'|\[(=*)\[[\s\S]*?\]\1\]/,
greedy: true
},
{
pattern: /"[^"]*"/,
greedy: true,
inside: {
"interpolation": {
pattern: /#\{[^{}]*\}/,
inside: {
"moonscript": {
pattern: /(^#\{)[\s\S]+(?=\})/,
lookbehind: true,
inside: null
},
"interpolation-punctuation": {
pattern: /#\{|\}/,
alias: "punctuation"
}
}
}
}
}
],
"class-name": [
{
pattern: /(\b(?:class|extends)[ \t]+)\w+/,
lookbehind: true
},
/\b[A-Z]\w*/
],
"keyword": /\b(?:class|continue|do|else|elseif|export|extends|for|from|if|import|in|local|nil|return|self|super|switch|then|unless|using|when|while|with)\b/,
"variable": /@@?\w*/,
"property": {
pattern: /\b(?!\d)\w+(?=:)|(:)(?!\d)\w+/,
lookbehind: true
},
"function": {
pattern: /\b(?:_G|_VERSION|assert|collectgarbage|coroutine\.(?:create|resume|running|status|wrap|yield)|debug\.(?:debug|getfenv|gethook|getinfo|getlocal|getmetatable|getregistry|getupvalue|setfenv|sethook|setlocal|setmetatable|setupvalue|traceback)|dofile|error|getfenv|getmetatable|io\.(?:close|flush|input|lines|open|output|popen|read|stderr|stdin|stdout|tmpfile|type|write)|ipairs|load|loadfile|loadstring|math\.(?:abs|acos|asin|atan|atan2|ceil|cos|cosh|deg|exp|floor|fmod|frexp|ldexp|log|log10|max|min|modf|pi|pow|rad|random|randomseed|sin|sinh|sqrt|tan|tanh)|module|next|os\.(?:clock|date|difftime|execute|exit|getenv|remove|rename|setlocale|time|tmpname)|package\.(?:cpath|loaded|loadlib|path|preload|seeall)|pairs|pcall|print|rawequal|rawget|rawset|require|select|setfenv|setmetatable|string\.(?:byte|char|dump|find|format|gmatch|gsub|len|lower|match|rep|reverse|sub|upper)|table\.(?:concat|insert|maxn|remove|sort)|tonumber|tostring|type|unpack|xpcall)\b/,
inside: {
"punctuation": /\./
}
},
"boolean": /\b(?:false|true)\b/,
"number": /(?:\B\.\d+|\b\d+\.\d+|\b\d+(?=[eE]))(?:[eE][-+]?\d+)?\b|\b(?:0x[a-fA-F\d]+|\d+)(?:U?LL)?\b/,
"operator": /\.{3}|[-=]>|~=|(?:[-+*/%<>!=]|\.\.)=?|[:#^]|\b(?:and|or)\b=?|\b(?:not)\b/,
"punctuation": /[.,()[\]{}\\]/
};
Prism.languages.moonscript.string[1].inside.interpolation.inside.moonscript.inside = Prism.languages.moonscript;
Prism.languages.moon = Prism.languages.moonscript;
Prism.languages.n1ql = {
"comment": {
pattern: /\/\*[\s\S]*?(?:$|\*\/)|--.*/,
greedy: true
},
"string": {
pattern: /(["'])(?:\\[\s\S]|(?!\1)[^\\]|\1\1)*\1/,
greedy: true
},
"identifier": {
pattern: /`(?:\\[\s\S]|[^\\`]|``)*`/,
greedy: true
},
"parameter": /\$[\w.]+/,
"keyword": /\b(?:ADVISE|ALL|ALTER|ANALYZE|AS|ASC|AT|BEGIN|BINARY|BOOLEAN|BREAK|BUCKET|BUILD|BY|CALL|CAST|CLUSTER|COLLATE|COLLECTION|COMMIT|COMMITTED|CONNECT|CONTINUE|CORRELATE|CORRELATED|COVER|CREATE|CURRENT|DATABASE|DATASET|DATASTORE|DECLARE|DECREMENT|DELETE|DERIVED|DESC|DESCRIBE|DISTINCT|DO|DROP|EACH|ELEMENT|EXCEPT|EXCLUDE|EXECUTE|EXPLAIN|FETCH|FILTER|FLATTEN|FLUSH|FOLLOWING|FOR|FORCE|FROM|FTS|FUNCTION|GOLANG|GRANT|GROUP|GROUPS|GSI|HASH|HAVING|IF|IGNORE|ILIKE|INCLUDE|INCREMENT|INDEX|INFER|INLINE|INNER|INSERT|INTERSECT|INTO|IS|ISOLATION|JAVASCRIPT|JOIN|KEY|KEYS|KEYSPACE|KNOWN|LANGUAGE|LAST|LEFT|LET|LETTING|LEVEL|LIMIT|LSM|MAP|MAPPING|MATCHED|MATERIALIZED|MERGE|MINUS|MISSING|NAMESPACE|NEST|NL|NO|NTH_VALUE|NULL|NULLS|NUMBER|OBJECT|OFFSET|ON|OPTION|OPTIONS|ORDER|OTHERS|OUTER|OVER|PARSE|PARTITION|PASSWORD|PATH|POOL|PRECEDING|PREPARE|PRIMARY|PRIVATE|PRIVILEGE|PROBE|PROCEDURE|PUBLIC|RANGE|RAW|REALM|REDUCE|RENAME|RESPECT|RETURN|RETURNING|REVOKE|RIGHT|ROLE|ROLLBACK|ROW|ROWS|SATISFIES|SAVEPOINT|SCHEMA|SCOPE|SELECT|SELF|SEMI|SET|SHOW|SOME|START|STATISTICS|STRING|SYSTEM|TIES|TO|TRAN|TRANSACTION|TRIGGER|TRUNCATE|UNBOUNDED|UNDER|UNION|UNIQUE|UNKNOWN|UNNEST|UNSET|UPDATE|UPSERT|USE|USER|USING|VALIDATE|VALUE|VALUES|VIA|VIEW|WHERE|WHILE|WINDOW|WITH|WORK|XOR)\b/i,
"function": /\b[a-z_]\w*(?=\s*\()/i,
"boolean": /\b(?:FALSE|TRUE)\b/i,
"number": /(?:\b\d+\.|\B\.)\d+e[+\-]?\d+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,
"operator": /[-+*\/%]|!=|==?|\|\||<[>=]?|>=?|\b(?:AND|ANY|ARRAY|BETWEEN|CASE|ELSE|END|EVERY|EXISTS|FIRST|IN|LIKE|NOT|OR|THEN|VALUED|WHEN|WITHIN)\b/i,
"punctuation": /[;[\](),.{}:]/
};
Prism.languages.n4js = Prism.languages.extend("javascript", {
"keyword": /\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/
});
Prism.languages.insertBefore("n4js", "constant", {
"annotation": {
pattern: /@+\w+/,
alias: "operator"
}
});
Prism.languages.n4jsd = Prism.languages.n4js;
Prism.languages["nand2tetris-hdl"] = {
"comment": /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,
"keyword": /\b(?:BUILTIN|CHIP|CLOCKED|IN|OUT|PARTS)\b/,
"boolean": /\b(?:false|true)\b/,
"function": /\b[A-Za-z][A-Za-z0-9]*(?=\()/,
"number": /\b\d+\b/,
"operator": /=|\.\./,
"punctuation": /[{}[\];(),:]/
};
(function(Prism2) {
var expressionDef = /\{[^\r\n\[\]{}]*\}/;
var params = {
"quoted-string": {
pattern: /"(?:[^"\\]|\\.)*"/,
alias: "operator"
},
"command-param-id": {
pattern: /(\s)\w+:/,
lookbehind: true,
alias: "property"
},
"command-param-value": [
{
pattern: expressionDef,
alias: "selector"
},
{
pattern: /([\t ])\S+/,
lookbehind: true,
greedy: true,
alias: "operator"
},
{
pattern: /\S(?:.*\S)?/,
alias: "operator"
}
]
};
Prism2.languages.naniscript = {
"comment": {
pattern: /^([\t ]*);.*/m,
lookbehind: true
},
"define": {
pattern: /^>.+/m,
alias: "tag",
inside: {
"value": {
pattern: /(^>\w+[\t ]+)(?!\s)[^{}\r\n]+/,
lookbehind: true,
alias: "operator"
},
"key": {
pattern: /(^>)\w+/,
lookbehind: true
}
}
},
"label": {
pattern: /^([\t ]*)#[\t ]*\w+[\t ]*$/m,
lookbehind: true,
alias: "regex"
},
"command": {
pattern: /^([\t ]*)@\w+(?=[\t ]|$).*/m,
lookbehind: true,
alias: "function",
inside: {
"command-name": /^@\w+/,
"expression": {
pattern: expressionDef,
greedy: true,
alias: "selector"
},
"command-params": {
pattern: /\s*\S[\s\S]*/,
inside: params
}
}
},
"generic-text": {
pattern: /(^[ \t]*)[^#@>;\s].*/m,
lookbehind: true,
alias: "punctuation",
inside: {
"escaped-char": /\\[{}\[\]"]/,
"expression": {
pattern: expressionDef,
greedy: true,
alias: "selector"
},
"inline-command": {
pattern: /\[[\t ]*\w[^\r\n\[\]]*\]/,
greedy: true,
alias: "function",
inside: {
"command-params": {
pattern: /(^\[[\t ]*\w+\b)[\s\S]+(?=\]$)/,
lookbehind: true,
inside: params
},
"command-param-name": {
pattern: /^(\[[\t ]*)\w+/,
lookbehind: true,
alias: "name"
},
"start-stop-char": /[\[\]]/
}
}
}
}
};
Prism2.languages.nani = Prism2.languages["naniscript"];
Prism2.hooks.add("after-tokenize", function(env) {
var tokens = env.tokens;
tokens.forEach(function(token) {
if (typeof token !== "string" && token.type === "generic-text") {
var content = getTextContent(token);
if (!isBracketsBalanced(content)) {
token.type = "bad-line";
token.content = content;
}
}
});
});
function isBracketsBalanced(input) {
var brackets = "[]{}";
var stack = [];
for (var i = 0; i < input.length; i++) {
var bracket = input[i];
var bracketsIndex = brackets.indexOf(bracket);
if (bracketsIndex !== -1) {
if (bracketsIndex % 2 === 0) {
stack.push(bracketsIndex + 1);
} else if (stack.pop() !== bracketsIndex) {
return false;
}
}
}
return stack.length === 0;
}
function getTextContent(token) {
if (typeof token === "string") {
return token;
} else if (Array.isArray(token)) {
return token.map(getTextContent).join("");
} else {
return getTextContent(token.content);
}
}
})(Prism);
Prism.languages.nasm = {
"comment": /;.*$/m,
"string": /(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,
"label": {
pattern: /(^\s*)[A-Za-z._?$][\w.?$@~#]*:/m,
lookbehind: true,
alias: "function"
},
"keyword": [
/\[?BITS (?:16|32|64)\]?/,
{
pattern: /(^\s*)section\s*[a-z.]+:?/im,
lookbehind: true
},
/(?:extern|global)[^;\r\n]*/i,
/(?:CPU|DEFAULT|FLOAT).*$/m
],
"register": {
pattern: /\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|di|si|sp)|[cdefgs]s)\b/i,
alias: "variable"
},
"number": /(?:\b|(?=\$))(?:0[hx](?:\.[\da-f]+|[\da-f]+(?:\.[\da-f]+)?)(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|(?:\d+(?:\.\d+)?|\.\d+)(?:\.?e[+-]?\d+)?[dt]?)\b/i,
"operator": /[\[\]*+\-\/%<>=&|$!]/
};
Prism.languages.neon = {
"comment": {
pattern: /#.*/,
greedy: true
},
"datetime": {
pattern: /(^|[[{(=:,\s])\d\d\d\d-\d\d?-\d\d?(?:(?:[Tt]| +)\d\d?:\d\d:\d\d(?:\.\d*)? *(?:Z|[-+]\d\d?(?::?\d\d)?)?)?(?=$|[\]}),\s])/,
lookbehind: true,
alias: "number"
},
"key": {
pattern: /(^|[[{(,\s])[^,:=[\]{}()'"\s]+(?=\s*:(?:$|[\]}),\s])|\s*=)/,
lookbehind: true,
alias: "property"
},
"number": {
pattern: /(^|[[{(=:,\s])[+-]?(?:0x[\da-fA-F]+|0o[0-7]+|0b[01]+|(?:\d+(?:\.\d*)?|\.?\d+)(?:[eE][+-]?\d+)?)(?=$|[\]}),:=\s])/,
lookbehind: true
},
"boolean": {
pattern: /(^|[[{(=:,\s])(?:false|no|true|yes)(?=$|[\]}),:=\s])/i,
lookbehind: true
},
"null": {
pattern: /(^|[[{(=:,\s])(?:null)(?=$|[\]}),:=\s])/i,
lookbehind: true,
alias: "keyword"
},
"string": {
pattern: /(^|[[{(=:,\s])(?:('''|""")\r?\n(?:(?:[^\r\n]|\r?\n(?![\t ]*\2))*\r?\n)?[\t ]*\2|'[^'\r\n]*'|"(?:\\.|[^\\"\r\n])*")/,
lookbehind: true,
greedy: true
},
"literal": {
pattern: /(^|[[{(=:,\s])(?:[^#"',:=[\]{}()\s`-]|[:-][^"',=[\]{}()\s])(?:[^,:=\]})(\s]|:(?![\s,\]})]|$)|[ \t]+[^#,:=\]})(\s])*/,
lookbehind: true,
alias: "string"
},
"punctuation": /[,:=[\]{}()-]/
};
Prism.languages.nevod = {
"comment": /\/\/.*|(?:\/\*[\s\S]*?(?:\*\/|$))/,
"string": {
pattern: /(?:"(?:""|[^"])*"(?!")|'(?:''|[^'])*'(?!'))!?\*?/,
greedy: true,
inside: {
"string-attrs": /!$|!\*$|\*$/
}
},
"namespace": {
pattern: /(@namespace\s+)[a-zA-Z0-9\-.]+(?=\s*\{)/,
lookbehind: true
},
"pattern": {
pattern: /(@pattern\s+)?#?[a-zA-Z0-9\-.]+(?:\s*\(\s*(?:~\s*)?[a-zA-Z0-9\-.]+\s*(?:,\s*(?:~\s*)?[a-zA-Z0-9\-.]*)*\))?(?=\s*=)/,
lookbehind: true,
inside: {
"pattern-name": {
pattern: /^#?[a-zA-Z0-9\-.]+/,
alias: "class-name"
},
"fields": {
pattern: /\(.*\)/,
inside: {
"field-name": {
pattern: /[a-zA-Z0-9\-.]+/,
alias: "variable"
},
"punctuation": /[,()]/,
"operator": {
pattern: /~/,
alias: "field-hidden-mark"
}
}
}
}
},
"search": {
pattern: /(@search\s+|#)[a-zA-Z0-9\-.]+(?:\.\*)?(?=\s*;)/,
alias: "function",
lookbehind: true
},
"keyword": /@(?:having|inside|namespace|outside|pattern|require|search|where)\b/,
"standard-pattern": {
pattern: /\b(?:Alpha|AlphaNum|Any|Blank|End|LineBreak|Num|NumAlpha|Punct|Space|Start|Symbol|Word|WordBreak)\b(?:\([a-zA-Z0-9\-.,\s+]*\))?/,
inside: {
"standard-pattern-name": {
pattern: /^[a-zA-Z0-9\-.]+/,
alias: "builtin"
},
"quantifier": {
pattern: /\b\d+(?:\s*\+|\s*-\s*\d+)?(?!\w)/,
alias: "number"
},
"standard-pattern-attr": {
pattern: /[a-zA-Z0-9\-.]+/,
alias: "builtin"
},
"punctuation": /[,()]/
}
},
"quantifier": {
pattern: /\b\d+(?:\s*\+|\s*-\s*\d+)?(?!\w)/,
alias: "number"
},
"operator": [
{
pattern: /=/,
alias: "pattern-def"
},
{
pattern: /&/,
alias: "conjunction"
},
{
pattern: /~/,
alias: "exception"
},
{
pattern: /\?/,
alias: "optionality"
},
{
pattern: /[[\]]/,
alias: "repetition"
},
{
pattern: /[{}]/,
alias: "variation"
},
{
pattern: /[+_]/,
alias: "sequence"
},
{
pattern: /\.{2,3}/,
alias: "span"
}
],
"field-capture": [
{
pattern: /([a-zA-Z0-9\-.]+\s*\()\s*[a-zA-Z0-9\-.]+\s*:\s*[a-zA-Z0-9\-.]+(?:\s*,\s*[a-zA-Z0-9\-.]+\s*:\s*[a-zA-Z0-9\-.]+)*(?=\s*\))/,
lookbehind: true,
inside: {
"field-name": {
pattern: /[a-zA-Z0-9\-.]+/,
alias: "variable"
},
"colon": /:/
}
},
{
pattern: /[a-zA-Z0-9\-.]+\s*:/,
inside: {
"field-name": {
pattern: /[a-zA-Z0-9\-.]+/,
alias: "variable"
},
"colon": /:/
}
}
],
"punctuation": /[:;,()]/,
"name": /[a-zA-Z0-9\-.]+/
};
(function(Prism2) {
var variable = /\$(?:\w[a-z\d]*(?:_[^\x00-\x1F\s"'\\()$]*)?|\{[^}\s"'\\]+\})/i;
Prism2.languages.nginx = {
"comment": {
pattern: /(^|[\s{};])#.*/,
lookbehind: true,
greedy: true
},
"directive": {
pattern: /(^|\s)\w(?:[^;{}"'\\\s]|\\.|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\s+(?:#.*(?!.)|(?![#\s])))*?(?=\s*[;{])/,
lookbehind: true,
greedy: true,
inside: {
"string": {
pattern: /((?:^|[^\\])(?:\\\\)*)(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,
lookbehind: true,
greedy: true,
inside: {
"escape": {
pattern: /\\["'\\nrt]/,
alias: "entity"
},
"variable": variable
}
},
"comment": {
pattern: /(\s)#.*/,
lookbehind: true,
greedy: true
},
"keyword": {
pattern: /^\S+/,
greedy: true
},
"boolean": {
pattern: /(\s)(?:off|on)(?!\S)/,
lookbehind: true
},
"number": {
pattern: /(\s)\d+[a-z]*(?!\S)/i,
lookbehind: true
},
"variable": variable
}
},
"punctuation": /[{};]/
};
})(Prism);
Prism.languages.nim = {
"comment": {
pattern: /#.*/,
greedy: true
},
"string": {
pattern: /(?:\b(?!\d)(?:\w|\\x[89a-fA-F][0-9a-fA-F])+)?(?:"""[\s\S]*?"""(?!")|"(?:\\[\s\S]|""|[^"\\])*")/,
greedy: true
},
"char": {
pattern: /'(?:\\(?:\d+|x[\da-fA-F]{0,2}|.)|[^'])'/,
greedy: true
},
"function": {
pattern: /(?:(?!\d)(?:\w|\\x[89a-fA-F][0-9a-fA-F])+|`[^`\r\n]+`)\*?(?:\[[^\]]+\])?(?=\s*\()/,
greedy: true,
inside: {
"operator": /\*$/
}
},
"identifier": {
pattern: /`[^`\r\n]+`/,
greedy: true,
inside: {
"punctuation": /`/
}
},
"number": /\b(?:0[xXoObB][\da-fA-F_]+|\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:[eE][+-]?\d[\d_]*)?)(?:'?[iuf]\d*)?/,
"keyword": /\b(?:addr|as|asm|atomic|bind|block|break|case|cast|concept|const|continue|converter|defer|discard|distinct|do|elif|else|end|enum|except|export|finally|for|from|func|generic|if|import|include|interface|iterator|let|macro|method|mixin|nil|object|out|proc|ptr|raise|ref|return|static|template|try|tuple|type|using|var|when|while|with|without|yield)\b/,
"operator": {
pattern: /(^|[({\[](?=\.\.)|(?![({\[]\.).)(?:(?:[=+\-*\/<>@$~&%|!?^:\\]|\.\.|\.(?![)}\]]))+|\b(?:and|div|in|is|isnot|mod|not|notin|of|or|shl|shr|xor)\b)/m,
lookbehind: true
},
"punctuation": /[({\[]\.|\.[)}\]]|[`(){}\[\],:]/
};
Prism.languages.nix = {
"comment": {
pattern: /\/\*[\s\S]*?\*\/|#.*/,
greedy: true
},
"string": {
pattern: /"(?:[^"\\]|\\[\s\S])*"|''(?:(?!'')[\s\S]|''(?:'|\\|\$\{))*''/,
greedy: true,
inside: {
"interpolation": {
pattern: /(^|(?:^|(?!'').)[^\\])\$\{(?:[^{}]|\{[^}]*\})*\}/,
lookbehind: true,
inside: null
}
}
},
"url": [
/\b(?:[a-z]{3,7}:\/\/)[\w\-+%~\/.:#=?&]+/,
{
pattern: /([^\/])(?:[\w\-+%~.:#=?&]*(?!\/\/)[\w\-+%~\/.:#=?&])?(?!\/\/)\/[\w\-+%~\/.:#=?&]*/,
lookbehind: true
}
],
"antiquotation": {
pattern: /\$(?=\{)/,
alias: "important"
},
"number": /\b\d+\b/,
"keyword": /\b(?:assert|builtins|else|if|in|inherit|let|null|or|then|with)\b/,
"function": /\b(?:abort|add|all|any|attrNames|attrValues|baseNameOf|compareVersions|concatLists|currentSystem|deepSeq|derivation|dirOf|div|elem(?:At)?|fetch(?:Tarball|url)|filter(?:Source)?|fromJSON|genList|getAttr|getEnv|hasAttr|hashString|head|import|intersectAttrs|is(?:Attrs|Bool|Function|Int|List|Null|String)|length|lessThan|listToAttrs|map|mul|parseDrvName|pathExists|read(?:Dir|File)|removeAttrs|replaceStrings|seq|sort|stringLength|sub(?:string)?|tail|throw|to(?:File|JSON|Path|String|XML)|trace|typeOf)\b|\bfoldl'\B/,
"boolean": /\b(?:false|true)\b/,
"operator": /[=!<>]=?|\+\+?|\|\||&&|\/\/|->?|[?@]/,
"punctuation": /[{}()[\].,:;]/
};
Prism.languages.nix.string.inside.interpolation.inside = Prism.languages.nix;
Prism.languages.nsis = {
"comment": {
pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|[#;].*)/,
lookbehind: true,
greedy: true
},
"string": {
pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"keyword": {
pattern: /(^[\t ]*)(?:Abort|Add(?:BrandingImage|Size)|AdvSplash|Allow(?:RootDirInstall|SkipFiles)|AutoCloseWindow|BG(?:Font|Gradient|Image)|Banner|BrandingText|BringToFront|CRCCheck|Call(?:InstDLL)?|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|Create(?:Directory|Font|ShortCut)|Delete(?:INISec|INIStr|RegKey|RegValue)?|Detail(?:Print|sButtonText)|Dialer|Dir(?:Text|Var|Verify)|EnableWindow|Enum(?:RegKey|RegValue)|Exch|Exec(?:Shell(?:Wait)?|Wait)?|ExpandEnvStrings|File(?:BufSize|Close|ErrorText|Open|Read|ReadByte|ReadUTF16LE|ReadWord|Seek|Write|WriteByte|WriteUTF16LE|WriteWord)?|Find(?:Close|First|Next|Window)|FlushINI|Get(?:CurInstType|CurrentAddress|DLLVersion(?:Local)?|DlgItem|ErrorLevel|FileTime(?:Local)?|FullPathName|Function(?:Address|End)?|InstDirError|LabelAddress|TempFileName)|Goto|HideWindow|Icon|If(?:Abort|Errors|FileExists|RebootFlag|Silent)|InitPluginsDir|InstProgressFlags|Inst(?:Type(?:GetText|SetText)?)|Install(?:ButtonText|Colors|Dir(?:RegKey)?)|Int(?:64|Ptr)?CmpU?|Int(?:64)?Fmt|Int(?:Ptr)?Op|IsWindow|Lang(?:DLL|String)|License(?:BkColor|Data|ForceSelection|LangString|Text)|LoadLanguageFile|LockWindow|Log(?:Set|Text)|Manifest(?:DPIAware|SupportedOS)|Math|MessageBox|MiscButtonText|NSISdl|Name|Nop|OutFile|PE(?:DllCharacteristics|SubsysVer)|Page(?:Callbacks)?|Pop|Push|Quit|RMDir|Read(?:EnvStr|INIStr|RegDWORD|RegStr)|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|SearchPath|Section(?:End|GetFlags|GetInstTypes|GetSize|GetText|Group|In|SetFlags|SetInstTypes|SetSize|SetText)?|SendMessage|Set(?:AutoClose|BrandingImage|Compress|Compressor(?:DictSize)?|CtlColors|CurInstType|DatablockOptimize|DateSave|Details(?:Print|View)|ErrorLevel|Errors|FileAttributes|Font|OutPath|Overwrite|PluginUnload|RebootFlag|RegView|ShellVarContext|Silent)|Show(?:InstDetails|UninstDetails|Window)|Silent(?:Install|UnInstall)|Sleep|SpaceTexts|Splash|StartMenu|Str(?:CmpS?|Cpy|Len)|SubCaption|System|UnRegDLL|Unicode|UninstPage|Uninstall(?:ButtonText|Caption|Icon|SubCaption|Text)|UserInfo|VI(?:AddVersionKey|FileVersion|ProductVersion)|VPatch|Var|WindowIcon|Write(?:INIStr|Reg(?:Bin|DWORD|ExpandStr|MultiStr|None|Str)|Uninstaller)|XPStyle|ns(?:Dialogs|Exec))\b/m,
lookbehind: true
},
"property": /\b(?:ARCHIVE|FILE_(?:ATTRIBUTE_ARCHIVE|ATTRIBUTE_NORMAL|ATTRIBUTE_OFFLINE|ATTRIBUTE_READONLY|ATTRIBUTE_SYSTEM|ATTRIBUTE_TEMPORARY)|HK(?:(?:CR|CU|LM)(?:32|64)?|DD|PD|U)|HKEY_(?:CLASSES_ROOT|CURRENT_CONFIG|CURRENT_USER|DYN_DATA|LOCAL_MACHINE|PERFORMANCE_DATA|USERS)|ID(?:ABORT|CANCEL|IGNORE|NO|OK|RETRY|YES)|MB_(?:ABORTRETRYIGNORE|DEFBUTTON1|DEFBUTTON2|DEFBUTTON3|DEFBUTTON4|ICONEXCLAMATION|ICONINFORMATION|ICONQUESTION|ICONSTOP|OK|OKCANCEL|RETRYCANCEL|RIGHT|RTLREADING|SETFOREGROUND|TOPMOST|USERICON|YESNO)|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY|admin|all|auto|both|colored|false|force|hide|highest|lastused|leave|listonly|none|normal|notset|off|on|open|print|show|silent|silentlog|smooth|textonly|true|user)\b/,
"constant": /\$\{[!\w\.:\^-]+\}|\$\([!\w\.:\^-]+\)/,
"variable": /\$\w[\w\.]*/,
"number": /\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,
"operator": /--?|\+\+?|<=?|>=?|==?=?|&&?|\|\|?|[?*\/~^%]/,
"punctuation": /[{}[\];(),.:]/,
"important": {
pattern: /(^[\t ]*)!(?:addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversion|gettlbversion|if|ifdef|ifmacrodef|ifmacrondef|ifndef|include|insertmacro|macro|macroend|makensis|packhdr|pragma|searchparse|searchreplace|system|tempfile|undef|verbose|warning)\b/im,
lookbehind: true
}
};
Prism.languages.objectivec = Prism.languages.extend("c", {
"string": {
pattern: /@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,
greedy: true
},
"keyword": /\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,
"operator": /-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/
});
delete Prism.languages.objectivec["class-name"];
Prism.languages.objc = Prism.languages.objectivec;
Prism.languages.ocaml = {
"comment": {
pattern: /\(\*[\s\S]*?\*\)/,
greedy: true
},
"char": {
pattern: /'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,
greedy: true
},
"string": [
{
pattern: /"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,
greedy: true
},
{
pattern: /\{([a-z_]*)\|[\s\S]*?\|\1\}/,
greedy: true
}
],
"number": [
/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,
/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,
/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i
],
"directive": {
pattern: /\B#\w+/,
alias: "property"
},
"label": {
pattern: /\B~\w+/,
alias: "property"
},
"type-variable": {
pattern: /\B'\w+/,
alias: "function"
},
"variant": {
pattern: /`\w+/,
alias: "symbol"
},
"keyword": /\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,
"boolean": /\b(?:false|true)\b/,
"operator-like-punctuation": {
pattern: /\[[<>|]|[>|]\]|\{<|>\}/,
alias: "punctuation"
},
"operator": /\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,
"punctuation": /;;|::|[(){}\[\].,:;#]|\b_\b/
};
(function(Prism2) {
var escapes = /\\(?:["'\\abefnrtv]|0[0-7]{2}|U[\dA-Fa-f]{6}|u[\dA-Fa-f]{4}|x[\dA-Fa-f]{2})/;
Prism2.languages.odin = {
"comment": [
{
pattern: /\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,
greedy: true
},
{
pattern: /#![^\n\r]*/,
greedy: true
},
{
pattern: /\/\/[^\n\r]*/,
greedy: true
}
],
"char": {
pattern: /'(?:\\(?:.|[0Uux][0-9A-Fa-f]{1,6})|[^\n\r'\\])'/,
greedy: true,
inside: {
"symbol": escapes
}
},
"string": [
{
pattern: /`[^`]*`/,
greedy: true
},
{
pattern: /"(?:\\.|[^\n\r"\\])*"/,
greedy: true,
inside: {
"symbol": escapes
}
}
],
"directive": {
pattern: /#\w+/,
alias: "property"
},
"number": /\b0(?:b[01_]+|d[\d_]+|h_*(?:(?:(?:[\dA-Fa-f]_*){8}){1,2}|(?:[\dA-Fa-f]_*){4})|o[0-7_]+|x[\dA-F_a-f]+|z[\dAB_ab]+)\b|(?:\b\d+(?:\.(?!\.)\d*)?|\B\.\d+)(?:[Ee][+-]?\d*)?[ijk]?(?!\w)/,
"discard": {
pattern: /\b_\b/,
alias: "keyword"
},
"procedure-definition": {
pattern: /\b\w+(?=[ \t]*(?::\s*){2}proc\b)/,
alias: "function"
},
"keyword": /\b(?:asm|auto_cast|bit_set|break|case|cast|context|continue|defer|distinct|do|dynamic|else|enum|fallthrough|for|foreign|if|import|in|map|matrix|not_in|or_else|or_return|package|proc|return|struct|switch|transmute|typeid|union|using|when|where)\b/,
"procedure-name": {
pattern: /\b\w+(?=[ \t]*\()/,
alias: "function"
},
"boolean": /\b(?:false|nil|true)\b/,
"constant-parameter-sign": {
pattern: /\$/,
alias: "important"
},
"undefined": {
pattern: /---/,
alias: "operator"
},
"arrow": {
pattern: /->/,
alias: "punctuation"
},
"operator": /\+\+|--|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[?^]/,
"punctuation": /[(),.:;@\[\]{}]/
};
})(Prism);
(function(Prism2) {
Prism2.languages.opencl = Prism2.languages.extend("c", {
"keyword": /\b(?:(?:__)?(?:constant|global|kernel|local|private|read_only|read_write|write_only)|__attribute__|auto|(?:bool|u?(?:char|int|long|short)|half|quad)(?:2|3|4|8|16)?|break|case|complex|const|continue|(?:double|float)(?:16(?:x(?:1|2|4|8|16))?|1x(?:1|2|4|8|16)|2(?:x(?:1|2|4|8|16))?|3|4(?:x(?:1|2|4|8|16))?|8(?:x(?:1|2|4|8|16))?)?|default|do|else|enum|extern|for|goto|if|imaginary|inline|packed|pipe|register|restrict|return|signed|sizeof|static|struct|switch|typedef|uniform|union|unsigned|void|volatile|while)\b/,
"number": /(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[fuhl]{0,4}/i,
"boolean": /\b(?:false|true)\b/,
"constant-opencl-kernel": {
pattern: /\b(?:CHAR_(?:BIT|MAX|MIN)|CLK_(?:ADDRESS_(?:CLAMP(?:_TO_EDGE)?|NONE|REPEAT)|FILTER_(?:LINEAR|NEAREST)|(?:GLOBAL|LOCAL)_MEM_FENCE|NORMALIZED_COORDS_(?:FALSE|TRUE))|CL_(?:BGRA|(?:HALF_)?FLOAT|INTENSITY|LUMINANCE|A?R?G?B?[Ax]?|(?:(?:UN)?SIGNED|[US]NORM)_(?:INT(?:8|16|32))|UNORM_(?:INT_101010|SHORT_(?:555|565)))|(?:DBL|FLT|HALF)_(?:DIG|EPSILON|(?:MAX|MIN)(?:(?:_10)?_EXP)?|MANT_DIG)|FLT_RADIX|HUGE_VALF?|(?:INT|LONG|SCHAR|SHRT)_(?:MAX|MIN)|INFINITY|MAXFLOAT|M_(?:[12]_PI|2_SQRTPI|E|LN(?:2|10)|LOG(?:2|10)E?|PI(?:_[24])?|SQRT(?:1_2|2))(?:_F|_H)?|NAN|(?:UCHAR|UINT|ULONG|USHRT)_MAX)\b/,
alias: "constant"
}
});
Prism2.languages.insertBefore("opencl", "class-name", {
"builtin-type": {
pattern: /\b(?:_cl_(?:command_queue|context|device_id|event|kernel|mem|platform_id|program|sampler)|cl_(?:image_format|mem_fence_flags)|clk_event_t|event_t|image(?:1d_(?:array_|buffer_)?t|2d_(?:array_(?:depth_|msaa_depth_|msaa_)?|depth_|msaa_depth_|msaa_)?t|3d_t)|intptr_t|ndrange_t|ptrdiff_t|queue_t|reserve_id_t|sampler_t|size_t|uintptr_t)\b/,
alias: "keyword"
}
});
var attributes = {
"type-opencl-host": {
pattern: /\b(?:cl_(?:GLenum|GLint|GLuin|addressing_mode|bitfield|bool|buffer_create_type|build_status|channel_(?:order|type)|(?:u?(?:char|int|long|short)|double|float)(?:2|3|4|8|16)?|command_(?:queue(?:_info|_properties)?|type)|context(?:_info|_properties)?|device_(?:exec_capabilities|fp_config|id|info|local_mem_type|mem_cache_type|type)|(?:event|sampler)(?:_info)?|filter_mode|half|image_info|kernel(?:_info|_work_group_info)?|map_flags|mem(?:_flags|_info|_object_type)?|platform_(?:id|info)|profiling_info|program(?:_build_info|_info)?))\b/,
alias: "keyword"
},
"boolean-opencl-host": {
pattern: /\bCL_(?:FALSE|TRUE)\b/,
alias: "boolean"
},
"constant-opencl-host": {
pattern: /\bCL_(?:A|ABGR|ADDRESS_(?:CLAMP(?:_TO_EDGE)?|MIRRORED_REPEAT|NONE|REPEAT)|ARGB|BGRA|BLOCKING|BUFFER_CREATE_TYPE_REGION|BUILD_(?:ERROR|IN_PROGRESS|NONE|PROGRAM_FAILURE|SUCCESS)|COMMAND_(?:ACQUIRE_GL_OBJECTS|BARRIER|COPY_(?:BUFFER(?:_RECT|_TO_IMAGE)?|IMAGE(?:_TO_BUFFER)?)|FILL_(?:BUFFER|IMAGE)|MAP(?:_BUFFER|_IMAGE)|MARKER|MIGRATE(?:_SVM)?_MEM_OBJECTS|NATIVE_KERNEL|NDRANGE_KERNEL|READ_(?:BUFFER(?:_RECT)?|IMAGE)|RELEASE_GL_OBJECTS|SVM_(?:FREE|MAP|MEMCPY|MEMFILL|UNMAP)|TASK|UNMAP_MEM_OBJECT|USER|WRITE_(?:BUFFER(?:_RECT)?|IMAGE))|COMPILER_NOT_AVAILABLE|COMPILE_PROGRAM_FAILURE|COMPLETE|CONTEXT_(?:DEVICES|INTEROP_USER_SYNC|NUM_DEVICES|PLATFORM|PROPERTIES|REFERENCE_COUNT)|DEPTH(?:_STENCIL)?|DEVICE_(?:ADDRESS_BITS|AFFINITY_DOMAIN_(?:L[1-4]_CACHE|NEXT_PARTITIONABLE|NUMA)|AVAILABLE|BUILT_IN_KERNELS|COMPILER_AVAILABLE|DOUBLE_FP_CONFIG|ENDIAN_LITTLE|ERROR_CORRECTION_SUPPORT|EXECUTION_CAPABILITIES|EXTENSIONS|GLOBAL_(?:MEM_(?:CACHELINE_SIZE|CACHE_SIZE|CACHE_TYPE|SIZE)|VARIABLE_PREFERRED_TOTAL_SIZE)|HOST_UNIFIED_MEMORY|IL_VERSION|IMAGE(?:2D_MAX_(?:HEIGHT|WIDTH)|3D_MAX_(?:DEPTH|HEIGHT|WIDTH)|_BASE_ADDRESS_ALIGNMENT|_MAX_ARRAY_SIZE|_MAX_BUFFER_SIZE|_PITCH_ALIGNMENT|_SUPPORT)|LINKER_AVAILABLE|LOCAL_MEM_SIZE|LOCAL_MEM_TYPE|MAX_(?:CLOCK_FREQUENCY|COMPUTE_UNITS|CONSTANT_ARGS|CONSTANT_BUFFER_SIZE|GLOBAL_VARIABLE_SIZE|MEM_ALLOC_SIZE|NUM_SUB_GROUPS|ON_DEVICE_(?:EVENTS|QUEUES)|PARAMETER_SIZE|PIPE_ARGS|READ_IMAGE_ARGS|READ_WRITE_IMAGE_ARGS|SAMPLERS|WORK_GROUP_SIZE|WORK_ITEM_DIMENSIONS|WORK_ITEM_SIZES|WRITE_IMAGE_ARGS)|MEM_BASE_ADDR_ALIGN|MIN_DATA_TYPE_ALIGN_SIZE|NAME|NATIVE_VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT)|NOT_(?:AVAILABLE|FOUND)|OPENCL_C_VERSION|PARENT_DEVICE|PARTITION_(?:AFFINITY_DOMAIN|BY_AFFINITY_DOMAIN|BY_COUNTS|BY_COUNTS_LIST_END|EQUALLY|FAILED|MAX_SUB_DEVICES|PROPERTIES|TYPE)|PIPE_MAX_(?:ACTIVE_RESERVATIONS|PACKET_SIZE)|PLATFORM|PREFERRED_(?:GLOBAL_ATOMIC_ALIGNMENT|INTEROP_USER_SYNC|LOCAL_ATOMIC_ALIGNMENT|PLATFORM_ATOMIC_ALIGNMENT|VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT))|PRINTF_BUFFER_SIZE|PROFILE|PROFILING_TIMER_RESOLUTION|QUEUE_(?:ON_(?:DEVICE_(?:MAX_SIZE|PREFERRED_SIZE|PROPERTIES)|HOST_PROPERTIES)|PROPERTIES)|REFERENCE_COUNT|SINGLE_FP_CONFIG|SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS|SVM_(?:ATOMICS|CAPABILITIES|COARSE_GRAIN_BUFFER|FINE_GRAIN_BUFFER|FINE_GRAIN_SYSTEM)|TYPE(?:_ACCELERATOR|_ALL|_CPU|_CUSTOM|_DEFAULT|_GPU)?|VENDOR(?:_ID)?|VERSION)|DRIVER_VERSION|EVENT_(?:COMMAND_(?:EXECUTION_STATUS|QUEUE|TYPE)|CONTEXT|REFERENCE_COUNT)|EXEC_(?:KERNEL|NATIVE_KERNEL|STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST)|FILTER_(?:LINEAR|NEAREST)|FLOAT|FP_(?:CORRECTLY_ROUNDED_DIVIDE_SQRT|DENORM|FMA|INF_NAN|ROUND_TO_INF|ROUND_TO_NEAREST|ROUND_TO_ZERO|SOFT_FLOAT)|GLOBAL|HALF_FLOAT|IMAGE_(?:ARRAY_SIZE|BUFFER|DEPTH|ELEMENT_SIZE|FORMAT|FORMAT_MISMATCH|FORMAT_NOT_SUPPORTED|HEIGHT|NUM_MIP_LEVELS|NUM_SAMPLES|ROW_PITCH|SLICE_PITCH|WIDTH)|INTENSITY|INVALID_(?:ARG_INDEX|ARG_SIZE|ARG_VALUE|BINARY|BUFFER_SIZE|BUILD_OPTIONS|COMMAND_QUEUE|COMPILER_OPTIONS|CONTEXT|DEVICE|DEVICE_PARTITION_COUNT|DEVICE_QUEUE|DEVICE_TYPE|EVENT|EVENT_WAIT_LIST|GLOBAL_OFFSET|GLOBAL_WORK_SIZE|GL_OBJECT|HOST_PTR|IMAGE_DESCRIPTOR|IMAGE_FORMAT_DESCRIPTOR|IMAGE_SIZE|KERNEL|KERNEL_ARGS|KERNEL_DEFINITION|KERNEL_NAME|LINKER_OPTIONS|MEM_OBJECT|MIP_LEVEL|OPERATION|PIPE_SIZE|PLATFORM|PROGRAM|PROGRAM_EXECUTABLE|PROPERTY|QUEUE_PROPERTIES|SAMPLER|VALUE|WORK_DIMENSION|WORK_GROUP_SIZE|WORK_ITEM_SIZE)|KERNEL_(?:ARG_(?:ACCESS_(?:NONE|QUALIFIER|READ_ONLY|READ_WRITE|WRITE_ONLY)|ADDRESS_(?:CONSTANT|GLOBAL|LOCAL|PRIVATE|QUALIFIER)|INFO_NOT_AVAILABLE|NAME|TYPE_(?:CONST|NAME|NONE|PIPE|QUALIFIER|RESTRICT|VOLATILE))|ATTRIBUTES|COMPILE_NUM_SUB_GROUPS|COMPILE_WORK_GROUP_SIZE|CONTEXT|EXEC_INFO_SVM_FINE_GRAIN_SYSTEM|EXEC_INFO_SVM_PTRS|FUNCTION_NAME|GLOBAL_WORK_SIZE|LOCAL_MEM_SIZE|LOCAL_SIZE_FOR_SUB_GROUP_COUNT|MAX_NUM_SUB_GROUPS|MAX_SUB_GROUP_SIZE_FOR_NDRANGE|NUM_ARGS|PREFERRED_WORK_GROUP_SIZE_MULTIPLE|PRIVATE_MEM_SIZE|PROGRAM|REFERENCE_COUNT|SUB_GROUP_COUNT_FOR_NDRANGE|WORK_GROUP_SIZE)|LINKER_NOT_AVAILABLE|LINK_PROGRAM_FAILURE|LOCAL|LUMINANCE|MAP_(?:FAILURE|READ|WRITE|WRITE_INVALIDATE_REGION)|MEM_(?:ALLOC_HOST_PTR|ASSOCIATED_MEMOBJECT|CONTEXT|COPY_HOST_PTR|COPY_OVERLAP|FLAGS|HOST_NO_ACCESS|HOST_PTR|HOST_READ_ONLY|HOST_WRITE_ONLY|KERNEL_READ_AND_WRITE|MAP_COUNT|OBJECT_(?:ALLOCATION_FAILURE|BUFFER|IMAGE1D|IMAGE1D_ARRAY|IMAGE1D_BUFFER|IMAGE2D|IMAGE2D_ARRAY|IMAGE3D|PIPE)|OFFSET|READ_ONLY|READ_WRITE|REFERENCE_COUNT|SIZE|SVM_ATOMICS|SVM_FINE_GRAIN_BUFFER|TYPE|USES_SVM_POINTER|USE_HOST_PTR|WRITE_ONLY)|MIGRATE_MEM_OBJECT_(?:CONTENT_UNDEFINED|HOST)|MISALIGNED_SUB_BUFFER_OFFSET|NONE|NON_BLOCKING|OUT_OF_(?:HOST_MEMORY|RESOURCES)|PIPE_(?:MAX_PACKETS|PACKET_SIZE)|PLATFORM_(?:EXTENSIONS|HOST_TIMER_RESOLUTION|NAME|PROFILE|VENDOR|VERSION)|PROFILING_(?:COMMAND_(?:COMPLETE|END|QUEUED|START|SUBMIT)|INFO_NOT_AVAILABLE)|PROGRAM_(?:BINARIES|BINARY_SIZES|BINARY_TYPE(?:_COMPILED_OBJECT|_EXECUTABLE|_LIBRARY|_NONE)?|BUILD_(?:GLOBAL_VARIABLE_TOTAL_SIZE|LOG|OPTIONS|STATUS)|CONTEXT|DEVICES|IL|KERNEL_NAMES|NUM_DEVICES|NUM_KERNELS|REFERENCE_COUNT|SOURCE)|QUEUED|QUEUE_(?:CONTEXT|DEVICE|DEVICE_DEFAULT|ON_DEVICE|ON_DEVICE_DEFAULT|OUT_OF_ORDER_EXEC_MODE_ENABLE|PROFILING_ENABLE|PROPERTIES|REFERENCE_COUNT|SIZE)|R|RA|READ_(?:ONLY|WRITE)_CACHE|RG|RGB|RGBA|RGBx|RGx|RUNNING|Rx|SAMPLER_(?:ADDRESSING_MODE|CONTEXT|FILTER_MODE|LOD_MAX|LOD_MIN|MIP_FILTER_MODE|NORMALIZED_COORDS|REFERENCE_COUNT)|(?:UN)?SIGNED_INT(?:8|16|32)|SNORM_INT(?:8|16)|SUBMITTED|SUCCESS|UNORM_INT(?:8|16|24|_101010|_101010_2)|UNORM_SHORT_(?:555|565)|VERSION_(?:1_0|1_1|1_2|2_0|2_1)|sBGRA|sRGB|sRGBA|sRGBx)\b/,
alias: "constant"
},
"function-opencl-host": {
pattern: /\bcl(?:BuildProgram|CloneKernel|CompileProgram|Create(?:Buffer|CommandQueue(?:WithProperties)?|Context|ContextFromType|Image|Image2D|Image3D|Kernel|KernelsInProgram|Pipe|ProgramWith(?:Binary|BuiltInKernels|IL|Source)|Sampler|SamplerWithProperties|SubBuffer|SubDevices|UserEvent)|Enqueue(?:(?:Barrier|Marker)(?:WithWaitList)?|Copy(?:Buffer(?:Rect|ToImage)?|Image(?:ToBuffer)?)|(?:Fill|Map)(?:Buffer|Image)|MigrateMemObjects|NDRangeKernel|NativeKernel|(?:Read|Write)(?:Buffer(?:Rect)?|Image)|SVM(?:Free|Map|MemFill|Memcpy|MigrateMem|Unmap)|Task|UnmapMemObject|WaitForEvents)|Finish|Flush|Get(?:CommandQueueInfo|ContextInfo|Device(?:AndHostTimer|IDs|Info)|Event(?:Profiling)?Info|ExtensionFunctionAddress(?:ForPlatform)?|HostTimer|ImageInfo|Kernel(?:ArgInfo|Info|SubGroupInfo|WorkGroupInfo)|MemObjectInfo|PipeInfo|Platform(?:IDs|Info)|Program(?:Build)?Info|SamplerInfo|SupportedImageFormats)|LinkProgram|(?:Release|Retain)(?:CommandQueue|Context|Device|Event|Kernel|MemObject|Program|Sampler)|SVM(?:Alloc|Free)|Set(?:CommandQueueProperty|DefaultDeviceCommandQueue|EventCallback|Kernel|Kernel(?:Arg(?:SVMPointer)?|ExecInfo)|MemObjectDestructorCallback|UserEventStatus)|Unload(?:Platform)?Compiler|WaitForEvents)\b/,
alias: "function"
}
};
Prism2.languages.insertBefore("c", "keyword", attributes);
if (Prism2.languages.cpp) {
attributes["type-opencl-host-cpp"] = {
pattern: /\b(?:Buffer|BufferGL|BufferRenderGL|CommandQueue|Context|Device|DeviceCommandQueue|EnqueueArgs|Event|Image|Image1D|Image1DArray|Image1DBuffer|Image2D|Image2DArray|Image2DGL|Image3D|Image3DGL|ImageFormat|ImageGL|Kernel|KernelFunctor|LocalSpaceArg|Memory|NDRange|Pipe|Platform|Program|SVMAllocator|SVMTraitAtomic|SVMTraitCoarse|SVMTraitFine|SVMTraitReadOnly|SVMTraitReadWrite|SVMTraitWriteOnly|Sampler|UserEvent)\b/,
alias: "keyword"
};
Prism2.languages.insertBefore("cpp", "keyword", attributes);
}
})(Prism);
Prism.languages.openqasm = {
"comment": /\/\*[\s\S]*?\*\/|\/\/.*/,
"string": {
pattern: /"[^"\r\n\t]*"|'[^'\r\n\t]*'/,
greedy: true
},
"keyword": /\b(?:CX|OPENQASM|U|barrier|boxas|boxto|break|const|continue|ctrl|def|defcal|defcalgrammar|delay|else|end|for|gate|gphase|if|in|include|inv|kernel|lengthof|let|measure|pow|reset|return|rotary|stretchinf|while)\b|#pragma\b/,
"class-name": /\b(?:angle|bit|bool|creg|fixed|float|int|length|qreg|qubit|stretch|uint)\b/,
"function": /\b(?:cos|exp|ln|popcount|rotl|rotr|sin|sqrt|tan)\b(?=\s*\()/,
"constant": /\b(?:euler|pi|tau)\b|π|𝜏|ℇ/,
"number": {
pattern: /(^|[^.\w$])(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?(?:dt|ns|us|µs|ms|s)?/i,
lookbehind: true
},
"operator": /->|>>=?|<<=?|&&|\|\||\+\+|--|[!=<>&|~^+\-*/%]=?|@/,
"punctuation": /[(){}\[\];,:.]/
};
Prism.languages.qasm = Prism.languages.openqasm;
Prism.languages.oz = {
"comment": {
pattern: /\/\*[\s\S]*?\*\/|%.*/,
greedy: true
},
"string": {
pattern: /"(?:[^"\\]|\\[\s\S])*"/,
greedy: true
},
"atom": {
pattern: /'(?:[^'\\]|\\[\s\S])*'/,
greedy: true,
alias: "builtin"
},
"keyword": /\$|\[\]|\b(?:_|at|attr|case|catch|choice|class|cond|declare|define|dis|else(?:case|if)?|end|export|fail|false|feat|finally|from|fun|functor|if|import|in|local|lock|meth|nil|not|of|or|prepare|proc|prop|raise|require|self|skip|then|thread|true|try|unit)\b/,
"function": [
/\b[a-z][A-Za-z\d]*(?=\()/,
{
pattern: /(\{)[A-Z][A-Za-z\d]*\b/,
lookbehind: true
}
],
"number": /\b(?:0[bx][\da-f]+|\d+(?:\.\d*)?(?:e~?\d+)?)\b|&(?:[^\\]|\\(?:\d{3}|.))/i,
"variable": /`(?:[^`\\]|\\.)+`/,
"attr-name": /\b\w+(?=[ \t]*:(?![:=]))/,
"operator": /:(?:=|::?)|<[-:=]?|=(?:=|<?:?)|>=?:?|\\=:?|!!?|[|#+\-*\/,~^@]|\b(?:andthen|div|mod|orelse)\b/,
"punctuation": /[\[\](){}.:;?]/
};
Prism.languages.parigp = {
"comment": /\/\*[\s\S]*?\*\/|\\\\.*/,
"string": {
pattern: /"(?:[^"\\\r\n]|\\.)*"/,
greedy: true
},
"keyword": function() {
var keywords = [
"breakpoint",
"break",
"dbg_down",
"dbg_err",
"dbg_up",
"dbg_x",
"forcomposite",
"fordiv",
"forell",
"forpart",
"forprime",
"forstep",
"forsubgroup",
"forvec",
"for",
"iferr",
"if",
"local",
"my",
"next",
"return",
"until",
"while"
];
keywords = keywords.map(function(keyword) {
return keyword.split("").join(" *");
}).join("|");
return RegExp("\\b(?:" + keywords + ")\\b");
}(),
"function": /\b\w(?:[\w ]*\w)?(?= *\()/,
"number": {
pattern: /((?:\. *\. *)?)(?:\b\d(?: *\d)*(?: *(?!\. *\.)\.(?: *\d)*)?|\. *\d(?: *\d)*)(?: *e *(?:[+-] *)?\d(?: *\d)*)?/i,
lookbehind: true
},
"operator": /\. *\.|[*\/!](?: *=)?|%(?: *=|(?: *#)?(?: *')*)?|\+(?: *[+=])?|-(?: *[-=>])?|<(?: *>|(?: *<)?(?: *=)?)?|>(?: *>)?(?: *=)?|=(?: *=){0,2}|\\(?: *\/)?(?: *=)?|&(?: *&)?|\| *\||['#~^]/,
"punctuation": /[\[\]{}().,:;|]/
};
(function(Prism2) {
var parser = Prism2.languages.parser = Prism2.languages.extend("markup", {
"keyword": {
pattern: /(^|[^^])(?:\^(?:case|eval|for|if|switch|throw)\b|@(?:BASE|CLASS|GET(?:_DEFAULT)?|OPTIONS|SET_DEFAULT|USE)\b)/,
lookbehind: true
},
"variable": {
pattern: /(^|[^^])\B\$(?:\w+|(?=[.{]))(?:(?:\.|::?)\w+)*(?:\.|::?)?/,
lookbehind: true,
inside: {
"punctuation": /\.|:+/
}
},
"function": {
pattern: /(^|[^^])\B[@^]\w+(?:(?:\.|::?)\w+)*(?:\.|::?)?/,
lookbehind: true,
inside: {
"keyword": {
pattern: /(^@)(?:GET_|SET_)/,
lookbehind: true
},
"punctuation": /\.|:+/
}
},
"escape": {
pattern: /\^(?:[$^;@()\[\]{}"':]|#[a-f\d]*)/i,
alias: "builtin"
},
"punctuation": /[\[\](){};]/
});
parser = Prism2.languages.insertBefore("parser", "keyword", {
"parser-comment": {
pattern: /(\s)#.*/,
lookbehind: true,
alias: "comment"
},
"expression": {
pattern: /(^|[^^])\((?:[^()]|\((?:[^()]|\((?:[^()])*\))*\))*\)/,
greedy: true,
lookbehind: true,
inside: {
"string": {
pattern: /(^|[^^])(["'])(?:(?!\2)[^^]|\^[\s\S])*\2/,
lookbehind: true
},
"keyword": parser.keyword,
"variable": parser.variable,
"function": parser.function,
"boolean": /\b(?:false|true)\b/,
"number": /\b(?:0x[a-f\d]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?)\b/i,
"escape": parser.escape,
"operator": /[~+*\/\\%]|!(?:\|\|?|=)?|&&?|\|\|?|==|<[<=]?|>[>=]?|-[fd]?|\b(?:def|eq|ge|gt|in|is|le|lt|ne)\b/,
"punctuation": parser.punctuation
}
}
});
Prism2.languages.insertBefore("inside", "punctuation", {
"expression": parser.expression,
"keyword": parser.keyword,
"variable": parser.variable,
"function": parser.function,
"escape": parser.escape,
"parser-punctuation": {
pattern: parser.punctuation,
alias: "punctuation"
}
}, parser["tag"].inside["attr-value"]);
})(Prism);
Prism.languages.pascal = {
"directive": {
pattern: /\{\$[\s\S]*?\}/,
greedy: true,
alias: ["marco", "property"]
},
"comment": {
pattern: /\(\*[\s\S]*?\*\)|\{[\s\S]*?\}|\/\/.*/,
greedy: true
},
"string": {
pattern: /(?:'(?:''|[^'\r\n])*'(?!')|#[&$%]?[a-f\d]+)+|\^[a-z]/i,
greedy: true
},
"asm": {
pattern: /(\basm\b)[\s\S]+?(?=\bend\s*[;[])/i,
lookbehind: true,
greedy: true,
inside: null
},
"keyword": [
{
pattern: /(^|[^&])\b(?:absolute|array|asm|begin|case|const|constructor|destructor|do|downto|else|end|file|for|function|goto|if|implementation|inherited|inline|interface|label|nil|object|of|operator|packed|procedure|program|record|reintroduce|repeat|self|set|string|then|to|type|unit|until|uses|var|while|with)\b/i,
lookbehind: true
},
{
pattern: /(^|[^&])\b(?:dispose|exit|false|new|true)\b/i,
lookbehind: true
},
{
pattern: /(^|[^&])\b(?:class|dispinterface|except|exports|finalization|finally|initialization|inline|library|on|out|packed|property|raise|resourcestring|threadvar|try)\b/i,
lookbehind: true
},
{
pattern: /(^|[^&])\b(?:absolute|abstract|alias|assembler|bitpacked|break|cdecl|continue|cppdecl|cvar|default|deprecated|dynamic|enumerator|experimental|export|external|far|far16|forward|generic|helper|implements|index|interrupt|iochecks|local|message|name|near|nodefault|noreturn|nostackframe|oldfpccall|otherwise|overload|override|pascal|platform|private|protected|public|published|read|register|reintroduce|result|safecall|saveregisters|softfloat|specialize|static|stdcall|stored|strict|unaligned|unimplemented|varargs|virtual|write)\b/i,
lookbehind: true
}
],
"number": [
/(?:[&%]\d+|\$[a-f\d]+)/i,
/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?/i
],
"operator": [
/\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=]/,
{
pattern: /(^|[^&])\b(?:and|as|div|exclude|in|include|is|mod|not|or|shl|shr|xor)\b/,
lookbehind: true
}
],
"punctuation": /\(\.|\.\)|[()\[\]:;,.]/
};
Prism.languages.pascal.asm.inside = Prism.languages.extend("pascal", {
"asm": void 0,
"keyword": void 0,
"operator": void 0
});
Prism.languages.objectpascal = Prism.languages.pascal;
(function(Prism2) {
var braces = /\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\)/.source;
var type = /(?:\b\w+(?:<braces>)?|<braces>)/.source.replace(/<braces>/g, function() {
return braces;
});
var pascaligo = Prism2.languages.pascaligo = {
"comment": /\(\*[\s\S]+?\*\)|\/\/.*/,
"string": {
pattern: /(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1|\^[a-z]/i,
greedy: true
},
"class-name": [
{
pattern: RegExp(/(\btype\s+\w+\s+is\s+)<type>/.source.replace(/<type>/g, function() {
return type;
}), "i"),
lookbehind: true,
inside: null
},
{
pattern: RegExp(/<type>(?=\s+is\b)/.source.replace(/<type>/g, function() {
return type;
}), "i"),
inside: null
},
{
pattern: RegExp(/(:\s*)<type>/.source.replace(/<type>/g, function() {
return type;
})),
lookbehind: true,
inside: null
}
],
"keyword": {
pattern: /(^|[^&])\b(?:begin|block|case|const|else|end|fail|for|from|function|if|is|nil|of|remove|return|skip|then|type|var|while|with)\b/i,
lookbehind: true
},
"boolean": {
pattern: /(^|[^&])\b(?:False|True)\b/i,
lookbehind: true
},
"builtin": {
pattern: /(^|[^&])\b(?:bool|int|list|map|nat|record|string|unit)\b/i,
lookbehind: true
},
"function": /\b\w+(?=\s*\()/,
"number": [
/%[01]+|&[0-7]+|\$[a-f\d]+/i,
/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?(?:mtz|n)?/i
],
"operator": /->|=\/=|\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=|]|\b(?:and|mod|or)\b/,
"punctuation": /\(\.|\.\)|[()\[\]:;,.{}]/
};
var classNameInside = ["comment", "keyword", "builtin", "operator", "punctuation"].reduce(function(accum, key) {
accum[key] = pascaligo[key];
return accum;
}, {});
pascaligo["class-name"].forEach(function(p) {
p.inside = classNameInside;
});
})(Prism);
Prism.languages.psl = {
"comment": {
pattern: /#.*/,
greedy: true
},
"string": {
pattern: /"(?:\\.|[^\\"])*"/,
greedy: true,
inside: {
"symbol": /\\[ntrbA-Z"\\]/
}
},
"heredoc-string": {
pattern: /<<<([a-zA-Z_]\w*)[\r\n](?:.*[\r\n])*?\1\b/,
alias: "string",
greedy: true
},
"keyword": /\b(?:__multi|__single|case|default|do|else|elsif|exit|export|for|foreach|function|if|last|line|local|next|requires|return|switch|until|while|word)\b/,
"constant": /\b(?:ALARM|CHART_ADD_GRAPH|CHART_DELETE_GRAPH|CHART_DESTROY|CHART_LOAD|CHART_PRINT|EOF|OFFLINE|OK|PSL_PROF_LOG|R_CHECK_HORIZ|R_CHECK_VERT|R_CLICKER|R_COLUMN|R_FRAME|R_ICON|R_LABEL|R_LABEL_CENTER|R_LIST_MULTIPLE|R_LIST_MULTIPLE_ND|R_LIST_SINGLE|R_LIST_SINGLE_ND|R_MENU|R_POPUP|R_POPUP_SCROLLED|R_RADIO_HORIZ|R_RADIO_VERT|R_ROW|R_SCALE_HORIZ|R_SCALE_VERT|R_SEP_HORIZ|R_SEP_VERT|R_SPINNER|R_TEXT_FIELD|R_TEXT_FIELD_LABEL|R_TOGGLE|TRIM_LEADING|TRIM_LEADING_AND_TRAILING|TRIM_REDUNDANT|TRIM_TRAILING|VOID|WARN)\b/,
"boolean": /\b(?:FALSE|False|NO|No|TRUE|True|YES|Yes|false|no|true|yes)\b/,
"variable": /\b(?:PslDebug|errno|exit_status)\b/,
"builtin": {
pattern: /\b(?:PslExecute|PslFunctionCall|PslFunctionExists|PslSetOptions|_snmp_debug|acos|add_diary|annotate|annotate_get|ascii_to_ebcdic|asctime|asin|atan|atexit|batch_set|blackout|cat|ceil|chan_exists|change_state|close|code_cvt|cond_signal|cond_wait|console_type|convert_base|convert_date|convert_locale_date|cos|cosh|create|date|dcget_text|destroy|destroy_lock|dget_text|difference|dump_hist|ebcdic_to_ascii|encrypt|event_archive|event_catalog_get|event_check|event_query|event_range_manage|event_range_query|event_report|event_schedule|event_trigger|event_trigger2|execute|exists|exp|fabs|file|floor|fmod|fopen|fseek|ftell|full_discovery|get|get_chan_info|get_ranges|get_text|get_vars|getenv|gethostinfo|getpid|getpname|grep|history|history_get_retention|in_transition|index|int|internal|intersection|is_var|isnumber|join|kill|length|lines|lock|lock_info|log|log10|loge|matchline|msg_check|msg_get_format|msg_get_severity|msg_printf|msg_sprintf|ntharg|nthargf|nthline|nthlinef|num_bytes|num_consoles|pconfig|popen|poplines|pow|print|printf|proc_exists|process|random|read|readln|refresh_parameters|remote_check|remote_close|remote_event_query|remote_event_trigger|remote_file_send|remote_open|remove|replace|rindex|sec_check_priv|sec_store_get|sec_store_set|set|set_alarm_ranges|set_locale|share|sin|sinh|sleep|snmp_agent_config|snmp_agent_start|snmp_agent_stop|snmp_close|snmp_config|snmp_get|snmp_get_next|snmp_h_get|snmp_h_get_next|snmp_h_set|snmp_open|snmp_set|snmp_trap_ignore|snmp_trap_listen|snmp_trap_raise_std_trap|snmp_trap_receive|snmp_trap_register_im|snmp_trap_send|snmp_walk|sopen|sort|splitline|sprintf|sqrt|srandom|str_repeat|strcasecmp|subset|substr|system|tail|tan|tanh|text_domain|time|tmpnam|tolower|toupper|trace_psl_process|trim|union|unique|unlock|unset|va_arg|va_start|write)\b/,
alias: "builtin-function"
},
"foreach-variable": {
pattern: /(\bforeach\s+(?:(?:\w+\b|"(?:\\.|[^\\"])*")\s+){0,2})[_a-zA-Z]\w*(?=\s*\()/,
lookbehind: true,
greedy: true
},
"function": /\b[_a-z]\w*\b(?=\s*\()/i,
"number": /\b(?:0x[0-9a-f]+|\d+(?:\.\d+)?)\b/i,
"operator": /--|\+\+|&&=?|\|\|=?|<<=?|>>=?|[=!]~|[-+*/%&|^!=<>]=?|\.|[:?]/,
"punctuation": /[(){}\[\];,]/
};
Prism.languages.pcaxis = {
"string": /"[^"]*"/,
"keyword": {
pattern: /((?:^|;)\s*)[-A-Z\d]+(?:\s*\[[-\w]+\])?(?:\s*\("[^"]*"(?:,\s*"[^"]*")*\))?(?=\s*=)/,
lookbehind: true,
greedy: true,
inside: {
"keyword": /^[-A-Z\d]+/,
"language": {
pattern: /^(\s*)\[[-\w]+\]/,
lookbehind: true,
inside: {
"punctuation": /^\[|\]$/,
"property": /[-\w]+/
}
},
"sub-key": {
pattern: /^(\s*)\S[\s\S]*/,
lookbehind: true,
inside: {
"parameter": {
pattern: /"[^"]*"/,
alias: "property"
},
"punctuation": /^\(|\)$|,/
}
}
}
},
"operator": /=/,
"tlist": {
pattern: /TLIST\s*\(\s*\w+(?:(?:\s*,\s*"[^"]*")+|\s*,\s*"[^"]*"-"[^"]*")?\s*\)/,
greedy: true,
inside: {
"function": /^TLIST/,
"property": {
pattern: /^(\s*\(\s*)\w+/,
lookbehind: true
},
"string": /"[^"]*"/,
"punctuation": /[(),]/,
"operator": /-/
}
},
"punctuation": /[;,]/,
"number": {
pattern: /(^|\s)\d+(?:\.\d+)?(?!\S)/,
lookbehind: true
},
"boolean": /NO|YES/
};
Prism.languages.px = Prism.languages.pcaxis;
Prism.languages.peoplecode = {
"comment": RegExp([
/\/\*[\s\S]*?\*\//.source,
/\bREM[^;]*;/.source,
/<\*(?:[^<*]|\*(?!>)|<(?!\*)|<\*(?:(?!\*>)[\s\S])*\*>)*\*>/.source,
/\/\+[\s\S]*?\+\//.source
].join("|")),
"string": {
pattern: /'(?:''|[^'\r\n])*'(?!')|"(?:""|[^"\r\n])*"(?!")/,
greedy: true
},
"variable": /%\w+/,
"function-definition": {
pattern: /((?:^|[^\w-])(?:function|method)\s+)\w+/i,
lookbehind: true,
alias: "function"
},
"class-name": {
pattern: /((?:^|[^-\w])(?:as|catch|class|component|create|extends|global|implements|instance|local|of|property|returns)\s+)\w+(?::\w+)*/i,
lookbehind: true,
inside: {
"punctuation": /:/
}
},
"keyword": /\b(?:abstract|alias|as|catch|class|component|constant|create|declare|else|end-(?:class|evaluate|for|function|get|if|method|set|try|while)|evaluate|extends|for|function|get|global|if|implements|import|instance|library|local|method|null|of|out|peopleCode|private|program|property|protected|readonly|ref|repeat|returns?|set|step|then|throw|to|try|until|value|when(?:-other)?|while)\b/i,
"operator-keyword": {
pattern: /\b(?:and|not|or)\b/i,
alias: "operator"
},
"function": /[_a-z]\w*(?=\s*\()/i,
"boolean": /\b(?:false|true)\b/i,
"number": /\b\d+(?:\.\d+)?\b/,
"operator": /<>|[<>]=?|!=|\*\*|[-+*/|=@]/,
"punctuation": /[:.;,()[\]]/
};
Prism.languages.pcode = Prism.languages.peoplecode;
(function(Prism2) {
var brackets = /(?:\((?:[^()\\]|\\[\s\S])*\)|\{(?:[^{}\\]|\\[\s\S])*\}|\[(?:[^[\]\\]|\\[\s\S])*\]|<(?:[^<>\\]|\\[\s\S])*>)/.source;
Prism2.languages.perl = {
"comment": [
{
pattern: /(^\s*)=\w[\s\S]*?=cut.*/m,
lookbehind: true,
greedy: true
},
{
pattern: /(^|[^\\$])#.*/,
lookbehind: true,
greedy: true
}
],
"string": [
{
pattern: RegExp(/\b(?:q|qq|qw|qx)(?![a-zA-Z0-9])\s*/.source + "(?:" + [
/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,
/([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,
brackets
].join("|") + ")"),
greedy: true
},
{
pattern: /("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,
greedy: true
},
{
pattern: /'(?:[^'\\\r\n]|\\.)*'/,
greedy: true
}
],
"regex": [
{
pattern: RegExp(/\b(?:m|qr)(?![a-zA-Z0-9])\s*/.source + "(?:" + [
/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,
/([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,
brackets
].join("|") + ")" + /[msixpodualngc]*/.source),
greedy: true
},
{
pattern: RegExp(/(^|[^-])\b(?:s|tr|y)(?![a-zA-Z0-9])\s*/.source + "(?:" + [
/([^a-zA-Z0-9\s{(\[<])(?:(?!\2)[^\\]|\\[\s\S])*\2(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,
/([a-zA-Z0-9])(?:(?!\3)[^\\]|\\[\s\S])*\3(?:(?!\3)[^\\]|\\[\s\S])*\3/.source,
brackets + /\s*/.source + brackets
].join("|") + ")" + /[msixpodualngcer]*/.source),
lookbehind: true,
greedy: true
},
{
pattern: /\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|x|xor)\b))/,
greedy: true
}
],
"variable": [
/[&*$@%]\{\^[A-Z]+\}/,
/[&*$@%]\^[A-Z_]/,
/[&*$@%]#?(?=\{)/,
/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/,
/[&*$@%]\d+/,
/(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/
],
"filehandle": {
pattern: /<(?![<=])\S*?>|\b_\b/,
alias: "symbol"
},
"v-string": {
pattern: /v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,
alias: "string"
},
"function": {
pattern: /(\bsub[ \t]+)\w+/,
lookbehind: true
},
"keyword": /\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,
"number": /\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,
"operator": /-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\b/,
"punctuation": /[{}[\];(),:]/
};
})(Prism);
(function(Prism2) {
var typeExpression = /(?:\b[a-zA-Z]\w*|[|\\[\]])+/.source;
Prism2.languages.phpdoc = Prism2.languages.extend("javadoclike", {
"parameter": {
pattern: RegExp("(@(?:global|param|property(?:-read|-write)?|var)\\s+(?:" + typeExpression + "\\s+)?)\\$\\w+"),
lookbehind: true
}
});
Prism2.languages.insertBefore("phpdoc", "keyword", {
"class-name": [
{
pattern: RegExp("(@(?:global|package|param|property(?:-read|-write)?|return|subpackage|throws|var)\\s+)" + typeExpression),
lookbehind: true,
inside: {
"keyword": /\b(?:array|bool|boolean|callback|double|false|float|int|integer|mixed|null|object|resource|self|string|true|void)\b/,
"punctuation": /[|\\[\]()]/
}
}
]
});
Prism2.languages.javadoclike.addSupport("php", Prism2.languages.phpdoc);
})(Prism);
Prism.languages.insertBefore("php", "variable", {
"this": {
pattern: /\$this\b/,
alias: "keyword"
},
"global": /\$(?:GLOBALS|HTTP_RAW_POST_DATA|_(?:COOKIE|ENV|FILES|GET|POST|REQUEST|SERVER|SESSION)|argc|argv|http_response_header|php_errormsg)\b/,
"scope": {
pattern: /\b[\w\\]+::/,
inside: {
"keyword": /\b(?:parent|self|static)\b/,
"punctuation": /::|\\/
}
}
});
(function(Prism2) {
var variable = /\$\w+|%[a-z]+%/;
var arrowAttr = /\[[^[\]]*\]/.source;
var arrowDirection = /(?:[drlu]|do|down|le|left|ri|right|up)/.source;
var arrowBody = "(?:-+" + arrowDirection + "-+|\\.+" + arrowDirection + "\\.+|-+(?:" + arrowAttr + "-*)?|" + arrowAttr + "-+|\\.+(?:" + arrowAttr + "\\.*)?|" + arrowAttr + "\\.+)";
var arrowLeft = /(?:<{1,2}|\/{1,2}|\\{1,2}|<\||[#*^+}xo])/.source;
var arrowRight = /(?:>{1,2}|\/{1,2}|\\{1,2}|\|>|[#*^+{xo])/.source;
var arrowPrefix = /[[?]?[ox]?/.source;
var arrowSuffix = /[ox]?[\]?]?/.source;
var arrow2 = arrowPrefix + "(?:" + arrowBody + arrowRight + "|" + arrowLeft + arrowBody + "(?:" + arrowRight + ")?)" + arrowSuffix;
Prism2.languages["plant-uml"] = {
"comment": {
pattern: /(^[ \t]*)(?:'.*|\/'[\s\S]*?'\/)/m,
lookbehind: true,
greedy: true
},
"preprocessor": {
pattern: /(^[ \t]*)!.*/m,
lookbehind: true,
greedy: true,
alias: "property",
inside: {
"variable": variable
}
},
"delimiter": {
pattern: /(^[ \t]*)@(?:end|start)uml\b/m,
lookbehind: true,
greedy: true,
alias: "punctuation"
},
"arrow": {
pattern: RegExp(/(^|[^-.<>?|\\[\]ox])/.source + arrow2 + /(?![-.<>?|\\\]ox])/.source),
lookbehind: true,
greedy: true,
alias: "operator",
inside: {
"expression": {
pattern: /(\[)[^[\]]+(?=\])/,
lookbehind: true,
inside: null
},
"punctuation": /\[(?=$|\])|^\]/
}
},
"string": {
pattern: /"[^"]*"/,
greedy: true
},
"text": {
pattern: /(\[[ \t]*[\r\n]+(?![\r\n]))[^\]]*(?=\])/,
lookbehind: true,
greedy: true,
alias: "string"
},
"keyword": [
{
pattern: /^([ \t]*)(?:abstract\s+class|end\s+(?:box|fork|group|merge|note|ref|split|title)|(?:fork|split)(?:\s+again)?|activate|actor|agent|alt|annotation|artifact|autoactivate|autonumber|backward|binary|boundary|box|break|caption|card|case|circle|class|clock|cloud|collections|component|concise|control|create|critical|database|deactivate|destroy|detach|diamond|else|elseif|end|end[hr]note|endif|endswitch|endwhile|entity|enum|file|folder|footer|frame|group|[hr]?note|header|hexagon|hide|if|interface|label|legend|loop|map|namespace|network|newpage|node|nwdiag|object|opt|package|page|par|participant|person|queue|rectangle|ref|remove|repeat|restore|return|robust|scale|set|show|skinparam|stack|start|state|stop|storage|switch|title|together|usecase|usecase\/|while)(?=\s|$)/m,
lookbehind: true,
greedy: true
},
/\b(?:elseif|equals|not|while)(?=\s*\()/,
/\b(?:as|is|then)\b/
],
"divider": {
pattern: /^==.+==$/m,
greedy: true,
alias: "important"
},
"time": {
pattern: /@(?:\d+(?:[:/]\d+){2}|[+-]?\d+|:[a-z]\w*(?:[+-]\d+)?)\b/i,
greedy: true,
alias: "number"
},
"color": {
pattern: /#(?:[a-z_]+|[a-fA-F0-9]+)\b/,
alias: "symbol"
},
"variable": variable,
"punctuation": /[:,;()[\]{}]|\.{3}/
};
Prism2.languages["plant-uml"].arrow.inside.expression.inside = Prism2.languages["plant-uml"];
Prism2.languages["plantuml"] = Prism2.languages["plant-uml"];
})(Prism);
Prism.languages.plsql = Prism.languages.extend("sql", {
"comment": {
pattern: /\/\*[\s\S]*?\*\/|--.*/,
greedy: true
},
"keyword": /\b(?:A|ACCESSIBLE|ADD|AGENT|AGGREGATE|ALL|ALTER|AND|ANY|ARRAY|AS|ASC|AT|ATTRIBUTE|AUTHID|AVG|BEGIN|BETWEEN|BFILE_BASE|BINARY|BLOB_BASE|BLOCK|BODY|BOTH|BOUND|BULK|BY|BYTE|C|CALL|CALLING|CASCADE|CASE|CHAR|CHARACTER|CHARSET|CHARSETFORM|CHARSETID|CHAR_BASE|CHECK|CLOB_BASE|CLONE|CLOSE|CLUSTER|CLUSTERS|COLAUTH|COLLECT|COLUMNS|COMMENT|COMMIT|COMMITTED|COMPILED|COMPRESS|CONNECT|CONSTANT|CONSTRUCTOR|CONTEXT|CONTINUE|CONVERT|COUNT|CRASH|CREATE|CREDENTIAL|CURRENT|CURSOR|CUSTOMDATUM|DANGLING|DATA|DATE|DATE_BASE|DAY|DECLARE|DEFAULT|DEFINE|DELETE|DESC|DETERMINISTIC|DIRECTORY|DISTINCT|DOUBLE|DROP|DURATION|ELEMENT|ELSE|ELSIF|EMPTY|END|ESCAPE|EXCEPT|EXCEPTION|EXCEPTIONS|EXCLUSIVE|EXECUTE|EXISTS|EXIT|EXTERNAL|FETCH|FINAL|FIRST|FIXED|FLOAT|FOR|FORALL|FORCE|FROM|FUNCTION|GENERAL|GOTO|GRANT|GROUP|HASH|HAVING|HEAP|HIDDEN|HOUR|IDENTIFIED|IF|IMMEDIATE|IMMUTABLE|IN|INCLUDING|INDEX|INDEXES|INDICATOR|INDICES|INFINITE|INSERT|INSTANTIABLE|INT|INTERFACE|INTERSECT|INTERVAL|INTO|INVALIDATE|IS|ISOLATION|JAVA|LANGUAGE|LARGE|LEADING|LENGTH|LEVEL|LIBRARY|LIKE|LIKE2|LIKE4|LIKEC|LIMIT|LIMITED|LOCAL|LOCK|LONG|LOOP|MAP|MAX|MAXLEN|MEMBER|MERGE|MIN|MINUS|MINUTE|MOD|MODE|MODIFY|MONTH|MULTISET|MUTABLE|NAME|NAN|NATIONAL|NATIVE|NCHAR|NEW|NOCOMPRESS|NOCOPY|NOT|NOWAIT|NULL|NUMBER_BASE|OBJECT|OCICOLL|OCIDATE|OCIDATETIME|OCIDURATION|OCIINTERVAL|OCILOBLOCATOR|OCINUMBER|OCIRAW|OCIREF|OCIREFCURSOR|OCIROWID|OCISTRING|OCITYPE|OF|OLD|ON|ONLY|OPAQUE|OPEN|OPERATOR|OPTION|OR|ORACLE|ORADATA|ORDER|ORGANIZATION|ORLANY|ORLVARY|OTHERS|OUT|OVERLAPS|OVERRIDING|PACKAGE|PARALLEL_ENABLE|PARAMETER|PARAMETERS|PARENT|PARTITION|PASCAL|PERSISTABLE|PIPE|PIPELINED|PLUGGABLE|POLYMORPHIC|PRAGMA|PRECISION|PRIOR|PRIVATE|PROCEDURE|PUBLIC|RAISE|RANGE|RAW|READ|RECORD|REF|REFERENCE|RELIES_ON|REM|REMAINDER|RENAME|RESOURCE|RESULT|RESULT_CACHE|RETURN|RETURNING|REVERSE|REVOKE|ROLLBACK|ROW|SAMPLE|SAVE|SAVEPOINT|SB1|SB2|SB4|SECOND|SEGMENT|SELECT|SELF|SEPARATE|SEQUENCE|SERIALIZABLE|SET|SHARE|SHORT|SIZE|SIZE_T|SOME|SPARSE|SQL|SQLCODE|SQLDATA|SQLNAME|SQLSTATE|STANDARD|START|STATIC|STDDEV|STORED|STRING|STRUCT|STYLE|SUBMULTISET|SUBPARTITION|SUBSTITUTABLE|SUBTYPE|SUM|SYNONYM|TABAUTH|TABLE|TDO|THE|THEN|TIME|TIMESTAMP|TIMEZONE_ABBR|TIMEZONE_HOUR|TIMEZONE_MINUTE|TIMEZONE_REGION|TO|TRAILING|TRANSACTION|TRANSACTIONAL|TRUSTED|TYPE|UB1|UB2|UB4|UNDER|UNION|UNIQUE|UNPLUG|UNSIGNED|UNTRUSTED|UPDATE|USE|USING|VALIST|VALUE|VALUES|VARIABLE|VARIANCE|VARRAY|VARYING|VIEW|VIEWS|VOID|WHEN|WHERE|WHILE|WITH|WORK|WRAPPED|WRITE|YEAR|ZONE)\b/i,
"operator": /:=?|=>|[<>^~!]=|\.\.|\|\||\*\*|[-+*/%<>=@]/
});
Prism.languages.insertBefore("plsql", "operator", {
"label": {
pattern: /<<\s*\w+\s*>>/,
alias: "symbol"
}
});
Prism.languages.powerquery = {
"comment": {
pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,
lookbehind: true,
greedy: true
},
"quoted-identifier": {
pattern: /#"(?:[^"\r\n]|"")*"(?!")/,
greedy: true
},
"string": {
pattern: /(?:#!)?"(?:[^"\r\n]|"")*"(?!")/,
greedy: true
},
"constant": [
/\bDay\.(?:Friday|Monday|Saturday|Sunday|Thursday|Tuesday|Wednesday)\b/,
/\bTraceLevel\.(?:Critical|Error|Information|Verbose|Warning)\b/,
/\bOccurrence\.(?:All|First|Last)\b/,
/\bOrder\.(?:Ascending|Descending)\b/,
/\bRoundingMode\.(?:AwayFromZero|Down|ToEven|TowardZero|Up)\b/,
/\bMissingField\.(?:Error|Ignore|UseNull)\b/,
/\bQuoteStyle\.(?:Csv|None)\b/,
/\bJoinKind\.(?:FullOuter|Inner|LeftAnti|LeftOuter|RightAnti|RightOuter)\b/,
/\bGroupKind\.(?:Global|Local)\b/,
/\bExtraValues\.(?:Error|Ignore|List)\b/,
/\bJoinAlgorithm\.(?:Dynamic|LeftHash|LeftIndex|PairwiseHash|RightHash|RightIndex|SortMerge)\b/,
/\bJoinSide\.(?:Left|Right)\b/,
/\bPrecision\.(?:Decimal|Double)\b/,
/\bRelativePosition\.From(?:End|Start)\b/,
/\bTextEncoding\.(?:Ascii|BigEndianUnicode|Unicode|Utf16|Utf8|Windows)\b/,
/\b(?:Any|Binary|Date|DateTime|DateTimeZone|Duration|Function|Int16|Int32|Int64|Int8|List|Logical|None|Number|Record|Table|Text|Time)\.Type\b/,
/\bnull\b/
],
"boolean": /\b(?:false|true)\b/,
"keyword": /\b(?:and|as|each|else|error|if|in|is|let|meta|not|nullable|optional|or|otherwise|section|shared|then|try|type)\b|#(?:binary|date|datetime|datetimezone|duration|infinity|nan|sections|shared|table|time)\b/,
"function": {
pattern: /(^|[^#\w.])[a-z_][\w.]*(?=\s*\()/i,
lookbehind: true
},
"data-type": {
pattern: /\b(?:any|anynonnull|binary|date|datetime|datetimezone|duration|function|list|logical|none|number|record|table|text|time)\b/,
alias: "class-name"
},
"number": {
pattern: /\b0x[\da-f]+\b|(?:[+-]?(?:\b\d+\.)?\b\d+|[+-]\.\d+|(^|[^.])\B\.\d+)(?:e[+-]?\d+)?\b/i,
lookbehind: true
},
"operator": /[-+*\/&?@^]|<(?:=>?|>)?|>=?|=>?|\.\.\.?/,
"punctuation": /[,;\[\](){}]/
};
Prism.languages.pq = Prism.languages["powerquery"];
Prism.languages.mscript = Prism.languages["powerquery"];
(function(Prism2) {
var powershell = Prism2.languages.powershell = {
"comment": [
{
pattern: /(^|[^`])<#[\s\S]*?#>/,
lookbehind: true
},
{
pattern: /(^|[^`])#.*/,
lookbehind: true
}
],
"string": [
{
pattern: /"(?:`[\s\S]|[^`"])*"/,
greedy: true,
inside: null
},
{
pattern: /'(?:[^']|'')*'/,
greedy: true
}
],
"namespace": /\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,
"boolean": /\$(?:false|true)\b/i,
"variable": /\$\w+\b/,
"function": [
/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,
/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i
],
"keyword": /\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,
"operator": {
pattern: /(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,
lookbehind: true
},
"punctuation": /[|{}[\];(),.]/
};
powershell.string[0].inside = {
"function": {
pattern: /(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,
lookbehind: true,
inside: powershell
},
"boolean": powershell.boolean,
"variable": powershell.variable
};
})(Prism);
Prism.languages.processing = Prism.languages.extend("clike", {
"keyword": /\b(?:break|case|catch|class|continue|default|else|extends|final|for|if|implements|import|new|null|private|public|return|static|super|switch|this|try|void|while)\b/,
"function": /\b\w+(?=\s*\()/,
"operator": /<[<=]?|>[>=]?|&&?|\|\|?|[%?]|[!=+\-*\/]=?/
});
Prism.languages.insertBefore("processing", "number", {
"constant": /\b(?!XML\b)[A-Z][A-Z\d_]+\b/,
"type": {
pattern: /\b(?:boolean|byte|char|color|double|float|int|[A-Z]\w*)\b/,
alias: "class-name"
}
});
Prism.languages.prolog = {
"comment": {
pattern: /\/\*[\s\S]*?\*\/|%.*/,
greedy: true
},
"string": {
pattern: /(["'])(?:\1\1|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1(?!\1)/,
greedy: true
},
"builtin": /\b(?:fx|fy|xf[xy]?|yfx?)\b/,
"function": /\b[a-z]\w*(?:(?=\()|\/\d+)/,
"number": /\b\d+(?:\.\d*)?/,
"operator": /[:\\=><\-?*@\/;+^|!$.]+|\b(?:is|mod|not|xor)\b/,
"punctuation": /[(){}\[\],]/
};
(function(Prism2) {
var aggregations = [
"sum",
"min",
"max",
"avg",
"group",
"stddev",
"stdvar",
"count",
"count_values",
"bottomk",
"topk",
"quantile"
];
var vectorMatching = [
"on",
"ignoring",
"group_right",
"group_left",
"by",
"without"
];
var offsetModifier = ["offset"];
var keywords = aggregations.concat(vectorMatching, offsetModifier);
Prism2.languages.promql = {
"comment": {
pattern: /(^[ \t]*)#.*/m,
lookbehind: true
},
"vector-match": {
pattern: new RegExp("((?:" + vectorMatching.join("|") + ")\\s*)\\([^)]*\\)"),
lookbehind: true,
inside: {
"label-key": {
pattern: /\b[^,]+\b/,
alias: "attr-name"
},
"punctuation": /[(),]/
}
},
"context-labels": {
pattern: /\{[^{}]*\}/,
inside: {
"label-key": {
pattern: /\b[a-z_]\w*(?=\s*(?:=|![=~]))/,
alias: "attr-name"
},
"label-value": {
pattern: /(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,
greedy: true,
alias: "attr-value"
},
"punctuation": /\{|\}|=~?|![=~]|,/
}
},
"context-range": [
{
pattern: /\[[\w\s:]+\]/,
inside: {
"punctuation": /\[|\]|:/,
"range-duration": {
pattern: /\b(?:\d+(?:[smhdwy]|ms))+\b/i,
alias: "number"
}
}
},
{
pattern: /(\boffset\s+)\w+/,
lookbehind: true,
inside: {
"range-duration": {
pattern: /\b(?:\d+(?:[smhdwy]|ms))+\b/i,
alias: "number"
}
}
}
],
"keyword": new RegExp("\\b(?:" + keywords.join("|") + ")\\b", "i"),
"function": /\b[a-z_]\w*(?=\s*\()/i,
"number": /[-+]?(?:(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[-+]?\d+)?\b|\b(?:0x[0-9a-f]+|nan|inf)\b)/i,
"operator": /[\^*/%+-]|==|!=|<=|<|>=|>|\b(?:and|or|unless)\b/i,
"punctuation": /[{};()`,.[\]]/
};
})(Prism);
Prism.languages.properties = {
"comment": /^[ \t]*[#!].*$/m,
"value": {
pattern: /(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m,
lookbehind: true,
alias: "attr-value"
},
"key": {
pattern: /^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m,
alias: "attr-name"
},
"punctuation": /[=:]/
};
(function(Prism2) {
var builtinTypes = /\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\b/;
Prism2.languages.protobuf = Prism2.languages.extend("clike", {
"class-name": [
{
pattern: /(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,
lookbehind: true
},
{
pattern: /(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,
lookbehind: true
}
],
"keyword": /\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,
"function": /\b[a-z_]\w*(?=\s*\()/i
});
Prism2.languages.insertBefore("protobuf", "operator", {
"map": {
pattern: /\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,
alias: "class-name",
inside: {
"punctuation": /[<>.,]/,
"builtin": builtinTypes
}
},
"builtin": builtinTypes,
"positional-class-name": {
pattern: /(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,
alias: "class-name",
inside: {
"punctuation": /\./
}
},
"annotation": {
pattern: /(\[\s*)[a-z_]\w*(?=\s*=)/i,
lookbehind: true
}
});
})(Prism);
(function(Prism2) {
Prism2.languages.pug = {
"comment": {
pattern: /(^([\t ]*))\/\/.*(?:(?:\r?\n|\r)\2[\t ].+)*/m,
lookbehind: true
},
"multiline-script": {
pattern: /(^([\t ]*)script\b.*\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,
lookbehind: true,
inside: Prism2.languages.javascript
},
"filter": {
pattern: /(^([\t ]*)):.+(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,
lookbehind: true,
inside: {
"filter-name": {
pattern: /^:[\w-]+/,
alias: "variable"
},
"text": /\S[\s\S]*/
}
},
"multiline-plain-text": {
pattern: /(^([\t ]*)[\w\-#.]+\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,
lookbehind: true
},
"markup": {
pattern: /(^[\t ]*)<.+/m,
lookbehind: true,
inside: Prism2.languages.markup
},
"doctype": {
pattern: /((?:^|\n)[\t ]*)doctype(?: .+)?/,
lookbehind: true
},
"flow-control": {
pattern: /(^[\t ]*)(?:case|default|each|else|if|unless|when|while)\b(?: .+)?/m,
lookbehind: true,
inside: {
"each": {
pattern: /^each .+? in\b/,
inside: {
"keyword": /\b(?:each|in)\b/,
"punctuation": /,/
}
},
"branch": {
pattern: /^(?:case|default|else|if|unless|when|while)\b/,
alias: "keyword"
},
rest: Prism2.languages.javascript
}
},
"keyword": {
pattern: /(^[\t ]*)(?:append|block|extends|include|prepend)\b.+/m,
lookbehind: true
},
"mixin": [
{
pattern: /(^[\t ]*)mixin .+/m,
lookbehind: true,
inside: {
"keyword": /^mixin/,
"function": /\w+(?=\s*\(|\s*$)/,
"punctuation": /[(),.]/
}
},
{
pattern: /(^[\t ]*)\+.+/m,
lookbehind: true,
inside: {
"name": {
pattern: /^\+\w+/,
alias: "function"
},
rest: Prism2.languages.javascript
}
}
],
"script": {
pattern: /(^[\t ]*script(?:(?:&[^(]+)?\([^)]+\))*[\t ]).+/m,
lookbehind: true,
inside: Prism2.languages.javascript
},
"plain-text": {
pattern: /(^[\t ]*(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?[\t ]).+/m,
lookbehind: true
},
"tag": {
pattern: /(^[\t ]*)(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?:?/m,
lookbehind: true,
inside: {
"attributes": [
{
pattern: /&[^(]+\([^)]+\)/,
inside: Prism2.languages.javascript
},
{
pattern: /\([^)]+\)/,
inside: {
"attr-value": {
pattern: /(=\s*(?!\s))(?:\{[^}]*\}|[^,)\r\n]+)/,
lookbehind: true,
inside: Prism2.languages.javascript
},
"attr-name": /[\w-]+(?=\s*!?=|\s*[,)])/,
"punctuation": /[!=(),]+/
}
}
],
"punctuation": /:/,
"attr-id": /#[\w\-]+/,
"attr-class": /\.[\w\-]+/
}
},
"code": [
{
pattern: /(^[\t ]*(?:-|!?=)).+/m,
lookbehind: true,
inside: Prism2.languages.javascript
}
],
"punctuation": /[.\-!=|]+/
};
var filter_pattern = /(^([\t ]*)):<filter_name>(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/.source;
var filters = [
{ filter: "atpl", language: "twig" },
{ filter: "coffee", language: "coffeescript" },
"ejs",
"handlebars",
"less",
"livescript",
"markdown",
{ filter: "sass", language: "scss" },
"stylus"
];
var all_filters = {};
for (var i = 0, l = filters.length; i < l; i++) {
var filter = filters[i];
filter = typeof filter === "string" ? { filter, language: filter } : filter;
if (Prism2.languages[filter.language]) {
all_filters["filter-" + filter.filter] = {
pattern: RegExp(filter_pattern.replace("<filter_name>", function() {
return filter.filter;
}), "m"),
lookbehind: true,
inside: {
"filter-name": {
pattern: /^:[\w-]+/,
alias: "variable"
},
"text": {
pattern: /\S[\s\S]*/,
alias: [filter.language, "language-" + filter.language],
inside: Prism2.languages[filter.language]
}
}
};
}
}
Prism2.languages.insertBefore("pug", "filter", all_filters);
})(Prism);
(function(Prism2) {
Prism2.languages.puppet = {
"heredoc": [
{
pattern: /(@\("([^"\r\n\/):]+)"(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,
lookbehind: true,
alias: "string",
inside: {
"punctuation": /(?=\S).*\S(?= *$)/
}
},
{
pattern: /(@\(([^"\r\n\/):]+)(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,
lookbehind: true,
greedy: true,
alias: "string",
inside: {
"punctuation": /(?=\S).*\S(?= *$)/
}
},
{
pattern: /@\("?(?:[^"\r\n\/):]+)"?(?:\/[nrts$uL]*)?\)/,
alias: "string",
inside: {
"punctuation": {
pattern: /(\().+?(?=\))/,
lookbehind: true
}
}
}
],
"multiline-comment": {
pattern: /(^|[^\\])\/\*[\s\S]*?\*\//,
lookbehind: true,
greedy: true,
alias: "comment"
},
"regex": {
pattern: /((?:\bnode\s+|[~=\(\[\{,]\s*|[=+]>\s*|^\s*))\/(?:[^\/\\]|\\[\s\S])+\/(?:[imx]+\b|\B)/,
lookbehind: true,
greedy: true,
inside: {
"extended-regex": {
pattern: /^\/(?:[^\/\\]|\\[\s\S])+\/[im]*x[im]*$/,
inside: {
"comment": /#.*/
}
}
}
},
"comment": {
pattern: /(^|[^\\])#.*/,
lookbehind: true,
greedy: true
},
"string": {
pattern: /(["'])(?:\$\{(?:[^'"}]|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}|\$(?!\{)|(?!\1)[^\\$]|\\[\s\S])*\1/,
greedy: true,
inside: {
"double-quoted": {
pattern: /^"[\s\S]*"$/,
inside: {}
}
}
},
"variable": {
pattern: /\$(?:::)?\w+(?:::\w+)*/,
inside: {
"punctuation": /::/
}
},
"attr-name": /(?:\b\w+|\*)(?=\s*=>)/,
"function": [
{
pattern: /(\.)(?!\d)\w+/,
lookbehind: true
},
/\b(?:contain|debug|err|fail|include|info|notice|realize|require|tag|warning)\b|\b(?!\d)\w+(?=\()/
],
"number": /\b(?:0x[a-f\d]+|\d+(?:\.\d+)?(?:e-?\d+)?)\b/i,
"boolean": /\b(?:false|true)\b/,
"keyword": /\b(?:application|attr|case|class|consumes|default|define|else|elsif|function|if|import|inherits|node|private|produces|type|undef|unless)\b/,
"datatype": {
pattern: /\b(?:Any|Array|Boolean|Callable|Catalogentry|Class|Collection|Data|Default|Enum|Float|Hash|Integer|NotUndef|Numeric|Optional|Pattern|Regexp|Resource|Runtime|Scalar|String|Struct|Tuple|Type|Undef|Variant)\b/,
alias: "symbol"
},
"operator": /=[=~>]?|![=~]?|<(?:<\|?|[=~|-])?|>[>=]?|->?|~>|\|>?>?|[*\/%+?]|\b(?:and|in|or)\b/,
"punctuation": /[\[\]{}().,;]|:+/
};
var interpolation = [
{
pattern: /(^|[^\\])\$\{(?:[^'"{}]|\{[^}]*\}|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}/,
lookbehind: true,
inside: {
"short-variable": {
pattern: /(^\$\{)(?!\w+\()(?:::)?\w+(?:::\w+)*/,
lookbehind: true,
alias: "variable",
inside: {
"punctuation": /::/
}
},
"delimiter": {
pattern: /^\$/,
alias: "variable"
},
rest: Prism2.languages.puppet
}
},
{
pattern: /(^|[^\\])\$(?:::)?\w+(?:::\w+)*/,
lookbehind: true,
alias: "variable",
inside: {
"punctuation": /::/
}
}
];
Prism2.languages.puppet["heredoc"][0].inside.interpolation = interpolation;
Prism2.languages.puppet["string"].inside["double-quoted"].inside.interpolation = interpolation;
})(Prism);
(function(Prism2) {
Prism2.languages.pure = {
"comment": [
{
pattern: /(^|[^\\])\/\*[\s\S]*?\*\//,
lookbehind: true
},
{
pattern: /(^|[^\\:])\/\/.*/,
lookbehind: true
},
/#!.+/
],
"inline-lang": {
pattern: /%<[\s\S]+?%>/,
greedy: true,
inside: {
"lang": {
pattern: /(^%< *)-\*-.+?-\*-/,
lookbehind: true,
alias: "comment"
},
"delimiter": {
pattern: /^%<.*|%>$/,
alias: "punctuation"
}
}
},
"string": {
pattern: /"(?:\\.|[^"\\\r\n])*"/,
greedy: true
},
"number": {
pattern: /((?:\.\.)?)(?:\b(?:inf|nan)\b|\b0x[\da-f]+|(?:\b(?:0b)?\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?L?)/i,
lookbehind: true
},
"keyword": /\b(?:NULL|ans|break|bt|case|catch|cd|clear|const|def|del|dump|else|end|exit|extern|false|force|help|if|infix[lr]?|interface|let|ls|mem|namespace|nonfix|of|otherwise|outfix|override|postfix|prefix|private|public|pwd|quit|run|save|show|stats|then|throw|trace|true|type|underride|using|when|with)\b/,
"function": /\b(?:abs|add_(?:addr|constdef|(?:fundef|interface|macdef|typedef)(?:_at)?|vardef)|all|any|applp?|arity|bigintp?|blob(?:_crc|_size|p)?|boolp?|byte_c?string(?:_pointer)?|byte_(?:matrix|pointer)|calloc|cat|catmap|ceil|char[ps]?|check_ptrtag|chr|clear_sentry|clearsym|closurep?|cmatrixp?|cols?|colcat(?:map)?|colmap|colrev|colvector(?:p|seq)?|complex(?:_float_(?:matrix|pointer)|_matrix(?:_view)?|_pointer|p)?|conj|cookedp?|cst|cstring(?:_(?:dup|list|vector))?|curry3?|cyclen?|del_(?:constdef|fundef|interface|macdef|typedef|vardef)|delete|diag(?:mat)?|dim|dmatrixp?|do|double(?:_matrix(?:_view)?|_pointer|p)?|dowith3?|drop|dropwhile|eval(?:cmd)?|exactp|filter|fix|fixity|flip|float(?:_matrix|_pointer)|floor|fold[lr]1?|frac|free|funp?|functionp?|gcd|get(?:_(?:byte|constdef|double|float|fundef|int(?:64)?|interface(?:_typedef)?|long|macdef|pointer|ptrtag|sentry|short|string|typedef|vardef))?|globsym|hash|head|id|im|imatrixp?|index|inexactp|infp|init|insert|int(?:_matrix(?:_view)?|_pointer|p)?|int64_(?:matrix|pointer)|integerp?|iteraten?|iterwhile|join|keys?|lambdap?|last(?:err(?:pos)?)?|lcd|list[2p]?|listmap|make_ptrtag|malloc|map|matcat|matrixp?|max|member|min|nanp|nargs|nmatrixp?|null|numberp?|ord|pack(?:ed)?|pointer(?:_cast|_tag|_type|p)?|pow|pred|ptrtag|put(?:_(?:byte|double|float|int(?:64)?|long|pointer|short|string))?|rationalp?|re|realp?|realloc|recordp?|redim|reduce(?:_with)?|refp?|repeatn?|reverse|rlistp?|round|rows?|rowcat(?:map)?|rowmap|rowrev|rowvector(?:p|seq)?|same|scan[lr]1?|sentry|sgn|short_(?:matrix|pointer)|slice|smatrixp?|sort|split|str|strcat|stream|stride|string(?:_(?:dup|list|vector)|p)?|subdiag(?:mat)?|submat|subseq2?|substr|succ|supdiag(?:mat)?|symbolp?|tail|take|takewhile|thunkp?|transpose|trunc|tuplep?|typep|ubyte|uint(?:64)?|ulong|uncurry3?|unref|unzip3?|update|ushort|vals?|varp?|vector(?:p|seq)?|void|zip3?|zipwith3?)\b/,
"special": {
pattern: /\b__[a-z]+__\b/i,
alias: "builtin"
},
"operator": /(?:[!"#$%&'*+,\-.\/:<=>?@\\^`|~\u00a1-\u00bf\u00d7-\u00f7\u20d0-\u2bff]|\b_+\b)+|\b(?:and|div|mod|not|or)\b/,
"punctuation": /[(){}\[\];,|]/
};
var inlineLanguages = [
"c",
{ lang: "c++", alias: "cpp" },
"fortran"
];
var inlineLanguageRe = /%< *-\*- *<lang>\d* *-\*-[\s\S]+?%>/.source;
inlineLanguages.forEach(function(lang) {
var alias = lang;
if (typeof lang !== "string") {
alias = lang.alias;
lang = lang.lang;
}
if (Prism2.languages[alias]) {
var o = {};
o["inline-lang-" + alias] = {
pattern: RegExp(inlineLanguageRe.replace("<lang>", lang.replace(/([.+*?\/\\(){}\[\]])/g, "\\$1")), "i"),
inside: Prism2.util.clone(Prism2.languages.pure["inline-lang"].inside)
};
o["inline-lang-" + alias].inside.rest = Prism2.util.clone(Prism2.languages[alias]);
Prism2.languages.insertBefore("pure", "inline-lang", o);
}
});
if (Prism2.languages.c) {
Prism2.languages.pure["inline-lang"].inside.rest = Prism2.util.clone(Prism2.languages.c);
}
})(Prism);
Prism.languages.purebasic = Prism.languages.extend("clike", {
"comment": /;.*/,
"keyword": /\b(?:align|and|as|break|calldebugger|case|compilercase|compilerdefault|compilerelse|compilerelseif|compilerendif|compilerendselect|compilererror|compilerif|compilerselect|continue|data|datasection|debug|debuglevel|declare|declarec|declarecdll|declaredll|declaremodule|default|define|dim|disableasm|disabledebugger|disableexplicit|else|elseif|enableasm|enabledebugger|enableexplicit|end|enddatasection|enddeclaremodule|endenumeration|endif|endimport|endinterface|endmacro|endmodule|endprocedure|endselect|endstructure|endstructureunion|endwith|enumeration|extends|fakereturn|for|foreach|forever|global|gosub|goto|if|import|importc|includebinary|includefile|includepath|interface|macro|module|newlist|newmap|next|not|or|procedure|procedurec|procedurecdll|proceduredll|procedurereturn|protected|prototype|prototypec|read|redim|repeat|restore|return|runtime|select|shared|static|step|structure|structureunion|swap|threaded|to|until|wend|while|with|xincludefile|xor)\b/i,
"function": /\b\w+(?:\.\w+)?\s*(?=\()/,
"number": /(?:\$[\da-f]+|\b-?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)\b/i,
"operator": /(?:@\*?|\?|\*)\w+\$?|-[>-]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|?\||[~^%?*/@]/
});
Prism.languages.insertBefore("purebasic", "keyword", {
"tag": /#\w+\$?/,
"asm": {
pattern: /(^[\t ]*)!.*/m,
lookbehind: true,
alias: "tag",
inside: {
"comment": /;.*/,
"string": {
pattern: /(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"label-reference-anonymous": {
pattern: /(!\s*j[a-z]+\s+)@[fb]/i,
lookbehind: true,
alias: "fasm-label"
},
"label-reference-addressed": {
pattern: /(!\s*j[a-z]+\s+)[A-Z._?$@][\w.?$@~#]*/i,
lookbehind: true,
alias: "fasm-label"
},
"keyword": [
/\b(?:extern|global)\b[^;\r\n]*/i,
/\b(?:CPU|DEFAULT|FLOAT)\b.*/
],
"function": {
pattern: /^([\t ]*!\s*)[\da-z]+(?=\s|$)/im,
lookbehind: true
},
"function-inline": {
pattern: /(:\s*)[\da-z]+(?=\s)/i,
lookbehind: true,
alias: "function"
},
"label": {
pattern: /^([\t ]*!\s*)[A-Za-z._?$@][\w.?$@~#]*(?=:)/m,
lookbehind: true,
alias: "fasm-label"
},
"register": /\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|di|si|sp)|[cdefgs]s|mm\d+)\b/i,
"number": /(?:\b|-|(?=\$))(?:0[hx](?:[\da-f]*\.)?[\da-f]+(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|(?:\d+(?:\.\d+)?|\.\d+)(?:\.?e[+-]?\d+)?[dt]?)\b/i,
"operator": /[\[\]*+\-/%<>=&|$!,.:]/
}
}
});
delete Prism.languages.purebasic["class-name"];
delete Prism.languages.purebasic["boolean"];
Prism.languages.pbfasm = Prism.languages["purebasic"];
Prism.languages.purescript = Prism.languages.extend("haskell", {
"keyword": /\b(?:ado|case|class|data|derive|do|else|forall|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b|∀/,
"import-statement": {
pattern: /(^[\t ]*)import\s+[A-Z][\w']*(?:\.[A-Z][\w']*)*(?:\s+as\s+[A-Z][\w']*(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,
lookbehind: true,
inside: {
"keyword": /\b(?:as|hiding|import)\b/,
"punctuation": /\./
}
},
"builtin": /\b(?:absurd|add|ap|append|apply|between|bind|bottom|clamp|compare|comparing|compose|conj|const|degree|discard|disj|div|eq|flap|flip|gcd|identity|ifM|join|lcm|liftA1|liftM1|map|max|mempty|min|mod|mul|negate|not|notEq|one|otherwise|recip|show|sub|top|unit|unless|unlessM|void|when|whenM|zero)\b/,
"operator": [
Prism.languages.haskell.operator[0],
Prism.languages.haskell.operator[2],
/[\xa2-\xa6\xa8\xa9\xac\xae-\xb1\xb4\xb8\xd7\xf7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u07fe\u07ff\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u166d\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20bf\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b97-\u2bff\u2ce5-\u2cea\u2e50\u2e51\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\uab6a\uab6b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd]/
]
});
Prism.languages.purs = Prism.languages.purescript;
Prism.languages.python = {
"comment": {
pattern: /(^|[^\\])#.*/,
lookbehind: true,
greedy: true
},
"string-interpolation": {
pattern: /(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,
greedy: true,
inside: {
"interpolation": {
pattern: /((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,
lookbehind: true,
inside: {
"format-spec": {
pattern: /(:)[^:(){}]+(?=\}$)/,
lookbehind: true
},
"conversion-option": {
pattern: /![sra](?=[:}]$)/,
alias: "punctuation"
},
rest: null
}
},
"string": /[\s\S]+/
}
},
"triple-quoted-string": {
pattern: /(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,
greedy: true,
alias: "string"
},
"string": {
pattern: /(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,
greedy: true
},
"function": {
pattern: /((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,
lookbehind: true
},
"class-name": {
pattern: /(\bclass\s+)\w+/i,
lookbehind: true
},
"decorator": {
pattern: /(^[\t ]*)@\w+(?:\.\w+)*/m,
lookbehind: true,
alias: ["annotation", "punctuation"],
inside: {
"punctuation": /\./
}
},
"keyword": /\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,
"builtin": /\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,
"boolean": /\b(?:False|None|True)\b/,
"number": /\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,
"operator": /[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,
"punctuation": /[{}[\];(),.:]/
};
Prism.languages.python["string-interpolation"].inside["interpolation"].inside.rest = Prism.languages.python;
Prism.languages.py = Prism.languages.python;
(function(Prism2) {
function replace(pattern, replacements) {
return pattern.replace(/<<(\d+)>>/g, function(m, index) {
return "(?:" + replacements[+index] + ")";
});
}
function re(pattern, replacements, flags) {
return RegExp(replace(pattern, replacements), flags || "");
}
function nested(pattern, depthLog2) {
for (var i = 0; i < depthLog2; i++) {
pattern = pattern.replace(/<<self>>/g, function() {
return "(?:" + pattern + ")";
});
}
return pattern.replace(/<<self>>/g, "[^\\s\\S]");
}
var keywordKinds = {
type: "Adj BigInt Bool Ctl Double false Int One Pauli PauliI PauliX PauliY PauliZ Qubit Range Result String true Unit Zero",
other: "Adjoint adjoint apply as auto body borrow borrowing Controlled controlled distribute elif else fail fixup for function if in internal intrinsic invert is let mutable namespace new newtype open operation repeat return self set until use using while within"
};
function keywordsToPattern(words) {
return "\\b(?:" + words.trim().replace(/ /g, "|") + ")\\b";
}
var keywords = RegExp(keywordsToPattern(keywordKinds.type + " " + keywordKinds.other));
var identifier = /\b[A-Za-z_]\w*\b/.source;
var qualifiedName = replace(/<<0>>(?:\s*\.\s*<<0>>)*/.source, [identifier]);
var typeInside = {
"keyword": keywords,
"punctuation": /[<>()?,.:[\]]/
};
var regularString = /"(?:\\.|[^\\"])*"/.source;
Prism2.languages.qsharp = Prism2.languages.extend("clike", {
"comment": /\/\/.*/,
"string": [
{
pattern: re(/(^|[^$\\])<<0>>/.source, [regularString]),
lookbehind: true,
greedy: true
}
],
"class-name": [
{
pattern: re(/(\b(?:as|open)\s+)<<0>>(?=\s*(?:;|as\b))/.source, [qualifiedName]),
lookbehind: true,
inside: typeInside
},
{
pattern: re(/(\bnamespace\s+)<<0>>(?=\s*\{)/.source, [qualifiedName]),
lookbehind: true,
inside: typeInside
}
],
"keyword": keywords,
"number": /(?:\b0(?:x[\da-f]+|b[01]+|o[0-7]+)|(?:\B\.\d+|\b\d+(?:\.\d*)?)(?:e[-+]?\d+)?)l?\b/i,
"operator": /\band=|\bor=|\band\b|\bnot\b|\bor\b|<[-=]|[-=]>|>>>=?|<<<=?|\^\^\^=?|\|\|\|=?|&&&=?|w\/=?|~~~|[*\/+\-^=!%]=?/,
"punctuation": /::|[{}[\];(),.:]/
});
Prism2.languages.insertBefore("qsharp", "number", {
"range": {
pattern: /\.\./,
alias: "operator"
}
});
var interpolationExpr = nested(replace(/\{(?:[^"{}]|<<0>>|<<self>>)*\}/.source, [regularString]), 2);
Prism2.languages.insertBefore("qsharp", "string", {
"interpolation-string": {
pattern: re(/\$"(?:\\.|<<0>>|[^\\"{])*"/.source, [interpolationExpr]),
greedy: true,
inside: {
"interpolation": {
pattern: re(/((?:^|[^\\])(?:\\\\)*)<<0>>/.source, [interpolationExpr]),
lookbehind: true,
inside: {
"punctuation": /^\{|\}$/,
"expression": {
pattern: /[\s\S]+/,
alias: "language-qsharp",
inside: Prism2.languages.qsharp
}
}
},
"string": /[\s\S]+/
}
}
});
})(Prism);
Prism.languages.qs = Prism.languages.qsharp;
Prism.languages.q = {
"string": /"(?:\\.|[^"\\\r\n])*"/,
"comment": [
{
pattern: /([\t )\]}])\/.*/,
lookbehind: true,
greedy: true
},
{
pattern: /(^|\r?\n|\r)\/[\t ]*(?:(?:\r?\n|\r)(?:.*(?:\r?\n|\r(?!\n)))*?(?:\\(?=[\t ]*(?:\r?\n|\r))|$)|\S.*)/,
lookbehind: true,
greedy: true
},
{
pattern: /^\\[\t ]*(?:\r?\n|\r)[\s\S]+/m,
greedy: true
},
{
pattern: /^#!.+/m,
greedy: true
}
],
"symbol": /`(?::\S+|[\w.]*)/,
"datetime": {
pattern: /0N[mdzuvt]|0W[dtz]|\d{4}\.\d\d(?:m|\.\d\d(?:T(?:\d\d(?::\d\d(?::\d\d(?:[.:]\d\d\d)?)?)?)?)?[dz]?)|\d\d:\d\d(?::\d\d(?:[.:]\d\d\d)?)?[uvt]?/,
alias: "number"
},
"number": /\b(?![01]:)(?:0N[hje]?|0W[hj]?|0[wn]|0x[\da-fA-F]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?[hjfeb]?)/,
"keyword": /\\\w+\b|\b(?:abs|acos|aj0?|all|and|any|asc|asin|asof|atan|attr|avgs?|binr?|by|ceiling|cols|cor|cos|count|cov|cross|csv|cut|delete|deltas|desc|dev|differ|distinct|div|do|dsave|ej|enlist|eval|except|exec|exit|exp|fby|fills|first|fkeys|flip|floor|from|get|getenv|group|gtime|hclose|hcount|hdel|hopen|hsym|iasc|identity|idesc|if|ij|in|insert|inter|inv|keys?|last|like|list|ljf?|load|log|lower|lsq|ltime|ltrim|mavg|maxs?|mcount|md5|mdev|med|meta|mins?|mmax|mmin|mmu|mod|msum|neg|next|not|null|or|over|parse|peach|pj|plist|prds?|prev|prior|rand|rank|ratios|raze|read0|read1|reciprocal|reval|reverse|rload|rotate|rsave|rtrim|save|scan|scov|sdev|select|set|setenv|show|signum|sin|sqrt|ssr?|string|sublist|sums?|sv|svar|system|tables|tan|til|trim|txf|type|uj|ungroup|union|update|upper|upsert|value|var|views?|vs|wavg|where|while|within|wj1?|wsum|ww|xasc|xbar|xcols?|xdesc|xexp|xgroup|xkey|xlog|xprev|xrank)\b/,
"adverb": {
pattern: /['\/\\]:?|\beach\b/,
alias: "function"
},
"verb": {
pattern: /(?:\B\.\B|\b[01]:|<[=>]?|>=?|[:+\-*%,!?~=|$&#@^]):?|\b_\b:?/,
alias: "operator"
},
"punctuation": /[(){}\[\];.]/
};
(function(Prism2) {
var jsString = /"(?:\\.|[^\\"\r\n])*"|'(?:\\.|[^\\'\r\n])*'/.source;
var jsComment = /\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))*\*\//.source;
var jsExpr = /(?:[^\\()[\]{}"'/]|<string>|\/(?![*/])|<comment>|\(<expr>*\)|\[<expr>*\]|\{<expr>*\}|\\[\s\S])/.source.replace(/<string>/g, function() {
return jsString;
}).replace(/<comment>/g, function() {
return jsComment;
});
for (var i = 0; i < 2; i++) {
jsExpr = jsExpr.replace(/<expr>/g, function() {
return jsExpr;
});
}
jsExpr = jsExpr.replace(/<expr>/g, "[^\\s\\S]");
Prism2.languages.qml = {
"comment": {
pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
greedy: true
},
"javascript-function": {
pattern: RegExp(/((?:^|;)[ \t]*)function\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*\(<js>*\)\s*\{<js>*\}/.source.replace(/<js>/g, function() {
return jsExpr;
}), "m"),
lookbehind: true,
greedy: true,
alias: "language-javascript",
inside: Prism2.languages.javascript
},
"class-name": {
pattern: /((?:^|[:;])[ \t]*)(?!\d)\w+(?=[ \t]*\{|[ \t]+on\b)/m,
lookbehind: true
},
"property": [
{
pattern: /((?:^|[;{])[ \t]*)(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,
lookbehind: true
},
{
pattern: /((?:^|[;{])[ \t]*)property[ \t]+(?!\d)\w+(?:\.\w+)*[ \t]+(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,
lookbehind: true,
inside: {
"keyword": /^property/,
"property": /\w+(?:\.\w+)*/
}
}
],
"javascript-expression": {
pattern: RegExp(/(:[ \t]*)(?![\s;}[])(?:(?!$|[;}])<js>)+/.source.replace(/<js>/g, function() {
return jsExpr;
}), "m"),
lookbehind: true,
greedy: true,
alias: "language-javascript",
inside: Prism2.languages.javascript
},
"string": {
pattern: /"(?:\\.|[^\\"\r\n])*"/,
greedy: true
},
"keyword": /\b(?:as|import|on)\b/,
"punctuation": /[{}[\]:;,]/
};
})(Prism);
Prism.languages.qore = Prism.languages.extend("clike", {
"comment": {
pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:\/\/|#).*)/,
lookbehind: true
},
"string": {
pattern: /("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,
greedy: true
},
"keyword": /\b(?:abstract|any|assert|binary|bool|boolean|break|byte|case|catch|char|class|code|const|continue|data|default|do|double|else|enum|extends|final|finally|float|for|goto|hash|if|implements|import|inherits|instanceof|int|interface|long|my|native|new|nothing|null|object|our|own|private|reference|rethrow|return|short|soft(?:bool|date|float|int|list|number|string)|static|strictfp|string|sub|super|switch|synchronized|this|throw|throws|transient|try|void|volatile|while)\b/,
"boolean": /\b(?:false|true)\b/i,
"function": /\$?\b(?!\d)\w+(?=\()/,
"number": /\b(?:0b[01]+|0x(?:[\da-f]*\.)?[\da-fp\-]+|(?:\d+(?:\.\d+)?|\.\d+)(?:e\d+)?[df]|(?:\d+(?:\.\d+)?|\.\d+))\b/i,
"operator": {
pattern: /(^|[^.])(?:\+[+=]?|-[-=]?|[!=](?:==?|~)?|>>?=?|<(?:=>?|<=?)?|&[&=]?|\|[|=]?|[*\/%^]=?|[~?])/,
lookbehind: true
},
"variable": /\$(?!\d)\w+\b/
});
Prism.languages.r = {
"comment": /#.*/,
"string": {
pattern: /(['"])(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"percent-operator": {
pattern: /%[^%\s]*%/,
alias: "operator"
},
"boolean": /\b(?:FALSE|TRUE)\b/,
"ellipsis": /\.\.(?:\.|\d+)/,
"number": [
/\b(?:Inf|NaN)\b/,
/(?:\b0x[\dA-Fa-f]+(?:\.\d*)?|\b\d+(?:\.\d*)?|\B\.\d+)(?:[EePp][+-]?\d+)?[iL]?/
],
"keyword": /\b(?:NA|NA_character_|NA_complex_|NA_integer_|NA_real_|NULL|break|else|for|function|if|in|next|repeat|while)\b/,
"operator": /->?>?|<(?:=|<?-)?|[>=!]=?|::?|&&?|\|\|?|[+*\/^$@~]/,
"punctuation": /[(){}\[\],;]/
};
Prism.languages.racket = Prism.languages.extend("scheme", {
"lambda-parameter": {
pattern: /([(\[]lambda\s+[(\[])[^()\[\]'\s]+/,
lookbehind: true
}
});
Prism.languages.insertBefore("racket", "string", {
"lang": {
pattern: /^#lang.+/m,
greedy: true,
alias: "keyword"
}
});
Prism.languages.rkt = Prism.languages.racket;
(function(Prism2) {
var commentLike = /\/(?![/*])|\/\/.*[\r\n]|\/\*[^*]*(?:\*(?!\/)[^*]*)*\*\//.source;
var stringLike = /@(?!")|"(?:[^\r\n\\"]|\\.)*"|@"(?:[^\\"]|""|\\[\s\S])*"(?!")/.source + "|" + /'(?:(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'|(?=[^\\](?!')))/.source;
function nested(pattern, depthLog2) {
for (var i = 0; i < depthLog2; i++) {
pattern = pattern.replace(/<self>/g, function() {
return "(?:" + pattern + ")";
});
}
return pattern.replace(/<self>/g, "[^\\s\\S]").replace(/<str>/g, "(?:" + stringLike + ")").replace(/<comment>/g, "(?:" + commentLike + ")");
}
var round2 = nested(/\((?:[^()'"@/]|<str>|<comment>|<self>)*\)/.source, 2);
var square = nested(/\[(?:[^\[\]'"@/]|<str>|<comment>|<self>)*\]/.source, 1);
var curly = nested(/\{(?:[^{}'"@/]|<str>|<comment>|<self>)*\}/.source, 2);
var angle = nested(/<(?:[^<>'"@/]|<comment>|<self>)*>/.source, 1);
var inlineCs = /@/.source + /(?:await\b\s*)?/.source + "(?:" + /(?!await\b)\w+\b/.source + "|" + round2 + ")(?:" + /[?!]?\.\w+\b/.source + "|(?:" + angle + ")?" + round2 + "|" + square + ")*" + /(?![?!\.(\[]|<(?!\/))/.source;
var tagAttrInlineCs = /@(?![\w()])/.source + "|" + inlineCs;
var tagAttrValue = "(?:" + /"[^"@]*"|'[^'@]*'|[^\s'"@>=]+(?=[\s>])/.source + `|["'][^"'@]*(?:(?:` + tagAttrInlineCs + `)[^"'@]*)+["'])`;
var tagAttrs = /(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*<tagAttrValue>|(?=[\s/>])))+)?/.source.replace(/<tagAttrValue>/, tagAttrValue);
var tagContent = /(?!\d)[^\s>\/=$<%]+/.source + tagAttrs + /\s*\/?>/.source;
var tagRegion = /\B@?/.source + "(?:" + /<([a-zA-Z][\w:]*)/.source + tagAttrs + /\s*>/.source + "(?:" + (/[^<]/.source + "|" + /<\/?(?!\1\b)/.source + tagContent + "|" + nested(/<\1/.source + tagAttrs + /\s*>/.source + "(?:" + (/[^<]/.source + "|" + /<\/?(?!\1\b)/.source + tagContent + "|<self>") + ")*" + /<\/\1\s*>/.source, 2)) + ")*" + /<\/\1\s*>/.source + "|" + /</.source + tagContent + ")";
Prism2.languages.cshtml = Prism2.languages.extend("markup", {});
var csharpWithHtml = Prism2.languages.insertBefore("csharp", "string", {
"html": {
pattern: RegExp(tagRegion),
greedy: true,
inside: Prism2.languages.cshtml
}
}, { csharp: Prism2.languages.extend("csharp", {}) });
var cs = {
pattern: /\S[\s\S]*/,
alias: "language-csharp",
inside: csharpWithHtml
};
var inlineValue = {
pattern: RegExp(/(^|[^@])/.source + inlineCs),
lookbehind: true,
greedy: true,
alias: "variable",
inside: {
"keyword": /^@/,
"csharp": cs
}
};
Prism2.languages.cshtml.tag.pattern = RegExp(/<\/?/.source + tagContent);
Prism2.languages.cshtml.tag.inside["attr-value"].pattern = RegExp(/=\s*/.source + tagAttrValue);
Prism2.languages.insertBefore("inside", "punctuation", { "value": inlineValue }, Prism2.languages.cshtml.tag.inside["attr-value"]);
Prism2.languages.insertBefore("cshtml", "prolog", {
"razor-comment": {
pattern: /@\*[\s\S]*?\*@/,
greedy: true,
alias: "comment"
},
"block": {
pattern: RegExp(/(^|[^@])@/.source + "(?:" + [
curly,
/(?:code|functions)\s*/.source + curly,
/(?:for|foreach|lock|switch|using|while)\s*/.source + round2 + /\s*/.source + curly,
/do\s*/.source + curly + /\s*while\s*/.source + round2 + /(?:\s*;)?/.source,
/try\s*/.source + curly + /\s*catch\s*/.source + round2 + /\s*/.source + curly + /\s*finally\s*/.source + curly,
/if\s*/.source + round2 + /\s*/.source + curly + "(?:" + /\s*else/.source + "(?:" + /\s+if\s*/.source + round2 + ")?" + /\s*/.source + curly + ")*",
/helper\s+\w+\s*/.source + round2 + /\s*/.source + curly
].join("|") + ")"),
lookbehind: true,
greedy: true,
inside: {
"keyword": /^@\w*/,
"csharp": cs
}
},
"directive": {
pattern: /^([ \t]*)@(?:addTagHelper|attribute|implements|inherits|inject|layout|model|namespace|page|preservewhitespace|removeTagHelper|section|tagHelperPrefix|using)(?=\s).*/m,
lookbehind: true,
greedy: true,
inside: {
"keyword": /^@\w+/,
"csharp": cs
}
},
"value": inlineValue,
"delegate-operator": {
pattern: /(^|[^@])@(?=<)/,
lookbehind: true,
alias: "operator"
}
});
Prism2.languages.razor = Prism2.languages.cshtml;
})(Prism);
(function(Prism2) {
var javascript = Prism2.util.clone(Prism2.languages.javascript);
var space = /(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source;
var braces = /(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source;
var spread = /(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;
function re(source, flags) {
source = source.replace(/<S>/g, function() {
return space;
}).replace(/<BRACES>/g, function() {
return braces;
}).replace(/<SPREAD>/g, function() {
return spread;
});
return RegExp(source, flags);
}
spread = re(spread).source;
Prism2.languages.jsx = Prism2.languages.extend("markup", javascript);
Prism2.languages.jsx.tag.pattern = re(/<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/.source);
Prism2.languages.jsx.tag.inside["tag"].pattern = /^<\/?[^\s>\/]*/;
Prism2.languages.jsx.tag.inside["attr-value"].pattern = /=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/;
Prism2.languages.jsx.tag.inside["tag"].inside["class-name"] = /^[A-Z]\w*(?:\.[A-Z]\w*)*$/;
Prism2.languages.jsx.tag.inside["comment"] = javascript["comment"];
Prism2.languages.insertBefore("inside", "attr-name", {
"spread": {
pattern: re(/<SPREAD>/.source),
inside: Prism2.languages.jsx
}
}, Prism2.languages.jsx.tag);
Prism2.languages.insertBefore("inside", "special-attr", {
"script": {
pattern: re(/=<BRACES>/.source),
alias: "language-javascript",
inside: {
"script-punctuation": {
pattern: /^=(?=\{)/,
alias: "punctuation"
},
rest: Prism2.languages.jsx
}
}
}, Prism2.languages.jsx.tag);
var stringifyToken = function(token) {
if (!token) {
return "";
}
if (typeof token === "string") {
return token;
}
if (typeof token.content === "string") {
return token.content;
}
return token.content.map(stringifyToken).join("");
};
var walkTokens = function(tokens) {
var openedTags = [];
for (var i = 0; i < tokens.length; i++) {
var token = tokens[i];
var notTagNorBrace = false;
if (typeof token !== "string") {
if (token.type === "tag" && token.content[0] && token.content[0].type === "tag") {
if (token.content[0].content[0].content === "</") {
if (openedTags.length > 0 && openedTags[openedTags.length - 1].tagName === stringifyToken(token.content[0].content[1])) {
openedTags.pop();
}
} else {
if (token.content[token.content.length - 1].content === "/>") {
} else {
openedTags.push({
tagName: stringifyToken(token.content[0].content[1]),
openedBraces: 0
});
}
}
} else if (openedTags.length > 0 && token.type === "punctuation" && token.content === "{") {
openedTags[openedTags.length - 1].openedBraces++;
} else if (openedTags.length > 0 && openedTags[openedTags.length - 1].openedBraces > 0 && token.type === "punctuation" && token.content === "}") {
openedTags[openedTags.length - 1].openedBraces--;
} else {
notTagNorBrace = true;
}
}
if (notTagNorBrace || typeof token === "string") {
if (openedTags.length > 0 && openedTags[openedTags.length - 1].openedBraces === 0) {
var plainText = stringifyToken(token);
if (i < tokens.length - 1 && (typeof tokens[i + 1] === "string" || tokens[i + 1].type === "plain-text")) {
plainText += stringifyToken(tokens[i + 1]);
tokens.splice(i + 1, 1);
}
if (i > 0 && (typeof tokens[i - 1] === "string" || tokens[i - 1].type === "plain-text")) {
plainText = stringifyToken(tokens[i - 1]) + plainText;
tokens.splice(i - 1, 1);
i--;
}
tokens[i] = new Prism2.Token("plain-text", plainText, null, plainText);
}
}
if (token.content && typeof token.content !== "string") {
walkTokens(token.content);
}
}
};
Prism2.hooks.add("after-tokenize", function(env) {
if (env.language !== "jsx" && env.language !== "tsx") {
return;
}
walkTokens(env.tokens);
});
})(Prism);
(function(Prism2) {
var typescript = Prism2.util.clone(Prism2.languages.typescript);
Prism2.languages.tsx = Prism2.languages.extend("jsx", typescript);
delete Prism2.languages.tsx["parameter"];
delete Prism2.languages.tsx["literal-property"];
var tag = Prism2.languages.tsx.tag;
tag.pattern = RegExp(/(^|[^\w$]|(?=<\/))/.source + "(?:" + tag.pattern.source + ")", tag.pattern.flags);
tag.lookbehind = true;
})(Prism);
Prism.languages.reason = Prism.languages.extend("clike", {
"string": {
pattern: /"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,
greedy: true
},
"class-name": /\b[A-Z]\w*/,
"keyword": /\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,
"operator": /\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/
});
Prism.languages.insertBefore("reason", "class-name", {
"char": {
pattern: /'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,
greedy: true
},
"constructor": /\b[A-Z]\w*\b(?!\s*\.)/,
"label": {
pattern: /\b[a-z]\w*(?=::)/,
alias: "symbol"
}
});
delete Prism.languages.reason.function;
(function(Prism2) {
var specialEscape = {
pattern: /\\[\\(){}[\]^$+*?|.]/,
alias: "escape"
};
var escape = /\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/;
var charSet = {
pattern: /\.|\\[wsd]|\\p\{[^{}]+\}/i,
alias: "class-name"
};
var charSetWithoutDot = {
pattern: /\\[wsd]|\\p\{[^{}]+\}/i,
alias: "class-name"
};
var rangeChar = "(?:[^\\\\-]|" + escape.source + ")";
var range2 = RegExp(rangeChar + "-" + rangeChar);
var groupName = {
pattern: /(<|')[^<>']+(?=[>']$)/,
lookbehind: true,
alias: "variable"
};
Prism2.languages.regex = {
"char-class": {
pattern: /((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,
lookbehind: true,
inside: {
"char-class-negation": {
pattern: /(^\[)\^/,
lookbehind: true,
alias: "operator"
},
"char-class-punctuation": {
pattern: /^\[|\]$/,
alias: "punctuation"
},
"range": {
pattern: range2,
inside: {
"escape": escape,
"range-punctuation": {
pattern: /-/,
alias: "operator"
}
}
},
"special-escape": specialEscape,
"char-set": charSetWithoutDot,
"escape": escape
}
},
"special-escape": specialEscape,
"char-set": charSet,
"backreference": [
{
pattern: /\\(?![123][0-7]{2})[1-9]/,
alias: "keyword"
},
{
pattern: /\\k<[^<>']+>/,
alias: "keyword",
inside: {
"group-name": groupName
}
}
],
"anchor": {
pattern: /[$^]|\\[ABbGZz]/,
alias: "function"
},
"escape": escape,
"group": [
{
pattern: /\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|<?[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,
alias: "punctuation",
inside: {
"group-name": groupName
}
},
{
pattern: /\)/,
alias: "punctuation"
}
],
"quantifier": {
pattern: /(?:[+*?]|\{\d+(?:,\d*)?\})[?+]?/,
alias: "number"
},
"alternation": {
pattern: /\|/,
alias: "keyword"
}
};
})(Prism);
Prism.languages.rego = {
"comment": /#.*/,
"property": {
pattern: /(^|[^\\.])(?:"(?:\\.|[^\\"\r\n])*"|`[^`]*`|\b[a-z_]\w*\b)(?=\s*:(?!=))/i,
lookbehind: true,
greedy: true
},
"string": {
pattern: /(^|[^\\])"(?:\\.|[^\\"\r\n])*"|`[^`]*`/,
lookbehind: true,
greedy: true
},
"keyword": /\b(?:as|default|else|import|not|null|package|set(?=\s*\()|some|with)\b/,
"boolean": /\b(?:false|true)\b/,
"function": {
pattern: /\b[a-z_]\w*\b(?:\s*\.\s*\b[a-z_]\w*\b)*(?=\s*\()/i,
inside: {
"namespace": /\b\w+\b(?=\s*\.)/,
"punctuation": /\./
}
},
"number": /-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,
"operator": /[-+*/%|&]|[<>:=]=?|!=|\b_\b/,
"punctuation": /[,;.\[\]{}()]/
};
Prism.languages.renpy = {
"comment": {
pattern: /(^|[^\\])#.+/,
lookbehind: true
},
"string": {
pattern: /("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\])*\2|(?:^#?(?:(?:[0-9a-fA-F]){3}|[0-9a-fA-F]{6})$)/m,
greedy: true
},
"function": /\b[a-z_]\w*(?=\()/i,
"property": /\b(?:Update|UpdateVersion|action|activate_sound|adv_nvl_transition|after_load_transition|align|alpha|alt|anchor|antialias|area|auto|background|bar_invert|bar_resizing|bar_vertical|black_color|bold|bottom_bar|bottom_gutter|bottom_margin|bottom_padding|box_reverse|box_wrap|can_update|caret|child|color|crop|default_afm_enable|default_afm_time|default_fullscreen|default_text_cps|developer|directory_name|drag_handle|drag_joined|drag_name|drag_raise|draggable|dragged|drop_shadow|drop_shadow_color|droppable|dropped|easein|easeout|edgescroll|end_game_transition|end_splash_transition|enter_replay_transition|enter_sound|enter_transition|enter_yesno_transition|executable_name|exit_replay_transition|exit_sound|exit_transition|exit_yesno_transition|fadein|fadeout|first_indent|first_spacing|fit_first|focus|focus_mask|font|foreground|game_main_transition|get_installed_packages|google_play_key|google_play_salt|ground|has_music|has_sound|has_voice|height|help|hinting|hover|hover_background|hover_color|hover_sound|hovered|hyperlink_functions|idle|idle_color|image_style|include_update|insensitive|insensitive_background|insensitive_color|inside|intra_transition|italic|justify|kerning|keyboard_focus|language|layer_clipping|layers|layout|left_bar|left_gutter|left_margin|left_padding|length|line_leading|line_overlap_split|line_spacing|linear|main_game_transition|main_menu_music|maximum|min_width|minimum|minwidth|modal|mouse|mousewheel|name|narrator_menu|newline_indent|nvl_adv_transition|offset|order_reverse|outlines|overlay_functions|pos|position|prefix|radius|range|rest_indent|right_bar|right_gutter|right_margin|right_padding|rotate|rotate_pad|ruby_style|sample_sound|save_directory|say_attribute_transition|screen_height|screen_width|scrollbars|selected_hover|selected_hover_color|selected_idle|selected_idle_color|selected_insensitive|show_side_image|show_two_window|side_spacing|side_xpos|side_ypos|size|size_group|slow_cps|slow_cps_multiplier|spacing|strikethrough|subpixel|text_align|text_style|text_xpos|text_y_fudge|text_ypos|thumb|thumb_offset|thumb_shadow|thumbnail_height|thumbnail_width|time|top_bar|top_gutter|top_margin|top_padding|translations|underline|unscrollable|update|value|version|version_name|version_tuple|vertical|width|window_hide_transition|window_icon|window_left_padding|window_show_transition|window_title|windows_icon|xadjustment|xalign|xanchor|xanchoraround|xaround|xcenter|xfill|xinitial|xmargin|xmaximum|xminimum|xoffset|xofsset|xpadding|xpos|xsize|xzoom|yadjustment|yalign|yanchor|yanchoraround|yaround|ycenter|yfill|yinitial|ymargin|ymaximum|yminimum|yoffset|ypadding|ypos|ysize|ysizexysize|yzoom|zoom|zorder)\b/,
"tag": /\b(?:bar|block|button|buttoscreenn|drag|draggroup|fixed|frame|grid|[hv]box|hotbar|hotspot|image|imagebutton|imagemap|input|key|label|menu|mm_menu_frame|mousearea|nvl|parallel|screen|self|side|tag|text|textbutton|timer|vbar|viewport|window)\b|\$/,
"keyword": /\b(?:None|add|adjustment|alignaround|allow|angle|animation|around|as|assert|behind|box_layout|break|build|cache|call|center|changed|child_size|choice|circles|class|clear|clicked|clipping|clockwise|config|contains|continue|corner1|corner2|counterclockwise|def|default|define|del|delay|disabled|disabled_text|dissolve|elif|else|event|except|exclude|exec|expression|fade|finally|for|from|function|global|gm_root|has|hide|id|if|import|in|init|is|jump|knot|lambda|left|less_rounded|mm_root|movie|music|null|on|onlayer|pass|pause|persistent|play|print|python|queue|raise|random|renpy|repeat|return|right|rounded_window|scene|scope|set|show|slow|slow_abortable|slow_done|sound|stop|store|style|style_group|substitute|suffix|theme|transform|transform_anchor|transpose|try|ui|unhovered|updater|use|voice|while|widget|widget_hover|widget_selected|widget_text|yield)\b/,
"boolean": /\b(?:[Ff]alse|[Tt]rue)\b/,
"number": /(?:\b(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?)|\B\.\d+)(?:e[+-]?\d+)?j?/i,
"operator": /[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:and|at|not|or|with)\b/,
"punctuation": /[{}[\];(),.:]/
};
Prism.languages.rpy = Prism.languages.renpy;
Prism.languages.rescript = {
"comment": {
pattern: /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,
greedy: true
},
"char": { pattern: /'(?:[^\r\n\\]|\\(?:.|\w+))'/, greedy: true },
"string": {
pattern: /"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,
greedy: true
},
"class-name": /\b[A-Z]\w*|@[a-z.]*|#[A-Za-z]\w*|#\d/,
"function": {
pattern: /[a-zA-Z]\w*(?=\()|(\.)[a-z]\w*/,
lookbehind: true
},
"number": /(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,
"boolean": /\b(?:false|true)\b/,
"attr-value": /[A-Za-z]\w*(?==)/,
"constant": {
pattern: /(\btype\s+)[a-z]\w*/,
lookbehind: true
},
"tag": {
pattern: /(<)[a-z]\w*|(?:<\/)[a-z]\w*/,
lookbehind: true,
inside: {
"operator": /<|>|\//
}
},
"keyword": /\b(?:and|as|assert|begin|bool|class|constraint|do|done|downto|else|end|exception|external|float|for|fun|function|if|in|include|inherit|initializer|int|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|string|switch|then|to|try|type|when|while|with)\b/,
"operator": /\.{3}|:[:=]?|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/,
"punctuation": /[(){}[\],;.]/
};
Prism.languages.insertBefore("rescript", "string", {
"template-string": {
pattern: /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,
greedy: true,
inside: {
"template-punctuation": {
pattern: /^`|`$/,
alias: "string"
},
"interpolation": {
pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,
lookbehind: true,
inside: {
"interpolation-punctuation": {
pattern: /^\$\{|\}$/,
alias: "tag"
},
rest: Prism.languages.rescript
}
},
"string": /[\s\S]+/
}
}
});
Prism.languages.res = Prism.languages.rescript;
Prism.languages.rest = {
"table": [
{
pattern: /(^[\t ]*)(?:\+[=-]+)+\+(?:\r?\n|\r)(?:\1[+|].+[+|](?:\r?\n|\r))+\1(?:\+[=-]+)+\+/m,
lookbehind: true,
inside: {
"punctuation": /\||(?:\+[=-]+)+\+/
}
},
{
pattern: /(^[\t ]*)=+ [ =]*=(?:(?:\r?\n|\r)\1.+)+(?:\r?\n|\r)\1=+ [ =]*=(?=(?:\r?\n|\r){2}|\s*$)/m,
lookbehind: true,
inside: {
"punctuation": /[=-]+/
}
}
],
"substitution-def": {
pattern: /(^[\t ]*\.\. )\|(?:[^|\s](?:[^|]*[^|\s])?)\| [^:]+::/m,
lookbehind: true,
inside: {
"substitution": {
pattern: /^\|(?:[^|\s]|[^|\s][^|]*[^|\s])\|/,
alias: "attr-value",
inside: {
"punctuation": /^\||\|$/
}
},
"directive": {
pattern: /( )(?! )[^:]+::/,
lookbehind: true,
alias: "function",
inside: {
"punctuation": /::$/
}
}
}
},
"link-target": [
{
pattern: /(^[\t ]*\.\. )\[[^\]]+\]/m,
lookbehind: true,
alias: "string",
inside: {
"punctuation": /^\[|\]$/
}
},
{
pattern: /(^[\t ]*\.\. )_(?:`[^`]+`|(?:[^:\\]|\\.)+):/m,
lookbehind: true,
alias: "string",
inside: {
"punctuation": /^_|:$/
}
}
],
"directive": {
pattern: /(^[\t ]*\.\. )[^:]+::/m,
lookbehind: true,
alias: "function",
inside: {
"punctuation": /::$/
}
},
"comment": {
pattern: /(^[\t ]*\.\.)(?:(?: .+)?(?:(?:\r?\n|\r).+)+| .+)(?=(?:\r?\n|\r){2}|$)/m,
lookbehind: true
},
"title": [
{
pattern: /^(([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+)(?:\r?\n|\r).+(?:\r?\n|\r)\1$/m,
inside: {
"punctuation": /^[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+|[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,
"important": /.+/
}
},
{
pattern: /(^|(?:\r?\n|\r){2}).+(?:\r?\n|\r)([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+(?=\r?\n|\r|$)/,
lookbehind: true,
inside: {
"punctuation": /[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,
"important": /.+/
}
}
],
"hr": {
pattern: /((?:\r?\n|\r){2})([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2{3,}(?=(?:\r?\n|\r){2})/,
lookbehind: true,
alias: "punctuation"
},
"field": {
pattern: /(^[\t ]*):[^:\r\n]+:(?= )/m,
lookbehind: true,
alias: "attr-name"
},
"command-line-option": {
pattern: /(^[\t ]*)(?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?(?:, (?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?)*(?=(?:\r?\n|\r)? {2,}\S)/im,
lookbehind: true,
alias: "symbol"
},
"literal-block": {
pattern: /::(?:\r?\n|\r){2}([ \t]+)(?![ \t]).+(?:(?:\r?\n|\r)\1.+)*/,
inside: {
"literal-block-punctuation": {
pattern: /^::/,
alias: "punctuation"
}
}
},
"quoted-literal-block": {
pattern: /::(?:\r?\n|\r){2}([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]).*(?:(?:\r?\n|\r)\1.*)*/,
inside: {
"literal-block-punctuation": {
pattern: /^(?:::|([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\1*)/m,
alias: "punctuation"
}
}
},
"list-bullet": {
pattern: /(^[\t ]*)(?:[*+\-•‣⁃]|\(?(?:\d+|[a-z]|[ivxdclm]+)\)|(?:\d+|[a-z]|[ivxdclm]+)\.)(?= )/im,
lookbehind: true,
alias: "punctuation"
},
"doctest-block": {
pattern: /(^[\t ]*)>>> .+(?:(?:\r?\n|\r).+)*/m,
lookbehind: true,
inside: {
"punctuation": /^>>>/
}
},
"inline": [
{
pattern: /(^|[\s\-:\/'"<(\[{])(?::[^:]+:`.*?`|`.*?`:[^:]+:|(\*\*?|``?|\|)(?!\s)(?:(?!\2).)*\S\2(?=[\s\-.,:;!?\\\/'")\]}]|$))/m,
lookbehind: true,
inside: {
"bold": {
pattern: /(^\*\*).+(?=\*\*$)/,
lookbehind: true
},
"italic": {
pattern: /(^\*).+(?=\*$)/,
lookbehind: true
},
"inline-literal": {
pattern: /(^``).+(?=``$)/,
lookbehind: true,
alias: "symbol"
},
"role": {
pattern: /^:[^:]+:|:[^:]+:$/,
alias: "function",
inside: {
"punctuation": /^:|:$/
}
},
"interpreted-text": {
pattern: /(^`).+(?=`$)/,
lookbehind: true,
alias: "attr-value"
},
"substitution": {
pattern: /(^\|).+(?=\|$)/,
lookbehind: true,
alias: "attr-value"
},
"punctuation": /\*\*?|``?|\|/
}
}
],
"link": [
{
pattern: /\[[^\[\]]+\]_(?=[\s\-.,:;!?\\\/'")\]}]|$)/,
alias: "string",
inside: {
"punctuation": /^\[|\]_$/
}
},
{
pattern: /(?:\b[a-z\d]+(?:[_.:+][a-z\d]+)*_?_|`[^`]+`_?_|_`[^`]+`)(?=[\s\-.,:;!?\\\/'")\]}]|$)/i,
alias: "string",
inside: {
"punctuation": /^_?`|`$|`?_?_$/
}
}
],
"punctuation": {
pattern: /(^[\t ]*)(?:\|(?= |$)|(?:---?|—|\.\.|__)(?= )|\.\.$)/m,
lookbehind: true
}
};
Prism.languages.rip = {
"comment": {
pattern: /#.*/,
greedy: true
},
"char": {
pattern: /\B`[^\s`'",.:;#\/\\()<>\[\]{}]\b/,
greedy: true
},
"string": {
pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"regex": {
pattern: /(^|[^/])\/(?!\/)(?:\[[^\n\r\]]*\]|\\.|[^/\\\r\n\[])+\/(?=\s*(?:$|[\r\n,.;})]))/,
lookbehind: true,
greedy: true
},
"keyword": /(?:=>|->)|\b(?:case|catch|class|else|exit|finally|if|raise|return|switch|try)\b/,
"builtin": /@|\bSystem\b/,
"boolean": /\b(?:false|true)\b/,
"date": /\b\d{4}-\d{2}-\d{2}\b/,
"time": /\b\d{2}:\d{2}:\d{2}\b/,
"datetime": /\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\b/,
"symbol": /:[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/,
"number": /[+-]?\b(?:\d+\.\d+|\d+)\b/,
"punctuation": /(?:\.{2,3})|[`,.:;=\/\\()<>\[\]{}]/,
"reference": /[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/
};
Prism.languages.roboconf = {
"comment": /#.*/,
"keyword": {
"pattern": /(^|\s)(?:(?:external|import)\b|(?:facet|instance of)(?=[ \t]+[\w-]+[ \t]*\{))/,
lookbehind: true
},
"component": {
pattern: /[\w-]+(?=[ \t]*\{)/,
alias: "variable"
},
"property": /[\w.-]+(?=[ \t]*:)/,
"value": {
pattern: /(=[ \t]*(?![ \t]))[^,;]+/,
lookbehind: true,
alias: "attr-value"
},
"optional": {
pattern: /\(optional\)/,
alias: "builtin"
},
"wildcard": {
pattern: /(\.)\*/,
lookbehind: true,
alias: "operator"
},
"punctuation": /[{},.;:=]/
};
(function(Prism2) {
var comment = {
pattern: /(^[ \t]*| {2}|\t)#.*/m,
lookbehind: true,
greedy: true
};
var variable = {
pattern: /((?:^|[^\\])(?:\\{2})*)[$@&%]\{(?:[^{}\r\n]|\{[^{}\r\n]*\})*\}/,
lookbehind: true,
inside: {
"punctuation": /^[$@&%]\{|\}$/
}
};
function createSection(name, inside) {
var extendecInside = {};
extendecInside["section-header"] = {
pattern: /^ ?\*{3}.+?\*{3}/,
alias: "keyword"
};
for (var token in inside) {
extendecInside[token] = inside[token];
}
extendecInside["tag"] = {
pattern: /([\r\n](?: {2}|\t)[ \t]*)\[[-\w]+\]/,
lookbehind: true,
inside: {
"punctuation": /\[|\]/
}
};
extendecInside["variable"] = variable;
extendecInside["comment"] = comment;
return {
pattern: RegExp(/^ ?\*{3}[ \t]*<name>[ \t]*\*{3}(?:.|[\r\n](?!\*{3}))*/.source.replace(/<name>/g, function() {
return name;
}), "im"),
alias: "section",
inside: extendecInside
};
}
var docTag = {
pattern: /(\[Documentation\](?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,
lookbehind: true,
alias: "string"
};
var testNameLike = {
pattern: /([\r\n] ?)(?!#)(?:\S(?:[ \t]\S)*)+/,
lookbehind: true,
alias: "function",
inside: {
"variable": variable
}
};
var testPropertyLike = {
pattern: /([\r\n](?: {2}|\t)[ \t]*)(?!\[|\.{3}|#)(?:\S(?:[ \t]\S)*)+/,
lookbehind: true,
inside: {
"variable": variable
}
};
Prism2.languages["robotframework"] = {
"settings": createSection("Settings", {
"documentation": {
pattern: /([\r\n] ?Documentation(?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,
lookbehind: true,
alias: "string"
},
"property": {
pattern: /([\r\n] ?)(?!\.{3}|#)(?:\S(?:[ \t]\S)*)+/,
lookbehind: true
}
}),
"variables": createSection("Variables"),
"test-cases": createSection("Test Cases", {
"test-name": testNameLike,
"documentation": docTag,
"property": testPropertyLike
}),
"keywords": createSection("Keywords", {
"keyword-name": testNameLike,
"documentation": docTag,
"property": testPropertyLike
}),
"tasks": createSection("Tasks", {
"task-name": testNameLike,
"documentation": docTag,
"property": testPropertyLike
}),
"comment": comment
};
Prism2.languages.robot = Prism2.languages["robotframework"];
})(Prism);
(function(Prism2) {
var multilineComment = /\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|<self>)*\*\//.source;
for (var i = 0; i < 2; i++) {
multilineComment = multilineComment.replace(/<self>/g, function() {
return multilineComment;
});
}
multilineComment = multilineComment.replace(/<self>/g, function() {
return /[^\s\S]/.source;
});
Prism2.languages.rust = {
"comment": [
{
pattern: RegExp(/(^|[^\\])/.source + multilineComment),
lookbehind: true,
greedy: true
},
{
pattern: /(^|[^\\:])\/\/.*/,
lookbehind: true,
greedy: true
}
],
"string": {
pattern: /b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,
greedy: true
},
"char": {
pattern: /b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,
greedy: true
},
"attribute": {
pattern: /#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,
greedy: true,
alias: "attr-name",
inside: {
"string": null
}
},
"closure-params": {
pattern: /([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,
lookbehind: true,
greedy: true,
inside: {
"closure-punctuation": {
pattern: /^\||\|$/,
alias: "punctuation"
},
rest: null
}
},
"lifetime-annotation": {
pattern: /'\w+/,
alias: "symbol"
},
"fragment-specifier": {
pattern: /(\$\w+:)[a-z]+/,
lookbehind: true,
alias: "punctuation"
},
"variable": /\$\w+/,
"function-definition": {
pattern: /(\bfn\s+)\w+/,
lookbehind: true,
alias: "function"
},
"type-definition": {
pattern: /(\b(?:enum|struct|trait|type|union)\s+)\w+/,
lookbehind: true,
alias: "class-name"
},
"module-declaration": [
{
pattern: /(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,
lookbehind: true,
alias: "namespace"
},
{
pattern: /(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,
lookbehind: true,
alias: "namespace",
inside: {
"punctuation": /::/
}
}
],
"keyword": [
/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,
/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/
],
"function": /\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,
"macro": {
pattern: /\b\w+!/,
alias: "property"
},
"constant": /\b[A-Z_][A-Z_\d]+\b/,
"class-name": /\b[A-Z]\w*\b/,
"namespace": {
pattern: /(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,
inside: {
"punctuation": /::/
}
},
"number": /\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,
"boolean": /\b(?:false|true)\b/,
"punctuation": /->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,
"operator": /[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?=?|[@?]/
};
Prism2.languages.rust["closure-params"].inside.rest = Prism2.languages.rust;
Prism2.languages.rust["attribute"].inside["string"] = Prism2.languages.rust["string"];
})(Prism);
(function(Prism2) {
var stringPattern = /(?:"(?:""|[^"])*"(?!")|'(?:''|[^'])*'(?!'))/.source;
var number = /\b(?:\d[\da-f]*x|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i;
var numericConstant = {
pattern: RegExp(stringPattern + "[bx]"),
alias: "number"
};
var macroVariable = {
pattern: /&[a-z_]\w*/i
};
var macroKeyword = {
pattern: /((?:^|\s|=|\())%(?:ABORT|BY|CMS|COPY|DISPLAY|DO|ELSE|END|EVAL|GLOBAL|GO|GOTO|IF|INC|INCLUDE|INDEX|INPUT|KTRIM|LENGTH|LET|LIST|LOCAL|PUT|QKTRIM|QSCAN|QSUBSTR|QSYSFUNC|QUPCASE|RETURN|RUN|SCAN|SUBSTR|SUPERQ|SYMDEL|SYMEXIST|SYMGLOBL|SYMLOCAL|SYSCALL|SYSEVALF|SYSEXEC|SYSFUNC|SYSGET|SYSRPUT|THEN|TO|TSO|UNQUOTE|UNTIL|UPCASE|WHILE|WINDOW)\b/i,
lookbehind: true,
alias: "keyword"
};
var step = {
pattern: /(^|\s)(?:proc\s+\w+|data(?!=)|quit|run)\b/i,
alias: "keyword",
lookbehind: true
};
var comment = [
/\/\*[\s\S]*?\*\//,
{
pattern: /(^[ \t]*|;\s*)\*[^;]*;/m,
lookbehind: true
}
];
var string = {
pattern: RegExp(stringPattern),
greedy: true
};
var punctuation = /[$%@.(){}\[\];,\\]/;
var func = {
pattern: /%?\b\w+(?=\()/,
alias: "keyword"
};
var args = {
"function": func,
"arg-value": {
pattern: /(=\s*)[A-Z\.]+/i,
lookbehind: true
},
"operator": /=/,
"macro-variable": macroVariable,
"arg": {
pattern: /[A-Z]+/i,
alias: "keyword"
},
"number": number,
"numeric-constant": numericConstant,
"punctuation": punctuation,
"string": string
};
var format2 = {
pattern: /\b(?:format|put)\b=?[\w'$.]+/i,
inside: {
"keyword": /^(?:format|put)(?==)/i,
"equals": /=/,
"format": {
pattern: /(?:\w|\$\d)+\.\d?/,
alias: "number"
}
}
};
var altformat = {
pattern: /\b(?:format|put)\s+[\w']+(?:\s+[$.\w]+)+(?=;)/i,
inside: {
"keyword": /^(?:format|put)/i,
"format": {
pattern: /[\w$]+\.\d?/,
alias: "number"
}
}
};
var globalStatements = {
pattern: /((?:^|\s)=?)(?:catname|checkpoint execute_always|dm|endsas|filename|footnote|%include|libname|%list|lock|missing|options|page|resetline|%run|sasfile|skip|sysecho|title\d?)\b/i,
lookbehind: true,
alias: "keyword"
};
var submitStatement = {
pattern: /(^|\s)(?:submit(?:\s+(?:load|norun|parseonly))?|endsubmit)\b/i,
lookbehind: true,
alias: "keyword"
};
var actionSets = /aStore|accessControl|aggregation|audio|autotune|bayesianNetClassifier|bioMedImage|boolRule|builtins|cardinality|cdm|clustering|conditionalRandomFields|configuration|copula|countreg|dataDiscovery|dataPreprocess|dataSciencePilot|dataStep|decisionTree|deduplication|deepLearn|deepNeural|deepRnn|ds2|ecm|entityRes|espCluster|explainModel|factmac|fastKnn|fcmpact|fedSql|freqTab|gVarCluster|gam|gleam|graphSemiSupLearn|hiddenMarkovModel|hyperGroup|ica|image|iml|kernalPca|langModel|ldaTopic|loadStreams|mbc|mixed|mlTools|modelPublishing|network|neuralNet|nmf|nonParametricBayes|nonlinear|optNetwork|optimization|panel|pca|percentile|phreg|pls|qkb|qlim|quantreg|recommend|regression|reinforcementLearn|robustPca|ruleMining|sampling|sandwich|sccasl|search(?:Analytics)?|sentimentAnalysis|sequence|session(?:Prop)?|severity|simSystem|simple|smartData|sparkEmbeddedProcess|sparseML|spatialreg|spc|stabilityMonitoring|svDataDescription|svm|table|text(?:Filters|Frequency|Mining|Parse|Rule(?:Develop|Score)|Topic|Util)|timeData|transpose|tsInfo|tsReconcile|uniTimeSeries|varReduce/.source;
var casActions = {
pattern: RegExp(/(^|\s)(?:action\s+)?(?:<act>)\.[a-z]+\b[^;]+/.source.replace(/<act>/g, function() {
return actionSets;
}), "i"),
lookbehind: true,
inside: {
"keyword": RegExp(/(?:<act>)\.[a-z]+\b/.source.replace(/<act>/g, function() {
return actionSets;
}), "i"),
"action": {
pattern: /(?:action)/i,
alias: "keyword"
},
"comment": comment,
"function": func,
"arg-value": args["arg-value"],
"operator": args.operator,
"argument": args.arg,
"number": number,
"numeric-constant": numericConstant,
"punctuation": punctuation,
"string": string
}
};
var keywords = {
pattern: /((?:^|\s)=?)(?:after|analysis|and|array|barchart|barwidth|begingraph|by|call|cas|cbarline|cfill|class(?:lev)?|close|column|computed?|contains|continue|data(?==)|define|delete|describe|document|do\s+over|do|dol|drop|dul|else|end(?:comp|source)?|entryTitle|eval(?:uate)?|exec(?:ute)?|exit|file(?:name)?|fill(?:attrs)?|flist|fnc|function(?:list)?|global|goto|group(?:by)?|headline|headskip|histogram|if|infile|keep|keylabel|keyword|label|layout|leave|legendlabel|length|libname|loadactionset|merge|midpoints|_?null_|name|noobs|nowd|ods|options|or|otherwise|out(?:put)?|over(?:lay)?|plot|print|put|raise|ranexp|rannor|rbreak|retain|return|select|session|sessref|set|source|statgraph|sum|summarize|table|temp|terminate|then\s+do|then|title\d?|to|var|when|where|xaxisopts|y2axisopts|yaxisopts)\b/i,
lookbehind: true
};
Prism2.languages.sas = {
"datalines": {
pattern: /^([ \t]*)(?:cards|(?:data)?lines);[\s\S]+?^[ \t]*;/im,
lookbehind: true,
alias: "string",
inside: {
"keyword": {
pattern: /^(?:cards|(?:data)?lines)/i
},
"punctuation": /;/
}
},
"proc-sql": {
pattern: /(^proc\s+(?:fed)?sql(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,
lookbehind: true,
inside: {
"sql": {
pattern: RegExp(/^[ \t]*(?:select|alter\s+table|(?:create|describe|drop)\s+(?:index|table(?:\s+constraints)?|view)|create\s+unique\s+index|insert\s+into|update)(?:<str>|[^;"'])+;/.source.replace(/<str>/g, function() {
return stringPattern;
}), "im"),
alias: "language-sql",
inside: Prism2.languages.sql
},
"global-statements": globalStatements,
"sql-statements": {
pattern: /(^|\s)(?:disconnect\s+from|begin|commit|exec(?:ute)?|reset|rollback|validate)\b/i,
lookbehind: true,
alias: "keyword"
},
"number": number,
"numeric-constant": numericConstant,
"punctuation": punctuation,
"string": string
}
},
"proc-groovy": {
pattern: /(^proc\s+groovy(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,
lookbehind: true,
inside: {
"comment": comment,
"groovy": {
pattern: RegExp(/(^[ \t]*submit(?:\s+(?:load|norun|parseonly))?)(?:<str>|[^"'])+?(?=endsubmit;)/.source.replace(/<str>/g, function() {
return stringPattern;
}), "im"),
lookbehind: true,
alias: "language-groovy",
inside: Prism2.languages.groovy
},
"keyword": keywords,
"submit-statement": submitStatement,
"global-statements": globalStatements,
"number": number,
"numeric-constant": numericConstant,
"punctuation": punctuation,
"string": string
}
},
"proc-lua": {
pattern: /(^proc\s+lua(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,
lookbehind: true,
inside: {
"comment": comment,
"lua": {
pattern: RegExp(/(^[ \t]*submit(?:\s+(?:load|norun|parseonly))?)(?:<str>|[^"'])+?(?=endsubmit;)/.source.replace(/<str>/g, function() {
return stringPattern;
}), "im"),
lookbehind: true,
alias: "language-lua",
inside: Prism2.languages.lua
},
"keyword": keywords,
"submit-statement": submitStatement,
"global-statements": globalStatements,
"number": number,
"numeric-constant": numericConstant,
"punctuation": punctuation,
"string": string
}
},
"proc-cas": {
pattern: /(^proc\s+cas(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|quit|data);|(?![\s\S]))/im,
lookbehind: true,
inside: {
"comment": comment,
"statement-var": {
pattern: /((?:^|\s)=?)saveresult\s[^;]+/im,
lookbehind: true,
inside: {
"statement": {
pattern: /^saveresult\s+\S+/i,
inside: {
keyword: /^(?:saveresult)/i
}
},
rest: args
}
},
"cas-actions": casActions,
"statement": {
pattern: /((?:^|\s)=?)(?:default|(?:un)?set|on|output|upload)[^;]+/im,
lookbehind: true,
inside: args
},
"step": step,
"keyword": keywords,
"function": func,
"format": format2,
"altformat": altformat,
"global-statements": globalStatements,
"number": number,
"numeric-constant": numericConstant,
"punctuation": punctuation,
"string": string
}
},
"proc-args": {
pattern: RegExp(/(^proc\s+\w+\s+)(?!\s)(?:[^;"']|<str>)+;/.source.replace(/<str>/g, function() {
return stringPattern;
}), "im"),
lookbehind: true,
inside: args
},
"macro-keyword": macroKeyword,
"macro-variable": macroVariable,
"macro-string-functions": {
pattern: /((?:^|\s|=))%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)\(.*?(?:[^%]\))/i,
lookbehind: true,
inside: {
"function": {
pattern: /%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)/i,
alias: "keyword"
},
"macro-keyword": macroKeyword,
"macro-variable": macroVariable,
"escaped-char": {
pattern: /%['"()<>=¬^~;,#]/
},
"punctuation": punctuation
}
},
"macro-declaration": {
pattern: /^%macro[^;]+(?=;)/im,
inside: {
"keyword": /%macro/i
}
},
"macro-end": {
pattern: /^%mend[^;]+(?=;)/im,
inside: {
"keyword": /%mend/i
}
},
"macro": {
pattern: /%_\w+(?=\()/,
alias: "keyword"
},
"input": {
pattern: /\binput\s[-\w\s/*.$&]+;/i,
inside: {
"input": {
alias: "keyword",
pattern: /^input/i
},
"comment": comment,
"number": number,
"numeric-constant": numericConstant
}
},
"options-args": {
pattern: /(^options)[-'"|/\\<>*+=:()\w\s]*(?=;)/im,
lookbehind: true,
inside: args
},
"cas-actions": casActions,
"comment": comment,
"function": func,
"format": format2,
"altformat": altformat,
"numeric-constant": numericConstant,
"datetime": {
pattern: RegExp(stringPattern + "(?:dt?|t)"),
alias: "number"
},
"string": string,
"step": step,
"keyword": keywords,
"operator-keyword": {
pattern: /\b(?:eq|ge|gt|in|le|lt|ne|not)\b/i,
alias: "operator"
},
"number": number,
"operator": /\*\*?|\|\|?|!!?|¦¦?|<[>=]?|>[<=]?|[-+\/=&]|[~¬^]=?/,
"punctuation": punctuation
};
})(Prism);
(function(Prism2) {
Prism2.languages.sass = Prism2.languages.extend("css", {
"comment": {
pattern: /^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,
lookbehind: true,
greedy: true
}
});
Prism2.languages.insertBefore("sass", "atrule", {
"atrule-line": {
pattern: /^(?:[ \t]*)[@+=].+/m,
greedy: true,
inside: {
"atrule": /(?:@[\w-]+|[+=])/
}
}
});
delete Prism2.languages.sass.atrule;
var variable = /\$[-\w]+|#\{\$[-\w]+\}/;
var operator = [
/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,
{
pattern: /(\s)-(?=\s)/,
lookbehind: true
}
];
Prism2.languages.insertBefore("sass", "property", {
"variable-line": {
pattern: /^[ \t]*\$.+/m,
greedy: true,
inside: {
"punctuation": /:/,
"variable": variable,
"operator": operator
}
},
"property-line": {
pattern: /^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,
greedy: true,
inside: {
"property": [
/[^:\s]+(?=\s*:)/,
{
pattern: /(:)[^:\s]+/,
lookbehind: true
}
],
"punctuation": /:/,
"variable": variable,
"operator": operator,
"important": Prism2.languages.sass.important
}
}
});
delete Prism2.languages.sass.property;
delete Prism2.languages.sass.important;
Prism2.languages.insertBefore("sass", "punctuation", {
"selector": {
pattern: /^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,
lookbehind: true,
greedy: true
}
});
})(Prism);
Prism.languages.scss = Prism.languages.extend("css", {
"comment": {
pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,
lookbehind: true
},
"atrule": {
pattern: /@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,
inside: {
"rule": /@[\w-]+/
}
},
"url": /(?:[-a-z]+-)?url(?=\()/i,
"selector": {
pattern: /(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,
inside: {
"parent": {
pattern: /&/,
alias: "important"
},
"placeholder": /%[-\w]+/,
"variable": /\$[-\w]+|#\{\$[-\w]+\}/
}
},
"property": {
pattern: /(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,
inside: {
"variable": /\$[-\w]+|#\{\$[-\w]+\}/
}
}
});
Prism.languages.insertBefore("scss", "atrule", {
"keyword": [
/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,
{
pattern: /( )(?:from|through)(?= )/,
lookbehind: true
}
]
});
Prism.languages.insertBefore("scss", "important", {
"variable": /\$[-\w]+|#\{\$[-\w]+\}/
});
Prism.languages.insertBefore("scss", "function", {
"module-modifier": {
pattern: /\b(?:as|hide|show|with)\b/i,
alias: "keyword"
},
"placeholder": {
pattern: /%[-\w]+/,
alias: "selector"
},
"statement": {
pattern: /\B!(?:default|optional)\b/i,
alias: "keyword"
},
"boolean": /\b(?:false|true)\b/,
"null": {
pattern: /\bnull\b/,
alias: "keyword"
},
"operator": {
pattern: /(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,
lookbehind: true
}
});
Prism.languages.scss["atrule"].inside.rest = Prism.languages.scss;
Prism.languages.scala = Prism.languages.extend("java", {
"triple-quoted-string": {
pattern: /"""[\s\S]*?"""/,
greedy: true,
alias: "string"
},
"string": {
pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"keyword": /<-|=>|\b(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|null|object|override|package|private|protected|return|sealed|self|super|this|throw|trait|try|type|val|var|while|with|yield)\b/,
"number": /\b0x(?:[\da-f]*\.)?[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e\d+)?[dfl]?/i,
"builtin": /\b(?:Any|AnyRef|AnyVal|Boolean|Byte|Char|Double|Float|Int|Long|Nothing|Short|String|Unit)\b/,
"symbol": /'[^\d\s\\]\w*/
});
Prism.languages.insertBefore("scala", "triple-quoted-string", {
"string-interpolation": {
pattern: /\b[a-z]\w*(?:"""(?:[^$]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*?"""|"(?:[^$"\r\n]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*")/i,
greedy: true,
inside: {
"id": {
pattern: /^\w+/,
greedy: true,
alias: "function"
},
"escape": {
pattern: /\\\$"|\$[$"]/,
greedy: true,
alias: "symbol"
},
"interpolation": {
pattern: /\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,
greedy: true,
inside: {
"punctuation": /^\$\{?|\}$/,
"expression": {
pattern: /[\s\S]+/,
inside: Prism.languages.scala
}
}
},
"string": /[\s\S]+/
}
}
});
delete Prism.languages.scala["class-name"];
delete Prism.languages.scala["function"];
(function(Prism2) {
var strings = [
/"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/.source,
/'[^']*'/.source,
/\$'(?:[^'\\]|\\[\s\S])*'/.source,
/<<-?\s*(["']?)(\w+)\1\s[\s\S]*?[\r\n]\2/.source
].join("|");
Prism2.languages["shell-session"] = {
"command": {
pattern: RegExp(/^/.source + "(?:" + (/[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+(?::[^\0-\x1F$#%*?"<>:;|]+)?/.source + "|" + /[/~.][^\0-\x1F$#%*?"<>@:;|]*/.source) + ")?" + /[$#%](?=\s)/.source + /(?:[^\\\r\n \t'"<$]|[ \t](?:(?!#)|#.*$)|\\(?:[^\r]|\r\n?)|\$(?!')|<(?!<)|<<str>>)+/.source.replace(/<<str>>/g, function() {
return strings;
}), "m"),
greedy: true,
inside: {
"info": {
pattern: /^[^#$%]+/,
alias: "punctuation",
inside: {
"user": /^[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+/,
"punctuation": /:/,
"path": /[\s\S]+/
}
},
"bash": {
pattern: /(^[$#%]\s*)\S[\s\S]*/,
lookbehind: true,
alias: "language-bash",
inside: Prism2.languages.bash
},
"shell-symbol": {
pattern: /^[$#%]/,
alias: "important"
}
}
},
"output": /.(?:.*(?:[\r\n]|.$))*/
};
Prism2.languages["sh-session"] = Prism2.languages["shellsession"] = Prism2.languages["shell-session"];
})(Prism);
Prism.languages.smali = {
"comment": /#.*/,
"string": {
pattern: /"(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\(?:.|u[\da-fA-F]{4}))'/,
greedy: true
},
"class-name": {
pattern: /(^|[^L])L(?:(?:\w+|`[^`\r\n]*`)\/)*(?:[\w$]+|`[^`\r\n]*`)(?=\s*;)/,
lookbehind: true,
inside: {
"class-name": {
pattern: /(^L|\/)(?:[\w$]+|`[^`\r\n]*`)$/,
lookbehind: true
},
"namespace": {
pattern: /^(L)(?:(?:\w+|`[^`\r\n]*`)\/)+/,
lookbehind: true,
inside: {
"punctuation": /\//
}
},
"builtin": /^L/
}
},
"builtin": [
{
pattern: /([();\[])[BCDFIJSVZ]+/,
lookbehind: true
},
{
pattern: /([\w$>]:)[BCDFIJSVZ]/,
lookbehind: true
}
],
"keyword": [
{
pattern: /(\.end\s+)[\w-]+/,
lookbehind: true
},
{
pattern: /(^|[^\w.-])\.(?!\d)[\w-]+/,
lookbehind: true
},
{
pattern: /(^|[^\w.-])(?:abstract|annotation|bridge|constructor|enum|final|interface|private|protected|public|runtime|static|synthetic|system|transient)(?![\w.-])/,
lookbehind: true
}
],
"function": {
pattern: /(^|[^\w.-])(?:\w+|<[\w$-]+>)(?=\()/,
lookbehind: true
},
"field": {
pattern: /[\w$]+(?=:)/,
alias: "variable"
},
"register": {
pattern: /(^|[^\w.-])[vp]\d(?![\w.-])/,
lookbehind: true,
alias: "variable"
},
"boolean": {
pattern: /(^|[^\w.-])(?:false|true)(?![\w.-])/,
lookbehind: true
},
"number": {
pattern: /(^|[^/\w.-])-?(?:NAN|INFINITY|0x(?:[\dA-F]+(?:\.[\dA-F]*)?|\.[\dA-F]+)(?:p[+-]?[\dA-F]+)?|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)[dflst]?(?![\w.-])/i,
lookbehind: true
},
"label": {
pattern: /(:)\w+/,
lookbehind: true,
alias: "property"
},
"operator": /->|\.\.|[\[=]/,
"punctuation": /[{}(),;:]/
};
Prism.languages.smalltalk = {
"comment": {
pattern: /"(?:""|[^"])*"/,
greedy: true
},
"char": {
pattern: /\$./,
greedy: true
},
"string": {
pattern: /'(?:''|[^'])*'/,
greedy: true
},
"symbol": /#[\da-z]+|#(?:-|([+\/\\*~<>=@%|&?!])\1?)|#(?=\()/i,
"block-arguments": {
pattern: /(\[\s*):[^\[|]*\|/,
lookbehind: true,
inside: {
"variable": /:[\da-z]+/i,
"punctuation": /\|/
}
},
"temporary-variables": {
pattern: /\|[^|]+\|/,
inside: {
"variable": /[\da-z]+/i,
"punctuation": /\|/
}
},
"keyword": /\b(?:new|nil|self|super)\b/,
"boolean": /\b(?:false|true)\b/,
"number": [
/\d+r-?[\dA-Z]+(?:\.[\dA-Z]+)?(?:e-?\d+)?/,
/\b\d+(?:\.\d+)?(?:e-?\d+)?/
],
"operator": /[<=]=?|:=|~[~=]|\/\/?|\\\\|>[>=]?|[!^+\-*&|,@]/,
"punctuation": /[.;:?\[\](){}]/
};
(function(Prism2) {
Prism2.languages.smarty = {
"comment": {
pattern: /^\{\*[\s\S]*?\*\}/,
greedy: true
},
"embedded-php": {
pattern: /^\{php\}[\s\S]*?\{\/php\}/,
greedy: true,
inside: {
"smarty": {
pattern: /^\{php\}|\{\/php\}$/,
inside: null
},
"php": {
pattern: /[\s\S]+/,
alias: "language-php",
inside: Prism2.languages.php
}
}
},
"string": [
{
pattern: /"(?:\\.|[^"\\\r\n])*"/,
greedy: true,
inside: {
"interpolation": {
pattern: /\{[^{}]*\}|`[^`]*`/,
inside: {
"interpolation-punctuation": {
pattern: /^[{`]|[`}]$/,
alias: "punctuation"
},
"expression": {
pattern: /[\s\S]+/,
inside: null
}
}
},
"variable": /\$\w+/
}
},
{
pattern: /'(?:\\.|[^'\\\r\n])*'/,
greedy: true
}
],
"keyword": {
pattern: /(^\{\/?)[a-z_]\w*\b(?!\()/i,
lookbehind: true,
greedy: true
},
"delimiter": {
pattern: /^\{\/?|\}$/,
greedy: true,
alias: "punctuation"
},
"number": /\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,
"variable": [
/\$(?!\d)\w+/,
/#(?!\d)\w+#/,
{
pattern: /(\.|->|\w\s*=)(?!\d)\w+\b(?!\()/,
lookbehind: true
},
{
pattern: /(\[)(?!\d)\w+(?=\])/,
lookbehind: true
}
],
"function": {
pattern: /(\|\s*)@?[a-z_]\w*|\b[a-z_]\w*(?=\()/i,
lookbehind: true
},
"attr-name": /\b[a-z_]\w*(?=\s*=)/i,
"boolean": /\b(?:false|no|off|on|true|yes)\b/,
"punctuation": /[\[\](){}.,:`]|->/,
"operator": [
/[+\-*\/%]|==?=?|[!<>]=?|&&|\|\|?/,
/\bis\s+(?:not\s+)?(?:div|even|odd)(?:\s+by)?\b/,
/\b(?:and|eq|gt?e|gt|lt?e|lt|mod|neq?|not|or)\b/
]
};
Prism2.languages.smarty["embedded-php"].inside.smarty.inside = Prism2.languages.smarty;
Prism2.languages.smarty.string[0].inside.interpolation.inside.expression.inside = Prism2.languages.smarty;
var string = /"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/;
var smartyPattern = RegExp(/\{\*[\s\S]*?\*\}/.source + "|" + /\{php\}[\s\S]*?\{\/php\}/.source + "|" + /\{(?:[^{}"']|<str>|\{(?:[^{}"']|<str>|\{(?:[^{}"']|<str>)*\})*\})*\}/.source.replace(/<str>/g, function() {
return string.source;
}), "g");
Prism2.hooks.add("before-tokenize", function(env) {
var smartyLiteralStart = "{literal}";
var smartyLiteralEnd = "{/literal}";
var smartyLiteralMode = false;
Prism2.languages["markup-templating"].buildPlaceholders(env, "smarty", smartyPattern, function(match) {
if (match === smartyLiteralEnd) {
smartyLiteralMode = false;
}
if (!smartyLiteralMode) {
if (match === smartyLiteralStart) {
smartyLiteralMode = true;
}
return true;
}
return false;
});
});
Prism2.hooks.add("after-tokenize", function(env) {
Prism2.languages["markup-templating"].tokenizePlaceholders(env, "smarty");
});
})(Prism);
(function(Prism2) {
var keywords = /\b(?:abstype|and|andalso|as|case|datatype|do|else|end|eqtype|exception|fn|fun|functor|handle|if|in|include|infix|infixr|let|local|nonfix|of|op|open|orelse|raise|rec|sharing|sig|signature|struct|structure|then|type|val|where|while|with|withtype)\b/i;
Prism2.languages.sml = {
"comment": /\(\*(?:[^*(]|\*(?!\))|\((?!\*)|\(\*(?:[^*(]|\*(?!\))|\((?!\*))*\*\))*\*\)/,
"string": {
pattern: /#?"(?:[^"\\]|\\.)*"/,
greedy: true
},
"class-name": [
{
pattern: RegExp(/((?:^|[^:]):\s*)<TERMINAL>(?:\s*(?:(?:\*|->)\s*<TERMINAL>|,\s*<TERMINAL>(?:(?=<NOT-LAST>)|(?!<NOT-LAST>)\s+<LONG-ID>)))*/.source.replace(/<NOT-LAST>/g, function() {
return /\s*(?:[*,]|->)/.source;
}).replace(/<TERMINAL>/g, function() {
return /(?:'[\w']*|<LONG-ID>|\((?:[^()]|\([^()]*\))*\)|\{(?:[^{}]|\{[^{}]*\})*\})(?:\s+<LONG-ID>)*/.source;
}).replace(/<LONG-ID>/g, function() {
return /(?!<KEYWORD>)[a-z\d_][\w'.]*/.source;
}).replace(/<KEYWORD>/g, function() {
return keywords.source;
}), "i"),
lookbehind: true,
greedy: true,
inside: null
},
{
pattern: /((?:^|[^\w'])(?:datatype|exception|functor|signature|structure|type)\s+)[a-z_][\w'.]*/i,
lookbehind: true
}
],
"function": {
pattern: /((?:^|[^\w'])fun\s+)[a-z_][\w'.]*/i,
lookbehind: true
},
"keyword": keywords,
"variable": {
pattern: /(^|[^\w'])'[\w']*/,
lookbehind: true
},
"number": /~?\b(?:\d+(?:\.\d+)?(?:e~?\d+)?|0x[\da-f]+)\b/i,
"word": {
pattern: /\b0w(?:\d+|x[\da-f]+)\b/i,
alias: "constant"
},
"boolean": /\b(?:false|true)\b/i,
"operator": /\.\.\.|:[>=:]|=>?|->|[<>]=?|[!+\-*/^#|@~]/,
"punctuation": /[(){}\[\].:,;]/
};
Prism2.languages.sml["class-name"][0].inside = Prism2.languages.sml;
Prism2.languages.smlnj = Prism2.languages.sml;
})(Prism);
Prism.languages.solidity = Prism.languages.extend("clike", {
"class-name": {
pattern: /(\b(?:contract|enum|interface|library|new|struct|using)\s+)(?!\d)[\w$]+/,
lookbehind: true
},
"keyword": /\b(?:_|anonymous|as|assembly|assert|break|calldata|case|constant|constructor|continue|contract|default|delete|do|else|emit|enum|event|external|for|from|function|if|import|indexed|inherited|interface|internal|is|let|library|mapping|memory|modifier|new|payable|pragma|private|public|pure|require|returns?|revert|selfdestruct|solidity|storage|struct|suicide|switch|this|throw|using|var|view|while)\b/,
"operator": /=>|->|:=|=:|\*\*|\+\+|--|\|\||&&|<<=?|>>=?|[-+*/%^&|<>!=]=?|[~?]/
});
Prism.languages.insertBefore("solidity", "keyword", {
"builtin": /\b(?:address|bool|byte|u?int(?:8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?|string|bytes(?:[1-9]|[12]\d|3[0-2])?)\b/
});
Prism.languages.insertBefore("solidity", "number", {
"version": {
pattern: /([<>]=?|\^)\d+\.\d+\.\d+\b/,
lookbehind: true,
alias: "number"
}
});
Prism.languages.sol = Prism.languages.solidity;
(function(Prism2) {
var guid = {
pattern: /\{[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}\}/i,
alias: "constant",
inside: {
"punctuation": /[{}]/
}
};
Prism2.languages["solution-file"] = {
"comment": {
pattern: /#.*/,
greedy: true
},
"string": {
pattern: /"[^"\r\n]*"|'[^'\r\n]*'/,
greedy: true,
inside: {
"guid": guid
}
},
"object": {
pattern: /^([ \t]*)(?:([A-Z]\w*)\b(?=.*(?:\r\n?|\n)(?:\1[ \t].*(?:\r\n?|\n))*\1End\2(?=[ \t]*$))|End[A-Z]\w*(?=[ \t]*$))/m,
lookbehind: true,
greedy: true,
alias: "keyword"
},
"property": {
pattern: /^([ \t]*)(?!\s)[^\r\n"#=()]*[^\s"#=()](?=\s*=)/m,
lookbehind: true,
inside: {
"guid": guid
}
},
"guid": guid,
"number": /\b\d+(?:\.\d+)*\b/,
"boolean": /\b(?:FALSE|TRUE)\b/,
"operator": /=/,
"punctuation": /[(),]/
};
Prism2.languages["sln"] = Prism2.languages["solution-file"];
})(Prism);
(function(Prism2) {
var stringPattern = /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;
var numberPattern = /\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-F]+\b/;
Prism2.languages.soy = {
"comment": [
/\/\*[\s\S]*?\*\//,
{
pattern: /(\s)\/\/.*/,
lookbehind: true,
greedy: true
}
],
"command-arg": {
pattern: /(\{+\/?\s*(?:alias|call|delcall|delpackage|deltemplate|namespace|template)\s+)\.?[\w.]+/,
lookbehind: true,
alias: "string",
inside: {
"punctuation": /\./
}
},
"parameter": {
pattern: /(\{+\/?\s*@?param\??\s+)\.?[\w.]+/,
lookbehind: true,
alias: "variable"
},
"keyword": [
{
pattern: /(\{+\/?[^\S\r\n]*)(?:\\[nrt]|alias|call|case|css|default|delcall|delpackage|deltemplate|else(?:if)?|fallbackmsg|for(?:each)?|if(?:empty)?|lb|let|literal|msg|namespace|nil|@?param\??|rb|sp|switch|template|xid)/,
lookbehind: true
},
/\b(?:any|as|attributes|bool|css|float|html|in|int|js|list|map|null|number|string|uri)\b/
],
"delimiter": {
pattern: /^\{+\/?|\/?\}+$/,
alias: "punctuation"
},
"property": /\w+(?==)/,
"variable": {
pattern: /\$[^\W\d]\w*(?:\??(?:\.\w+|\[[^\]]+\]))*/,
inside: {
"string": {
pattern: stringPattern,
greedy: true
},
"number": numberPattern,
"punctuation": /[\[\].?]/
}
},
"string": {
pattern: stringPattern,
greedy: true
},
"function": [
/\w+(?=\()/,
{
pattern: /(\|[^\S\r\n]*)\w+/,
lookbehind: true
}
],
"boolean": /\b(?:false|true)\b/,
"number": numberPattern,
"operator": /\?:?|<=?|>=?|==?|!=|[+*/%-]|\b(?:and|not|or)\b/,
"punctuation": /[{}()\[\]|.,:]/
};
Prism2.hooks.add("before-tokenize", function(env) {
var soyPattern = /\{\{.+?\}\}|\{.+?\}|\s\/\/.*|\/\*[\s\S]*?\*\//g;
var soyLitteralStart = "{literal}";
var soyLitteralEnd = "{/literal}";
var soyLitteralMode = false;
Prism2.languages["markup-templating"].buildPlaceholders(env, "soy", soyPattern, function(match) {
if (match === soyLitteralEnd) {
soyLitteralMode = false;
}
if (!soyLitteralMode) {
if (match === soyLitteralStart) {
soyLitteralMode = true;
}
return true;
}
return false;
});
});
Prism2.hooks.add("after-tokenize", function(env) {
Prism2.languages["markup-templating"].tokenizePlaceholders(env, "soy");
});
})(Prism);
Prism.languages.turtle = {
"comment": {
pattern: /#.*/,
greedy: true
},
"multiline-string": {
pattern: /"""(?:(?:""?)?(?:[^"\\]|\\.))*"""|'''(?:(?:''?)?(?:[^'\\]|\\.))*'''/,
greedy: true,
alias: "string",
inside: {
"comment": /#.*/
}
},
"string": {
pattern: /"(?:[^\\"\r\n]|\\.)*"|'(?:[^\\'\r\n]|\\.)*'/,
greedy: true
},
"url": {
pattern: /<(?:[^\x00-\x20<>"{}|^`\\]|\\(?:u[\da-fA-F]{4}|U[\da-fA-F]{8}))*>/,
greedy: true,
inside: {
"punctuation": /[<>]/
}
},
"function": {
pattern: /(?:(?![-.\d\xB7])[-.\w\xB7\xC0-\uFFFD]+)?:(?:(?![-.])(?:[-.:\w\xC0-\uFFFD]|%[\da-f]{2}|\\.)+)?/i,
inside: {
"local-name": {
pattern: /([^:]*:)[\s\S]+/,
lookbehind: true
},
"prefix": {
pattern: /[\s\S]+/,
inside: {
"punctuation": /:/
}
}
}
},
"number": /[+-]?\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,
"punctuation": /[{}.,;()[\]]|\^\^/,
"boolean": /\b(?:false|true)\b/,
"keyword": [
/(?:\ba|@prefix|@base)\b|=/,
/\b(?:base|graph|prefix)\b/i
],
"tag": {
pattern: /@[a-z]+(?:-[a-z\d]+)*/i,
inside: {
"punctuation": /@/
}
}
};
Prism.languages.trig = Prism.languages["turtle"];
Prism.languages.sparql = Prism.languages.extend("turtle", {
"boolean": /\b(?:false|true)\b/i,
"variable": {
pattern: /[?$]\w+/,
greedy: true
}
});
Prism.languages.insertBefore("sparql", "punctuation", {
"keyword": [
/\b(?:A|ADD|ALL|AS|ASC|ASK|BNODE|BY|CLEAR|CONSTRUCT|COPY|CREATE|DATA|DEFAULT|DELETE|DESC|DESCRIBE|DISTINCT|DROP|EXISTS|FILTER|FROM|GROUP|HAVING|INSERT|INTO|LIMIT|LOAD|MINUS|MOVE|NAMED|NOT|NOW|OFFSET|OPTIONAL|ORDER|RAND|REDUCED|SELECT|SEPARATOR|SERVICE|SILENT|STRUUID|UNION|USING|UUID|VALUES|WHERE)\b/i,
/\b(?:ABS|AVG|BIND|BOUND|CEIL|COALESCE|CONCAT|CONTAINS|COUNT|DATATYPE|DAY|ENCODE_FOR_URI|FLOOR|GROUP_CONCAT|HOURS|IF|IRI|isBLANK|isIRI|isLITERAL|isNUMERIC|isURI|LANG|LANGMATCHES|LCASE|MAX|MD5|MIN|MINUTES|MONTH|REGEX|REPLACE|ROUND|sameTerm|SAMPLE|SECONDS|SHA1|SHA256|SHA384|SHA512|STR|STRAFTER|STRBEFORE|STRDT|STRENDS|STRLANG|STRLEN|STRSTARTS|SUBSTR|SUM|TIMEZONE|TZ|UCASE|URI|YEAR)\b(?=\s*\()/i,
/\b(?:BASE|GRAPH|PREFIX)\b/i
]
});
Prism.languages.rq = Prism.languages.sparql;
Prism.languages["splunk-spl"] = {
"comment": /`comment\("(?:\\.|[^\\"])*"\)`/,
"string": {
pattern: /"(?:\\.|[^\\"])*"/,
greedy: true
},
"keyword": /\b(?:abstract|accum|addcoltotals|addinfo|addtotals|analyzefields|anomalies|anomalousvalue|anomalydetection|append|appendcols|appendcsv|appendlookup|appendpipe|arules|associate|audit|autoregress|bin|bucket|bucketdir|chart|cluster|cofilter|collect|concurrency|contingency|convert|correlate|datamodel|dbinspect|dedup|delete|delta|diff|erex|eval|eventcount|eventstats|extract|fieldformat|fields|fieldsummary|filldown|fillnull|findtypes|folderize|foreach|format|from|gauge|gentimes|geom|geomfilter|geostats|head|highlight|history|iconify|input|inputcsv|inputlookup|iplocation|join|kmeans|kv|kvform|loadjob|localize|localop|lookup|makecontinuous|makemv|makeresults|map|mcollect|metadata|metasearch|meventcollect|mstats|multikv|multisearch|mvcombine|mvexpand|nomv|outlier|outputcsv|outputlookup|outputtext|overlap|pivot|predict|rangemap|rare|regex|relevancy|reltime|rename|replace|rest|return|reverse|rex|rtorder|run|savedsearch|script|scrub|search|searchtxn|selfjoin|sendemail|set|setfields|sichart|sirare|sistats|sitimechart|sitop|sort|spath|stats|strcat|streamstats|table|tags|tail|timechart|timewrap|top|transaction|transpose|trendline|tscollect|tstats|typeahead|typelearner|typer|union|uniq|untable|where|x11|xmlkv|xmlunescape|xpath|xyseries)\b/i,
"operator-word": {
pattern: /\b(?:and|as|by|not|or|xor)\b/i,
alias: "operator"
},
"function": /\b\w+(?=\s*\()/,
"property": /\b\w+(?=\s*=(?!=))/,
"date": {
pattern: /\b\d{1,2}\/\d{1,2}\/\d{1,4}(?:(?::\d{1,2}){3})?\b/,
alias: "number"
},
"number": /\b\d+(?:\.\d+)?\b/,
"boolean": /\b(?:f|false|t|true)\b/i,
"operator": /[<>=]=?|[-+*/%|]/,
"punctuation": /[()[\],]/
};
Prism.languages.sqf = Prism.languages.extend("clike", {
"string": {
pattern: /"(?:(?:"")?[^"])*"(?!")|'(?:[^'])*'/,
greedy: true
},
"keyword": /\b(?:breakOut|breakTo|call|case|catch|default|do|echo|else|execFSM|execVM|exitWith|for|forEach|forEachMember|forEachMemberAgent|forEachMemberTeam|from|goto|if|nil|preprocessFile|preprocessFileLineNumbers|private|scopeName|spawn|step|switch|then|throw|to|try|while|with)\b/i,
"boolean": /\b(?:false|true)\b/i,
"function": /\b(?:abs|accTime|acos|action|actionIDs|actionKeys|actionKeysImages|actionKeysNames|actionKeysNamesArray|actionName|actionParams|activateAddons|activatedAddons|activateKey|add3DENConnection|add3DENEventHandler|add3DENLayer|addAction|addBackpack|addBackpackCargo|addBackpackCargoGlobal|addBackpackGlobal|addCamShake|addCuratorAddons|addCuratorCameraArea|addCuratorEditableObjects|addCuratorEditingArea|addCuratorPoints|addEditorObject|addEventHandler|addForce|addForceGeneratorRTD|addGoggles|addGroupIcon|addHandgunItem|addHeadgear|addItem|addItemCargo|addItemCargoGlobal|addItemPool|addItemToBackpack|addItemToUniform|addItemToVest|addLiveStats|addMagazine|addMagazineAmmoCargo|addMagazineCargo|addMagazineCargoGlobal|addMagazineGlobal|addMagazinePool|addMagazines|addMagazineTurret|addMenu|addMenuItem|addMissionEventHandler|addMPEventHandler|addMusicEventHandler|addOwnedMine|addPlayerScores|addPrimaryWeaponItem|addPublicVariableEventHandler|addRating|addResources|addScore|addScoreSide|addSecondaryWeaponItem|addSwitchableUnit|addTeamMember|addToRemainsCollector|addTorque|addUniform|addVehicle|addVest|addWaypoint|addWeapon|addWeaponCargo|addWeaponCargoGlobal|addWeaponGlobal|addWeaponItem|addWeaponPool|addWeaponTurret|admin|agent|agents|AGLToASL|aimedAtTarget|aimPos|airDensityCurveRTD|airDensityRTD|airplaneThrottle|airportSide|AISFinishHeal|alive|all3DENEntities|allAirports|allControls|allCurators|allCutLayers|allDead|allDeadMen|allDisplays|allGroups|allMapMarkers|allMines|allMissionObjects|allow3DMode|allowCrewInImmobile|allowCuratorLogicIgnoreAreas|allowDamage|allowDammage|allowFileOperations|allowFleeing|allowGetIn|allowSprint|allPlayers|allSimpleObjects|allSites|allTurrets|allUnits|allUnitsUAV|allVariables|ammo|ammoOnPylon|animate|animateBay|animateDoor|animatePylon|animateSource|animationNames|animationPhase|animationSourcePhase|animationState|append|apply|armoryPoints|arrayIntersect|asin|ASLToAGL|ASLToATL|assert|assignAsCargo|assignAsCargoIndex|assignAsCommander|assignAsDriver|assignAsGunner|assignAsTurret|assignCurator|assignedCargo|assignedCommander|assignedDriver|assignedGunner|assignedItems|assignedTarget|assignedTeam|assignedVehicle|assignedVehicleRole|assignItem|assignTeam|assignToAirport|atan|atan2|atg|ATLToASL|attachedObject|attachedObjects|attachedTo|attachObject|attachTo|attackEnabled|backpack|backpackCargo|backpackContainer|backpackItems|backpackMagazines|backpackSpaceFor|behaviour|benchmark|binocular|blufor|boundingBox|boundingBoxReal|boundingCenter|briefingName|buildingExit|buildingPos|buldozer_EnableRoadDiag|buldozer_IsEnabledRoadDiag|buldozer_LoadNewRoads|buldozer_reloadOperMap|buttonAction|buttonSetAction|cadetMode|callExtension|camCommand|camCommit|camCommitPrepared|camCommitted|camConstuctionSetParams|camCreate|camDestroy|cameraEffect|cameraEffectEnableHUD|cameraInterest|cameraOn|cameraView|campaignConfigFile|camPreload|camPreloaded|camPrepareBank|camPrepareDir|camPrepareDive|camPrepareFocus|camPrepareFov|camPrepareFovRange|camPreparePos|camPrepareRelPos|camPrepareTarget|camSetBank|camSetDir|camSetDive|camSetFocus|camSetFov|camSetFovRange|camSetPos|camSetRelPos|camSetTarget|camTarget|camUseNVG|canAdd|canAddItemToBackpack|canAddItemToUniform|canAddItemToVest|cancelSimpleTaskDestination|canFire|canMove|canSlingLoad|canStand|canSuspend|canTriggerDynamicSimulation|canUnloadInCombat|canVehicleCargo|captive|captiveNum|cbChecked|cbSetChecked|ceil|channelEnabled|cheatsEnabled|checkAIFeature|checkVisibility|civilian|className|clear3DENAttribute|clear3DENInventory|clearAllItemsFromBackpack|clearBackpackCargo|clearBackpackCargoGlobal|clearForcesRTD|clearGroupIcons|clearItemCargo|clearItemCargoGlobal|clearItemPool|clearMagazineCargo|clearMagazineCargoGlobal|clearMagazinePool|clearOverlay|clearRadio|clearVehicleInit|clearWeaponCargo|clearWeaponCargoGlobal|clearWeaponPool|clientOwner|closeDialog|closeDisplay|closeOverlay|collapseObjectTree|collect3DENHistory|collectiveRTD|combatMode|commandArtilleryFire|commandChat|commander|commandFire|commandFollow|commandFSM|commandGetOut|commandingMenu|commandMove|commandRadio|commandStop|commandSuppressiveFire|commandTarget|commandWatch|comment|commitOverlay|compile|compileFinal|completedFSM|composeText|configClasses|configFile|configHierarchy|configName|configNull|configProperties|configSourceAddonList|configSourceMod|configSourceModList|confirmSensorTarget|connectTerminalToUAV|controlNull|controlsGroupCtrl|copyFromClipboard|copyToClipboard|copyWaypoints|cos|count|countEnemy|countFriendly|countSide|countType|countUnknown|create3DENComposition|create3DENEntity|createAgent|createCenter|createDialog|createDiaryLink|createDiaryRecord|createDiarySubject|createDisplay|createGearDialog|createGroup|createGuardedPoint|createLocation|createMarker|createMarkerLocal|createMenu|createMine|createMissionDisplay|createMPCampaignDisplay|createSimpleObject|createSimpleTask|createSite|createSoundSource|createTask|createTeam|createTrigger|createUnit|createVehicle|createVehicleCrew|createVehicleLocal|crew|ctAddHeader|ctAddRow|ctClear|ctCurSel|ctData|ctFindHeaderRows|ctFindRowHeader|ctHeaderControls|ctHeaderCount|ctRemoveHeaders|ctRemoveRows|ctrlActivate|ctrlAddEventHandler|ctrlAngle|ctrlAutoScrollDelay|ctrlAutoScrollRewind|ctrlAutoScrollSpeed|ctrlChecked|ctrlClassName|ctrlCommit|ctrlCommitted|ctrlCreate|ctrlDelete|ctrlEnable|ctrlEnabled|ctrlFade|ctrlHTMLLoaded|ctrlIDC|ctrlIDD|ctrlMapAnimAdd|ctrlMapAnimClear|ctrlMapAnimCommit|ctrlMapAnimDone|ctrlMapCursor|ctrlMapMouseOver|ctrlMapScale|ctrlMapScreenToWorld|ctrlMapWorldToScreen|ctrlModel|ctrlModelDirAndUp|ctrlModelScale|ctrlParent|ctrlParentControlsGroup|ctrlPosition|ctrlRemoveAllEventHandlers|ctrlRemoveEventHandler|ctrlScale|ctrlSetActiveColor|ctrlSetAngle|ctrlSetAutoScrollDelay|ctrlSetAutoScrollRewind|ctrlSetAutoScrollSpeed|ctrlSetBackgroundColor|ctrlSetChecked|ctrlSetDisabledColor|ctrlSetEventHandler|ctrlSetFade|ctrlSetFocus|ctrlSetFont|ctrlSetFontH1|ctrlSetFontH1B|ctrlSetFontH2|ctrlSetFontH2B|ctrlSetFontH3|ctrlSetFontH3B|ctrlSetFontH4|ctrlSetFontH4B|ctrlSetFontH5|ctrlSetFontH5B|ctrlSetFontH6|ctrlSetFontH6B|ctrlSetFontHeight|ctrlSetFontHeightH1|ctrlSetFontHeightH2|ctrlSetFontHeightH3|ctrlSetFontHeightH4|ctrlSetFontHeightH5|ctrlSetFontHeightH6|ctrlSetFontHeightSecondary|ctrlSetFontP|ctrlSetFontPB|ctrlSetFontSecondary|ctrlSetForegroundColor|ctrlSetModel|ctrlSetModelDirAndUp|ctrlSetModelScale|ctrlSetPixelPrecision|ctrlSetPosition|ctrlSetScale|ctrlSetStructuredText|ctrlSetText|ctrlSetTextColor|ctrlSetTextColorSecondary|ctrlSetTextSecondary|ctrlSetTooltip|ctrlSetTooltipColorBox|ctrlSetTooltipColorShade|ctrlSetTooltipColorText|ctrlShow|ctrlShown|ctrlText|ctrlTextHeight|ctrlTextSecondary|ctrlTextWidth|ctrlType|ctrlVisible|ctRowControls|ctRowCount|ctSetCurSel|ctSetData|ctSetHeaderTemplate|ctSetRowTemplate|ctSetValue|ctValue|curatorAddons|curatorCamera|curatorCameraArea|curatorCameraAreaCeiling|curatorCoef|curatorEditableObjects|curatorEditingArea|curatorEditingAreaType|curatorMouseOver|curatorPoints|curatorRegisteredObjects|curatorSelected|curatorWaypointCost|current3DENOperation|currentChannel|currentCommand|currentMagazine|currentMagazineDetail|currentMagazineDetailTurret|currentMagazineTurret|currentMuzzle|currentNamespace|currentTask|currentTasks|currentThrowable|currentVisionMode|currentWaypoint|currentWeapon|currentWeaponMode|currentWeaponTurret|currentZeroing|cursorObject|cursorTarget|customChat|customRadio|cutFadeOut|cutObj|cutRsc|cutText|damage|date|dateToNumber|daytime|deActivateKey|debriefingText|debugFSM|debugLog|deg|delete3DENEntities|deleteAt|deleteCenter|deleteCollection|deleteEditorObject|deleteGroup|deleteGroupWhenEmpty|deleteIdentity|deleteLocation|deleteMarker|deleteMarkerLocal|deleteRange|deleteResources|deleteSite|deleteStatus|deleteTeam|deleteVehicle|deleteVehicleCrew|deleteWaypoint|detach|detectedMines|diag_activeMissionFSMs|diag_activeScripts|diag_activeSQFScripts|diag_activeSQSScripts|diag_captureFrame|diag_captureFrameToFile|diag_captureSlowFrame|diag_codePerformance|diag_drawMode|diag_dynamicSimulationEnd|diag_enable|diag_enabled|diag_fps|diag_fpsMin|diag_frameNo|diag_lightNewLoad|diag_list|diag_log|diag_logSlowFrame|diag_mergeConfigFile|diag_recordTurretLimits|diag_setLightNew|diag_tickTime|diag_toggle|dialog|diarySubjectExists|didJIP|didJIPOwner|difficulty|difficultyEnabled|difficultyEnabledRTD|difficultyOption|direction|directSay|disableAI|disableCollisionWith|disableConversation|disableDebriefingStats|disableMapIndicators|disableNVGEquipment|disableRemoteSensors|disableSerialization|disableTIEquipment|disableUAVConnectability|disableUserInput|displayAddEventHandler|displayCtrl|displayNull|displayParent|displayRemoveAllEventHandlers|displayRemoveEventHandler|displaySetEventHandler|dissolveTeam|distance|distance2D|distanceSqr|distributionRegion|do3DENAction|doArtilleryFire|doFire|doFollow|doFSM|doGetOut|doMove|doorPhase|doStop|doSuppressiveFire|doTarget|doWatch|drawArrow|drawEllipse|drawIcon|drawIcon3D|drawLine|drawLine3D|drawLink|drawLocation|drawPolygon|drawRectangle|drawTriangle|driver|drop|dynamicSimulationDistance|dynamicSimulationDistanceCoef|dynamicSimulationEnabled|dynamicSimulationSystemEnabled|east|edit3DENMissionAttributes|editObject|editorSetEventHandler|effectiveCommander|emptyPositions|enableAI|enableAIFeature|enableAimPrecision|enableAttack|enableAudioFeature|enableAutoStartUpRTD|enableAutoTrimRTD|enableCamShake|enableCaustics|enableChannel|enableCollisionWith|enableCopilot|enableDebriefingStats|enableDiagLegend|enableDynamicSimulation|enableDynamicSimulationSystem|enableEndDialog|enableEngineArtillery|enableEnvironment|enableFatigue|enableGunLights|enableInfoPanelComponent|enableIRLasers|enableMimics|enablePersonTurret|enableRadio|enableReload|enableRopeAttach|enableSatNormalOnDetail|enableSaving|enableSentences|enableSimulation|enableSimulationGlobal|enableStamina|enableStressDamage|enableTeamSwitch|enableTraffic|enableUAVConnectability|enableUAVWaypoints|enableVehicleCargo|enableVehicleSensor|enableWeaponDisassembly|endl|endLoadingScreen|endMission|engineOn|enginesIsOnRTD|enginesPowerRTD|enginesRpmRTD|enginesTorqueRTD|entities|environmentEnabled|estimatedEndServerTime|estimatedTimeLeft|evalObjectArgument|everyBackpack|everyContainer|exec|execEditorScript|exp|expectedDestination|exportJIPMessages|eyeDirection|eyePos|face|faction|fadeMusic|fadeRadio|fadeSound|fadeSpeech|failMission|fillWeaponsFromPool|find|findCover|findDisplay|findEditorObject|findEmptyPosition|findEmptyPositionReady|findIf|findNearestEnemy|finishMissionInit|finite|fire|fireAtTarget|firstBackpack|flag|flagAnimationPhase|flagOwner|flagSide|flagTexture|fleeing|floor|flyInHeight|flyInHeightASL|fog|fogForecast|fogParams|forceAddUniform|forceAtPositionRTD|forcedMap|forceEnd|forceFlagTexture|forceFollowRoad|forceGeneratorRTD|forceMap|forceRespawn|forceSpeed|forceWalk|forceWeaponFire|forceWeatherChange|forgetTarget|format|formation|formationDirection|formationLeader|formationMembers|formationPosition|formationTask|formatText|formLeader|freeLook|fromEditor|fuel|fullCrew|gearIDCAmmoCount|gearSlotAmmoCount|gearSlotData|get3DENActionState|get3DENAttribute|get3DENCamera|get3DENConnections|get3DENEntity|get3DENEntityID|get3DENGrid|get3DENIconsVisible|get3DENLayerEntities|get3DENLinesVisible|get3DENMissionAttribute|get3DENMouseOver|get3DENSelected|getAimingCoef|getAllEnvSoundControllers|getAllHitPointsDamage|getAllOwnedMines|getAllSoundControllers|getAmmoCargo|getAnimAimPrecision|getAnimSpeedCoef|getArray|getArtilleryAmmo|getArtilleryComputerSettings|getArtilleryETA|getAssignedCuratorLogic|getAssignedCuratorUnit|getBackpackCargo|getBleedingRemaining|getBurningValue|getCameraViewDirection|getCargoIndex|getCenterOfMass|getClientState|getClientStateNumber|getCompatiblePylonMagazines|getConnectedUAV|getContainerMaxLoad|getCursorObjectParams|getCustomAimCoef|getDammage|getDescription|getDir|getDirVisual|getDLCAssetsUsage|getDLCAssetsUsageByName|getDLCs|getDLCUsageTime|getEditorCamera|getEditorMode|getEditorObjectScope|getElevationOffset|getEngineTargetRpmRTD|getEnvSoundController|getFatigue|getFieldManualStartPage|getForcedFlagTexture|getFriend|getFSMVariable|getFuelCargo|getGroupIcon|getGroupIconParams|getGroupIcons|getHideFrom|getHit|getHitIndex|getHitPointDamage|getItemCargo|getMagazineCargo|getMarkerColor|getMarkerPos|getMarkerSize|getMarkerType|getMass|getMissionConfig|getMissionConfigValue|getMissionDLCs|getMissionLayerEntities|getMissionLayers|getModelInfo|getMousePosition|getMusicPlayedTime|getNumber|getObjectArgument|getObjectChildren|getObjectDLC|getObjectMaterials|getObjectProxy|getObjectTextures|getObjectType|getObjectViewDistance|getOxygenRemaining|getPersonUsedDLCs|getPilotCameraDirection|getPilotCameraPosition|getPilotCameraRotation|getPilotCameraTarget|getPlateNumber|getPlayerChannel|getPlayerScores|getPlayerUID|getPlayerUIDOld|getPos|getPosASL|getPosASLVisual|getPosASLW|getPosATL|getPosATLVisual|getPosVisual|getPosWorld|getPylonMagazines|getRelDir|getRelPos|getRemoteSensorsDisabled|getRepairCargo|getResolution|getRotorBrakeRTD|getShadowDistance|getShotParents|getSlingLoad|getSoundController|getSoundControllerResult|getSpeed|getStamina|getStatValue|getSuppression|getTerrainGrid|getTerrainHeightASL|getText|getTotalDLCUsageTime|getTrimOffsetRTD|getUnitLoadout|getUnitTrait|getUserMFDText|getUserMFDValue|getVariable|getVehicleCargo|getWeaponCargo|getWeaponSway|getWingsOrientationRTD|getWingsPositionRTD|getWPPos|glanceAt|globalChat|globalRadio|goggles|group|groupChat|groupFromNetId|groupIconSelectable|groupIconsVisible|groupId|groupOwner|groupRadio|groupSelectedUnits|groupSelectUnit|grpNull|gunner|gusts|halt|handgunItems|handgunMagazine|handgunWeapon|handsHit|hasInterface|hasPilotCamera|hasWeapon|hcAllGroups|hcGroupParams|hcLeader|hcRemoveAllGroups|hcRemoveGroup|hcSelected|hcSelectGroup|hcSetGroup|hcShowBar|hcShownBar|headgear|hideBody|hideObject|hideObjectGlobal|hideSelection|hint|hintC|hintCadet|hintSilent|hmd|hostMission|htmlLoad|HUDMovementLevels|humidity|image|importAllGroups|importance|in|inArea|inAreaArray|incapacitatedState|independent|inflame|inflamed|infoPanel|infoPanelComponentEnabled|infoPanelComponents|infoPanels|inGameUISetEventHandler|inheritsFrom|initAmbientLife|inPolygon|inputAction|inRangeOfArtillery|insertEditorObject|intersect|is3DEN|is3DENMultiplayer|isAbleToBreathe|isAgent|isAimPrecisionEnabled|isArray|isAutoHoverOn|isAutonomous|isAutoStartUpEnabledRTD|isAutotest|isAutoTrimOnRTD|isBleeding|isBurning|isClass|isCollisionLightOn|isCopilotEnabled|isDamageAllowed|isDedicated|isDLCAvailable|isEngineOn|isEqualTo|isEqualType|isEqualTypeAll|isEqualTypeAny|isEqualTypeArray|isEqualTypeParams|isFilePatchingEnabled|isFlashlightOn|isFlatEmpty|isForcedWalk|isFormationLeader|isGroupDeletedWhenEmpty|isHidden|isInRemainsCollector|isInstructorFigureEnabled|isIRLaserOn|isKeyActive|isKindOf|isLaserOn|isLightOn|isLocalized|isManualFire|isMarkedForCollection|isMultiplayer|isMultiplayerSolo|isNil|isNull|isNumber|isObjectHidden|isObjectRTD|isOnRoad|isPipEnabled|isPlayer|isRealTime|isRemoteExecuted|isRemoteExecutedJIP|isServer|isShowing3DIcons|isSimpleObject|isSprintAllowed|isStaminaEnabled|isSteamMission|isStreamFriendlyUIEnabled|isStressDamageEnabled|isText|isTouchingGround|isTurnedOut|isTutHintsEnabled|isUAVConnectable|isUAVConnected|isUIContext|isUniformAllowed|isVehicleCargo|isVehicleRadarOn|isVehicleSensorEnabled|isWalking|isWeaponDeployed|isWeaponRested|itemCargo|items|itemsWithMagazines|join|joinAs|joinAsSilent|joinSilent|joinString|kbAddDatabase|kbAddDatabaseTargets|kbAddTopic|kbHasTopic|kbReact|kbRemoveTopic|kbTell|kbWasSaid|keyImage|keyName|knowsAbout|land|landAt|landResult|language|laserTarget|lbAdd|lbClear|lbColor|lbColorRight|lbCurSel|lbData|lbDelete|lbIsSelected|lbPicture|lbPictureRight|lbSelection|lbSetColor|lbSetColorRight|lbSetCurSel|lbSetData|lbSetPicture|lbSetPictureColor|lbSetPictureColorDisabled|lbSetPictureColorSelected|lbSetPictureRight|lbSetPictureRightColor|lbSetPictureRightColorDisabled|lbSetPictureRightColorSelected|lbSetSelectColor|lbSetSelectColorRight|lbSetSelected|lbSetText|lbSetTextRight|lbSetTooltip|lbSetValue|lbSize|lbSort|lbSortByValue|lbText|lbTextRight|lbValue|leader|leaderboardDeInit|leaderboardGetRows|leaderboardInit|leaderboardRequestRowsFriends|leaderboardRequestRowsGlobal|leaderboardRequestRowsGlobalAroundUser|leaderboardsRequestUploadScore|leaderboardsRequestUploadScoreKeepBest|leaderboardState|leaveVehicle|libraryCredits|libraryDisclaimers|lifeState|lightAttachObject|lightDetachObject|lightIsOn|lightnings|limitSpeed|linearConversion|lineBreak|lineIntersects|lineIntersectsObjs|lineIntersectsSurfaces|lineIntersectsWith|linkItem|list|listObjects|listRemoteTargets|listVehicleSensors|ln|lnbAddArray|lnbAddColumn|lnbAddRow|lnbClear|lnbColor|lnbColorRight|lnbCurSelRow|lnbData|lnbDeleteColumn|lnbDeleteRow|lnbGetColumnsPosition|lnbPicture|lnbPictureRight|lnbSetColor|lnbSetColorRight|lnbSetColumnsPos|lnbSetCurSelRow|lnbSetData|lnbSetPicture|lnbSetPictureColor|lnbSetPictureColorRight|lnbSetPictureColorSelected|lnbSetPictureColorSelectedRight|lnbSetPictureRight|lnbSetText|lnbSetTextRight|lnbSetValue|lnbSize|lnbSort|lnbSortByValue|lnbText|lnbTextRight|lnbValue|load|loadAbs|loadBackpack|loadFile|loadGame|loadIdentity|loadMagazine|loadOverlay|loadStatus|loadUniform|loadVest|local|localize|locationNull|locationPosition|lock|lockCameraTo|lockCargo|lockDriver|locked|lockedCargo|lockedDriver|lockedTurret|lockIdentity|lockTurret|lockWP|log|logEntities|logNetwork|logNetworkTerminate|lookAt|lookAtPos|magazineCargo|magazines|magazinesAllTurrets|magazinesAmmo|magazinesAmmoCargo|magazinesAmmoFull|magazinesDetail|magazinesDetailBackpack|magazinesDetailUniform|magazinesDetailVest|magazinesTurret|magazineTurretAmmo|mapAnimAdd|mapAnimClear|mapAnimCommit|mapAnimDone|mapCenterOnCamera|mapGridPosition|markAsFinishedOnSteam|markerAlpha|markerBrush|markerColor|markerDir|markerPos|markerShape|markerSize|markerText|markerType|max|members|menuAction|menuAdd|menuChecked|menuClear|menuCollapse|menuData|menuDelete|menuEnable|menuEnabled|menuExpand|menuHover|menuPicture|menuSetAction|menuSetCheck|menuSetData|menuSetPicture|menuSetValue|menuShortcut|menuShortcutText|menuSize|menuSort|menuText|menuURL|menuValue|min|mineActive|mineDetectedBy|missionConfigFile|missionDifficulty|missionName|missionNamespace|missionStart|missionVersion|modelToWorld|modelToWorldVisual|modelToWorldVisualWorld|modelToWorldWorld|modParams|moonIntensity|moonPhase|morale|move|move3DENCamera|moveInAny|moveInCargo|moveInCommander|moveInDriver|moveInGunner|moveInTurret|moveObjectToEnd|moveOut|moveTime|moveTo|moveToCompleted|moveToFailed|musicVolume|name|nameSound|nearEntities|nearestBuilding|nearestLocation|nearestLocations|nearestLocationWithDubbing|nearestObject|nearestObjects|nearestTerrainObjects|nearObjects|nearObjectsReady|nearRoads|nearSupplies|nearTargets|needReload|netId|netObjNull|newOverlay|nextMenuItemIndex|nextWeatherChange|nMenuItems|numberOfEnginesRTD|numberToDate|objectCurators|objectFromNetId|objectParent|objNull|objStatus|onBriefingGear|onBriefingGroup|onBriefingNotes|onBriefingPlan|onBriefingTeamSwitch|onCommandModeChanged|onDoubleClick|onEachFrame|onGroupIconClick|onGroupIconOverEnter|onGroupIconOverLeave|onHCGroupSelectionChanged|onMapSingleClick|onPlayerConnected|onPlayerDisconnected|onPreloadFinished|onPreloadStarted|onShowNewObject|onTeamSwitch|openCuratorInterface|openDLCPage|openDSInterface|openMap|openSteamApp|openYoutubeVideo|opfor|orderGetIn|overcast|overcastForecast|owner|param|params|parseNumber|parseSimpleArray|parseText|parsingNamespace|particlesQuality|pi|pickWeaponPool|pitch|pixelGrid|pixelGridBase|pixelGridNoUIScale|pixelH|pixelW|playableSlotsNumber|playableUnits|playAction|playActionNow|player|playerRespawnTime|playerSide|playersNumber|playGesture|playMission|playMove|playMoveNow|playMusic|playScriptedMission|playSound|playSound3D|position|positionCameraToWorld|posScreenToWorld|posWorldToScreen|ppEffectAdjust|ppEffectCommit|ppEffectCommitted|ppEffectCreate|ppEffectDestroy|ppEffectEnable|ppEffectEnabled|ppEffectForceInNVG|precision|preloadCamera|preloadObject|preloadSound|preloadTitleObj|preloadTitleRsc|primaryWeapon|primaryWeaponItems|primaryWeaponMagazine|priority|processDiaryLink|processInitCommands|productVersion|profileName|profileNamespace|profileNameSteam|progressLoadingScreen|progressPosition|progressSetPosition|publicVariable|publicVariableClient|publicVariableServer|pushBack|pushBackUnique|putWeaponPool|queryItemsPool|queryMagazinePool|queryWeaponPool|rad|radioChannelAdd|radioChannelCreate|radioChannelRemove|radioChannelSetCallSign|radioChannelSetLabel|radioVolume|rain|rainbow|random|rank|rankId|rating|rectangular|registeredTasks|registerTask|reload|reloadEnabled|remoteControl|remoteExec|remoteExecCall|remoteExecutedOwner|remove3DENConnection|remove3DENEventHandler|remove3DENLayer|removeAction|removeAll3DENEventHandlers|removeAllActions|removeAllAssignedItems|removeAllContainers|removeAllCuratorAddons|removeAllCuratorCameraAreas|removeAllCuratorEditingAreas|removeAllEventHandlers|removeAllHandgunItems|removeAllItems|removeAllItemsWithMagazines|removeAllMissionEventHandlers|removeAllMPEventHandlers|removeAllMusicEventHandlers|removeAllOwnedMines|removeAllPrimaryWeaponItems|removeAllWeapons|removeBackpack|removeBackpackGlobal|removeCuratorAddons|removeCuratorCameraArea|removeCuratorEditableObjects|removeCuratorEditingArea|removeDrawIcon|removeDrawLinks|removeEventHandler|removeFromRemainsCollector|removeGoggles|removeGroupIcon|removeHandgunItem|removeHeadgear|removeItem|removeItemFromBackpack|removeItemFromUniform|removeItemFromVest|removeItems|removeMagazine|removeMagazineGlobal|removeMagazines|removeMagazinesTurret|removeMagazineTurret|removeMenuItem|removeMissionEventHandler|removeMPEventHandler|removeMusicEventHandler|removeOwnedMine|removePrimaryWeaponItem|removeSecondaryWeaponItem|removeSimpleTask|removeSwitchableUnit|removeTeamMember|removeUniform|removeVest|removeWeapon|removeWeaponAttachmentCargo|removeWeaponCargo|removeWeaponGlobal|removeWeaponTurret|reportRemoteTarget|requiredVersion|resetCamShake|resetSubgroupDirection|resistance|resize|resources|respawnVehicle|restartEditorCamera|reveal|revealMine|reverse|reversedMouseY|roadAt|roadsConnectedTo|roleDescription|ropeAttachedObjects|ropeAttachedTo|ropeAttachEnabled|ropeAttachTo|ropeCreate|ropeCut|ropeDestroy|ropeDetach|ropeEndPosition|ropeLength|ropes|ropeUnwind|ropeUnwound|rotorsForcesRTD|rotorsRpmRTD|round|runInitScript|safeZoneH|safeZoneW|safeZoneWAbs|safeZoneX|safeZoneXAbs|safeZoneY|save3DENInventory|saveGame|saveIdentity|saveJoysticks|saveOverlay|saveProfileNamespace|saveStatus|saveVar|savingEnabled|say|say2D|say3D|score|scoreSide|screenshot|screenToWorld|scriptDone|scriptName|scriptNull|scudState|secondaryWeapon|secondaryWeaponItems|secondaryWeaponMagazine|select|selectBestPlaces|selectDiarySubject|selectedEditorObjects|selectEditorObject|selectionNames|selectionPosition|selectLeader|selectMax|selectMin|selectNoPlayer|selectPlayer|selectRandom|selectRandomWeighted|selectWeapon|selectWeaponTurret|sendAUMessage|sendSimpleCommand|sendTask|sendTaskResult|sendUDPMessage|serverCommand|serverCommandAvailable|serverCommandExecutable|serverName|serverTime|set|set3DENAttribute|set3DENAttributes|set3DENGrid|set3DENIconsVisible|set3DENLayer|set3DENLinesVisible|set3DENLogicType|set3DENMissionAttribute|set3DENMissionAttributes|set3DENModelsVisible|set3DENObjectType|set3DENSelected|setAccTime|setActualCollectiveRTD|setAirplaneThrottle|setAirportSide|setAmmo|setAmmoCargo|setAmmoOnPylon|setAnimSpeedCoef|setAperture|setApertureNew|setArmoryPoints|setAttributes|setAutonomous|setBehaviour|setBleedingRemaining|setBrakesRTD|setCameraInterest|setCamShakeDefParams|setCamShakeParams|setCamUseTI|setCaptive|setCenterOfMass|setCollisionLight|setCombatMode|setCompassOscillation|setConvoySeparation|setCuratorCameraAreaCeiling|setCuratorCoef|setCuratorEditingAreaType|setCuratorWaypointCost|setCurrentChannel|setCurrentTask|setCurrentWaypoint|setCustomAimCoef|setCustomWeightRTD|setDamage|setDammage|setDate|setDebriefingText|setDefaultCamera|setDestination|setDetailMapBlendPars|setDir|setDirection|setDrawIcon|setDriveOnPath|setDropInterval|setDynamicSimulationDistance|setDynamicSimulationDistanceCoef|setEditorMode|setEditorObjectScope|setEffectCondition|setEngineRpmRTD|setFace|setFaceAnimation|setFatigue|setFeatureType|setFlagAnimationPhase|setFlagOwner|setFlagSide|setFlagTexture|setFog|setForceGeneratorRTD|setFormation|setFormationTask|setFormDir|setFriend|setFromEditor|setFSMVariable|setFuel|setFuelCargo|setGroupIcon|setGroupIconParams|setGroupIconsSelectable|setGroupIconsVisible|setGroupId|setGroupIdGlobal|setGroupOwner|setGusts|setHideBehind|setHit|setHitIndex|setHitPointDamage|setHorizonParallaxCoef|setHUDMovementLevels|setIdentity|setImportance|setInfoPanel|setLeader|setLightAmbient|setLightAttenuation|setLightBrightness|setLightColor|setLightDayLight|setLightFlareMaxDistance|setLightFlareSize|setLightIntensity|setLightnings|setLightUseFlare|setLocalWindParams|setMagazineTurretAmmo|setMarkerAlpha|setMarkerAlphaLocal|setMarkerBrush|setMarkerBrushLocal|setMarkerColor|setMarkerColorLocal|setMarkerDir|setMarkerDirLocal|setMarkerPos|setMarkerPosLocal|setMarkerShape|setMarkerShapeLocal|setMarkerSize|setMarkerSizeLocal|setMarkerText|setMarkerTextLocal|setMarkerType|setMarkerTypeLocal|setMass|setMimic|setMousePosition|setMusicEffect|setMusicEventHandler|setName|setNameSound|setObjectArguments|setObjectMaterial|setObjectMaterialGlobal|setObjectProxy|setObjectTexture|setObjectTextureGlobal|setObjectViewDistance|setOvercast|setOwner|setOxygenRemaining|setParticleCircle|setParticleClass|setParticleFire|setParticleParams|setParticleRandom|setPilotCameraDirection|setPilotCameraRotation|setPilotCameraTarget|setPilotLight|setPiPEffect|setPitch|setPlateNumber|setPlayable|setPlayerRespawnTime|setPos|setPosASL|setPosASL2|setPosASLW|setPosATL|setPosition|setPosWorld|setPylonLoadOut|setPylonsPriority|setRadioMsg|setRain|setRainbow|setRandomLip|setRank|setRectangular|setRepairCargo|setRotorBrakeRTD|setShadowDistance|setShotParents|setSide|setSimpleTaskAlwaysVisible|setSimpleTaskCustomData|setSimpleTaskDescription|setSimpleTaskDestination|setSimpleTaskTarget|setSimpleTaskType|setSimulWeatherLayers|setSize|setSkill|setSlingLoad|setSoundEffect|setSpeaker|setSpeech|setSpeedMode|setStamina|setStaminaScheme|setStatValue|setSuppression|setSystemOfUnits|setTargetAge|setTaskMarkerOffset|setTaskResult|setTaskState|setTerrainGrid|setText|setTimeMultiplier|setTitleEffect|setToneMapping|setToneMappingParams|setTrafficDensity|setTrafficDistance|setTrafficGap|setTrafficSpeed|setTriggerActivation|setTriggerArea|setTriggerStatements|setTriggerText|setTriggerTimeout|setTriggerType|setType|setUnconscious|setUnitAbility|setUnitLoadout|setUnitPos|setUnitPosWeak|setUnitRank|setUnitRecoilCoefficient|setUnitTrait|setUnloadInCombat|setUserActionText|setUserMFDText|setUserMFDValue|setVariable|setVectorDir|setVectorDirAndUp|setVectorUp|setVehicleAmmo|setVehicleAmmoDef|setVehicleArmor|setVehicleCargo|setVehicleId|setVehicleInit|setVehicleLock|setVehiclePosition|setVehicleRadar|setVehicleReceiveRemoteTargets|setVehicleReportOwnPosition|setVehicleReportRemoteTargets|setVehicleTIPars|setVehicleVarName|setVelocity|setVelocityModelSpace|setVelocityTransformation|setViewDistance|setVisibleIfTreeCollapsed|setWantedRpmRTD|setWaves|setWaypointBehaviour|setWaypointCombatMode|setWaypointCompletionRadius|setWaypointDescription|setWaypointForceBehaviour|setWaypointFormation|setWaypointHousePosition|setWaypointLoiterRadius|setWaypointLoiterType|setWaypointName|setWaypointPosition|setWaypointScript|setWaypointSpeed|setWaypointStatements|setWaypointTimeout|setWaypointType|setWaypointVisible|setWeaponReloadingTime|setWind|setWindDir|setWindForce|setWindStr|setWingForceScaleRTD|setWPPos|show3DIcons|showChat|showCinemaBorder|showCommandingMenu|showCompass|showCuratorCompass|showGPS|showHUD|showLegend|showMap|shownArtilleryComputer|shownChat|shownCompass|shownCuratorCompass|showNewEditorObject|shownGPS|shownHUD|shownMap|shownPad|shownRadio|shownScoretable|shownUAVFeed|shownWarrant|shownWatch|showPad|showRadio|showScoretable|showSubtitles|showUAVFeed|showWarrant|showWatch|showWaypoint|showWaypoints|side|sideAmbientLife|sideChat|sideEmpty|sideEnemy|sideFriendly|sideLogic|sideRadio|sideUnknown|simpleTasks|simulationEnabled|simulCloudDensity|simulCloudOcclusion|simulInClouds|simulWeatherSync|sin|size|sizeOf|skill|skillFinal|skipTime|sleep|sliderPosition|sliderRange|sliderSetPosition|sliderSetRange|sliderSetSpeed|sliderSpeed|slingLoadAssistantShown|soldierMagazines|someAmmo|sort|soundVolume|speaker|speed|speedMode|splitString|sqrt|squadParams|stance|startLoadingScreen|stop|stopEngineRTD|stopped|str|sunOrMoon|supportInfo|suppressFor|surfaceIsWater|surfaceNormal|surfaceType|swimInDepth|switchableUnits|switchAction|switchCamera|switchGesture|switchLight|switchMove|synchronizedObjects|synchronizedTriggers|synchronizedWaypoints|synchronizeObjectsAdd|synchronizeObjectsRemove|synchronizeTrigger|synchronizeWaypoint|systemChat|systemOfUnits|tan|targetKnowledge|targets|targetsAggregate|targetsQuery|taskAlwaysVisible|taskChildren|taskCompleted|taskCustomData|taskDescription|taskDestination|taskHint|taskMarkerOffset|taskNull|taskParent|taskResult|taskState|taskType|teamMember|teamMemberNull|teamName|teams|teamSwitch|teamSwitchEnabled|teamType|terminate|terrainIntersect|terrainIntersectASL|terrainIntersectAtASL|text|textLog|textLogFormat|tg|time|timeMultiplier|titleCut|titleFadeOut|titleObj|titleRsc|titleText|toArray|toFixed|toLower|toString|toUpper|triggerActivated|triggerActivation|triggerArea|triggerAttachedVehicle|triggerAttachObject|triggerAttachVehicle|triggerDynamicSimulation|triggerStatements|triggerText|triggerTimeout|triggerTimeoutCurrent|triggerType|turretLocal|turretOwner|turretUnit|tvAdd|tvClear|tvCollapse|tvCollapseAll|tvCount|tvCurSel|tvData|tvDelete|tvExpand|tvExpandAll|tvPicture|tvPictureRight|tvSetColor|tvSetCurSel|tvSetData|tvSetPicture|tvSetPictureColor|tvSetPictureColorDisabled|tvSetPictureColorSelected|tvSetPictureRight|tvSetPictureRightColor|tvSetPictureRightColorDisabled|tvSetPictureRightColorSelected|tvSetSelectColor|tvSetText|tvSetTooltip|tvSetValue|tvSort|tvSortByValue|tvText|tvTooltip|tvValue|type|typeName|typeOf|UAVControl|uiNamespace|uiSleep|unassignCurator|unassignItem|unassignTeam|unassignVehicle|underwater|uniform|uniformContainer|uniformItems|uniformMagazines|unitAddons|unitAimPosition|unitAimPositionVisual|unitBackpack|unitIsUAV|unitPos|unitReady|unitRecoilCoefficient|units|unitsBelowHeight|unlinkItem|unlockAchievement|unregisterTask|updateDrawIcon|updateMenuItem|updateObjectTree|useAIOperMapObstructionTest|useAISteeringComponent|useAudioTimeForMoves|userInputDisabled|vectorAdd|vectorCos|vectorCrossProduct|vectorDiff|vectorDir|vectorDirVisual|vectorDistance|vectorDistanceSqr|vectorDotProduct|vectorFromTo|vectorMagnitude|vectorMagnitudeSqr|vectorModelToWorld|vectorModelToWorldVisual|vectorMultiply|vectorNormalized|vectorUp|vectorUpVisual|vectorWorldToModel|vectorWorldToModelVisual|vehicle|vehicleCargoEnabled|vehicleChat|vehicleRadio|vehicleReceiveRemoteTargets|vehicleReportOwnPosition|vehicleReportRemoteTargets|vehicles|vehicleVarName|velocity|velocityModelSpace|verifySignature|vest|vestContainer|vestItems|vestMagazines|viewDistance|visibleCompass|visibleGPS|visibleMap|visiblePosition|visiblePositionASL|visibleScoretable|visibleWatch|waitUntil|waves|waypointAttachedObject|waypointAttachedVehicle|waypointAttachObject|waypointAttachVehicle|waypointBehaviour|waypointCombatMode|waypointCompletionRadius|waypointDescription|waypointForceBehaviour|waypointFormation|waypointHousePosition|waypointLoiterRadius|waypointLoiterType|waypointName|waypointPosition|waypoints|waypointScript|waypointsEnabledUAV|waypointShow|waypointSpeed|waypointStatements|waypointTimeout|waypointTimeoutCurrent|waypointType|waypointVisible|weaponAccessories|weaponAccessoriesCargo|weaponCargo|weaponDirection|weaponInertia|weaponLowered|weapons|weaponsItems|weaponsItemsCargo|weaponState|weaponsTurret|weightRTD|west|WFSideText|wind|windDir|windRTD|windStr|wingsForcesRTD|worldName|worldSize|worldToModel|worldToModelVisual|worldToScreen)\b/i,
"number": /(?:\$|\b0x)[\da-f]+\b|(?:\B\.\d+|\b\d+(?:\.\d+)?)(?:e[+-]?\d+)?\b/i,
"operator": /##|>>|&&|\|\||[!=<>]=?|[-+*/%#^]|\b(?:and|mod|not|or)\b/i,
"magic-variable": {
pattern: /\b(?:this|thisList|thisTrigger|_exception|_fnc_scriptName|_fnc_scriptNameParent|_forEachIndex|_this|_thisEventHandler|_thisFSM|_thisScript|_x)\b/i,
alias: "keyword"
},
"constant": /\bDIK(?:_[a-z\d]+)+\b/i
});
Prism.languages.insertBefore("sqf", "string", {
"macro": {
pattern: /(^[ \t]*)#[a-z](?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,
lookbehind: true,
greedy: true,
alias: "property",
inside: {
"directive": {
pattern: /#[a-z]+\b/i,
alias: "keyword"
},
"comment": Prism.languages.sqf.comment
}
}
});
delete Prism.languages.sqf["class-name"];
Prism.languages.squirrel = Prism.languages.extend("clike", {
"comment": [
Prism.languages.clike["comment"][0],
{
pattern: /(^|[^\\:])(?:\/\/|#).*/,
lookbehind: true,
greedy: true
}
],
"string": {
pattern: /(^|[^\\"'@])(?:@"(?:[^"]|"")*"(?!")|"(?:[^\\\r\n"]|\\.)*")/,
lookbehind: true,
greedy: true
},
"class-name": {
pattern: /(\b(?:class|enum|extends|instanceof)\s+)\w+(?:\.\w+)*/,
lookbehind: true,
inside: {
"punctuation": /\./
}
},
"keyword": /\b(?:__FILE__|__LINE__|base|break|case|catch|class|clone|const|constructor|continue|default|delete|else|enum|extends|for|foreach|function|if|in|instanceof|local|null|resume|return|static|switch|this|throw|try|typeof|while|yield)\b/,
"number": /\b(?:0x[0-9a-fA-F]+|\d+(?:\.(?:\d+|[eE][+-]?\d+))?)\b/,
"operator": /\+\+|--|<=>|<[-<]|>>>?|&&?|\|\|?|[-+*/%!=<>]=?|[~^]|::?/,
"punctuation": /[(){}\[\],;.]/
});
Prism.languages.insertBefore("squirrel", "string", {
"char": {
pattern: /(^|[^\\"'])'(?:[^\\']|\\(?:[xuU][0-9a-fA-F]{0,8}|[\s\S]))'/,
lookbehind: true,
greedy: true
}
});
Prism.languages.insertBefore("squirrel", "operator", {
"attribute-punctuation": {
pattern: /<\/|\/>/,
alias: "important"
},
"lambda": {
pattern: /@(?=\()/,
alias: "operator"
}
});
(function(Prism2) {
var higherOrderFunctions = /\b(?:algebra_solver|algebra_solver_newton|integrate_1d|integrate_ode|integrate_ode_bdf|integrate_ode_rk45|map_rect|ode_(?:adams|bdf|ckrk|rk45)(?:_tol)?|ode_adjoint_tol_ctl|reduce_sum|reduce_sum_static)\b/;
Prism2.languages.stan = {
"comment": /\/\/.*|\/\*[\s\S]*?\*\/|#(?!include).*/,
"string": {
pattern: /"[\x20\x21\x23-\x5B\x5D-\x7E]*"/,
greedy: true
},
"directive": {
pattern: /^([ \t]*)#include\b.*/m,
lookbehind: true,
alias: "property"
},
"function-arg": {
pattern: RegExp("(" + higherOrderFunctions.source + /\s*\(\s*/.source + ")" + /[a-zA-Z]\w*/.source),
lookbehind: true,
alias: "function"
},
"constraint": {
pattern: /(\b(?:int|matrix|real|row_vector|vector)\s*)<[^<>]*>/,
lookbehind: true,
inside: {
"expression": {
pattern: /(=\s*)\S(?:\S|\s+(?!\s))*?(?=\s*(?:>$|,\s*\w+\s*=))/,
lookbehind: true,
inside: null
},
"property": /\b[a-z]\w*(?=\s*=)/i,
"operator": /=/,
"punctuation": /^<|>$|,/
}
},
"keyword": [
{
pattern: /\bdata(?=\s*\{)|\b(?:functions|generated|model|parameters|quantities|transformed)\b/,
alias: "program-block"
},
/\b(?:array|break|cholesky_factor_corr|cholesky_factor_cov|complex|continue|corr_matrix|cov_matrix|data|else|for|if|in|increment_log_prob|int|matrix|ordered|positive_ordered|print|real|reject|return|row_vector|simplex|target|unit_vector|vector|void|while)\b/,
higherOrderFunctions
],
"function": /\b[a-z]\w*(?=\s*\()/i,
"number": /(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:E[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,
"boolean": /\b(?:false|true)\b/,
"operator": /<-|\.[*/]=?|\|\|?|&&|[!=<>+\-*/]=?|['^%~?:]/,
"punctuation": /[()\[\]{},;]/
};
Prism2.languages.stan.constraint.inside.expression.inside = Prism2.languages.stan;
})(Prism);
Prism.languages.stata = {
"comment": [
{
pattern: /(^[ \t]*)\*.*/m,
lookbehind: true,
greedy: true
},
{
pattern: /(^|\s)\/\/.*|\/\*[\s\S]*?\*\//,
lookbehind: true,
greedy: true
}
],
"string-literal": {
pattern: /"[^"\r\n]*"|[‘`']".*?"[’`']/,
greedy: true,
inside: {
"interpolation": {
pattern: /\$\{[^{}]*\}|[‘`']\w[^’`'\r\n]*[’`']/,
inside: {
"punctuation": /^\$\{|\}$/,
"expression": {
pattern: /[\s\S]+/,
inside: null
}
}
},
"string": /[\s\S]+/
}
},
"mata": {
pattern: /(^[ \t]*mata[ \t]*:)[\s\S]+?(?=^end\b)/m,
lookbehind: true,
greedy: true,
alias: "language-mata",
inside: Prism.languages.mata
},
"java": {
pattern: /(^[ \t]*java[ \t]*:)[\s\S]+?(?=^end\b)/m,
lookbehind: true,
greedy: true,
alias: "language-java",
inside: Prism.languages.java
},
"python": {
pattern: /(^[ \t]*python[ \t]*:)[\s\S]+?(?=^end\b)/m,
lookbehind: true,
greedy: true,
alias: "language-python",
inside: Prism.languages.python
},
"command": {
pattern: /(^[ \t]*(?:\.[ \t]+)?(?:(?:bayes|bootstrap|by|bysort|capture|collect|fmm|fp|frame|jackknife|mfp|mi|nestreg|noisily|permute|quietly|rolling|simulate|statsby|stepwise|svy|version|xi)\b[^:\r\n]*:[ \t]*|(?:capture|noisily|quietly|version)[ \t]+)?)[a-zA-Z]\w*/m,
lookbehind: true,
greedy: true,
alias: "keyword"
},
"variable": /\$\w+|[‘`']\w[^’`'\r\n]*[’`']/,
"keyword": /\b(?:bayes|bootstrap|by|bysort|capture|clear|collect|fmm|fp|frame|if|in|jackknife|mi[ \t]+estimate|mfp|nestreg|noisily|of|permute|quietly|rolling|simulate|sort|statsby|stepwise|svy|varlist|version|xi)\b/,
"boolean": /\b(?:off|on)\b/,
"number": /\b\d+(?:\.\d+)?\b|\B\.\d+/,
"function": /\b[a-z_]\w*(?=\()/i,
"operator": /\+\+|--|##?|[<>!=~]=?|[+\-*^&|/]/,
"punctuation": /[(){}[\],:]/
};
Prism.languages.stata["string-literal"].inside.interpolation.inside.expression.inside = Prism.languages.stata;
Prism.languages.iecst = {
"comment": [
{
pattern: /(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\(\*[\s\S]*?(?:\*\)|$)|\{[\s\S]*?(?:\}|$))/,
lookbehind: true,
greedy: true
},
{
pattern: /(^|[^\\:])\/\/.*/,
lookbehind: true,
greedy: true
}
],
"string": {
pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"keyword": [
/\b(?:END_)?(?:PROGRAM|CONFIGURATION|INTERFACE|FUNCTION_BLOCK|FUNCTION|ACTION|TRANSITION|TYPE|STRUCT|(?:INITIAL_)?STEP|NAMESPACE|LIBRARY|CHANNEL|FOLDER|RESOURCE|VAR_(?:ACCESS|CONFIG|EXTERNAL|GLOBAL|INPUT|IN_OUT|OUTPUT|TEMP)|VAR|METHOD|PROPERTY)\b/i,
/\b(?:AT|BY|(?:END_)?(?:CASE|FOR|IF|REPEAT|WHILE)|CONSTANT|CONTINUE|DO|ELSE|ELSIF|EXIT|EXTENDS|FROM|GET|GOTO|IMPLEMENTS|JMP|NON_RETAIN|OF|PRIVATE|PROTECTED|PUBLIC|RETAIN|RETURN|SET|TASK|THEN|TO|UNTIL|USING|WITH|__CATCH|__ENDTRY|__FINALLY|__TRY)\b/
],
"class-name": /\b(?:ANY|ARRAY|BOOL|BYTE|U?(?:D|L|S)?INT|(?:D|L)?WORD|DATE(?:_AND_TIME)?|DT|L?REAL|POINTER|STRING|TIME(?:_OF_DAY)?|TOD)\b/,
"address": {
pattern: /%[IQM][XBWDL][\d.]*|%[IQ][\d.]*/,
alias: "symbol"
},
"number": /\b(?:16#[\da-f]+|2#[01_]+|0x[\da-f]+)\b|\b(?:D|DT|T|TOD)#[\d_shmd:]*|\b[A-Z]*#[\d.,_]*|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
"boolean": /\b(?:FALSE|NULL|TRUE)\b/,
"operator": /S?R?:?=>?|&&?|\*\*?|<[=>]?|>=?|[-:^/+#]|\b(?:AND|EQ|EXPT|GE|GT|LE|LT|MOD|NE|NOT|OR|XOR)\b/,
"function": /\b[a-z_]\w*(?=\s*\()/i,
"punctuation": /[()[\].,;]/
};
(function(Prism2) {
var unit = {
pattern: /(\b\d+)(?:%|[a-z]+)/,
lookbehind: true
};
var number = {
pattern: /(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,
lookbehind: true
};
var inside = {
"comment": {
pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,
lookbehind: true
},
"url": {
pattern: /\burl\((["']?).*?\1\)/i,
greedy: true
},
"string": {
pattern: /("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,
greedy: true
},
"interpolation": null,
"func": null,
"important": /\B!(?:important|optional)\b/i,
"keyword": {
pattern: /(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,
lookbehind: true
},
"hexcode": /#[\da-f]{3,6}/i,
"color": [
/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,
{
pattern: /\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,
inside: {
"unit": unit,
"number": number,
"function": /[\w-]+(?=\()/,
"punctuation": /[(),]/
}
}
],
"entity": /\\[\da-f]{1,8}/i,
"unit": unit,
"boolean": /\b(?:false|true)\b/,
"operator": [
/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/
],
"number": number,
"punctuation": /[{}()\[\];:,]/
};
inside["interpolation"] = {
pattern: /\{[^\r\n}:]+\}/,
alias: "variable",
inside: {
"delimiter": {
pattern: /^\{|\}$/,
alias: "punctuation"
},
rest: inside
}
};
inside["func"] = {
pattern: /[\w-]+\([^)]*\).*/,
inside: {
"function": /^[^(]+/,
rest: inside
}
};
Prism2.languages.stylus = {
"atrule-declaration": {
pattern: /(^[ \t]*)@.+/m,
lookbehind: true,
inside: {
"atrule": /^@[\w-]+/,
rest: inside
}
},
"variable-declaration": {
pattern: /(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,
lookbehind: true,
inside: {
"variable": /^\S+/,
rest: inside
}
},
"statement": {
pattern: /(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,
lookbehind: true,
inside: {
"keyword": /^\S+/,
rest: inside
}
},
"property-declaration": {
pattern: /((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,
lookbehind: true,
inside: {
"property": {
pattern: /^[^\s:]+/,
inside: {
"interpolation": inside.interpolation
}
},
rest: inside
}
},
"selector": {
pattern: /(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,
lookbehind: true,
inside: {
"interpolation": inside.interpolation,
"comment": inside.comment,
"punctuation": /[{},]/
}
},
"func": inside.func,
"string": inside.string,
"comment": {
pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,
lookbehind: true,
greedy: true
},
"interpolation": inside.interpolation,
"punctuation": /[{}()\[\];:.]/
};
})(Prism);
Prism.languages.supercollider = {
"comment": {
pattern: /\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//,
greedy: true
},
"string": {
pattern: /(^|[^\\])"(?:[^"\\]|\\[\s\S])*"/,
lookbehind: true,
greedy: true
},
"char": {
pattern: /\$(?:[^\\\r\n]|\\.)/,
greedy: true
},
"symbol": {
pattern: /(^|[^\\])'(?:[^'\\]|\\[\s\S])*'|\\\w+/,
lookbehind: true,
greedy: true
},
"keyword": /\b(?:_|arg|classvar|const|nil|var|while)\b/,
"boolean": /\b(?:false|true)\b/,
"label": {
pattern: /\b[a-z_]\w*(?=\s*:)/,
alias: "property"
},
"number": /\b(?:inf|pi|0x[0-9a-fA-F]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?(?:pi)?|\d+r[0-9a-zA-Z]+(?:\.[0-9a-zA-Z]+)?|\d+[sb]{1,4}\d*)\b/,
"class-name": /\b[A-Z]\w*\b/,
"operator": /\.{2,3}|#(?![[{])|&&|[!=]==?|\+>>|\+{1,3}|-[->]|=>|>>|\?\?|@\|?@|\|(?:@|[!=]=)?\||!\?|<[!=>]|\*{1,2}|<{2,3}\*?|[-!%&/<>?@|=`]/,
"punctuation": /[{}()[\].:,;]|#[[{]/
};
Prism.languages.sclang = Prism.languages.supercollider;
Prism.languages.swift = {
"comment": {
pattern: /(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,
lookbehind: true,
greedy: true
},
"string-literal": [
{
pattern: RegExp(/(^|[^"#])/.source + "(?:" + /"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source + "|" + /"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source + ")" + /(?!["#])/.source),
lookbehind: true,
greedy: true,
inside: {
"interpolation": {
pattern: /(\\\()(?:[^()]|\([^()]*\))*(?=\))/,
lookbehind: true,
inside: null
},
"interpolation-punctuation": {
pattern: /^\)|\\\($/,
alias: "punctuation"
},
"punctuation": /\\(?=[\r\n])/,
"string": /[\s\S]+/
}
},
{
pattern: RegExp(/(^|[^"#])(#+)/.source + "(?:" + /"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source + "|" + /"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source + ")\\2"),
lookbehind: true,
greedy: true,
inside: {
"interpolation": {
pattern: /(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,
lookbehind: true,
inside: null
},
"interpolation-punctuation": {
pattern: /^\)|\\#+\($/,
alias: "punctuation"
},
"string": /[\s\S]+/
}
}
],
"directive": {
pattern: RegExp(/#/.source + "(?:" + (/(?:elseif|if)\b/.source + "(?:[ ]*" + /(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source + ")+") + "|" + /(?:else|endif)\b/.source + ")"),
alias: "property",
inside: {
"directive-name": /^#\w+/,
"boolean": /\b(?:false|true)\b/,
"number": /\b\d+(?:\.\d+)*\b/,
"operator": /!|&&|\|\||[<>]=?/,
"punctuation": /[(),]/
}
},
"literal": {
pattern: /#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,
alias: "constant"
},
"other-directive": {
pattern: /#\w+\b/,
alias: "property"
},
"attribute": {
pattern: /@\w+/,
alias: "atrule"
},
"function-definition": {
pattern: /(\bfunc\s+)\w+/,
lookbehind: true,
alias: "function"
},
"label": {
pattern: /\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,
lookbehind: true,
alias: "important"
},
"keyword": /\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,
"boolean": /\b(?:false|true)\b/,
"nil": {
pattern: /\bnil\b/,
alias: "constant"
},
"short-argument": /\$\d+\b/,
"omit": {
pattern: /\b_\b/,
alias: "keyword"
},
"number": /\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,
"class-name": /\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,
"function": /\b[a-z_]\w*(?=\s*\()/i,
"constant": /\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,
"operator": /[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,
"punctuation": /[{}[\]();,.:\\]/
};
Prism.languages.swift["string-literal"].forEach(function(rule) {
rule.inside["interpolation"].inside = Prism.languages.swift;
});
(function(Prism2) {
var comment = {
pattern: /^[;#].*/m,
greedy: true
};
var quotesSource = /"(?:[^\r\n"\\]|\\(?:[^\r]|\r\n?))*"(?!\S)/.source;
Prism2.languages.systemd = {
"comment": comment,
"section": {
pattern: /^\[[^\n\r\[\]]*\](?=[ \t]*$)/m,
greedy: true,
inside: {
"punctuation": /^\[|\]$/,
"section-name": {
pattern: /[\s\S]+/,
alias: "selector"
}
}
},
"key": {
pattern: /^[^\s=]+(?=[ \t]*=)/m,
greedy: true,
alias: "attr-name"
},
"value": {
pattern: RegExp(/(=[ \t]*(?!\s))/.source + "(?:" + quotesSource + '|(?=[^"\r\n]))(?:' + (/[^\s\\]/.source + '|[ ]+(?:(?![ "])|' + quotesSource + ")|" + /\\[\r\n]+(?:[#;].*[\r\n]+)*(?![#;])/.source) + ")*"),
lookbehind: true,
greedy: true,
alias: "attr-value",
inside: {
"comment": comment,
"quoted": {
pattern: RegExp(/(^|\s)/.source + quotesSource),
lookbehind: true,
greedy: true
},
"punctuation": /\\$/m,
"boolean": {
pattern: /^(?:false|no|off|on|true|yes)$/,
greedy: true
}
}
},
"punctuation": /=/
};
})(Prism);
(function(Prism2) {
function createBlock(prefix, inside, contentAlias) {
return {
pattern: RegExp("<#" + prefix + "[\\s\\S]*?#>"),
alias: "block",
inside: {
"delimiter": {
pattern: RegExp("^<#" + prefix + "|#>$"),
alias: "important"
},
"content": {
pattern: /[\s\S]+/,
inside,
alias: contentAlias
}
}
};
}
function createT4(insideLang) {
var grammar = Prism2.languages[insideLang];
var className = "language-" + insideLang;
return {
"block": {
pattern: /<#[\s\S]+?#>/,
inside: {
"directive": createBlock("@", {
"attr-value": {
pattern: /=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/,
inside: {
"punctuation": /^=|^["']|["']$/
}
},
"keyword": /\b\w+(?=\s)/,
"attr-name": /\b\w+/
}),
"expression": createBlock("=", grammar, className),
"class-feature": createBlock("\\+", grammar, className),
"standard": createBlock("", grammar, className)
}
}
};
}
Prism2.languages["t4-templating"] = Object.defineProperty({}, "createT4", { value: createT4 });
})(Prism);
Prism.languages.t4 = Prism.languages["t4-cs"] = Prism.languages["t4-templating"].createT4("csharp");
Prism.languages.vbnet = Prism.languages.extend("basic", {
"comment": [
{
pattern: /(?:!|REM\b).+/i,
inside: {
"keyword": /^REM/i
}
},
{
pattern: /(^|[^\\:])'.*/,
lookbehind: true,
greedy: true
}
],
"string": {
pattern: /(^|[^"])"(?:""|[^"])*"(?!")/,
lookbehind: true,
greedy: true
},
"keyword": /(?:\b(?:ADDHANDLER|ADDRESSOF|ALIAS|AND|ANDALSO|AS|BEEP|BLOAD|BOOLEAN|BSAVE|BYREF|BYTE|BYVAL|CALL(?: ABSOLUTE)?|CASE|CATCH|CBOOL|CBYTE|CCHAR|CDATE|CDBL|CDEC|CHAIN|CHAR|CHDIR|CINT|CLASS|CLEAR|CLNG|CLOSE|CLS|COBJ|COM|COMMON|CONST|CONTINUE|CSBYTE|CSHORT|CSNG|CSTR|CTYPE|CUINT|CULNG|CUSHORT|DATA|DATE|DECIMAL|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DEFAULT|DELEGATE|DIM|DIRECTCAST|DO|DOUBLE|ELSE|ELSEIF|END|ENUM|ENVIRON|ERASE|ERROR|EVENT|EXIT|FALSE|FIELD|FILES|FINALLY|FOR(?: EACH)?|FRIEND|FUNCTION|GET|GETTYPE|GETXMLNAMESPACE|GLOBAL|GOSUB|GOTO|HANDLES|IF|IMPLEMENTS|IMPORTS|IN|INHERITS|INPUT|INTEGER|INTERFACE|IOCTL|IS|ISNOT|KEY|KILL|LET|LIB|LIKE|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|ME|MKDIR|MOD|MODULE|MUSTINHERIT|MUSTOVERRIDE|MYBASE|MYCLASS|NAME|NAMESPACE|NARROWING|NEW|NEXT|NOT|NOTHING|NOTINHERITABLE|NOTOVERRIDABLE|OBJECT|OF|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPERATOR|OPTION(?: BASE)?|OPTIONAL|OR|ORELSE|OUT|OVERLOADS|OVERRIDABLE|OVERRIDES|PARAMARRAY|PARTIAL|POKE|PRIVATE|PROPERTY|PROTECTED|PUBLIC|PUT|RAISEEVENT|READ|READONLY|REDIM|REM|REMOVEHANDLER|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SBYTE|SELECT(?: CASE)?|SET|SHADOWS|SHARED|SHELL|SHORT|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|STRUCTURE|SUB|SWAP|SYNCLOCK|SYSTEM|THEN|THROW|TIMER|TO|TROFF|TRON|TRUE|TRY|TRYCAST|TYPE|TYPEOF|UINTEGER|ULONG|UNLOCK|UNTIL|USHORT|USING|VIEW PRINT|WAIT|WEND|WHEN|WHILE|WIDENING|WITH|WITHEVENTS|WRITE|WRITEONLY|XOR)|\B(?:#CONST|#ELSE|#ELSEIF|#END|#IF))(?:\$|\b)/i,
"punctuation": /[,;:(){}]/
});
Prism.languages["t4-vb"] = Prism.languages["t4-templating"].createT4("vbnet");
(function(Prism2) {
var anchorOrAlias = /[*&][^\s[\]{},]+/;
var tag = /!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/;
var properties = "(?:" + tag.source + "(?:[ ]+" + anchorOrAlias.source + ")?|" + anchorOrAlias.source + "(?:[ ]+" + tag.source + ")?)";
var plainKey = /(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(/<PLAIN>/g, function() {
return /[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source;
});
var string = /"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;
function createValuePattern(value, flags) {
flags = (flags || "").replace(/m/g, "") + "m";
var pattern = /([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<<prop>>/g, function() {
return properties;
}).replace(/<<value>>/g, function() {
return value;
});
return RegExp(pattern, flags);
}
Prism2.languages.yaml = {
"scalar": {
pattern: RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<<prop>>/g, function() {
return properties;
})),
lookbehind: true,
alias: "string"
},
"comment": /#.*/,
"key": {
pattern: RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source.replace(/<<prop>>/g, function() {
return properties;
}).replace(/<<key>>/g, function() {
return "(?:" + plainKey + "|" + string + ")";
})),
lookbehind: true,
greedy: true,
alias: "atrule"
},
"directive": {
pattern: /(^[ \t]*)%.+/m,
lookbehind: true,
alias: "important"
},
"datetime": {
pattern: createValuePattern(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),
lookbehind: true,
alias: "number"
},
"boolean": {
pattern: createValuePattern(/false|true/.source, "i"),
lookbehind: true,
alias: "important"
},
"null": {
pattern: createValuePattern(/null|~/.source, "i"),
lookbehind: true,
alias: "important"
},
"string": {
pattern: createValuePattern(string),
lookbehind: true,
greedy: true
},
"number": {
pattern: createValuePattern(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source, "i"),
lookbehind: true
},
"tag": tag,
"important": anchorOrAlias,
"punctuation": /---|[:[\]{}\-,|>?]|\.\.\./
};
Prism2.languages.yml = Prism2.languages.yaml;
})(Prism);
Prism.languages.tap = {
"fail": /not ok[^#{\n\r]*/,
"pass": /ok[^#{\n\r]*/,
"pragma": /pragma [+-][a-z]+/,
"bailout": /bail out!.*/i,
"version": /TAP version \d+/i,
"plan": /\b\d+\.\.\d+(?: +#.*)?/,
"subtest": {
pattern: /# Subtest(?:: .*)?/,
greedy: true
},
"punctuation": /[{}]/,
"directive": /#.*/,
"yamlish": {
pattern: /(^[ \t]*)---[\s\S]*?[\r\n][ \t]*\.\.\.$/m,
lookbehind: true,
inside: Prism.languages.yaml,
alias: "language-yaml"
}
};
Prism.languages.tcl = {
"comment": {
pattern: /(^|[^\\])#.*/,
lookbehind: true
},
"string": {
pattern: /"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"/,
greedy: true
},
"variable": [
{
pattern: /(\$)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/,
lookbehind: true
},
{
pattern: /(\$)\{[^}]+\}/,
lookbehind: true
},
{
pattern: /(^[\t ]*set[ \t]+)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/m,
lookbehind: true
}
],
"function": {
pattern: /(^[\t ]*proc[ \t]+)\S+/m,
lookbehind: true
},
"builtin": [
{
pattern: /(^[\t ]*)(?:break|class|continue|error|eval|exit|for|foreach|if|proc|return|switch|while)\b/m,
lookbehind: true
},
/\b(?:else|elseif)\b/
],
"scope": {
pattern: /(^[\t ]*)(?:global|upvar|variable)\b/m,
lookbehind: true,
alias: "constant"
},
"keyword": {
pattern: /(^[\t ]*|\[)(?:Safe_Base|Tcl|after|append|apply|array|auto_(?:execok|import|load|mkindex|qualify|reset)|automkindex_old|bgerror|binary|catch|cd|chan|clock|close|concat|dde|dict|encoding|eof|exec|expr|fblocked|fconfigure|fcopy|file(?:event|name)?|flush|gets|glob|history|http|incr|info|interp|join|lappend|lassign|lindex|linsert|list|llength|load|lrange|lrepeat|lreplace|lreverse|lsearch|lset|lsort|math(?:func|op)|memory|msgcat|namespace|open|package|parray|pid|pkg_mkIndex|platform|puts|pwd|re_syntax|read|refchan|regexp|registry|regsub|rename|scan|seek|set|socket|source|split|string|subst|tcl(?:_endOfWord|_findLibrary|startOf(?:Next|Previous)Word|test|vars|wordBreak(?:After|Before))|tell|time|tm|trace|unknown|unload|unset|update|uplevel|vwait)\b/m,
lookbehind: true
},
"operator": /!=?|\*\*?|==|&&?|\|\|?|<[=<]?|>[=>]?|[-+~\/%?^]|\b(?:eq|in|ne|ni)\b/,
"punctuation": /[{}()\[\]]/
};
(function(Prism2) {
Prism2.languages.tt2 = Prism2.languages.extend("clike", {
"comment": /#.*|\[%#[\s\S]*?%\]/,
"keyword": /\b(?:BLOCK|CALL|CASE|CATCH|CLEAR|DEBUG|DEFAULT|ELSE|ELSIF|END|FILTER|FINAL|FOREACH|GET|IF|IN|INCLUDE|INSERT|LAST|MACRO|META|NEXT|PERL|PROCESS|RAWPERL|RETURN|SET|STOP|SWITCH|TAGS|THROW|TRY|UNLESS|USE|WHILE|WRAPPER)\b/,
"punctuation": /[[\]{},()]/
});
Prism2.languages.insertBefore("tt2", "number", {
"operator": /=[>=]?|!=?|<=?|>=?|&&|\|\|?|\b(?:and|not|or)\b/,
"variable": {
pattern: /\b[a-z]\w*(?:\s*\.\s*(?:\d+|\$?[a-z]\w*))*\b/i
}
});
Prism2.languages.insertBefore("tt2", "keyword", {
"delimiter": {
pattern: /^(?:\[%|%%)-?|-?%\]$/,
alias: "punctuation"
}
});
Prism2.languages.insertBefore("tt2", "string", {
"single-quoted-string": {
pattern: /'[^\\']*(?:\\[\s\S][^\\']*)*'/,
greedy: true,
alias: "string"
},
"double-quoted-string": {
pattern: /"[^\\"]*(?:\\[\s\S][^\\"]*)*"/,
greedy: true,
alias: "string",
inside: {
"variable": {
pattern: /\$(?:[a-z]\w*(?:\.(?:\d+|\$?[a-z]\w*))*)/i
}
}
}
});
delete Prism2.languages.tt2.string;
Prism2.hooks.add("before-tokenize", function(env) {
var tt2Pattern = /\[%[\s\S]+?%\]/g;
Prism2.languages["markup-templating"].buildPlaceholders(env, "tt2", tt2Pattern);
});
Prism2.hooks.add("after-tokenize", function(env) {
Prism2.languages["markup-templating"].tokenizePlaceholders(env, "tt2");
});
})(Prism);
(function(Prism2) {
var modifierRegex = /\([^|()\n]+\)|\[[^\]\n]+\]|\{[^}\n]+\}/.source;
var parenthesesRegex = /\)|\((?![^|()\n]+\))/.source;
function withModifier(source, flags) {
return RegExp(source.replace(/<MOD>/g, function() {
return "(?:" + modifierRegex + ")";
}).replace(/<PAR>/g, function() {
return "(?:" + parenthesesRegex + ")";
}), flags || "");
}
var modifierTokens = {
"css": {
pattern: /\{[^{}]+\}/,
inside: {
rest: Prism2.languages.css
}
},
"class-id": {
pattern: /(\()[^()]+(?=\))/,
lookbehind: true,
alias: "attr-value"
},
"lang": {
pattern: /(\[)[^\[\]]+(?=\])/,
lookbehind: true,
alias: "attr-value"
},
"punctuation": /[\\\/]\d+|\S/
};
var textile = Prism2.languages.textile = Prism2.languages.extend("markup", {
"phrase": {
pattern: /(^|\r|\n)\S[\s\S]*?(?=$|\r?\n\r?\n|\r\r)/,
lookbehind: true,
inside: {
"block-tag": {
pattern: withModifier(/^[a-z]\w*(?:<MOD>|<PAR>|[<>=])*\./.source),
inside: {
"modifier": {
pattern: withModifier(/(^[a-z]\w*)(?:<MOD>|<PAR>|[<>=])+(?=\.)/.source),
lookbehind: true,
inside: modifierTokens
},
"tag": /^[a-z]\w*/,
"punctuation": /\.$/
}
},
"list": {
pattern: withModifier(/^[*#]+<MOD>*\s+\S.*/.source, "m"),
inside: {
"modifier": {
pattern: withModifier(/(^[*#]+)<MOD>+/.source),
lookbehind: true,
inside: modifierTokens
},
"punctuation": /^[*#]+/
}
},
"table": {
pattern: withModifier(/^(?:(?:<MOD>|<PAR>|[<>=^~])+\.\s*)?(?:\|(?:(?:<MOD>|<PAR>|[<>=^~_]|[\\/]\d+)+\.|(?!(?:<MOD>|<PAR>|[<>=^~_]|[\\/]\d+)+\.))[^|]*)+\|/.source, "m"),
inside: {
"modifier": {
pattern: withModifier(/(^|\|(?:\r?\n|\r)?)(?:<MOD>|<PAR>|[<>=^~_]|[\\/]\d+)+(?=\.)/.source),
lookbehind: true,
inside: modifierTokens
},
"punctuation": /\||^\./
}
},
"inline": {
pattern: withModifier(/(^|[^a-zA-Z\d])(\*\*|__|\?\?|[*_%@+\-^~])<MOD>*.+?\2(?![a-zA-Z\d])/.source),
lookbehind: true,
inside: {
"bold": {
pattern: withModifier(/(^(\*\*?)<MOD>*).+?(?=\2)/.source),
lookbehind: true
},
"italic": {
pattern: withModifier(/(^(__?)<MOD>*).+?(?=\2)/.source),
lookbehind: true
},
"cite": {
pattern: withModifier(/(^\?\?<MOD>*).+?(?=\?\?)/.source),
lookbehind: true,
alias: "string"
},
"code": {
pattern: withModifier(/(^@<MOD>*).+?(?=@)/.source),
lookbehind: true,
alias: "keyword"
},
"inserted": {
pattern: withModifier(/(^\+<MOD>*).+?(?=\+)/.source),
lookbehind: true
},
"deleted": {
pattern: withModifier(/(^-<MOD>*).+?(?=-)/.source),
lookbehind: true
},
"span": {
pattern: withModifier(/(^%<MOD>*).+?(?=%)/.source),
lookbehind: true
},
"modifier": {
pattern: withModifier(/(^\*\*|__|\?\?|[*_%@+\-^~])<MOD>+/.source),
lookbehind: true,
inside: modifierTokens
},
"punctuation": /[*_%?@+\-^~]+/
}
},
"link-ref": {
pattern: /^\[[^\]]+\]\S+$/m,
inside: {
"string": {
pattern: /(^\[)[^\]]+(?=\])/,
lookbehind: true
},
"url": {
pattern: /(^\])\S+$/,
lookbehind: true
},
"punctuation": /[\[\]]/
}
},
"link": {
pattern: withModifier(/"<MOD>*[^"]+":.+?(?=[^\w/]?(?:\s|$))/.source),
inside: {
"text": {
pattern: withModifier(/(^"<MOD>*)[^"]+(?=")/.source),
lookbehind: true
},
"modifier": {
pattern: withModifier(/(^")<MOD>+/.source),
lookbehind: true,
inside: modifierTokens
},
"url": {
pattern: /(:).+/,
lookbehind: true
},
"punctuation": /[":]/
}
},
"image": {
pattern: withModifier(/!(?:<MOD>|<PAR>|[<>=])*(?![<>=])[^!\s()]+(?:\([^)]+\))?!(?::.+?(?=[^\w/]?(?:\s|$)))?/.source),
inside: {
"source": {
pattern: withModifier(/(^!(?:<MOD>|<PAR>|[<>=])*)(?![<>=])[^!\s()]+(?:\([^)]+\))?(?=!)/.source),
lookbehind: true,
alias: "url"
},
"modifier": {
pattern: withModifier(/(^!)(?:<MOD>|<PAR>|[<>=])+/.source),
lookbehind: true,
inside: modifierTokens
},
"url": {
pattern: /(:).+/,
lookbehind: true
},
"punctuation": /[!:]/
}
},
"footnote": {
pattern: /\b\[\d+\]/,
alias: "comment",
inside: {
"punctuation": /\[|\]/
}
},
"acronym": {
pattern: /\b[A-Z\d]+\([^)]+\)/,
inside: {
"comment": {
pattern: /(\()[^()]+(?=\))/,
lookbehind: true
},
"punctuation": /[()]/
}
},
"mark": {
pattern: /\b\((?:C|R|TM)\)/,
alias: "comment",
inside: {
"punctuation": /[()]/
}
}
}
}
});
var phraseInside = textile["phrase"].inside;
var nestedPatterns = {
"inline": phraseInside["inline"],
"link": phraseInside["link"],
"image": phraseInside["image"],
"footnote": phraseInside["footnote"],
"acronym": phraseInside["acronym"],
"mark": phraseInside["mark"]
};
textile.tag.pattern = /<\/?(?!\d)[a-z0-9]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i;
var phraseInlineInside = phraseInside["inline"].inside;
phraseInlineInside["bold"].inside = nestedPatterns;
phraseInlineInside["italic"].inside = nestedPatterns;
phraseInlineInside["inserted"].inside = nestedPatterns;
phraseInlineInside["deleted"].inside = nestedPatterns;
phraseInlineInside["span"].inside = nestedPatterns;
var phraseTableInside = phraseInside["table"].inside;
phraseTableInside["inline"] = nestedPatterns["inline"];
phraseTableInside["link"] = nestedPatterns["link"];
phraseTableInside["image"] = nestedPatterns["image"];
phraseTableInside["footnote"] = nestedPatterns["footnote"];
phraseTableInside["acronym"] = nestedPatterns["acronym"];
phraseTableInside["mark"] = nestedPatterns["mark"];
})(Prism);
(function(Prism2) {
var key = /(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;
function insertKey(pattern) {
return pattern.replace(/__/g, function() {
return key;
});
}
Prism2.languages.toml = {
"comment": {
pattern: /#.*/,
greedy: true
},
"table": {
pattern: RegExp(insertKey(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source), "m"),
lookbehind: true,
greedy: true,
alias: "class-name"
},
"key": {
pattern: RegExp(insertKey(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source), "m"),
lookbehind: true,
greedy: true,
alias: "property"
},
"string": {
pattern: /"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,
greedy: true
},
"date": [
{
pattern: /\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,
alias: "number"
},
{
pattern: /\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,
alias: "number"
}
],
"number": /(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,
"boolean": /\b(?:false|true)\b/,
"punctuation": /[.,=[\]{}]/
};
})(Prism);
(function(Prism2) {
Prism2.languages.tremor = {
"comment": {
pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,
lookbehind: true
},
"interpolated-string": null,
"extractor": {
pattern: /\b[a-z_]\w*\|(?:[^\r\n\\|]|\\(?:\r\n|[\s\S]))*\|/i,
greedy: true,
inside: {
"regex": {
pattern: /(^re)\|[\s\S]+/,
lookbehind: true
},
"function": /^\w+/,
"value": /\|[\s\S]+/
}
},
"identifier": {
pattern: /`[^`]*`/,
greedy: true
},
"function": /\b[a-z_]\w*(?=\s*(?:::\s*<|\())\b/,
"keyword": /\b(?:args|as|by|case|config|connect|connector|const|copy|create|default|define|deploy|drop|each|emit|end|erase|event|flow|fn|for|from|group|having|insert|into|intrinsic|let|links|match|merge|mod|move|of|operator|patch|pipeline|recur|script|select|set|sliding|state|stream|to|tumbling|update|use|when|where|window|with)\b/,
"boolean": /\b(?:false|null|true)\b/i,
"number": /\b(?:0b[01_]*|0x[0-9a-fA-F_]*|\d[\d_]*(?:\.\d[\d_]*)?(?:[Ee][+-]?[\d_]+)?)\b/,
"pattern-punctuation": {
pattern: /%(?=[({[])/,
alias: "punctuation"
},
"operator": /[-+*\/%~!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?>?=?|(?:absent|and|not|or|present|xor)\b/,
"punctuation": /::|[;\[\]()\{\},.:]/
};
var interpolationPattern = /#\{(?:[^"{}]|\{[^{}]*\}|"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*")*\}/.source;
Prism2.languages.tremor["interpolated-string"] = {
pattern: RegExp(/(^|[^\\])/.source + '(?:"""(?:' + /[^"\\#]|\\[\s\S]|"(?!"")|#(?!\{)/.source + "|" + interpolationPattern + ')*"""|"(?:' + /[^"\\\r\n#]|\\(?:\r\n|[\s\S])|#(?!\{)/.source + "|" + interpolationPattern + ')*")'),
lookbehind: true,
greedy: true,
inside: {
"interpolation": {
pattern: RegExp(interpolationPattern),
inside: {
"punctuation": /^#\{|\}$/,
"expression": {
pattern: /[\s\S]+/,
inside: Prism2.languages.tremor
}
}
},
"string": /[\s\S]+/
}
};
Prism2.languages.troy = Prism2.languages["tremor"];
Prism2.languages.trickle = Prism2.languages["tremor"];
})(Prism);
Prism.languages.twig = {
"comment": /^\{#[\s\S]*?#\}$/,
"tag-name": {
pattern: /(^\{%-?\s*)\w+/,
lookbehind: true,
alias: "keyword"
},
"delimiter": {
pattern: /^\{[{%]-?|-?[%}]\}$/,
alias: "punctuation"
},
"string": {
pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
inside: {
"punctuation": /^['"]|['"]$/
}
},
"keyword": /\b(?:even|if|odd)\b/,
"boolean": /\b(?:false|null|true)\b/,
"number": /\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,
"operator": [
{
pattern: /(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,
lookbehind: true
},
/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/
],
"punctuation": /[()\[\]{}:.,]/
};
Prism.hooks.add("before-tokenize", function(env) {
if (env.language !== "twig") {
return;
}
var pattern = /\{(?:#[\s\S]*?#|%[\s\S]*?%|\{[\s\S]*?\})\}/g;
Prism.languages["markup-templating"].buildPlaceholders(env, "twig", pattern);
});
Prism.hooks.add("after-tokenize", function(env) {
Prism.languages["markup-templating"].tokenizePlaceholders(env, "twig");
});
(function(Prism2) {
var keywords = /\b(?:ACT|ACTIFSUB|CARRAY|CASE|CLEARGIF|COA|COA_INT|CONSTANTS|CONTENT|CUR|EDITPANEL|EFFECT|EXT|FILE|FLUIDTEMPLATE|FORM|FRAME|FRAMESET|GIFBUILDER|GMENU|GMENU_FOLDOUT|GMENU_LAYERS|GP|HMENU|HRULER|HTML|IENV|IFSUB|IMAGE|IMGMENU|IMGMENUITEM|IMGTEXT|IMG_RESOURCE|INCLUDE_TYPOSCRIPT|JSMENU|JSMENUITEM|LLL|LOAD_REGISTER|NO|PAGE|RECORDS|RESTORE_REGISTER|TEMPLATE|TEXT|TMENU|TMENUITEM|TMENU_LAYERS|USER|USER_INT|_GIFBUILDER|global|globalString|globalVar)\b/;
Prism2.languages.typoscript = {
"comment": [
{
pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
lookbehind: true
},
{
pattern: /(^|[^\\:= \t]|(?:^|[^= \t])[ \t]+)\/\/.*/,
lookbehind: true,
greedy: true
},
{
pattern: /(^|[^"'])#.*/,
lookbehind: true,
greedy: true
}
],
"function": [
{
pattern: /<INCLUDE_TYPOSCRIPT:\s*source\s*=\s*(?:"[^"\r\n]*"|'[^'\r\n]*')\s*>/,
inside: {
"string": {
pattern: /"[^"\r\n]*"|'[^'\r\n]*'/,
inside: {
"keyword": keywords
}
},
"keyword": {
pattern: /INCLUDE_TYPOSCRIPT/
}
}
},
{
pattern: /@import\s*(?:"[^"\r\n]*"|'[^'\r\n]*')/,
inside: {
"string": /"[^"\r\n]*"|'[^'\r\n]*'/
}
}
],
"string": {
pattern: /^([^=]*=[< ]?)(?:(?!\]\n).)*/,
lookbehind: true,
inside: {
"function": /\{\$.*\}/,
"keyword": keywords,
"number": /^\d+$/,
"punctuation": /[,|:]/
}
},
"keyword": keywords,
"number": {
pattern: /\b\d+\s*[.{=]/,
inside: {
"operator": /[.{=]/
}
},
"tag": {
pattern: /\.?[-\w\\]+\.?/,
inside: {
"punctuation": /\./
}
},
"punctuation": /[{}[\];(),.:|]/,
"operator": /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/
};
Prism2.languages.tsconfig = Prism2.languages.typoscript;
})(Prism);
Prism.languages.unrealscript = {
"comment": /\/\/.*|\/\*[\s\S]*?\*\//,
"string": {
pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"category": {
pattern: /(\b(?:(?:autoexpand|hide|show)categories|var)\s*\()[^()]+(?=\))/,
lookbehind: true,
greedy: true,
alias: "property"
},
"metadata": {
pattern: /(\w\s*)<\s*\w+\s*=[^<>|=\r\n]+(?:\|\s*\w+\s*=[^<>|=\r\n]+)*>/,
lookbehind: true,
greedy: true,
inside: {
"property": /\b\w+(?=\s*=)/,
"operator": /=/,
"punctuation": /[<>|]/
}
},
"macro": {
pattern: /`\w+/,
alias: "property"
},
"class-name": {
pattern: /(\b(?:class|enum|extends|interface|state(?:\(\))?|struct|within)\s+)\w+/,
lookbehind: true
},
"keyword": /\b(?:abstract|actor|array|auto|autoexpandcategories|bool|break|byte|case|class|classgroup|client|coerce|collapsecategories|config|const|continue|default|defaultproperties|delegate|dependson|deprecated|do|dontcollapsecategories|editconst|editinlinenew|else|enum|event|exec|export|extends|final|float|for|forcescriptorder|foreach|function|goto|guid|hidecategories|hidedropdown|if|ignores|implements|inherits|input|int|interface|iterator|latent|local|material|name|native|nativereplication|noexport|nontransient|noteditinlinenew|notplaceable|operator|optional|out|pawn|perobjectconfig|perobjectlocalized|placeable|postoperator|preoperator|private|protected|reliable|replication|return|server|showcategories|simulated|singular|state|static|string|struct|structdefault|structdefaultproperties|switch|texture|transient|travel|unreliable|until|var|vector|while|within)\b/,
"function": /\b[a-z_]\w*(?=\s*\()/i,
"boolean": /\b(?:false|true)\b/,
"number": /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
"operator": />>|<<|--|\+\+|\*\*|[-+*/~!=<>$@]=?|&&?|\|\|?|\^\^?|[?:%]|\b(?:ClockwiseFrom|Cross|Dot)\b/,
"punctuation": /[()[\]{};,.]/
};
Prism.languages.uc = Prism.languages.uscript = Prism.languages.unrealscript;
Prism.languages.uorazor = {
"comment-hash": {
pattern: /#.*/,
alias: "comment",
greedy: true
},
"comment-slash": {
pattern: /\/\/.*/,
alias: "comment",
greedy: true
},
"string": {
pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
inside: {
"punctuation": /^['"]|['"]$/
},
greedy: true
},
"source-layers": {
pattern: /\b(?:arms|backpack|blue|bracelet|cancel|clear|cloak|criminal|earrings|enemy|facialhair|friend|friendly|gloves|gray|grey|ground|hair|head|innerlegs|innertorso|innocent|lefthand|middletorso|murderer|neck|nonfriendly|onehandedsecondary|outerlegs|outertorso|pants|red|righthand|ring|self|shirt|shoes|talisman|waist)\b/i,
alias: "function"
},
"source-commands": {
pattern: /\b(?:alliance|attack|cast|clearall|clearignore|clearjournal|clearlist|clearsysmsg|createlist|createtimer|dclick|dclicktype|dclickvar|dress|dressconfig|drop|droprelloc|emote|getlabel|guild|gumpclose|gumpresponse|hotkey|ignore|lasttarget|lift|lifttype|menu|menuresponse|msg|org|organize|organizer|overhead|pause|poplist|potion|promptresponse|pushlist|removelist|removetimer|rename|restock|say|scav|scavenger|script|setability|setlasttarget|setskill|settimer|setvar|sysmsg|target|targetloc|targetrelloc|targettype|undress|unignore|unsetvar|useobject|useonce|useskill|usetype|virtue|wait|waitforgump|waitformenu|waitforprompt|waitforstat|waitforsysmsg|waitfortarget|walk|wfsysmsg|wft|whisper|yell)\b/,
alias: "function"
},
"tag-name": {
pattern: /(^\{%-?\s*)\w+/,
lookbehind: true,
alias: "keyword"
},
"delimiter": {
pattern: /^\{[{%]-?|-?[%}]\}$/,
alias: "punctuation"
},
"function": /\b(?:atlist|close|closest|count|counter|counttype|dead|dex|diffhits|diffmana|diffstam|diffweight|find|findbuff|finddebuff|findlayer|findtype|findtypelist|followers|gumpexists|hidden|hits|hp|hue|human|humanoid|ingump|inlist|insysmessage|insysmsg|int|invul|lhandempty|list|listexists|mana|maxhits|maxhp|maxmana|maxstam|maxweight|monster|mounted|name|next|noto|paralyzed|poisoned|position|prev|previous|queued|rand|random|rhandempty|skill|stam|str|targetexists|timer|timerexists|varexist|warmode|weight)\b/,
"keyword": /\b(?:and|as|break|continue|else|elseif|endfor|endif|endwhile|for|if|loop|not|or|replay|stop|while)\b/,
"boolean": /\b(?:false|null|true)\b/,
"number": /\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,
"operator": [
{
pattern: /(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,
lookbehind: true
},
/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/
],
"punctuation": /[()\[\]{}:.,]/
};
Prism.languages.uri = {
"scheme": {
pattern: /^[a-z][a-z0-9+.-]*:/im,
greedy: true,
inside: {
"scheme-delimiter": /:$/
}
},
"fragment": {
pattern: /#[\w\-.~!$&'()*+,;=%:@/?]*/,
inside: {
"fragment-delimiter": /^#/
}
},
"query": {
pattern: /\?[\w\-.~!$&'()*+,;=%:@/?]*/,
inside: {
"query-delimiter": {
pattern: /^\?/,
greedy: true
},
"pair-delimiter": /[&;]/,
"pair": {
pattern: /^[^=][\s\S]*/,
inside: {
"key": /^[^=]+/,
"value": {
pattern: /(^=)[\s\S]+/,
lookbehind: true
}
}
}
}
},
"authority": {
pattern: RegExp(/^\/\//.source + /(?:[\w\-.~!$&'()*+,;=%:]*@)?/.source + ("(?:" + /\[(?:[0-9a-fA-F:.]{2,48}|v[0-9a-fA-F]+\.[\w\-.~!$&'()*+,;=]+)\]/.source + "|" + /[\w\-.~!$&'()*+,;=%]*/.source + ")") + /(?::\d*)?/.source, "m"),
inside: {
"authority-delimiter": /^\/\//,
"user-info-segment": {
pattern: /^[\w\-.~!$&'()*+,;=%:]*@/,
inside: {
"user-info-delimiter": /@$/,
"user-info": /^[\w\-.~!$&'()*+,;=%:]+/
}
},
"port-segment": {
pattern: /:\d*$/,
inside: {
"port-delimiter": /^:/,
"port": /^\d+/
}
},
"host": {
pattern: /[\s\S]+/,
inside: {
"ip-literal": {
pattern: /^\[[\s\S]+\]$/,
inside: {
"ip-literal-delimiter": /^\[|\]$/,
"ipv-future": /^v[\s\S]+/,
"ipv6-address": /^[\s\S]+/
}
},
"ipv4-address": /^(?:(?:[03-9]\d?|[12]\d{0,2})\.){3}(?:[03-9]\d?|[12]\d{0,2})$/
}
}
}
},
"path": {
pattern: /^[\w\-.~!$&'()*+,;=%:@/]+/m,
inside: {
"path-separator": /\//
}
}
};
Prism.languages.url = Prism.languages.uri;
(function(Prism2) {
var interpolationExpr = {
pattern: /[\s\S]+/,
inside: null
};
Prism2.languages.v = Prism2.languages.extend("clike", {
"string": {
pattern: /r?(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
alias: "quoted-string",
greedy: true,
inside: {
"interpolation": {
pattern: /((?:^|[^\\])(?:\\{2})*)\$(?:\{[^{}]*\}|\w+(?:\.\w+(?:\([^\(\)]*\))?|\[[^\[\]]+\])*)/,
lookbehind: true,
inside: {
"interpolation-variable": {
pattern: /^\$\w[\s\S]*$/,
alias: "variable"
},
"interpolation-punctuation": {
pattern: /^\$\{|\}$/,
alias: "punctuation"
},
"interpolation-expression": interpolationExpr
}
}
}
},
"class-name": {
pattern: /(\b(?:enum|interface|struct|type)\s+)(?:C\.)?\w+/,
lookbehind: true
},
"keyword": /(?:\b(?:__global|as|asm|assert|atomic|break|chan|const|continue|defer|else|embed|enum|fn|for|go(?:to)?|if|import|in|interface|is|lock|match|module|mut|none|or|pub|return|rlock|select|shared|sizeof|static|struct|type(?:of)?|union|unsafe)|\$(?:else|for|if)|#(?:flag|include))\b/,
"number": /\b(?:0x[a-f\d]+(?:_[a-f\d]+)*|0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?)\b/i,
"operator": /~|\?|[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\.?/,
"builtin": /\b(?:any(?:_float|_int)?|bool|byte(?:ptr)?|charptr|f(?:32|64)|i(?:8|16|64|128|nt)|rune|size_t|string|u(?:16|32|64|128)|voidptr)\b/
});
interpolationExpr.inside = Prism2.languages.v;
Prism2.languages.insertBefore("v", "string", {
"char": {
pattern: /`(?:\\`|\\?[^`]{1,2})`/,
alias: "rune"
}
});
Prism2.languages.insertBefore("v", "operator", {
"attribute": {
pattern: /(^[\t ]*)\[(?:deprecated|direct_array_access|flag|inline|live|ref_only|typedef|unsafe_fn|windows_stdcall)\]/m,
lookbehind: true,
alias: "annotation",
inside: {
"punctuation": /[\[\]]/,
"keyword": /\w+/
}
},
"generic": {
pattern: /<\w+>(?=\s*[\)\{])/,
inside: {
"punctuation": /[<>]/,
"class-name": /\w+/
}
}
});
Prism2.languages.insertBefore("v", "function", {
"generic-function": {
pattern: /\b\w+\s*<\w+>(?=\()/,
inside: {
"function": /^\w+/,
"generic": {
pattern: /<\w+>/,
inside: Prism2.languages.v.generic.inside
}
}
}
});
})(Prism);
Prism.languages.vala = Prism.languages.extend("clike", {
"class-name": [
{
pattern: /\b[A-Z]\w*(?:\.\w+)*\b(?=(?:\?\s+|\*?\s+\*?)\w)/,
inside: {
punctuation: /\./
}
},
{
pattern: /(\[)[A-Z]\w*(?:\.\w+)*\b/,
lookbehind: true,
inside: {
punctuation: /\./
}
},
{
pattern: /(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/,
lookbehind: true,
inside: {
punctuation: /\./
}
},
{
pattern: /((?:\b(?:class|enum|interface|new|struct)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/,
lookbehind: true,
inside: {
punctuation: /\./
}
}
],
"keyword": /\b(?:abstract|as|assert|async|base|bool|break|case|catch|char|class|const|construct|continue|default|delegate|delete|do|double|dynamic|else|ensures|enum|errordomain|extern|finally|float|for|foreach|get|if|in|inline|int|int16|int32|int64|int8|interface|internal|is|lock|long|namespace|new|null|out|override|owned|params|private|protected|public|ref|requires|return|set|short|signal|sizeof|size_t|ssize_t|static|string|struct|switch|this|throw|throws|try|typeof|uchar|uint|uint16|uint32|uint64|uint8|ulong|unichar|unowned|ushort|using|value|var|virtual|void|volatile|weak|while|yield)\b/i,
"function": /\b\w+(?=\s*\()/,
"number": /(?:\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)(?:f|u?l?)?/i,
"operator": /\+\+|--|&&|\|\||<<=?|>>=?|=>|->|~|[+\-*\/%&^|=!<>]=?|\?\??|\.\.\./,
"punctuation": /[{}[\];(),.:]/,
"constant": /\b[A-Z0-9_]+\b/
});
Prism.languages.insertBefore("vala", "string", {
"raw-string": {
pattern: /"""[\s\S]*?"""/,
greedy: true,
alias: "string"
},
"template-string": {
pattern: /@"[\s\S]*?"/,
greedy: true,
inside: {
"interpolation": {
pattern: /\$(?:\([^)]*\)|[a-zA-Z]\w*)/,
inside: {
"delimiter": {
pattern: /^\$\(?|\)$/,
alias: "punctuation"
},
rest: Prism.languages.vala
}
},
"string": /[\s\S]+/
}
}
});
Prism.languages.insertBefore("vala", "keyword", {
"regex": {
pattern: /\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[imsx]{0,4}(?=\s*(?:$|[\r\n,.;})\]]))/,
greedy: true,
inside: {
"regex-source": {
pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/,
lookbehind: true,
alias: "language-regex",
inside: Prism.languages.regex
},
"regex-delimiter": /^\//,
"regex-flags": /^[a-z]+$/
}
}
});
(function(Prism2) {
Prism2.languages.velocity = Prism2.languages.extend("markup", {});
var velocity = {
"variable": {
pattern: /(^|[^\\](?:\\\\)*)\$!?(?:[a-z][\w-]*(?:\([^)]*\))?(?:\.[a-z][\w-]*(?:\([^)]*\))?|\[[^\]]+\])*|\{[^}]+\})/i,
lookbehind: true,
inside: {}
},
"string": {
pattern: /"[^"]*"|'[^']*'/,
greedy: true
},
"number": /\b\d+\b/,
"boolean": /\b(?:false|true)\b/,
"operator": /[=!<>]=?|[+*/%-]|&&|\|\||\.\.|\b(?:eq|g[et]|l[et]|n(?:e|ot))\b/,
"punctuation": /[(){}[\]:,.]/
};
velocity.variable.inside = {
"string": velocity["string"],
"function": {
pattern: /([^\w-])[a-z][\w-]*(?=\()/,
lookbehind: true
},
"number": velocity["number"],
"boolean": velocity["boolean"],
"punctuation": velocity["punctuation"]
};
Prism2.languages.insertBefore("velocity", "comment", {
"unparsed": {
pattern: /(^|[^\\])#\[\[[\s\S]*?\]\]#/,
lookbehind: true,
greedy: true,
inside: {
"punctuation": /^#\[\[|\]\]#$/
}
},
"velocity-comment": [
{
pattern: /(^|[^\\])#\*[\s\S]*?\*#/,
lookbehind: true,
greedy: true,
alias: "comment"
},
{
pattern: /(^|[^\\])##.*/,
lookbehind: true,
greedy: true,
alias: "comment"
}
],
"directive": {
pattern: /(^|[^\\](?:\\\\)*)#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})(?:\s*\((?:[^()]|\([^()]*\))*\))?/i,
lookbehind: true,
inside: {
"keyword": {
pattern: /^#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})|\bin\b/,
inside: {
"punctuation": /[{}]/
}
},
rest: velocity
}
},
"variable": velocity["variable"]
});
Prism2.languages.velocity["tag"].inside["attr-value"].inside.rest = Prism2.languages.velocity;
})(Prism);
Prism.languages.verilog = {
"comment": {
pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
greedy: true
},
"string": {
pattern: /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,
greedy: true
},
"kernel-function": {
pattern: /\B\$\w+\b/,
alias: "property"
},
"constant": /\B`\w+\b/,
"function": /\b\w+(?=\()/,
"keyword": /\b(?:alias|and|assert|assign|assume|automatic|before|begin|bind|bins|binsof|bit|break|buf|bufif0|bufif1|byte|case|casex|casez|cell|chandle|class|clocking|cmos|config|const|constraint|context|continue|cover|covergroup|coverpoint|cross|deassign|default|defparam|design|disable|dist|do|edge|else|end|endcase|endclass|endclocking|endconfig|endfunction|endgenerate|endgroup|endinterface|endmodule|endpackage|endprimitive|endprogram|endproperty|endsequence|endspecify|endtable|endtask|enum|event|expect|export|extends|extern|final|first_match|for|force|foreach|forever|fork|forkjoin|function|generate|genvar|highz0|highz1|if|iff|ifnone|ignore_bins|illegal_bins|import|incdir|include|initial|inout|input|inside|instance|int|integer|interface|intersect|join|join_any|join_none|large|liblist|library|local|localparam|logic|longint|macromodule|matches|medium|modport|module|nand|negedge|new|nmos|nor|noshowcancelled|not|notif0|notif1|null|or|output|package|packed|parameter|pmos|posedge|primitive|priority|program|property|protected|pull0|pull1|pulldown|pullup|pulsestyle_ondetect|pulsestyle_onevent|pure|rand|randc|randcase|randsequence|rcmos|real|realtime|ref|reg|release|repeat|return|rnmos|rpmos|rtran|rtranif0|rtranif1|scalared|sequence|shortint|shortreal|showcancelled|signed|small|solve|specify|specparam|static|string|strong0|strong1|struct|super|supply0|supply1|table|tagged|task|this|throughout|time|timeprecision|timeunit|tran|tranif0|tranif1|tri|tri0|tri1|triand|trior|trireg|type|typedef|union|unique|unsigned|use|uwire|var|vectored|virtual|void|wait|wait_order|wand|weak0|weak1|while|wildcard|wire|with|within|wor|xnor|xor)\b/,
"important": /\b(?:always|always_comb|always_ff|always_latch)\b(?: *@)?/,
"number": /\B##?\d+|(?:\b\d+)?'[odbh] ?[\da-fzx_?]+|\b(?:\d*[._])?\d+(?:e[-+]?\d+)?/i,
"operator": /[-+{}^~%*\/?=!<>&|]+/,
"punctuation": /[[\];(),.:]/
};
Prism.languages.vhdl = {
"comment": /--.+/,
"vhdl-vectors": {
"pattern": /\b[oxb]"[\da-f_]+"|"[01uxzwlh-]+"/i,
"alias": "number"
},
"quoted-function": {
pattern: /"\S+?"(?=\()/,
alias: "function"
},
"string": /"(?:[^\\"\r\n]|\\(?:\r\n|[\s\S]))*"/,
"attribute": {
pattern: /\b'\w+/,
alias: "attr-name"
},
"keyword": /\b(?:access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|private|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|view|wait|when|while|with)\b/i,
"boolean": /\b(?:false|true)\b/i,
"function": /\w+(?=\()/,
"number": /'[01uxzwlh-]'|\b(?:\d+#[\da-f_.]+#|\d[\d_.]*)(?:e[-+]?\d+)?/i,
"operator": /[<>]=?|:=|[-+*/&=]|\b(?:abs|and|mod|nand|nor|not|or|rem|rol|ror|sla|sll|sra|srl|xnor|xor)\b/i,
"punctuation": /[{}[\];(),.:]/
};
Prism.languages.vim = {
"string": /"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\r\n]|'')*'/,
"comment": /".*/,
"function": /\b\w+(?=\()/,
"keyword": /\b(?:N|Next|P|Print|X|XMLent|XMLns|ab|abbreviate|abc|abclear|abo|aboveleft|al|all|ar|arga|argadd|argd|argdelete|argdo|arge|argedit|argg|argglobal|argl|arglocal|args|argu|argument|as|ascii|b|bN|bNext|ba|bad|badd|ball|bd|bdelete|be|bel|belowright|bf|bfirst|bl|blast|bm|bmodified|bn|bnext|bo|botright|bp|bprevious|br|brea|break|breaka|breakadd|breakd|breakdel|breakl|breaklist|brewind|bro|browse|bufdo|buffer|buffers|bun|bunload|bw|bwipeout|c|cN|cNext|cNfcNfile|ca|cabbrev|cabc|cabclear|cad|caddb|caddbuffer|caddexpr|caddf|caddfile|cal|call|cat|catch|cb|cbuffer|cc|ccl|cclose|cd|ce|center|cex|cexpr|cf|cfile|cfir|cfirst|cg|cgetb|cgetbuffer|cgete|cgetexpr|cgetfile|change|changes|chd|chdir|che|checkpath|checkt|checktime|cl|cla|clast|clist|clo|close|cmapc|cmapclear|cn|cnew|cnewer|cnext|cnf|cnfile|cnorea|cnoreabbrev|co|col|colder|colo|colorscheme|comc|comclear|comp|compiler|con|conf|confirm|continue|cope|copen|copy|cp|cpf|cpfile|cprevious|cq|cquit|cr|crewind|cu|cuna|cunabbrev|cunmap|cw|cwindow|d|debugg|debuggreedy|delc|delcommand|delete|delf|delfunction|delm|delmarks|di|diffg|diffget|diffoff|diffpatch|diffpu|diffput|diffsplit|diffthis|diffu|diffupdate|dig|digraphs|display|dj|djump|dl|dlist|dr|drop|ds|dsearch|dsp|dsplit|e|earlier|echoe|echoerr|echom|echomsg|echon|edit|el|else|elsei|elseif|em|emenu|en|endf|endfo|endfor|endfun|endfunction|endif|endt|endtry|endw|endwhile|ene|enew|ex|exi|exit|exu|exusage|f|file|files|filetype|fin|fina|finally|find|fini|finish|fir|first|fix|fixdel|fo|fold|foldc|foldclose|foldd|folddoc|folddoclosed|folddoopen|foldo|foldopen|for|fu|fun|function|go|goto|gr|grep|grepa|grepadd|h|ha|hardcopy|help|helpf|helpfind|helpg|helpgrep|helpt|helptags|hid|hide|his|history|ia|iabbrev|iabc|iabclear|if|ij|ijump|il|ilist|imapc|imapclear|in|inorea|inoreabbrev|isearch|isp|isplit|iu|iuna|iunabbrev|iunmap|j|join|ju|jumps|k|kee|keepalt|keepj|keepjumps|keepmarks|l|lN|lNext|lNf|lNfile|la|lad|laddb|laddbuffer|laddexpr|laddf|laddfile|lan|language|last|later|lb|lbuffer|lc|lcd|lch|lchdir|lcl|lclose|left|lefta|leftabove|let|lex|lexpr|lf|lfile|lfir|lfirst|lg|lgetb|lgetbuffer|lgete|lgetexpr|lgetfile|lgr|lgrep|lgrepa|lgrepadd|lh|lhelpgrep|list|ll|lla|llast|lli|llist|lm|lmak|lmake|lmap|lmapc|lmapclear|ln|lne|lnew|lnewer|lnext|lnf|lnfile|lnoremap|lo|loadview|loc|lockmarks|lockv|lockvar|lol|lolder|lop|lopen|lp|lpf|lpfile|lprevious|lr|lrewind|ls|lt|ltag|lu|lunmap|lv|lvimgrep|lvimgrepa|lvimgrepadd|lw|lwindow|m|ma|mak|make|mark|marks|mat|match|menut|menutranslate|mk|mkexrc|mks|mksession|mksp|mkspell|mkv|mkvie|mkview|mkvimrc|mod|mode|move|mz|mzf|mzfile|mzscheme|n|nbkey|new|next|nmapc|nmapclear|noh|nohlsearch|norea|noreabbrev|nu|number|nun|nunmap|o|omapc|omapclear|on|only|open|opt|options|ou|ounmap|p|pc|pclose|pe|ped|pedit|perl|perld|perldo|po|pop|popu|popup|pp|ppop|pre|preserve|prev|previous|print|prof|profd|profdel|profile|promptf|promptfind|promptr|promptrepl|ps|psearch|ptN|ptNext|pta|ptag|ptf|ptfirst|ptj|ptjump|ptl|ptlast|ptn|ptnext|ptp|ptprevious|ptr|ptrewind|pts|ptselect|pu|put|pw|pwd|py|pyf|pyfile|python|q|qa|qall|quit|quita|quitall|r|read|rec|recover|red|redi|redir|redo|redr|redraw|redraws|redrawstatus|reg|registers|res|resize|ret|retab|retu|return|rew|rewind|ri|right|rightb|rightbelow|ru|rub|ruby|rubyd|rubydo|rubyf|rubyfile|runtime|rv|rviminfo|sN|sNext|sa|sal|sall|san|sandbox|sargument|sav|saveas|sb|sbN|sbNext|sba|sball|sbf|sbfirst|sbl|sblast|sbm|sbmodified|sbn|sbnext|sbp|sbprevious|sbr|sbrewind|sbuffer|scrip|scripte|scriptencoding|scriptnames|se|set|setf|setfiletype|setg|setglobal|setl|setlocal|sf|sfind|sfir|sfirst|sh|shell|sign|sil|silent|sim|simalt|sl|sla|slast|sleep|sm|smagic|smap|smapc|smapclear|sme|smenu|sn|snext|sni|sniff|sno|snomagic|snor|snoremap|snoreme|snoremenu|so|sor|sort|source|sp|spe|spelld|spelldump|spellgood|spelli|spellinfo|spellr|spellrepall|spellu|spellundo|spellw|spellwrong|split|spr|sprevious|sre|srewind|st|sta|stag|star|startg|startgreplace|startinsert|startr|startreplace|stj|stjump|stop|stopi|stopinsert|sts|stselect|sun|sunhide|sunm|sunmap|sus|suspend|sv|sview|syncbind|t|tN|tNext|ta|tab|tabN|tabNext|tabc|tabclose|tabd|tabdo|tabe|tabedit|tabf|tabfind|tabfir|tabfirst|tabl|tablast|tabm|tabmove|tabn|tabnew|tabnext|tabo|tabonly|tabp|tabprevious|tabr|tabrewind|tabs|tag|tags|tc|tcl|tcld|tcldo|tclf|tclfile|te|tearoff|tf|tfirst|th|throw|tj|tjump|tl|tlast|tm|tmenu|tn|tnext|to|topleft|tp|tprevious|tr|trewind|try|ts|tselect|tu|tunmenu|u|una|unabbreviate|undo|undoj|undojoin|undol|undolist|unh|unhide|unlet|unlo|unlockvar|unm|unmap|up|update|ve|verb|verbose|version|vert|vertical|vi|vie|view|vim|vimgrep|vimgrepa|vimgrepadd|visual|viu|viusage|vmapc|vmapclear|vne|vnew|vs|vsplit|vu|vunmap|w|wN|wNext|wa|wall|wh|while|win|winc|wincmd|windo|winp|winpos|winsize|wn|wnext|wp|wprevious|wq|wqa|wqall|write|ws|wsverb|wv|wviminfo|x|xa|xall|xit|xm|xmap|xmapc|xmapclear|xme|xmenu|xn|xnoremap|xnoreme|xnoremenu|xu|xunmap|y|yank)\b/,
"builtin": /\b(?:acd|ai|akm|aleph|allowrevins|altkeymap|ambiwidth|ambw|anti|antialias|arab|arabic|arabicshape|ari|arshape|autochdir|autocmd|autoindent|autoread|autowrite|autowriteall|aw|awa|background|backspace|backup|backupcopy|backupdir|backupext|backupskip|balloondelay|ballooneval|balloonexpr|bdir|bdlay|beval|bex|bexpr|bg|bh|bin|binary|biosk|bioskey|bk|bkc|bomb|breakat|brk|browsedir|bs|bsdir|bsk|bt|bufhidden|buflisted|buftype|casemap|ccv|cdpath|cedit|cfu|ch|charconvert|ci|cin|cindent|cink|cinkeys|cino|cinoptions|cinw|cinwords|clipboard|cmdheight|cmdwinheight|cmp|cms|columns|com|comments|commentstring|compatible|complete|completefunc|completeopt|consk|conskey|copyindent|cot|cpo|cpoptions|cpt|cscopepathcomp|cscopeprg|cscopequickfix|cscopetag|cscopetagorder|cscopeverbose|cspc|csprg|csqf|cst|csto|csverb|cuc|cul|cursorcolumn|cursorline|cwh|debug|deco|def|define|delcombine|dex|dg|dict|dictionary|diff|diffexpr|diffopt|digraph|dip|dir|directory|dy|ea|ead|eadirection|eb|ed|edcompatible|ef|efm|ei|ek|enc|encoding|endofline|eol|ep|equalalways|equalprg|errorbells|errorfile|errorformat|esckeys|et|eventignore|expandtab|exrc|fcl|fcs|fdc|fde|fdi|fdl|fdls|fdm|fdn|fdo|fdt|fen|fenc|fencs|fex|ff|ffs|fileencoding|fileencodings|fileformat|fileformats|fillchars|fk|fkmap|flp|fml|fmr|foldcolumn|foldenable|foldexpr|foldignore|foldlevel|foldlevelstart|foldmarker|foldmethod|foldminlines|foldnestmax|foldtext|formatexpr|formatlistpat|formatoptions|formatprg|fp|fs|fsync|ft|gcr|gd|gdefault|gfm|gfn|gfs|gfw|ghr|gp|grepformat|grepprg|gtl|gtt|guicursor|guifont|guifontset|guifontwide|guiheadroom|guioptions|guipty|guitablabel|guitabtooltip|helpfile|helpheight|helplang|hf|hh|hi|hidden|highlight|hk|hkmap|hkmapp|hkp|hl|hlg|hls|hlsearch|ic|icon|iconstring|ignorecase|im|imactivatekey|imak|imc|imcmdline|imd|imdisable|imi|iminsert|ims|imsearch|inc|include|includeexpr|incsearch|inde|indentexpr|indentkeys|indk|inex|inf|infercase|insertmode|invacd|invai|invakm|invallowrevins|invaltkeymap|invanti|invantialias|invar|invarab|invarabic|invarabicshape|invari|invarshape|invautochdir|invautoindent|invautoread|invautowrite|invautowriteall|invaw|invawa|invbackup|invballooneval|invbeval|invbin|invbinary|invbiosk|invbioskey|invbk|invbl|invbomb|invbuflisted|invcf|invci|invcin|invcindent|invcompatible|invconfirm|invconsk|invconskey|invcopyindent|invcp|invcscopetag|invcscopeverbose|invcst|invcsverb|invcuc|invcul|invcursorcolumn|invcursorline|invdeco|invdelcombine|invdg|invdiff|invdigraph|invdisable|invea|inveb|inved|invedcompatible|invek|invendofline|inveol|invequalalways|inverrorbells|invesckeys|invet|invex|invexpandtab|invexrc|invfen|invfk|invfkmap|invfoldenable|invgd|invgdefault|invguipty|invhid|invhidden|invhk|invhkmap|invhkmapp|invhkp|invhls|invhlsearch|invic|invicon|invignorecase|invim|invimc|invimcmdline|invimd|invincsearch|invinf|invinfercase|invinsertmode|invis|invjoinspaces|invjs|invlazyredraw|invlbr|invlinebreak|invlisp|invlist|invloadplugins|invlpl|invlz|invma|invmacatsui|invmagic|invmh|invml|invmod|invmodeline|invmodifiable|invmodified|invmore|invmousef|invmousefocus|invmousehide|invnu|invnumber|invodev|invopendevice|invpaste|invpi|invpreserveindent|invpreviewwindow|invprompt|invpvw|invreadonly|invremap|invrestorescreen|invrevins|invri|invrightleft|invrightleftcmd|invrl|invrlc|invro|invrs|invru|invruler|invsb|invsc|invscb|invscrollbind|invscs|invsecure|invsft|invshellslash|invshelltemp|invshiftround|invshortname|invshowcmd|invshowfulltag|invshowmatch|invshowmode|invsi|invsm|invsmartcase|invsmartindent|invsmarttab|invsmd|invsn|invsol|invspell|invsplitbelow|invsplitright|invspr|invsr|invssl|invsta|invstartofline|invstmp|invswapfile|invswf|invta|invtagbsearch|invtagrelative|invtagstack|invtbi|invtbidi|invtbs|invtermbidi|invterse|invtextauto|invtextmode|invtf|invtgst|invtildeop|invtimeout|invtitle|invto|invtop|invtr|invttimeout|invttybuiltin|invttyfast|invtx|invvb|invvisualbell|invwa|invwarn|invwb|invweirdinvert|invwfh|invwfw|invwildmenu|invwinfixheight|invwinfixwidth|invwiv|invwmnu|invwrap|invwrapscan|invwrite|invwriteany|invwritebackup|invws|isf|isfname|isi|isident|isk|iskeyword|isprint|joinspaces|js|key|keymap|keymodel|keywordprg|km|kmp|kp|langmap|langmenu|laststatus|lazyredraw|lbr|lcs|linebreak|lines|linespace|lisp|lispwords|listchars|loadplugins|lpl|lsp|lz|macatsui|magic|makeef|makeprg|matchpairs|matchtime|maxcombine|maxfuncdepth|maxmapdepth|maxmem|maxmempattern|maxmemtot|mco|mef|menuitems|mfd|mh|mis|mkspellmem|ml|mls|mm|mmd|mmp|mmt|modeline|modelines|modifiable|modified|more|mouse|mousef|mousefocus|mousehide|mousem|mousemodel|mouses|mouseshape|mouset|mousetime|mp|mps|msm|mzq|mzquantum|nf|noacd|noai|noakm|noallowrevins|noaltkeymap|noanti|noantialias|noar|noarab|noarabic|noarabicshape|noari|noarshape|noautochdir|noautoindent|noautoread|noautowrite|noautowriteall|noaw|noawa|nobackup|noballooneval|nobeval|nobin|nobinary|nobiosk|nobioskey|nobk|nobl|nobomb|nobuflisted|nocf|noci|nocin|nocindent|nocompatible|noconfirm|noconsk|noconskey|nocopyindent|nocp|nocscopetag|nocscopeverbose|nocst|nocsverb|nocuc|nocul|nocursorcolumn|nocursorline|nodeco|nodelcombine|nodg|nodiff|nodigraph|nodisable|noea|noeb|noed|noedcompatible|noek|noendofline|noeol|noequalalways|noerrorbells|noesckeys|noet|noex|noexpandtab|noexrc|nofen|nofk|nofkmap|nofoldenable|nogd|nogdefault|noguipty|nohid|nohidden|nohk|nohkmap|nohkmapp|nohkp|nohls|noic|noicon|noignorecase|noim|noimc|noimcmdline|noimd|noincsearch|noinf|noinfercase|noinsertmode|nois|nojoinspaces|nojs|nolazyredraw|nolbr|nolinebreak|nolisp|nolist|noloadplugins|nolpl|nolz|noma|nomacatsui|nomagic|nomh|noml|nomod|nomodeline|nomodifiable|nomodified|nomore|nomousef|nomousefocus|nomousehide|nonu|nonumber|noodev|noopendevice|nopaste|nopi|nopreserveindent|nopreviewwindow|noprompt|nopvw|noreadonly|noremap|norestorescreen|norevins|nori|norightleft|norightleftcmd|norl|norlc|noro|nors|noru|noruler|nosb|nosc|noscb|noscrollbind|noscs|nosecure|nosft|noshellslash|noshelltemp|noshiftround|noshortname|noshowcmd|noshowfulltag|noshowmatch|noshowmode|nosi|nosm|nosmartcase|nosmartindent|nosmarttab|nosmd|nosn|nosol|nospell|nosplitbelow|nosplitright|nospr|nosr|nossl|nosta|nostartofline|nostmp|noswapfile|noswf|nota|notagbsearch|notagrelative|notagstack|notbi|notbidi|notbs|notermbidi|noterse|notextauto|notextmode|notf|notgst|notildeop|notimeout|notitle|noto|notop|notr|nottimeout|nottybuiltin|nottyfast|notx|novb|novisualbell|nowa|nowarn|nowb|noweirdinvert|nowfh|nowfw|nowildmenu|nowinfixheight|nowinfixwidth|nowiv|nowmnu|nowrap|nowrapscan|nowrite|nowriteany|nowritebackup|nows|nrformats|numberwidth|nuw|odev|oft|ofu|omnifunc|opendevice|operatorfunc|opfunc|osfiletype|pa|para|paragraphs|paste|pastetoggle|patchexpr|patchmode|path|pdev|penc|pex|pexpr|pfn|ph|pheader|pi|pm|pmbcs|pmbfn|popt|preserveindent|previewheight|previewwindow|printdevice|printencoding|printexpr|printfont|printheader|printmbcharset|printmbfont|printoptions|prompt|pt|pumheight|pvh|pvw|qe|quoteescape|readonly|remap|report|restorescreen|revins|rightleft|rightleftcmd|rl|rlc|ro|rs|rtp|ruf|ruler|rulerformat|runtimepath|sbo|sc|scb|scr|scroll|scrollbind|scrolljump|scrolloff|scrollopt|scs|sect|sections|secure|sel|selection|selectmode|sessionoptions|sft|shcf|shellcmdflag|shellpipe|shellquote|shellredir|shellslash|shelltemp|shelltype|shellxquote|shiftround|shiftwidth|shm|shortmess|shortname|showbreak|showcmd|showfulltag|showmatch|showmode|showtabline|shq|si|sidescroll|sidescrolloff|siso|sj|slm|smartcase|smartindent|smarttab|smc|smd|softtabstop|sol|spc|spell|spellcapcheck|spellfile|spelllang|spellsuggest|spf|spl|splitbelow|splitright|sps|sr|srr|ss|ssl|ssop|stal|startofline|statusline|stl|stmp|su|sua|suffixes|suffixesadd|sw|swapfile|swapsync|swb|swf|switchbuf|sws|sxq|syn|synmaxcol|syntax|t_AB|t_AF|t_AL|t_CS|t_CV|t_Ce|t_Co|t_Cs|t_DL|t_EI|t_F1|t_F2|t_F3|t_F4|t_F5|t_F6|t_F7|t_F8|t_F9|t_IE|t_IS|t_K1|t_K3|t_K4|t_K5|t_K6|t_K7|t_K8|t_K9|t_KA|t_KB|t_KC|t_KD|t_KE|t_KF|t_KG|t_KH|t_KI|t_KJ|t_KK|t_KL|t_RI|t_RV|t_SI|t_Sb|t_Sf|t_WP|t_WS|t_ZH|t_ZR|t_al|t_bc|t_cd|t_ce|t_cl|t_cm|t_cs|t_da|t_db|t_dl|t_fs|t_k1|t_k2|t_k3|t_k4|t_k5|t_k6|t_k7|t_k8|t_k9|t_kB|t_kD|t_kI|t_kN|t_kP|t_kb|t_kd|t_ke|t_kh|t_kl|t_kr|t_ks|t_ku|t_le|t_mb|t_md|t_me|t_mr|t_ms|t_nd|t_op|t_se|t_so|t_sr|t_te|t_ti|t_ts|t_ue|t_us|t_ut|t_vb|t_ve|t_vi|t_vs|t_xs|tabline|tabpagemax|tabstop|tagbsearch|taglength|tagrelative|tagstack|tal|tb|tbi|tbidi|tbis|tbs|tenc|term|termbidi|termencoding|terse|textauto|textmode|textwidth|tgst|thesaurus|tildeop|timeout|timeoutlen|title|titlelen|titleold|titlestring|toolbar|toolbariconsize|top|tpm|tsl|tsr|ttimeout|ttimeoutlen|ttm|tty|ttybuiltin|ttyfast|ttym|ttymouse|ttyscroll|ttytype|tw|tx|uc|ul|undolevels|updatecount|updatetime|ut|vb|vbs|vdir|verbosefile|vfile|viewdir|viewoptions|viminfo|virtualedit|visualbell|vop|wak|warn|wb|wc|wcm|wd|weirdinvert|wfh|wfw|whichwrap|wi|wig|wildchar|wildcharm|wildignore|wildmenu|wildmode|wildoptions|wim|winaltkeys|window|winfixheight|winfixwidth|winheight|winminheight|winminwidth|winwidth|wiv|wiw|wm|wmh|wmnu|wmw|wop|wrap|wrapmargin|wrapscan|writeany|writebackup|writedelay|ww)\b/,
"number": /\b(?:0x[\da-f]+|\d+(?:\.\d+)?)\b/i,
"operator": /\|\||&&|[-+.]=?|[=!](?:[=~][#?]?)?|[<>]=?[#?]?|[*\/%?]|\b(?:is(?:not)?)\b/,
"punctuation": /[{}[\](),;:]/
};
Prism.languages["visual-basic"] = {
"comment": {
pattern: /(?:['‘’]|REM\b)(?:[^\r\n_]|_(?:\r\n?|\n)?)*/i,
inside: {
"keyword": /^REM/i
}
},
"directive": {
pattern: /#(?:Const|Else|ElseIf|End|ExternalChecksum|ExternalSource|If|Region)(?:\b_[ \t]*(?:\r\n?|\n)|.)+/i,
alias: "property",
greedy: true
},
"string": {
pattern: /\$?["“”](?:["“”]{2}|[^"“”])*["“”]C?/i,
greedy: true
},
"date": {
pattern: /#[ \t]*(?:\d+([/-])\d+\1\d+(?:[ \t]+(?:\d+[ \t]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[ \t]*(?:AM|PM))?))?|\d+[ \t]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[ \t]*(?:AM|PM))?)[ \t]*#/i,
alias: "number"
},
"number": /(?:(?:\b\d+(?:\.\d+)?|\.\d+)(?:E[+-]?\d+)?|&[HO][\dA-F]+)(?:[FRD]|U?[ILS])?/i,
"boolean": /\b(?:False|Nothing|True)\b/i,
"keyword": /\b(?:AddHandler|AddressOf|Alias|And(?:Also)?|As|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|C(?:Bool|Byte|Char|Date|Dbl|Dec|Int|Lng|Obj|SByte|Short|Sng|Str|Type|UInt|ULng|UShort)|Char|Class|Const|Continue|Currency|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else(?:If)?|End(?:If)?|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get(?:Type|XMLNamespace)?|Global|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|IsNot|Let|Lib|Like|Long|Loop|Me|Mod|Module|Must(?:Inherit|Override)|My(?:Base|Class)|Namespace|Narrowing|New|Next|Not(?:Inheritable|Overridable)?|Object|Of|On|Operator|Option(?:al)?|Or(?:Else)?|Out|Overloads|Overridable|Overrides|ParamArray|Partial|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|SByte|Select|Set|Shadows|Shared|short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TryCast|Type|TypeOf|U(?:Integer|Long|Short)|Until|Using|Variant|Wend|When|While|Widening|With(?:Events)?|WriteOnly|Xor)\b/i,
"operator": /[+\-*/\\^<=>&#@$%!]|\b_(?=[ \t]*[\r\n])/,
"punctuation": /[{}().,:?]/
};
Prism.languages.vb = Prism.languages["visual-basic"];
Prism.languages.vba = Prism.languages["visual-basic"];
Prism.languages.warpscript = {
"comment": /#.*|\/\/.*|\/\*[\s\S]*?\*\//,
"string": {
pattern: /"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'|<'(?:[^\\']|'(?!>)|\\.)*'>/,
greedy: true
},
"variable": /\$\S+/,
"macro": {
pattern: /@\S+/,
alias: "property"
},
"keyword": /\b(?:BREAK|CHECKMACRO|CONTINUE|CUDF|DEFINED|DEFINEDMACRO|EVAL|FAIL|FOR|FOREACH|FORSTEP|IFT|IFTE|MSGFAIL|NRETURN|RETHROW|RETURN|SWITCH|TRY|UDF|UNTIL|WHILE)\b/,
"number": /[+-]?\b(?:NaN|Infinity|\d+(?:\.\d*)?(?:[Ee][+-]?\d+)?|0x[\da-fA-F]+|0b[01]+)\b/,
"boolean": /\b(?:F|T|false|true)\b/,
"punctuation": /<%|%>|[{}[\]()]/,
"operator": /==|&&?|\|\|?|\*\*?|>>>?|<<|[<>!~]=?|[-/%^]|\+!?|\b(?:AND|NOT|OR)\b/
};
Prism.languages.wasm = {
"comment": [
/\(;[\s\S]*?;\)/,
{
pattern: /;;.*/,
greedy: true
}
],
"string": {
pattern: /"(?:\\[\s\S]|[^"\\])*"/,
greedy: true
},
"keyword": [
{
pattern: /\b(?:align|offset)=/,
inside: {
"operator": /=/
}
},
{
pattern: /\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,
inside: {
"punctuation": /\./
}
},
/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/
],
"variable": /\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,
"number": /[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,
"punctuation": /[()]/
};
(function(Prism2) {
var id = /(?:\B-|\b_|\b)[A-Za-z][\w-]*(?![\w-])/.source;
var type = "(?:" + /\b(?:unsigned\s+)?long\s+long(?![\w-])/.source + "|" + /\b(?:unrestricted|unsigned)\s+[a-z]+(?![\w-])/.source + "|" + /(?!(?:unrestricted|unsigned)\b)/.source + id + /(?:\s*<(?:[^<>]|<[^<>]*>)*>)?/.source + ")" + /(?:\s*\?)?/.source;
var typeInside = {};
Prism2.languages["web-idl"] = {
"comment": {
pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
greedy: true
},
"string": {
pattern: /"[^"]*"/,
greedy: true
},
"namespace": {
pattern: RegExp(/(\bnamespace\s+)/.source + id),
lookbehind: true
},
"class-name": [
{
pattern: /(^|[^\w-])(?:iterable|maplike|setlike)\s*<(?:[^<>]|<[^<>]*>)*>/,
lookbehind: true,
inside: typeInside
},
{
pattern: RegExp(/(\b(?:attribute|const|deleter|getter|optional|setter)\s+)/.source + type),
lookbehind: true,
inside: typeInside
},
{
pattern: RegExp("(" + /\bcallback\s+/.source + id + /\s*=\s*/.source + ")" + type),
lookbehind: true,
inside: typeInside
},
{
pattern: RegExp(/(\btypedef\b\s*)/.source + type),
lookbehind: true,
inside: typeInside
},
{
pattern: RegExp(/(\b(?:callback|dictionary|enum|interface(?:\s+mixin)?)\s+)(?!(?:interface|mixin)\b)/.source + id),
lookbehind: true
},
{
pattern: RegExp(/(:\s*)/.source + id),
lookbehind: true
},
RegExp(id + /(?=\s+(?:implements|includes)\b)/.source),
{
pattern: RegExp(/(\b(?:implements|includes)\s+)/.source + id),
lookbehind: true
},
{
pattern: RegExp(type + "(?=" + /\s*(?:\.{3}\s*)?/.source + id + /\s*[(),;=]/.source + ")"),
inside: typeInside
}
],
"builtin": /\b(?:ArrayBuffer|BigInt64Array|BigUint64Array|ByteString|DOMString|DataView|Float32Array|Float64Array|FrozenArray|Int16Array|Int32Array|Int8Array|ObservableArray|Promise|USVString|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray)\b/,
"keyword": [
/\b(?:async|attribute|callback|const|constructor|deleter|dictionary|enum|getter|implements|includes|inherit|interface|mixin|namespace|null|optional|or|partial|readonly|required|setter|static|stringifier|typedef|unrestricted)\b/,
/\b(?:any|bigint|boolean|byte|double|float|iterable|long|maplike|object|octet|record|sequence|setlike|short|symbol|undefined|unsigned|void)\b/
],
"boolean": /\b(?:false|true)\b/,
"number": {
pattern: /(^|[^\w-])-?(?:0x[0-9a-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|NaN|Infinity)(?![\w-])/i,
lookbehind: true
},
"operator": /\.{3}|[=:?<>-]/,
"punctuation": /[(){}[\].,;]/
};
for (var key in Prism2.languages["web-idl"]) {
if (key !== "class-name") {
typeInside[key] = Prism2.languages["web-idl"][key];
}
}
Prism2.languages["webidl"] = Prism2.languages["web-idl"];
})(Prism);
Prism.languages.wgsl = {
"comment": {
pattern: /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,
greedy: true
},
"builtin-attribute": {
pattern: /(@)builtin\(.*?\)/,
lookbehind: true,
inside: {
"attribute": {
pattern: /^builtin/,
alias: "attr-name"
},
"punctuation": /[(),]/,
"built-in-values": {
pattern: /\b(?:frag_depth|front_facing|global_invocation_id|instance_index|local_invocation_id|local_invocation_index|num_workgroups|position|sample_index|sample_mask|vertex_index|workgroup_id)\b/,
alias: "attr-value"
}
}
},
"attributes": {
pattern: /(@)(?:align|binding|compute|const|fragment|group|id|interpolate|invariant|location|size|vertex|workgroup_size)/i,
lookbehind: true,
alias: "attr-name"
},
"functions": {
pattern: /\b(fn\s+)[_a-zA-Z]\w*(?=[(<])/,
lookbehind: true,
alias: "function"
},
"keyword": /\b(?:bitcast|break|case|const|continue|continuing|default|discard|else|enable|fallthrough|fn|for|function|if|let|loop|private|return|storage|struct|switch|type|uniform|var|while|workgroup)\b/,
"builtin": /\b(?:abs|acos|acosh|all|any|array|asin|asinh|atan|atan2|atanh|atomic|atomicAdd|atomicAnd|atomicCompareExchangeWeak|atomicExchange|atomicLoad|atomicMax|atomicMin|atomicOr|atomicStore|atomicSub|atomicXor|bool|ceil|clamp|cos|cosh|countLeadingZeros|countOneBits|countTrailingZeros|cross|degrees|determinant|distance|dot|dpdx|dpdxCoarse|dpdxFine|dpdy|dpdyCoarse|dpdyFine|exp|exp2|extractBits|f32|f64|faceForward|firstLeadingBit|floor|fma|fract|frexp|fwidth|fwidthCoarse|fwidthFine|i32|i64|insertBits|inverseSqrt|ldexp|length|log|log2|mat[2-4]x[2-4]|max|min|mix|modf|normalize|override|pack2x16float|pack2x16snorm|pack2x16unorm|pack4x8snorm|pack4x8unorm|pow|ptr|quantizeToF16|radians|reflect|refract|reverseBits|round|sampler|sampler_comparison|select|shiftLeft|shiftRight|sign|sin|sinh|smoothstep|sqrt|staticAssert|step|storageBarrier|tan|tanh|textureDimensions|textureGather|textureGatherCompare|textureLoad|textureNumLayers|textureNumLevels|textureNumSamples|textureSample|textureSampleBias|textureSampleCompare|textureSampleCompareLevel|textureSampleGrad|textureSampleLevel|textureStore|texture_1d|texture_2d|texture_2d_array|texture_3d|texture_cube|texture_cube_array|texture_depth_2d|texture_depth_2d_array|texture_depth_cube|texture_depth_cube_array|texture_depth_multisampled_2d|texture_multisampled_2d|texture_storage_1d|texture_storage_2d|texture_storage_2d_array|texture_storage_3d|transpose|trunc|u32|u64|unpack2x16float|unpack2x16snorm|unpack2x16unorm|unpack4x8snorm|unpack4x8unorm|vec[2-4]|workgroupBarrier)\b/,
"function-calls": {
pattern: /\b[_a-z]\w*(?=\()/i,
alias: "function"
},
"class-name": /\b(?:[A-Z][A-Za-z0-9]*)\b/,
"bool-literal": {
pattern: /\b(?:false|true)\b/,
alias: "boolean"
},
"hex-int-literal": {
pattern: /\b0[xX][0-9a-fA-F]+[iu]?\b(?![.pP])/,
alias: "number"
},
"hex-float-literal": {
pattern: /\b0[xX][0-9a-fA-F]*(?:\.[0-9a-fA-F]*)?(?:[pP][+-]?\d+[fh]?)?/,
alias: "number"
},
"decimal-float-literal": [
{ pattern: /\d*\.\d+(?:[eE](?:\+|-)?\d+)?[fh]?/, alias: "number" },
{ pattern: /\d+\.\d*(?:[eE](?:\+|-)?\d+)?[fh]?/, alias: "number" },
{ pattern: /\d+[eE](?:\+|-)?\d+[fh]?/, alias: "number" },
{ pattern: /\b\d+[fh]\b/, alias: "number" }
],
"int-literal": {
pattern: /\b\d+[iu]?\b/,
alias: "number"
},
"operator": [
{ pattern: /(?:\^|~|\|(?!\|)|\|\||&&|<<|>>|!)(?!=)/ },
{ pattern: /&(?![&=])/ },
{ pattern: /(?:\+=|-=|\*=|\/=|%=|\^=|&=|\|=|<<=|>>=)/ },
{ pattern: /(^|[^<>=!])=(?![=>])/, lookbehind: true },
{ pattern: /(?:==|!=|<=|\+\+|--|(^|[^=])>=)/, lookbehind: true },
{ pattern: /(?:(?:[+%]|(?:\*(?!\w)))(?!=))|(?:-(?!>))|(?:\/(?!\/))/ },
{ pattern: /->/ }
],
"punctuation": /[@(){}[\],;<>:.]/
};
Prism.languages.wiki = Prism.languages.extend("markup", {
"block-comment": {
pattern: /(^|[^\\])\/\*[\s\S]*?\*\//,
lookbehind: true,
alias: "comment"
},
"heading": {
pattern: /^(=+)[^=\r\n].*?\1/m,
inside: {
"punctuation": /^=+|=+$/,
"important": /.+/
}
},
"emphasis": {
pattern: /('{2,5}).+?\1/,
inside: {
"bold-italic": {
pattern: /(''''').+?(?=\1)/,
lookbehind: true,
alias: ["bold", "italic"]
},
"bold": {
pattern: /(''')[^'](?:.*?[^'])?(?=\1)/,
lookbehind: true
},
"italic": {
pattern: /('')[^'](?:.*?[^'])?(?=\1)/,
lookbehind: true
},
"punctuation": /^''+|''+$/
}
},
"hr": {
pattern: /^-{4,}/m,
alias: "punctuation"
},
"url": [
/ISBN +(?:97[89][ -]?)?(?:\d[ -]?){9}[\dx]\b|(?:PMID|RFC) +\d+/i,
/\[\[.+?\]\]|\[.+?\]/
],
"variable": [
/__[A-Z]+__/,
/\{{3}.+?\}{3}/,
/\{\{.+?\}\}/
],
"symbol": [
/^#redirect/im,
/~{3,5}/
],
"table-tag": {
pattern: /((?:^|[|!])[|!])[^|\r\n]+\|(?!\|)/m,
lookbehind: true,
inside: {
"table-bar": {
pattern: /\|$/,
alias: "punctuation"
},
rest: Prism.languages.markup["tag"].inside
}
},
"punctuation": /^(?:\{\||\|\}|\|-|[*#:;!|])|\|\||!!/m
});
Prism.languages.insertBefore("wiki", "tag", {
"nowiki": {
pattern: /<(nowiki|pre|source)\b[^>]*>[\s\S]*?<\/\1>/i,
inside: {
"tag": {
pattern: /<(?:nowiki|pre|source)\b[^>]*>|<\/(?:nowiki|pre|source)>/i,
inside: Prism.languages.markup["tag"].inside
}
}
}
});
Prism.languages.wolfram = {
"comment": /\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,
"string": {
pattern: /"(?:\\.|[^"\\\r\n])*"/,
greedy: true
},
"keyword": /\b(?:Abs|AbsArg|Accuracy|Block|Do|For|Function|If|Manipulate|Module|Nest|NestList|None|Return|Switch|Table|Which|While)\b/,
"context": {
pattern: /\b\w+`+\w*/,
alias: "class-name"
},
"blank": {
pattern: /\b\w+_\b/,
alias: "regex"
},
"global-variable": {
pattern: /\$\w+/,
alias: "variable"
},
"boolean": /\b(?:False|True)\b/,
"number": /(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?j?\b/i,
"operator": /\/\.|;|=\.|\^=|\^:=|:=|<<|>>|<\||\|>|:>|\|->|->|<-|@@@|@@|@|\/@|=!=|===|==|=|\+|-|\[\/-+%=\]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,
"punctuation": /[{}[\];(),.:]/
};
Prism.languages.mathematica = Prism.languages.wolfram;
Prism.languages.wl = Prism.languages.wolfram;
Prism.languages.nb = Prism.languages.wolfram;
Prism.languages.wren = {
"comment": [
{
pattern: /\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*))*\*\/)*\*\/)*\*\//,
greedy: true
},
{
pattern: /(^|[^\\:])\/\/.*/,
lookbehind: true,
greedy: true
}
],
"triple-quoted-string": {
pattern: /"""[\s\S]*?"""/,
greedy: true,
alias: "string"
},
"string-literal": null,
"hashbang": {
pattern: /^#!\/.+/,
greedy: true,
alias: "comment"
},
"attribute": {
pattern: /#!?[ \t\u3000]*\w+/,
alias: "keyword"
},
"class-name": [
{
pattern: /(\bclass\s+)\w+/,
lookbehind: true
},
/\b[A-Z][a-z\d_]*\b/
],
"constant": /\b[A-Z][A-Z\d_]*\b/,
"null": {
pattern: /\bnull\b/,
alias: "keyword"
},
"keyword": /\b(?:as|break|class|construct|continue|else|for|foreign|if|import|in|is|return|static|super|this|var|while)\b/,
"boolean": /\b(?:false|true)\b/,
"number": /\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,
"function": /\b[a-z_]\w*(?=\s*[({])/i,
"operator": /<<|>>|[=!<>]=?|&&|\|\||[-+*/%~^&|?:]|\.{2,3}/,
"punctuation": /[\[\](){}.,;]/
};
Prism.languages.wren["string-literal"] = {
pattern: /(^|[^\\"])"(?:[^\\"%]|\\[\s\S]|%(?!\()|%\((?:[^()]|\((?:[^()]|\([^)]*\))*\))*\))*"/,
lookbehind: true,
greedy: true,
inside: {
"interpolation": {
pattern: /((?:^|[^\\])(?:\\{2})*)%\((?:[^()]|\((?:[^()]|\([^)]*\))*\))*\)/,
lookbehind: true,
inside: {
"expression": {
pattern: /^(%\()[\s\S]+(?=\)$)/,
lookbehind: true,
inside: Prism.languages.wren
},
"interpolation-punctuation": {
pattern: /^%\(|\)$/,
alias: "punctuation"
}
}
},
"string": /[\s\S]+/
}
};
(function(Prism2) {
Prism2.languages.xeora = Prism2.languages.extend("markup", {
"constant": {
pattern: /\$(?:DomainContents|PageRenderDuration)\$/,
inside: {
"punctuation": {
pattern: /\$/
}
}
},
"variable": {
pattern: /\$@?(?:#+|[-+*~=^])?[\w.]+\$/,
inside: {
"punctuation": {
pattern: /[$.]/
},
"operator": {
pattern: /#+|[-+*~=^@]/
}
}
},
"function-inline": {
pattern: /\$F:[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\$/,
inside: {
"variable": {
pattern: /(?:[,|])@?(?:#+|[-+*~=^])?[\w.]+/,
inside: {
"punctuation": {
pattern: /[,.|]/
},
"operator": {
pattern: /#+|[-+*~=^@]/
}
}
},
"punctuation": {
pattern: /\$\w:|[$:?.,|]/
}
},
alias: "function"
},
"function-block": {
pattern: /\$XF:\{[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\}:XF\$/,
inside: {
"punctuation": {
pattern: /[$:{}?.,|]/
}
},
alias: "function"
},
"directive-inline": {
pattern: /\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\/\w.]+\$/,
inside: {
"punctuation": {
pattern: /\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,
inside: {
"tag": {
pattern: /#\d/
}
}
}
},
alias: "function"
},
"directive-block-open": {
pattern: /\$\w+:\{|\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\w.]+:\{(?:![A-Z]+)?/,
inside: {
"punctuation": {
pattern: /\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,
inside: {
"tag": {
pattern: /#\d/
}
}
},
"attribute": {
pattern: /![A-Z]+$/,
inside: {
"punctuation": {
pattern: /!/
}
},
alias: "keyword"
}
},
alias: "function"
},
"directive-block-separator": {
pattern: /\}:[-\w.]+:\{/,
inside: {
"punctuation": {
pattern: /[:{}]/
}
},
alias: "function"
},
"directive-block-close": {
pattern: /\}:[-\w.]+\$/,
inside: {
"punctuation": {
pattern: /[:{}$]/
}
},
alias: "function"
}
});
Prism2.languages.insertBefore("inside", "punctuation", {
"variable": Prism2.languages.xeora["function-inline"].inside["variable"]
}, Prism2.languages.xeora["function-block"]);
Prism2.languages.xeoracube = Prism2.languages.xeora;
})(Prism);
(function(Prism2) {
function insertDocComment(lang, docComment) {
if (Prism2.languages[lang]) {
Prism2.languages.insertBefore(lang, "comment", {
"doc-comment": docComment
});
}
}
var tag = Prism2.languages.markup.tag;
var slashDocComment = {
pattern: /\/\/\/.*/,
greedy: true,
alias: "comment",
inside: {
"tag": tag
}
};
var tickDocComment = {
pattern: /'''.*/,
greedy: true,
alias: "comment",
inside: {
"tag": tag
}
};
insertDocComment("csharp", slashDocComment);
insertDocComment("fsharp", slashDocComment);
insertDocComment("vbnet", tickDocComment);
})(Prism);
Prism.languages.xojo = {
"comment": {
pattern: /(?:'|\/\/|Rem\b).+/i,
greedy: true
},
"string": {
pattern: /"(?:""|[^"])*"/,
greedy: true
},
"number": [
/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,
/&[bchou][a-z\d]+/i
],
"directive": {
pattern: /#(?:Else|ElseIf|Endif|If|Pragma)\b/i,
alias: "property"
},
"keyword": /\b(?:AddHandler|App|Array|As(?:signs)?|Auto|Boolean|Break|By(?:Ref|Val)|Byte|Call|Case|Catch|CFStringRef|CGFloat|Class|Color|Const|Continue|CString|Currency|CurrentMethodName|Declare|Delegate|Dim|Do(?:uble|wnTo)?|Each|Else(?:If)?|End|Enumeration|Event|Exception|Exit|Extends|False|Finally|For|Function|Get|GetTypeInfo|Global|GOTO|If|Implements|In|Inherits|Int(?:8|16|32|64|eger|erface)?|Lib|Loop|Me|Module|Next|Nil|Object|Optional|OSType|ParamArray|Private|Property|Protected|PString|Ptr|Raise(?:Event)?|ReDim|RemoveHandler|Return|Select(?:or)?|Self|Set|Shared|Short|Single|Soft|Static|Step|String|Sub|Super|Text|Then|To|True|Try|Ubound|UInt(?:8|16|32|64|eger)?|Until|Using|Var(?:iant)?|Wend|While|WindowPtr|WString)\b/i,
"operator": /<[=>]?|>=?|[+\-*\/\\^=]|\b(?:AddressOf|And|Ctype|IsA?|Mod|New|Not|Or|WeakAddressOf|Xor)\b/i,
"punctuation": /[.,;:()]/
};
(function(Prism2) {
Prism2.languages.xquery = Prism2.languages.extend("markup", {
"xquery-comment": {
pattern: /\(:[\s\S]*?:\)/,
greedy: true,
alias: "comment"
},
"string": {
pattern: /(["'])(?:\1\1|(?!\1)[\s\S])*\1/,
greedy: true
},
"extension": {
pattern: /\(#.+?#\)/,
alias: "symbol"
},
"variable": /\$[-\w:]+/,
"axis": {
pattern: /(^|[^-])(?:ancestor(?:-or-self)?|attribute|child|descendant(?:-or-self)?|following(?:-sibling)?|parent|preceding(?:-sibling)?|self)(?=::)/,
lookbehind: true,
alias: "operator"
},
"keyword-operator": {
pattern: /(^|[^:-])\b(?:and|castable as|div|eq|except|ge|gt|idiv|instance of|intersect|is|le|lt|mod|ne|or|union)\b(?=$|[^:-])/,
lookbehind: true,
alias: "operator"
},
"keyword": {
pattern: /(^|[^:-])\b(?:as|ascending|at|base-uri|boundary-space|case|cast as|collation|construction|copy-namespaces|declare|default|descending|else|empty (?:greatest|least)|encoding|every|external|for|function|if|import|in|inherit|lax|let|map|module|namespace|no-inherit|no-preserve|option|order(?: by|ed|ing)?|preserve|return|satisfies|schema|some|stable|strict|strip|then|to|treat as|typeswitch|unordered|validate|variable|version|where|xquery)\b(?=$|[^:-])/,
lookbehind: true
},
"function": /[\w-]+(?::[\w-]+)*(?=\s*\()/,
"xquery-element": {
pattern: /(element\s+)[\w-]+(?::[\w-]+)*/,
lookbehind: true,
alias: "tag"
},
"xquery-attribute": {
pattern: /(attribute\s+)[\w-]+(?::[\w-]+)*/,
lookbehind: true,
alias: "attr-name"
},
"builtin": {
pattern: /(^|[^:-])\b(?:attribute|comment|document|element|processing-instruction|text|xs:(?:ENTITIES|ENTITY|ID|IDREFS?|NCName|NMTOKENS?|NOTATION|Name|QName|anyAtomicType|anyType|anyURI|base64Binary|boolean|byte|date|dateTime|dayTimeDuration|decimal|double|duration|float|gDay|gMonth|gMonthDay|gYear|gYearMonth|hexBinary|int|integer|language|long|negativeInteger|nonNegativeInteger|nonPositiveInteger|normalizedString|positiveInteger|short|string|time|token|unsigned(?:Byte|Int|Long|Short)|untyped(?:Atomic)?|yearMonthDuration))\b(?=$|[^:-])/,
lookbehind: true
},
"number": /\b\d+(?:\.\d+)?(?:E[+-]?\d+)?/,
"operator": [
/[+*=?|@]|\.\.?|:=|!=|<[=<]?|>[=>]?/,
{
pattern: /(\s)-(?=\s)/,
lookbehind: true
}
],
"punctuation": /[[\](){},;:/]/
});
Prism2.languages.xquery.tag.pattern = /<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/;
Prism2.languages.xquery["tag"].inside["attr-value"].pattern = /=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+)/;
Prism2.languages.xquery["tag"].inside["attr-value"].inside["punctuation"] = /^="|"$/;
Prism2.languages.xquery["tag"].inside["attr-value"].inside["expression"] = {
pattern: /\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}/,
inside: Prism2.languages.xquery,
alias: "language-xquery"
};
var stringifyToken = function(token) {
if (typeof token === "string") {
return token;
}
if (typeof token.content === "string") {
return token.content;
}
return token.content.map(stringifyToken).join("");
};
var walkTokens = function(tokens) {
var openedTags = [];
for (var i = 0; i < tokens.length; i++) {
var token = tokens[i];
var notTagNorBrace = false;
if (typeof token !== "string") {
if (token.type === "tag" && token.content[0] && token.content[0].type === "tag") {
if (token.content[0].content[0].content === "</") {
if (openedTags.length > 0 && openedTags[openedTags.length - 1].tagName === stringifyToken(token.content[0].content[1])) {
openedTags.pop();
}
} else {
if (token.content[token.content.length - 1].content === "/>") {
} else {
openedTags.push({
tagName: stringifyToken(token.content[0].content[1]),
openedBraces: 0
});
}
}
} else if (openedTags.length > 0 && token.type === "punctuation" && token.content === "{" && (!tokens[i + 1] || tokens[i + 1].type !== "punctuation" || tokens[i + 1].content !== "{") && (!tokens[i - 1] || tokens[i - 1].type !== "plain-text" || tokens[i - 1].content !== "{")) {
openedTags[openedTags.length - 1].openedBraces++;
} else if (openedTags.length > 0 && openedTags[openedTags.length - 1].openedBraces > 0 && token.type === "punctuation" && token.content === "}") {
openedTags[openedTags.length - 1].openedBraces--;
} else if (token.type !== "comment") {
notTagNorBrace = true;
}
}
if (notTagNorBrace || typeof token === "string") {
if (openedTags.length > 0 && openedTags[openedTags.length - 1].openedBraces === 0) {
var plainText = stringifyToken(token);
if (i < tokens.length - 1 && (typeof tokens[i + 1] === "string" || tokens[i + 1].type === "plain-text")) {
plainText += stringifyToken(tokens[i + 1]);
tokens.splice(i + 1, 1);
}
if (i > 0 && (typeof tokens[i - 1] === "string" || tokens[i - 1].type === "plain-text")) {
plainText = stringifyToken(tokens[i - 1]) + plainText;
tokens.splice(i - 1, 1);
i--;
}
if (/^\s+$/.test(plainText)) {
tokens[i] = plainText;
} else {
tokens[i] = new Prism2.Token("plain-text", plainText, null, plainText);
}
}
}
if (token.content && typeof token.content !== "string") {
walkTokens(token.content);
}
}
};
Prism2.hooks.add("after-tokenize", function(env) {
if (env.language !== "xquery") {
return;
}
walkTokens(env.tokens);
});
})(Prism);
Prism.languages.yang = {
"comment": /\/\*[\s\S]*?\*\/|\/\/.*/,
"string": {
pattern: /"(?:[^\\"]|\\.)*"|'[^']*'/,
greedy: true
},
"keyword": {
pattern: /(^|[{};\r\n][ \t]*)[a-z_][\w.-]*/i,
lookbehind: true
},
"namespace": {
pattern: /(\s)[a-z_][\w.-]*(?=:)/i,
lookbehind: true
},
"boolean": /\b(?:false|true)\b/,
"operator": /\+/,
"punctuation": /[{};:]/
};
(function(Prism2) {
function literal(str) {
return function() {
return str;
};
}
var keyword = /\b(?:align|allowzero|and|anyframe|anytype|asm|async|await|break|cancel|catch|comptime|const|continue|defer|else|enum|errdefer|error|export|extern|fn|for|if|inline|linksection|nakedcc|noalias|nosuspend|null|or|orelse|packed|promise|pub|resume|return|stdcallcc|struct|suspend|switch|test|threadlocal|try|undefined|union|unreachable|usingnamespace|var|volatile|while)\b/;
var IDENTIFIER = "\\b(?!" + keyword.source + ")(?!\\d)\\w+\\b";
var ALIGN = /align\s*\((?:[^()]|\([^()]*\))*\)/.source;
var PREFIX_TYPE_OP = /(?:\?|\bpromise->|(?:\[[^[\]]*\]|\*(?!\*)|\*\*)(?:\s*<ALIGN>|\s*const\b|\s*volatile\b|\s*allowzero\b)*)/.source.replace(/<ALIGN>/g, literal(ALIGN));
var SUFFIX_EXPR = /(?:\bpromise\b|(?:\berror\.)?<ID>(?:\.<ID>)*(?!\s+<ID>))/.source.replace(/<ID>/g, literal(IDENTIFIER));
var TYPE = "(?!\\s)(?:!?\\s*(?:" + PREFIX_TYPE_OP + "\\s*)*" + SUFFIX_EXPR + ")+";
Prism2.languages.zig = {
"comment": [
{
pattern: /\/\/[/!].*/,
alias: "doc-comment"
},
/\/{2}.*/
],
"string": [
{
pattern: /(^|[^\\@])c?"(?:[^"\\\r\n]|\\.)*"/,
lookbehind: true,
greedy: true
},
{
pattern: /([\r\n])([ \t]+c?\\{2}).*(?:(?:\r\n?|\n)\2.*)*/,
lookbehind: true,
greedy: true
}
],
"char": {
pattern: /(^|[^\\])'(?:[^'\\\r\n]|[\uD800-\uDFFF]{2}|\\(?:.|x[a-fA-F\d]{2}|u\{[a-fA-F\d]{1,6}\}))'/,
lookbehind: true,
greedy: true
},
"builtin": /\B@(?!\d)\w+(?=\s*\()/,
"label": {
pattern: /(\b(?:break|continue)\s*:\s*)\w+\b|\b(?!\d)\w+\b(?=\s*:\s*(?:\{|while\b))/,
lookbehind: true
},
"class-name": [
/\b(?!\d)\w+(?=\s*=\s*(?:(?:extern|packed)\s+)?(?:enum|struct|union)\s*[({])/,
{
pattern: RegExp(/(:\s*)<TYPE>(?=\s*(?:<ALIGN>\s*)?[=;,)])|<TYPE>(?=\s*(?:<ALIGN>\s*)?\{)/.source.replace(/<TYPE>/g, literal(TYPE)).replace(/<ALIGN>/g, literal(ALIGN))),
lookbehind: true,
inside: null
},
{
pattern: RegExp(/(\)\s*)<TYPE>(?=\s*(?:<ALIGN>\s*)?;)/.source.replace(/<TYPE>/g, literal(TYPE)).replace(/<ALIGN>/g, literal(ALIGN))),
lookbehind: true,
inside: null
}
],
"builtin-type": {
pattern: /\b(?:anyerror|bool|c_u?(?:int|long|longlong|short)|c_longdouble|c_void|comptime_(?:float|int)|f(?:16|32|64|128)|[iu](?:8|16|32|64|128|size)|noreturn|type|void)\b/,
alias: "keyword"
},
"keyword": keyword,
"function": /\b(?!\d)\w+(?=\s*\()/,
"number": /\b(?:0b[01]+|0o[0-7]+|0x[a-fA-F\d]+(?:\.[a-fA-F\d]*)?(?:[pP][+-]?[a-fA-F\d]+)?|\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)\b/,
"boolean": /\b(?:false|true)\b/,
"operator": /\.[*?]|\.{2,3}|[-=]>|\*\*|\+\+|\|\||(?:<<|>>|[-+*]%|[-+*/%^&|<>!=])=?|[?~]/,
"punctuation": /[.:,;(){}[\]]/
};
Prism2.languages.zig["class-name"].forEach(function(obj) {
if (obj.inside === null) {
obj.inside = Prism2.languages.zig;
}
});
})(Prism);
(function() {
if (typeof Prism === "undefined" || typeof document === "undefined") {
return;
}
var PLUGIN_NAME = "line-numbers";
var NEW_LINE_EXP = /\n(?!$)/g;
var config = Prism.plugins.lineNumbers = {
getLine: function(element, number) {
if (element.tagName !== "PRE" || !element.classList.contains(PLUGIN_NAME)) {
return;
}
var lineNumberRows = element.querySelector(".line-numbers-rows");
if (!lineNumberRows) {
return;
}
var lineNumberStart = parseInt(element.getAttribute("data-start"), 10) || 1;
var lineNumberEnd = lineNumberStart + (lineNumberRows.children.length - 1);
if (number < lineNumberStart) {
number = lineNumberStart;
}
if (number > lineNumberEnd) {
number = lineNumberEnd;
}
var lineIndex = number - lineNumberStart;
return lineNumberRows.children[lineIndex];
},
resize: function(element) {
resizeElements([element]);
},
assumeViewportIndependence: true
};
function resizeElements(elements) {
elements = elements.filter(function(e) {
var codeStyles = getStyles(e);
var whiteSpace = codeStyles["white-space"];
return whiteSpace === "pre-wrap" || whiteSpace === "pre-line";
});
if (elements.length == 0) {
return;
}
var infos = elements.map(function(element) {
var codeElement = element.querySelector("code");
var lineNumbersWrapper = element.querySelector(".line-numbers-rows");
if (!codeElement || !lineNumbersWrapper) {
return void 0;
}
var lineNumberSizer = element.querySelector(".line-numbers-sizer");
var codeLines = codeElement.textContent.split(NEW_LINE_EXP);
if (!lineNumberSizer) {
lineNumberSizer = document.createElement("span");
lineNumberSizer.className = "line-numbers-sizer";
codeElement.appendChild(lineNumberSizer);
}
lineNumberSizer.innerHTML = "0";
lineNumberSizer.style.display = "block";
var oneLinerHeight = lineNumberSizer.getBoundingClientRect().height;
lineNumberSizer.innerHTML = "";
return {
element,
lines: codeLines,
lineHeights: [],
oneLinerHeight,
sizer: lineNumberSizer
};
}).filter(Boolean);
infos.forEach(function(info) {
var lineNumberSizer = info.sizer;
var lines = info.lines;
var lineHeights = info.lineHeights;
var oneLinerHeight = info.oneLinerHeight;
lineHeights[lines.length - 1] = void 0;
lines.forEach(function(line, index) {
if (line && line.length > 1) {
var e = lineNumberSizer.appendChild(document.createElement("span"));
e.style.display = "block";
e.textContent = line;
} else {
lineHeights[index] = oneLinerHeight;
}
});
});
infos.forEach(function(info) {
var lineNumberSizer = info.sizer;
var lineHeights = info.lineHeights;
var childIndex = 0;
for (var i = 0; i < lineHeights.length; i++) {
if (lineHeights[i] === void 0) {
lineHeights[i] = lineNumberSizer.children[childIndex++].getBoundingClientRect().height;
}
}
});
infos.forEach(function(info) {
var lineNumberSizer = info.sizer;
var wrapper = info.element.querySelector(".line-numbers-rows");
lineNumberSizer.style.display = "none";
lineNumberSizer.innerHTML = "";
info.lineHeights.forEach(function(height, lineNumber) {
wrapper.children[lineNumber].style.height = height + "px";
});
});
}
function getStyles(element) {
if (!element) {
return null;
}
return window.getComputedStyle ? getComputedStyle(element) : element.currentStyle || null;
}
var lastWidth = void 0;
window.addEventListener("resize", function() {
if (config.assumeViewportIndependence && lastWidth === window.innerWidth) {
return;
}
lastWidth = window.innerWidth;
resizeElements(Array.prototype.slice.call(document.querySelectorAll("pre." + PLUGIN_NAME)));
});
Prism.hooks.add("complete", function(env) {
if (!env.code) {
return;
}
var code = env.element;
var pre = code.parentNode;
if (!pre || !/pre/i.test(pre.nodeName)) {
return;
}
if (code.querySelector(".line-numbers-rows")) {
return;
}
if (!Prism.util.isActive(code, PLUGIN_NAME)) {
return;
}
code.classList.remove(PLUGIN_NAME);
pre.classList.add(PLUGIN_NAME);
var match = env.code.match(NEW_LINE_EXP);
var linesNum = match ? match.length + 1 : 1;
var lineNumbersWrapper;
var lines = new Array(linesNum + 1).join("<span></span>");
lineNumbersWrapper = document.createElement("span");
lineNumbersWrapper.setAttribute("aria-hidden", "true");
lineNumbersWrapper.className = "line-numbers-rows";
lineNumbersWrapper.innerHTML = lines;
if (pre.hasAttribute("data-start")) {
pre.style.counterReset = "linenumber " + (parseInt(pre.getAttribute("data-start"), 10) - 1);
}
env.element.appendChild(lineNumbersWrapper);
resizeElements([pre]);
Prism.hooks.run("line-numbers", env);
});
Prism.hooks.add("line-numbers", function(env) {
env.plugins = env.plugins || {};
env.plugins.lineNumbers = true;
});
})();
(function() {
if (typeof Prism === "undefined" || typeof document === "undefined") {
return;
}
if (!Element.prototype.matches) {
Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
}
var LOADING_MESSAGE = "Loading\u2026";
var FAILURE_MESSAGE = function(status, message) {
return "\u2716 Error " + status + " while fetching file: " + message;
};
var FAILURE_EMPTY_MESSAGE = "\u2716 Error: File does not exist or is empty";
var EXTENSIONS = {
"js": "javascript",
"py": "python",
"rb": "ruby",
"ps1": "powershell",
"psm1": "powershell",
"sh": "bash",
"bat": "batch",
"h": "c",
"tex": "latex"
};
var STATUS_ATTR = "data-src-status";
var STATUS_LOADING = "loading";
var STATUS_LOADED = "loaded";
var STATUS_FAILED = "failed";
var SELECTOR = "pre[data-src]:not([" + STATUS_ATTR + '="' + STATUS_LOADED + '"]):not([' + STATUS_ATTR + '="' + STATUS_LOADING + '"])';
function loadFile(src, success, error) {
var xhr = new XMLHttpRequest();
xhr.open("GET", src, true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if (xhr.status < 400 && xhr.responseText) {
success(xhr.responseText);
} else {
if (xhr.status >= 400) {
error(FAILURE_MESSAGE(xhr.status, xhr.statusText));
} else {
error(FAILURE_EMPTY_MESSAGE);
}
}
}
};
xhr.send(null);
}
function parseRange(range2) {
var m = /^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(range2 || "");
if (m) {
var start2 = Number(m[1]);
var comma = m[2];
var end2 = m[3];
if (!comma) {
return [start2, start2];
}
if (!end2) {
return [start2, void 0];
}
return [start2, Number(end2)];
}
return void 0;
}
Prism.hooks.add("before-highlightall", function(env) {
env.selector += ", " + SELECTOR;
});
Prism.hooks.add("before-sanity-check", function(env) {
var pre = env.element;
if (pre.matches(SELECTOR)) {
env.code = "";
pre.setAttribute(STATUS_ATTR, STATUS_LOADING);
var code = pre.appendChild(document.createElement("CODE"));
code.textContent = LOADING_MESSAGE;
var src = pre.getAttribute("data-src");
var language = env.language;
if (language === "none") {
var extension = (/\.(\w+)$/.exec(src) || [, "none"])[1];
language = EXTENSIONS[extension] || extension;
}
Prism.util.setLanguage(code, language);
Prism.util.setLanguage(pre, language);
var autoloader = Prism.plugins.autoloader;
if (autoloader) {
autoloader.loadLanguages(language);
}
loadFile(src, function(text) {
pre.setAttribute(STATUS_ATTR, STATUS_LOADED);
var range2 = parseRange(pre.getAttribute("data-range"));
if (range2) {
var lines = text.split(/\r\n?|\n/g);
var start2 = range2[0];
var end2 = range2[1] == null ? lines.length : range2[1];
if (start2 < 0) {
start2 += lines.length;
}
start2 = Math.max(0, Math.min(start2 - 1, lines.length));
if (end2 < 0) {
end2 += lines.length;
}
end2 = Math.max(0, Math.min(end2, lines.length));
text = lines.slice(start2, end2).join("\n");
if (!pre.hasAttribute("data-start")) {
pre.setAttribute("data-start", String(start2 + 1));
}
}
code.textContent = text;
Prism.highlightElement(code);
}, function(error) {
pre.setAttribute(STATUS_ATTR, STATUS_FAILED);
code.textContent = error;
});
}
});
Prism.plugins.fileHighlight = {
highlight: function highlight(container) {
var elements = (container || document).querySelectorAll(SELECTOR);
for (var i = 0, element; element = elements[i++]; ) {
Prism.highlightElement(element);
}
}
};
var logged = false;
Prism.fileHighlight = function() {
if (!logged) {
console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead.");
logged = true;
}
Prism.plugins.fileHighlight.highlight.apply(this, arguments);
};
})();
}
});
// vendor/topbar.js
var require_topbar = __commonJS({
"vendor/topbar.js"(exports, module) {
(function(window2, document2) {
"use strict";
(function() {
var lastTime = 0;
var vendors = ["ms", "moz", "webkit", "o"];
for (var x = 0; x < vendors.length && !window2.requestAnimationFrame; ++x) {
window2.requestAnimationFrame = window2[vendors[x] + "RequestAnimationFrame"];
window2.cancelAnimationFrame = window2[vendors[x] + "CancelAnimationFrame"] || window2[vendors[x] + "CancelRequestAnimationFrame"];
}
if (!window2.requestAnimationFrame)
window2.requestAnimationFrame = function(callback, element) {
var currTime = new Date().getTime();
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
var id = window2.setTimeout(function() {
callback(currTime + timeToCall);
}, timeToCall);
lastTime = currTime + timeToCall;
return id;
};
if (!window2.cancelAnimationFrame)
window2.cancelAnimationFrame = function(id) {
clearTimeout(id);
};
})();
var canvas, progressTimerId, fadeTimerId, currentProgress, showing, addEvent = function(elem, type, handler) {
if (elem.addEventListener)
elem.addEventListener(type, handler, false);
else if (elem.attachEvent)
elem.attachEvent("on" + type, handler);
else
elem["on" + type] = handler;
}, options = {
autoRun: true,
barThickness: 3,
barColors: {
0: "rgba(26, 188, 156, .9)",
".25": "rgba(52, 152, 219, .9)",
".50": "rgba(241, 196, 15, .9)",
".75": "rgba(230, 126, 34, .9)",
"1.0": "rgba(211, 84, 0, .9)"
},
shadowBlur: 10,
shadowColor: "rgba(0, 0, 0, .6)",
className: null
}, repaint = function() {
canvas.width = window2.innerWidth;
canvas.height = options.barThickness * 5;
var ctx = canvas.getContext("2d");
ctx.shadowBlur = options.shadowBlur;
ctx.shadowColor = options.shadowColor;
var lineGradient = ctx.createLinearGradient(0, 0, canvas.width, 0);
for (var stop in options.barColors)
lineGradient.addColorStop(stop, options.barColors[stop]);
ctx.lineWidth = options.barThickness;
ctx.beginPath();
ctx.moveTo(0, options.barThickness / 2);
ctx.lineTo(Math.ceil(currentProgress * canvas.width), options.barThickness / 2);
ctx.strokeStyle = lineGradient;
ctx.stroke();
}, createCanvas = function() {
canvas = document2.createElement("canvas");
var style = canvas.style;
style.position = "fixed";
style.top = style.left = style.right = style.margin = style.padding = 0;
style.zIndex = 100001;
style.display = "none";
if (options.className)
canvas.classList.add(options.className);
document2.body.appendChild(canvas);
addEvent(window2, "resize", repaint);
}, topbar2 = {
config: function(opts) {
for (var key in opts)
if (options.hasOwnProperty(key))
options[key] = opts[key];
},
show: function() {
if (showing)
return;
showing = true;
if (fadeTimerId !== null)
window2.cancelAnimationFrame(fadeTimerId);
if (!canvas)
createCanvas();
canvas.style.opacity = 1;
canvas.style.display = "block";
topbar2.progress(0);
if (options.autoRun) {
(function loop() {
progressTimerId = window2.requestAnimationFrame(loop);
topbar2.progress("+" + 0.05 * Math.pow(1 - Math.sqrt(currentProgress), 2));
})();
}
},
progress: function(to) {
if (typeof to === "undefined")
return currentProgress;
if (typeof to === "string") {
to = (to.indexOf("+") >= 0 || to.indexOf("-") >= 0 ? currentProgress : 0) + parseFloat(to);
}
currentProgress = to > 1 ? 1 : to;
repaint();
return currentProgress;
},
hide: function() {
if (!showing)
return;
showing = false;
if (progressTimerId != null) {
window2.cancelAnimationFrame(progressTimerId);
progressTimerId = null;
}
(function loop() {
if (topbar2.progress("+.1") >= 1) {
canvas.style.opacity -= 0.05;
if (canvas.style.opacity <= 0.05) {
canvas.style.display = "none";
fadeTimerId = null;
return;
}
}
fadeTimerId = window2.requestAnimationFrame(loop);
})();
}
};
if (typeof module === "object" && typeof module.exports === "object") {
module.exports = topbar2;
} else if (typeof define === "function" && define.amd) {
define(function() {
return topbar2;
});
} else {
this.topbar = topbar2;
}
}).call(exports, window, document);
}
});
// js/app.js
var import_jquery3 = __toESM(require_jquery());
// node_modules/@popperjs/core/lib/index.js
var lib_exports = {};
__export(lib_exports, {
afterMain: () => afterMain,
afterRead: () => afterRead,
afterWrite: () => afterWrite,
applyStyles: () => applyStyles_default,
arrow: () => arrow_default,
auto: () => auto,
basePlacements: () => basePlacements,
beforeMain: () => beforeMain,
beforeRead: () => beforeRead,
beforeWrite: () => beforeWrite,
bottom: () => bottom,
clippingParents: () => clippingParents,
computeStyles: () => computeStyles_default,
createPopper: () => createPopper3,
createPopperBase: () => createPopper,
createPopperLite: () => createPopper2,
detectOverflow: () => detectOverflow,
end: () => end,
eventListeners: () => eventListeners_default,
flip: () => flip_default,
hide: () => hide_default,
left: () => left,
main: () => main,
modifierPhases: () => modifierPhases,
offset: () => offset_default,
placements: () => placements,
popper: () => popper,
popperGenerator: () => popperGenerator,
popperOffsets: () => popperOffsets_default,
preventOverflow: () => preventOverflow_default,
read: () => read,
reference: () => reference,
right: () => right,
start: () => start,
top: () => top,
variationPlacements: () => variationPlacements,
viewport: () => viewport,
write: () => write
});
// node_modules/@popperjs/core/lib/enums.js
var top = "top";
var bottom = "bottom";
var right = "right";
var left = "left";
var auto = "auto";
var basePlacements = [top, bottom, right, left];
var start = "start";
var end = "end";
var clippingParents = "clippingParents";
var viewport = "viewport";
var popper = "popper";
var reference = "reference";
var variationPlacements = /* @__PURE__ */ basePlacements.reduce(function(acc, placement) {
return acc.concat([placement + "-" + start, placement + "-" + end]);
}, []);
var placements = /* @__PURE__ */ [].concat(basePlacements, [auto]).reduce(function(acc, placement) {
return acc.concat([placement, placement + "-" + start, placement + "-" + end]);
}, []);
var beforeRead = "beforeRead";
var read = "read";
var afterRead = "afterRead";
var beforeMain = "beforeMain";
var main = "main";
var afterMain = "afterMain";
var beforeWrite = "beforeWrite";
var write = "write";
var afterWrite = "afterWrite";
var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];
// node_modules/@popperjs/core/lib/dom-utils/getNodeName.js
function getNodeName(element) {
return element ? (element.nodeName || "").toLowerCase() : null;
}
// node_modules/@popperjs/core/lib/dom-utils/getWindow.js
function getWindow(node) {
if (node == null) {
return window;
}
if (node.toString() !== "[object Window]") {
var ownerDocument = node.ownerDocument;
return ownerDocument ? ownerDocument.defaultView || window : window;
}
return node;
}
// node_modules/@popperjs/core/lib/dom-utils/instanceOf.js
function isElement(node) {
var OwnElement = getWindow(node).Element;
return node instanceof OwnElement || node instanceof Element;
}
function isHTMLElement(node) {
var OwnElement = getWindow(node).HTMLElement;
return node instanceof OwnElement || node instanceof HTMLElement;
}
function isShadowRoot(node) {
if (typeof ShadowRoot === "undefined") {
return false;
}
var OwnElement = getWindow(node).ShadowRoot;
return node instanceof OwnElement || node instanceof ShadowRoot;
}
// node_modules/@popperjs/core/lib/modifiers/applyStyles.js
function applyStyles(_ref) {
var state = _ref.state;
Object.keys(state.elements).forEach(function(name) {
var style = state.styles[name] || {};
var attributes = state.attributes[name] || {};
var element = state.elements[name];
if (!isHTMLElement(element) || !getNodeName(element)) {
return;
}
Object.assign(element.style, style);
Object.keys(attributes).forEach(function(name2) {
var value = attributes[name2];
if (value === false) {
element.removeAttribute(name2);
} else {
element.setAttribute(name2, value === true ? "" : value);
}
});
});
}
function effect(_ref2) {
var state = _ref2.state;
var initialStyles = {
popper: {
position: state.options.strategy,
left: "0",
top: "0",
margin: "0"
},
arrow: {
position: "absolute"
},
reference: {}
};
Object.assign(state.elements.popper.style, initialStyles.popper);
state.styles = initialStyles;
if (state.elements.arrow) {
Object.assign(state.elements.arrow.style, initialStyles.arrow);
}
return function() {
Object.keys(state.elements).forEach(function(name) {
var element = state.elements[name];
var attributes = state.attributes[name] || {};
var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]);
var style = styleProperties.reduce(function(style2, property) {
style2[property] = "";
return style2;
}, {});
if (!isHTMLElement(element) || !getNodeName(element)) {
return;
}
Object.assign(element.style, style);
Object.keys(attributes).forEach(function(attribute) {
element.removeAttribute(attribute);
});
});
};
}
var applyStyles_default = {
name: "applyStyles",
enabled: true,
phase: "write",
fn: applyStyles,
effect,
requires: ["computeStyles"]
};
// node_modules/@popperjs/core/lib/utils/getBasePlacement.js
function getBasePlacement(placement) {
return placement.split("-")[0];
}
// node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js
function getBoundingClientRect(element, includeScale) {
if (includeScale === void 0) {
includeScale = false;
}
var rect = element.getBoundingClientRect();
var scaleX = 1;
var scaleY = 1;
return {
width: rect.width / scaleX,
height: rect.height / scaleY,
top: rect.top / scaleY,
right: rect.right / scaleX,
bottom: rect.bottom / scaleY,
left: rect.left / scaleX,
x: rect.left / scaleX,
y: rect.top / scaleY
};
}
// node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js
function getLayoutRect(element) {
var clientRect = getBoundingClientRect(element);
var width = element.offsetWidth;
var height = element.offsetHeight;
if (Math.abs(clientRect.width - width) <= 1) {
width = clientRect.width;
}
if (Math.abs(clientRect.height - height) <= 1) {
height = clientRect.height;
}
return {
x: element.offsetLeft,
y: element.offsetTop,
width,
height
};
}
// node_modules/@popperjs/core/lib/dom-utils/contains.js
function contains(parent, child) {
var rootNode = child.getRootNode && child.getRootNode();
if (parent.contains(child)) {
return true;
} else if (rootNode && isShadowRoot(rootNode)) {
var next = child;
do {
if (next && parent.isSameNode(next)) {
return true;
}
next = next.parentNode || next.host;
} while (next);
}
return false;
}
// node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js
function getComputedStyle2(element) {
return getWindow(element).getComputedStyle(element);
}
// node_modules/@popperjs/core/lib/dom-utils/isTableElement.js
function isTableElement(element) {
return ["table", "td", "th"].indexOf(getNodeName(element)) >= 0;
}
// node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js
function getDocumentElement(element) {
return ((isElement(element) ? element.ownerDocument : element.document) || window.document).documentElement;
}
// node_modules/@popperjs/core/lib/dom-utils/getParentNode.js
function getParentNode(element) {
if (getNodeName(element) === "html") {
return element;
}
return element.assignedSlot || element.parentNode || (isShadowRoot(element) ? element.host : null) || getDocumentElement(element);
}
// node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js
function getTrueOffsetParent(element) {
if (!isHTMLElement(element) || getComputedStyle2(element).position === "fixed") {
return null;
}
return element.offsetParent;
}
function getContainingBlock(element) {
var isFirefox = navigator.userAgent.toLowerCase().indexOf("firefox") !== -1;
var isIE = navigator.userAgent.indexOf("Trident") !== -1;
if (isIE && isHTMLElement(element)) {
var elementCss = getComputedStyle2(element);
if (elementCss.position === "fixed") {
return null;
}
}
var currentNode = getParentNode(element);
while (isHTMLElement(currentNode) && ["html", "body"].indexOf(getNodeName(currentNode)) < 0) {
var css = getComputedStyle2(currentNode);
if (css.transform !== "none" || css.perspective !== "none" || css.contain === "paint" || ["transform", "perspective"].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === "filter" || isFirefox && css.filter && css.filter !== "none") {
return currentNode;
} else {
currentNode = currentNode.parentNode;
}
}
return null;
}
function getOffsetParent(element) {
var window2 = getWindow(element);
var offsetParent = getTrueOffsetParent(element);
while (offsetParent && isTableElement(offsetParent) && getComputedStyle2(offsetParent).position === "static") {
offsetParent = getTrueOffsetParent(offsetParent);
}
if (offsetParent && (getNodeName(offsetParent) === "html" || getNodeName(offsetParent) === "body" && getComputedStyle2(offsetParent).position === "static")) {
return window2;
}
return offsetParent || getContainingBlock(element) || window2;
}
// node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js
function getMainAxisFromPlacement(placement) {
return ["top", "bottom"].indexOf(placement) >= 0 ? "x" : "y";
}
// node_modules/@popperjs/core/lib/utils/math.js
var max = Math.max;
var min = Math.min;
var round = Math.round;
// node_modules/@popperjs/core/lib/utils/within.js
function within(min2, value, max2) {
return max(min2, min(value, max2));
}
// node_modules/@popperjs/core/lib/utils/getFreshSideObject.js
function getFreshSideObject() {
return {
top: 0,
right: 0,
bottom: 0,
left: 0
};
}
// node_modules/@popperjs/core/lib/utils/mergePaddingObject.js
function mergePaddingObject(paddingObject) {
return Object.assign({}, getFreshSideObject(), paddingObject);
}
// node_modules/@popperjs/core/lib/utils/expandToHashMap.js
function expandToHashMap(value, keys) {
return keys.reduce(function(hashMap, key) {
hashMap[key] = value;
return hashMap;
}, {});
}
// node_modules/@popperjs/core/lib/modifiers/arrow.js
var toPaddingObject = function toPaddingObject2(padding, state) {
padding = typeof padding === "function" ? padding(Object.assign({}, state.rects, {
placement: state.placement
})) : padding;
return mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements));
};
function arrow(_ref) {
var _state$modifiersData$;
var state = _ref.state, name = _ref.name, options = _ref.options;
var arrowElement = state.elements.arrow;
var popperOffsets2 = state.modifiersData.popperOffsets;
var basePlacement = getBasePlacement(state.placement);
var axis = getMainAxisFromPlacement(basePlacement);
var isVertical = [left, right].indexOf(basePlacement) >= 0;
var len = isVertical ? "height" : "width";
if (!arrowElement || !popperOffsets2) {
return;
}
var paddingObject = toPaddingObject(options.padding, state);
var arrowRect = getLayoutRect(arrowElement);
var minProp = axis === "y" ? top : left;
var maxProp = axis === "y" ? bottom : right;
var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets2[axis] - state.rects.popper[len];
var startDiff = popperOffsets2[axis] - state.rects.reference[axis];
var arrowOffsetParent = getOffsetParent(arrowElement);
var clientSize = arrowOffsetParent ? axis === "y" ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;
var centerToReference = endDiff / 2 - startDiff / 2;
var min2 = paddingObject[minProp];
var max2 = clientSize - arrowRect[len] - paddingObject[maxProp];
var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;
var offset2 = within(min2, center, max2);
var axisProp = axis;
state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset2, _state$modifiersData$.centerOffset = offset2 - center, _state$modifiersData$);
}
function effect2(_ref2) {
var state = _ref2.state, options = _ref2.options;
var _options$element = options.element, arrowElement = _options$element === void 0 ? "[data-popper-arrow]" : _options$element;
if (arrowElement == null) {
return;
}
if (typeof arrowElement === "string") {
arrowElement = state.elements.popper.querySelector(arrowElement);
if (!arrowElement) {
return;
}
}
if (true) {
if (!isHTMLElement(arrowElement)) {
console.error(['Popper: "arrow" element must be an HTMLElement (not an SVGElement).', "To use an SVG arrow, wrap it in an HTMLElement that will be used as", "the arrow."].join(" "));
}
}
if (!contains(state.elements.popper, arrowElement)) {
if (true) {
console.error(['Popper: "arrow" modifier\'s `element` must be a child of the popper', "element."].join(" "));
}
return;
}
state.elements.arrow = arrowElement;
}
var arrow_default = {
name: "arrow",
enabled: true,
phase: "main",
fn: arrow,
effect: effect2,
requires: ["popperOffsets"],
requiresIfExists: ["preventOverflow"]
};
// node_modules/@popperjs/core/lib/utils/getVariation.js
function getVariation(placement) {
return placement.split("-")[1];
}
// node_modules/@popperjs/core/lib/modifiers/computeStyles.js
var unsetSides = {
top: "auto",
right: "auto",
bottom: "auto",
left: "auto"
};
function roundOffsetsByDPR(_ref) {
var x = _ref.x, y = _ref.y;
var win = window;
var dpr = win.devicePixelRatio || 1;
return {
x: round(round(x * dpr) / dpr) || 0,
y: round(round(y * dpr) / dpr) || 0
};
}
function mapToStyles(_ref2) {
var _Object$assign2;
var popper2 = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, variation = _ref2.variation, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets;
var _ref3 = roundOffsets === true ? roundOffsetsByDPR(offsets) : typeof roundOffsets === "function" ? roundOffsets(offsets) : offsets, _ref3$x = _ref3.x, x = _ref3$x === void 0 ? 0 : _ref3$x, _ref3$y = _ref3.y, y = _ref3$y === void 0 ? 0 : _ref3$y;
var hasX = offsets.hasOwnProperty("x");
var hasY = offsets.hasOwnProperty("y");
var sideX = left;
var sideY = top;
var win = window;
if (adaptive) {
var offsetParent = getOffsetParent(popper2);
var heightProp = "clientHeight";
var widthProp = "clientWidth";
if (offsetParent === getWindow(popper2)) {
offsetParent = getDocumentElement(popper2);
if (getComputedStyle2(offsetParent).position !== "static" && position === "absolute") {
heightProp = "scrollHeight";
widthProp = "scrollWidth";
}
}
offsetParent = offsetParent;
if (placement === top || (placement === left || placement === right) && variation === end) {
sideY = bottom;
y -= offsetParent[heightProp] - popperRect.height;
y *= gpuAcceleration ? 1 : -1;
}
if (placement === left || (placement === top || placement === bottom) && variation === end) {
sideX = right;
x -= offsetParent[widthProp] - popperRect.width;
x *= gpuAcceleration ? 1 : -1;
}
}
var commonStyles = Object.assign({
position
}, adaptive && unsetSides);
if (gpuAcceleration) {
var _Object$assign;
return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? "0" : "", _Object$assign[sideX] = hasX ? "0" : "", _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign));
}
return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : "", _Object$assign2[sideX] = hasX ? x + "px" : "", _Object$assign2.transform = "", _Object$assign2));
}
function computeStyles(_ref4) {
var state = _ref4.state, options = _ref4.options;
var _options$gpuAccelerat = options.gpuAcceleration, gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, _options$adaptive = options.adaptive, adaptive = _options$adaptive === void 0 ? true : _options$adaptive, _options$roundOffsets = options.roundOffsets, roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;
if (true) {
var transitionProperty = getComputedStyle2(state.elements.popper).transitionProperty || "";
if (adaptive && ["transform", "top", "right", "bottom", "left"].some(function(property) {
return transitionProperty.indexOf(property) >= 0;
})) {
console.warn(["Popper: Detected CSS transitions on at least one of the following", 'CSS properties: "transform", "top", "right", "bottom", "left".', "\n\n", 'Disable the "computeStyles" modifier\'s `adaptive` option to allow', "for smooth transitions, or remove these properties from the CSS", "transition declaration on the popper element if only transitioning", "opacity or background-color for example.", "\n\n", "We recommend using the popper element as a wrapper around an inner", "element that can have any CSS property transitioned for animations."].join(" "));
}
}
var commonStyles = {
placement: getBasePlacement(state.placement),
variation: getVariation(state.placement),
popper: state.elements.popper,
popperRect: state.rects.popper,
gpuAcceleration
};
if (state.modifiersData.popperOffsets != null) {
state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {
offsets: state.modifiersData.popperOffsets,
position: state.options.strategy,
adaptive,
roundOffsets
})));
}
if (state.modifiersData.arrow != null) {
state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {
offsets: state.modifiersData.arrow,
position: "absolute",
adaptive: false,
roundOffsets
})));
}
state.attributes.popper = Object.assign({}, state.attributes.popper, {
"data-popper-placement": state.placement
});
}
var computeStyles_default = {
name: "computeStyles",
enabled: true,
phase: "beforeWrite",
fn: computeStyles,
data: {}
};
// node_modules/@popperjs/core/lib/modifiers/eventListeners.js
var passive = {
passive: true
};
function effect3(_ref) {
var state = _ref.state, instance = _ref.instance, options = _ref.options;
var _options$scroll = options.scroll, scroll = _options$scroll === void 0 ? true : _options$scroll, _options$resize = options.resize, resize = _options$resize === void 0 ? true : _options$resize;
var window2 = getWindow(state.elements.popper);
var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);
if (scroll) {
scrollParents.forEach(function(scrollParent) {
scrollParent.addEventListener("scroll", instance.update, passive);
});
}
if (resize) {
window2.addEventListener("resize", instance.update, passive);
}
return function() {
if (scroll) {
scrollParents.forEach(function(scrollParent) {
scrollParent.removeEventListener("scroll", instance.update, passive);
});
}
if (resize) {
window2.removeEventListener("resize", instance.update, passive);
}
};
}
var eventListeners_default = {
name: "eventListeners",
enabled: true,
phase: "write",
fn: function fn() {
},
effect: effect3,
data: {}
};
// node_modules/@popperjs/core/lib/utils/getOppositePlacement.js
var hash = {
left: "right",
right: "left",
bottom: "top",
top: "bottom"
};
function getOppositePlacement(placement) {
return placement.replace(/left|right|bottom|top/g, function(matched) {
return hash[matched];
});
}
// node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js
var hash2 = {
start: "end",
end: "start"
};
function getOppositeVariationPlacement(placement) {
return placement.replace(/start|end/g, function(matched) {
return hash2[matched];
});
}
// node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js
function getWindowScroll(node) {
var win = getWindow(node);
var scrollLeft = win.pageXOffset;
var scrollTop = win.pageYOffset;
return {
scrollLeft,
scrollTop
};
}
// node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js
function getWindowScrollBarX(element) {
return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;
}
// node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js
function getViewportRect(element) {
var win = getWindow(element);
var html = getDocumentElement(element);
var visualViewport = win.visualViewport;
var width = html.clientWidth;
var height = html.clientHeight;
var x = 0;
var y = 0;
if (visualViewport) {
width = visualViewport.width;
height = visualViewport.height;
if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {
x = visualViewport.offsetLeft;
y = visualViewport.offsetTop;
}
}
return {
width,
height,
x: x + getWindowScrollBarX(element),
y
};
}
// node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js
function getDocumentRect(element) {
var _element$ownerDocumen;
var html = getDocumentElement(element);
var winScroll = getWindowScroll(element);
var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;
var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);
var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);
var x = -winScroll.scrollLeft + getWindowScrollBarX(element);
var y = -winScroll.scrollTop;
if (getComputedStyle2(body || html).direction === "rtl") {
x += max(html.clientWidth, body ? body.clientWidth : 0) - width;
}
return {
width,
height,
x,
y
};
}
// node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js
function isScrollParent(element) {
var _getComputedStyle = getComputedStyle2(element), overflow = _getComputedStyle.overflow, overflowX = _getComputedStyle.overflowX, overflowY = _getComputedStyle.overflowY;
return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);
}
// node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js
function getScrollParent(node) {
if (["html", "body", "#document"].indexOf(getNodeName(node)) >= 0) {
return node.ownerDocument.body;
}
if (isHTMLElement(node) && isScrollParent(node)) {
return node;
}
return getScrollParent(getParentNode(node));
}
// node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js
function listScrollParents(element, list) {
var _element$ownerDocumen;
if (list === void 0) {
list = [];
}
var scrollParent = getScrollParent(element);
var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);
var win = getWindow(scrollParent);
var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;
var updatedList = list.concat(target);
return isBody ? updatedList : updatedList.concat(listScrollParents(getParentNode(target)));
}
// node_modules/@popperjs/core/lib/utils/rectToClientRect.js
function rectToClientRect(rect) {
return Object.assign({}, rect, {
left: rect.x,
top: rect.y,
right: rect.x + rect.width,
bottom: rect.y + rect.height
});
}
// node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js
function getInnerBoundingClientRect(element) {
var rect = getBoundingClientRect(element);
rect.top = rect.top + element.clientTop;
rect.left = rect.left + element.clientLeft;
rect.bottom = rect.top + element.clientHeight;
rect.right = rect.left + element.clientWidth;
rect.width = element.clientWidth;
rect.height = element.clientHeight;
rect.x = rect.left;
rect.y = rect.top;
return rect;
}
function getClientRectFromMixedType(element, clippingParent) {
return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isHTMLElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));
}
function getClippingParents(element) {
var clippingParents2 = listScrollParents(getParentNode(element));
var canEscapeClipping = ["absolute", "fixed"].indexOf(getComputedStyle2(element).position) >= 0;
var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;
if (!isElement(clipperElement)) {
return [];
}
return clippingParents2.filter(function(clippingParent) {
return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== "body";
});
}
function getClippingRect(element, boundary, rootBoundary) {
var mainClippingParents = boundary === "clippingParents" ? getClippingParents(element) : [].concat(boundary);
var clippingParents2 = [].concat(mainClippingParents, [rootBoundary]);
var firstClippingParent = clippingParents2[0];
var clippingRect = clippingParents2.reduce(function(accRect, clippingParent) {
var rect = getClientRectFromMixedType(element, clippingParent);
accRect.top = max(rect.top, accRect.top);
accRect.right = min(rect.right, accRect.right);
accRect.bottom = min(rect.bottom, accRect.bottom);
accRect.left = max(rect.left, accRect.left);
return accRect;
}, getClientRectFromMixedType(element, firstClippingParent));
clippingRect.width = clippingRect.right - clippingRect.left;
clippingRect.height = clippingRect.bottom - clippingRect.top;
clippingRect.x = clippingRect.left;
clippingRect.y = clippingRect.top;
return clippingRect;
}
// node_modules/@popperjs/core/lib/utils/computeOffsets.js
function computeOffsets(_ref) {
var reference2 = _ref.reference, element = _ref.element, placement = _ref.placement;
var basePlacement = placement ? getBasePlacement(placement) : null;
var variation = placement ? getVariation(placement) : null;
var commonX = reference2.x + reference2.width / 2 - element.width / 2;
var commonY = reference2.y + reference2.height / 2 - element.height / 2;
var offsets;
switch (basePlacement) {
case top:
offsets = {
x: commonX,
y: reference2.y - element.height
};
break;
case bottom:
offsets = {
x: commonX,
y: reference2.y + reference2.height
};
break;
case right:
offsets = {
x: reference2.x + reference2.width,
y: commonY
};
break;
case left:
offsets = {
x: reference2.x - element.width,
y: commonY
};
break;
default:
offsets = {
x: reference2.x,
y: reference2.y
};
}
var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;
if (mainAxis != null) {
var len = mainAxis === "y" ? "height" : "width";
switch (variation) {
case start:
offsets[mainAxis] = offsets[mainAxis] - (reference2[len] / 2 - element[len] / 2);
break;
case end:
offsets[mainAxis] = offsets[mainAxis] + (reference2[len] / 2 - element[len] / 2);
break;
default:
}
}
return offsets;
}
// node_modules/@popperjs/core/lib/utils/detectOverflow.js
function detectOverflow(state, options) {
if (options === void 0) {
options = {};
}
var _options = options, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding;
var paddingObject = mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements));
var altContext = elementContext === popper ? reference : popper;
var popperRect = state.rects.popper;
var element = state.elements[altBoundary ? altContext : elementContext];
var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);
var referenceClientRect = getBoundingClientRect(state.elements.reference);
var popperOffsets2 = computeOffsets({
reference: referenceClientRect,
element: popperRect,
strategy: "absolute",
placement
});
var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets2));
var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect;
var overflowOffsets = {
top: clippingClientRect.top - elementClientRect.top + paddingObject.top,
bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,
left: clippingClientRect.left - elementClientRect.left + paddingObject.left,
right: elementClientRect.right - clippingClientRect.right + paddingObject.right
};
var offsetData = state.modifiersData.offset;
if (elementContext === popper && offsetData) {
var offset2 = offsetData[placement];
Object.keys(overflowOffsets).forEach(function(key) {
var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;
var axis = [top, bottom].indexOf(key) >= 0 ? "y" : "x";
overflowOffsets[key] += offset2[axis] * multiply;
});
}
return overflowOffsets;
}
// node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js
function computeAutoPlacement(state, options) {
if (options === void 0) {
options = {};
}
var _options = options, placement = _options.placement, boundary = _options.boundary, rootBoundary = _options.rootBoundary, padding = _options.padding, flipVariations = _options.flipVariations, _options$allowedAutoP = _options.allowedAutoPlacements, allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP;
var variation = getVariation(placement);
var placements2 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function(placement2) {
return getVariation(placement2) === variation;
}) : basePlacements;
var allowedPlacements = placements2.filter(function(placement2) {
return allowedAutoPlacements.indexOf(placement2) >= 0;
});
if (allowedPlacements.length === 0) {
allowedPlacements = placements2;
if (true) {
console.error(["Popper: The `allowedAutoPlacements` option did not allow any", "placements. Ensure the `placement` option matches the variation", "of the allowed placements.", 'For example, "auto" cannot be used to allow "bottom-start".', 'Use "auto-start" instead.'].join(" "));
}
}
var overflows = allowedPlacements.reduce(function(acc, placement2) {
acc[placement2] = detectOverflow(state, {
placement: placement2,
boundary,
rootBoundary,
padding
})[getBasePlacement(placement2)];
return acc;
}, {});
return Object.keys(overflows).sort(function(a, b) {
return overflows[a] - overflows[b];
});
}
// node_modules/@popperjs/core/lib/modifiers/flip.js
function getExpandedFallbackPlacements(placement) {
if (getBasePlacement(placement) === auto) {
return [];
}
var oppositePlacement = getOppositePlacement(placement);
return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];
}
function flip(_ref) {
var state = _ref.state, options = _ref.options, name = _ref.name;
if (state.modifiersData[name]._skip) {
return;
}
var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, specifiedFallbackPlacements = options.fallbackPlacements, padding = options.padding, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, _options$flipVariatio = options.flipVariations, flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, allowedAutoPlacements = options.allowedAutoPlacements;
var preferredPlacement = state.options.placement;
var basePlacement = getBasePlacement(preferredPlacement);
var isBasePlacement = basePlacement === preferredPlacement;
var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));
var placements2 = [preferredPlacement].concat(fallbackPlacements).reduce(function(acc, placement2) {
return acc.concat(getBasePlacement(placement2) === auto ? computeAutoPlacement(state, {
placement: placement2,
boundary,
rootBoundary,
padding,
flipVariations,
allowedAutoPlacements
}) : placement2);
}, []);
var referenceRect = state.rects.reference;
var popperRect = state.rects.popper;
var checksMap = /* @__PURE__ */ new Map();
var makeFallbackChecks = true;
var firstFittingPlacement = placements2[0];
for (var i = 0; i < placements2.length; i++) {
var placement = placements2[i];
var _basePlacement = getBasePlacement(placement);
var isStartVariation = getVariation(placement) === start;
var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;
var len = isVertical ? "width" : "height";
var overflow = detectOverflow(state, {
placement,
boundary,
rootBoundary,
altBoundary,
padding
});
var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;
if (referenceRect[len] > popperRect[len]) {
mainVariationSide = getOppositePlacement(mainVariationSide);
}
var altVariationSide = getOppositePlacement(mainVariationSide);
var checks = [];
if (checkMainAxis) {
checks.push(overflow[_basePlacement] <= 0);
}
if (checkAltAxis) {
checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);
}
if (checks.every(function(check) {
return check;
})) {
firstFittingPlacement = placement;
makeFallbackChecks = false;
break;
}
checksMap.set(placement, checks);
}
if (makeFallbackChecks) {
var numberOfChecks = flipVariations ? 3 : 1;
var _loop = function _loop2(_i2) {
var fittingPlacement = placements2.find(function(placement2) {
var checks2 = checksMap.get(placement2);
if (checks2) {
return checks2.slice(0, _i2).every(function(check) {
return check;
});
}
});
if (fittingPlacement) {
firstFittingPlacement = fittingPlacement;
return "break";
}
};
for (var _i = numberOfChecks; _i > 0; _i--) {
var _ret = _loop(_i);
if (_ret === "break")
break;
}
}
if (state.placement !== firstFittingPlacement) {
state.modifiersData[name]._skip = true;
state.placement = firstFittingPlacement;
state.reset = true;
}
}
var flip_default = {
name: "flip",
enabled: true,
phase: "main",
fn: flip,
requiresIfExists: ["offset"],
data: {
_skip: false
}
};
// node_modules/@popperjs/core/lib/modifiers/hide.js
function getSideOffsets(overflow, rect, preventedOffsets) {
if (preventedOffsets === void 0) {
preventedOffsets = {
x: 0,
y: 0
};
}
return {
top: overflow.top - rect.height - preventedOffsets.y,
right: overflow.right - rect.width + preventedOffsets.x,
bottom: overflow.bottom - rect.height + preventedOffsets.y,
left: overflow.left - rect.width - preventedOffsets.x
};
}
function isAnySideFullyClipped(overflow) {
return [top, right, bottom, left].some(function(side) {
return overflow[side] >= 0;
});
}
function hide(_ref) {
var state = _ref.state, name = _ref.name;
var referenceRect = state.rects.reference;
var popperRect = state.rects.popper;
var preventedOffsets = state.modifiersData.preventOverflow;
var referenceOverflow = detectOverflow(state, {
elementContext: "reference"
});
var popperAltOverflow = detectOverflow(state, {
altBoundary: true
});
var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);
var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);
var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);
var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);
state.modifiersData[name] = {
referenceClippingOffsets,
popperEscapeOffsets,
isReferenceHidden,
hasPopperEscaped
};
state.attributes.popper = Object.assign({}, state.attributes.popper, {
"data-popper-reference-hidden": isReferenceHidden,
"data-popper-escaped": hasPopperEscaped
});
}
var hide_default = {
name: "hide",
enabled: true,
phase: "main",
requiresIfExists: ["preventOverflow"],
fn: hide
};
// node_modules/@popperjs/core/lib/modifiers/offset.js
function distanceAndSkiddingToXY(placement, rects, offset2) {
var basePlacement = getBasePlacement(placement);
var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;
var _ref = typeof offset2 === "function" ? offset2(Object.assign({}, rects, {
placement
})) : offset2, skidding = _ref[0], distance = _ref[1];
skidding = skidding || 0;
distance = (distance || 0) * invertDistance;
return [left, right].indexOf(basePlacement) >= 0 ? {
x: distance,
y: skidding
} : {
x: skidding,
y: distance
};
}
function offset(_ref2) {
var state = _ref2.state, options = _ref2.options, name = _ref2.name;
var _options$offset = options.offset, offset2 = _options$offset === void 0 ? [0, 0] : _options$offset;
var data = placements.reduce(function(acc, placement) {
acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset2);
return acc;
}, {});
var _data$state$placement = data[state.placement], x = _data$state$placement.x, y = _data$state$placement.y;
if (state.modifiersData.popperOffsets != null) {
state.modifiersData.popperOffsets.x += x;
state.modifiersData.popperOffsets.y += y;
}
state.modifiersData[name] = data;
}
var offset_default = {
name: "offset",
enabled: true,
phase: "main",
requires: ["popperOffsets"],
fn: offset
};
// node_modules/@popperjs/core/lib/modifiers/popperOffsets.js
function popperOffsets(_ref) {
var state = _ref.state, name = _ref.name;
state.modifiersData[name] = computeOffsets({
reference: state.rects.reference,
element: state.rects.popper,
strategy: "absolute",
placement: state.placement
});
}
var popperOffsets_default = {
name: "popperOffsets",
enabled: true,
phase: "read",
fn: popperOffsets,
data: {}
};
// node_modules/@popperjs/core/lib/utils/getAltAxis.js
function getAltAxis(axis) {
return axis === "x" ? "y" : "x";
}
// node_modules/@popperjs/core/lib/modifiers/preventOverflow.js
function preventOverflow(_ref) {
var state = _ref.state, options = _ref.options, name = _ref.name;
var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, padding = options.padding, _options$tether = options.tether, tether = _options$tether === void 0 ? true : _options$tether, _options$tetherOffset = options.tetherOffset, tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;
var overflow = detectOverflow(state, {
boundary,
rootBoundary,
padding,
altBoundary
});
var basePlacement = getBasePlacement(state.placement);
var variation = getVariation(state.placement);
var isBasePlacement = !variation;
var mainAxis = getMainAxisFromPlacement(basePlacement);
var altAxis = getAltAxis(mainAxis);
var popperOffsets2 = state.modifiersData.popperOffsets;
var referenceRect = state.rects.reference;
var popperRect = state.rects.popper;
var tetherOffsetValue = typeof tetherOffset === "function" ? tetherOffset(Object.assign({}, state.rects, {
placement: state.placement
})) : tetherOffset;
var data = {
x: 0,
y: 0
};
if (!popperOffsets2) {
return;
}
if (checkMainAxis || checkAltAxis) {
var mainSide = mainAxis === "y" ? top : left;
var altSide = mainAxis === "y" ? bottom : right;
var len = mainAxis === "y" ? "height" : "width";
var offset2 = popperOffsets2[mainAxis];
var min2 = popperOffsets2[mainAxis] + overflow[mainSide];
var max2 = popperOffsets2[mainAxis] - overflow[altSide];
var additive = tether ? -popperRect[len] / 2 : 0;
var minLen = variation === start ? referenceRect[len] : popperRect[len];
var maxLen = variation === start ? -popperRect[len] : -referenceRect[len];
var arrowElement = state.elements.arrow;
var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {
width: 0,
height: 0
};
var arrowPaddingObject = state.modifiersData["arrow#persistent"] ? state.modifiersData["arrow#persistent"].padding : getFreshSideObject();
var arrowPaddingMin = arrowPaddingObject[mainSide];
var arrowPaddingMax = arrowPaddingObject[altSide];
var arrowLen = within(0, referenceRect[len], arrowRect[len]);
var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - tetherOffsetValue : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue;
var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + tetherOffsetValue : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue;
var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);
var clientOffset = arrowOffsetParent ? mainAxis === "y" ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;
var offsetModifierValue = state.modifiersData.offset ? state.modifiersData.offset[state.placement][mainAxis] : 0;
var tetherMin = popperOffsets2[mainAxis] + minOffset - offsetModifierValue - clientOffset;
var tetherMax = popperOffsets2[mainAxis] + maxOffset - offsetModifierValue;
if (checkMainAxis) {
var preventedOffset = within(tether ? min(min2, tetherMin) : min2, offset2, tether ? max(max2, tetherMax) : max2);
popperOffsets2[mainAxis] = preventedOffset;
data[mainAxis] = preventedOffset - offset2;
}
if (checkAltAxis) {
var _mainSide = mainAxis === "x" ? top : left;
var _altSide = mainAxis === "x" ? bottom : right;
var _offset = popperOffsets2[altAxis];
var _min = _offset + overflow[_mainSide];
var _max = _offset - overflow[_altSide];
var _preventedOffset = within(tether ? min(_min, tetherMin) : _min, _offset, tether ? max(_max, tetherMax) : _max);
popperOffsets2[altAxis] = _preventedOffset;
data[altAxis] = _preventedOffset - _offset;
}
}
state.modifiersData[name] = data;
}
var preventOverflow_default = {
name: "preventOverflow",
enabled: true,
phase: "main",
fn: preventOverflow,
requiresIfExists: ["offset"]
};
// node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js
function getHTMLElementScroll(element) {
return {
scrollLeft: element.scrollLeft,
scrollTop: element.scrollTop
};
}
// node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js
function getNodeScroll(node) {
if (node === getWindow(node) || !isHTMLElement(node)) {
return getWindowScroll(node);
} else {
return getHTMLElementScroll(node);
}
}
// node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js
function isElementScaled(element) {
var rect = element.getBoundingClientRect();
var scaleX = rect.width / element.offsetWidth || 1;
var scaleY = rect.height / element.offsetHeight || 1;
return scaleX !== 1 || scaleY !== 1;
}
function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
if (isFixed === void 0) {
isFixed = false;
}
var isOffsetParentAnElement = isHTMLElement(offsetParent);
var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);
var documentElement = getDocumentElement(offsetParent);
var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled);
var scroll = {
scrollLeft: 0,
scrollTop: 0
};
var offsets = {
x: 0,
y: 0
};
if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
if (getNodeName(offsetParent) !== "body" || isScrollParent(documentElement)) {
scroll = getNodeScroll(offsetParent);
}
if (isHTMLElement(offsetParent)) {
offsets = getBoundingClientRect(offsetParent, true);
offsets.x += offsetParent.clientLeft;
offsets.y += offsetParent.clientTop;
} else if (documentElement) {
offsets.x = getWindowScrollBarX(documentElement);
}
}
return {
x: rect.left + scroll.scrollLeft - offsets.x,
y: rect.top + scroll.scrollTop - offsets.y,
width: rect.width,
height: rect.height
};
}
// node_modules/@popperjs/core/lib/utils/orderModifiers.js
function order(modifiers) {
var map = /* @__PURE__ */ new Map();
var visited = /* @__PURE__ */ new Set();
var result = [];
modifiers.forEach(function(modifier) {
map.set(modifier.name, modifier);
});
function sort(modifier) {
visited.add(modifier.name);
var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);
requires.forEach(function(dep) {
if (!visited.has(dep)) {
var depModifier = map.get(dep);
if (depModifier) {
sort(depModifier);
}
}
});
result.push(modifier);
}
modifiers.forEach(function(modifier) {
if (!visited.has(modifier.name)) {
sort(modifier);
}
});
return result;
}
function orderModifiers(modifiers) {
var orderedModifiers = order(modifiers);
return modifierPhases.reduce(function(acc, phase) {
return acc.concat(orderedModifiers.filter(function(modifier) {
return modifier.phase === phase;
}));
}, []);
}
// node_modules/@popperjs/core/lib/utils/debounce.js
function debounce(fn2) {
var pending;
return function() {
if (!pending) {
pending = new Promise(function(resolve) {
Promise.resolve().then(function() {
pending = void 0;
resolve(fn2());
});
});
}
return pending;
};
}
// node_modules/@popperjs/core/lib/utils/format.js
function format(str) {
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
return [].concat(args).reduce(function(p, c) {
return p.replace(/%s/, c);
}, str);
}
// node_modules/@popperjs/core/lib/utils/validateModifiers.js
var INVALID_MODIFIER_ERROR = 'Popper: modifier "%s" provided an invalid %s property, expected %s but got %s';
var MISSING_DEPENDENCY_ERROR = 'Popper: modifier "%s" requires "%s", but "%s" modifier is not available';
var VALID_PROPERTIES = ["name", "enabled", "phase", "fn", "effect", "requires", "options"];
function validateModifiers(modifiers) {
modifiers.forEach(function(modifier) {
[].concat(Object.keys(modifier), VALID_PROPERTIES).filter(function(value, index, self2) {
return self2.indexOf(value) === index;
}).forEach(function(key) {
switch (key) {
case "name":
if (typeof modifier.name !== "string") {
console.error(format(INVALID_MODIFIER_ERROR, String(modifier.name), '"name"', '"string"', '"' + String(modifier.name) + '"'));
}
break;
case "enabled":
if (typeof modifier.enabled !== "boolean") {
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"enabled"', '"boolean"', '"' + String(modifier.enabled) + '"'));
}
break;
case "phase":
if (modifierPhases.indexOf(modifier.phase) < 0) {
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"phase"', "either " + modifierPhases.join(", "), '"' + String(modifier.phase) + '"'));
}
break;
case "fn":
if (typeof modifier.fn !== "function") {
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"fn"', '"function"', '"' + String(modifier.fn) + '"'));
}
break;
case "effect":
if (modifier.effect != null && typeof modifier.effect !== "function") {
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"effect"', '"function"', '"' + String(modifier.fn) + '"'));
}
break;
case "requires":
if (modifier.requires != null && !Array.isArray(modifier.requires)) {
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requires"', '"array"', '"' + String(modifier.requires) + '"'));
}
break;
case "requiresIfExists":
if (!Array.isArray(modifier.requiresIfExists)) {
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requiresIfExists"', '"array"', '"' + String(modifier.requiresIfExists) + '"'));
}
break;
case "options":
case "data":
break;
default:
console.error('PopperJS: an invalid property has been provided to the "' + modifier.name + '" modifier, valid properties are ' + VALID_PROPERTIES.map(function(s) {
return '"' + s + '"';
}).join(", ") + '; but "' + key + '" was provided.');
}
modifier.requires && modifier.requires.forEach(function(requirement) {
if (modifiers.find(function(mod) {
return mod.name === requirement;
}) == null) {
console.error(format(MISSING_DEPENDENCY_ERROR, String(modifier.name), requirement, requirement));
}
});
});
});
}
// node_modules/@popperjs/core/lib/utils/uniqueBy.js
function uniqueBy(arr, fn2) {
var identifiers = /* @__PURE__ */ new Set();
return arr.filter(function(item) {
var identifier = fn2(item);
if (!identifiers.has(identifier)) {
identifiers.add(identifier);
return true;
}
});
}
// node_modules/@popperjs/core/lib/utils/mergeByName.js
function mergeByName(modifiers) {
var merged = modifiers.reduce(function(merged2, current) {
var existing = merged2[current.name];
merged2[current.name] = existing ? Object.assign({}, existing, current, {
options: Object.assign({}, existing.options, current.options),
data: Object.assign({}, existing.data, current.data)
}) : current;
return merged2;
}, {});
return Object.keys(merged).map(function(key) {
return merged[key];
});
}
// node_modules/@popperjs/core/lib/createPopper.js
var INVALID_ELEMENT_ERROR = "Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.";
var INFINITE_LOOP_ERROR = "Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.";
var DEFAULT_OPTIONS = {
placement: "bottom",
modifiers: [],
strategy: "absolute"
};
function areValidElements() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return !args.some(function(element) {
return !(element && typeof element.getBoundingClientRect === "function");
});
}
function popperGenerator(generatorOptions) {
if (generatorOptions === void 0) {
generatorOptions = {};
}
var _generatorOptions = generatorOptions, _generatorOptions$def = _generatorOptions.defaultModifiers, defaultModifiers3 = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, _generatorOptions$def2 = _generatorOptions.defaultOptions, defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;
return function createPopper4(reference2, popper2, options) {
if (options === void 0) {
options = defaultOptions;
}
var state = {
placement: "bottom",
orderedModifiers: [],
options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),
modifiersData: {},
elements: {
reference: reference2,
popper: popper2
},
attributes: {},
styles: {}
};
var effectCleanupFns = [];
var isDestroyed = false;
var instance = {
state,
setOptions: function setOptions(setOptionsAction) {
var options2 = typeof setOptionsAction === "function" ? setOptionsAction(state.options) : setOptionsAction;
cleanupModifierEffects();
state.options = Object.assign({}, defaultOptions, state.options, options2);
state.scrollParents = {
reference: isElement(reference2) ? listScrollParents(reference2) : reference2.contextElement ? listScrollParents(reference2.contextElement) : [],
popper: listScrollParents(popper2)
};
var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers3, state.options.modifiers)));
state.orderedModifiers = orderedModifiers.filter(function(m) {
return m.enabled;
});
if (true) {
var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function(_ref) {
var name = _ref.name;
return name;
});
validateModifiers(modifiers);
if (getBasePlacement(state.options.placement) === auto) {
var flipModifier = state.orderedModifiers.find(function(_ref2) {
var name = _ref2.name;
return name === "flip";
});
if (!flipModifier) {
console.error(['Popper: "auto" placements require the "flip" modifier be', "present and enabled to work."].join(" "));
}
}
var _getComputedStyle = getComputedStyle2(popper2), marginTop = _getComputedStyle.marginTop, marginRight = _getComputedStyle.marginRight, marginBottom = _getComputedStyle.marginBottom, marginLeft = _getComputedStyle.marginLeft;
if ([marginTop, marginRight, marginBottom, marginLeft].some(function(margin) {
return parseFloat(margin);
})) {
console.warn(['Popper: CSS "margin" styles cannot be used to apply padding', "between the popper and its reference element or boundary.", "To replicate margin, use the `offset` modifier, as well as", "the `padding` option in the `preventOverflow` and `flip`", "modifiers."].join(" "));
}
}
runModifierEffects();
return instance.update();
},
forceUpdate: function forceUpdate() {
if (isDestroyed) {
return;
}
var _state$elements = state.elements, reference3 = _state$elements.reference, popper3 = _state$elements.popper;
if (!areValidElements(reference3, popper3)) {
if (true) {
console.error(INVALID_ELEMENT_ERROR);
}
return;
}
state.rects = {
reference: getCompositeRect(reference3, getOffsetParent(popper3), state.options.strategy === "fixed"),
popper: getLayoutRect(popper3)
};
state.reset = false;
state.placement = state.options.placement;
state.orderedModifiers.forEach(function(modifier) {
return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);
});
var __debug_loops__ = 0;
for (var index = 0; index < state.orderedModifiers.length; index++) {
if (true) {
__debug_loops__ += 1;
if (__debug_loops__ > 100) {
console.error(INFINITE_LOOP_ERROR);
break;
}
}
if (state.reset === true) {
state.reset = false;
index = -1;
continue;
}
var _state$orderedModifie = state.orderedModifiers[index], fn2 = _state$orderedModifie.fn, _state$orderedModifie2 = _state$orderedModifie.options, _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, name = _state$orderedModifie.name;
if (typeof fn2 === "function") {
state = fn2({
state,
options: _options,
name,
instance
}) || state;
}
}
},
update: debounce(function() {
return new Promise(function(resolve) {
instance.forceUpdate();
resolve(state);
});
}),
destroy: function destroy() {
cleanupModifierEffects();
isDestroyed = true;
}
};
if (!areValidElements(reference2, popper2)) {
if (true) {
console.error(INVALID_ELEMENT_ERROR);
}
return instance;
}
instance.setOptions(options).then(function(state2) {
if (!isDestroyed && options.onFirstUpdate) {
options.onFirstUpdate(state2);
}
});
function runModifierEffects() {
state.orderedModifiers.forEach(function(_ref3) {
var name = _ref3.name, _ref3$options = _ref3.options, options2 = _ref3$options === void 0 ? {} : _ref3$options, effect4 = _ref3.effect;
if (typeof effect4 === "function") {
var cleanupFn = effect4({
state,
name,
instance,
options: options2
});
var noopFn = function noopFn2() {
};
effectCleanupFns.push(cleanupFn || noopFn);
}
});
}
function cleanupModifierEffects() {
effectCleanupFns.forEach(function(fn2) {
return fn2();
});
effectCleanupFns = [];
}
return instance;
};
}
var createPopper = /* @__PURE__ */ popperGenerator();
// node_modules/@popperjs/core/lib/popper-lite.js
var defaultModifiers = [eventListeners_default, popperOffsets_default, computeStyles_default, applyStyles_default];
var createPopper2 = /* @__PURE__ */ popperGenerator({
defaultModifiers
});
// node_modules/@popperjs/core/lib/popper.js
var defaultModifiers2 = [eventListeners_default, popperOffsets_default, computeStyles_default, applyStyles_default, offset_default, flip_default, preventOverflow_default, arrow_default, hide_default];
var createPopper3 = /* @__PURE__ */ popperGenerator({
defaultModifiers: defaultModifiers2
});
// node_modules/bootstrap/dist/js/bootstrap.esm.js
var MAX_UID = 1e6;
var MILLISECONDS_MULTIPLIER = 1e3;
var TRANSITION_END = "transitionend";
var toType = (obj) => {
if (obj === null || obj === void 0) {
return `${obj}`;
}
return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
};
var getUID = (prefix) => {
do {
prefix += Math.floor(Math.random() * MAX_UID);
} while (document.getElementById(prefix));
return prefix;
};
var getSelector = (element) => {
let selector = element.getAttribute("data-bs-target");
if (!selector || selector === "#") {
let hrefAttr = element.getAttribute("href");
if (!hrefAttr || !hrefAttr.includes("#") && !hrefAttr.startsWith(".")) {
return null;
}
if (hrefAttr.includes("#") && !hrefAttr.startsWith("#")) {
hrefAttr = `#${hrefAttr.split("#")[1]}`;
}
selector = hrefAttr && hrefAttr !== "#" ? hrefAttr.trim() : null;
}
return selector;
};
var getSelectorFromElement = (element) => {
const selector = getSelector(element);
if (selector) {
return document.querySelector(selector) ? selector : null;
}
return null;
};
var getElementFromSelector = (element) => {
const selector = getSelector(element);
return selector ? document.querySelector(selector) : null;
};
var getTransitionDurationFromElement = (element) => {
if (!element) {
return 0;
}
let {
transitionDuration,
transitionDelay
} = window.getComputedStyle(element);
const floatTransitionDuration = Number.parseFloat(transitionDuration);
const floatTransitionDelay = Number.parseFloat(transitionDelay);
if (!floatTransitionDuration && !floatTransitionDelay) {
return 0;
}
transitionDuration = transitionDuration.split(",")[0];
transitionDelay = transitionDelay.split(",")[0];
return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
};
var triggerTransitionEnd = (element) => {
element.dispatchEvent(new Event(TRANSITION_END));
};
var isElement2 = (obj) => {
if (!obj || typeof obj !== "object") {
return false;
}
if (typeof obj.jquery !== "undefined") {
obj = obj[0];
}
return typeof obj.nodeType !== "undefined";
};
var getElement = (obj) => {
if (isElement2(obj)) {
return obj.jquery ? obj[0] : obj;
}
if (typeof obj === "string" && obj.length > 0) {
return document.querySelector(obj);
}
return null;
};
var typeCheckConfig = (componentName, config, configTypes) => {
Object.keys(configTypes).forEach((property) => {
const expectedTypes = configTypes[property];
const value = config[property];
const valueType = value && isElement2(value) ? "element" : toType(value);
if (!new RegExp(expectedTypes).test(valueType)) {
throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
}
});
};
var isVisible = (element) => {
if (!isElement2(element) || element.getClientRects().length === 0) {
return false;
}
return getComputedStyle(element).getPropertyValue("visibility") === "visible";
};
var isDisabled = (element) => {
if (!element || element.nodeType !== Node.ELEMENT_NODE) {
return true;
}
if (element.classList.contains("disabled")) {
return true;
}
if (typeof element.disabled !== "undefined") {
return element.disabled;
}
return element.hasAttribute("disabled") && element.getAttribute("disabled") !== "false";
};
var findShadowRoot = (element) => {
if (!document.documentElement.attachShadow) {
return null;
}
if (typeof element.getRootNode === "function") {
const root = element.getRootNode();
return root instanceof ShadowRoot ? root : null;
}
if (element instanceof ShadowRoot) {
return element;
}
if (!element.parentNode) {
return null;
}
return findShadowRoot(element.parentNode);
};
var noop = () => {
};
var reflow = (element) => {
element.offsetHeight;
};
var getjQuery = () => {
const {
jQuery
} = window;
if (jQuery && !document.body.hasAttribute("data-bs-no-jquery")) {
return jQuery;
}
return null;
};
var DOMContentLoadedCallbacks = [];
var onDOMContentLoaded = (callback) => {
if (document.readyState === "loading") {
if (!DOMContentLoadedCallbacks.length) {
document.addEventListener("DOMContentLoaded", () => {
DOMContentLoadedCallbacks.forEach((callback2) => callback2());
});
}
DOMContentLoadedCallbacks.push(callback);
} else {
callback();
}
};
var isRTL = () => document.documentElement.dir === "rtl";
var defineJQueryPlugin = (plugin) => {
onDOMContentLoaded(() => {
const $4 = getjQuery();
if ($4) {
const name = plugin.NAME;
const JQUERY_NO_CONFLICT = $4.fn[name];
$4.fn[name] = plugin.jQueryInterface;
$4.fn[name].Constructor = plugin;
$4.fn[name].noConflict = () => {
$4.fn[name] = JQUERY_NO_CONFLICT;
return plugin.jQueryInterface;
};
}
});
};
var execute = (callback) => {
if (typeof callback === "function") {
callback();
}
};
var executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
if (!waitForTransition) {
execute(callback);
return;
}
const durationPadding = 5;
const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;
let called = false;
const handler = ({
target
}) => {
if (target !== transitionElement) {
return;
}
called = true;
transitionElement.removeEventListener(TRANSITION_END, handler);
execute(callback);
};
transitionElement.addEventListener(TRANSITION_END, handler);
setTimeout(() => {
if (!called) {
triggerTransitionEnd(transitionElement);
}
}, emulatedDuration);
};
var getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {
let index = list.indexOf(activeElement);
if (index === -1) {
return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0];
}
const listLength = list.length;
index += shouldGetNext ? 1 : -1;
if (isCycleAllowed) {
index = (index + listLength) % listLength;
}
return list[Math.max(0, Math.min(index, listLength - 1))];
};
var namespaceRegex = /[^.]*(?=\..*)\.|.*/;
var stripNameRegex = /\..*/;
var stripUidRegex = /::\d+$/;
var eventRegistry = {};
var uidEvent = 1;
var customEvents = {
mouseenter: "mouseover",
mouseleave: "mouseout"
};
var customEventsRegex = /^(mouseenter|mouseleave)/i;
var nativeEvents = /* @__PURE__ */ new Set(["click", "dblclick", "mouseup", "mousedown", "contextmenu", "mousewheel", "DOMMouseScroll", "mouseover", "mouseout", "mousemove", "selectstart", "selectend", "keydown", "keypress", "keyup", "orientationchange", "touchstart", "touchmove", "touchend", "touchcancel", "pointerdown", "pointermove", "pointerup", "pointerleave", "pointercancel", "gesturestart", "gesturechange", "gestureend", "focus", "blur", "change", "reset", "select", "submit", "focusin", "focusout", "load", "unload", "beforeunload", "resize", "move", "DOMContentLoaded", "readystatechange", "error", "abort", "scroll"]);
function getUidEvent(element, uid) {
return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;
}
function getEvent(element) {
const uid = getUidEvent(element);
element.uidEvent = uid;
eventRegistry[uid] = eventRegistry[uid] || {};
return eventRegistry[uid];
}
function bootstrapHandler(element, fn2) {
return function handler(event) {
event.delegateTarget = element;
if (handler.oneOff) {
EventHandler.off(element, event.type, fn2);
}
return fn2.apply(element, [event]);
};
}
function bootstrapDelegationHandler(element, selector, fn2) {
return function handler(event) {
const domElements = element.querySelectorAll(selector);
for (let {
target
} = event; target && target !== this; target = target.parentNode) {
for (let i = domElements.length; i--; ) {
if (domElements[i] === target) {
event.delegateTarget = target;
if (handler.oneOff) {
EventHandler.off(element, event.type, selector, fn2);
}
return fn2.apply(target, [event]);
}
}
}
return null;
};
}
function findHandler(events, handler, delegationSelector = null) {
const uidEventList = Object.keys(events);
for (let i = 0, len = uidEventList.length; i < len; i++) {
const event = events[uidEventList[i]];
if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {
return event;
}
}
return null;
}
function normalizeParams(originalTypeEvent, handler, delegationFn) {
const delegation = typeof handler === "string";
const originalHandler = delegation ? delegationFn : handler;
let typeEvent = getTypeEvent(originalTypeEvent);
const isNative = nativeEvents.has(typeEvent);
if (!isNative) {
typeEvent = originalTypeEvent;
}
return [delegation, originalHandler, typeEvent];
}
function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {
if (typeof originalTypeEvent !== "string" || !element) {
return;
}
if (!handler) {
handler = delegationFn;
delegationFn = null;
}
if (customEventsRegex.test(originalTypeEvent)) {
const wrapFn = (fn3) => {
return function(event) {
if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {
return fn3.call(this, event);
}
};
};
if (delegationFn) {
delegationFn = wrapFn(delegationFn);
} else {
handler = wrapFn(handler);
}
}
const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn);
const events = getEvent(element);
const handlers = events[typeEvent] || (events[typeEvent] = {});
const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null);
if (previousFn) {
previousFn.oneOff = previousFn.oneOff && oneOff;
return;
}
const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ""));
const fn2 = delegation ? bootstrapDelegationHandler(element, handler, delegationFn) : bootstrapHandler(element, handler);
fn2.delegationSelector = delegation ? handler : null;
fn2.originalHandler = originalHandler;
fn2.oneOff = oneOff;
fn2.uidEvent = uid;
handlers[uid] = fn2;
element.addEventListener(typeEvent, fn2, delegation);
}
function removeHandler(element, events, typeEvent, handler, delegationSelector) {
const fn2 = findHandler(events[typeEvent], handler, delegationSelector);
if (!fn2) {
return;
}
element.removeEventListener(typeEvent, fn2, Boolean(delegationSelector));
delete events[typeEvent][fn2.uidEvent];
}
function removeNamespacedHandlers(element, events, typeEvent, namespace) {
const storeElementEvent = events[typeEvent] || {};
Object.keys(storeElementEvent).forEach((handlerKey) => {
if (handlerKey.includes(namespace)) {
const event = storeElementEvent[handlerKey];
removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector);
}
});
}
function getTypeEvent(event) {
event = event.replace(stripNameRegex, "");
return customEvents[event] || event;
}
var EventHandler = {
on(element, event, handler, delegationFn) {
addHandler(element, event, handler, delegationFn, false);
},
one(element, event, handler, delegationFn) {
addHandler(element, event, handler, delegationFn, true);
},
off(element, originalTypeEvent, handler, delegationFn) {
if (typeof originalTypeEvent !== "string" || !element) {
return;
}
const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn);
const inNamespace = typeEvent !== originalTypeEvent;
const events = getEvent(element);
const isNamespace = originalTypeEvent.startsWith(".");
if (typeof originalHandler !== "undefined") {
if (!events || !events[typeEvent]) {
return;
}
removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null);
return;
}
if (isNamespace) {
Object.keys(events).forEach((elementEvent) => {
removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));
});
}
const storeElementEvent = events[typeEvent] || {};
Object.keys(storeElementEvent).forEach((keyHandlers) => {
const handlerKey = keyHandlers.replace(stripUidRegex, "");
if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
const event = storeElementEvent[keyHandlers];
removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector);
}
});
},
trigger(element, event, args) {
if (typeof event !== "string" || !element) {
return null;
}
const $4 = getjQuery();
const typeEvent = getTypeEvent(event);
const inNamespace = event !== typeEvent;
const isNative = nativeEvents.has(typeEvent);
let jQueryEvent;
let bubbles = true;
let nativeDispatch = true;
let defaultPrevented = false;
let evt = null;
if (inNamespace && $4) {
jQueryEvent = $4.Event(event, args);
$4(element).trigger(jQueryEvent);
bubbles = !jQueryEvent.isPropagationStopped();
nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();
defaultPrevented = jQueryEvent.isDefaultPrevented();
}
if (isNative) {
evt = document.createEvent("HTMLEvents");
evt.initEvent(typeEvent, bubbles, true);
} else {
evt = new CustomEvent(event, {
bubbles,
cancelable: true
});
}
if (typeof args !== "undefined") {
Object.keys(args).forEach((key) => {
Object.defineProperty(evt, key, {
get() {
return args[key];
}
});
});
}
if (defaultPrevented) {
evt.preventDefault();
}
if (nativeDispatch) {
element.dispatchEvent(evt);
}
if (evt.defaultPrevented && typeof jQueryEvent !== "undefined") {
jQueryEvent.preventDefault();
}
return evt;
}
};
var elementMap = /* @__PURE__ */ new Map();
var Data = {
set(element, key, instance) {
if (!elementMap.has(element)) {
elementMap.set(element, /* @__PURE__ */ new Map());
}
const instanceMap = elementMap.get(element);
if (!instanceMap.has(key) && instanceMap.size !== 0) {
console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);
return;
}
instanceMap.set(key, instance);
},
get(element, key) {
if (elementMap.has(element)) {
return elementMap.get(element).get(key) || null;
}
return null;
},
remove(element, key) {
if (!elementMap.has(element)) {
return;
}
const instanceMap = elementMap.get(element);
instanceMap.delete(key);
if (instanceMap.size === 0) {
elementMap.delete(element);
}
}
};
var VERSION = "5.1.3";
var BaseComponent = class {
constructor(element) {
element = getElement(element);
if (!element) {
return;
}
this._element = element;
Data.set(this._element, this.constructor.DATA_KEY, this);
}
dispose() {
Data.remove(this._element, this.constructor.DATA_KEY);
EventHandler.off(this._element, this.constructor.EVENT_KEY);
Object.getOwnPropertyNames(this).forEach((propertyName) => {
this[propertyName] = null;
});
}
_queueCallback(callback, element, isAnimated = true) {
executeAfterTransition(callback, element, isAnimated);
}
static getInstance(element) {
return Data.get(getElement(element), this.DATA_KEY);
}
static getOrCreateInstance(element, config = {}) {
return this.getInstance(element) || new this(element, typeof config === "object" ? config : null);
}
static get VERSION() {
return VERSION;
}
static get NAME() {
throw new Error('You have to implement the static method "NAME", for each component!');
}
static get DATA_KEY() {
return `bs.${this.NAME}`;
}
static get EVENT_KEY() {
return `.${this.DATA_KEY}`;
}
};
var enableDismissTrigger = (component, method = "hide") => {
const clickEvent = `click.dismiss${component.EVENT_KEY}`;
const name = component.NAME;
EventHandler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function(event) {
if (["A", "AREA"].includes(this.tagName)) {
event.preventDefault();
}
if (isDisabled(this)) {
return;
}
const target = getElementFromSelector(this) || this.closest(`.${name}`);
const instance = component.getOrCreateInstance(target);
instance[method]();
});
};
var NAME$d = "alert";
var DATA_KEY$c = "bs.alert";
var EVENT_KEY$c = `.${DATA_KEY$c}`;
var EVENT_CLOSE = `close${EVENT_KEY$c}`;
var EVENT_CLOSED = `closed${EVENT_KEY$c}`;
var CLASS_NAME_FADE$5 = "fade";
var CLASS_NAME_SHOW$8 = "show";
var Alert = class extends BaseComponent {
static get NAME() {
return NAME$d;
}
close() {
const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);
if (closeEvent.defaultPrevented) {
return;
}
this._element.classList.remove(CLASS_NAME_SHOW$8);
const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);
this._queueCallback(() => this._destroyElement(), this._element, isAnimated);
}
_destroyElement() {
this._element.remove();
EventHandler.trigger(this._element, EVENT_CLOSED);
this.dispose();
}
static jQueryInterface(config) {
return this.each(function() {
const data = Alert.getOrCreateInstance(this);
if (typeof config !== "string") {
return;
}
if (data[config] === void 0 || config.startsWith("_") || config === "constructor") {
throw new TypeError(`No method named "${config}"`);
}
data[config](this);
});
}
};
enableDismissTrigger(Alert, "close");
defineJQueryPlugin(Alert);
var NAME$c = "button";
var DATA_KEY$b = "bs.button";
var EVENT_KEY$b = `.${DATA_KEY$b}`;
var DATA_API_KEY$7 = ".data-api";
var CLASS_NAME_ACTIVE$3 = "active";
var SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle="button"]';
var EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$b}${DATA_API_KEY$7}`;
var Button = class extends BaseComponent {
static get NAME() {
return NAME$c;
}
toggle() {
this._element.setAttribute("aria-pressed", this._element.classList.toggle(CLASS_NAME_ACTIVE$3));
}
static jQueryInterface(config) {
return this.each(function() {
const data = Button.getOrCreateInstance(this);
if (config === "toggle") {
data[config]();
}
});
}
};
EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, (event) => {
event.preventDefault();
const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);
const data = Button.getOrCreateInstance(button);
data.toggle();
});
defineJQueryPlugin(Button);
function normalizeData(val) {
if (val === "true") {
return true;
}
if (val === "false") {
return false;
}
if (val === Number(val).toString()) {
return Number(val);
}
if (val === "" || val === "null") {
return null;
}
return val;
}
function normalizeDataKey(key) {
return key.replace(/[A-Z]/g, (chr) => `-${chr.toLowerCase()}`);
}
var Manipulator = {
setDataAttribute(element, key, value) {
element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);
},
removeDataAttribute(element, key) {
element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);
},
getDataAttributes(element) {
if (!element) {
return {};
}
const attributes = {};
Object.keys(element.dataset).filter((key) => key.startsWith("bs")).forEach((key) => {
let pureKey = key.replace(/^bs/, "");
pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);
attributes[pureKey] = normalizeData(element.dataset[key]);
});
return attributes;
},
getDataAttribute(element, key) {
return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));
},
offset(element) {
const rect = element.getBoundingClientRect();
return {
top: rect.top + window.pageYOffset,
left: rect.left + window.pageXOffset
};
},
position(element) {
return {
top: element.offsetTop,
left: element.offsetLeft
};
}
};
var NODE_TEXT = 3;
var SelectorEngine = {
find(selector, element = document.documentElement) {
return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
},
findOne(selector, element = document.documentElement) {
return Element.prototype.querySelector.call(element, selector);
},
children(element, selector) {
return [].concat(...element.children).filter((child) => child.matches(selector));
},
parents(element, selector) {
const parents = [];
let ancestor = element.parentNode;
while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {
if (ancestor.matches(selector)) {
parents.push(ancestor);
}
ancestor = ancestor.parentNode;
}
return parents;
},
prev(element, selector) {
let previous = element.previousElementSibling;
while (previous) {
if (previous.matches(selector)) {
return [previous];
}
previous = previous.previousElementSibling;
}
return [];
},
next(element, selector) {
let next = element.nextElementSibling;
while (next) {
if (next.matches(selector)) {
return [next];
}
next = next.nextElementSibling;
}
return [];
},
focusableChildren(element) {
const focusables = ["a", "button", "input", "textarea", "select", "details", "[tabindex]", '[contenteditable="true"]'].map((selector) => `${selector}:not([tabindex^="-"])`).join(", ");
return this.find(focusables, element).filter((el) => !isDisabled(el) && isVisible(el));
}
};
var NAME$b = "carousel";
var DATA_KEY$a = "bs.carousel";
var EVENT_KEY$a = `.${DATA_KEY$a}`;
var DATA_API_KEY$6 = ".data-api";
var ARROW_LEFT_KEY = "ArrowLeft";
var ARROW_RIGHT_KEY = "ArrowRight";
var TOUCHEVENT_COMPAT_WAIT = 500;
var SWIPE_THRESHOLD = 40;
var Default$a = {
interval: 5e3,
keyboard: true,
slide: false,
pause: "hover",
wrap: true,
touch: true
};
var DefaultType$a = {
interval: "(number|boolean)",
keyboard: "boolean",
slide: "(boolean|string)",
pause: "(string|boolean)",
wrap: "boolean",
touch: "boolean"
};
var ORDER_NEXT = "next";
var ORDER_PREV = "prev";
var DIRECTION_LEFT = "left";
var DIRECTION_RIGHT = "right";
var KEY_TO_DIRECTION = {
[ARROW_LEFT_KEY]: DIRECTION_RIGHT,
[ARROW_RIGHT_KEY]: DIRECTION_LEFT
};
var EVENT_SLIDE = `slide${EVENT_KEY$a}`;
var EVENT_SLID = `slid${EVENT_KEY$a}`;
var EVENT_KEYDOWN = `keydown${EVENT_KEY$a}`;
var EVENT_MOUSEENTER = `mouseenter${EVENT_KEY$a}`;
var EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY$a}`;
var EVENT_TOUCHSTART = `touchstart${EVENT_KEY$a}`;
var EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$a}`;
var EVENT_TOUCHEND = `touchend${EVENT_KEY$a}`;
var EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$a}`;
var EVENT_POINTERUP = `pointerup${EVENT_KEY$a}`;
var EVENT_DRAG_START = `dragstart${EVENT_KEY$a}`;
var EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$a}${DATA_API_KEY$6}`;
var EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;
var CLASS_NAME_CAROUSEL = "carousel";
var CLASS_NAME_ACTIVE$2 = "active";
var CLASS_NAME_SLIDE = "slide";
var CLASS_NAME_END = "carousel-item-end";
var CLASS_NAME_START = "carousel-item-start";
var CLASS_NAME_NEXT = "carousel-item-next";
var CLASS_NAME_PREV = "carousel-item-prev";
var CLASS_NAME_POINTER_EVENT = "pointer-event";
var SELECTOR_ACTIVE$1 = ".active";
var SELECTOR_ACTIVE_ITEM = ".active.carousel-item";
var SELECTOR_ITEM = ".carousel-item";
var SELECTOR_ITEM_IMG = ".carousel-item img";
var SELECTOR_NEXT_PREV = ".carousel-item-next, .carousel-item-prev";
var SELECTOR_INDICATORS = ".carousel-indicators";
var SELECTOR_INDICATOR = "[data-bs-target]";
var SELECTOR_DATA_SLIDE = "[data-bs-slide], [data-bs-slide-to]";
var SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]';
var POINTER_TYPE_TOUCH = "touch";
var POINTER_TYPE_PEN = "pen";
var Carousel = class extends BaseComponent {
constructor(element, config) {
super(element);
this._items = null;
this._interval = null;
this._activeElement = null;
this._isPaused = false;
this._isSliding = false;
this.touchTimeout = null;
this.touchStartX = 0;
this.touchDeltaX = 0;
this._config = this._getConfig(config);
this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);
this._touchSupported = "ontouchstart" in document.documentElement || navigator.maxTouchPoints > 0;
this._pointerEvent = Boolean(window.PointerEvent);
this._addEventListeners();
}
static get Default() {
return Default$a;
}
static get NAME() {
return NAME$b;
}
next() {
this._slide(ORDER_NEXT);
}
nextWhenVisible() {
if (!document.hidden && isVisible(this._element)) {
this.next();
}
}
prev() {
this._slide(ORDER_PREV);
}
pause(event) {
if (!event) {
this._isPaused = true;
}
if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) {
triggerTransitionEnd(this._element);
this.cycle(true);
}
clearInterval(this._interval);
this._interval = null;
}
cycle(event) {
if (!event) {
this._isPaused = false;
}
if (this._interval) {
clearInterval(this._interval);
this._interval = null;
}
if (this._config && this._config.interval && !this._isPaused) {
this._updateInterval();
this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);
}
}
to(index) {
this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
const activeIndex = this._getItemIndex(this._activeElement);
if (index > this._items.length - 1 || index < 0) {
return;
}
if (this._isSliding) {
EventHandler.one(this._element, EVENT_SLID, () => this.to(index));
return;
}
if (activeIndex === index) {
this.pause();
this.cycle();
return;
}
const order2 = index > activeIndex ? ORDER_NEXT : ORDER_PREV;
this._slide(order2, this._items[index]);
}
_getConfig(config) {
config = __spreadValues(__spreadValues(__spreadValues({}, Default$a), Manipulator.getDataAttributes(this._element)), typeof config === "object" ? config : {});
typeCheckConfig(NAME$b, config, DefaultType$a);
return config;
}
_handleSwipe() {
const absDeltax = Math.abs(this.touchDeltaX);
if (absDeltax <= SWIPE_THRESHOLD) {
return;
}
const direction = absDeltax / this.touchDeltaX;
this.touchDeltaX = 0;
if (!direction) {
return;
}
this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT);
}
_addEventListeners() {
if (this._config.keyboard) {
EventHandler.on(this._element, EVENT_KEYDOWN, (event) => this._keydown(event));
}
if (this._config.pause === "hover") {
EventHandler.on(this._element, EVENT_MOUSEENTER, (event) => this.pause(event));
EventHandler.on(this._element, EVENT_MOUSELEAVE, (event) => this.cycle(event));
}
if (this._config.touch && this._touchSupported) {
this._addTouchEventListeners();
}
}
_addTouchEventListeners() {
const hasPointerPenTouch = (event) => {
return this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);
};
const start2 = (event) => {
if (hasPointerPenTouch(event)) {
this.touchStartX = event.clientX;
} else if (!this._pointerEvent) {
this.touchStartX = event.touches[0].clientX;
}
};
const move = (event) => {
this.touchDeltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this.touchStartX;
};
const end2 = (event) => {
if (hasPointerPenTouch(event)) {
this.touchDeltaX = event.clientX - this.touchStartX;
}
this._handleSwipe();
if (this._config.pause === "hover") {
this.pause();
if (this.touchTimeout) {
clearTimeout(this.touchTimeout);
}
this.touchTimeout = setTimeout((event2) => this.cycle(event2), TOUCHEVENT_COMPAT_WAIT + this._config.interval);
}
};
SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach((itemImg) => {
EventHandler.on(itemImg, EVENT_DRAG_START, (event) => event.preventDefault());
});
if (this._pointerEvent) {
EventHandler.on(this._element, EVENT_POINTERDOWN, (event) => start2(event));
EventHandler.on(this._element, EVENT_POINTERUP, (event) => end2(event));
this._element.classList.add(CLASS_NAME_POINTER_EVENT);
} else {
EventHandler.on(this._element, EVENT_TOUCHSTART, (event) => start2(event));
EventHandler.on(this._element, EVENT_TOUCHMOVE, (event) => move(event));
EventHandler.on(this._element, EVENT_TOUCHEND, (event) => end2(event));
}
}
_keydown(event) {
if (/input|textarea/i.test(event.target.tagName)) {
return;
}
const direction = KEY_TO_DIRECTION[event.key];
if (direction) {
event.preventDefault();
this._slide(direction);
}
}
_getItemIndex(element) {
this._items = element && element.parentNode ? SelectorEngine.find(SELECTOR_ITEM, element.parentNode) : [];
return this._items.indexOf(element);
}
_getItemByOrder(order2, activeElement) {
const isNext = order2 === ORDER_NEXT;
return getNextActiveElement(this._items, activeElement, isNext, this._config.wrap);
}
_triggerSlideEvent(relatedTarget, eventDirectionName) {
const targetIndex = this._getItemIndex(relatedTarget);
const fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element));
return EventHandler.trigger(this._element, EVENT_SLIDE, {
relatedTarget,
direction: eventDirectionName,
from: fromIndex,
to: targetIndex
});
}
_setActiveIndicatorElement(element) {
if (this._indicatorsElement) {
const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE$1, this._indicatorsElement);
activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);
activeIndicator.removeAttribute("aria-current");
const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement);
for (let i = 0; i < indicators.length; i++) {
if (Number.parseInt(indicators[i].getAttribute("data-bs-slide-to"), 10) === this._getItemIndex(element)) {
indicators[i].classList.add(CLASS_NAME_ACTIVE$2);
indicators[i].setAttribute("aria-current", "true");
break;
}
}
}
}
_updateInterval() {
const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
if (!element) {
return;
}
const elementInterval = Number.parseInt(element.getAttribute("data-bs-interval"), 10);
if (elementInterval) {
this._config.defaultInterval = this._config.defaultInterval || this._config.interval;
this._config.interval = elementInterval;
} else {
this._config.interval = this._config.defaultInterval || this._config.interval;
}
}
_slide(directionOrOrder, element) {
const order2 = this._directionToOrder(directionOrOrder);
const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
const activeElementIndex = this._getItemIndex(activeElement);
const nextElement = element || this._getItemByOrder(order2, activeElement);
const nextElementIndex = this._getItemIndex(nextElement);
const isCycling = Boolean(this._interval);
const isNext = order2 === ORDER_NEXT;
const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;
const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;
const eventDirectionName = this._orderToDirection(order2);
if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE$2)) {
this._isSliding = false;
return;
}
if (this._isSliding) {
return;
}
const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);
if (slideEvent.defaultPrevented) {
return;
}
if (!activeElement || !nextElement) {
return;
}
this._isSliding = true;
if (isCycling) {
this.pause();
}
this._setActiveIndicatorElement(nextElement);
this._activeElement = nextElement;
const triggerSlidEvent = () => {
EventHandler.trigger(this._element, EVENT_SLID, {
relatedTarget: nextElement,
direction: eventDirectionName,
from: activeElementIndex,
to: nextElementIndex
});
};
if (this._element.classList.contains(CLASS_NAME_SLIDE)) {
nextElement.classList.add(orderClassName);
reflow(nextElement);
activeElement.classList.add(directionalClassName);
nextElement.classList.add(directionalClassName);
const completeCallBack = () => {
nextElement.classList.remove(directionalClassName, orderClassName);
nextElement.classList.add(CLASS_NAME_ACTIVE$2);
activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);
this._isSliding = false;
setTimeout(triggerSlidEvent, 0);
};
this._queueCallback(completeCallBack, activeElement, true);
} else {
activeElement.classList.remove(CLASS_NAME_ACTIVE$2);
nextElement.classList.add(CLASS_NAME_ACTIVE$2);
this._isSliding = false;
triggerSlidEvent();
}
if (isCycling) {
this.cycle();
}
}
_directionToOrder(direction) {
if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {
return direction;
}
if (isRTL()) {
return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;
}
return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;
}
_orderToDirection(order2) {
if (![ORDER_NEXT, ORDER_PREV].includes(order2)) {
return order2;
}
if (isRTL()) {
return order2 === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;
}
return order2 === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;
}
static carouselInterface(element, config) {
const data = Carousel.getOrCreateInstance(element, config);
let {
_config
} = data;
if (typeof config === "object") {
_config = __spreadValues(__spreadValues({}, _config), config);
}
const action = typeof config === "string" ? config : _config.slide;
if (typeof config === "number") {
data.to(config);
} else if (typeof action === "string") {
if (typeof data[action] === "undefined") {
throw new TypeError(`No method named "${action}"`);
}
data[action]();
} else if (_config.interval && _config.ride) {
data.pause();
data.cycle();
}
}
static jQueryInterface(config) {
return this.each(function() {
Carousel.carouselInterface(this, config);
});
}
static dataApiClickHandler(event) {
const target = getElementFromSelector(this);
if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {
return;
}
const config = __spreadValues(__spreadValues({}, Manipulator.getDataAttributes(target)), Manipulator.getDataAttributes(this));
const slideIndex = this.getAttribute("data-bs-slide-to");
if (slideIndex) {
config.interval = false;
}
Carousel.carouselInterface(target, config);
if (slideIndex) {
Carousel.getInstance(target).to(slideIndex);
}
event.preventDefault();
}
};
EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler);
EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {
const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);
for (let i = 0, len = carousels.length; i < len; i++) {
Carousel.carouselInterface(carousels[i], Carousel.getInstance(carousels[i]));
}
});
defineJQueryPlugin(Carousel);
var NAME$a = "collapse";
var DATA_KEY$9 = "bs.collapse";
var EVENT_KEY$9 = `.${DATA_KEY$9}`;
var DATA_API_KEY$5 = ".data-api";
var Default$9 = {
toggle: true,
parent: null
};
var DefaultType$9 = {
toggle: "boolean",
parent: "(null|element)"
};
var EVENT_SHOW$5 = `show${EVENT_KEY$9}`;
var EVENT_SHOWN$5 = `shown${EVENT_KEY$9}`;
var EVENT_HIDE$5 = `hide${EVENT_KEY$9}`;
var EVENT_HIDDEN$5 = `hidden${EVENT_KEY$9}`;
var EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$9}${DATA_API_KEY$5}`;
var CLASS_NAME_SHOW$7 = "show";
var CLASS_NAME_COLLAPSE = "collapse";
var CLASS_NAME_COLLAPSING = "collapsing";
var CLASS_NAME_COLLAPSED = "collapsed";
var CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;
var CLASS_NAME_HORIZONTAL = "collapse-horizontal";
var WIDTH = "width";
var HEIGHT = "height";
var SELECTOR_ACTIVES = ".collapse.show, .collapse.collapsing";
var SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle="collapse"]';
var Collapse = class extends BaseComponent {
constructor(element, config) {
super(element);
this._isTransitioning = false;
this._config = this._getConfig(config);
this._triggerArray = [];
const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);
for (let i = 0, len = toggleList.length; i < len; i++) {
const elem = toggleList[i];
const selector = getSelectorFromElement(elem);
const filterElement = SelectorEngine.find(selector).filter((foundElem) => foundElem === this._element);
if (selector !== null && filterElement.length) {
this._selector = selector;
this._triggerArray.push(elem);
}
}
this._initializeChildren();
if (!this._config.parent) {
this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
}
if (this._config.toggle) {
this.toggle();
}
}
static get Default() {
return Default$9;
}
static get NAME() {
return NAME$a;
}
toggle() {
if (this._isShown()) {
this.hide();
} else {
this.show();
}
}
show() {
if (this._isTransitioning || this._isShown()) {
return;
}
let actives = [];
let activesData;
if (this._config.parent) {
const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);
actives = SelectorEngine.find(SELECTOR_ACTIVES, this._config.parent).filter((elem) => !children.includes(elem));
}
const container = SelectorEngine.findOne(this._selector);
if (actives.length) {
const tempActiveData = actives.find((elem) => container !== elem);
activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null;
if (activesData && activesData._isTransitioning) {
return;
}
}
const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$5);
if (startEvent.defaultPrevented) {
return;
}
actives.forEach((elemActive) => {
if (container !== elemActive) {
Collapse.getOrCreateInstance(elemActive, {
toggle: false
}).hide();
}
if (!activesData) {
Data.set(elemActive, DATA_KEY$9, null);
}
});
const dimension = this._getDimension();
this._element.classList.remove(CLASS_NAME_COLLAPSE);
this._element.classList.add(CLASS_NAME_COLLAPSING);
this._element.style[dimension] = 0;
this._addAriaAndCollapsedClass(this._triggerArray, true);
this._isTransitioning = true;
const complete = () => {
this._isTransitioning = false;
this._element.classList.remove(CLASS_NAME_COLLAPSING);
this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
this._element.style[dimension] = "";
EventHandler.trigger(this._element, EVENT_SHOWN$5);
};
const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
const scrollSize = `scroll${capitalizedDimension}`;
this._queueCallback(complete, this._element, true);
this._element.style[dimension] = `${this._element[scrollSize]}px`;
}
hide() {
if (this._isTransitioning || !this._isShown()) {
return;
}
const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$5);
if (startEvent.defaultPrevented) {
return;
}
const dimension = this._getDimension();
this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;
reflow(this._element);
this._element.classList.add(CLASS_NAME_COLLAPSING);
this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
const triggerArrayLength = this._triggerArray.length;
for (let i = 0; i < triggerArrayLength; i++) {
const trigger = this._triggerArray[i];
const elem = getElementFromSelector(trigger);
if (elem && !this._isShown(elem)) {
this._addAriaAndCollapsedClass([trigger], false);
}
}
this._isTransitioning = true;
const complete = () => {
this._isTransitioning = false;
this._element.classList.remove(CLASS_NAME_COLLAPSING);
this._element.classList.add(CLASS_NAME_COLLAPSE);
EventHandler.trigger(this._element, EVENT_HIDDEN$5);
};
this._element.style[dimension] = "";
this._queueCallback(complete, this._element, true);
}
_isShown(element = this._element) {
return element.classList.contains(CLASS_NAME_SHOW$7);
}
_getConfig(config) {
config = __spreadValues(__spreadValues(__spreadValues({}, Default$9), Manipulator.getDataAttributes(this._element)), config);
config.toggle = Boolean(config.toggle);
config.parent = getElement(config.parent);
typeCheckConfig(NAME$a, config, DefaultType$9);
return config;
}
_getDimension() {
return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;
}
_initializeChildren() {
if (!this._config.parent) {
return;
}
const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);
SelectorEngine.find(SELECTOR_DATA_TOGGLE$4, this._config.parent).filter((elem) => !children.includes(elem)).forEach((element) => {
const selected = getElementFromSelector(element);
if (selected) {
this._addAriaAndCollapsedClass([element], this._isShown(selected));
}
});
}
_addAriaAndCollapsedClass(triggerArray, isOpen) {
if (!triggerArray.length) {
return;
}
triggerArray.forEach((elem) => {
if (isOpen) {
elem.classList.remove(CLASS_NAME_COLLAPSED);
} else {
elem.classList.add(CLASS_NAME_COLLAPSED);
}
elem.setAttribute("aria-expanded", isOpen);
});
}
static jQueryInterface(config) {
return this.each(function() {
const _config = {};
if (typeof config === "string" && /show|hide/.test(config)) {
_config.toggle = false;
}
const data = Collapse.getOrCreateInstance(this, _config);
if (typeof config === "string") {
if (typeof data[config] === "undefined") {
throw new TypeError(`No method named "${config}"`);
}
data[config]();
}
});
}
};
EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function(event) {
if (event.target.tagName === "A" || event.delegateTarget && event.delegateTarget.tagName === "A") {
event.preventDefault();
}
const selector = getSelectorFromElement(this);
const selectorElements = SelectorEngine.find(selector);
selectorElements.forEach((element) => {
Collapse.getOrCreateInstance(element, {
toggle: false
}).toggle();
});
});
defineJQueryPlugin(Collapse);
var NAME$9 = "dropdown";
var DATA_KEY$8 = "bs.dropdown";
var EVENT_KEY$8 = `.${DATA_KEY$8}`;
var DATA_API_KEY$4 = ".data-api";
var ESCAPE_KEY$2 = "Escape";
var SPACE_KEY = "Space";
var TAB_KEY$1 = "Tab";
var ARROW_UP_KEY = "ArrowUp";
var ARROW_DOWN_KEY = "ArrowDown";
var RIGHT_MOUSE_BUTTON = 2;
var REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY$2}`);
var EVENT_HIDE$4 = `hide${EVENT_KEY$8}`;
var EVENT_HIDDEN$4 = `hidden${EVENT_KEY$8}`;
var EVENT_SHOW$4 = `show${EVENT_KEY$8}`;
var EVENT_SHOWN$4 = `shown${EVENT_KEY$8}`;
var EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$8}${DATA_API_KEY$4}`;
var EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$8}${DATA_API_KEY$4}`;
var EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$8}${DATA_API_KEY$4}`;
var CLASS_NAME_SHOW$6 = "show";
var CLASS_NAME_DROPUP = "dropup";
var CLASS_NAME_DROPEND = "dropend";
var CLASS_NAME_DROPSTART = "dropstart";
var CLASS_NAME_NAVBAR = "navbar";
var SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle="dropdown"]';
var SELECTOR_MENU = ".dropdown-menu";
var SELECTOR_NAVBAR_NAV = ".navbar-nav";
var SELECTOR_VISIBLE_ITEMS = ".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)";
var PLACEMENT_TOP = isRTL() ? "top-end" : "top-start";
var PLACEMENT_TOPEND = isRTL() ? "top-start" : "top-end";
var PLACEMENT_BOTTOM = isRTL() ? "bottom-end" : "bottom-start";
var PLACEMENT_BOTTOMEND = isRTL() ? "bottom-start" : "bottom-end";
var PLACEMENT_RIGHT = isRTL() ? "left-start" : "right-start";
var PLACEMENT_LEFT = isRTL() ? "right-start" : "left-start";
var Default$8 = {
offset: [0, 2],
boundary: "clippingParents",
reference: "toggle",
display: "dynamic",
popperConfig: null,
autoClose: true
};
var DefaultType$8 = {
offset: "(array|string|function)",
boundary: "(string|element)",
reference: "(string|element|object)",
display: "string",
popperConfig: "(null|object|function)",
autoClose: "(boolean|string)"
};
var Dropdown = class extends BaseComponent {
constructor(element, config) {
super(element);
this._popper = null;
this._config = this._getConfig(config);
this._menu = this._getMenuElement();
this._inNavbar = this._detectNavbar();
}
static get Default() {
return Default$8;
}
static get DefaultType() {
return DefaultType$8;
}
static get NAME() {
return NAME$9;
}
toggle() {
return this._isShown() ? this.hide() : this.show();
}
show() {
if (isDisabled(this._element) || this._isShown(this._menu)) {
return;
}
const relatedTarget = {
relatedTarget: this._element
};
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, relatedTarget);
if (showEvent.defaultPrevented) {
return;
}
const parent = Dropdown.getParentFromElement(this._element);
if (this._inNavbar) {
Manipulator.setDataAttribute(this._menu, "popper", "none");
} else {
this._createPopper(parent);
}
if ("ontouchstart" in document.documentElement && !parent.closest(SELECTOR_NAVBAR_NAV)) {
[].concat(...document.body.children).forEach((elem) => EventHandler.on(elem, "mouseover", noop));
}
this._element.focus();
this._element.setAttribute("aria-expanded", true);
this._menu.classList.add(CLASS_NAME_SHOW$6);
this._element.classList.add(CLASS_NAME_SHOW$6);
EventHandler.trigger(this._element, EVENT_SHOWN$4, relatedTarget);
}
hide() {
if (isDisabled(this._element) || !this._isShown(this._menu)) {
return;
}
const relatedTarget = {
relatedTarget: this._element
};
this._completeHide(relatedTarget);
}
dispose() {
if (this._popper) {
this._popper.destroy();
}
super.dispose();
}
update() {
this._inNavbar = this._detectNavbar();
if (this._popper) {
this._popper.update();
}
}
_completeHide(relatedTarget) {
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4, relatedTarget);
if (hideEvent.defaultPrevented) {
return;
}
if ("ontouchstart" in document.documentElement) {
[].concat(...document.body.children).forEach((elem) => EventHandler.off(elem, "mouseover", noop));
}
if (this._popper) {
this._popper.destroy();
}
this._menu.classList.remove(CLASS_NAME_SHOW$6);
this._element.classList.remove(CLASS_NAME_SHOW$6);
this._element.setAttribute("aria-expanded", "false");
Manipulator.removeDataAttribute(this._menu, "popper");
EventHandler.trigger(this._element, EVENT_HIDDEN$4, relatedTarget);
}
_getConfig(config) {
config = __spreadValues(__spreadValues(__spreadValues({}, this.constructor.Default), Manipulator.getDataAttributes(this._element)), config);
typeCheckConfig(NAME$9, config, this.constructor.DefaultType);
if (typeof config.reference === "object" && !isElement2(config.reference) && typeof config.reference.getBoundingClientRect !== "function") {
throw new TypeError(`${NAME$9.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
}
return config;
}
_createPopper(parent) {
if (typeof lib_exports === "undefined") {
throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");
}
let referenceElement = this._element;
if (this._config.reference === "parent") {
referenceElement = parent;
} else if (isElement2(this._config.reference)) {
referenceElement = getElement(this._config.reference);
} else if (typeof this._config.reference === "object") {
referenceElement = this._config.reference;
}
const popperConfig = this._getPopperConfig();
const isDisplayStatic = popperConfig.modifiers.find((modifier) => modifier.name === "applyStyles" && modifier.enabled === false);
this._popper = createPopper3(referenceElement, this._menu, popperConfig);
if (isDisplayStatic) {
Manipulator.setDataAttribute(this._menu, "popper", "static");
}
}
_isShown(element = this._element) {
return element.classList.contains(CLASS_NAME_SHOW$6);
}
_getMenuElement() {
return SelectorEngine.next(this._element, SELECTOR_MENU)[0];
}
_getPlacement() {
const parentDropdown = this._element.parentNode;
if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
return PLACEMENT_RIGHT;
}
if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
return PLACEMENT_LEFT;
}
const isEnd = getComputedStyle(this._menu).getPropertyValue("--bs-position").trim() === "end";
if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
}
return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
}
_detectNavbar() {
return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null;
}
_getOffset() {
const {
offset: offset2
} = this._config;
if (typeof offset2 === "string") {
return offset2.split(",").map((val) => Number.parseInt(val, 10));
}
if (typeof offset2 === "function") {
return (popperData) => offset2(popperData, this._element);
}
return offset2;
}
_getPopperConfig() {
const defaultBsPopperConfig = {
placement: this._getPlacement(),
modifiers: [{
name: "preventOverflow",
options: {
boundary: this._config.boundary
}
}, {
name: "offset",
options: {
offset: this._getOffset()
}
}]
};
if (this._config.display === "static") {
defaultBsPopperConfig.modifiers = [{
name: "applyStyles",
enabled: false
}];
}
return __spreadValues(__spreadValues({}, defaultBsPopperConfig), typeof this._config.popperConfig === "function" ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig);
}
_selectMenuItem({
key,
target
}) {
const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible);
if (!items.length) {
return;
}
getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus();
}
static jQueryInterface(config) {
return this.each(function() {
const data = Dropdown.getOrCreateInstance(this, config);
if (typeof config !== "string") {
return;
}
if (typeof data[config] === "undefined") {
throw new TypeError(`No method named "${config}"`);
}
data[config]();
});
}
static clearMenus(event) {
if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === "keyup" && event.key !== TAB_KEY$1)) {
return;
}
const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE$3);
for (let i = 0, len = toggles.length; i < len; i++) {
const context = Dropdown.getInstance(toggles[i]);
if (!context || context._config.autoClose === false) {
continue;
}
if (!context._isShown()) {
continue;
}
const relatedTarget = {
relatedTarget: context._element
};
if (event) {
const composedPath = event.composedPath();
const isMenuTarget = composedPath.includes(context._menu);
if (composedPath.includes(context._element) || context._config.autoClose === "inside" && !isMenuTarget || context._config.autoClose === "outside" && isMenuTarget) {
continue;
}
if (context._menu.contains(event.target) && (event.type === "keyup" && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {
continue;
}
if (event.type === "click") {
relatedTarget.clickEvent = event;
}
}
context._completeHide(relatedTarget);
}
}
static getParentFromElement(element) {
return getElementFromSelector(element) || element.parentNode;
}
static dataApiKeydownHandler(event) {
if (/input|textarea/i.test(event.target.tagName) ? event.key === SPACE_KEY || event.key !== ESCAPE_KEY$2 && (event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY || event.target.closest(SELECTOR_MENU)) : !REGEXP_KEYDOWN.test(event.key)) {
return;
}
const isActive = this.classList.contains(CLASS_NAME_SHOW$6);
if (!isActive && event.key === ESCAPE_KEY$2) {
return;
}
event.preventDefault();
event.stopPropagation();
if (isDisabled(this)) {
return;
}
const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0];
const instance = Dropdown.getOrCreateInstance(getToggleButton);
if (event.key === ESCAPE_KEY$2) {
instance.hide();
return;
}
if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) {
if (!isActive) {
instance.show();
}
instance._selectMenuItem(event);
return;
}
if (!isActive || event.key === SPACE_KEY) {
Dropdown.clearMenus();
}
}
};
EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);
EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);
EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function(event) {
event.preventDefault();
Dropdown.getOrCreateInstance(this).toggle();
});
defineJQueryPlugin(Dropdown);
var SELECTOR_FIXED_CONTENT = ".fixed-top, .fixed-bottom, .is-fixed, .sticky-top";
var SELECTOR_STICKY_CONTENT = ".sticky-top";
var ScrollBarHelper = class {
constructor() {
this._element = document.body;
}
getWidth() {
const documentWidth = document.documentElement.clientWidth;
return Math.abs(window.innerWidth - documentWidth);
}
hide() {
const width = this.getWidth();
this._disableOverFlow();
this._setElementAttributes(this._element, "paddingRight", (calculatedValue) => calculatedValue + width);
this._setElementAttributes(SELECTOR_FIXED_CONTENT, "paddingRight", (calculatedValue) => calculatedValue + width);
this._setElementAttributes(SELECTOR_STICKY_CONTENT, "marginRight", (calculatedValue) => calculatedValue - width);
}
_disableOverFlow() {
this._saveInitialAttribute(this._element, "overflow");
this._element.style.overflow = "hidden";
}
_setElementAttributes(selector, styleProp, callback) {
const scrollbarWidth = this.getWidth();
const manipulationCallBack = (element) => {
if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
return;
}
this._saveInitialAttribute(element, styleProp);
const calculatedValue = window.getComputedStyle(element)[styleProp];
element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`;
};
this._applyManipulationCallback(selector, manipulationCallBack);
}
reset() {
this._resetElementAttributes(this._element, "overflow");
this._resetElementAttributes(this._element, "paddingRight");
this._resetElementAttributes(SELECTOR_FIXED_CONTENT, "paddingRight");
this._resetElementAttributes(SELECTOR_STICKY_CONTENT, "marginRight");
}
_saveInitialAttribute(element, styleProp) {
const actualValue = element.style[styleProp];
if (actualValue) {
Manipulator.setDataAttribute(element, styleProp, actualValue);
}
}
_resetElementAttributes(selector, styleProp) {
const manipulationCallBack = (element) => {
const value = Manipulator.getDataAttribute(element, styleProp);
if (typeof value === "undefined") {
element.style.removeProperty(styleProp);
} else {
Manipulator.removeDataAttribute(element, styleProp);
element.style[styleProp] = value;
}
};
this._applyManipulationCallback(selector, manipulationCallBack);
}
_applyManipulationCallback(selector, callBack) {
if (isElement2(selector)) {
callBack(selector);
} else {
SelectorEngine.find(selector, this._element).forEach(callBack);
}
}
isOverflowing() {
return this.getWidth() > 0;
}
};
var Default$7 = {
className: "modal-backdrop",
isVisible: true,
isAnimated: false,
rootElement: "body",
clickCallback: null
};
var DefaultType$7 = {
className: "string",
isVisible: "boolean",
isAnimated: "boolean",
rootElement: "(element|string)",
clickCallback: "(function|null)"
};
var NAME$8 = "backdrop";
var CLASS_NAME_FADE$4 = "fade";
var CLASS_NAME_SHOW$5 = "show";
var EVENT_MOUSEDOWN = `mousedown.bs.${NAME$8}`;
var Backdrop = class {
constructor(config) {
this._config = this._getConfig(config);
this._isAppended = false;
this._element = null;
}
show(callback) {
if (!this._config.isVisible) {
execute(callback);
return;
}
this._append();
if (this._config.isAnimated) {
reflow(this._getElement());
}
this._getElement().classList.add(CLASS_NAME_SHOW$5);
this._emulateAnimation(() => {
execute(callback);
});
}
hide(callback) {
if (!this._config.isVisible) {
execute(callback);
return;
}
this._getElement().classList.remove(CLASS_NAME_SHOW$5);
this._emulateAnimation(() => {
this.dispose();
execute(callback);
});
}
_getElement() {
if (!this._element) {
const backdrop = document.createElement("div");
backdrop.className = this._config.className;
if (this._config.isAnimated) {
backdrop.classList.add(CLASS_NAME_FADE$4);
}
this._element = backdrop;
}
return this._element;
}
_getConfig(config) {
config = __spreadValues(__spreadValues({}, Default$7), typeof config === "object" ? config : {});
config.rootElement = getElement(config.rootElement);
typeCheckConfig(NAME$8, config, DefaultType$7);
return config;
}
_append() {
if (this._isAppended) {
return;
}
this._config.rootElement.append(this._getElement());
EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => {
execute(this._config.clickCallback);
});
this._isAppended = true;
}
dispose() {
if (!this._isAppended) {
return;
}
EventHandler.off(this._element, EVENT_MOUSEDOWN);
this._element.remove();
this._isAppended = false;
}
_emulateAnimation(callback) {
executeAfterTransition(callback, this._getElement(), this._config.isAnimated);
}
};
var Default$6 = {
trapElement: null,
autofocus: true
};
var DefaultType$6 = {
trapElement: "element",
autofocus: "boolean"
};
var NAME$7 = "focustrap";
var DATA_KEY$7 = "bs.focustrap";
var EVENT_KEY$7 = `.${DATA_KEY$7}`;
var EVENT_FOCUSIN$1 = `focusin${EVENT_KEY$7}`;
var EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$7}`;
var TAB_KEY = "Tab";
var TAB_NAV_FORWARD = "forward";
var TAB_NAV_BACKWARD = "backward";
var FocusTrap = class {
constructor(config) {
this._config = this._getConfig(config);
this._isActive = false;
this._lastTabNavDirection = null;
}
activate() {
const {
trapElement,
autofocus
} = this._config;
if (this._isActive) {
return;
}
if (autofocus) {
trapElement.focus();
}
EventHandler.off(document, EVENT_KEY$7);
EventHandler.on(document, EVENT_FOCUSIN$1, (event) => this._handleFocusin(event));
EventHandler.on(document, EVENT_KEYDOWN_TAB, (event) => this._handleKeydown(event));
this._isActive = true;
}
deactivate() {
if (!this._isActive) {
return;
}
this._isActive = false;
EventHandler.off(document, EVENT_KEY$7);
}
_handleFocusin(event) {
const {
target
} = event;
const {
trapElement
} = this._config;
if (target === document || target === trapElement || trapElement.contains(target)) {
return;
}
const elements = SelectorEngine.focusableChildren(trapElement);
if (elements.length === 0) {
trapElement.focus();
} else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
elements[elements.length - 1].focus();
} else {
elements[0].focus();
}
}
_handleKeydown(event) {
if (event.key !== TAB_KEY) {
return;
}
this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;
}
_getConfig(config) {
config = __spreadValues(__spreadValues({}, Default$6), typeof config === "object" ? config : {});
typeCheckConfig(NAME$7, config, DefaultType$6);
return config;
}
};
var NAME$6 = "modal";
var DATA_KEY$6 = "bs.modal";
var EVENT_KEY$6 = `.${DATA_KEY$6}`;
var DATA_API_KEY$3 = ".data-api";
var ESCAPE_KEY$1 = "Escape";
var Default$5 = {
backdrop: true,
keyboard: true,
focus: true
};
var DefaultType$5 = {
backdrop: "(boolean|string)",
keyboard: "boolean",
focus: "boolean"
};
var EVENT_HIDE$3 = `hide${EVENT_KEY$6}`;
var EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$6}`;
var EVENT_HIDDEN$3 = `hidden${EVENT_KEY$6}`;
var EVENT_SHOW$3 = `show${EVENT_KEY$6}`;
var EVENT_SHOWN$3 = `shown${EVENT_KEY$6}`;
var EVENT_RESIZE = `resize${EVENT_KEY$6}`;
var EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$6}`;
var EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$6}`;
var EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY$6}`;
var EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$6}`;
var EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;
var CLASS_NAME_OPEN = "modal-open";
var CLASS_NAME_FADE$3 = "fade";
var CLASS_NAME_SHOW$4 = "show";
var CLASS_NAME_STATIC = "modal-static";
var OPEN_SELECTOR$1 = ".modal.show";
var SELECTOR_DIALOG = ".modal-dialog";
var SELECTOR_MODAL_BODY = ".modal-body";
var SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle="modal"]';
var Modal = class extends BaseComponent {
constructor(element, config) {
super(element);
this._config = this._getConfig(config);
this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);
this._backdrop = this._initializeBackDrop();
this._focustrap = this._initializeFocusTrap();
this._isShown = false;
this._ignoreBackdropClick = false;
this._isTransitioning = false;
this._scrollBar = new ScrollBarHelper();
}
static get Default() {
return Default$5;
}
static get NAME() {
return NAME$6;
}
toggle(relatedTarget) {
return this._isShown ? this.hide() : this.show(relatedTarget);
}
show(relatedTarget) {
if (this._isShown || this._isTransitioning) {
return;
}
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {
relatedTarget
});
if (showEvent.defaultPrevented) {
return;
}
this._isShown = true;
if (this._isAnimated()) {
this._isTransitioning = true;
}
this._scrollBar.hide();
document.body.classList.add(CLASS_NAME_OPEN);
this._adjustDialog();
this._setEscapeEvent();
this._setResizeEvent();
EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {
EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, (event) => {
if (event.target === this._element) {
this._ignoreBackdropClick = true;
}
});
});
this._showBackdrop(() => this._showElement(relatedTarget));
}
hide() {
if (!this._isShown || this._isTransitioning) {
return;
}
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);
if (hideEvent.defaultPrevented) {
return;
}
this._isShown = false;
const isAnimated = this._isAnimated();
if (isAnimated) {
this._isTransitioning = true;
}
this._setEscapeEvent();
this._setResizeEvent();
this._focustrap.deactivate();
this._element.classList.remove(CLASS_NAME_SHOW$4);
EventHandler.off(this._element, EVENT_CLICK_DISMISS);
EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS);
this._queueCallback(() => this._hideModal(), this._element, isAnimated);
}
dispose() {
[window, this._dialog].forEach((htmlElement) => EventHandler.off(htmlElement, EVENT_KEY$6));
this._backdrop.dispose();
this._focustrap.deactivate();
super.dispose();
}
handleUpdate() {
this._adjustDialog();
}
_initializeBackDrop() {
return new Backdrop({
isVisible: Boolean(this._config.backdrop),
isAnimated: this._isAnimated()
});
}
_initializeFocusTrap() {
return new FocusTrap({
trapElement: this._element
});
}
_getConfig(config) {
config = __spreadValues(__spreadValues(__spreadValues({}, Default$5), Manipulator.getDataAttributes(this._element)), typeof config === "object" ? config : {});
typeCheckConfig(NAME$6, config, DefaultType$5);
return config;
}
_showElement(relatedTarget) {
const isAnimated = this._isAnimated();
const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);
if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
document.body.append(this._element);
}
this._element.style.display = "block";
this._element.removeAttribute("aria-hidden");
this._element.setAttribute("aria-modal", true);
this._element.setAttribute("role", "dialog");
this._element.scrollTop = 0;
if (modalBody) {
modalBody.scrollTop = 0;
}
if (isAnimated) {
reflow(this._element);
}
this._element.classList.add(CLASS_NAME_SHOW$4);
const transitionComplete = () => {
if (this._config.focus) {
this._focustrap.activate();
}
this._isTransitioning = false;
EventHandler.trigger(this._element, EVENT_SHOWN$3, {
relatedTarget
});
};
this._queueCallback(transitionComplete, this._dialog, isAnimated);
}
_setEscapeEvent() {
if (this._isShown) {
EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, (event) => {
if (this._config.keyboard && event.key === ESCAPE_KEY$1) {
event.preventDefault();
this.hide();
} else if (!this._config.keyboard && event.key === ESCAPE_KEY$1) {
this._triggerBackdropTransition();
}
});
} else {
EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS$1);
}
}
_setResizeEvent() {
if (this._isShown) {
EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog());
} else {
EventHandler.off(window, EVENT_RESIZE);
}
}
_hideModal() {
this._element.style.display = "none";
this._element.setAttribute("aria-hidden", true);
this._element.removeAttribute("aria-modal");
this._element.removeAttribute("role");
this._isTransitioning = false;
this._backdrop.hide(() => {
document.body.classList.remove(CLASS_NAME_OPEN);
this._resetAdjustments();
this._scrollBar.reset();
EventHandler.trigger(this._element, EVENT_HIDDEN$3);
});
}
_showBackdrop(callback) {
EventHandler.on(this._element, EVENT_CLICK_DISMISS, (event) => {
if (this._ignoreBackdropClick) {
this._ignoreBackdropClick = false;
return;
}
if (event.target !== event.currentTarget) {
return;
}
if (this._config.backdrop === true) {
this.hide();
} else if (this._config.backdrop === "static") {
this._triggerBackdropTransition();
}
});
this._backdrop.show(callback);
}
_isAnimated() {
return this._element.classList.contains(CLASS_NAME_FADE$3);
}
_triggerBackdropTransition() {
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
if (hideEvent.defaultPrevented) {
return;
}
const {
classList,
scrollHeight,
style
} = this._element;
const isModalOverflowing = scrollHeight > document.documentElement.clientHeight;
if (!isModalOverflowing && style.overflowY === "hidden" || classList.contains(CLASS_NAME_STATIC)) {
return;
}
if (!isModalOverflowing) {
style.overflowY = "hidden";
}
classList.add(CLASS_NAME_STATIC);
this._queueCallback(() => {
classList.remove(CLASS_NAME_STATIC);
if (!isModalOverflowing) {
this._queueCallback(() => {
style.overflowY = "";
}, this._dialog);
}
}, this._dialog);
this._element.focus();
}
_adjustDialog() {
const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
const scrollbarWidth = this._scrollBar.getWidth();
const isBodyOverflowing = scrollbarWidth > 0;
if (!isBodyOverflowing && isModalOverflowing && !isRTL() || isBodyOverflowing && !isModalOverflowing && isRTL()) {
this._element.style.paddingLeft = `${scrollbarWidth}px`;
}
if (isBodyOverflowing && !isModalOverflowing && !isRTL() || !isBodyOverflowing && isModalOverflowing && isRTL()) {
this._element.style.paddingRight = `${scrollbarWidth}px`;
}
}
_resetAdjustments() {
this._element.style.paddingLeft = "";
this._element.style.paddingRight = "";
}
static jQueryInterface(config, relatedTarget) {
return this.each(function() {
const data = Modal.getOrCreateInstance(this, config);
if (typeof config !== "string") {
return;
}
if (typeof data[config] === "undefined") {
throw new TypeError(`No method named "${config}"`);
}
data[config](relatedTarget);
});
}
};
EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function(event) {
const target = getElementFromSelector(this);
if (["A", "AREA"].includes(this.tagName)) {
event.preventDefault();
}
EventHandler.one(target, EVENT_SHOW$3, (showEvent) => {
if (showEvent.defaultPrevented) {
return;
}
EventHandler.one(target, EVENT_HIDDEN$3, () => {
if (isVisible(this)) {
this.focus();
}
});
});
const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);
if (allReadyOpen) {
Modal.getInstance(allReadyOpen).hide();
}
const data = Modal.getOrCreateInstance(target);
data.toggle(this);
});
enableDismissTrigger(Modal);
defineJQueryPlugin(Modal);
var NAME$5 = "offcanvas";
var DATA_KEY$5 = "bs.offcanvas";
var EVENT_KEY$5 = `.${DATA_KEY$5}`;
var DATA_API_KEY$2 = ".data-api";
var EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$5}${DATA_API_KEY$2}`;
var ESCAPE_KEY = "Escape";
var Default$4 = {
backdrop: true,
keyboard: true,
scroll: false
};
var DefaultType$4 = {
backdrop: "boolean",
keyboard: "boolean",
scroll: "boolean"
};
var CLASS_NAME_SHOW$3 = "show";
var CLASS_NAME_BACKDROP = "offcanvas-backdrop";
var OPEN_SELECTOR = ".offcanvas.show";
var EVENT_SHOW$2 = `show${EVENT_KEY$5}`;
var EVENT_SHOWN$2 = `shown${EVENT_KEY$5}`;
var EVENT_HIDE$2 = `hide${EVENT_KEY$5}`;
var EVENT_HIDDEN$2 = `hidden${EVENT_KEY$5}`;
var EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$5}${DATA_API_KEY$2}`;
var EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$5}`;
var SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle="offcanvas"]';
var Offcanvas = class extends BaseComponent {
constructor(element, config) {
super(element);
this._config = this._getConfig(config);
this._isShown = false;
this._backdrop = this._initializeBackDrop();
this._focustrap = this._initializeFocusTrap();
this._addEventListeners();
}
static get NAME() {
return NAME$5;
}
static get Default() {
return Default$4;
}
toggle(relatedTarget) {
return this._isShown ? this.hide() : this.show(relatedTarget);
}
show(relatedTarget) {
if (this._isShown) {
return;
}
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$2, {
relatedTarget
});
if (showEvent.defaultPrevented) {
return;
}
this._isShown = true;
this._element.style.visibility = "visible";
this._backdrop.show();
if (!this._config.scroll) {
new ScrollBarHelper().hide();
}
this._element.removeAttribute("aria-hidden");
this._element.setAttribute("aria-modal", true);
this._element.setAttribute("role", "dialog");
this._element.classList.add(CLASS_NAME_SHOW$3);
const completeCallBack = () => {
if (!this._config.scroll) {
this._focustrap.activate();
}
EventHandler.trigger(this._element, EVENT_SHOWN$2, {
relatedTarget
});
};
this._queueCallback(completeCallBack, this._element, true);
}
hide() {
if (!this._isShown) {
return;
}
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$2);
if (hideEvent.defaultPrevented) {
return;
}
this._focustrap.deactivate();
this._element.blur();
this._isShown = false;
this._element.classList.remove(CLASS_NAME_SHOW$3);
this._backdrop.hide();
const completeCallback = () => {
this._element.setAttribute("aria-hidden", true);
this._element.removeAttribute("aria-modal");
this._element.removeAttribute("role");
this._element.style.visibility = "hidden";
if (!this._config.scroll) {
new ScrollBarHelper().reset();
}
EventHandler.trigger(this._element, EVENT_HIDDEN$2);
};
this._queueCallback(completeCallback, this._element, true);
}
dispose() {
this._backdrop.dispose();
this._focustrap.deactivate();
super.dispose();
}
_getConfig(config) {
config = __spreadValues(__spreadValues(__spreadValues({}, Default$4), Manipulator.getDataAttributes(this._element)), typeof config === "object" ? config : {});
typeCheckConfig(NAME$5, config, DefaultType$4);
return config;
}
_initializeBackDrop() {
return new Backdrop({
className: CLASS_NAME_BACKDROP,
isVisible: this._config.backdrop,
isAnimated: true,
rootElement: this._element.parentNode,
clickCallback: () => this.hide()
});
}
_initializeFocusTrap() {
return new FocusTrap({
trapElement: this._element
});
}
_addEventListeners() {
EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, (event) => {
if (this._config.keyboard && event.key === ESCAPE_KEY) {
this.hide();
}
});
}
static jQueryInterface(config) {
return this.each(function() {
const data = Offcanvas.getOrCreateInstance(this, config);
if (typeof config !== "string") {
return;
}
if (data[config] === void 0 || config.startsWith("_") || config === "constructor") {
throw new TypeError(`No method named "${config}"`);
}
data[config](this);
});
}
};
EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function(event) {
const target = getElementFromSelector(this);
if (["A", "AREA"].includes(this.tagName)) {
event.preventDefault();
}
if (isDisabled(this)) {
return;
}
EventHandler.one(target, EVENT_HIDDEN$2, () => {
if (isVisible(this)) {
this.focus();
}
});
const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);
if (allReadyOpen && allReadyOpen !== target) {
Offcanvas.getInstance(allReadyOpen).hide();
}
const data = Offcanvas.getOrCreateInstance(target);
data.toggle(this);
});
EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => SelectorEngine.find(OPEN_SELECTOR).forEach((el) => Offcanvas.getOrCreateInstance(el).show()));
enableDismissTrigger(Offcanvas);
defineJQueryPlugin(Offcanvas);
var uriAttributes = /* @__PURE__ */ new Set(["background", "cite", "href", "itemtype", "longdesc", "poster", "src", "xlink:href"]);
var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i;
var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i;
var allowedAttribute = (attribute, allowedAttributeList) => {
const attributeName = attribute.nodeName.toLowerCase();
if (allowedAttributeList.includes(attributeName)) {
if (uriAttributes.has(attributeName)) {
return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue));
}
return true;
}
const regExp = allowedAttributeList.filter((attributeRegex) => attributeRegex instanceof RegExp);
for (let i = 0, len = regExp.length; i < len; i++) {
if (regExp[i].test(attributeName)) {
return true;
}
}
return false;
};
var DefaultAllowlist = {
"*": ["class", "dir", "id", "lang", "role", ARIA_ATTRIBUTE_PATTERN],
a: ["target", "href", "title", "rel"],
area: [],
b: [],
br: [],
col: [],
code: [],
div: [],
em: [],
hr: [],
h1: [],
h2: [],
h3: [],
h4: [],
h5: [],
h6: [],
i: [],
img: ["src", "srcset", "alt", "title", "width", "height"],
li: [],
ol: [],
p: [],
pre: [],
s: [],
small: [],
span: [],
sub: [],
sup: [],
strong: [],
u: [],
ul: []
};
function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {
if (!unsafeHtml.length) {
return unsafeHtml;
}
if (sanitizeFn && typeof sanitizeFn === "function") {
return sanitizeFn(unsafeHtml);
}
const domParser = new window.DOMParser();
const createdDocument = domParser.parseFromString(unsafeHtml, "text/html");
const elements = [].concat(...createdDocument.body.querySelectorAll("*"));
for (let i = 0, len = elements.length; i < len; i++) {
const element = elements[i];
const elementName = element.nodeName.toLowerCase();
if (!Object.keys(allowList).includes(elementName)) {
element.remove();
continue;
}
const attributeList = [].concat(...element.attributes);
const allowedAttributes = [].concat(allowList["*"] || [], allowList[elementName] || []);
attributeList.forEach((attribute) => {
if (!allowedAttribute(attribute, allowedAttributes)) {
element.removeAttribute(attribute.nodeName);
}
});
}
return createdDocument.body.innerHTML;
}
var NAME$4 = "tooltip";
var DATA_KEY$4 = "bs.tooltip";
var EVENT_KEY$4 = `.${DATA_KEY$4}`;
var CLASS_PREFIX$1 = "bs-tooltip";
var DISALLOWED_ATTRIBUTES = /* @__PURE__ */ new Set(["sanitize", "allowList", "sanitizeFn"]);
var DefaultType$3 = {
animation: "boolean",
template: "string",
title: "(string|element|function)",
trigger: "string",
delay: "(number|object)",
html: "boolean",
selector: "(string|boolean)",
placement: "(string|function)",
offset: "(array|string|function)",
container: "(string|element|boolean)",
fallbackPlacements: "array",
boundary: "(string|element)",
customClass: "(string|function)",
sanitize: "boolean",
sanitizeFn: "(null|function)",
allowList: "object",
popperConfig: "(null|object|function)"
};
var AttachmentMap = {
AUTO: "auto",
TOP: "top",
RIGHT: isRTL() ? "left" : "right",
BOTTOM: "bottom",
LEFT: isRTL() ? "right" : "left"
};
var Default$3 = {
animation: true,
template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
trigger: "hover focus",
title: "",
delay: 0,
html: false,
selector: false,
placement: "top",
offset: [0, 0],
container: false,
fallbackPlacements: ["top", "right", "bottom", "left"],
boundary: "clippingParents",
customClass: "",
sanitize: true,
sanitizeFn: null,
allowList: DefaultAllowlist,
popperConfig: null
};
var Event$2 = {
HIDE: `hide${EVENT_KEY$4}`,
HIDDEN: `hidden${EVENT_KEY$4}`,
SHOW: `show${EVENT_KEY$4}`,
SHOWN: `shown${EVENT_KEY$4}`,
INSERTED: `inserted${EVENT_KEY$4}`,
CLICK: `click${EVENT_KEY$4}`,
FOCUSIN: `focusin${EVENT_KEY$4}`,
FOCUSOUT: `focusout${EVENT_KEY$4}`,
MOUSEENTER: `mouseenter${EVENT_KEY$4}`,
MOUSELEAVE: `mouseleave${EVENT_KEY$4}`
};
var CLASS_NAME_FADE$2 = "fade";
var CLASS_NAME_MODAL = "modal";
var CLASS_NAME_SHOW$2 = "show";
var HOVER_STATE_SHOW = "show";
var HOVER_STATE_OUT = "out";
var SELECTOR_TOOLTIP_INNER = ".tooltip-inner";
var SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;
var EVENT_MODAL_HIDE = "hide.bs.modal";
var TRIGGER_HOVER = "hover";
var TRIGGER_FOCUS = "focus";
var TRIGGER_CLICK = "click";
var TRIGGER_MANUAL = "manual";
var Tooltip = class extends BaseComponent {
constructor(element, config) {
if (typeof lib_exports === "undefined") {
throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");
}
super(element);
this._isEnabled = true;
this._timeout = 0;
this._hoverState = "";
this._activeTrigger = {};
this._popper = null;
this._config = this._getConfig(config);
this.tip = null;
this._setListeners();
}
static get Default() {
return Default$3;
}
static get NAME() {
return NAME$4;
}
static get Event() {
return Event$2;
}
static get DefaultType() {
return DefaultType$3;
}
enable() {
this._isEnabled = true;
}
disable() {
this._isEnabled = false;
}
toggleEnabled() {
this._isEnabled = !this._isEnabled;
}
toggle(event) {
if (!this._isEnabled) {
return;
}
if (event) {
const context = this._initializeOnDelegatedTarget(event);
context._activeTrigger.click = !context._activeTrigger.click;
if (context._isWithActiveTrigger()) {
context._enter(null, context);
} else {
context._leave(null, context);
}
} else {
if (this.getTipElement().classList.contains(CLASS_NAME_SHOW$2)) {
this._leave(null, this);
return;
}
this._enter(null, this);
}
}
dispose() {
clearTimeout(this._timeout);
EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
if (this.tip) {
this.tip.remove();
}
this._disposePopper();
super.dispose();
}
show() {
if (this._element.style.display === "none") {
throw new Error("Please use show on visible elements");
}
if (!(this.isWithContent() && this._isEnabled)) {
return;
}
const showEvent = EventHandler.trigger(this._element, this.constructor.Event.SHOW);
const shadowRoot = findShadowRoot(this._element);
const isInTheDom = shadowRoot === null ? this._element.ownerDocument.documentElement.contains(this._element) : shadowRoot.contains(this._element);
if (showEvent.defaultPrevented || !isInTheDom) {
return;
}
if (this.constructor.NAME === "tooltip" && this.tip && this.getTitle() !== this.tip.querySelector(SELECTOR_TOOLTIP_INNER).innerHTML) {
this._disposePopper();
this.tip.remove();
this.tip = null;
}
const tip = this.getTipElement();
const tipId = getUID(this.constructor.NAME);
tip.setAttribute("id", tipId);
this._element.setAttribute("aria-describedby", tipId);
if (this._config.animation) {
tip.classList.add(CLASS_NAME_FADE$2);
}
const placement = typeof this._config.placement === "function" ? this._config.placement.call(this, tip, this._element) : this._config.placement;
const attachment = this._getAttachment(placement);
this._addAttachmentClass(attachment);
const {
container
} = this._config;
Data.set(tip, this.constructor.DATA_KEY, this);
if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
container.append(tip);
EventHandler.trigger(this._element, this.constructor.Event.INSERTED);
}
if (this._popper) {
this._popper.update();
} else {
this._popper = createPopper3(this._element, tip, this._getPopperConfig(attachment));
}
tip.classList.add(CLASS_NAME_SHOW$2);
const customClass = this._resolvePossibleFunction(this._config.customClass);
if (customClass) {
tip.classList.add(...customClass.split(" "));
}
if ("ontouchstart" in document.documentElement) {
[].concat(...document.body.children).forEach((element) => {
EventHandler.on(element, "mouseover", noop);
});
}
const complete = () => {
const prevHoverState = this._hoverState;
this._hoverState = null;
EventHandler.trigger(this._element, this.constructor.Event.SHOWN);
if (prevHoverState === HOVER_STATE_OUT) {
this._leave(null, this);
}
};
const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2);
this._queueCallback(complete, this.tip, isAnimated);
}
hide() {
if (!this._popper) {
return;
}
const tip = this.getTipElement();
const complete = () => {
if (this._isWithActiveTrigger()) {
return;
}
if (this._hoverState !== HOVER_STATE_SHOW) {
tip.remove();
}
this._cleanTipClass();
this._element.removeAttribute("aria-describedby");
EventHandler.trigger(this._element, this.constructor.Event.HIDDEN);
this._disposePopper();
};
const hideEvent = EventHandler.trigger(this._element, this.constructor.Event.HIDE);
if (hideEvent.defaultPrevented) {
return;
}
tip.classList.remove(CLASS_NAME_SHOW$2);
if ("ontouchstart" in document.documentElement) {
[].concat(...document.body.children).forEach((element) => EventHandler.off(element, "mouseover", noop));
}
this._activeTrigger[TRIGGER_CLICK] = false;
this._activeTrigger[TRIGGER_FOCUS] = false;
this._activeTrigger[TRIGGER_HOVER] = false;
const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2);
this._queueCallback(complete, this.tip, isAnimated);
this._hoverState = "";
}
update() {
if (this._popper !== null) {
this._popper.update();
}
}
isWithContent() {
return Boolean(this.getTitle());
}
getTipElement() {
if (this.tip) {
return this.tip;
}
const element = document.createElement("div");
element.innerHTML = this._config.template;
const tip = element.children[0];
this.setContent(tip);
tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);
this.tip = tip;
return this.tip;
}
setContent(tip) {
this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER);
}
_sanitizeAndSetContent(template, content, selector) {
const templateElement = SelectorEngine.findOne(selector, template);
if (!content && templateElement) {
templateElement.remove();
return;
}
this.setElementContent(templateElement, content);
}
setElementContent(element, content) {
if (element === null) {
return;
}
if (isElement2(content)) {
content = getElement(content);
if (this._config.html) {
if (content.parentNode !== element) {
element.innerHTML = "";
element.append(content);
}
} else {
element.textContent = content.textContent;
}
return;
}
if (this._config.html) {
if (this._config.sanitize) {
content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn);
}
element.innerHTML = content;
} else {
element.textContent = content;
}
}
getTitle() {
const title = this._element.getAttribute("data-bs-original-title") || this._config.title;
return this._resolvePossibleFunction(title);
}
updateAttachment(attachment) {
if (attachment === "right") {
return "end";
}
if (attachment === "left") {
return "start";
}
return attachment;
}
_initializeOnDelegatedTarget(event, context) {
return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());
}
_getOffset() {
const {
offset: offset2
} = this._config;
if (typeof offset2 === "string") {
return offset2.split(",").map((val) => Number.parseInt(val, 10));
}
if (typeof offset2 === "function") {
return (popperData) => offset2(popperData, this._element);
}
return offset2;
}
_resolvePossibleFunction(content) {
return typeof content === "function" ? content.call(this._element) : content;
}
_getPopperConfig(attachment) {
const defaultBsPopperConfig = {
placement: attachment,
modifiers: [{
name: "flip",
options: {
fallbackPlacements: this._config.fallbackPlacements
}
}, {
name: "offset",
options: {
offset: this._getOffset()
}
}, {
name: "preventOverflow",
options: {
boundary: this._config.boundary
}
}, {
name: "arrow",
options: {
element: `.${this.constructor.NAME}-arrow`
}
}, {
name: "onChange",
enabled: true,
phase: "afterWrite",
fn: (data) => this._handlePopperPlacementChange(data)
}],
onFirstUpdate: (data) => {
if (data.options.placement !== data.placement) {
this._handlePopperPlacementChange(data);
}
}
};
return __spreadValues(__spreadValues({}, defaultBsPopperConfig), typeof this._config.popperConfig === "function" ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig);
}
_addAttachmentClass(attachment) {
this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`);
}
_getAttachment(placement) {
return AttachmentMap[placement.toUpperCase()];
}
_setListeners() {
const triggers = this._config.trigger.split(" ");
triggers.forEach((trigger) => {
if (trigger === "click") {
EventHandler.on(this._element, this.constructor.Event.CLICK, this._config.selector, (event) => this.toggle(event));
} else if (trigger !== TRIGGER_MANUAL) {
const eventIn = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSEENTER : this.constructor.Event.FOCUSIN;
const eventOut = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSELEAVE : this.constructor.Event.FOCUSOUT;
EventHandler.on(this._element, eventIn, this._config.selector, (event) => this._enter(event));
EventHandler.on(this._element, eventOut, this._config.selector, (event) => this._leave(event));
}
});
this._hideModalHandler = () => {
if (this._element) {
this.hide();
}
};
EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
if (this._config.selector) {
this._config = __spreadProps(__spreadValues({}, this._config), {
trigger: "manual",
selector: ""
});
} else {
this._fixTitle();
}
}
_fixTitle() {
const title = this._element.getAttribute("title");
const originalTitleType = typeof this._element.getAttribute("data-bs-original-title");
if (title || originalTitleType !== "string") {
this._element.setAttribute("data-bs-original-title", title || "");
if (title && !this._element.getAttribute("aria-label") && !this._element.textContent) {
this._element.setAttribute("aria-label", title);
}
this._element.setAttribute("title", "");
}
}
_enter(event, context) {
context = this._initializeOnDelegatedTarget(event, context);
if (event) {
context._activeTrigger[event.type === "focusin" ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;
}
if (context.getTipElement().classList.contains(CLASS_NAME_SHOW$2) || context._hoverState === HOVER_STATE_SHOW) {
context._hoverState = HOVER_STATE_SHOW;
return;
}
clearTimeout(context._timeout);
context._hoverState = HOVER_STATE_SHOW;
if (!context._config.delay || !context._config.delay.show) {
context.show();
return;
}
context._timeout = setTimeout(() => {
if (context._hoverState === HOVER_STATE_SHOW) {
context.show();
}
}, context._config.delay.show);
}
_leave(event, context) {
context = this._initializeOnDelegatedTarget(event, context);
if (event) {
context._activeTrigger[event.type === "focusout" ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);
}
if (context._isWithActiveTrigger()) {
return;
}
clearTimeout(context._timeout);
context._hoverState = HOVER_STATE_OUT;
if (!context._config.delay || !context._config.delay.hide) {
context.hide();
return;
}
context._timeout = setTimeout(() => {
if (context._hoverState === HOVER_STATE_OUT) {
context.hide();
}
}, context._config.delay.hide);
}
_isWithActiveTrigger() {
for (const trigger in this._activeTrigger) {
if (this._activeTrigger[trigger]) {
return true;
}
}
return false;
}
_getConfig(config) {
const dataAttributes = Manipulator.getDataAttributes(this._element);
Object.keys(dataAttributes).forEach((dataAttr) => {
if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {
delete dataAttributes[dataAttr];
}
});
config = __spreadValues(__spreadValues(__spreadValues({}, this.constructor.Default), dataAttributes), typeof config === "object" && config ? config : {});
config.container = config.container === false ? document.body : getElement(config.container);
if (typeof config.delay === "number") {
config.delay = {
show: config.delay,
hide: config.delay
};
}
if (typeof config.title === "number") {
config.title = config.title.toString();
}
if (typeof config.content === "number") {
config.content = config.content.toString();
}
typeCheckConfig(NAME$4, config, this.constructor.DefaultType);
if (config.sanitize) {
config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn);
}
return config;
}
_getDelegateConfig() {
const config = {};
for (const key in this._config) {
if (this.constructor.Default[key] !== this._config[key]) {
config[key] = this._config[key];
}
}
return config;
}
_cleanTipClass() {
const tip = this.getTipElement();
const basicClassPrefixRegex = new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`, "g");
const tabClass = tip.getAttribute("class").match(basicClassPrefixRegex);
if (tabClass !== null && tabClass.length > 0) {
tabClass.map((token) => token.trim()).forEach((tClass) => tip.classList.remove(tClass));
}
}
_getBasicClassPrefix() {
return CLASS_PREFIX$1;
}
_handlePopperPlacementChange(popperData) {
const {
state
} = popperData;
if (!state) {
return;
}
this.tip = state.elements.popper;
this._cleanTipClass();
this._addAttachmentClass(this._getAttachment(state.placement));
}
_disposePopper() {
if (this._popper) {
this._popper.destroy();
this._popper = null;
}
}
static jQueryInterface(config) {
return this.each(function() {
const data = Tooltip.getOrCreateInstance(this, config);
if (typeof config === "string") {
if (typeof data[config] === "undefined") {
throw new TypeError(`No method named "${config}"`);
}
data[config]();
}
});
}
};
defineJQueryPlugin(Tooltip);
var NAME$3 = "popover";
var DATA_KEY$3 = "bs.popover";
var EVENT_KEY$3 = `.${DATA_KEY$3}`;
var CLASS_PREFIX = "bs-popover";
var Default$2 = __spreadProps(__spreadValues({}, Tooltip.Default), {
placement: "right",
offset: [0, 8],
trigger: "click",
content: "",
template: '<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'
});
var DefaultType$2 = __spreadProps(__spreadValues({}, Tooltip.DefaultType), {
content: "(string|element|function)"
});
var Event$1 = {
HIDE: `hide${EVENT_KEY$3}`,
HIDDEN: `hidden${EVENT_KEY$3}`,
SHOW: `show${EVENT_KEY$3}`,
SHOWN: `shown${EVENT_KEY$3}`,
INSERTED: `inserted${EVENT_KEY$3}`,
CLICK: `click${EVENT_KEY$3}`,
FOCUSIN: `focusin${EVENT_KEY$3}`,
FOCUSOUT: `focusout${EVENT_KEY$3}`,
MOUSEENTER: `mouseenter${EVENT_KEY$3}`,
MOUSELEAVE: `mouseleave${EVENT_KEY$3}`
};
var SELECTOR_TITLE = ".popover-header";
var SELECTOR_CONTENT = ".popover-body";
var Popover = class extends Tooltip {
static get Default() {
return Default$2;
}
static get NAME() {
return NAME$3;
}
static get Event() {
return Event$1;
}
static get DefaultType() {
return DefaultType$2;
}
isWithContent() {
return this.getTitle() || this._getContent();
}
setContent(tip) {
this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE);
this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT);
}
_getContent() {
return this._resolvePossibleFunction(this._config.content);
}
_getBasicClassPrefix() {
return CLASS_PREFIX;
}
static jQueryInterface(config) {
return this.each(function() {
const data = Popover.getOrCreateInstance(this, config);
if (typeof config === "string") {
if (typeof data[config] === "undefined") {
throw new TypeError(`No method named "${config}"`);
}
data[config]();
}
});
}
};
defineJQueryPlugin(Popover);
var NAME$2 = "scrollspy";
var DATA_KEY$2 = "bs.scrollspy";
var EVENT_KEY$2 = `.${DATA_KEY$2}`;
var DATA_API_KEY$1 = ".data-api";
var Default$1 = {
offset: 10,
method: "auto",
target: ""
};
var DefaultType$1 = {
offset: "number",
method: "string",
target: "(string|element)"
};
var EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;
var EVENT_SCROLL = `scroll${EVENT_KEY$2}`;
var EVENT_LOAD_DATA_API = `load${EVENT_KEY$2}${DATA_API_KEY$1}`;
var CLASS_NAME_DROPDOWN_ITEM = "dropdown-item";
var CLASS_NAME_ACTIVE$1 = "active";
var SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]';
var SELECTOR_NAV_LIST_GROUP$1 = ".nav, .list-group";
var SELECTOR_NAV_LINKS = ".nav-link";
var SELECTOR_NAV_ITEMS = ".nav-item";
var SELECTOR_LIST_ITEMS = ".list-group-item";
var SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`;
var SELECTOR_DROPDOWN$1 = ".dropdown";
var SELECTOR_DROPDOWN_TOGGLE$1 = ".dropdown-toggle";
var METHOD_OFFSET = "offset";
var METHOD_POSITION = "position";
var ScrollSpy = class extends BaseComponent {
constructor(element, config) {
super(element);
this._scrollElement = this._element.tagName === "BODY" ? window : this._element;
this._config = this._getConfig(config);
this._offsets = [];
this._targets = [];
this._activeTarget = null;
this._scrollHeight = 0;
EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process());
this.refresh();
this._process();
}
static get Default() {
return Default$1;
}
static get NAME() {
return NAME$2;
}
refresh() {
const autoMethod = this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION;
const offsetMethod = this._config.method === "auto" ? autoMethod : this._config.method;
const offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0;
this._offsets = [];
this._targets = [];
this._scrollHeight = this._getScrollHeight();
const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target);
targets.map((element) => {
const targetSelector = getSelectorFromElement(element);
const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null;
if (target) {
const targetBCR = target.getBoundingClientRect();
if (targetBCR.width || targetBCR.height) {
return [Manipulator[offsetMethod](target).top + offsetBase, targetSelector];
}
}
return null;
}).filter((item) => item).sort((a, b) => a[0] - b[0]).forEach((item) => {
this._offsets.push(item[0]);
this._targets.push(item[1]);
});
}
dispose() {
EventHandler.off(this._scrollElement, EVENT_KEY$2);
super.dispose();
}
_getConfig(config) {
config = __spreadValues(__spreadValues(__spreadValues({}, Default$1), Manipulator.getDataAttributes(this._element)), typeof config === "object" && config ? config : {});
config.target = getElement(config.target) || document.documentElement;
typeCheckConfig(NAME$2, config, DefaultType$1);
return config;
}
_getScrollTop() {
return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
}
_getScrollHeight() {
return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
}
_getOffsetHeight() {
return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;
}
_process() {
const scrollTop = this._getScrollTop() + this._config.offset;
const scrollHeight = this._getScrollHeight();
const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();
if (this._scrollHeight !== scrollHeight) {
this.refresh();
}
if (scrollTop >= maxScroll) {
const target = this._targets[this._targets.length - 1];
if (this._activeTarget !== target) {
this._activate(target);
}
return;
}
if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
this._activeTarget = null;
this._clear();
return;
}
for (let i = this._offsets.length; i--; ) {
const isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === "undefined" || scrollTop < this._offsets[i + 1]);
if (isActiveTarget) {
this._activate(this._targets[i]);
}
}
}
_activate(target) {
this._activeTarget = target;
this._clear();
const queries = SELECTOR_LINK_ITEMS.split(",").map((selector) => `${selector}[data-bs-target="${target}"],${selector}[href="${target}"]`);
const link = SelectorEngine.findOne(queries.join(","), this._config.target);
link.classList.add(CLASS_NAME_ACTIVE$1);
if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, link.closest(SELECTOR_DROPDOWN$1)).classList.add(CLASS_NAME_ACTIVE$1);
} else {
SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP$1).forEach((listGroup) => {
SelectorEngine.prev(listGroup, `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`).forEach((item) => item.classList.add(CLASS_NAME_ACTIVE$1));
SelectorEngine.prev(listGroup, SELECTOR_NAV_ITEMS).forEach((navItem) => {
SelectorEngine.children(navItem, SELECTOR_NAV_LINKS).forEach((item) => item.classList.add(CLASS_NAME_ACTIVE$1));
});
});
}
EventHandler.trigger(this._scrollElement, EVENT_ACTIVATE, {
relatedTarget: target
});
}
_clear() {
SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target).filter((node) => node.classList.contains(CLASS_NAME_ACTIVE$1)).forEach((node) => node.classList.remove(CLASS_NAME_ACTIVE$1));
}
static jQueryInterface(config) {
return this.each(function() {
const data = ScrollSpy.getOrCreateInstance(this, config);
if (typeof config !== "string") {
return;
}
if (typeof data[config] === "undefined") {
throw new TypeError(`No method named "${config}"`);
}
data[config]();
});
}
};
EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
SelectorEngine.find(SELECTOR_DATA_SPY).forEach((spy) => new ScrollSpy(spy));
});
defineJQueryPlugin(ScrollSpy);
var NAME$1 = "tab";
var DATA_KEY$1 = "bs.tab";
var EVENT_KEY$1 = `.${DATA_KEY$1}`;
var DATA_API_KEY = ".data-api";
var EVENT_HIDE$1 = `hide${EVENT_KEY$1}`;
var EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`;
var EVENT_SHOW$1 = `show${EVENT_KEY$1}`;
var EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`;
var EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}${DATA_API_KEY}`;
var CLASS_NAME_DROPDOWN_MENU = "dropdown-menu";
var CLASS_NAME_ACTIVE = "active";
var CLASS_NAME_FADE$1 = "fade";
var CLASS_NAME_SHOW$1 = "show";
var SELECTOR_DROPDOWN = ".dropdown";
var SELECTOR_NAV_LIST_GROUP = ".nav, .list-group";
var SELECTOR_ACTIVE = ".active";
var SELECTOR_ACTIVE_UL = ":scope > li > .active";
var SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]';
var SELECTOR_DROPDOWN_TOGGLE = ".dropdown-toggle";
var SELECTOR_DROPDOWN_ACTIVE_CHILD = ":scope > .dropdown-menu .active";
var Tab = class extends BaseComponent {
static get NAME() {
return NAME$1;
}
show() {
if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && this._element.classList.contains(CLASS_NAME_ACTIVE)) {
return;
}
let previous;
const target = getElementFromSelector(this._element);
const listElement = this._element.closest(SELECTOR_NAV_LIST_GROUP);
if (listElement) {
const itemSelector = listElement.nodeName === "UL" || listElement.nodeName === "OL" ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE;
previous = SelectorEngine.find(itemSelector, listElement);
previous = previous[previous.length - 1];
}
const hideEvent = previous ? EventHandler.trigger(previous, EVENT_HIDE$1, {
relatedTarget: this._element
}) : null;
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$1, {
relatedTarget: previous
});
if (showEvent.defaultPrevented || hideEvent !== null && hideEvent.defaultPrevented) {
return;
}
this._activate(this._element, listElement);
const complete = () => {
EventHandler.trigger(previous, EVENT_HIDDEN$1, {
relatedTarget: this._element
});
EventHandler.trigger(this._element, EVENT_SHOWN$1, {
relatedTarget: previous
});
};
if (target) {
this._activate(target, target.parentNode, complete);
} else {
complete();
}
}
_activate(element, container, callback) {
const activeElements = container && (container.nodeName === "UL" || container.nodeName === "OL") ? SelectorEngine.find(SELECTOR_ACTIVE_UL, container) : SelectorEngine.children(container, SELECTOR_ACTIVE);
const active = activeElements[0];
const isTransitioning = callback && active && active.classList.contains(CLASS_NAME_FADE$1);
const complete = () => this._transitionComplete(element, active, callback);
if (active && isTransitioning) {
active.classList.remove(CLASS_NAME_SHOW$1);
this._queueCallback(complete, element, true);
} else {
complete();
}
}
_transitionComplete(element, active, callback) {
if (active) {
active.classList.remove(CLASS_NAME_ACTIVE);
const dropdownChild = SelectorEngine.findOne(SELECTOR_DROPDOWN_ACTIVE_CHILD, active.parentNode);
if (dropdownChild) {
dropdownChild.classList.remove(CLASS_NAME_ACTIVE);
}
if (active.getAttribute("role") === "tab") {
active.setAttribute("aria-selected", false);
}
}
element.classList.add(CLASS_NAME_ACTIVE);
if (element.getAttribute("role") === "tab") {
element.setAttribute("aria-selected", true);
}
reflow(element);
if (element.classList.contains(CLASS_NAME_FADE$1)) {
element.classList.add(CLASS_NAME_SHOW$1);
}
let parent = element.parentNode;
if (parent && parent.nodeName === "LI") {
parent = parent.parentNode;
}
if (parent && parent.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {
const dropdownElement = element.closest(SELECTOR_DROPDOWN);
if (dropdownElement) {
SelectorEngine.find(SELECTOR_DROPDOWN_TOGGLE, dropdownElement).forEach((dropdown) => dropdown.classList.add(CLASS_NAME_ACTIVE));
}
element.setAttribute("aria-expanded", true);
}
if (callback) {
callback();
}
}
static jQueryInterface(config) {
return this.each(function() {
const data = Tab.getOrCreateInstance(this);
if (typeof config === "string") {
if (typeof data[config] === "undefined") {
throw new TypeError(`No method named "${config}"`);
}
data[config]();
}
});
}
};
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function(event) {
if (["A", "AREA"].includes(this.tagName)) {
event.preventDefault();
}
if (isDisabled(this)) {
return;
}
const data = Tab.getOrCreateInstance(this);
data.show();
});
defineJQueryPlugin(Tab);
var NAME = "toast";
var DATA_KEY = "bs.toast";
var EVENT_KEY = `.${DATA_KEY}`;
var EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;
var EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;
var EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
var EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;
var EVENT_HIDE = `hide${EVENT_KEY}`;
var EVENT_HIDDEN = `hidden${EVENT_KEY}`;
var EVENT_SHOW = `show${EVENT_KEY}`;
var EVENT_SHOWN = `shown${EVENT_KEY}`;
var CLASS_NAME_FADE = "fade";
var CLASS_NAME_HIDE = "hide";
var CLASS_NAME_SHOW = "show";
var CLASS_NAME_SHOWING = "showing";
var DefaultType = {
animation: "boolean",
autohide: "boolean",
delay: "number"
};
var Default = {
animation: true,
autohide: true,
delay: 5e3
};
var Toast = class extends BaseComponent {
constructor(element, config) {
super(element);
this._config = this._getConfig(config);
this._timeout = null;
this._hasMouseInteraction = false;
this._hasKeyboardInteraction = false;
this._setListeners();
}
static get DefaultType() {
return DefaultType;
}
static get Default() {
return Default;
}
static get NAME() {
return NAME;
}
show() {
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);
if (showEvent.defaultPrevented) {
return;
}
this._clearTimeout();
if (this._config.animation) {
this._element.classList.add(CLASS_NAME_FADE);
}
const complete = () => {
this._element.classList.remove(CLASS_NAME_SHOWING);
EventHandler.trigger(this._element, EVENT_SHOWN);
this._maybeScheduleHide();
};
this._element.classList.remove(CLASS_NAME_HIDE);
reflow(this._element);
this._element.classList.add(CLASS_NAME_SHOW);
this._element.classList.add(CLASS_NAME_SHOWING);
this._queueCallback(complete, this._element, this._config.animation);
}
hide() {
if (!this._element.classList.contains(CLASS_NAME_SHOW)) {
return;
}
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
if (hideEvent.defaultPrevented) {
return;
}
const complete = () => {
this._element.classList.add(CLASS_NAME_HIDE);
this._element.classList.remove(CLASS_NAME_SHOWING);
this._element.classList.remove(CLASS_NAME_SHOW);
EventHandler.trigger(this._element, EVENT_HIDDEN);
};
this._element.classList.add(CLASS_NAME_SHOWING);
this._queueCallback(complete, this._element, this._config.animation);
}
dispose() {
this._clearTimeout();
if (this._element.classList.contains(CLASS_NAME_SHOW)) {
this._element.classList.remove(CLASS_NAME_SHOW);
}
super.dispose();
}
_getConfig(config) {
config = __spreadValues(__spreadValues(__spreadValues({}, Default), Manipulator.getDataAttributes(this._element)), typeof config === "object" && config ? config : {});
typeCheckConfig(NAME, config, this.constructor.DefaultType);
return config;
}
_maybeScheduleHide() {
if (!this._config.autohide) {
return;
}
if (this._hasMouseInteraction || this._hasKeyboardInteraction) {
return;
}
this._timeout = setTimeout(() => {
this.hide();
}, this._config.delay);
}
_onInteraction(event, isInteracting) {
switch (event.type) {
case "mouseover":
case "mouseout":
this._hasMouseInteraction = isInteracting;
break;
case "focusin":
case "focusout":
this._hasKeyboardInteraction = isInteracting;
break;
}
if (isInteracting) {
this._clearTimeout();
return;
}
const nextElement = event.relatedTarget;
if (this._element === nextElement || this._element.contains(nextElement)) {
return;
}
this._maybeScheduleHide();
}
_setListeners() {
EventHandler.on(this._element, EVENT_MOUSEOVER, (event) => this._onInteraction(event, true));
EventHandler.on(this._element, EVENT_MOUSEOUT, (event) => this._onInteraction(event, false));
EventHandler.on(this._element, EVENT_FOCUSIN, (event) => this._onInteraction(event, true));
EventHandler.on(this._element, EVENT_FOCUSOUT, (event) => this._onInteraction(event, false));
}
_clearTimeout() {
clearTimeout(this._timeout);
this._timeout = null;
}
static jQueryInterface(config) {
return this.each(function() {
const data = Toast.getOrCreateInstance(this, config);
if (typeof config === "string") {
if (typeof data[config] === "undefined") {
throw new TypeError(`No method named "${config}"`);
}
data[config](this);
}
});
}
};
enableDismissTrigger(Toast);
defineJQueryPlugin(Toast);
// js/app.js
var import_prism = __toESM(require_prism());
// js/repository.js
var import_jquery = __toESM(require_jquery());
(0, import_jquery.default)(function() {
(0, import_jquery.default)("select.tree").change(function() {
document.location = this.value;
});
});
// js/kmx_anim.js
var import_jquery2 = __toESM(require_jquery());
// js/kmx_colors.js
var kmx_colors = {
"kmx-black": "#1e1f1d",
"kmx-blue": "#5a60f9",
"kmx-blue1": "#6f72f9",
"kmx-blue2": "#9c99fd",
"kmx-blue3": "#5a60f9",
"kmx-blue4": "#6f72f9",
"kmx-blue5": "#9c99fd",
"index": [
"kmx-black",
"kmx-blue",
"kmx-blue1",
"kmx-blue2",
"kmx-blue3",
"kmx-blue4",
"kmx-blue5",
"kmx-cyan",
"kmx-cyan1",
"kmx-green",
"kmx-green1",
"kmx-orange",
"kmx-orange1",
"kmx-orange2",
"kmx-pink",
"kmx-white",
"kmx-white1",
"kmx-white2",
"kmx-yellow",
"kmx-yellow1",
"kmx-yellow2",
"kmx-yellow3"
],
"kmx-cyan": "#d4f3f6",
"kmx-cyan1": "#d4f3f6",
"kmx-green": "#c4ed3a",
"kmx-green1": "#c4ed3a",
"kmx-orange": "#f8681c",
"kmx-orange1": "#fa7734",
"kmx-orange2": "#ffa532",
"kmx-pink": "#fc9ef9",
"kmx-white": "#f5f8f4",
"kmx-white1": "#fff9f2",
"kmx-white2": "#ffffff",
"kmx-yellow": "#ecfe49",
"kmx-yellow1": "#fff43e",
"kmx-yellow2": "#ecfe49",
"kmx-yellow3": "#fff43e"
};
var kmx_colors_default = kmx_colors;
// js/kmx_anim.js
function getRandomInt(max2) {
return Math.floor(Math.random() * max2);
}
(0, import_jquery2.default)(function() {
setInterval(function() {
const i = getRandomInt(kmx_colors_default.index.length);
const name = kmx_colors_default.index[i];
const color = kmx_colors_default[name];
const x = (getRandomInt(99) - 48) * 2e-3;
(0, import_jquery2.default)("a").css("text-shadow", "0 0 0");
(0, import_jquery2.default)("a:hover").css("text-shadow", x + "em 0 0 " + color);
}, 200);
});
// ../deps/phoenix_html/priv/static/phoenix_html.js
(function() {
var PolyfillEvent = eventConstructor();
function eventConstructor() {
if (typeof window.CustomEvent === "function")
return window.CustomEvent;
function CustomEvent2(event, params) {
params = params || { bubbles: false, cancelable: false, detail: void 0 };
var evt = document.createEvent("CustomEvent");
evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
return evt;
}
CustomEvent2.prototype = window.Event.prototype;
return CustomEvent2;
}
function buildHiddenInput(name, value) {
var input = document.createElement("input");
input.type = "hidden";
input.name = name;
input.value = value;
return input;
}
function handleClick(element, targetModifierKey) {
var to = element.getAttribute("data-to"), method = buildHiddenInput("_method", element.getAttribute("data-method")), csrf = buildHiddenInput("_csrf_token", element.getAttribute("data-csrf")), form = document.createElement("form"), target = element.getAttribute("target");
form.method = element.getAttribute("data-method") === "get" ? "get" : "post";
form.action = to;
form.style.display = "hidden";
if (target)
form.target = target;
else if (targetModifierKey)
form.target = "_blank";
form.appendChild(csrf);
form.appendChild(method);
document.body.appendChild(form);
form.submit();
}
window.addEventListener("click", function(e) {
var element = e.target;
if (e.defaultPrevented)
return;
while (element && element.getAttribute) {
var phoenixLinkEvent = new PolyfillEvent("phoenix.link.click", {
"bubbles": true,
"cancelable": true
});
if (!element.dispatchEvent(phoenixLinkEvent)) {
e.preventDefault();
e.stopImmediatePropagation();
return false;
}
if (element.getAttribute("data-method")) {
handleClick(element, e.metaKey || e.shiftKey);
e.preventDefault();
return false;
} else {
element = element.parentNode;
}
}
}, false);
window.addEventListener("phoenix.link.click", function(e) {
var message = e.target.getAttribute("data-confirm");
if (message && !window.confirm(message)) {
e.preventDefault();
}
}, false);
})();
// ../deps/phoenix/priv/static/phoenix.esm.js
var closure = (value) => {
if (typeof value === "function") {
return value;
} else {
let closure22 = function() {
return value;
};
return closure22;
}
};
var globalSelf = typeof self !== "undefined" ? self : null;
var phxWindow = typeof window !== "undefined" ? window : null;
var global2 = globalSelf || phxWindow || void 0;
var DEFAULT_VSN = "2.0.0";
var SOCKET_STATES = { connecting: 0, open: 1, closing: 2, closed: 3 };
var DEFAULT_TIMEOUT = 1e4;
var WS_CLOSE_NORMAL = 1e3;
var CHANNEL_STATES = {
closed: "closed",
errored: "errored",
joined: "joined",
joining: "joining",
leaving: "leaving"
};
var CHANNEL_EVENTS = {
close: "phx_close",
error: "phx_error",
join: "phx_join",
reply: "phx_reply",
leave: "phx_leave"
};
var TRANSPORTS = {
longpoll: "longpoll",
websocket: "websocket"
};
var XHR_STATES = {
complete: 4
};
var Push = class {
constructor(channel, event, payload, timeout) {
this.channel = channel;
this.event = event;
this.payload = payload || function() {
return {};
};
this.receivedResp = null;
this.timeout = timeout;
this.timeoutTimer = null;
this.recHooks = [];
this.sent = false;
}
resend(timeout) {
this.timeout = timeout;
this.reset();
this.send();
}
send() {
if (this.hasReceived("timeout")) {
return;
}
this.startTimeout();
this.sent = true;
this.channel.socket.push({
topic: this.channel.topic,
event: this.event,
payload: this.payload(),
ref: this.ref,
join_ref: this.channel.joinRef()
});
}
receive(status, callback) {
if (this.hasReceived(status)) {
callback(this.receivedResp.response);
}
this.recHooks.push({ status, callback });
return this;
}
reset() {
this.cancelRefEvent();
this.ref = null;
this.refEvent = null;
this.receivedResp = null;
this.sent = false;
}
matchReceive({ status, response, _ref }) {
this.recHooks.filter((h) => h.status === status).forEach((h) => h.callback(response));
}
cancelRefEvent() {
if (!this.refEvent) {
return;
}
this.channel.off(this.refEvent);
}
cancelTimeout() {
clearTimeout(this.timeoutTimer);
this.timeoutTimer = null;
}
startTimeout() {
if (this.timeoutTimer) {
this.cancelTimeout();
}
this.ref = this.channel.socket.makeRef();
this.refEvent = this.channel.replyEventName(this.ref);
this.channel.on(this.refEvent, (payload) => {
this.cancelRefEvent();
this.cancelTimeout();
this.receivedResp = payload;
this.matchReceive(payload);
});
this.timeoutTimer = setTimeout(() => {
this.trigger("timeout", {});
}, this.timeout);
}
hasReceived(status) {
return this.receivedResp && this.receivedResp.status === status;
}
trigger(status, response) {
this.channel.trigger(this.refEvent, { status, response });
}
};
var Timer = class {
constructor(callback, timerCalc) {
this.callback = callback;
this.timerCalc = timerCalc;
this.timer = null;
this.tries = 0;
}
reset() {
this.tries = 0;
clearTimeout(this.timer);
}
scheduleTimeout() {
clearTimeout(this.timer);
this.timer = setTimeout(() => {
this.tries = this.tries + 1;
this.callback();
}, this.timerCalc(this.tries + 1));
}
};
var Channel = class {
constructor(topic, params, socket) {
this.state = CHANNEL_STATES.closed;
this.topic = topic;
this.params = closure(params || {});
this.socket = socket;
this.bindings = [];
this.bindingRef = 0;
this.timeout = this.socket.timeout;
this.joinedOnce = false;
this.joinPush = new Push(this, CHANNEL_EVENTS.join, this.params, this.timeout);
this.pushBuffer = [];
this.stateChangeRefs = [];
this.rejoinTimer = new Timer(() => {
if (this.socket.isConnected()) {
this.rejoin();
}
}, this.socket.rejoinAfterMs);
this.stateChangeRefs.push(this.socket.onError(() => this.rejoinTimer.reset()));
this.stateChangeRefs.push(this.socket.onOpen(() => {
this.rejoinTimer.reset();
if (this.isErrored()) {
this.rejoin();
}
}));
this.joinPush.receive("ok", () => {
this.state = CHANNEL_STATES.joined;
this.rejoinTimer.reset();
this.pushBuffer.forEach((pushEvent) => pushEvent.send());
this.pushBuffer = [];
});
this.joinPush.receive("error", () => {
this.state = CHANNEL_STATES.errored;
if (this.socket.isConnected()) {
this.rejoinTimer.scheduleTimeout();
}
});
this.onClose(() => {
this.rejoinTimer.reset();
if (this.socket.hasLogger())
this.socket.log("channel", `close ${this.topic} ${this.joinRef()}`);
this.state = CHANNEL_STATES.closed;
this.socket.remove(this);
});
this.onError((reason) => {
if (this.socket.hasLogger())
this.socket.log("channel", `error ${this.topic}`, reason);
if (this.isJoining()) {
this.joinPush.reset();
}
this.state = CHANNEL_STATES.errored;
if (this.socket.isConnected()) {
this.rejoinTimer.scheduleTimeout();
}
});
this.joinPush.receive("timeout", () => {
if (this.socket.hasLogger())
this.socket.log("channel", `timeout ${this.topic} (${this.joinRef()})`, this.joinPush.timeout);
let leavePush = new Push(this, CHANNEL_EVENTS.leave, closure({}), this.timeout);
leavePush.send();
this.state = CHANNEL_STATES.errored;
this.joinPush.reset();
if (this.socket.isConnected()) {
this.rejoinTimer.scheduleTimeout();
}
});
this.on(CHANNEL_EVENTS.reply, (payload, ref) => {
this.trigger(this.replyEventName(ref), payload);
});
}
join(timeout = this.timeout) {
if (this.joinedOnce) {
throw new Error("tried to join multiple times. 'join' can only be called a single time per channel instance");
} else {
this.timeout = timeout;
this.joinedOnce = true;
this.rejoin();
return this.joinPush;
}
}
onClose(callback) {
this.on(CHANNEL_EVENTS.close, callback);
}
onError(callback) {
return this.on(CHANNEL_EVENTS.error, (reason) => callback(reason));
}
on(event, callback) {
let ref = this.bindingRef++;
this.bindings.push({ event, ref, callback });
return ref;
}
off(event, ref) {
this.bindings = this.bindings.filter((bind) => {
return !(bind.event === event && (typeof ref === "undefined" || ref === bind.ref));
});
}
canPush() {
return this.socket.isConnected() && this.isJoined();
}
push(event, payload, timeout = this.timeout) {
payload = payload || {};
if (!this.joinedOnce) {
throw new Error(`tried to push '${event}' to '${this.topic}' before joining. Use channel.join() before pushing events`);
}
let pushEvent = new Push(this, event, function() {
return payload;
}, timeout);
if (this.canPush()) {
pushEvent.send();
} else {
pushEvent.startTimeout();
this.pushBuffer.push(pushEvent);
}
return pushEvent;
}
leave(timeout = this.timeout) {
this.rejoinTimer.reset();
this.joinPush.cancelTimeout();
this.state = CHANNEL_STATES.leaving;
let onClose = () => {
if (this.socket.hasLogger())
this.socket.log("channel", `leave ${this.topic}`);
this.trigger(CHANNEL_EVENTS.close, "leave");
};
let leavePush = new Push(this, CHANNEL_EVENTS.leave, closure({}), timeout);
leavePush.receive("ok", () => onClose()).receive("timeout", () => onClose());
leavePush.send();
if (!this.canPush()) {
leavePush.trigger("ok", {});
}
return leavePush;
}
onMessage(_event, payload, _ref) {
return payload;
}
isMember(topic, event, payload, joinRef) {
if (this.topic !== topic) {
return false;
}
if (joinRef && joinRef !== this.joinRef()) {
if (this.socket.hasLogger())
this.socket.log("channel", "dropping outdated message", { topic, event, payload, joinRef });
return false;
} else {
return true;
}
}
joinRef() {
return this.joinPush.ref;
}
rejoin(timeout = this.timeout) {
if (this.isLeaving()) {
return;
}
this.socket.leaveOpenTopic(this.topic);
this.state = CHANNEL_STATES.joining;
this.joinPush.resend(timeout);
}
trigger(event, payload, ref, joinRef) {
let handledPayload = this.onMessage(event, payload, ref, joinRef);
if (payload && !handledPayload) {
throw new Error("channel onMessage callbacks must return the payload, modified or unmodified");
}
let eventBindings = this.bindings.filter((bind) => bind.event === event);
for (let i = 0; i < eventBindings.length; i++) {
let bind = eventBindings[i];
bind.callback(handledPayload, ref, joinRef || this.joinRef());
}
}
replyEventName(ref) {
return `chan_reply_${ref}`;
}
isClosed() {
return this.state === CHANNEL_STATES.closed;
}
isErrored() {
return this.state === CHANNEL_STATES.errored;
}
isJoined() {
return this.state === CHANNEL_STATES.joined;
}
isJoining() {
return this.state === CHANNEL_STATES.joining;
}
isLeaving() {
return this.state === CHANNEL_STATES.leaving;
}
};
var Ajax = class {
static request(method, endPoint, accept, body, timeout, ontimeout, callback) {
if (global2.XDomainRequest) {
let req = new global2.XDomainRequest();
this.xdomainRequest(req, method, endPoint, body, timeout, ontimeout, callback);
} else {
let req = new global2.XMLHttpRequest();
this.xhrRequest(req, method, endPoint, accept, body, timeout, ontimeout, callback);
}
}
static xdomainRequest(req, method, endPoint, body, timeout, ontimeout, callback) {
req.timeout = timeout;
req.open(method, endPoint);
req.onload = () => {
let response = this.parseJSON(req.responseText);
callback && callback(response);
};
if (ontimeout) {
req.ontimeout = ontimeout;
}
req.onprogress = () => {
};
req.send(body);
}
static xhrRequest(req, method, endPoint, accept, body, timeout, ontimeout, callback) {
req.open(method, endPoint, true);
req.timeout = timeout;
req.setRequestHeader("Content-Type", accept);
req.onerror = () => {
callback && callback(null);
};
req.onreadystatechange = () => {
if (req.readyState === XHR_STATES.complete && callback) {
let response = this.parseJSON(req.responseText);
callback(response);
}
};
if (ontimeout) {
req.ontimeout = ontimeout;
}
req.send(body);
}
static parseJSON(resp) {
if (!resp || resp === "") {
return null;
}
try {
return JSON.parse(resp);
} catch (e) {
console && console.log("failed to parse JSON response", resp);
return null;
}
}
static serialize(obj, parentKey) {
let queryStr = [];
for (var key in obj) {
if (!Object.prototype.hasOwnProperty.call(obj, key)) {
continue;
}
let paramKey = parentKey ? `${parentKey}[${key}]` : key;
let paramVal = obj[key];
if (typeof paramVal === "object") {
queryStr.push(this.serialize(paramVal, paramKey));
} else {
queryStr.push(encodeURIComponent(paramKey) + "=" + encodeURIComponent(paramVal));
}
}
return queryStr.join("&");
}
static appendParams(url, params) {
if (Object.keys(params).length === 0) {
return url;
}
let prefix = url.match(/\?/) ? "&" : "?";
return `${url}${prefix}${this.serialize(params)}`;
}
};
var LongPoll = class {
constructor(endPoint) {
this.endPoint = null;
this.token = null;
this.skipHeartbeat = true;
this.onopen = function() {
};
this.onerror = function() {
};
this.onmessage = function() {
};
this.onclose = function() {
};
this.pollEndpoint = this.normalizeEndpoint(endPoint);
this.readyState = SOCKET_STATES.connecting;
this.poll();
}
normalizeEndpoint(endPoint) {
return endPoint.replace("ws://", "http://").replace("wss://", "https://").replace(new RegExp("(.*)/" + TRANSPORTS.websocket), "$1/" + TRANSPORTS.longpoll);
}
endpointURL() {
return Ajax.appendParams(this.pollEndpoint, { token: this.token });
}
closeAndRetry() {
this.close();
this.readyState = SOCKET_STATES.connecting;
}
ontimeout() {
this.onerror("timeout");
this.closeAndRetry();
}
poll() {
if (!(this.readyState === SOCKET_STATES.open || this.readyState === SOCKET_STATES.connecting)) {
return;
}
Ajax.request("GET", this.endpointURL(), "application/json", null, this.timeout, this.ontimeout.bind(this), (resp) => {
if (resp) {
var { status, token, messages } = resp;
this.token = token;
} else {
status = 0;
}
switch (status) {
case 200:
messages.forEach((msg) => {
setTimeout(() => {
this.onmessage({ data: msg });
}, 0);
});
this.poll();
break;
case 204:
this.poll();
break;
case 410:
this.readyState = SOCKET_STATES.open;
this.onopen();
this.poll();
break;
case 403:
this.onerror();
this.close();
break;
case 0:
case 500:
this.onerror();
this.closeAndRetry();
break;
default:
throw new Error(`unhandled poll status ${status}`);
}
});
}
send(body) {
Ajax.request("POST", this.endpointURL(), "application/json", body, this.timeout, this.onerror.bind(this, "timeout"), (resp) => {
if (!resp || resp.status !== 200) {
this.onerror(resp && resp.status);
this.closeAndRetry();
}
});
}
close(_code, _reason) {
this.readyState = SOCKET_STATES.closed;
this.onclose();
}
};
var serializer_default = {
HEADER_LENGTH: 1,
META_LENGTH: 4,
KINDS: { push: 0, reply: 1, broadcast: 2 },
encode(msg, callback) {
if (msg.payload.constructor === ArrayBuffer) {
return callback(this.binaryEncode(msg));
} else {
let payload = [msg.join_ref, msg.ref, msg.topic, msg.event, msg.payload];
return callback(JSON.stringify(payload));
}
},
decode(rawPayload, callback) {
if (rawPayload.constructor === ArrayBuffer) {
return callback(this.binaryDecode(rawPayload));
} else {
let [join_ref, ref, topic, event, payload] = JSON.parse(rawPayload);
return callback({ join_ref, ref, topic, event, payload });
}
},
binaryEncode(message) {
let { join_ref, ref, event, topic, payload } = message;
let metaLength = this.META_LENGTH + join_ref.length + ref.length + topic.length + event.length;
let header = new ArrayBuffer(this.HEADER_LENGTH + metaLength);
let view = new DataView(header);
let offset2 = 0;
view.setUint8(offset2++, this.KINDS.push);
view.setUint8(offset2++, join_ref.length);
view.setUint8(offset2++, ref.length);
view.setUint8(offset2++, topic.length);
view.setUint8(offset2++, event.length);
Array.from(join_ref, (char) => view.setUint8(offset2++, char.charCodeAt(0)));
Array.from(ref, (char) => view.setUint8(offset2++, char.charCodeAt(0)));
Array.from(topic, (char) => view.setUint8(offset2++, char.charCodeAt(0)));
Array.from(event, (char) => view.setUint8(offset2++, char.charCodeAt(0)));
var combined = new Uint8Array(header.byteLength + payload.byteLength);
combined.set(new Uint8Array(header), 0);
combined.set(new Uint8Array(payload), header.byteLength);
return combined.buffer;
},
binaryDecode(buffer) {
let view = new DataView(buffer);
let kind = view.getUint8(0);
let decoder = new TextDecoder();
switch (kind) {
case this.KINDS.push:
return this.decodePush(buffer, view, decoder);
case this.KINDS.reply:
return this.decodeReply(buffer, view, decoder);
case this.KINDS.broadcast:
return this.decodeBroadcast(buffer, view, decoder);
}
},
decodePush(buffer, view, decoder) {
let joinRefSize = view.getUint8(1);
let topicSize = view.getUint8(2);
let eventSize = view.getUint8(3);
let offset2 = this.HEADER_LENGTH + this.META_LENGTH - 1;
let joinRef = decoder.decode(buffer.slice(offset2, offset2 + joinRefSize));
offset2 = offset2 + joinRefSize;
let topic = decoder.decode(buffer.slice(offset2, offset2 + topicSize));
offset2 = offset2 + topicSize;
let event = decoder.decode(buffer.slice(offset2, offset2 + eventSize));
offset2 = offset2 + eventSize;
let data = buffer.slice(offset2, buffer.byteLength);
return { join_ref: joinRef, ref: null, topic, event, payload: data };
},
decodeReply(buffer, view, decoder) {
let joinRefSize = view.getUint8(1);
let refSize = view.getUint8(2);
let topicSize = view.getUint8(3);
let eventSize = view.getUint8(4);
let offset2 = this.HEADER_LENGTH + this.META_LENGTH;
let joinRef = decoder.decode(buffer.slice(offset2, offset2 + joinRefSize));
offset2 = offset2 + joinRefSize;
let ref = decoder.decode(buffer.slice(offset2, offset2 + refSize));
offset2 = offset2 + refSize;
let topic = decoder.decode(buffer.slice(offset2, offset2 + topicSize));
offset2 = offset2 + topicSize;
let event = decoder.decode(buffer.slice(offset2, offset2 + eventSize));
offset2 = offset2 + eventSize;
let data = buffer.slice(offset2, buffer.byteLength);
let payload = { status: event, response: data };
return { join_ref: joinRef, ref, topic, event: CHANNEL_EVENTS.reply, payload };
},
decodeBroadcast(buffer, view, decoder) {
let topicSize = view.getUint8(1);
let eventSize = view.getUint8(2);
let offset2 = this.HEADER_LENGTH + 2;
let topic = decoder.decode(buffer.slice(offset2, offset2 + topicSize));
offset2 = offset2 + topicSize;
let event = decoder.decode(buffer.slice(offset2, offset2 + eventSize));
offset2 = offset2 + eventSize;
let data = buffer.slice(offset2, buffer.byteLength);
return { join_ref: null, ref: null, topic, event, payload: data };
}
};
var Socket = class {
constructor(endPoint, opts = {}) {
this.stateChangeCallbacks = { open: [], close: [], error: [], message: [] };
this.channels = [];
this.sendBuffer = [];
this.ref = 0;
this.timeout = opts.timeout || DEFAULT_TIMEOUT;
this.transport = opts.transport || global2.WebSocket || LongPoll;
this.establishedConnections = 0;
this.defaultEncoder = serializer_default.encode.bind(serializer_default);
this.defaultDecoder = serializer_default.decode.bind(serializer_default);
this.closeWasClean = false;
this.binaryType = opts.binaryType || "arraybuffer";
this.connectClock = 1;
if (this.transport !== LongPoll) {
this.encode = opts.encode || this.defaultEncoder;
this.decode = opts.decode || this.defaultDecoder;
} else {
this.encode = this.defaultEncoder;
this.decode = this.defaultDecoder;
}
let awaitingConnectionOnPageShow = null;
if (phxWindow && phxWindow.addEventListener) {
phxWindow.addEventListener("pagehide", (_e) => {
if (this.conn) {
this.disconnect();
awaitingConnectionOnPageShow = this.connectClock;
}
});
phxWindow.addEventListener("pageshow", (_e) => {
if (awaitingConnectionOnPageShow === this.connectClock) {
awaitingConnectionOnPageShow = null;
this.connect();
}
});
}
this.heartbeatIntervalMs = opts.heartbeatIntervalMs || 3e4;
this.rejoinAfterMs = (tries) => {
if (opts.rejoinAfterMs) {
return opts.rejoinAfterMs(tries);
} else {
return [1e3, 2e3, 5e3][tries - 1] || 1e4;
}
};
this.reconnectAfterMs = (tries) => {
if (opts.reconnectAfterMs) {
return opts.reconnectAfterMs(tries);
} else {
return [10, 50, 100, 150, 200, 250, 500, 1e3, 2e3][tries - 1] || 5e3;
}
};
this.logger = opts.logger || null;
this.longpollerTimeout = opts.longpollerTimeout || 2e4;
this.params = closure(opts.params || {});
this.endPoint = `${endPoint}/${TRANSPORTS.websocket}`;
this.vsn = opts.vsn || DEFAULT_VSN;
this.heartbeatTimer = null;
this.pendingHeartbeatRef = null;
this.reconnectTimer = new Timer(() => {
this.teardown(() => this.connect());
}, this.reconnectAfterMs);
}
replaceTransport(newTransport) {
this.disconnect();
this.transport = newTransport;
}
protocol() {
return location.protocol.match(/^https/) ? "wss" : "ws";
}
endPointURL() {
let uri = Ajax.appendParams(Ajax.appendParams(this.endPoint, this.params()), { vsn: this.vsn });
if (uri.charAt(0) !== "/") {
return uri;
}
if (uri.charAt(1) === "/") {
return `${this.protocol()}:${uri}`;
}
return `${this.protocol()}://${location.host}${uri}`;
}
disconnect(callback, code, reason) {
this.connectClock++;
this.closeWasClean = true;
this.reconnectTimer.reset();
this.teardown(callback, code, reason);
}
connect(params) {
this.connectClock++;
if (params) {
console && console.log("passing params to connect is deprecated. Instead pass :params to the Socket constructor");
this.params = closure(params);
}
if (this.conn) {
return;
}
this.closeWasClean = false;
this.conn = new this.transport(this.endPointURL());
this.conn.binaryType = this.binaryType;
this.conn.timeout = this.longpollerTimeout;
this.conn.onopen = () => this.onConnOpen();
this.conn.onerror = (error) => this.onConnError(error);
this.conn.onmessage = (event) => this.onConnMessage(event);
this.conn.onclose = (event) => this.onConnClose(event);
}
log(kind, msg, data) {
this.logger(kind, msg, data);
}
hasLogger() {
return this.logger !== null;
}
onOpen(callback) {
let ref = this.makeRef();
this.stateChangeCallbacks.open.push([ref, callback]);
return ref;
}
onClose(callback) {
let ref = this.makeRef();
this.stateChangeCallbacks.close.push([ref, callback]);
return ref;
}
onError(callback) {
let ref = this.makeRef();
this.stateChangeCallbacks.error.push([ref, callback]);
return ref;
}
onMessage(callback) {
let ref = this.makeRef();
this.stateChangeCallbacks.message.push([ref, callback]);
return ref;
}
onConnOpen() {
if (this.hasLogger())
this.log("transport", `connected to ${this.endPointURL()}`);
this.closeWasClean = false;
this.establishedConnections++;
this.flushSendBuffer();
this.reconnectTimer.reset();
this.resetHeartbeat();
this.stateChangeCallbacks.open.forEach(([, callback]) => callback());
}
heartbeatTimeout() {
if (this.pendingHeartbeatRef) {
this.pendingHeartbeatRef = null;
if (this.hasLogger()) {
this.log("transport", "heartbeat timeout. Attempting to re-establish connection");
}
this.abnormalClose("heartbeat timeout");
}
}
resetHeartbeat() {
if (this.conn && this.conn.skipHeartbeat) {
return;
}
this.pendingHeartbeatRef = null;
clearTimeout(this.heartbeatTimer);
setTimeout(() => this.sendHeartbeat(), this.heartbeatIntervalMs);
}
teardown(callback, code, reason) {
if (!this.conn) {
return callback && callback();
}
this.waitForBufferDone(() => {
if (this.conn) {
if (code) {
this.conn.close(code, reason || "");
} else {
this.conn.close();
}
}
this.waitForSocketClosed(() => {
if (this.conn) {
this.conn.onclose = function() {
};
this.conn = null;
}
callback && callback();
});
});
}
waitForBufferDone(callback, tries = 1) {
if (tries === 5 || !this.conn || !this.conn.bufferedAmount) {
callback();
return;
}
setTimeout(() => {
this.waitForBufferDone(callback, tries + 1);
}, 150 * tries);
}
waitForSocketClosed(callback, tries = 1) {
if (tries === 5 || !this.conn || this.conn.readyState === SOCKET_STATES.closed) {
callback();
return;
}
setTimeout(() => {
this.waitForSocketClosed(callback, tries + 1);
}, 150 * tries);
}
onConnClose(event) {
let closeCode = event && event.code;
if (this.hasLogger())
this.log("transport", "close", event);
this.triggerChanError();
clearTimeout(this.heartbeatTimer);
if (!this.closeWasClean && closeCode !== 1e3) {
this.reconnectTimer.scheduleTimeout();
}
this.stateChangeCallbacks.close.forEach(([, callback]) => callback(event));
}
onConnError(error) {
if (this.hasLogger())
this.log("transport", error);
let transportBefore = this.transport;
let establishedBefore = this.establishedConnections;
this.stateChangeCallbacks.error.forEach(([, callback]) => {
callback(error, transportBefore, establishedBefore);
});
if (transportBefore === this.transport || establishedBefore > 0) {
this.triggerChanError();
}
}
triggerChanError() {
this.channels.forEach((channel) => {
if (!(channel.isErrored() || channel.isLeaving() || channel.isClosed())) {
channel.trigger(CHANNEL_EVENTS.error);
}
});
}
connectionState() {
switch (this.conn && this.conn.readyState) {
case SOCKET_STATES.connecting:
return "connecting";
case SOCKET_STATES.open:
return "open";
case SOCKET_STATES.closing:
return "closing";
default:
return "closed";
}
}
isConnected() {
return this.connectionState() === "open";
}
remove(channel) {
this.off(channel.stateChangeRefs);
this.channels = this.channels.filter((c) => c.joinRef() !== channel.joinRef());
}
off(refs) {
for (let key in this.stateChangeCallbacks) {
this.stateChangeCallbacks[key] = this.stateChangeCallbacks[key].filter(([ref]) => {
return refs.indexOf(ref) === -1;
});
}
}
channel(topic, chanParams = {}) {
let chan = new Channel(topic, chanParams, this);
this.channels.push(chan);
return chan;
}
push(data) {
if (this.hasLogger()) {
let { topic, event, payload, ref, join_ref } = data;
this.log("push", `${topic} ${event} (${join_ref}, ${ref})`, payload);
}
if (this.isConnected()) {
this.encode(data, (result) => this.conn.send(result));
} else {
this.sendBuffer.push(() => this.encode(data, (result) => this.conn.send(result)));
}
}
makeRef() {
let newRef = this.ref + 1;
if (newRef === this.ref) {
this.ref = 0;
} else {
this.ref = newRef;
}
return this.ref.toString();
}
sendHeartbeat() {
if (this.pendingHeartbeatRef && !this.isConnected()) {
return;
}
this.pendingHeartbeatRef = this.makeRef();
this.push({ topic: "phoenix", event: "heartbeat", payload: {}, ref: this.pendingHeartbeatRef });
this.heartbeatTimer = setTimeout(() => this.heartbeatTimeout(), this.heartbeatIntervalMs);
}
abnormalClose(reason) {
this.closeWasClean = false;
if (this.isConnected()) {
this.conn.close(WS_CLOSE_NORMAL, reason);
}
}
flushSendBuffer() {
if (this.isConnected() && this.sendBuffer.length > 0) {
this.sendBuffer.forEach((callback) => callback());
this.sendBuffer = [];
}
}
onConnMessage(rawMessage) {
this.decode(rawMessage.data, (msg) => {
let { topic, event, payload, ref, join_ref } = msg;
if (ref && ref === this.pendingHeartbeatRef) {
clearTimeout(this.heartbeatTimer);
this.pendingHeartbeatRef = null;
setTimeout(() => this.sendHeartbeat(), this.heartbeatIntervalMs);
}
if (this.hasLogger())
this.log("receive", `${payload.status || ""} ${topic} ${event} ${ref && "(" + ref + ")" || ""}`, payload);
for (let i = 0; i < this.channels.length; i++) {
const channel = this.channels[i];
if (!channel.isMember(topic, event, payload, join_ref)) {
continue;
}
channel.trigger(event, payload, ref, join_ref);
}
for (let i = 0; i < this.stateChangeCallbacks.message.length; i++) {
let [, callback] = this.stateChangeCallbacks.message[i];
callback(msg);
}
});
}
leaveOpenTopic(topic) {
let dupChannel = this.channels.find((c) => c.topic === topic && (c.isJoined() || c.isJoining()));
if (dupChannel) {
if (this.hasLogger())
this.log("transport", `leaving duplicate topic "${topic}"`);
dupChannel.leave();
}
}
};
// ../deps/phoenix_live_view/priv/static/phoenix_live_view.esm.js
var CONSECUTIVE_RELOADS = "consecutive-reloads";
var MAX_RELOADS = 10;
var RELOAD_JITTER_MIN = 1e3;
var RELOAD_JITTER_MAX = 3e3;
var FAILSAFE_JITTER = 3e4;
var PHX_EVENT_CLASSES = [
"phx-click-loading",
"phx-change-loading",
"phx-submit-loading",
"phx-keydown-loading",
"phx-keyup-loading",
"phx-blur-loading",
"phx-focus-loading"
];
var PHX_COMPONENT = "data-phx-component";
var PHX_LIVE_LINK = "data-phx-link";
var PHX_TRACK_STATIC = "track-static";
var PHX_LINK_STATE = "data-phx-link-state";
var PHX_REF = "data-phx-ref";
var PHX_REF_SRC = "data-phx-ref-src";
var PHX_TRACK_UPLOADS = "track-uploads";
var PHX_UPLOAD_REF = "data-phx-upload-ref";
var PHX_PREFLIGHTED_REFS = "data-phx-preflighted-refs";
var PHX_DONE_REFS = "data-phx-done-refs";
var PHX_DROP_TARGET = "drop-target";
var PHX_ACTIVE_ENTRY_REFS = "data-phx-active-refs";
var PHX_LIVE_FILE_UPDATED = "phx:live-file:updated";
var PHX_SKIP = "data-phx-skip";
var PHX_PRUNE = "data-phx-prune";
var PHX_PAGE_LOADING = "page-loading";
var PHX_CONNECTED_CLASS = "phx-connected";
var PHX_DISCONNECTED_CLASS = "phx-loading";
var PHX_NO_FEEDBACK_CLASS = "phx-no-feedback";
var PHX_ERROR_CLASS = "phx-error";
var PHX_PARENT_ID = "data-phx-parent-id";
var PHX_MAIN = "data-phx-main";
var PHX_ROOT_ID = "data-phx-root-id";
var PHX_TRIGGER_ACTION = "trigger-action";
var PHX_FEEDBACK_FOR = "feedback-for";
var PHX_HAS_FOCUSED = "phx-has-focused";
var FOCUSABLE_INPUTS = ["text", "textarea", "number", "email", "password", "search", "tel", "url", "date", "time", "datetime-local", "color", "range"];
var CHECKABLE_INPUTS = ["checkbox", "radio"];
var PHX_HAS_SUBMITTED = "phx-has-submitted";
var PHX_SESSION = "data-phx-session";
var PHX_VIEW_SELECTOR = `[${PHX_SESSION}]`;
var PHX_STICKY = "data-phx-sticky";
var PHX_STATIC = "data-phx-static";
var PHX_READONLY = "data-phx-readonly";
var PHX_DISABLED = "data-phx-disabled";
var PHX_DISABLE_WITH = "disable-with";
var PHX_DISABLE_WITH_RESTORE = "data-phx-disable-with-restore";
var PHX_HOOK = "hook";
var PHX_DEBOUNCE = "debounce";
var PHX_THROTTLE = "throttle";
var PHX_UPDATE = "update";
var PHX_KEY = "key";
var PHX_PRIVATE = "phxPrivate";
var PHX_AUTO_RECOVER = "auto-recover";
var PHX_LV_DEBUG = "phx:live-socket:debug";
var PHX_LV_PROFILE = "phx:live-socket:profiling";
var PHX_LV_LATENCY_SIM = "phx:live-socket:latency-sim";
var PHX_PROGRESS = "progress";
var LOADER_TIMEOUT = 1;
var BEFORE_UNLOAD_LOADER_TIMEOUT = 200;
var BINDING_PREFIX = "phx-";
var PUSH_TIMEOUT = 3e4;
var DEBOUNCE_TRIGGER = "debounce-trigger";
var THROTTLED = "throttled";
var DEBOUNCE_PREV_KEY = "debounce-prev-key";
var DEFAULTS = {
debounce: 300,
throttle: 300
};
var DYNAMICS = "d";
var STATIC = "s";
var COMPONENTS = "c";
var EVENTS = "e";
var REPLY = "r";
var TITLE = "t";
var TEMPLATES = "p";
var EntryUploader = class {
constructor(entry, chunkSize, liveSocket2) {
this.liveSocket = liveSocket2;
this.entry = entry;
this.offset = 0;
this.chunkSize = chunkSize;
this.chunkTimer = null;
this.uploadChannel = liveSocket2.channel(`lvu:${entry.ref}`, { token: entry.metadata() });
}
error(reason) {
clearTimeout(this.chunkTimer);
this.uploadChannel.leave();
this.entry.error(reason);
}
upload() {
this.uploadChannel.onError((reason) => this.error(reason));
this.uploadChannel.join().receive("ok", (_data) => this.readNextChunk()).receive("error", (reason) => this.error(reason));
}
isDone() {
return this.offset >= this.entry.file.size;
}
readNextChunk() {
let reader = new window.FileReader();
let blob = this.entry.file.slice(this.offset, this.chunkSize + this.offset);
reader.onload = (e) => {
if (e.target.error === null) {
this.offset += e.target.result.byteLength;
this.pushChunk(e.target.result);
} else {
return logError("Read error: " + e.target.error);
}
};
reader.readAsArrayBuffer(blob);
}
pushChunk(chunk) {
if (!this.uploadChannel.isJoined()) {
return;
}
this.uploadChannel.push("chunk", chunk).receive("ok", () => {
this.entry.progress(this.offset / this.entry.file.size * 100);
if (!this.isDone()) {
this.chunkTimer = setTimeout(() => this.readNextChunk(), this.liveSocket.getLatencySim() || 0);
}
});
}
};
var logError = (msg, obj) => console.error && console.error(msg, obj);
var isCid = (cid) => {
let type = typeof cid;
return type === "number" || type === "string" && /^(0|[1-9]\d*)$/.test(cid);
};
function detectDuplicateIds() {
let ids = /* @__PURE__ */ new Set();
let elems = document.querySelectorAll("*[id]");
for (let i = 0, len = elems.length; i < len; i++) {
if (ids.has(elems[i].id)) {
console.error(`Multiple IDs detected: ${elems[i].id}. Ensure unique element ids.`);
} else {
ids.add(elems[i].id);
}
}
}
var debug = (view, kind, msg, obj) => {
if (view.liveSocket.isDebugEnabled()) {
console.log(`${view.id} ${kind}: ${msg} - `, obj);
}
};
var closure2 = (val) => typeof val === "function" ? val : function() {
return val;
};
var clone = (obj) => {
return JSON.parse(JSON.stringify(obj));
};
var closestPhxBinding = (el, binding, borderEl) => {
do {
if (el.matches(`[${binding}]`)) {
return el;
}
el = el.parentElement || el.parentNode;
} while (el !== null && el.nodeType === 1 && !(borderEl && borderEl.isSameNode(el) || el.matches(PHX_VIEW_SELECTOR)));
return null;
};
var isObject = (obj) => {
return obj !== null && typeof obj === "object" && !(obj instanceof Array);
};
var isEqualObj = (obj1, obj2) => JSON.stringify(obj1) === JSON.stringify(obj2);
var isEmpty = (obj) => {
for (let x in obj) {
return false;
}
return true;
};
var maybe = (el, callback) => el && callback(el);
var channelUploader = function(entries, onError, resp, liveSocket2) {
entries.forEach((entry) => {
let entryUploader = new EntryUploader(entry, resp.config.chunk_size, liveSocket2);
entryUploader.upload();
});
};
var Browser = {
canPushState() {
return typeof history.pushState !== "undefined";
},
dropLocal(localStorage, namespace, subkey) {
return localStorage.removeItem(this.localKey(namespace, subkey));
},
updateLocal(localStorage, namespace, subkey, initial, func) {
let current = this.getLocal(localStorage, namespace, subkey);
let key = this.localKey(namespace, subkey);
let newVal = current === null ? initial : func(current);
localStorage.setItem(key, JSON.stringify(newVal));
return newVal;
},
getLocal(localStorage, namespace, subkey) {
return JSON.parse(localStorage.getItem(this.localKey(namespace, subkey)));
},
updateCurrentState(callback) {
if (!this.canPushState()) {
return;
}
history.replaceState(callback(history.state || {}), "", window.location.href);
},
pushState(kind, meta, to) {
if (this.canPushState()) {
if (to !== window.location.href) {
if (meta.type == "redirect" && meta.scroll) {
let currentState = history.state || {};
currentState.scroll = meta.scroll;
history.replaceState(currentState, "", window.location.href);
}
delete meta.scroll;
history[kind + "State"](meta, "", to || null);
let hashEl = this.getHashTargetEl(window.location.hash);
if (hashEl) {
hashEl.scrollIntoView();
} else if (meta.type === "redirect") {
window.scroll(0, 0);
}
}
} else {
this.redirect(to);
}
},
setCookie(name, value) {
document.cookie = `${name}=${value}`;
},
getCookie(name) {
return document.cookie.replace(new RegExp(`(?:(?:^|.*;s*)${name}s*=s*([^;]*).*$)|^.*$`), "$1");
},
redirect(toURL, flash) {
if (flash) {
Browser.setCookie("__phoenix_flash__", flash + "; max-age=60000; path=/");
}
window.location = toURL;
},
localKey(namespace, subkey) {
return `${namespace}-${subkey}`;
},
getHashTargetEl(maybeHash) {
let hash3 = maybeHash.toString().substring(1);
if (hash3 === "") {
return;
}
return document.getElementById(hash3) || document.querySelector(`a[name="${hash3}"]`);
}
};
var browser_default = Browser;
var DOM = {
byId(id) {
return document.getElementById(id) || logError(`no id found for ${id}`);
},
removeClass(el, className) {
el.classList.remove(className);
if (el.classList.length === 0) {
el.removeAttribute("class");
}
},
all(node, query, callback) {
if (!node) {
return [];
}
let array = Array.from(node.querySelectorAll(query));
return callback ? array.forEach(callback) : array;
},
childNodeLength(html) {
let template = document.createElement("template");
template.innerHTML = html;
return template.content.childElementCount;
},
isUploadInput(el) {
return el.type === "file" && el.getAttribute(PHX_UPLOAD_REF) !== null;
},
findUploadInputs(node) {
return this.all(node, `input[type="file"][${PHX_UPLOAD_REF}]`);
},
findComponentNodeList(node, cid) {
return this.filterWithinSameLiveView(this.all(node, `[${PHX_COMPONENT}="${cid}"]`), node);
},
isPhxDestroyed(node) {
return node.id && DOM.private(node, "destroyed") ? true : false;
},
markPhxChildDestroyed(el) {
if (this.isPhxChild(el)) {
el.setAttribute(PHX_SESSION, "");
}
this.putPrivate(el, "destroyed", true);
},
findPhxChildrenInFragment(html, parentId) {
let template = document.createElement("template");
template.innerHTML = html;
return this.findPhxChildren(template.content, parentId);
},
isIgnored(el, phxUpdate) {
return (el.getAttribute(phxUpdate) || el.getAttribute("data-phx-update")) === "ignore";
},
isPhxUpdate(el, phxUpdate, updateTypes) {
return el.getAttribute && updateTypes.indexOf(el.getAttribute(phxUpdate)) >= 0;
},
findPhxSticky(el) {
return this.all(el, `[${PHX_STICKY}]`);
},
findPhxChildren(el, parentId) {
return this.all(el, `${PHX_VIEW_SELECTOR}[${PHX_PARENT_ID}="${parentId}"]`);
},
findParentCIDs(node, cids) {
let initial = new Set(cids);
return cids.reduce((acc, cid) => {
let selector = `[${PHX_COMPONENT}="${cid}"] [${PHX_COMPONENT}]`;
this.filterWithinSameLiveView(this.all(node, selector), node).map((el) => parseInt(el.getAttribute(PHX_COMPONENT))).forEach((childCID) => acc.delete(childCID));
return acc;
}, initial);
},
filterWithinSameLiveView(nodes, parent) {
if (parent.querySelector(PHX_VIEW_SELECTOR)) {
return nodes.filter((el) => this.withinSameLiveView(el, parent));
} else {
return nodes;
}
},
withinSameLiveView(node, parent) {
while (node = node.parentNode) {
if (node.isSameNode(parent)) {
return true;
}
if (node.getAttribute(PHX_SESSION) !== null) {
return false;
}
}
},
private(el, key) {
return el[PHX_PRIVATE] && el[PHX_PRIVATE][key];
},
deletePrivate(el, key) {
el[PHX_PRIVATE] && delete el[PHX_PRIVATE][key];
},
putPrivate(el, key, value) {
if (!el[PHX_PRIVATE]) {
el[PHX_PRIVATE] = {};
}
el[PHX_PRIVATE][key] = value;
},
updatePrivate(el, key, defaultVal, updateFunc) {
let existing = this.private(el, key);
if (existing === void 0) {
this.putPrivate(el, key, updateFunc(defaultVal));
} else {
this.putPrivate(el, key, updateFunc(existing));
}
},
copyPrivates(target, source) {
if (source[PHX_PRIVATE]) {
target[PHX_PRIVATE] = source[PHX_PRIVATE];
}
},
putTitle(str) {
let titleEl = document.querySelector("title");
let { prefix, suffix } = titleEl.dataset;
document.title = `${prefix || ""}${str}${suffix || ""}`;
},
debounce(el, event, phxDebounce, defaultDebounce, phxThrottle, defaultThrottle, callback) {
let debounce2 = el.getAttribute(phxDebounce);
let throttle = el.getAttribute(phxThrottle);
if (debounce2 === "") {
debounce2 = defaultDebounce;
}
if (throttle === "") {
throttle = defaultThrottle;
}
let value = debounce2 || throttle;
switch (value) {
case null:
return callback();
case "blur":
if (this.once(el, "debounce-blur")) {
el.addEventListener("blur", () => callback());
}
return;
default:
let timeout = parseInt(value);
let trigger = () => throttle ? this.deletePrivate(el, THROTTLED) : callback();
let currentCycle = this.incCycle(el, DEBOUNCE_TRIGGER, trigger);
if (isNaN(timeout)) {
return logError(`invalid throttle/debounce value: ${value}`);
}
if (throttle) {
let newKeyDown = false;
if (event.type === "keydown") {
let prevKey = this.private(el, DEBOUNCE_PREV_KEY);
this.putPrivate(el, DEBOUNCE_PREV_KEY, event.key);
newKeyDown = prevKey !== event.key;
}
if (!newKeyDown && this.private(el, THROTTLED)) {
return false;
} else {
callback();
this.putPrivate(el, THROTTLED, true);
setTimeout(() => this.triggerCycle(el, DEBOUNCE_TRIGGER), timeout);
}
} else {
setTimeout(() => this.triggerCycle(el, DEBOUNCE_TRIGGER, currentCycle), timeout);
}
let form = el.form;
if (form && this.once(form, "bind-debounce")) {
form.addEventListener("submit", () => {
Array.from(new FormData(form).entries(), ([name]) => {
let input = form.querySelector(`[name="${name}"]`);
this.incCycle(input, DEBOUNCE_TRIGGER);
this.deletePrivate(input, THROTTLED);
});
});
}
if (this.once(el, "bind-debounce")) {
el.addEventListener("blur", () => this.triggerCycle(el, DEBOUNCE_TRIGGER));
}
}
},
triggerCycle(el, key, currentCycle) {
let [cycle, trigger] = this.private(el, key);
if (!currentCycle) {
currentCycle = cycle;
}
if (currentCycle === cycle) {
this.incCycle(el, key);
trigger();
}
},
once(el, key) {
if (this.private(el, key) === true) {
return false;
}
this.putPrivate(el, key, true);
return true;
},
incCycle(el, key, trigger = function() {
}) {
let [currentCycle] = this.private(el, key) || [0, trigger];
currentCycle++;
this.putPrivate(el, key, [currentCycle, trigger]);
return currentCycle;
},
discardError(container, el, phxFeedbackFor) {
let field = el.getAttribute && el.getAttribute(phxFeedbackFor);
let input = field && container.querySelector(`[id="${field}"], [name="${field}"]`);
if (!input) {
return;
}
if (!(this.private(input, PHX_HAS_FOCUSED) || this.private(input.form, PHX_HAS_SUBMITTED))) {
el.classList.add(PHX_NO_FEEDBACK_CLASS);
}
},
showError(inputEl, phxFeedbackFor) {
if (inputEl.id || inputEl.name) {
this.all(inputEl.form, `[${phxFeedbackFor}="${inputEl.id}"], [${phxFeedbackFor}="${inputEl.name}"]`, (el) => {
this.removeClass(el, PHX_NO_FEEDBACK_CLASS);
});
}
},
isPhxChild(node) {
return node.getAttribute && node.getAttribute(PHX_PARENT_ID);
},
isPhxSticky(node) {
return node.getAttribute && node.getAttribute(PHX_STICKY) !== null;
},
firstPhxChild(el) {
return this.isPhxChild(el) ? el : this.all(el, `[${PHX_PARENT_ID}]`)[0];
},
dispatchEvent(target, eventString, detail = {}) {
let event = new CustomEvent(eventString, { bubbles: true, cancelable: true, detail });
target.dispatchEvent(event);
},
cloneNode(node, html) {
if (typeof html === "undefined") {
return node.cloneNode(true);
} else {
let cloned = node.cloneNode(false);
cloned.innerHTML = html;
return cloned;
}
},
mergeAttrs(target, source, opts = {}) {
let exclude = opts.exclude || [];
let isIgnored = opts.isIgnored;
let sourceAttrs = source.attributes;
for (let i = sourceAttrs.length - 1; i >= 0; i--) {
let name = sourceAttrs[i].name;
if (exclude.indexOf(name) < 0) {
target.setAttribute(name, source.getAttribute(name));
}
}
let targetAttrs = target.attributes;
for (let i = targetAttrs.length - 1; i >= 0; i--) {
let name = targetAttrs[i].name;
if (isIgnored) {
if (name.startsWith("data-") && !source.hasAttribute(name)) {
target.removeAttribute(name);
}
} else {
if (!source.hasAttribute(name)) {
target.removeAttribute(name);
}
}
}
},
mergeFocusedInput(target, source) {
if (!(target instanceof HTMLSelectElement)) {
DOM.mergeAttrs(target, source, { except: ["value"] });
}
if (source.readOnly) {
target.setAttribute("readonly", true);
} else {
target.removeAttribute("readonly");
}
},
hasSelectionRange(el) {
return el.setSelectionRange && (el.type === "text" || el.type === "textarea");
},
restoreFocus(focused, selectionStart, selectionEnd) {
if (!DOM.isTextualInput(focused)) {
return;
}
let wasFocused = focused.matches(":focus");
if (focused.readOnly) {
focused.blur();
}
if (!wasFocused) {
focused.focus();
}
if (this.hasSelectionRange(focused)) {
focused.setSelectionRange(selectionStart, selectionEnd);
}
},
isFormInput(el) {
return /^(?:input|select|textarea)$/i.test(el.tagName) && el.type !== "button";
},
syncAttrsToProps(el) {
if (el instanceof HTMLInputElement && CHECKABLE_INPUTS.indexOf(el.type.toLocaleLowerCase()) >= 0) {
el.checked = el.getAttribute("checked") !== null;
}
},
isTextualInput(el) {
return FOCUSABLE_INPUTS.indexOf(el.type) >= 0;
},
isNowTriggerFormExternal(el, phxTriggerExternal) {
return el.getAttribute && el.getAttribute(phxTriggerExternal) !== null;
},
syncPendingRef(fromEl, toEl, disableWith) {
let ref = fromEl.getAttribute(PHX_REF);
if (ref === null) {
return true;
}
let refSrc = fromEl.getAttribute(PHX_REF_SRC);
if (DOM.isFormInput(fromEl) || fromEl.getAttribute(disableWith) !== null) {
if (DOM.isUploadInput(fromEl)) {
DOM.mergeAttrs(fromEl, toEl, { isIgnored: true });
}
DOM.putPrivate(fromEl, PHX_REF, toEl);
return false;
} else {
PHX_EVENT_CLASSES.forEach((className) => {
fromEl.classList.contains(className) && toEl.classList.add(className);
});
toEl.setAttribute(PHX_REF, ref);
toEl.setAttribute(PHX_REF_SRC, refSrc);
return true;
}
},
cleanChildNodes(container, phxUpdate) {
if (DOM.isPhxUpdate(container, phxUpdate, ["append", "prepend"])) {
let toRemove = [];
container.childNodes.forEach((childNode) => {
if (!childNode.id) {
let isEmptyTextNode = childNode.nodeType === Node.TEXT_NODE && childNode.nodeValue.trim() === "";
if (!isEmptyTextNode) {
logError(`only HTML element tags with an id are allowed inside containers with phx-update.
removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}"
`);
}
toRemove.push(childNode);
}
});
toRemove.forEach((childNode) => childNode.remove());
}
},
replaceRootContainer(container, tagName, attrs) {
let retainedAttrs = /* @__PURE__ */ new Set(["id", PHX_SESSION, PHX_STATIC, PHX_MAIN, PHX_ROOT_ID]);
if (container.tagName.toLowerCase() === tagName.toLowerCase()) {
Array.from(container.attributes).filter((attr) => !retainedAttrs.has(attr.name.toLowerCase())).forEach((attr) => container.removeAttribute(attr.name));
Object.keys(attrs).filter((name) => !retainedAttrs.has(name.toLowerCase())).forEach((attr) => container.setAttribute(attr, attrs[attr]));
return container;
} else {
let newContainer = document.createElement(tagName);
Object.keys(attrs).forEach((attr) => newContainer.setAttribute(attr, attrs[attr]));
retainedAttrs.forEach((attr) => newContainer.setAttribute(attr, container.getAttribute(attr)));
newContainer.innerHTML = container.innerHTML;
container.replaceWith(newContainer);
return newContainer;
}
},
getSticky(el, name, defaultVal) {
let op = (DOM.private(el, "sticky") || []).find(([existingName]) => name === existingName);
if (op) {
let [_name, _op, stashedResult] = op;
return stashedResult;
} else {
return typeof defaultVal === "function" ? defaultVal() : defaultVal;
}
},
deleteSticky(el, name) {
this.updatePrivate(el, "sticky", [], (ops) => {
return ops.filter(([existingName, _]) => existingName !== name);
});
},
putSticky(el, name, op) {
let stashedResult = op(el);
this.updatePrivate(el, "sticky", [], (ops) => {
let existingIndex = ops.findIndex(([existingName]) => name === existingName);
if (existingIndex >= 0) {
ops[existingIndex] = [name, op, stashedResult];
} else {
ops.push([name, op, stashedResult]);
}
return ops;
});
},
applyStickyOperations(el) {
let ops = DOM.private(el, "sticky");
if (!ops) {
return;
}
ops.forEach(([name, op, _stashed]) => this.putSticky(el, name, op));
}
};
var dom_default = DOM;
var UploadEntry = class {
static isActive(fileEl, file) {
let isNew = file._phxRef === void 0;
let activeRefs = fileEl.getAttribute(PHX_ACTIVE_ENTRY_REFS).split(",");
let isActive = activeRefs.indexOf(LiveUploader.genFileRef(file)) >= 0;
return file.size > 0 && (isNew || isActive);
}
static isPreflighted(fileEl, file) {
let preflightedRefs = fileEl.getAttribute(PHX_PREFLIGHTED_REFS).split(",");
let isPreflighted = preflightedRefs.indexOf(LiveUploader.genFileRef(file)) >= 0;
return isPreflighted && this.isActive(fileEl, file);
}
constructor(fileEl, file, view) {
this.ref = LiveUploader.genFileRef(file);
this.fileEl = fileEl;
this.file = file;
this.view = view;
this.meta = null;
this._isCancelled = false;
this._isDone = false;
this._progress = 0;
this._lastProgressSent = -1;
this._onDone = function() {
};
this._onElUpdated = this.onElUpdated.bind(this);
this.fileEl.addEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated);
}
metadata() {
return this.meta;
}
progress(progress) {
this._progress = Math.floor(progress);
if (this._progress > this._lastProgressSent) {
if (this._progress >= 100) {
this._progress = 100;
this._lastProgressSent = 100;
this._isDone = true;
this.view.pushFileProgress(this.fileEl, this.ref, 100, () => {
LiveUploader.untrackFile(this.fileEl, this.file);
this._onDone();
});
} else {
this._lastProgressSent = this._progress;
this.view.pushFileProgress(this.fileEl, this.ref, this._progress);
}
}
}
cancel() {
this._isCancelled = true;
this._isDone = true;
this._onDone();
}
isDone() {
return this._isDone;
}
error(reason = "failed") {
this.view.pushFileProgress(this.fileEl, this.ref, { error: reason });
LiveUploader.clearFiles(this.fileEl);
}
onDone(callback) {
this._onDone = () => {
this.fileEl.removeEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated);
callback();
};
}
onElUpdated() {
let activeRefs = this.fileEl.getAttribute(PHX_ACTIVE_ENTRY_REFS).split(",");
if (activeRefs.indexOf(this.ref) === -1) {
this.cancel();
}
}
toPreflightPayload() {
return {
last_modified: this.file.lastModified,
name: this.file.name,
size: this.file.size,
type: this.file.type,
ref: this.ref
};
}
uploader(uploaders) {
if (this.meta.uploader) {
let callback = uploaders[this.meta.uploader] || logError(`no uploader configured for ${this.meta.uploader}`);
return { name: this.meta.uploader, callback };
} else {
return { name: "channel", callback: channelUploader };
}
}
zipPostFlight(resp) {
this.meta = resp.entries[this.ref];
if (!this.meta) {
logError(`no preflight upload response returned with ref ${this.ref}`, { input: this.fileEl, response: resp });
}
}
};
var liveUploaderFileRef = 0;
var LiveUploader = class {
static genFileRef(file) {
let ref = file._phxRef;
if (ref !== void 0) {
return ref;
} else {
file._phxRef = (liveUploaderFileRef++).toString();
return file._phxRef;
}
}
static getEntryDataURL(inputEl, ref, callback) {
let file = this.activeFiles(inputEl).find((file2) => this.genFileRef(file2) === ref);
callback(URL.createObjectURL(file));
}
static hasUploadsInProgress(formEl) {
let active = 0;
dom_default.findUploadInputs(formEl).forEach((input) => {
if (input.getAttribute(PHX_PREFLIGHTED_REFS) !== input.getAttribute(PHX_DONE_REFS)) {
active++;
}
});
return active > 0;
}
static serializeUploads(inputEl) {
let files = this.activeFiles(inputEl);
let fileData = {};
files.forEach((file) => {
let entry = { path: inputEl.name };
let uploadRef = inputEl.getAttribute(PHX_UPLOAD_REF);
fileData[uploadRef] = fileData[uploadRef] || [];
entry.ref = this.genFileRef(file);
entry.name = file.name || entry.ref;
entry.type = file.type;
entry.size = file.size;
fileData[uploadRef].push(entry);
});
return fileData;
}
static clearFiles(inputEl) {
inputEl.value = null;
inputEl.removeAttribute(PHX_UPLOAD_REF);
dom_default.putPrivate(inputEl, "files", []);
}
static untrackFile(inputEl, file) {
dom_default.putPrivate(inputEl, "files", dom_default.private(inputEl, "files").filter((f) => !Object.is(f, file)));
}
static trackFiles(inputEl, files) {
if (inputEl.getAttribute("multiple") !== null) {
let newFiles = files.filter((file) => !this.activeFiles(inputEl).find((f) => Object.is(f, file)));
dom_default.putPrivate(inputEl, "files", this.activeFiles(inputEl).concat(newFiles));
inputEl.value = null;
} else {
dom_default.putPrivate(inputEl, "files", files);
}
}
static activeFileInputs(formEl) {
let fileInputs = dom_default.findUploadInputs(formEl);
return Array.from(fileInputs).filter((el) => el.files && this.activeFiles(el).length > 0);
}
static activeFiles(input) {
return (dom_default.private(input, "files") || []).filter((f) => UploadEntry.isActive(input, f));
}
static inputsAwaitingPreflight(formEl) {
let fileInputs = dom_default.findUploadInputs(formEl);
return Array.from(fileInputs).filter((input) => this.filesAwaitingPreflight(input).length > 0);
}
static filesAwaitingPreflight(input) {
return this.activeFiles(input).filter((f) => !UploadEntry.isPreflighted(input, f));
}
constructor(inputEl, view, onComplete) {
this.view = view;
this.onComplete = onComplete;
this._entries = Array.from(LiveUploader.filesAwaitingPreflight(inputEl) || []).map((file) => new UploadEntry(inputEl, file, view));
this.numEntriesInProgress = this._entries.length;
}
entries() {
return this._entries;
}
initAdapterUpload(resp, onError, liveSocket2) {
this._entries = this._entries.map((entry) => {
entry.zipPostFlight(resp);
entry.onDone(() => {
this.numEntriesInProgress--;
if (this.numEntriesInProgress === 0) {
this.onComplete();
}
});
return entry;
});
let groupedEntries = this._entries.reduce((acc, entry) => {
let { name, callback } = entry.uploader(liveSocket2.uploaders);
acc[name] = acc[name] || { callback, entries: [] };
acc[name].entries.push(entry);
return acc;
}, {});
for (let name in groupedEntries) {
let { callback, entries } = groupedEntries[name];
callback(entries, onError, resp, liveSocket2);
}
}
};
var Hooks = {
LiveFileUpload: {
activeRefs() {
return this.el.getAttribute(PHX_ACTIVE_ENTRY_REFS);
},
preflightedRefs() {
return this.el.getAttribute(PHX_PREFLIGHTED_REFS);
},
mounted() {
this.preflightedWas = this.preflightedRefs();
},
updated() {
let newPreflights = this.preflightedRefs();
if (this.preflightedWas !== newPreflights) {
this.preflightedWas = newPreflights;
if (newPreflights === "") {
this.__view.cancelSubmit(this.el.form);
}
}
if (this.activeRefs() === "") {
this.el.value = null;
}
this.el.dispatchEvent(new CustomEvent(PHX_LIVE_FILE_UPDATED));
}
},
LiveImgPreview: {
mounted() {
this.ref = this.el.getAttribute("data-phx-entry-ref");
this.inputEl = document.getElementById(this.el.getAttribute(PHX_UPLOAD_REF));
LiveUploader.getEntryDataURL(this.inputEl, this.ref, (url) => {
this.url = url;
this.el.src = url;
});
},
destroyed() {
URL.revokeObjectURL(this.url);
}
}
};
var hooks_default = Hooks;
var DOMPostMorphRestorer = class {
constructor(containerBefore, containerAfter, updateType) {
let idsBefore = /* @__PURE__ */ new Set();
let idsAfter = new Set([...containerAfter.children].map((child) => child.id));
let elementsToModify = [];
Array.from(containerBefore.children).forEach((child) => {
if (child.id) {
idsBefore.add(child.id);
if (idsAfter.has(child.id)) {
let previousElementId = child.previousElementSibling && child.previousElementSibling.id;
elementsToModify.push({ elementId: child.id, previousElementId });
}
}
});
this.containerId = containerAfter.id;
this.updateType = updateType;
this.elementsToModify = elementsToModify;
this.elementIdsToAdd = [...idsAfter].filter((id) => !idsBefore.has(id));
}
perform() {
let container = dom_default.byId(this.containerId);
this.elementsToModify.forEach((elementToModify) => {
if (elementToModify.previousElementId) {
maybe(document.getElementById(elementToModify.previousElementId), (previousElem) => {
maybe(document.getElementById(elementToModify.elementId), (elem) => {
let isInRightPlace = elem.previousElementSibling && elem.previousElementSibling.id == previousElem.id;
if (!isInRightPlace) {
previousElem.insertAdjacentElement("afterend", elem);
}
});
});
} else {
maybe(document.getElementById(elementToModify.elementId), (elem) => {
let isInRightPlace = elem.previousElementSibling == null;
if (!isInRightPlace) {
container.insertAdjacentElement("afterbegin", elem);
}
});
}
});
if (this.updateType == "prepend") {
this.elementIdsToAdd.reverse().forEach((elemId) => {
maybe(document.getElementById(elemId), (elem) => container.insertAdjacentElement("afterbegin", elem));
});
}
}
};
var DOCUMENT_FRAGMENT_NODE = 11;
function morphAttrs(fromNode, toNode) {
var toNodeAttrs = toNode.attributes;
var attr;
var attrName;
var attrNamespaceURI;
var attrValue;
var fromValue;
if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE || fromNode.nodeType === DOCUMENT_FRAGMENT_NODE) {
return;
}
for (var i = toNodeAttrs.length - 1; i >= 0; i--) {
attr = toNodeAttrs[i];
attrName = attr.name;
attrNamespaceURI = attr.namespaceURI;
attrValue = attr.value;
if (attrNamespaceURI) {
attrName = attr.localName || attrName;
fromValue = fromNode.getAttributeNS(attrNamespaceURI, attrName);
if (fromValue !== attrValue) {
if (attr.prefix === "xmlns") {
attrName = attr.name;
}
fromNode.setAttributeNS(attrNamespaceURI, attrName, attrValue);
}
} else {
fromValue = fromNode.getAttribute(attrName);
if (fromValue !== attrValue) {
fromNode.setAttribute(attrName, attrValue);
}
}
}
var fromNodeAttrs = fromNode.attributes;
for (var d = fromNodeAttrs.length - 1; d >= 0; d--) {
attr = fromNodeAttrs[d];
attrName = attr.name;
attrNamespaceURI = attr.namespaceURI;
if (attrNamespaceURI) {
attrName = attr.localName || attrName;
if (!toNode.hasAttributeNS(attrNamespaceURI, attrName)) {
fromNode.removeAttributeNS(attrNamespaceURI, attrName);
}
} else {
if (!toNode.hasAttribute(attrName)) {
fromNode.removeAttribute(attrName);
}
}
}
}
var range;
var NS_XHTML = "http://www.w3.org/1999/xhtml";
var doc = typeof document === "undefined" ? void 0 : document;
var HAS_TEMPLATE_SUPPORT = !!doc && "content" in doc.createElement("template");
var HAS_RANGE_SUPPORT = !!doc && doc.createRange && "createContextualFragment" in doc.createRange();
function createFragmentFromTemplate(str) {
var template = doc.createElement("template");
template.innerHTML = str;
return template.content.childNodes[0];
}
function createFragmentFromRange(str) {
if (!range) {
range = doc.createRange();
range.selectNode(doc.body);
}
var fragment = range.createContextualFragment(str);
return fragment.childNodes[0];
}
function createFragmentFromWrap(str) {
var fragment = doc.createElement("body");
fragment.innerHTML = str;
return fragment.childNodes[0];
}
function toElement(str) {
str = str.trim();
if (HAS_TEMPLATE_SUPPORT) {
return createFragmentFromTemplate(str);
} else if (HAS_RANGE_SUPPORT) {
return createFragmentFromRange(str);
}
return createFragmentFromWrap(str);
}
function compareNodeNames(fromEl, toEl) {
var fromNodeName = fromEl.nodeName;
var toNodeName = toEl.nodeName;
var fromCodeStart, toCodeStart;
if (fromNodeName === toNodeName) {
return true;
}
fromCodeStart = fromNodeName.charCodeAt(0);
toCodeStart = toNodeName.charCodeAt(0);
if (fromCodeStart <= 90 && toCodeStart >= 97) {
return fromNodeName === toNodeName.toUpperCase();
} else if (toCodeStart <= 90 && fromCodeStart >= 97) {
return toNodeName === fromNodeName.toUpperCase();
} else {
return false;
}
}
function createElementNS(name, namespaceURI) {
return !namespaceURI || namespaceURI === NS_XHTML ? doc.createElement(name) : doc.createElementNS(namespaceURI, name);
}
function moveChildren(fromEl, toEl) {
var curChild = fromEl.firstChild;
while (curChild) {
var nextChild = curChild.nextSibling;
toEl.appendChild(curChild);
curChild = nextChild;
}
return toEl;
}
function syncBooleanAttrProp(fromEl, toEl, name) {
if (fromEl[name] !== toEl[name]) {
fromEl[name] = toEl[name];
if (fromEl[name]) {
fromEl.setAttribute(name, "");
} else {
fromEl.removeAttribute(name);
}
}
}
var specialElHandlers = {
OPTION: function(fromEl, toEl) {
var parentNode = fromEl.parentNode;
if (parentNode) {
var parentName = parentNode.nodeName.toUpperCase();
if (parentName === "OPTGROUP") {
parentNode = parentNode.parentNode;
parentName = parentNode && parentNode.nodeName.toUpperCase();
}
if (parentName === "SELECT" && !parentNode.hasAttribute("multiple")) {
if (fromEl.hasAttribute("selected") && !toEl.selected) {
fromEl.setAttribute("selected", "selected");
fromEl.removeAttribute("selected");
}
parentNode.selectedIndex = -1;
}
}
syncBooleanAttrProp(fromEl, toEl, "selected");
},
INPUT: function(fromEl, toEl) {
syncBooleanAttrProp(fromEl, toEl, "checked");
syncBooleanAttrProp(fromEl, toEl, "disabled");
if (fromEl.value !== toEl.value) {
fromEl.value = toEl.value;
}
if (!toEl.hasAttribute("value")) {
fromEl.removeAttribute("value");
}
},
TEXTAREA: function(fromEl, toEl) {
var newValue = toEl.value;
if (fromEl.value !== newValue) {
fromEl.value = newValue;
}
var firstChild = fromEl.firstChild;
if (firstChild) {
var oldValue = firstChild.nodeValue;
if (oldValue == newValue || !newValue && oldValue == fromEl.placeholder) {
return;
}
firstChild.nodeValue = newValue;
}
},
SELECT: function(fromEl, toEl) {
if (!toEl.hasAttribute("multiple")) {
var selectedIndex = -1;
var i = 0;
var curChild = fromEl.firstChild;
var optgroup;
var nodeName;
while (curChild) {
nodeName = curChild.nodeName && curChild.nodeName.toUpperCase();
if (nodeName === "OPTGROUP") {
optgroup = curChild;
curChild = optgroup.firstChild;
} else {
if (nodeName === "OPTION") {
if (curChild.hasAttribute("selected")) {
selectedIndex = i;
break;
}
i++;
}
curChild = curChild.nextSibling;
if (!curChild && optgroup) {
curChild = optgroup.nextSibling;
optgroup = null;
}
}
}
fromEl.selectedIndex = selectedIndex;
}
}
};
var ELEMENT_NODE = 1;
var DOCUMENT_FRAGMENT_NODE$1 = 11;
var TEXT_NODE = 3;
var COMMENT_NODE = 8;
function noop2() {
}
function defaultGetNodeKey(node) {
if (node) {
return node.getAttribute && node.getAttribute("id") || node.id;
}
}
function morphdomFactory(morphAttrs2) {
return function morphdom2(fromNode, toNode, options) {
if (!options) {
options = {};
}
if (typeof toNode === "string") {
if (fromNode.nodeName === "#document" || fromNode.nodeName === "HTML" || fromNode.nodeName === "BODY") {
var toNodeHtml = toNode;
toNode = doc.createElement("html");
toNode.innerHTML = toNodeHtml;
} else {
toNode = toElement(toNode);
}
}
var getNodeKey = options.getNodeKey || defaultGetNodeKey;
var onBeforeNodeAdded = options.onBeforeNodeAdded || noop2;
var onNodeAdded = options.onNodeAdded || noop2;
var onBeforeElUpdated = options.onBeforeElUpdated || noop2;
var onElUpdated = options.onElUpdated || noop2;
var onBeforeNodeDiscarded = options.onBeforeNodeDiscarded || noop2;
var onNodeDiscarded = options.onNodeDiscarded || noop2;
var onBeforeElChildrenUpdated = options.onBeforeElChildrenUpdated || noop2;
var childrenOnly = options.childrenOnly === true;
var fromNodesLookup = /* @__PURE__ */ Object.create(null);
var keyedRemovalList = [];
function addKeyedRemoval(key) {
keyedRemovalList.push(key);
}
function walkDiscardedChildNodes(node, skipKeyedNodes) {
if (node.nodeType === ELEMENT_NODE) {
var curChild = node.firstChild;
while (curChild) {
var key = void 0;
if (skipKeyedNodes && (key = getNodeKey(curChild))) {
addKeyedRemoval(key);
} else {
onNodeDiscarded(curChild);
if (curChild.firstChild) {
walkDiscardedChildNodes(curChild, skipKeyedNodes);
}
}
curChild = curChild.nextSibling;
}
}
}
function removeNode(node, parentNode, skipKeyedNodes) {
if (onBeforeNodeDiscarded(node) === false) {
return;
}
if (parentNode) {
parentNode.removeChild(node);
}
onNodeDiscarded(node);
walkDiscardedChildNodes(node, skipKeyedNodes);
}
function indexTree(node) {
if (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE$1) {
var curChild = node.firstChild;
while (curChild) {
var key = getNodeKey(curChild);
if (key) {
fromNodesLookup[key] = curChild;
}
indexTree(curChild);
curChild = curChild.nextSibling;
}
}
}
indexTree(fromNode);
function handleNodeAdded(el) {
onNodeAdded(el);
var curChild = el.firstChild;
while (curChild) {
var nextSibling = curChild.nextSibling;
var key = getNodeKey(curChild);
if (key) {
var unmatchedFromEl = fromNodesLookup[key];
if (unmatchedFromEl && compareNodeNames(curChild, unmatchedFromEl)) {
curChild.parentNode.replaceChild(unmatchedFromEl, curChild);
morphEl(unmatchedFromEl, curChild);
} else {
handleNodeAdded(curChild);
}
} else {
handleNodeAdded(curChild);
}
curChild = nextSibling;
}
}
function cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey) {
while (curFromNodeChild) {
var fromNextSibling = curFromNodeChild.nextSibling;
if (curFromNodeKey = getNodeKey(curFromNodeChild)) {
addKeyedRemoval(curFromNodeKey);
} else {
removeNode(curFromNodeChild, fromEl, true);
}
curFromNodeChild = fromNextSibling;
}
}
function morphEl(fromEl, toEl, childrenOnly2) {
var toElKey = getNodeKey(toEl);
if (toElKey) {
delete fromNodesLookup[toElKey];
}
if (!childrenOnly2) {
if (onBeforeElUpdated(fromEl, toEl) === false) {
return;
}
morphAttrs2(fromEl, toEl);
onElUpdated(fromEl);
if (onBeforeElChildrenUpdated(fromEl, toEl) === false) {
return;
}
}
if (fromEl.nodeName !== "TEXTAREA") {
morphChildren(fromEl, toEl);
} else {
specialElHandlers.TEXTAREA(fromEl, toEl);
}
}
function morphChildren(fromEl, toEl) {
var curToNodeChild = toEl.firstChild;
var curFromNodeChild = fromEl.firstChild;
var curToNodeKey;
var curFromNodeKey;
var fromNextSibling;
var toNextSibling;
var matchingFromEl;
outer:
while (curToNodeChild) {
toNextSibling = curToNodeChild.nextSibling;
curToNodeKey = getNodeKey(curToNodeChild);
while (curFromNodeChild) {
fromNextSibling = curFromNodeChild.nextSibling;
if (curToNodeChild.isSameNode && curToNodeChild.isSameNode(curFromNodeChild)) {
curToNodeChild = toNextSibling;
curFromNodeChild = fromNextSibling;
continue outer;
}
curFromNodeKey = getNodeKey(curFromNodeChild);
var curFromNodeType = curFromNodeChild.nodeType;
var isCompatible = void 0;
if (curFromNodeType === curToNodeChild.nodeType) {
if (curFromNodeType === ELEMENT_NODE) {
if (curToNodeKey) {
if (curToNodeKey !== curFromNodeKey) {
if (matchingFromEl = fromNodesLookup[curToNodeKey]) {
if (fromNextSibling === matchingFromEl) {
isCompatible = false;
} else {
fromEl.insertBefore(matchingFromEl, curFromNodeChild);
if (curFromNodeKey) {
addKeyedRemoval(curFromNodeKey);
} else {
removeNode(curFromNodeChild, fromEl, true);
}
curFromNodeChild = matchingFromEl;
}
} else {
isCompatible = false;
}
}
} else if (curFromNodeKey) {
isCompatible = false;
}
isCompatible = isCompatible !== false && compareNodeNames(curFromNodeChild, curToNodeChild);
if (isCompatible) {
morphEl(curFromNodeChild, curToNodeChild);
}
} else if (curFromNodeType === TEXT_NODE || curFromNodeType == COMMENT_NODE) {
isCompatible = true;
if (curFromNodeChild.nodeValue !== curToNodeChild.nodeValue) {
curFromNodeChild.nodeValue = curToNodeChild.nodeValue;
}
}
}
if (isCompatible) {
curToNodeChild = toNextSibling;
curFromNodeChild = fromNextSibling;
continue outer;
}
if (curFromNodeKey) {
addKeyedRemoval(curFromNodeKey);
} else {
removeNode(curFromNodeChild, fromEl, true);
}
curFromNodeChild = fromNextSibling;
}
if (curToNodeKey && (matchingFromEl = fromNodesLookup[curToNodeKey]) && compareNodeNames(matchingFromEl, curToNodeChild)) {
fromEl.appendChild(matchingFromEl);
morphEl(matchingFromEl, curToNodeChild);
} else {
var onBeforeNodeAddedResult = onBeforeNodeAdded(curToNodeChild);
if (onBeforeNodeAddedResult !== false) {
if (onBeforeNodeAddedResult) {
curToNodeChild = onBeforeNodeAddedResult;
}
if (curToNodeChild.actualize) {
curToNodeChild = curToNodeChild.actualize(fromEl.ownerDocument || doc);
}
fromEl.appendChild(curToNodeChild);
handleNodeAdded(curToNodeChild);
}
}
curToNodeChild = toNextSibling;
curFromNodeChild = fromNextSibling;
}
cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey);
var specialElHandler = specialElHandlers[fromEl.nodeName];
if (specialElHandler) {
specialElHandler(fromEl, toEl);
}
}
var morphedNode = fromNode;
var morphedNodeType = morphedNode.nodeType;
var toNodeType = toNode.nodeType;
if (!childrenOnly) {
if (morphedNodeType === ELEMENT_NODE) {
if (toNodeType === ELEMENT_NODE) {
if (!compareNodeNames(fromNode, toNode)) {
onNodeDiscarded(fromNode);
morphedNode = moveChildren(fromNode, createElementNS(toNode.nodeName, toNode.namespaceURI));
}
} else {
morphedNode = toNode;
}
} else if (morphedNodeType === TEXT_NODE || morphedNodeType === COMMENT_NODE) {
if (toNodeType === morphedNodeType) {
if (morphedNode.nodeValue !== toNode.nodeValue) {
morphedNode.nodeValue = toNode.nodeValue;
}
return morphedNode;
} else {
morphedNode = toNode;
}
}
}
if (morphedNode === toNode) {
onNodeDiscarded(fromNode);
} else {
if (toNode.isSameNode && toNode.isSameNode(morphedNode)) {
return;
}
morphEl(morphedNode, toNode, childrenOnly);
if (keyedRemovalList) {
for (var i = 0, len = keyedRemovalList.length; i < len; i++) {
var elToRemove = fromNodesLookup[keyedRemovalList[i]];
if (elToRemove) {
removeNode(elToRemove, elToRemove.parentNode, false);
}
}
}
}
if (!childrenOnly && morphedNode !== fromNode && fromNode.parentNode) {
if (morphedNode.actualize) {
morphedNode = morphedNode.actualize(fromNode.ownerDocument || doc);
}
fromNode.parentNode.replaceChild(morphedNode, fromNode);
}
return morphedNode;
};
}
var morphdom = morphdomFactory(morphAttrs);
var morphdom_esm_default = morphdom;
var DOMPatch = class {
static patchEl(fromEl, toEl, activeElement) {
morphdom_esm_default(fromEl, toEl, {
childrenOnly: false,
onBeforeElUpdated: (fromEl2, toEl2) => {
if (activeElement && activeElement.isSameNode(fromEl2) && dom_default.isFormInput(fromEl2)) {
dom_default.mergeFocusedInput(fromEl2, toEl2);
return false;
}
}
});
}
constructor(view, container, id, html, targetCID) {
this.view = view;
this.liveSocket = view.liveSocket;
this.container = container;
this.id = id;
this.rootID = view.root.id;
this.html = html;
this.targetCID = targetCID;
this.cidPatch = isCid(this.targetCID);
this.callbacks = {
beforeadded: [],
beforeupdated: [],
beforephxChildAdded: [],
afteradded: [],
afterupdated: [],
afterdiscarded: [],
afterphxChildAdded: [],
aftertransitionsDiscarded: []
};
}
before(kind, callback) {
this.callbacks[`before${kind}`].push(callback);
}
after(kind, callback) {
this.callbacks[`after${kind}`].push(callback);
}
trackBefore(kind, ...args) {
this.callbacks[`before${kind}`].forEach((callback) => callback(...args));
}
trackAfter(kind, ...args) {
this.callbacks[`after${kind}`].forEach((callback) => callback(...args));
}
markPrunableContentForRemoval() {
dom_default.all(this.container, "[phx-update=append] > *, [phx-update=prepend] > *", (el) => {
el.setAttribute(PHX_PRUNE, "");
});
}
perform() {
let { view, liveSocket: liveSocket2, container, html } = this;
let targetContainer = this.isCIDPatch() ? this.targetCIDContainer(html) : container;
if (this.isCIDPatch() && !targetContainer) {
return;
}
let focused = liveSocket2.getActiveElement();
let { selectionStart, selectionEnd } = focused && dom_default.hasSelectionRange(focused) ? focused : {};
let phxUpdate = liveSocket2.binding(PHX_UPDATE);
let phxFeedbackFor = liveSocket2.binding(PHX_FEEDBACK_FOR);
let disableWith = liveSocket2.binding(PHX_DISABLE_WITH);
let phxTriggerExternal = liveSocket2.binding(PHX_TRIGGER_ACTION);
let phxRemove = liveSocket2.binding("remove");
let added = [];
let updates = [];
let appendPrependUpdates = [];
let pendingRemoves = [];
let externalFormTriggered = null;
let diffHTML = liveSocket2.time("premorph container prep", () => {
return this.buildDiffHTML(container, html, phxUpdate, targetContainer);
});
this.trackBefore("added", container);
this.trackBefore("updated", container, container);
liveSocket2.time("morphdom", () => {
morphdom_esm_default(targetContainer, diffHTML, {
childrenOnly: targetContainer.getAttribute(PHX_COMPONENT) === null,
getNodeKey: (node) => {
return dom_default.isPhxDestroyed(node) ? null : node.id;
},
onBeforeNodeAdded: (el) => {
this.trackBefore("added", el);
return el;
},
onNodeAdded: (el) => {
if (el instanceof HTMLImageElement && el.srcset) {
el.srcset = el.srcset;
} else if (el instanceof HTMLVideoElement && el.autoplay) {
el.play();
}
if (dom_default.isNowTriggerFormExternal(el, phxTriggerExternal)) {
externalFormTriggered = el;
}
dom_default.discardError(targetContainer, el, phxFeedbackFor);
if (dom_default.isPhxChild(el) && view.ownsElement(el) || dom_default.isPhxSticky(el) && view.ownsElement(el.parentNode)) {
this.trackAfter("phxChildAdded", el);
}
added.push(el);
},
onNodeDiscarded: (el) => {
if (dom_default.isPhxChild(el) || dom_default.isPhxSticky(el)) {
liveSocket2.destroyViewByEl(el);
}
this.trackAfter("discarded", el);
},
onBeforeNodeDiscarded: (el) => {
if (el.getAttribute && el.getAttribute(PHX_PRUNE) !== null) {
return true;
}
if (el.parentNode !== null && dom_default.isPhxUpdate(el.parentNode, phxUpdate, ["append", "prepend"]) && el.id) {
return false;
}
if (el.getAttribute && el.getAttribute(phxRemove)) {
pendingRemoves.push(el);
return false;
}
if (this.skipCIDSibling(el)) {
return false;
}
return true;
},
onElUpdated: (el) => {
if (dom_default.isNowTriggerFormExternal(el, phxTriggerExternal)) {
externalFormTriggered = el;
}
updates.push(el);
},
onBeforeElUpdated: (fromEl, toEl) => {
dom_default.cleanChildNodes(toEl, phxUpdate);
if (this.skipCIDSibling(toEl)) {
return false;
}
if (dom_default.isPhxSticky(fromEl)) {
return false;
}
if (dom_default.isIgnored(fromEl, phxUpdate)) {
this.trackBefore("updated", fromEl, toEl);
dom_default.mergeAttrs(fromEl, toEl, { isIgnored: true });
updates.push(fromEl);
dom_default.applyStickyOperations(fromEl);
return false;
}
if (fromEl.type === "number" && (fromEl.validity && fromEl.validity.badInput)) {
return false;
}
if (!dom_default.syncPendingRef(fromEl, toEl, disableWith)) {
if (dom_default.isUploadInput(fromEl)) {
this.trackBefore("updated", fromEl, toEl);
updates.push(fromEl);
}
dom_default.applyStickyOperations(fromEl);
return false;
}
if (dom_default.isPhxChild(toEl)) {
let prevSession = fromEl.getAttribute(PHX_SESSION);
dom_default.mergeAttrs(fromEl, toEl, { exclude: [PHX_STATIC] });
if (prevSession !== "") {
fromEl.setAttribute(PHX_SESSION, prevSession);
}
fromEl.setAttribute(PHX_ROOT_ID, this.rootID);
dom_default.applyStickyOperations(fromEl);
return false;
}
dom_default.copyPrivates(toEl, fromEl);
dom_default.discardError(targetContainer, toEl, phxFeedbackFor);
let isFocusedFormEl = focused && fromEl.isSameNode(focused) && dom_default.isFormInput(fromEl);
if (isFocusedFormEl) {
this.trackBefore("updated", fromEl, toEl);
dom_default.mergeFocusedInput(fromEl, toEl);
dom_default.syncAttrsToProps(fromEl);
updates.push(fromEl);
dom_default.applyStickyOperations(fromEl);
return false;
} else {
if (dom_default.isPhxUpdate(toEl, phxUpdate, ["append", "prepend"])) {
appendPrependUpdates.push(new DOMPostMorphRestorer(fromEl, toEl, toEl.getAttribute(phxUpdate)));
}
dom_default.syncAttrsToProps(toEl);
dom_default.applyStickyOperations(toEl);
this.trackBefore("updated", fromEl, toEl);
return true;
}
}
});
});
if (liveSocket2.isDebugEnabled()) {
detectDuplicateIds();
}
if (appendPrependUpdates.length > 0) {
liveSocket2.time("post-morph append/prepend restoration", () => {
appendPrependUpdates.forEach((update) => update.perform());
});
}
liveSocket2.silenceEvents(() => dom_default.restoreFocus(focused, selectionStart, selectionEnd));
dom_default.dispatchEvent(document, "phx:update");
added.forEach((el) => this.trackAfter("added", el));
updates.forEach((el) => this.trackAfter("updated", el));
if (pendingRemoves.length > 0) {
liveSocket2.transitionRemoves(pendingRemoves);
liveSocket2.requestDOMUpdate(() => {
pendingRemoves.forEach((el) => {
let child = dom_default.firstPhxChild(el);
if (child) {
liveSocket2.destroyViewByEl(child);
}
el.remove();
});
this.trackAfter("transitionsDiscarded", pendingRemoves);
});
}
if (externalFormTriggered) {
liveSocket2.disconnect();
externalFormTriggered.submit();
}
return true;
}
isCIDPatch() {
return this.cidPatch;
}
skipCIDSibling(el) {
return el.nodeType === Node.ELEMENT_NODE && el.getAttribute(PHX_SKIP) !== null;
}
targetCIDContainer(html) {
if (!this.isCIDPatch()) {
return;
}
let [first, ...rest] = dom_default.findComponentNodeList(this.container, this.targetCID);
if (rest.length === 0 && dom_default.childNodeLength(html) === 1) {
return first;
} else {
return first && first.parentNode;
}
}
buildDiffHTML(container, html, phxUpdate, targetContainer) {
let isCIDPatch = this.isCIDPatch();
let isCIDWithSingleRoot = isCIDPatch && targetContainer.getAttribute(PHX_COMPONENT) === this.targetCID.toString();
if (!isCIDPatch || isCIDWithSingleRoot) {
return html;
} else {
let diffContainer = null;
let template = document.createElement("template");
diffContainer = dom_default.cloneNode(targetContainer);
let [firstComponent, ...rest] = dom_default.findComponentNodeList(diffContainer, this.targetCID);
template.innerHTML = html;
rest.forEach((el) => el.remove());
Array.from(diffContainer.childNodes).forEach((child) => {
if (child.id && child.nodeType === Node.ELEMENT_NODE && child.getAttribute(PHX_COMPONENT) !== this.targetCID.toString()) {
child.setAttribute(PHX_SKIP, "");
child.innerHTML = "";
}
});
Array.from(template.content.childNodes).forEach((el) => diffContainer.insertBefore(el, firstComponent));
firstComponent.remove();
return diffContainer.outerHTML;
}
}
};
var Rendered = class {
static extract(diff) {
let { [REPLY]: reply, [EVENTS]: events, [TITLE]: title } = diff;
delete diff[REPLY];
delete diff[EVENTS];
delete diff[TITLE];
return { diff, title, reply: reply || null, events: events || [] };
}
constructor(viewId, rendered) {
this.viewId = viewId;
this.rendered = {};
this.mergeDiff(rendered);
}
parentViewId() {
return this.viewId;
}
toString(onlyCids) {
return this.recursiveToString(this.rendered, this.rendered[COMPONENTS], onlyCids);
}
recursiveToString(rendered, components = rendered[COMPONENTS], onlyCids) {
onlyCids = onlyCids ? new Set(onlyCids) : null;
let output = { buffer: "", components, onlyCids };
this.toOutputBuffer(rendered, null, output);
return output.buffer;
}
componentCIDs(diff) {
return Object.keys(diff[COMPONENTS] || {}).map((i) => parseInt(i));
}
isComponentOnlyDiff(diff) {
if (!diff[COMPONENTS]) {
return false;
}
return Object.keys(diff).length === 1;
}
getComponent(diff, cid) {
return diff[COMPONENTS][cid];
}
mergeDiff(diff) {
let newc = diff[COMPONENTS];
let cache = {};
delete diff[COMPONENTS];
this.rendered = this.mutableMerge(this.rendered, diff);
this.rendered[COMPONENTS] = this.rendered[COMPONENTS] || {};
if (newc) {
let oldc = this.rendered[COMPONENTS];
for (let cid in newc) {
newc[cid] = this.cachedFindComponent(cid, newc[cid], oldc, newc, cache);
}
for (let cid in newc) {
oldc[cid] = newc[cid];
}
diff[COMPONENTS] = newc;
}
}
cachedFindComponent(cid, cdiff, oldc, newc, cache) {
if (cache[cid]) {
return cache[cid];
} else {
let ndiff, stat, scid = cdiff[STATIC];
if (isCid(scid)) {
let tdiff;
if (scid > 0) {
tdiff = this.cachedFindComponent(scid, newc[scid], oldc, newc, cache);
} else {
tdiff = oldc[-scid];
}
stat = tdiff[STATIC];
ndiff = this.cloneMerge(tdiff, cdiff);
ndiff[STATIC] = stat;
} else {
ndiff = cdiff[STATIC] !== void 0 ? cdiff : this.cloneMerge(oldc[cid] || {}, cdiff);
}
cache[cid] = ndiff;
return ndiff;
}
}
mutableMerge(target, source) {
if (source[STATIC] !== void 0) {
return source;
} else {
this.doMutableMerge(target, source);
return target;
}
}
doMutableMerge(target, source) {
for (let key in source) {
let val = source[key];
let targetVal = target[key];
if (isObject(val) && val[STATIC] === void 0 && isObject(targetVal)) {
this.doMutableMerge(targetVal, val);
} else {
target[key] = val;
}
}
}
cloneMerge(target, source) {
let merged = __spreadValues(__spreadValues({}, target), source);
for (let key in merged) {
let val = source[key];
let targetVal = target[key];
if (isObject(val) && val[STATIC] === void 0 && isObject(targetVal)) {
merged[key] = this.cloneMerge(targetVal, val);
}
}
return merged;
}
componentToString(cid) {
return this.recursiveCIDToString(this.rendered[COMPONENTS], cid);
}
pruneCIDs(cids) {
cids.forEach((cid) => delete this.rendered[COMPONENTS][cid]);
}
get() {
return this.rendered;
}
isNewFingerprint(diff = {}) {
return !!diff[STATIC];
}
templateStatic(part, templates) {
if (typeof part === "number") {
return templates[part];
} else {
return part;
}
}
toOutputBuffer(rendered, templates, output) {
if (rendered[DYNAMICS]) {
return this.comprehensionToBuffer(rendered, templates, output);
}
let { [STATIC]: statics } = rendered;
statics = this.templateStatic(statics, templates);
output.buffer += statics[0];
for (let i = 1; i < statics.length; i++) {
this.dynamicToBuffer(rendered[i - 1], templates, output);
output.buffer += statics[i];
}
}
comprehensionToBuffer(rendered, templates, output) {
let { [DYNAMICS]: dynamics, [STATIC]: statics } = rendered;
statics = this.templateStatic(statics, templates);
let compTemplates = templates || rendered[TEMPLATES];
for (let d = 0; d < dynamics.length; d++) {
let dynamic = dynamics[d];
output.buffer += statics[0];
for (let i = 1; i < statics.length; i++) {
this.dynamicToBuffer(dynamic[i - 1], compTemplates, output);
output.buffer += statics[i];
}
}
}
dynamicToBuffer(rendered, templates, output) {
if (typeof rendered === "number") {
output.buffer += this.recursiveCIDToString(output.components, rendered, output.onlyCids);
} else if (isObject(rendered)) {
this.toOutputBuffer(rendered, templates, output);
} else {
output.buffer += rendered;
}
}
recursiveCIDToString(components, cid, onlyCids) {
let component = components[cid] || logError(`no component for CID ${cid}`, components);
let template = document.createElement("template");
template.innerHTML = this.recursiveToString(component, components, onlyCids);
let container = template.content;
let skip = onlyCids && !onlyCids.has(cid);
let [hasChildNodes, hasChildComponents] = Array.from(container.childNodes).reduce(([hasNodes, hasComponents], child, i) => {
if (child.nodeType === Node.ELEMENT_NODE) {
if (child.getAttribute(PHX_COMPONENT)) {
return [hasNodes, true];
}
child.setAttribute(PHX_COMPONENT, cid);
if (!child.id) {
child.id = `${this.parentViewId()}-${cid}-${i}`;
}
if (skip) {
child.setAttribute(PHX_SKIP, "");
child.innerHTML = "";
}
return [true, hasComponents];
} else {
if (child.nodeValue.trim() !== "") {
logError(`only HTML element tags are allowed at the root of components.
got: "${child.nodeValue.trim()}"
within:
`, template.innerHTML.trim());
child.replaceWith(this.createSpan(child.nodeValue, cid));
return [true, hasComponents];
} else {
child.remove();
return [hasNodes, hasComponents];
}
}
}, [false, false]);
if (!hasChildNodes && !hasChildComponents) {
logError("expected at least one HTML element tag inside a component, but the component is empty:\n", template.innerHTML.trim());
return this.createSpan("", cid).outerHTML;
} else if (!hasChildNodes && hasChildComponents) {
logError("expected at least one HTML element tag directly inside a component, but only subcomponents were found. A component must render at least one HTML tag directly inside itself.", template.innerHTML.trim());
return template.innerHTML;
} else {
return template.innerHTML;
}
}
createSpan(text, cid) {
let span = document.createElement("span");
span.innerText = text;
span.setAttribute(PHX_COMPONENT, cid);
return span;
}
};
var viewHookID = 1;
var ViewHook = class {
static makeID() {
return viewHookID++;
}
static elementID(el) {
return el.phxHookId;
}
constructor(view, el, callbacks) {
this.__view = view;
this.__liveSocket = view.liveSocket;
this.__callbacks = callbacks;
this.__listeners = /* @__PURE__ */ new Set();
this.__isDisconnected = false;
this.el = el;
this.el.phxHookId = this.constructor.makeID();
for (let key in this.__callbacks) {
this[key] = this.__callbacks[key];
}
}
__mounted() {
this.mounted && this.mounted();
}
__updated() {
this.updated && this.updated();
}
__beforeUpdate() {
this.beforeUpdate && this.beforeUpdate();
}
__destroyed() {
this.destroyed && this.destroyed();
}
__reconnected() {
if (this.__isDisconnected) {
this.__isDisconnected = false;
this.reconnected && this.reconnected();
}
}
__disconnected() {
this.__isDisconnected = true;
this.disconnected && this.disconnected();
}
pushEvent(event, payload = {}, onReply = function() {
}) {
return this.__view.pushHookEvent(null, event, payload, onReply);
}
pushEventTo(phxTarget, event, payload = {}, onReply = function() {
}) {
return this.__view.withinTargets(phxTarget, (view, targetCtx) => {
return view.pushHookEvent(targetCtx, event, payload, onReply);
});
}
handleEvent(event, callback) {
let callbackRef = (customEvent, bypass) => bypass ? event : callback(customEvent.detail);
window.addEventListener(`phx:${event}`, callbackRef);
this.__listeners.add(callbackRef);
return callbackRef;
}
removeHandleEvent(callbackRef) {
let event = callbackRef(null, true);
window.removeEventListener(`phx:${event}`, callbackRef);
this.__listeners.delete(callbackRef);
}
upload(name, files) {
return this.__view.dispatchUploads(name, files);
}
uploadTo(phxTarget, name, files) {
return this.__view.withinTargets(phxTarget, (view) => view.dispatchUploads(name, files));
}
__cleanup__() {
this.__listeners.forEach((callbackRef) => this.removeHandleEvent(callbackRef));
}
};
var JS = {
exec(eventType, phxEvent, view, sourceEl, defaults) {
let [defaultKind, defaultArgs] = defaults || [null, {}];
let commands = phxEvent.charAt(0) === "[" ? JSON.parse(phxEvent) : [[defaultKind, defaultArgs]];
commands.forEach(([kind, args]) => {
if (kind === defaultKind && defaultArgs.data) {
args.data = Object.assign(args.data || {}, defaultArgs.data);
}
this.filterToEls(sourceEl, args).forEach((el) => {
this[`exec_${kind}`](eventType, phxEvent, view, sourceEl, el, args);
});
});
},
isVisible(el) {
return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length > 0);
},
exec_dispatch(eventType, phxEvent, view, sourceEl, el, { to, event, detail }) {
dom_default.dispatchEvent(el, event, detail);
},
exec_push(eventType, phxEvent, view, sourceEl, el, args) {
let { event, data, target, page_loading, loading, value } = args;
let pushOpts = { loading, value, target, page_loading: !!page_loading };
let targetSrc = eventType === "change" ? sourceEl.form : sourceEl;
let phxTarget = target || targetSrc.getAttribute(view.binding("target")) || targetSrc;
view.withinTargets(phxTarget, (targetView, targetCtx) => {
if (eventType === "change") {
let { newCid, _target, callback } = args;
if (_target) {
pushOpts._target = _target;
}
targetView.pushInput(sourceEl, targetCtx, newCid, event || phxEvent, pushOpts, callback);
} else if (eventType === "submit") {
targetView.submitForm(sourceEl, targetCtx, event || phxEvent, pushOpts);
} else {
targetView.pushEvent(eventType, sourceEl, targetCtx, event || phxEvent, data, pushOpts);
}
});
},
exec_add_class(eventType, phxEvent, view, sourceEl, el, { names, transition, time }) {
this.addOrRemoveClasses(el, names, [], transition, time, view);
},
exec_remove_class(eventType, phxEvent, view, sourceEl, el, { names, transition, time }) {
this.addOrRemoveClasses(el, [], names, transition, time, view);
},
exec_transition(eventType, phxEvent, view, sourceEl, el, { time, transition }) {
let [transition_start, running, transition_end] = transition;
let onStart = () => this.addOrRemoveClasses(el, transition_start.concat(running), []);
let onDone = () => this.addOrRemoveClasses(el, transition_end, transition_start.concat(running));
view.transition(time, onStart, onDone);
},
exec_toggle(eventType, phxEvent, view, sourceEl, el, { display, ins, outs, time }) {
this.toggle(eventType, view, el, display, ins, outs, time);
},
exec_show(eventType, phxEvent, view, sourceEl, el, { display, transition, time }) {
this.show(eventType, view, el, display, transition, time);
},
exec_hide(eventType, phxEvent, view, sourceEl, el, { display, transition, time }) {
this.hide(eventType, view, el, display, transition, time);
},
exec_set_attr(eventType, phxEvent, view, sourceEl, el, { attr: [attr, val] }) {
this.setOrRemoveAttrs(el, [[attr, val]], []);
},
exec_remove_attr(eventType, phxEvent, view, sourceEl, el, { attr }) {
this.setOrRemoveAttrs(el, [], [attr]);
},
show(eventType, view, el, display, transition, time) {
if (!this.isVisible(el)) {
this.toggle(eventType, view, el, display, transition, null, time);
}
},
hide(eventType, view, el, display, transition, time) {
if (this.isVisible(el)) {
this.toggle(eventType, view, el, display, null, transition, time);
}
},
toggle(eventType, view, el, display, ins, outs, time) {
let [inClasses, inStartClasses, inEndClasses] = ins || [[], [], []];
let [outClasses, outStartClasses, outEndClasses] = outs || [[], [], []];
if (inClasses.length > 0 || outClasses.length > 0) {
if (this.isVisible(el)) {
let onStart = () => {
this.addOrRemoveClasses(el, outStartClasses, inClasses.concat(inStartClasses).concat(inEndClasses));
window.requestAnimationFrame(() => {
this.addOrRemoveClasses(el, outClasses, []);
window.requestAnimationFrame(() => this.addOrRemoveClasses(el, outEndClasses, outStartClasses));
});
};
el.dispatchEvent(new Event("phx:hide-start"));
view.transition(time, onStart, () => {
this.addOrRemoveClasses(el, [], outClasses.concat(outEndClasses));
dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = "none");
el.dispatchEvent(new Event("phx:hide-end"));
});
} else {
if (eventType === "remove") {
return;
}
let onStart = () => {
this.addOrRemoveClasses(el, inStartClasses, outClasses.concat(outStartClasses).concat(outEndClasses));
dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = display || "block");
window.requestAnimationFrame(() => {
this.addOrRemoveClasses(el, inClasses, []);
window.requestAnimationFrame(() => this.addOrRemoveClasses(el, inEndClasses, inStartClasses));
});
};
el.dispatchEvent(new Event("phx:show-start"));
view.transition(time, onStart, () => {
this.addOrRemoveClasses(el, [], inClasses.concat(inEndClasses));
el.dispatchEvent(new Event("phx:show-end"));
});
}
} else {
if (this.isVisible(el)) {
window.requestAnimationFrame(() => {
el.dispatchEvent(new Event("phx:hide-start"));
dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = "none");
el.dispatchEvent(new Event("phx:hide-end"));
});
} else {
window.requestAnimationFrame(() => {
el.dispatchEvent(new Event("phx:show-start"));
dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = display || "block");
el.dispatchEvent(new Event("phx:show-end"));
});
}
}
},
addOrRemoveClasses(el, adds, removes, transition, time, view) {
let [transition_run, transition_start, transition_end] = transition || [[], [], []];
if (transition_run.length > 0) {
let onStart = () => this.addOrRemoveClasses(el, transition_start.concat(transition_run), []);
let onDone = () => this.addOrRemoveClasses(el, adds.concat(transition_end), removes.concat(transition_run).concat(transition_start));
return view.transition(time, onStart, onDone);
}
window.requestAnimationFrame(() => {
let [prevAdds, prevRemoves] = dom_default.getSticky(el, "classes", [[], []]);
let keepAdds = adds.filter((name) => prevAdds.indexOf(name) < 0 && !el.classList.contains(name));
let keepRemoves = removes.filter((name) => prevRemoves.indexOf(name) < 0 && el.classList.contains(name));
let newAdds = prevAdds.filter((name) => removes.indexOf(name) < 0).concat(keepAdds);
let newRemoves = prevRemoves.filter((name) => adds.indexOf(name) < 0).concat(keepRemoves);
dom_default.putSticky(el, "classes", (currentEl) => {
currentEl.classList.remove(...newRemoves);
currentEl.classList.add(...newAdds);
return [newAdds, newRemoves];
});
});
},
setOrRemoveAttrs(el, sets, removes) {
let [prevSets, prevRemoves] = dom_default.getSticky(el, "attrs", [[], []]);
let keepSets = sets.filter(([attr, _val]) => !this.hasSet(prevSets, attr) && !el.attributes.getNamedItem(attr));
let keepRemoves = removes.filter((attr) => prevRemoves.indexOf(attr) < 0 && el.attributes.getNamedItem(attr));
let newSets = prevSets.filter(([attr, _val]) => removes.indexOf(attr) < 0).concat(keepSets);
let newRemoves = prevRemoves.filter((attr) => !this.hasSet(sets, attr)).concat(keepRemoves);
dom_default.putSticky(el, "attrs", (currentEl) => {
newRemoves.forEach((attr) => currentEl.removeAttribute(attr));
newSets.forEach(([attr, val]) => currentEl.setAttribute(attr, val));
return [newSets, newRemoves];
});
},
hasSet(sets, nameSearch) {
return sets.find(([name, val]) => name === nameSearch);
},
hasAllClasses(el, classes) {
return classes.every((name) => el.classList.contains(name));
},
isToggledOut(el, outClasses) {
return !this.isVisible(el) || this.hasAllClasses(el, outClasses);
},
filterToEls(sourceEl, { to }) {
return to ? dom_default.all(document, to) : [sourceEl];
}
};
var js_default = JS;
var serializeForm = (form, meta = {}) => {
let formData = new FormData(form);
let toRemove = [];
formData.forEach((val, key, _index) => {
if (val instanceof File) {
toRemove.push(key);
}
});
toRemove.forEach((key) => formData.delete(key));
let params = new URLSearchParams();
for (let [key, val] of formData.entries()) {
params.append(key, val);
}
for (let metaKey in meta) {
params.append(metaKey, meta[metaKey]);
}
return params.toString();
};
var View = class {
constructor(el, liveSocket2, parentView, flash) {
this.liveSocket = liveSocket2;
this.flash = flash;
this.parent = parentView;
this.root = parentView ? parentView.root : this;
this.el = el;
this.id = this.el.id;
this.ref = 0;
this.childJoins = 0;
this.loaderTimer = null;
this.pendingDiffs = [];
this.pruningCIDs = [];
this.redirect = false;
this.href = null;
this.joinCount = this.parent ? this.parent.joinCount - 1 : 0;
this.joinPending = true;
this.destroyed = false;
this.joinCallback = function(onDone) {
onDone && onDone();
};
this.stopCallback = function() {
};
this.pendingJoinOps = this.parent ? null : [];
this.viewHooks = {};
this.uploaders = {};
this.formSubmits = [];
this.children = this.parent ? null : {};
this.root.children[this.id] = {};
this.channel = this.liveSocket.channel(`lv:${this.id}`, () => {
return {
redirect: this.redirect ? this.href : void 0,
url: this.redirect ? void 0 : this.href || void 0,
params: this.connectParams(),
session: this.getSession(),
static: this.getStatic(),
flash: this.flash
};
});
this.showLoader(this.liveSocket.loaderTimeout);
this.bindChannel();
}
setHref(href) {
this.href = href;
}
setRedirect(href) {
this.redirect = true;
this.href = href;
}
isMain() {
return this.el.getAttribute(PHX_MAIN) !== null;
}
connectParams() {
let params = this.liveSocket.params(this.el);
let manifest = dom_default.all(document, `[${this.binding(PHX_TRACK_STATIC)}]`).map((node) => node.src || node.href).filter((url) => typeof url === "string");
if (manifest.length > 0) {
params["_track_static"] = manifest;
}
params["_mounts"] = this.joinCount;
return params;
}
isConnected() {
return this.channel.canPush();
}
getSession() {
return this.el.getAttribute(PHX_SESSION);
}
getStatic() {
let val = this.el.getAttribute(PHX_STATIC);
return val === "" ? null : val;
}
destroy(callback = function() {
}) {
this.destroyAllChildren();
this.destroyed = true;
delete this.root.children[this.id];
if (this.parent) {
delete this.root.children[this.parent.id][this.id];
}
clearTimeout(this.loaderTimer);
let onFinished = () => {
callback();
for (let id in this.viewHooks) {
this.destroyHook(this.viewHooks[id]);
}
};
dom_default.markPhxChildDestroyed(this.el);
this.log("destroyed", () => ["the child has been removed from the parent"]);
this.channel.leave().receive("ok", onFinished).receive("error", onFinished).receive("timeout", onFinished);
}
setContainerClasses(...classes) {
this.el.classList.remove(PHX_CONNECTED_CLASS, PHX_DISCONNECTED_CLASS, PHX_ERROR_CLASS);
this.el.classList.add(...classes);
}
showLoader(timeout) {
clearTimeout(this.loaderTimer);
if (timeout) {
this.loaderTimer = setTimeout(() => this.showLoader(), timeout);
} else {
for (let id in this.viewHooks) {
this.viewHooks[id].__disconnected();
}
this.setContainerClasses(PHX_DISCONNECTED_CLASS);
}
}
hideLoader() {
clearTimeout(this.loaderTimer);
this.setContainerClasses(PHX_CONNECTED_CLASS);
}
triggerReconnected() {
for (let id in this.viewHooks) {
this.viewHooks[id].__reconnected();
}
}
log(kind, msgCallback) {
this.liveSocket.log(this, kind, msgCallback);
}
transition(time, onStart, onDone = function() {
}) {
this.liveSocket.transition(time, onStart, onDone);
}
withinTargets(phxTarget, callback) {
if (phxTarget instanceof HTMLElement || phxTarget instanceof SVGElement) {
return this.liveSocket.owner(phxTarget, (view) => callback(view, phxTarget));
}
if (isCid(phxTarget)) {
let targets = dom_default.findComponentNodeList(this.el, phxTarget);
if (targets.length === 0) {
logError(`no component found matching phx-target of ${phxTarget}`);
} else {
callback(this, parseInt(phxTarget));
}
} else {
let targets = Array.from(document.querySelectorAll(phxTarget));
if (targets.length === 0) {
logError(`nothing found matching the phx-target selector "${phxTarget}"`);
}
targets.forEach((target) => this.liveSocket.owner(target, (view) => callback(view, target)));
}
}
applyDiff(type, rawDiff, callback) {
this.log(type, () => ["", clone(rawDiff)]);
let { diff, reply, events, title } = Rendered.extract(rawDiff);
if (title) {
dom_default.putTitle(title);
}
callback({ diff, reply, events });
return reply;
}
onJoin(resp) {
let { rendered, container } = resp;
if (container) {
let [tag, attrs] = container;
this.el = dom_default.replaceRootContainer(this.el, tag, attrs);
}
this.childJoins = 0;
this.joinPending = true;
this.flash = null;
browser_default.dropLocal(this.liveSocket.localStorage, window.location.pathname, CONSECUTIVE_RELOADS);
this.applyDiff("mount", rendered, ({ diff, events }) => {
this.rendered = new Rendered(this.id, diff);
let html = this.renderContainer(null, "join");
this.dropPendingRefs();
let forms = this.formsForRecovery(html);
this.joinCount++;
if (forms.length > 0) {
forms.forEach(([form, newForm, newCid], i) => {
this.pushFormRecovery(form, newCid, (resp2) => {
if (i === forms.length - 1) {
this.onJoinComplete(resp2, html, events);
}
});
});
} else {
this.onJoinComplete(resp, html, events);
}
});
}
dropPendingRefs() {
dom_default.all(document, `[${PHX_REF_SRC}="${this.id}"][${PHX_REF}]`, (el) => {
el.removeAttribute(PHX_REF);
el.removeAttribute(PHX_REF_SRC);
});
}
onJoinComplete({ live_patch }, html, events) {
if (this.joinCount > 1 || this.parent && !this.parent.isJoinPending()) {
return this.applyJoinPatch(live_patch, html, events);
}
let newChildren = dom_default.findPhxChildrenInFragment(html, this.id).filter((toEl) => {
let fromEl = toEl.id && this.el.querySelector(`[id="${toEl.id}"]`);
let phxStatic = fromEl && fromEl.getAttribute(PHX_STATIC);
if (phxStatic) {
toEl.setAttribute(PHX_STATIC, phxStatic);
}
return this.joinChild(toEl);
});
if (newChildren.length === 0) {
if (this.parent) {
this.root.pendingJoinOps.push([this, () => this.applyJoinPatch(live_patch, html, events)]);
this.parent.ackJoin(this);
} else {
this.onAllChildJoinsComplete();
this.applyJoinPatch(live_patch, html, events);
}
} else {
this.root.pendingJoinOps.push([this, () => this.applyJoinPatch(live_patch, html, events)]);
}
}
attachTrueDocEl() {
this.el = dom_default.byId(this.id);
this.el.setAttribute(PHX_ROOT_ID, this.root.id);
}
applyJoinPatch(live_patch, html, events) {
this.attachTrueDocEl();
let patch = new DOMPatch(this, this.el, this.id, html, null);
patch.markPrunableContentForRemoval();
this.performPatch(patch, false);
this.joinNewChildren();
dom_default.all(this.el, `[${this.binding(PHX_HOOK)}], [data-phx-${PHX_HOOK}]`, (hookEl) => {
let hook = this.addHook(hookEl);
if (hook) {
hook.__mounted();
}
});
this.joinPending = false;
this.liveSocket.dispatchEvents(events);
this.applyPendingUpdates();
if (live_patch) {
let { kind, to } = live_patch;
this.liveSocket.historyPatch(to, kind);
}
this.hideLoader();
if (this.joinCount > 1) {
this.triggerReconnected();
}
this.stopCallback();
}
triggerBeforeUpdateHook(fromEl, toEl) {
this.liveSocket.triggerDOM("onBeforeElUpdated", [fromEl, toEl]);
let hook = this.getHook(fromEl);
let isIgnored = hook && dom_default.isIgnored(fromEl, this.binding(PHX_UPDATE));
if (hook && !fromEl.isEqualNode(toEl) && !(isIgnored && isEqualObj(fromEl.dataset, toEl.dataset))) {
hook.__beforeUpdate();
return hook;
}
}
performPatch(patch, pruneCids) {
let removedEls = [];
let phxChildrenAdded = false;
let updatedHookIds = /* @__PURE__ */ new Set();
patch.after("added", (el) => {
this.liveSocket.triggerDOM("onNodeAdded", [el]);
let newHook = this.addHook(el);
if (newHook) {
newHook.__mounted();
}
});
patch.after("phxChildAdded", (el) => {
if (dom_default.isPhxSticky(el)) {
this.liveSocket.joinRootViews();
} else {
phxChildrenAdded = true;
}
});
patch.before("updated", (fromEl, toEl) => {
let hook = this.triggerBeforeUpdateHook(fromEl, toEl);
if (hook) {
updatedHookIds.add(fromEl.id);
}
});
patch.after("updated", (el) => {
if (updatedHookIds.has(el.id)) {
this.getHook(el).__updated();
}
});
patch.after("discarded", (el) => {
if (el.nodeType === Node.ELEMENT_NODE) {
removedEls.push(el);
}
});
patch.after("transitionsDiscarded", (els) => this.afterElementsRemoved(els, pruneCids));
patch.perform();
this.afterElementsRemoved(removedEls, pruneCids);
return phxChildrenAdded;
}
afterElementsRemoved(elements, pruneCids) {
let destroyedCIDs = [];
elements.forEach((parent) => {
let components = dom_default.all(parent, `[${PHX_COMPONENT}]`);
components.concat(parent).forEach((el) => {
let cid = this.componentID(el);
if (isCid(cid) && destroyedCIDs.indexOf(cid) === -1) {
destroyedCIDs.push(cid);
}
let hook = this.getHook(el);
hook && this.destroyHook(hook);
});
});
if (pruneCids) {
this.maybePushComponentsDestroyed(destroyedCIDs);
}
}
joinNewChildren() {
dom_default.findPhxChildren(this.el, this.id).forEach((el) => this.joinChild(el));
}
getChildById(id) {
return this.root.children[this.id][id];
}
getDescendentByEl(el) {
if (el.id === this.id) {
return this;
} else {
return this.children[el.getAttribute(PHX_PARENT_ID)][el.id];
}
}
destroyDescendent(id) {
for (let parentId in this.root.children) {
for (let childId in this.root.children[parentId]) {
if (childId === id) {
return this.root.children[parentId][childId].destroy();
}
}
}
}
joinChild(el) {
let child = this.getChildById(el.id);
if (!child) {
let view = new View(el, this.liveSocket, this);
this.root.children[this.id][view.id] = view;
view.join();
this.childJoins++;
return true;
}
}
isJoinPending() {
return this.joinPending;
}
ackJoin(_child) {
this.childJoins--;
if (this.childJoins === 0) {
if (this.parent) {
this.parent.ackJoin(this);
} else {
this.onAllChildJoinsComplete();
}
}
}
onAllChildJoinsComplete() {
this.joinCallback(() => {
this.pendingJoinOps.forEach(([view, op]) => {
if (!view.isDestroyed()) {
op();
}
});
this.pendingJoinOps = [];
});
}
update(diff, events) {
if (this.isJoinPending() || this.liveSocket.hasPendingLink()) {
return this.pendingDiffs.push({ diff, events });
}
this.rendered.mergeDiff(diff);
let phxChildrenAdded = false;
if (this.rendered.isComponentOnlyDiff(diff)) {
this.liveSocket.time("component patch complete", () => {
let parentCids = dom_default.findParentCIDs(this.el, this.rendered.componentCIDs(diff));
parentCids.forEach((parentCID) => {
if (this.componentPatch(this.rendered.getComponent(diff, parentCID), parentCID)) {
phxChildrenAdded = true;
}
});
});
} else if (!isEmpty(diff)) {
this.liveSocket.time("full patch complete", () => {
let html = this.renderContainer(diff, "update");
let patch = new DOMPatch(this, this.el, this.id, html, null);
phxChildrenAdded = this.performPatch(patch, true);
});
}
this.liveSocket.dispatchEvents(events);
if (phxChildrenAdded) {
this.joinNewChildren();
}
}
renderContainer(diff, kind) {
return this.liveSocket.time(`toString diff (${kind})`, () => {
let tag = this.el.tagName;
let cids = diff ? this.rendered.componentCIDs(diff).concat(this.pruningCIDs) : null;
let html = this.rendered.toString(cids);
return `<${tag}>${html}</${tag}>`;
});
}
componentPatch(diff, cid) {
if (isEmpty(diff))
return false;
let html = this.rendered.componentToString(cid);
let patch = new DOMPatch(this, this.el, this.id, html, cid);
let childrenAdded = this.performPatch(patch, true);
return childrenAdded;
}
getHook(el) {
return this.viewHooks[ViewHook.elementID(el)];
}
addHook(el) {
if (ViewHook.elementID(el) || !el.getAttribute) {
return;
}
let hookName = el.getAttribute(`data-phx-${PHX_HOOK}`) || el.getAttribute(this.binding(PHX_HOOK));
if (hookName && !this.ownsElement(el)) {
return;
}
let callbacks = this.liveSocket.getHookCallbacks(hookName);
if (callbacks) {
if (!el.id) {
logError(`no DOM ID for hook "${hookName}". Hooks require a unique ID on each element.`, el);
}
let hook = new ViewHook(this, el, callbacks);
this.viewHooks[ViewHook.elementID(hook.el)] = hook;
return hook;
} else if (hookName !== null) {
logError(`unknown hook found for "${hookName}"`, el);
}
}
destroyHook(hook) {
hook.__destroyed();
hook.__cleanup__();
delete this.viewHooks[ViewHook.elementID(hook.el)];
}
applyPendingUpdates() {
this.pendingDiffs.forEach(({ diff, events }) => this.update(diff, events));
this.pendingDiffs = [];
}
onChannel(event, cb) {
this.liveSocket.onChannel(this.channel, event, (resp) => {
if (this.isJoinPending()) {
this.root.pendingJoinOps.push([this, () => cb(resp)]);
} else {
this.liveSocket.requestDOMUpdate(() => cb(resp));
}
});
}
bindChannel() {
this.liveSocket.onChannel(this.channel, "diff", (rawDiff) => {
this.liveSocket.requestDOMUpdate(() => {
this.applyDiff("update", rawDiff, ({ diff, events }) => this.update(diff, events));
});
});
this.onChannel("redirect", ({ to, flash }) => this.onRedirect({ to, flash }));
this.onChannel("live_patch", (redir) => this.onLivePatch(redir));
this.onChannel("live_redirect", (redir) => this.onLiveRedirect(redir));
this.channel.onError((reason) => this.onError(reason));
this.channel.onClose((reason) => this.onClose(reason));
}
destroyAllChildren() {
for (let id in this.root.children[this.id]) {
this.getChildById(id).destroy();
}
}
onLiveRedirect(redir) {
let { to, kind, flash } = redir;
let url = this.expandURL(to);
this.liveSocket.historyRedirect(url, kind, flash);
}
onLivePatch(redir) {
let { to, kind } = redir;
this.href = this.expandURL(to);
this.liveSocket.historyPatch(to, kind);
}
expandURL(to) {
return to.startsWith("/") ? `${window.location.protocol}//${window.location.host}${to}` : to;
}
onRedirect({ to, flash }) {
this.liveSocket.redirect(to, flash);
}
isDestroyed() {
return this.destroyed;
}
join(callback) {
if (this.isMain()) {
this.stopCallback = this.liveSocket.withPageLoading({ to: this.href, kind: "initial" });
}
this.joinCallback = (onDone) => {
onDone = onDone || function() {
};
callback ? callback(this.joinCount, onDone) : onDone();
};
this.liveSocket.wrapPush(this, { timeout: false }, () => {
return this.channel.join().receive("ok", (data) => {
if (!this.isDestroyed()) {
this.liveSocket.requestDOMUpdate(() => this.onJoin(data));
}
}).receive("error", (resp) => !this.isDestroyed() && this.onJoinError(resp)).receive("timeout", () => !this.isDestroyed() && this.onJoinError({ reason: "timeout" }));
});
}
onJoinError(resp) {
if (resp.reason === "unauthorized" || resp.reason === "stale") {
this.log("error", () => ["unauthorized live_redirect. Falling back to page request", resp]);
return this.onRedirect({ to: this.href });
}
if (resp.redirect || resp.live_redirect) {
this.joinPending = false;
this.channel.leave();
}
if (resp.redirect) {
return this.onRedirect(resp.redirect);
}
if (resp.live_redirect) {
return this.onLiveRedirect(resp.live_redirect);
}
this.log("error", () => ["unable to join", resp]);
return this.liveSocket.reloadWithJitter(this);
}
onClose(reason) {
if (this.isDestroyed()) {
return;
}
if (this.isJoinPending() && document.visibilityState !== "hidden" || this.liveSocket.hasPendingLink() && reason !== "leave") {
return this.liveSocket.reloadWithJitter(this);
}
this.destroyAllChildren();
this.liveSocket.dropActiveElement(this);
if (document.activeElement) {
document.activeElement.blur();
}
if (this.liveSocket.isUnloaded()) {
this.showLoader(BEFORE_UNLOAD_LOADER_TIMEOUT);
}
}
onError(reason) {
this.onClose(reason);
this.log("error", () => ["view crashed", reason]);
if (!this.liveSocket.isUnloaded()) {
this.displayError();
}
}
displayError() {
if (this.isMain()) {
dom_default.dispatchEvent(window, "phx:page-loading-start", { to: this.href, kind: "error" });
}
this.showLoader();
this.setContainerClasses(PHX_DISCONNECTED_CLASS, PHX_ERROR_CLASS);
}
pushWithReply(refGenerator, event, payload, onReply = function() {
}) {
if (!this.isConnected()) {
return;
}
let [ref, [el], opts] = refGenerator ? refGenerator() : [null, [], {}];
let onLoadingDone = function() {
};
if (opts.page_loading || el && el.getAttribute(this.binding(PHX_PAGE_LOADING)) !== null) {
onLoadingDone = this.liveSocket.withPageLoading({ kind: "element", target: el });
}
if (typeof payload.cid !== "number") {
delete payload.cid;
}
return this.liveSocket.wrapPush(this, { timeout: true }, () => {
return this.channel.push(event, payload, PUSH_TIMEOUT).receive("ok", (resp) => {
if (ref !== null) {
this.undoRefs(ref);
}
let finish = (hookReply) => {
if (resp.redirect) {
this.onRedirect(resp.redirect);
}
if (resp.live_patch) {
this.onLivePatch(resp.live_patch);
}
if (resp.live_redirect) {
this.onLiveRedirect(resp.live_redirect);
}
onLoadingDone();
onReply(resp, hookReply);
};
if (resp.diff) {
this.liveSocket.requestDOMUpdate(() => {
let hookReply = this.applyDiff("update", resp.diff, ({ diff, events }) => {
this.update(diff, events);
});
finish(hookReply);
});
} else {
finish(null);
}
});
});
}
undoRefs(ref) {
dom_default.all(document, `[${PHX_REF_SRC}="${this.id}"][${PHX_REF}="${ref}"]`, (el) => {
let disabledVal = el.getAttribute(PHX_DISABLED);
el.removeAttribute(PHX_REF);
el.removeAttribute(PHX_REF_SRC);
if (el.getAttribute(PHX_READONLY) !== null) {
el.readOnly = false;
el.removeAttribute(PHX_READONLY);
}
if (disabledVal !== null) {
el.disabled = disabledVal === "true" ? true : false;
el.removeAttribute(PHX_DISABLED);
}
PHX_EVENT_CLASSES.forEach((className) => dom_default.removeClass(el, className));
let disableRestore = el.getAttribute(PHX_DISABLE_WITH_RESTORE);
if (disableRestore !== null) {
el.innerText = disableRestore;
el.removeAttribute(PHX_DISABLE_WITH_RESTORE);
}
let toEl = dom_default.private(el, PHX_REF);
if (toEl) {
let hook = this.triggerBeforeUpdateHook(el, toEl);
DOMPatch.patchEl(el, toEl, this.liveSocket.getActiveElement());
if (hook) {
hook.__updated();
}
dom_default.deletePrivate(el, PHX_REF);
}
});
}
putRef(elements, event, opts = {}) {
let newRef = this.ref++;
let disableWith = this.binding(PHX_DISABLE_WITH);
if (opts.loading) {
elements = elements.concat(dom_default.all(document, opts.loading));
}
elements.forEach((el) => {
el.classList.add(`phx-${event}-loading`);
el.setAttribute(PHX_REF, newRef);
el.setAttribute(PHX_REF_SRC, this.el.id);
let disableText = el.getAttribute(disableWith);
if (disableText !== null) {
if (!el.getAttribute(PHX_DISABLE_WITH_RESTORE)) {
el.setAttribute(PHX_DISABLE_WITH_RESTORE, el.innerText);
}
if (disableText !== "") {
el.innerText = disableText;
}
el.setAttribute("disabled", "");
}
});
return [newRef, elements, opts];
}
componentID(el) {
let cid = el.getAttribute && el.getAttribute(PHX_COMPONENT);
return cid ? parseInt(cid) : null;
}
targetComponentID(target, targetCtx, opts = {}) {
if (isCid(targetCtx)) {
return targetCtx;
}
let cidOrSelector = target.getAttribute(this.binding("target"));
if (isCid(cidOrSelector)) {
return parseInt(cidOrSelector);
} else if (targetCtx && (cidOrSelector !== null || opts.target)) {
return this.closestComponentID(targetCtx);
} else {
return null;
}
}
closestComponentID(targetCtx) {
if (isCid(targetCtx)) {
return targetCtx;
} else if (targetCtx) {
return maybe(targetCtx.closest(`[${PHX_COMPONENT}]`), (el) => this.ownsElement(el) && this.componentID(el));
} else {
return null;
}
}
pushHookEvent(targetCtx, event, payload, onReply) {
if (!this.isConnected()) {
this.log("hook", () => ["unable to push hook event. LiveView not connected", event, payload]);
return false;
}
let [ref, els, opts] = this.putRef([], "hook");
this.pushWithReply(() => [ref, els, opts], "event", {
type: "hook",
event,
value: payload,
cid: this.closestComponentID(targetCtx)
}, (resp, reply) => onReply(reply, ref));
return ref;
}
extractMeta(el, meta, value) {
let prefix = this.binding("value-");
for (let i = 0; i < el.attributes.length; i++) {
if (!meta) {
meta = {};
}
let name = el.attributes[i].name;
if (name.startsWith(prefix)) {
meta[name.replace(prefix, "")] = el.getAttribute(name);
}
}
if (el.value !== void 0) {
if (!meta) {
meta = {};
}
meta.value = el.value;
if (el.tagName === "INPUT" && CHECKABLE_INPUTS.indexOf(el.type) >= 0 && !el.checked) {
delete meta.value;
}
}
if (value) {
if (!meta) {
meta = {};
}
for (let key in value) {
meta[key] = value[key];
}
}
return meta;
}
pushEvent(type, el, targetCtx, phxEvent, meta, opts = {}) {
this.pushWithReply(() => this.putRef([el], type, opts), "event", {
type,
event: phxEvent,
value: this.extractMeta(el, meta, opts.value),
cid: this.targetComponentID(el, targetCtx, opts)
});
}
pushFileProgress(fileEl, entryRef, progress, onReply = function() {
}) {
this.liveSocket.withinOwners(fileEl.form, (view, targetCtx) => {
view.pushWithReply(null, "progress", {
event: fileEl.getAttribute(view.binding(PHX_PROGRESS)),
ref: fileEl.getAttribute(PHX_UPLOAD_REF),
entry_ref: entryRef,
progress,
cid: view.targetComponentID(fileEl.form, targetCtx)
}, onReply);
});
}
pushInput(inputEl, targetCtx, forceCid, phxEvent, opts, callback) {
let uploads;
let cid = isCid(forceCid) ? forceCid : this.targetComponentID(inputEl.form, targetCtx);
let refGenerator = () => this.putRef([inputEl, inputEl.form], "change", opts);
let formData = serializeForm(inputEl.form, { _target: opts._target });
if (dom_default.isUploadInput(inputEl) && inputEl.files && inputEl.files.length > 0) {
LiveUploader.trackFiles(inputEl, Array.from(inputEl.files));
}
uploads = LiveUploader.serializeUploads(inputEl);
let event = {
type: "form",
event: phxEvent,
value: formData,
uploads,
cid
};
this.pushWithReply(refGenerator, "event", event, (resp) => {
dom_default.showError(inputEl, this.liveSocket.binding(PHX_FEEDBACK_FOR));
if (dom_default.isUploadInput(inputEl) && inputEl.getAttribute("data-phx-auto-upload") !== null) {
if (LiveUploader.filesAwaitingPreflight(inputEl).length > 0) {
let [ref, _els] = refGenerator();
this.uploadFiles(inputEl.form, targetCtx, ref, cid, (_uploads) => {
callback && callback(resp);
this.triggerAwaitingSubmit(inputEl.form);
});
}
} else {
callback && callback(resp);
}
});
}
triggerAwaitingSubmit(formEl) {
let awaitingSubmit = this.getScheduledSubmit(formEl);
if (awaitingSubmit) {
let [_el, _ref, _opts, callback] = awaitingSubmit;
this.cancelSubmit(formEl);
callback();
}
}
getScheduledSubmit(formEl) {
return this.formSubmits.find(([el, _ref, _opts, _callback]) => el.isSameNode(formEl));
}
scheduleSubmit(formEl, ref, opts, callback) {
if (this.getScheduledSubmit(formEl)) {
return true;
}
this.formSubmits.push([formEl, ref, opts, callback]);
}
cancelSubmit(formEl) {
this.formSubmits = this.formSubmits.filter(([el, ref, _callback]) => {
if (el.isSameNode(formEl)) {
this.undoRefs(ref);
return false;
} else {
return true;
}
});
}
pushFormSubmit(formEl, targetCtx, phxEvent, opts, onReply) {
let filterIgnored = (el) => {
let userIgnored = closestPhxBinding(el, `${this.binding(PHX_UPDATE)}=ignore`, el.form);
return !(userIgnored || closestPhxBinding(el, "data-phx-update=ignore", el.form));
};
let filterDisables = (el) => {
return el.hasAttribute(this.binding(PHX_DISABLE_WITH));
};
let filterButton = (el) => el.tagName == "BUTTON";
let filterInput = (el) => ["INPUT", "TEXTAREA", "SELECT"].includes(el.tagName);
let refGenerator = () => {
let formElements = Array.from(formEl.elements);
let disables = formElements.filter(filterDisables);
let buttons = formElements.filter(filterButton).filter(filterIgnored);
let inputs = formElements.filter(filterInput).filter(filterIgnored);
buttons.forEach((button) => {
button.setAttribute(PHX_DISABLED, button.disabled);
button.disabled = true;
});
inputs.forEach((input) => {
input.setAttribute(PHX_READONLY, input.readOnly);
input.readOnly = true;
if (input.files) {
input.setAttribute(PHX_DISABLED, input.disabled);
input.disabled = true;
}
});
formEl.setAttribute(this.binding(PHX_PAGE_LOADING), "");
return this.putRef([formEl].concat(disables).concat(buttons).concat(inputs), "submit", opts);
};
let cid = this.targetComponentID(formEl, targetCtx);
if (LiveUploader.hasUploadsInProgress(formEl)) {
let [ref, _els] = refGenerator();
let push = () => this.pushFormSubmit(formEl, targetCtx, phxEvent, opts, onReply);
return this.scheduleSubmit(formEl, ref, opts, push);
} else if (LiveUploader.inputsAwaitingPreflight(formEl).length > 0) {
let [ref, els] = refGenerator();
let proxyRefGen = () => [ref, els, opts];
this.uploadFiles(formEl, targetCtx, ref, cid, (_uploads) => {
let formData = serializeForm(formEl, {});
this.pushWithReply(proxyRefGen, "event", {
type: "form",
event: phxEvent,
value: formData,
cid
}, onReply);
});
} else {
let formData = serializeForm(formEl);
this.pushWithReply(refGenerator, "event", {
type: "form",
event: phxEvent,
value: formData,
cid
}, onReply);
}
}
uploadFiles(formEl, targetCtx, ref, cid, onComplete) {
let joinCountAtUpload = this.joinCount;
let inputEls = LiveUploader.activeFileInputs(formEl);
let numFileInputsInProgress = inputEls.length;
inputEls.forEach((inputEl) => {
let uploader = new LiveUploader(inputEl, this, () => {
numFileInputsInProgress--;
if (numFileInputsInProgress === 0) {
onComplete();
}
});
this.uploaders[inputEl] = uploader;
let entries = uploader.entries().map((entry) => entry.toPreflightPayload());
let payload = {
ref: inputEl.getAttribute(PHX_UPLOAD_REF),
entries,
cid: this.targetComponentID(inputEl.form, targetCtx)
};
this.log("upload", () => ["sending preflight request", payload]);
this.pushWithReply(null, "allow_upload", payload, (resp) => {
this.log("upload", () => ["got preflight response", resp]);
if (resp.error) {
this.undoRefs(ref);
let [entry_ref, reason] = resp.error;
this.log("upload", () => [`error for entry ${entry_ref}`, reason]);
} else {
let onError = (callback) => {
this.channel.onError(() => {
if (this.joinCount === joinCountAtUpload) {
callback();
}
});
};
uploader.initAdapterUpload(resp, onError, this.liveSocket);
}
});
});
}
dispatchUploads(name, filesOrBlobs) {
let inputs = dom_default.findUploadInputs(this.el).filter((el) => el.name === name);
if (inputs.length === 0) {
logError(`no live file inputs found matching the name "${name}"`);
} else if (inputs.length > 1) {
logError(`duplicate live file inputs found matching the name "${name}"`);
} else {
dom_default.dispatchEvent(inputs[0], PHX_TRACK_UPLOADS, { files: filesOrBlobs });
}
}
pushFormRecovery(form, newCid, callback) {
this.liveSocket.withinOwners(form, (view, targetCtx) => {
let input = form.elements[0];
let phxEvent = form.getAttribute(this.binding(PHX_AUTO_RECOVER)) || form.getAttribute(this.binding("change"));
js_default.exec("change", phxEvent, view, input, ["push", { _target: input.name, newCid, callback }]);
});
}
pushLinkPatch(href, targetEl, callback) {
let linkRef = this.liveSocket.setPendingLink(href);
let refGen = targetEl ? () => this.putRef([targetEl], "click") : null;
let fallback = () => this.liveSocket.redirect(window.location.href);
let push = this.pushWithReply(refGen, "live_patch", { url: href }, (resp) => {
this.liveSocket.requestDOMUpdate(() => {
if (resp.link_redirect) {
this.liveSocket.replaceMain(href, null, callback, linkRef);
} else {
if (this.liveSocket.commitPendingLink(linkRef)) {
this.href = href;
}
this.applyPendingUpdates();
callback && callback(linkRef);
}
});
});
if (push) {
push.receive("timeout", fallback);
} else {
fallback();
}
}
formsForRecovery(html) {
if (this.joinCount === 0) {
return [];
}
let phxChange = this.binding("change");
let template = document.createElement("template");
template.innerHTML = html;
return dom_default.all(this.el, `form[${phxChange}]`).filter((form) => form.id && this.ownsElement(form)).filter((form) => form.elements.length > 0).filter((form) => form.getAttribute(this.binding(PHX_AUTO_RECOVER)) !== "ignore").map((form) => {
let newForm = template.content.querySelector(`form[id="${form.id}"][${phxChange}="${form.getAttribute(phxChange)}"]`);
if (newForm) {
return [form, newForm, this.targetComponentID(newForm)];
} else {
return [form, null, null];
}
}).filter(([form, newForm, newCid]) => newForm);
}
maybePushComponentsDestroyed(destroyedCIDs) {
let willDestroyCIDs = destroyedCIDs.filter((cid) => {
return dom_default.findComponentNodeList(this.el, cid).length === 0;
});
if (willDestroyCIDs.length > 0) {
this.pruningCIDs.push(...willDestroyCIDs);
this.pushWithReply(null, "cids_will_destroy", { cids: willDestroyCIDs }, () => {
this.pruningCIDs = this.pruningCIDs.filter((cid) => willDestroyCIDs.indexOf(cid) !== -1);
let completelyDestroyCIDs = willDestroyCIDs.filter((cid) => {
return dom_default.findComponentNodeList(this.el, cid).length === 0;
});
if (completelyDestroyCIDs.length > 0) {
this.pushWithReply(null, "cids_destroyed", { cids: completelyDestroyCIDs }, (resp) => {
this.rendered.pruneCIDs(resp.cids);
});
}
});
}
}
ownsElement(el) {
return el.getAttribute(PHX_PARENT_ID) === this.id || maybe(el.closest(PHX_VIEW_SELECTOR), (node) => node.id) === this.id;
}
submitForm(form, targetCtx, phxEvent, opts = {}) {
dom_default.putPrivate(form, PHX_HAS_SUBMITTED, true);
let phxFeedback = this.liveSocket.binding(PHX_FEEDBACK_FOR);
let inputs = Array.from(form.elements);
this.liveSocket.blurActiveElement(this);
this.pushFormSubmit(form, targetCtx, phxEvent, opts, () => {
inputs.forEach((input) => dom_default.showError(input, phxFeedback));
this.liveSocket.restorePreviouslyActiveFocus();
});
}
binding(kind) {
return this.liveSocket.binding(kind);
}
};
var LiveSocket = class {
constructor(url, phxSocket, opts = {}) {
this.unloaded = false;
if (!phxSocket || phxSocket.constructor.name === "Object") {
throw new Error(`
a phoenix Socket must be provided as the second argument to the LiveSocket constructor. For example:
import {Socket} from "phoenix"
import {LiveSocket} from "phoenix_live_view"
let liveSocket = new LiveSocket("/live", Socket, {...})
`);
}
this.socket = new phxSocket(url, opts);
this.bindingPrefix = opts.bindingPrefix || BINDING_PREFIX;
this.opts = opts;
this.params = closure2(opts.params || {});
this.viewLogger = opts.viewLogger;
this.metadataCallbacks = opts.metadata || {};
this.defaults = Object.assign(clone(DEFAULTS), opts.defaults || {});
this.activeElement = null;
this.prevActive = null;
this.silenced = false;
this.main = null;
this.linkRef = 1;
this.clickRef = 1;
this.roots = {};
this.href = window.location.href;
this.pendingLink = null;
this.currentLocation = clone(window.location);
this.hooks = opts.hooks || {};
this.uploaders = opts.uploaders || {};
this.loaderTimeout = opts.loaderTimeout || LOADER_TIMEOUT;
this.maxReloads = opts.maxReloads || MAX_RELOADS;
this.reloadJitterMin = opts.reloadJitterMin || RELOAD_JITTER_MIN;
this.reloadJitterMax = opts.reloadJitterMax || RELOAD_JITTER_MAX;
this.failsafeJitter = opts.failsafeJitter || FAILSAFE_JITTER;
this.localStorage = opts.localStorage || window.localStorage;
this.sessionStorage = opts.sessionStorage || window.sessionStorage;
this.boundTopLevelEvents = false;
this.domCallbacks = Object.assign({ onNodeAdded: closure2(), onBeforeElUpdated: closure2() }, opts.dom || {});
this.transitions = new TransitionSet();
window.addEventListener("pagehide", (_e) => {
this.unloaded = true;
});
this.socket.onOpen(() => {
if (this.isUnloaded()) {
window.location.reload();
}
});
}
isProfileEnabled() {
return this.sessionStorage.getItem(PHX_LV_PROFILE) === "true";
}
isDebugEnabled() {
return this.sessionStorage.getItem(PHX_LV_DEBUG) === "true";
}
enableDebug() {
this.sessionStorage.setItem(PHX_LV_DEBUG, "true");
}
enableProfiling() {
this.sessionStorage.setItem(PHX_LV_PROFILE, "true");
}
disableDebug() {
this.sessionStorage.removeItem(PHX_LV_DEBUG);
}
disableProfiling() {
this.sessionStorage.removeItem(PHX_LV_PROFILE);
}
enableLatencySim(upperBoundMs) {
this.enableDebug();
console.log("latency simulator enabled for the duration of this browser session. Call disableLatencySim() to disable");
this.sessionStorage.setItem(PHX_LV_LATENCY_SIM, upperBoundMs);
}
disableLatencySim() {
this.sessionStorage.removeItem(PHX_LV_LATENCY_SIM);
}
getLatencySim() {
let str = this.sessionStorage.getItem(PHX_LV_LATENCY_SIM);
return str ? parseInt(str) : null;
}
getSocket() {
return this.socket;
}
connect() {
let doConnect = () => {
if (this.joinRootViews()) {
this.bindTopLevelEvents();
this.socket.connect();
}
};
if (["complete", "loaded", "interactive"].indexOf(document.readyState) >= 0) {
doConnect();
} else {
document.addEventListener("DOMContentLoaded", () => doConnect());
}
}
disconnect(callback) {
this.socket.disconnect(callback);
}
execJS(el, encodedJS, eventType = null) {
this.owner(el, (view) => js_default.exec(eventType, encodedJS, view, el));
}
triggerDOM(kind, args) {
this.domCallbacks[kind](...args);
}
time(name, func) {
if (!this.isProfileEnabled() || !console.time) {
return func();
}
console.time(name);
let result = func();
console.timeEnd(name);
return result;
}
log(view, kind, msgCallback) {
if (this.viewLogger) {
let [msg, obj] = msgCallback();
this.viewLogger(view, kind, msg, obj);
} else if (this.isDebugEnabled()) {
let [msg, obj] = msgCallback();
debug(view, kind, msg, obj);
}
}
requestDOMUpdate(callback) {
this.transitions.after(callback);
}
transition(time, onStart, onDone = function() {
}) {
this.transitions.addTransition(time, onStart, onDone);
}
onChannel(channel, event, cb) {
channel.on(event, (data) => {
let latency = this.getLatencySim();
if (!latency) {
cb(data);
} else {
console.log(`simulating ${latency}ms of latency from server to client`);
setTimeout(() => cb(data), latency);
}
});
}
wrapPush(view, opts, push) {
let latency = this.getLatencySim();
let oldJoinCount = view.joinCount;
if (!latency) {
if (opts.timeout) {
return push().receive("timeout", () => {
if (view.joinCount === oldJoinCount && !view.isDestroyed()) {
this.reloadWithJitter(view, () => {
this.log(view, "timeout", () => ["received timeout while communicating with server. Falling back to hard refresh for recovery"]);
});
}
});
} else {
return push();
}
}
console.log(`simulating ${latency}ms of latency from client to server`);
let fakePush = {
receives: [],
receive(kind, cb) {
this.receives.push([kind, cb]);
}
};
setTimeout(() => {
if (view.isDestroyed()) {
return;
}
fakePush.receives.reduce((acc, [kind, cb]) => acc.receive(kind, cb), push());
}, latency);
return fakePush;
}
reloadWithJitter(view, log) {
view.destroy();
this.disconnect();
let minMs = this.reloadJitterMin;
let maxMs = this.reloadJitterMax;
let afterMs = Math.floor(Math.random() * (maxMs - minMs + 1)) + minMs;
let tries = browser_default.updateLocal(this.localStorage, window.location.pathname, CONSECUTIVE_RELOADS, 0, (count) => count + 1);
log ? log() : this.log(view, "join", () => [`encountered ${tries} consecutive reloads`]);
if (tries > this.maxReloads) {
this.log(view, "join", () => [`exceeded ${this.maxReloads} consecutive reloads. Entering failsafe mode`]);
afterMs = this.failsafeJitter;
}
setTimeout(() => {
if (this.hasPendingLink()) {
window.location = this.pendingLink;
} else {
window.location.reload();
}
}, afterMs);
}
getHookCallbacks(name) {
return name && name.startsWith("Phoenix.") ? hooks_default[name.split(".")[1]] : this.hooks[name];
}
isUnloaded() {
return this.unloaded;
}
isConnected() {
return this.socket.isConnected();
}
getBindingPrefix() {
return this.bindingPrefix;
}
binding(kind) {
return `${this.getBindingPrefix()}${kind}`;
}
channel(topic, params) {
return this.socket.channel(topic, params);
}
joinRootViews() {
let rootsFound = false;
dom_default.all(document, `${PHX_VIEW_SELECTOR}:not([${PHX_PARENT_ID}])`, (rootEl) => {
if (!this.getRootById(rootEl.id)) {
let view = this.newRootView(rootEl);
view.setHref(this.getHref());
view.join();
if (rootEl.getAttribute(PHX_MAIN)) {
this.main = view;
}
}
rootsFound = true;
});
return rootsFound;
}
redirect(to, flash) {
this.disconnect();
browser_default.redirect(to, flash);
}
replaceMain(href, flash, callback = null, linkRef = this.setPendingLink(href)) {
let oldMainEl = this.main.el;
let newMainEl = dom_default.cloneNode(oldMainEl, "");
this.main.showLoader(this.loaderTimeout);
this.main.destroy();
this.main = this.newRootView(newMainEl, flash);
this.main.setRedirect(href);
this.transitionRemoves();
this.main.join((joinCount, onDone) => {
if (joinCount === 1 && this.commitPendingLink(linkRef)) {
this.requestDOMUpdate(() => {
dom_default.findPhxSticky(document).forEach((el) => newMainEl.appendChild(el));
oldMainEl.replaceWith(newMainEl);
callback && callback();
onDone();
});
}
});
}
transitionRemoves(elements) {
let removeAttr = this.binding("remove");
elements = elements || dom_default.all(document, `[${removeAttr}]`);
elements.forEach((el) => {
if (document.body.contains(el)) {
this.execJS(el, el.getAttribute(removeAttr), "remove");
}
});
}
isPhxView(el) {
return el.getAttribute && el.getAttribute(PHX_SESSION) !== null;
}
newRootView(el, flash) {
let view = new View(el, this, null, flash);
this.roots[view.id] = view;
return view;
}
owner(childEl, callback) {
let view = maybe(childEl.closest(PHX_VIEW_SELECTOR), (el) => this.getViewByEl(el)) || this.main;
if (view) {
callback(view);
}
}
withinOwners(childEl, callback) {
this.owner(childEl, (view) => callback(view, childEl));
}
getViewByEl(el) {
let rootId = el.getAttribute(PHX_ROOT_ID);
return maybe(this.getRootById(rootId), (root) => root.getDescendentByEl(el));
}
getRootById(id) {
return this.roots[id];
}
destroyAllViews() {
for (let id in this.roots) {
this.roots[id].destroy();
delete this.roots[id];
}
}
destroyViewByEl(el) {
let root = this.getRootById(el.getAttribute(PHX_ROOT_ID));
if (root && root.id === el.id) {
root.destroy();
delete this.roots[root.id];
} else if (root) {
root.destroyDescendent(el.id);
}
}
setActiveElement(target) {
if (this.activeElement === target) {
return;
}
this.activeElement = target;
let cancel = () => {
if (target === this.activeElement) {
this.activeElement = null;
}
target.removeEventListener("mouseup", this);
target.removeEventListener("touchend", this);
};
target.addEventListener("mouseup", cancel);
target.addEventListener("touchend", cancel);
}
getActiveElement() {
if (document.activeElement === document.body) {
return this.activeElement || document.activeElement;
} else {
return document.activeElement || document.body;
}
}
dropActiveElement(view) {
if (this.prevActive && view.ownsElement(this.prevActive)) {
this.prevActive = null;
}
}
restorePreviouslyActiveFocus() {
if (this.prevActive && this.prevActive !== document.body) {
this.prevActive.focus();
}
}
blurActiveElement() {
this.prevActive = this.getActiveElement();
if (this.prevActive !== document.body) {
this.prevActive.blur();
}
}
bindTopLevelEvents() {
if (this.boundTopLevelEvents) {
return;
}
this.boundTopLevelEvents = true;
this.socket.onClose((event) => {
if (event.code === 1e3 && this.main) {
this.reloadWithJitter(this.main);
}
});
document.body.addEventListener("click", function() {
});
window.addEventListener("pageshow", (e) => {
if (e.persisted) {
this.getSocket().disconnect();
this.withPageLoading({ to: window.location.href, kind: "redirect" });
window.location.reload();
}
}, true);
this.bindNav();
this.bindClicks();
this.bindForms();
this.bind({ keyup: "keyup", keydown: "keydown" }, (e, type, view, targetEl, phxEvent, eventTarget) => {
let matchKey = targetEl.getAttribute(this.binding(PHX_KEY));
let pressedKey = e.key && e.key.toLowerCase();
if (matchKey && matchKey.toLowerCase() !== pressedKey) {
return;
}
let data = __spreadValues({ key: e.key }, this.eventMeta(type, e, targetEl));
js_default.exec(type, phxEvent, view, targetEl, ["push", { data }]);
});
this.bind({ blur: "focusout", focus: "focusin" }, (e, type, view, targetEl, phxEvent, eventTarget) => {
if (!eventTarget) {
let data = __spreadValues({ key: e.key }, this.eventMeta(type, e, targetEl));
js_default.exec(type, phxEvent, view, targetEl, ["push", { data }]);
}
});
this.bind({ blur: "blur", focus: "focus" }, (e, type, view, targetEl, targetCtx, phxEvent, phxTarget) => {
if (phxTarget === "window") {
let data = this.eventMeta(type, e, targetEl);
js_default.exec(type, phxEvent, view, targetEl, ["push", { data }]);
}
});
window.addEventListener("dragover", (e) => e.preventDefault());
window.addEventListener("drop", (e) => {
e.preventDefault();
let dropTargetId = maybe(closestPhxBinding(e.target, this.binding(PHX_DROP_TARGET)), (trueTarget) => {
return trueTarget.getAttribute(this.binding(PHX_DROP_TARGET));
});
let dropTarget = dropTargetId && document.getElementById(dropTargetId);
let files = Array.from(e.dataTransfer.files || []);
if (!dropTarget || dropTarget.disabled || files.length === 0 || !(dropTarget.files instanceof FileList)) {
return;
}
LiveUploader.trackFiles(dropTarget, files);
dropTarget.dispatchEvent(new Event("input", { bubbles: true }));
});
this.on(PHX_TRACK_UPLOADS, (e) => {
let uploadTarget = e.target;
if (!dom_default.isUploadInput(uploadTarget)) {
return;
}
let files = Array.from(e.detail.files || []).filter((f) => f instanceof File || f instanceof Blob);
LiveUploader.trackFiles(uploadTarget, files);
uploadTarget.dispatchEvent(new Event("input", { bubbles: true }));
});
}
eventMeta(eventName, e, targetEl) {
let callback = this.metadataCallbacks[eventName];
return callback ? callback(e, targetEl) : {};
}
setPendingLink(href) {
this.linkRef++;
this.pendingLink = href;
return this.linkRef;
}
commitPendingLink(linkRef) {
if (this.linkRef !== linkRef) {
return false;
} else {
this.href = this.pendingLink;
this.pendingLink = null;
return true;
}
}
getHref() {
return this.href;
}
hasPendingLink() {
return !!this.pendingLink;
}
bind(events, callback) {
for (let event in events) {
let browserEventName = events[event];
this.on(browserEventName, (e) => {
let binding = this.binding(event);
let windowBinding = this.binding(`window-${event}`);
let targetPhxEvent = e.target.getAttribute && e.target.getAttribute(binding);
if (targetPhxEvent) {
this.debounce(e.target, e, () => {
this.withinOwners(e.target, (view) => {
callback(e, event, view, e.target, targetPhxEvent, null);
});
});
} else {
dom_default.all(document, `[${windowBinding}]`, (el) => {
let phxEvent = el.getAttribute(windowBinding);
this.debounce(el, e, () => {
this.withinOwners(el, (view) => {
callback(e, event, view, el, phxEvent, "window");
});
});
});
}
});
}
}
bindClicks() {
this.bindClick("click", "click", false);
this.bindClick("mousedown", "capture-click", true);
}
bindClick(eventName, bindingName, capture) {
let click = this.binding(bindingName);
window.addEventListener(eventName, (e) => {
if (!this.isConnected()) {
return;
}
this.clickRef++;
let clickRefWas = this.clickRef;
let target = null;
if (capture) {
target = e.target.matches(`[${click}]`) ? e.target : e.target.querySelector(`[${click}]`);
} else {
target = closestPhxBinding(e.target, click);
this.dispatchClickAway(e, clickRefWas);
}
let phxEvent = target && target.getAttribute(click);
if (!phxEvent) {
return;
}
if (target.getAttribute("href") === "#") {
e.preventDefault();
}
this.debounce(target, e, () => {
this.withinOwners(target, (view) => {
js_default.exec("click", phxEvent, view, target, ["push", { data: this.eventMeta("click", e, target) }]);
});
});
}, capture);
}
dispatchClickAway(e, clickRefWas) {
let phxClickAway = this.binding("click-away");
let phxClick = this.binding("click");
dom_default.all(document, `[${phxClickAway}]`, (el) => {
if (!(el.isSameNode(e.target) || el.contains(e.target))) {
this.withinOwners(e.target, (view) => {
let phxEvent = el.getAttribute(phxClickAway);
if (js_default.isVisible(el)) {
let target = e.target.closest(`[${phxClick}]`) || e.target;
js_default.exec("click", phxEvent, view, el, ["push", { data: this.eventMeta("click", e, e.target) }]);
}
});
}
});
}
bindNav() {
if (!browser_default.canPushState()) {
return;
}
if (history.scrollRestoration) {
history.scrollRestoration = "manual";
}
let scrollTimer = null;
window.addEventListener("scroll", (_e) => {
clearTimeout(scrollTimer);
scrollTimer = setTimeout(() => {
browser_default.updateCurrentState((state) => Object.assign(state, { scroll: window.scrollY }));
}, 100);
});
window.addEventListener("popstate", (event) => {
if (!this.registerNewLocation(window.location)) {
return;
}
let { type, id, root, scroll } = event.state || {};
let href = window.location.href;
this.requestDOMUpdate(() => {
if (this.main.isConnected() && (type === "patch" && id === this.main.id)) {
this.main.pushLinkPatch(href, null);
} else {
this.replaceMain(href, null, () => {
if (root) {
this.replaceRootHistory();
}
if (typeof scroll === "number") {
setTimeout(() => {
window.scrollTo(0, scroll);
}, 0);
}
});
}
});
}, false);
window.addEventListener("click", (e) => {
let target = closestPhxBinding(e.target, PHX_LIVE_LINK);
let type = target && target.getAttribute(PHX_LIVE_LINK);
let wantsNewTab = e.metaKey || e.ctrlKey || e.button === 1;
if (!type || !this.isConnected() || !this.main || wantsNewTab) {
return;
}
let href = target.href;
let linkState = target.getAttribute(PHX_LINK_STATE);
e.preventDefault();
if (this.pendingLink === href) {
return;
}
this.requestDOMUpdate(() => {
if (type === "patch") {
this.pushHistoryPatch(href, linkState, target);
} else if (type === "redirect") {
this.historyRedirect(href, linkState);
} else {
throw new Error(`expected ${PHX_LIVE_LINK} to be "patch" or "redirect", got: ${type}`);
}
});
}, false);
}
dispatchEvent(event, payload = {}) {
dom_default.dispatchEvent(window, `phx:${event}`, payload);
}
dispatchEvents(events) {
events.forEach(([event, payload]) => this.dispatchEvent(event, payload));
}
withPageLoading(info, callback) {
dom_default.dispatchEvent(window, "phx:page-loading-start", info);
let done = () => dom_default.dispatchEvent(window, "phx:page-loading-stop", info);
return callback ? callback(done) : done;
}
pushHistoryPatch(href, linkState, targetEl) {
this.withPageLoading({ to: href, kind: "patch" }, (done) => {
this.main.pushLinkPatch(href, targetEl, (linkRef) => {
this.historyPatch(href, linkState, linkRef);
done();
});
});
}
historyPatch(href, linkState, linkRef = this.setPendingLink(href)) {
if (!this.commitPendingLink(linkRef)) {
return;
}
browser_default.pushState(linkState, { type: "patch", id: this.main.id }, href);
this.registerNewLocation(window.location);
}
historyRedirect(href, linkState, flash) {
let scroll = window.scrollY;
this.withPageLoading({ to: href, kind: "redirect" }, (done) => {
this.replaceMain(href, flash, () => {
browser_default.pushState(linkState, { type: "redirect", id: this.main.id, scroll }, href);
this.registerNewLocation(window.location);
done();
});
});
}
replaceRootHistory() {
browser_default.pushState("replace", { root: true, type: "patch", id: this.main.id });
}
registerNewLocation(newLocation) {
let { pathname, search } = this.currentLocation;
if (pathname + search === newLocation.pathname + newLocation.search) {
return false;
} else {
this.currentLocation = clone(newLocation);
return true;
}
}
bindForms() {
let iterations = 0;
this.on("submit", (e) => {
let phxEvent = e.target.getAttribute(this.binding("submit"));
if (!phxEvent) {
return;
}
e.preventDefault();
e.target.disabled = true;
this.withinOwners(e.target, (view) => {
js_default.exec("submit", phxEvent, view, e.target, ["push", {}]);
});
}, false);
for (let type of ["change", "input"]) {
this.on(type, (e) => {
let input = e.target;
let phxEvent = input.form && input.form.getAttribute(this.binding("change"));
if (!phxEvent) {
return;
}
if (input.type === "number" && input.validity && input.validity.badInput) {
return;
}
let currentIterations = iterations;
iterations++;
let { at, type: lastType } = dom_default.private(input, "prev-iteration") || {};
if (at === currentIterations - 1 && type !== lastType) {
return;
}
dom_default.putPrivate(input, "prev-iteration", { at: currentIterations, type });
this.debounce(input, e, () => {
this.withinOwners(input.form, (view) => {
dom_default.putPrivate(input, PHX_HAS_FOCUSED, true);
if (!dom_default.isTextualInput(input)) {
this.setActiveElement(input);
}
js_default.exec("change", phxEvent, view, input, ["push", { _target: e.target.name }]);
});
});
}, false);
}
}
debounce(el, event, callback) {
let phxDebounce = this.binding(PHX_DEBOUNCE);
let phxThrottle = this.binding(PHX_THROTTLE);
let defaultDebounce = this.defaults.debounce.toString();
let defaultThrottle = this.defaults.throttle.toString();
dom_default.debounce(el, event, phxDebounce, defaultDebounce, phxThrottle, defaultThrottle, callback);
}
silenceEvents(callback) {
this.silenced = true;
callback();
this.silenced = false;
}
on(event, callback) {
window.addEventListener(event, (e) => {
if (!this.silenced) {
callback(e);
}
});
}
};
var TransitionSet = class {
constructor() {
this.transitions = /* @__PURE__ */ new Set();
this.pendingOps = [];
this.reset();
}
reset() {
this.transitions.forEach((timer) => {
cancelTimeout(timer);
this.transitions.delete(timer);
});
this.flushPendingOps();
}
after(callback) {
if (this.size() === 0) {
callback();
} else {
this.pushPendingOp(callback);
}
}
addTransition(time, onStart, onDone) {
onStart();
let timer = setTimeout(() => {
this.transitions.delete(timer);
onDone();
if (this.size() === 0) {
this.flushPendingOps();
}
}, time);
this.transitions.add(timer);
}
pushPendingOp(op) {
this.pendingOps.push(op);
}
size() {
return this.transitions.size;
}
flushPendingOps() {
this.pendingOps.forEach((op) => op());
this.pendingOps = [];
}
};
// js/app.js
var import_topbar = __toESM(require_topbar());
window.$ = import_jquery3.default;
window.jQuery = import_jquery3.default;
var csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content");
var liveSocket = new LiveSocket("/live", Socket, { params: { _csrf_token: csrfToken } });
import_topbar.default.config({ barColors: { 0: "#29d" }, shadowColor: "rgba(0, 0, 0, .3)" });
window.addEventListener("phx:page-loading-start", (info) => import_topbar.default.show());
window.addEventListener("phx:page-loading-stop", (info) => import_topbar.default.hide());
liveSocket.connect();
window.liveSocket = liveSocket;
})();
/*!
* Bootstrap v5.1.3 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
/*!
* jQuery JavaScript Library v3.6.0
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
* Date: 2021-03-02T17:08Z
*/
/**
* @license MIT
* topbar 1.0.0, 2021-01-06
* http://buunguyen.github.io/topbar
* Copyright (c) 2021 Buu Nguyen
*/
/**
* Prism: Lightweight, robust, elegant syntax highlighting
*
* @license MIT <https://opensource.org/licenses/MIT>
* @author Lea Verou <https://lea.verou.me>
* @namespace
* @public
*/
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9qcXVlcnkvZGlzdC9qcXVlcnkuanMiLCAiLi4vLi4vLi4vYXNzZXRzL3ZlbmRvci9wcmlzbS5qcyIsICIuLi8uLi8uLi9hc3NldHMvdmVuZG9yL3RvcGJhci5qcyIsICIuLi8uLi8uLi9hc3NldHMvanMvYXBwLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2luZGV4LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2VudW1zLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXROb2RlTmFtZS5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9hcHBseVN0eWxlcy5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldExheW91dFJlY3QuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2NvbnRhaW5zLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pc1RhYmxlRWxlbWVudC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRQYXJlbnROb2RlLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21hdGguanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvd2l0aGluLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldEZyZXNoU2lkZU9iamVjdC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tZXJnZVBhZGRpbmdPYmplY3QuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZXhwYW5kVG9IYXNoTWFwLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9hcnJvdy5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRWYXJpYXRpb24uanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2NvbXB1dGVTdHlsZXMuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldE9wcG9zaXRlUGxhY2VtZW50LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRXaW5kb3dTY3JvbGwuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvd1Njcm9sbEJhclguanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFZpZXdwb3J0UmVjdC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRSZWN0LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pc1Njcm9sbFBhcmVudC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0U2Nyb2xsUGFyZW50LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9saXN0U2Nyb2xsUGFyZW50cy5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9yZWN0VG9DbGllbnRSZWN0LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDbGlwcGluZ1JlY3QuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvY29tcHV0ZU9mZnNldHMuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvY29tcHV0ZUF1dG9QbGFjZW1lbnQuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2ZsaXAuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2hpZGUuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL29mZnNldC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcG9wcGVyT2Zmc2V0cy5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRBbHRBeGlzLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9wcmV2ZW50T3ZlcmZsb3cuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldEhUTUxFbGVtZW50U2Nyb2xsLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXROb2RlU2Nyb2xsLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDb21wb3NpdGVSZWN0LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL29yZGVyTW9kaWZpZXJzLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2RlYm91bmNlLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2Zvcm1hdC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy92YWxpZGF0ZU1vZGlmaWVycy5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy91bmlxdWVCeS5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tZXJnZUJ5TmFtZS5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9jcmVhdGVQb3BwZXIuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvcG9wcGVyLWxpdGUuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvcG9wcGVyLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy91dGlsL2luZGV4LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy9kb20vZXZlbnQtaGFuZGxlci5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvZG9tL2RhdGEuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2Jhc2UtY29tcG9uZW50LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy91dGlsL2NvbXBvbmVudC1mdW5jdGlvbnMuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2FsZXJ0LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy9idXR0b24uanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2RvbS9tYW5pcHVsYXRvci5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvZG9tL3NlbGVjdG9yLWVuZ2luZS5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvY2Fyb3VzZWwuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2NvbGxhcHNlLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy9kcm9wZG93bi5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvdXRpbC9zY3JvbGxiYXIuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3V0aWwvYmFja2Ryb3AuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3V0aWwvZm9jdXN0cmFwLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy9tb2RhbC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvb2ZmY2FudmFzLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy91dGlsL3Nhbml0aXplci5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvdG9vbHRpcC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvcG9wb3Zlci5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvc2Nyb2xsc3B5LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy90YWIuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3RvYXN0LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9qcy9yZXBvc2l0b3J5LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9qcy9rbXhfYW5pbS5qcyIsICIuLi8uLi8uLi9hc3NldHMvanMva214X2NvbG9ycy5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXhfaHRtbC9wcml2L3N0YXRpYy9waG9lbml4X2h0bWwuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3V0aWxzLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9jb25zdGFudHMuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3B1c2guanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3RpbWVyLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9jaGFubmVsLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9hamF4LmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9sb25ncG9sbC5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXgvYXNzZXRzL2pzL3Bob2VuaXgvcHJlc2VuY2UuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3NlcmlhbGl6ZXIuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3NvY2tldC5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9jb25zdGFudHMuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvZW50cnlfdXBsb2FkZXIuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdXRpbHMuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvYnJvd3Nlci5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb20uanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdXBsb2FkX2VudHJ5LmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2xpdmVfdXBsb2FkZXIuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvaG9va3MuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvZG9tX3Bvc3RfbW9ycGhfcmVzdG9yZXIuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvbm9kZV9tb2R1bGVzL21vcnBoZG9tL2Rpc3QvbW9ycGhkb20tZXNtLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2RvbV9wYXRjaC5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9yZW5kZXJlZC5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy92aWV3X2hvb2suanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvanMuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdmlldy5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9saXZlX3NvY2tldC5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyohXG4gKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYzLjYuMFxuICogaHR0cHM6Ly9qcXVlcnkuY29tL1xuICpcbiAqIEluY2x1ZGVzIFNpenpsZS5qc1xuICogaHR0cHM6Ly9zaXp6bGVqcy5jb20vXG4gKlxuICogQ29weXJpZ2h0IE9wZW5KUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cHM6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDIxLTAzLTAyVDE3OjA4WlxuICovXG4oIGZ1bmN0aW9uKCBnbG9iYWwsIGZhY3RvcnkgKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0aWYgKCB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgd2hlcmUgYSBwcm9wZXIgYHdpbmRvd2Bcblx0XHQvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LlxuXHRcdC8vIEZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIGB3aW5kb3dgIHdpdGggYSBgZG9jdW1lbnRgXG5cdFx0Ly8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMuXG5cdFx0Ly8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC5cblx0XHQvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKFwianF1ZXJ5XCIpKHdpbmRvdyk7XG5cdFx0Ly8gU2VlIHRpY2tldCAjMTQ1NDkgZm9yIG1vcmUgaW5mby5cblx0XHRtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5kb2N1bWVudCA/XG5cdFx0XHRmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6XG5cdFx0XHRmdW5jdGlvbiggdyApIHtcblx0XHRcdFx0aWYgKCAhdy5kb2N1bWVudCApIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIFwialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudFwiICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhY3RvcnkoIHcgKTtcblx0XHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0ZmFjdG9yeSggZ2xvYmFsICk7XG5cdH1cblxuLy8gUGFzcyB0aGlzIGlmIHdpbmRvdyBpcyBub3QgZGVmaW5lZCB5ZXRcbn0gKSggdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHRoaXMsIGZ1bmN0aW9uKCB3aW5kb3csIG5vR2xvYmFsICkge1xuXG4vLyBFZGdlIDw9IDEyIC0gMTMrLCBGaXJlZm94IDw9MTggLSA0NSssIElFIDEwIC0gMTEsIFNhZmFyaSA1LjEgLSA5KywgaU9TIDYgLSA5LjFcbi8vIHRocm93IGV4Y2VwdGlvbnMgd2hlbiBub24tc3RyaWN0IGNvZGUgKGUuZy4sIEFTUC5ORVQgNC41KSBhY2Nlc3NlcyBzdHJpY3QgbW9kZVxuLy8gYXJndW1lbnRzLmNhbGxlZS5jYWxsZXIgKHRyYWMtMTMzMzUpLiBCdXQgYXMgb2YgalF1ZXJ5IDMuMCAoMjAxNiksIHN0cmljdCBtb2RlIHNob3VsZCBiZSBjb21tb25cbi8vIGVub3VnaCB0aGF0IGFsbCBzdWNoIGF0dGVtcHRzIGFyZSBndWFyZGVkIGluIGEgdHJ5IGJsb2NrLlxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnIgPSBbXTtcblxudmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuXG52YXIgc2xpY2UgPSBhcnIuc2xpY2U7XG5cbnZhciBmbGF0ID0gYXJyLmZsYXQgPyBmdW5jdGlvbiggYXJyYXkgKSB7XG5cdHJldHVybiBhcnIuZmxhdC5jYWxsKCBhcnJheSApO1xufSA6IGZ1bmN0aW9uKCBhcnJheSApIHtcblx0cmV0dXJuIGFyci5jb25jYXQuYXBwbHkoIFtdLCBhcnJheSApO1xufTtcblxuXG52YXIgcHVzaCA9IGFyci5wdXNoO1xuXG52YXIgaW5kZXhPZiA9IGFyci5pbmRleE9mO1xuXG52YXIgY2xhc3MydHlwZSA9IHt9O1xuXG52YXIgdG9TdHJpbmcgPSBjbGFzczJ0eXBlLnRvU3RyaW5nO1xuXG52YXIgaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIGZuVG9TdHJpbmcgPSBoYXNPd24udG9TdHJpbmc7XG5cbnZhciBPYmplY3RGdW5jdGlvblN0cmluZyA9IGZuVG9TdHJpbmcuY2FsbCggT2JqZWN0ICk7XG5cbnZhciBzdXBwb3J0ID0ge307XG5cbnZhciBpc0Z1bmN0aW9uID0gZnVuY3Rpb24gaXNGdW5jdGlvbiggb2JqICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9NTcsIEZpcmVmb3ggPD01MlxuXHRcdC8vIEluIHNvbWUgYnJvd3NlcnMsIHR5cGVvZiByZXR1cm5zIFwiZnVuY3Rpb25cIiBmb3IgSFRNTCA8b2JqZWN0PiBlbGVtZW50c1xuXHRcdC8vIChpLmUuLCBgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwib2JqZWN0XCIgKSA9PT0gXCJmdW5jdGlvblwiYCkuXG5cdFx0Ly8gV2UgZG9uJ3Qgd2FudCB0byBjbGFzc2lmeSAqYW55KiBET00gbm9kZSBhcyBhIGZ1bmN0aW9uLlxuXHRcdC8vIFN1cHBvcnQ6IFF0V2ViIDw9My44LjUsIFdlYktpdCA8PTUzNC4zNCwgd2todG1sdG9wZGYgdG9vbCA8PTAuMTIuNVxuXHRcdC8vIFBsdXMgZm9yIG9sZCBXZWJLaXQsIHR5cGVvZiByZXR1cm5zIFwiZnVuY3Rpb25cIiBmb3IgSFRNTCBjb2xsZWN0aW9uc1xuXHRcdC8vIChlLmcuLCBgdHlwZW9mIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiZGl2XCIpID09PSBcImZ1bmN0aW9uXCJgKS4gKGdoLTQ3NTYpXG5cdFx0cmV0dXJuIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2Ygb2JqLm5vZGVUeXBlICE9PSBcIm51bWJlclwiICYmXG5cdFx0XHR0eXBlb2Ygb2JqLml0ZW0gIT09IFwiZnVuY3Rpb25cIjtcblx0fTtcblxuXG52YXIgaXNXaW5kb3cgPSBmdW5jdGlvbiBpc1dpbmRvdyggb2JqICkge1xuXHRcdHJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7XG5cdH07XG5cblxudmFyIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50O1xuXG5cblxuXHR2YXIgcHJlc2VydmVkU2NyaXB0QXR0cmlidXRlcyA9IHtcblx0XHR0eXBlOiB0cnVlLFxuXHRcdHNyYzogdHJ1ZSxcblx0XHRub25jZTogdHJ1ZSxcblx0XHRub01vZHVsZTogdHJ1ZVxuXHR9O1xuXG5cdGZ1bmN0aW9uIERPTUV2YWwoIGNvZGUsIG5vZGUsIGRvYyApIHtcblx0XHRkb2MgPSBkb2MgfHwgZG9jdW1lbnQ7XG5cblx0XHR2YXIgaSwgdmFsLFxuXHRcdFx0c2NyaXB0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoIFwic2NyaXB0XCIgKTtcblxuXHRcdHNjcmlwdC50ZXh0ID0gY29kZTtcblx0XHRpZiAoIG5vZGUgKSB7XG5cdFx0XHRmb3IgKCBpIGluIHByZXNlcnZlZFNjcmlwdEF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA2NCssIEVkZ2UgMTgrXG5cdFx0XHRcdC8vIFNvbWUgYnJvd3NlcnMgZG9uJ3Qgc3VwcG9ydCB0aGUgXCJub25jZVwiIHByb3BlcnR5IG9uIHNjcmlwdHMuXG5cdFx0XHRcdC8vIE9uIHRoZSBvdGhlciBoYW5kLCBqdXN0IHVzaW5nIGBnZXRBdHRyaWJ1dGVgIGlzIG5vdCBlbm91Z2ggYXNcblx0XHRcdFx0Ly8gdGhlIGBub25jZWAgYXR0cmlidXRlIGlzIHJlc2V0IHRvIGFuIGVtcHR5IHN0cmluZyB3aGVuZXZlciBpdFxuXHRcdFx0XHQvLyBiZWNvbWVzIGJyb3dzaW5nLWNvbnRleHQgY29ubmVjdGVkLlxuXHRcdFx0XHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3doYXR3Zy9odG1sL2lzc3Vlcy8yMzY5XG5cdFx0XHRcdC8vIFNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNub25jZS1hdHRyaWJ1dGVzXG5cdFx0XHRcdC8vIFRoZSBgbm9kZS5nZXRBdHRyaWJ1dGVgIGNoZWNrIHdhcyBhZGRlZCBmb3IgdGhlIHNha2Ugb2Zcblx0XHRcdFx0Ly8gYGpRdWVyeS5nbG9iYWxFdmFsYCBzbyB0aGF0IGl0IGNhbiBmYWtlIGEgbm9uY2UtY29udGFpbmluZyBub2RlXG5cdFx0XHRcdC8vIHZpYSBhbiBvYmplY3QuXG5cdFx0XHRcdHZhbCA9IG5vZGVbIGkgXSB8fCBub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZSggaSApO1xuXHRcdFx0XHRpZiAoIHZhbCApIHtcblx0XHRcdFx0XHRzY3JpcHQuc2V0QXR0cmlidXRlKCBpLCB2YWwgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRkb2MuaGVhZC5hcHBlbmRDaGlsZCggc2NyaXB0ICkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggc2NyaXB0ICk7XG5cdH1cblxuXG5mdW5jdGlvbiB0b1R5cGUoIG9iaiApIHtcblx0aWYgKCBvYmogPT0gbnVsbCApIHtcblx0XHRyZXR1cm4gb2JqICsgXCJcIjtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD0yLjMgb25seSAoZnVuY3Rpb25pc2ggUmVnRXhwKVxuXHRyZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgP1xuXHRcdGNsYXNzMnR5cGVbIHRvU3RyaW5nLmNhbGwoIG9iaiApIF0gfHwgXCJvYmplY3RcIiA6XG5cdFx0dHlwZW9mIG9iajtcbn1cbi8qIGdsb2JhbCBTeW1ib2wgKi9cbi8vIERlZmluaW5nIHRoaXMgZ2xvYmFsIGluIC5lc2xpbnRyYy5qc29uIHdvdWxkIGNyZWF0ZSBhIGRhbmdlciBvZiB1c2luZyB0aGUgZ2xvYmFsXG4vLyB1bmd1YXJkZWQgaW4gYW5vdGhlciBwbGFjZSwgaXQgc2VlbXMgc2FmZXIgdG8gZGVmaW5lIGdsb2JhbCBvbmx5IGZvciB0aGlzIG1vZHVsZVxuXG5cblxudmFyXG5cdHZlcnNpb24gPSBcIjMuNi4wXCIsXG5cblx0Ly8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnlcblx0alF1ZXJ5ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xuXG5cdFx0Ly8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnXG5cdFx0Ly8gTmVlZCBpbml0IGlmIGpRdWVyeSBpcyBjYWxsZWQgKGp1c3QgYWxsb3cgZXJyb3IgdG8gYmUgdGhyb3duIGlmIG5vdCBpbmNsdWRlZClcblx0XHRyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApO1xuXHR9O1xuXG5qUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0ge1xuXG5cdC8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWRcblx0anF1ZXJ5OiB2ZXJzaW9uLFxuXG5cdGNvbnN0cnVjdG9yOiBqUXVlcnksXG5cblx0Ly8gVGhlIGRlZmF1bHQgbGVuZ3RoIG9mIGEgalF1ZXJ5IG9iamVjdCBpcyAwXG5cdGxlbmd0aDogMCxcblxuXHR0b0FycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHR9LFxuXG5cdC8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1Jcblx0Ly8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXlcblx0Z2V0OiBmdW5jdGlvbiggbnVtICkge1xuXG5cdFx0Ly8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgaW4gYSBjbGVhbiBhcnJheVxuXHRcdGlmICggbnVtID09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiBqdXN0IHRoZSBvbmUgZWxlbWVudCBmcm9tIHRoZSBzZXRcblx0XHRyZXR1cm4gbnVtIDwgMCA/IHRoaXNbIG51bSArIHRoaXMubGVuZ3RoIF0gOiB0aGlzWyBudW0gXTtcblx0fSxcblxuXHQvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrXG5cdC8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KVxuXHRwdXNoU3RhY2s6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblxuXHRcdC8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0XG5cdFx0dmFyIHJldCA9IGpRdWVyeS5tZXJnZSggdGhpcy5jb25zdHJ1Y3RvcigpLCBlbGVtcyApO1xuXG5cdFx0Ly8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSlcblx0XHRyZXQucHJldk9iamVjdCA9IHRoaXM7XG5cblx0XHQvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldFxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0Ly8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC5cblx0ZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2sgKTtcblx0fSxcblxuXHRtYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTtcblx0XHR9ICkgKTtcblx0fSxcblxuXHRzbGljZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgKTtcblx0fSxcblxuXHRmaXJzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIDAgKTtcblx0fSxcblxuXHRsYXN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggLTEgKTtcblx0fSxcblxuXHRldmVuOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5ncmVwKCB0aGlzLCBmdW5jdGlvbiggX2VsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gKCBpICsgMSApICUgMjtcblx0XHR9ICkgKTtcblx0fSxcblxuXHRvZGQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5LmdyZXAoIHRoaXMsIGZ1bmN0aW9uKCBfZWxlbSwgaSApIHtcblx0XHRcdHJldHVybiBpICUgMjtcblx0XHR9ICkgKTtcblx0fSxcblxuXHRlcTogZnVuY3Rpb24oIGkgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0aiA9ICtpICsgKCBpIDwgMCA/IGxlbiA6IDAgKTtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGogPj0gMCAmJiBqIDwgbGVuID8gWyB0aGlzWyBqIF0gXSA6IFtdICk7XG5cdH0sXG5cblx0ZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IHRoaXMuY29uc3RydWN0b3IoKTtcblx0fSxcblxuXHQvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG5cdC8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLlxuXHRwdXNoOiBwdXNoLFxuXHRzb3J0OiBhcnIuc29ydCxcblx0c3BsaWNlOiBhcnIuc3BsaWNlXG59O1xuXG5qUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsXG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyAwIF0gfHwge30sXG5cdFx0aSA9IDEsXG5cdFx0bGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcblx0XHRkZWVwID0gZmFsc2U7XG5cblx0Ly8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvblxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGRlZXAgPSB0YXJnZXQ7XG5cblx0XHQvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0XG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307XG5cdFx0aSsrO1xuXHR9XG5cblx0Ly8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpXG5cdGlmICggdHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiAmJiAhaXNGdW5jdGlvbiggdGFyZ2V0ICkgKSB7XG5cdFx0dGFyZ2V0ID0ge307XG5cdH1cblxuXHQvLyBFeHRlbmQgalF1ZXJ5IGl0c2VsZiBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNzZWRcblx0aWYgKCBpID09PSBsZW5ndGggKSB7XG5cdFx0dGFyZ2V0ID0gdGhpcztcblx0XHRpLS07XG5cdH1cblxuXHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblxuXHRcdC8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXNcblx0XHRpZiAoICggb3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdICkgIT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdFxuXHRcdFx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdFx0XHRjb3B5ID0gb3B0aW9uc1sgbmFtZSBdO1xuXG5cdFx0XHRcdC8vIFByZXZlbnQgT2JqZWN0LnByb3RvdHlwZSBwb2xsdXRpb25cblx0XHRcdFx0Ly8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcFxuXHRcdFx0XHRpZiAoIG5hbWUgPT09IFwiX19wcm90b19fXCIgfHwgdGFyZ2V0ID09PSBjb3B5ICkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzXG5cdFx0XHRcdGlmICggZGVlcCAmJiBjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvcHkgKSB8fFxuXHRcdFx0XHRcdCggY29weUlzQXJyYXkgPSBBcnJheS5pc0FycmF5KCBjb3B5ICkgKSApICkge1xuXHRcdFx0XHRcdHNyYyA9IHRhcmdldFsgbmFtZSBdO1xuXG5cdFx0XHRcdFx0Ly8gRW5zdXJlIHByb3BlciB0eXBlIGZvciB0aGUgc291cmNlIHZhbHVlXG5cdFx0XHRcdFx0aWYgKCBjb3B5SXNBcnJheSAmJiAhQXJyYXkuaXNBcnJheSggc3JjICkgKSB7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IFtdO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoICFjb3B5SXNBcnJheSAmJiAhalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHNyYyApICkge1xuXHRcdFx0XHRcdFx0Y2xvbmUgPSB7fTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmM7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvcHlJc0FycmF5ID0gZmFsc2U7XG5cblx0XHRcdFx0XHQvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW1cblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7XG5cblx0XHRcdFx0Ly8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlc1xuXHRcdFx0XHR9IGVsc2UgaWYgKCBjb3B5ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0dGFyZ2V0WyBuYW1lIF0gPSBjb3B5O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSBtb2RpZmllZCBvYmplY3Rcblx0cmV0dXJuIHRhcmdldDtcbn07XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2Vcblx0ZXhwYW5kbzogXCJqUXVlcnlcIiArICggdmVyc2lvbiArIE1hdGgucmFuZG9tKCkgKS5yZXBsYWNlKCAvXFxEL2csIFwiXCIgKSxcblxuXHQvLyBBc3N1bWUgalF1ZXJ5IGlzIHJlYWR5IHdpdGhvdXQgdGhlIHJlYWR5IG1vZHVsZVxuXHRpc1JlYWR5OiB0cnVlLFxuXG5cdGVycm9yOiBmdW5jdGlvbiggbXNnICkge1xuXHRcdHRocm93IG5ldyBFcnJvciggbXNnICk7XG5cdH0sXG5cblx0bm9vcDogZnVuY3Rpb24oKSB7fSxcblxuXHRpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHZhciBwcm90bywgQ3RvcjtcblxuXHRcdC8vIERldGVjdCBvYnZpb3VzIG5lZ2F0aXZlc1xuXHRcdC8vIFVzZSB0b1N0cmluZyBpbnN0ZWFkIG9mIGpRdWVyeS50eXBlIHRvIGNhdGNoIGhvc3Qgb2JqZWN0c1xuXHRcdGlmICggIW9iaiB8fCB0b1N0cmluZy5jYWxsKCBvYmogKSAhPT0gXCJbb2JqZWN0IE9iamVjdF1cIiApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRwcm90byA9IGdldFByb3RvKCBvYmogKTtcblxuXHRcdC8vIE9iamVjdHMgd2l0aCBubyBwcm90b3R5cGUgKGUuZy4sIGBPYmplY3QuY3JlYXRlKCBudWxsIClgKSBhcmUgcGxhaW5cblx0XHRpZiAoICFwcm90byApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIE9iamVjdHMgd2l0aCBwcm90b3R5cGUgYXJlIHBsYWluIGlmZiB0aGV5IHdlcmUgY29uc3RydWN0ZWQgYnkgYSBnbG9iYWwgT2JqZWN0IGZ1bmN0aW9uXG5cdFx0Q3RvciA9IGhhc093bi5jYWxsKCBwcm90bywgXCJjb25zdHJ1Y3RvclwiICkgJiYgcHJvdG8uY29uc3RydWN0b3I7XG5cdFx0cmV0dXJuIHR5cGVvZiBDdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgZm5Ub1N0cmluZy5jYWxsKCBDdG9yICkgPT09IE9iamVjdEZ1bmN0aW9uU3RyaW5nO1xuXHR9LFxuXG5cdGlzRW1wdHlPYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0dmFyIG5hbWU7XG5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0Ly8gRXZhbHVhdGVzIGEgc2NyaXB0IGluIGEgcHJvdmlkZWQgY29udGV4dDsgZmFsbHMgYmFjayB0byB0aGUgZ2xvYmFsIG9uZVxuXHQvLyBpZiBub3Qgc3BlY2lmaWVkLlxuXHRnbG9iYWxFdmFsOiBmdW5jdGlvbiggY29kZSwgb3B0aW9ucywgZG9jICkge1xuXHRcdERPTUV2YWwoIGNvZGUsIHsgbm9uY2U6IG9wdGlvbnMgJiYgb3B0aW9ucy5ub25jZSB9LCBkb2MgKTtcblx0fSxcblxuXHRlYWNoOiBmdW5jdGlvbiggb2JqLCBjYWxsYmFjayApIHtcblx0XHR2YXIgbGVuZ3RoLCBpID0gMDtcblxuXHRcdGlmICggaXNBcnJheUxpa2UoIG9iaiApICkge1xuXHRcdFx0bGVuZ3RoID0gb2JqLmxlbmd0aDtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKCBpIGluIG9iaiApIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb2JqO1xuXHR9LFxuXG5cdC8vIHJlc3VsdHMgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcblx0bWFrZUFycmF5OiBmdW5jdGlvbiggYXJyLCByZXN1bHRzICkge1xuXHRcdHZhciByZXQgPSByZXN1bHRzIHx8IFtdO1xuXG5cdFx0aWYgKCBhcnIgIT0gbnVsbCApIHtcblx0XHRcdGlmICggaXNBcnJheUxpa2UoIE9iamVjdCggYXJyICkgKSApIHtcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCByZXQsXG5cdFx0XHRcdFx0dHlwZW9mIGFyciA9PT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0XHRbIGFyciBdIDogYXJyXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwdXNoLmNhbGwoIHJldCwgYXJyICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHRpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyLCBpICkge1xuXHRcdHJldHVybiBhcnIgPT0gbnVsbCA/IC0xIDogaW5kZXhPZi5jYWxsKCBhcnIsIGVsZW0sIGkgKTtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRtZXJnZTogZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7XG5cdFx0dmFyIGxlbiA9ICtzZWNvbmQubGVuZ3RoLFxuXHRcdFx0aiA9IDAsXG5cdFx0XHRpID0gZmlyc3QubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBqIDwgbGVuOyBqKysgKSB7XG5cdFx0XHRmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTtcblx0XHR9XG5cblx0XHRmaXJzdC5sZW5ndGggPSBpO1xuXG5cdFx0cmV0dXJuIGZpcnN0O1xuXHR9LFxuXG5cdGdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludmVydCApIHtcblx0XHR2YXIgY2FsbGJhY2tJbnZlcnNlLFxuXHRcdFx0bWF0Y2hlcyA9IFtdLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGgsXG5cdFx0XHRjYWxsYmFja0V4cGVjdCA9ICFpbnZlcnQ7XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zXG5cdFx0Ly8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb25cblx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdGNhbGxiYWNrSW52ZXJzZSA9ICFjYWxsYmFjayggZWxlbXNbIGkgXSwgaSApO1xuXHRcdFx0aWYgKCBjYWxsYmFja0ludmVyc2UgIT09IGNhbGxiYWNrRXhwZWN0ICkge1xuXHRcdFx0XHRtYXRjaGVzLnB1c2goIGVsZW1zWyBpIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0Y2hlcztcblx0fSxcblxuXHQvLyBhcmcgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcblx0bWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7XG5cdFx0dmFyIGxlbmd0aCwgdmFsdWUsXG5cdFx0XHRpID0gMCxcblx0XHRcdHJldCA9IFtdO1xuXG5cdFx0Ly8gR28gdGhyb3VnaCB0aGUgYXJyYXksIHRyYW5zbGF0aW5nIGVhY2ggb2YgdGhlIGl0ZW1zIHRvIHRoZWlyIG5ldyB2YWx1ZXNcblx0XHRpZiAoIGlzQXJyYXlMaWtlKCBlbGVtcyApICkge1xuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXQucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCxcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICggaSBpbiBlbGVtcyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRcdHJldHVybiBmbGF0KCByZXQgKTtcblx0fSxcblxuXHQvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHNcblx0Z3VpZDogMSxcblxuXHQvLyBqUXVlcnkuc3VwcG9ydCBpcyBub3QgdXNlZCBpbiBDb3JlIGJ1dCBvdGhlciBwcm9qZWN0cyBhdHRhY2ggdGhlaXJcblx0Ly8gcHJvcGVydGllcyB0byBpdCBzbyBpdCBuZWVkcyB0byBleGlzdC5cblx0c3VwcG9ydDogc3VwcG9ydFxufSApO1xuXG5pZiAoIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiApIHtcblx0alF1ZXJ5LmZuWyBTeW1ib2wuaXRlcmF0b3IgXSA9IGFyclsgU3ltYm9sLml0ZXJhdG9yIF07XG59XG5cbi8vIFBvcHVsYXRlIHRoZSBjbGFzczJ0eXBlIG1hcFxualF1ZXJ5LmVhY2goIFwiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2xcIi5zcGxpdCggXCIgXCIgKSxcblx0ZnVuY3Rpb24oIF9pLCBuYW1lICkge1xuXHRcdGNsYXNzMnR5cGVbIFwiW29iamVjdCBcIiArIG5hbWUgKyBcIl1cIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHR9ICk7XG5cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKCBvYmogKSB7XG5cblx0Ly8gU3VwcG9ydDogcmVhbCBpT1MgOC4yIG9ubHkgKG5vdCByZXByb2R1Y2libGUgaW4gc2ltdWxhdG9yKVxuXHQvLyBgaW5gIGNoZWNrIHVzZWQgdG8gcHJldmVudCBKSVQgZXJyb3IgKGdoLTIxNDUpXG5cdC8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlc1xuXHQvLyByZWdhcmRpbmcgTm9kZWxpc3QgbGVuZ3RoIGluIElFXG5cdHZhciBsZW5ndGggPSAhIW9iaiAmJiBcImxlbmd0aFwiIGluIG9iaiAmJiBvYmoubGVuZ3RoLFxuXHRcdHR5cGUgPSB0b1R5cGUoIG9iaiApO1xuXG5cdGlmICggaXNGdW5jdGlvbiggb2JqICkgfHwgaXNXaW5kb3coIG9iaiApICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB0eXBlID09PSBcImFycmF5XCIgfHwgbGVuZ3RoID09PSAwIHx8XG5cdFx0dHlwZW9mIGxlbmd0aCA9PT0gXCJudW1iZXJcIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajtcbn1cbnZhciBTaXp6bGUgPVxuLyohXG4gKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSB2Mi4zLjZcbiAqIGh0dHBzOi8vc2l6emxlanMuY29tL1xuICpcbiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cHM6Ly9qcy5mb3VuZGF0aW9uL1xuICpcbiAqIERhdGU6IDIwMjEtMDItMTZcbiAqL1xuKCBmdW5jdGlvbiggd2luZG93ICkge1xudmFyIGksXG5cdHN1cHBvcnQsXG5cdEV4cHIsXG5cdGdldFRleHQsXG5cdGlzWE1MLFxuXHR0b2tlbml6ZSxcblx0Y29tcGlsZSxcblx0c2VsZWN0LFxuXHRvdXRlcm1vc3RDb250ZXh0LFxuXHRzb3J0SW5wdXQsXG5cdGhhc0R1cGxpY2F0ZSxcblxuXHQvLyBMb2NhbCBkb2N1bWVudCB2YXJzXG5cdHNldERvY3VtZW50LFxuXHRkb2N1bWVudCxcblx0ZG9jRWxlbSxcblx0ZG9jdW1lbnRJc0hUTUwsXG5cdHJidWdneVFTQSxcblx0cmJ1Z2d5TWF0Y2hlcyxcblx0bWF0Y2hlcyxcblx0Y29udGFpbnMsXG5cblx0Ly8gSW5zdGFuY2Utc3BlY2lmaWMgZGF0YVxuXHRleHBhbmRvID0gXCJzaXp6bGVcIiArIDEgKiBuZXcgRGF0ZSgpLFxuXHRwcmVmZXJyZWREb2MgPSB3aW5kb3cuZG9jdW1lbnQsXG5cdGRpcnJ1bnMgPSAwLFxuXHRkb25lID0gMCxcblx0Y2xhc3NDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRjb21waWxlckNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0bm9ubmF0aXZlU2VsZWN0b3JDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiAwO1xuXHR9LFxuXG5cdC8vIEluc3RhbmNlIG1ldGhvZHNcblx0aGFzT3duID0gKCB7fSApLmhhc093blByb3BlcnR5LFxuXHRhcnIgPSBbXSxcblx0cG9wID0gYXJyLnBvcCxcblx0cHVzaE5hdGl2ZSA9IGFyci5wdXNoLFxuXHRwdXNoID0gYXJyLnB1c2gsXG5cdHNsaWNlID0gYXJyLnNsaWNlLFxuXG5cdC8vIFVzZSBhIHN0cmlwcGVkLWRvd24gaW5kZXhPZiBhcyBpdCdzIGZhc3RlciB0aGFuIG5hdGl2ZVxuXHQvLyBodHRwczovL2pzcGVyZi5jb20vdGhvci1pbmRleG9mLXZzLWZvci81XG5cdGluZGV4T2YgPSBmdW5jdGlvbiggbGlzdCwgZWxlbSApIHtcblx0XHR2YXIgaSA9IDAsXG5cdFx0XHRsZW4gPSBsaXN0Lmxlbmd0aDtcblx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGlmICggbGlzdFsgaSBdID09PSBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIC0xO1xuXHR9LFxuXG5cdGJvb2xlYW5zID0gXCJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58XCIgK1xuXHRcdFwiaXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZFwiLFxuXG5cdC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnNcblxuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jd2hpdGVzcGFjZVxuXHR3aGl0ZXNwYWNlID0gXCJbXFxcXHgyMFxcXFx0XFxcXHJcXFxcblxcXFxmXVwiLFxuXG5cdC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3Mtc3ludGF4LTMvI2lkZW50LXRva2VuLWRpYWdyYW1cblx0aWRlbnRpZmllciA9IFwiKD86XFxcXFxcXFxbXFxcXGRhLWZBLUZdezEsNn1cIiArIHdoaXRlc3BhY2UgK1xuXHRcdFwiP3xcXFxcXFxcXFteXFxcXHJcXFxcblxcXFxmXXxbXFxcXHctXXxbXlxcMC1cXFxceDdmXSkrXCIsXG5cblx0Ly8gQXR0cmlidXRlIHNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzXG5cdGF0dHJpYnV0ZXMgPSBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqKFwiICsgaWRlbnRpZmllciArIFwiKSg/OlwiICsgd2hpdGVzcGFjZSArXG5cblx0XHQvLyBPcGVyYXRvciAoY2FwdHVyZSAyKVxuXHRcdFwiKihbKl4kfCF+XT89KVwiICsgd2hpdGVzcGFjZSArXG5cblx0XHQvLyBcIkF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBiZSBDU1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV1cblx0XHQvLyBvciBzdHJpbmdzIFtjYXB0dXJlIDMgb3IgY2FwdHVyZSA0XVwiXG5cdFx0XCIqKD86JygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwifChcIiArIGlkZW50aWZpZXIgKyBcIikpfClcIiArXG5cdFx0d2hpdGVzcGFjZSArIFwiKlxcXFxdXCIsXG5cblx0cHNldWRvcyA9IFwiOihcIiArIGlkZW50aWZpZXIgKyBcIikoPzpcXFxcKChcIiArXG5cblx0XHQvLyBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBzZWxlY3RvcnMgbmVlZGluZyB0b2tlbml6ZSBpbiB0aGUgcHJlRmlsdGVyLCBwcmVmZXIgYXJndW1lbnRzOlxuXHRcdC8vIDEuIHF1b3RlZCAoY2FwdHVyZSAzOyBjYXB0dXJlIDQgb3IgY2FwdHVyZSA1KVxuXHRcdFwiKCcoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcIil8XCIgK1xuXG5cdFx0Ly8gMi4gc2ltcGxlIChjYXB0dXJlIDYpXG5cdFx0XCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKVtcXFxcXV18XCIgKyBhdHRyaWJ1dGVzICsgXCIpKil8XCIgK1xuXG5cdFx0Ly8gMy4gYW55dGhpbmcgZWxzZSAoY2FwdHVyZSAyKVxuXHRcdFwiLipcIiArXG5cdFx0XCIpXFxcXCl8KVwiLFxuXG5cdC8vIExlYWRpbmcgYW5kIG5vbi1lc2NhcGVkIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGNhcHR1cmluZyBzb21lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMgcHJlY2VkaW5nIHRoZSBsYXR0ZXJcblx0cndoaXRlc3BhY2UgPSBuZXcgUmVnRXhwKCB3aGl0ZXNwYWNlICsgXCIrXCIsIFwiZ1wiICksXG5cdHJ0cmltID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIrfCgoPzpefFteXFxcXFxcXFxdKSg/OlxcXFxcXFxcLikqKVwiICtcblx0XHR3aGl0ZXNwYWNlICsgXCIrJFwiLCBcImdcIiApLFxuXG5cdHJjb21tYSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKixcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXHRyY29tYmluYXRvcnMgPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIiooWz4rfl18XCIgKyB3aGl0ZXNwYWNlICsgXCIpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcIipcIiApLFxuXHRyZGVzY2VuZCA9IG5ldyBSZWdFeHAoIHdoaXRlc3BhY2UgKyBcInw+XCIgKSxcblxuXHRycHNldWRvID0gbmV3IFJlZ0V4cCggcHNldWRvcyApLFxuXHRyaWRlbnRpZmllciA9IG5ldyBSZWdFeHAoIFwiXlwiICsgaWRlbnRpZmllciArIFwiJFwiICksXG5cblx0bWF0Y2hFeHByID0ge1xuXHRcdFwiSURcIjogbmV3IFJlZ0V4cCggXCJeIyhcIiArIGlkZW50aWZpZXIgKyBcIilcIiApLFxuXHRcdFwiQ0xBU1NcIjogbmV3IFJlZ0V4cCggXCJeXFxcXC4oXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRcIlRBR1wiOiBuZXcgUmVnRXhwKCBcIl4oXCIgKyBpZGVudGlmaWVyICsgXCJ8WypdKVwiICksXG5cdFx0XCJBVFRSXCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgYXR0cmlidXRlcyApLFxuXHRcdFwiUFNFVURPXCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgcHNldWRvcyApLFxuXHRcdFwiQ0hJTERcIjogbmV3IFJlZ0V4cCggXCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXFxcKFwiICtcblx0XHRcdHdoaXRlc3BhY2UgKyBcIiooZXZlbnxvZGR8KChbKy1dfCkoXFxcXGQqKW58KVwiICsgd2hpdGVzcGFjZSArIFwiKig/OihbKy1dfClcIiArXG5cdFx0XHR3aGl0ZXNwYWNlICsgXCIqKFxcXFxkKyl8KSlcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcKXwpXCIsIFwiaVwiICksXG5cdFx0XCJib29sXCI6IG5ldyBSZWdFeHAoIFwiXig/OlwiICsgYm9vbGVhbnMgKyBcIikkXCIsIFwiaVwiICksXG5cblx0XHQvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKClcblx0XHQvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgXG5cdFx0XCJuZWVkc0NvbnRleHRcIjogbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFxcXChcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqKCg/Oi1cXFxcZCk/XFxcXGQqKVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFwpfCkoPz1bXi1dfCQpXCIsIFwiaVwiIClcblx0fSxcblxuXHRyaHRtbCA9IC9IVE1MJC9pLFxuXHRyaW5wdXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxcblx0cmhlYWRlciA9IC9eaFxcZCQvaSxcblxuXHRybmF0aXZlID0gL15bXntdK1xce1xccypcXFtuYXRpdmUgXFx3LyxcblxuXHQvLyBFYXNpbHktcGFyc2VhYmxlL3JldHJpZXZhYmxlIElEIG9yIFRBRyBvciBDTEFTUyBzZWxlY3RvcnNcblx0cnF1aWNrRXhwciA9IC9eKD86IyhbXFx3LV0rKXwoXFx3Kyl8XFwuKFtcXHctXSspKSQvLFxuXG5cdHJzaWJsaW5nID0gL1srfl0vLFxuXG5cdC8vIENTUyBlc2NhcGVzXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnNcblx0cnVuZXNjYXBlID0gbmV3IFJlZ0V4cCggXCJcXFxcXFxcXFtcXFxcZGEtZkEtRl17MSw2fVwiICsgd2hpdGVzcGFjZSArIFwiP3xcXFxcXFxcXChbXlxcXFxyXFxcXG5cXFxcZl0pXCIsIFwiZ1wiICksXG5cdGZ1bmVzY2FwZSA9IGZ1bmN0aW9uKCBlc2NhcGUsIG5vbkhleCApIHtcblx0XHR2YXIgaGlnaCA9IFwiMHhcIiArIGVzY2FwZS5zbGljZSggMSApIC0gMHgxMDAwMDtcblxuXHRcdHJldHVybiBub25IZXggP1xuXG5cdFx0XHQvLyBTdHJpcCB0aGUgYmFja3NsYXNoIHByZWZpeCBmcm9tIGEgbm9uLWhleCBlc2NhcGUgc2VxdWVuY2Vcblx0XHRcdG5vbkhleCA6XG5cblx0XHRcdC8vIFJlcGxhY2UgYSBoZXhhZGVjaW1hbCBlc2NhcGUgc2VxdWVuY2Ugd2l0aCB0aGUgZW5jb2RlZCBVbmljb2RlIGNvZGUgcG9pbnRcblx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTErXG5cdFx0XHQvLyBGb3IgdmFsdWVzIG91dHNpZGUgdGhlIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSAoQk1QKSwgbWFudWFsbHkgY29uc3RydWN0IGFcblx0XHRcdC8vIHN1cnJvZ2F0ZSBwYWlyXG5cdFx0XHRoaWdoIDwgMCA/XG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOlxuXHRcdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoID4+IDEwIHwgMHhEODAwLCBoaWdoICYgMHgzRkYgfCAweERDMDAgKTtcblx0fSxcblxuXHQvLyBDU1Mgc3RyaW5nL2lkZW50aWZpZXIgc2VyaWFsaXphdGlvblxuXHQvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI2NvbW1vbi1zZXJpYWxpemluZy1pZGlvbXNcblx0cmNzc2VzY2FwZSA9IC8oW1xcMC1cXHgxZlxceDdmXXxeLT9cXGQpfF4tJHxbXlxcMC1cXHgxZlxceDdmLVxcdUZGRkZcXHctXS9nLFxuXHRmY3NzZXNjYXBlID0gZnVuY3Rpb24oIGNoLCBhc0NvZGVQb2ludCApIHtcblx0XHRpZiAoIGFzQ29kZVBvaW50ICkge1xuXG5cdFx0XHQvLyBVKzAwMDAgTlVMTCBiZWNvbWVzIFUrRkZGRCBSRVBMQUNFTUVOVCBDSEFSQUNURVJcblx0XHRcdGlmICggY2ggPT09IFwiXFwwXCIgKSB7XG5cdFx0XHRcdHJldHVybiBcIlxcdUZGRkRcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udHJvbCBjaGFyYWN0ZXJzIGFuZCAoZGVwZW5kZW50IHVwb24gcG9zaXRpb24pIG51bWJlcnMgZ2V0IGVzY2FwZWQgYXMgY29kZSBwb2ludHNcblx0XHRcdHJldHVybiBjaC5zbGljZSggMCwgLTEgKSArIFwiXFxcXFwiICtcblx0XHRcdFx0Y2guY2hhckNvZGVBdCggY2gubGVuZ3RoIC0gMSApLnRvU3RyaW5nKCAxNiApICsgXCIgXCI7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXIgcG90ZW50aWFsbHktc3BlY2lhbCBBU0NJSSBjaGFyYWN0ZXJzIGdldCBiYWNrc2xhc2gtZXNjYXBlZFxuXHRcdHJldHVybiBcIlxcXFxcIiArIGNoO1xuXHR9LFxuXG5cdC8vIFVzZWQgZm9yIGlmcmFtZXNcblx0Ly8gU2VlIHNldERvY3VtZW50KClcblx0Ly8gUmVtb3ZpbmcgdGhlIGZ1bmN0aW9uIHdyYXBwZXIgY2F1c2VzIGEgXCJQZXJtaXNzaW9uIERlbmllZFwiXG5cdC8vIGVycm9yIGluIElFXG5cdHVubG9hZEhhbmRsZXIgPSBmdW5jdGlvbigpIHtcblx0XHRzZXREb2N1bWVudCgpO1xuXHR9LFxuXG5cdGluRGlzYWJsZWRGaWVsZHNldCA9IGFkZENvbWJpbmF0b3IoXG5cdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gdHJ1ZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiZmllbGRzZXRcIjtcblx0XHR9LFxuXHRcdHsgZGlyOiBcInBhcmVudE5vZGVcIiwgbmV4dDogXCJsZWdlbmRcIiB9XG5cdCk7XG5cbi8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5KCBfLCBOb2RlTGlzdCApXG50cnkge1xuXHRwdXNoLmFwcGx5KFxuXHRcdCggYXJyID0gc2xpY2UuY2FsbCggcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMgKSApLFxuXHRcdHByZWZlcnJlZERvYy5jaGlsZE5vZGVzXG5cdCk7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjBcblx0Ly8gRGV0ZWN0IHNpbGVudGx5IGZhaWxpbmcgcHVzaC5hcHBseVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG5cdGFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7XG59IGNhdGNoICggZSApIHtcblx0cHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggP1xuXG5cdFx0Ly8gTGV2ZXJhZ2Ugc2xpY2UgaWYgcG9zc2libGVcblx0XHRmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHRwdXNoTmF0aXZlLmFwcGx5KCB0YXJnZXQsIHNsaWNlLmNhbGwoIGVscyApICk7XG5cdFx0fSA6XG5cblx0XHQvLyBTdXBwb3J0OiBJRTw5XG5cdFx0Ly8gT3RoZXJ3aXNlIGFwcGVuZCBkaXJlY3RseVxuXHRcdGZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHtcblx0XHRcdHZhciBqID0gdGFyZ2V0Lmxlbmd0aCxcblx0XHRcdFx0aSA9IDA7XG5cblx0XHRcdC8vIENhbid0IHRydXN0IE5vZGVMaXN0Lmxlbmd0aFxuXHRcdFx0d2hpbGUgKCAoIHRhcmdldFsgaisrIF0gPSBlbHNbIGkrKyBdICkgKSB7fVxuXHRcdFx0dGFyZ2V0Lmxlbmd0aCA9IGogLSAxO1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIG0sIGksIGVsZW0sIG5pZCwgbWF0Y2gsIGdyb3VwcywgbmV3U2VsZWN0b3IsXG5cdFx0bmV3Q29udGV4dCA9IGNvbnRleHQgJiYgY29udGV4dC5vd25lckRvY3VtZW50LFxuXG5cdFx0Ly8gbm9kZVR5cGUgZGVmYXVsdHMgdG8gOSwgc2luY2UgY29udGV4dCBkZWZhdWx0cyB0byBkb2N1bWVudFxuXHRcdG5vZGVUeXBlID0gY29udGV4dCA/IGNvbnRleHQubm9kZVR5cGUgOiA5O1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFJldHVybiBlYXJseSBmcm9tIGNhbGxzIHdpdGggaW52YWxpZCBzZWxlY3RvciBvciBjb250ZXh0XG5cdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiIHx8ICFzZWxlY3RvciB8fFxuXHRcdG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHtcblxuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0Ly8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50c1xuXHRpZiAoICFzZWVkICkge1xuXHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdFx0Y29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7XG5cblx0XHRpZiAoIGRvY3VtZW50SXNIVE1MICkge1xuXG5cdFx0XHQvLyBJZiB0aGUgc2VsZWN0b3IgaXMgc3VmZmljaWVudGx5IHNpbXBsZSwgdHJ5IHVzaW5nIGEgXCJnZXQqQnkqXCIgRE9NIG1ldGhvZFxuXHRcdFx0Ly8gKGV4Y2VwdGluZyBEb2N1bWVudEZyYWdtZW50IGNvbnRleHQsIHdoZXJlIHRoZSBtZXRob2RzIGRvbid0IGV4aXN0KVxuXHRcdFx0aWYgKCBub2RlVHlwZSAhPT0gMTEgJiYgKCBtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKSApICkge1xuXG5cdFx0XHRcdC8vIElEIHNlbGVjdG9yXG5cdFx0XHRcdGlmICggKCBtID0gbWF0Y2hbIDEgXSApICkge1xuXG5cdFx0XHRcdFx0Ly8gRG9jdW1lbnQgY29udGV4dFxuXHRcdFx0XHRcdGlmICggbm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSApICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFLCBPcGVyYSwgV2Via2l0XG5cdFx0XHRcdFx0XHRcdC8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zXG5cdFx0XHRcdFx0XHRcdC8vIGdldEVsZW1lbnRCeUlkIGNhbiBtYXRjaCBlbGVtZW50cyBieSBuYW1lIGluc3RlYWQgb2YgSURcblx0XHRcdFx0XHRcdFx0aWYgKCBlbGVtLmlkID09PSBtICkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIEVsZW1lbnQgY29udGV4dFxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFLCBPcGVyYSwgV2Via2l0XG5cdFx0XHRcdFx0XHQvLyBUT0RPOiBpZGVudGlmeSB2ZXJzaW9uc1xuXHRcdFx0XHRcdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0aWYgKCBuZXdDb250ZXh0ICYmICggZWxlbSA9IG5ld0NvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSApICYmXG5cdFx0XHRcdFx0XHRcdGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiZcblx0XHRcdFx0XHRcdFx0ZWxlbS5pZCA9PT0gbSApIHtcblxuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFR5cGUgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbIDIgXSApIHtcblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBzZWxlY3RvciApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHRcdFx0Ly8gQ2xhc3Mgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggKCBtID0gbWF0Y2hbIDMgXSApICYmIHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJlxuXHRcdFx0XHRcdGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHtcblxuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGFrZSBhZHZhbnRhZ2Ugb2YgcXVlcnlTZWxlY3RvckFsbFxuXHRcdFx0aWYgKCBzdXBwb3J0LnFzYSAmJlxuXHRcdFx0XHQhbm9ubmF0aXZlU2VsZWN0b3JDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdICYmXG5cdFx0XHRcdCggIXJidWdneVFTQSB8fCAhcmJ1Z2d5UVNBLnRlc3QoIHNlbGVjdG9yICkgKSAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDggb25seVxuXHRcdFx0XHQvLyBFeGNsdWRlIG9iamVjdCBlbGVtZW50c1xuXHRcdFx0XHQoIG5vZGVUeXBlICE9PSAxIHx8IGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJvYmplY3RcIiApICkge1xuXG5cdFx0XHRcdG5ld1NlbGVjdG9yID0gc2VsZWN0b3I7XG5cdFx0XHRcdG5ld0NvbnRleHQgPSBjb250ZXh0O1xuXG5cdFx0XHRcdC8vIHFTQSBjb25zaWRlcnMgZWxlbWVudHMgb3V0c2lkZSBhIHNjb3Bpbmcgcm9vdCB3aGVuIGV2YWx1YXRpbmcgY2hpbGQgb3Jcblx0XHRcdFx0Ly8gZGVzY2VuZGFudCBjb21iaW5hdG9ycywgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudC5cblx0XHRcdFx0Ly8gSW4gc3VjaCBjYXNlcywgd2Ugd29yayBhcm91bmQgdGhlIGJlaGF2aW9yIGJ5IHByZWZpeGluZyBldmVyeSBzZWxlY3RvciBpbiB0aGVcblx0XHRcdFx0Ly8gbGlzdCB3aXRoIGFuIElEIHNlbGVjdG9yIHJlZmVyZW5jaW5nIHRoZSBzY29wZSBjb250ZXh0LlxuXHRcdFx0XHQvLyBUaGUgdGVjaG5pcXVlIGhhcyB0byBiZSB1c2VkIGFzIHdlbGwgd2hlbiBhIGxlYWRpbmcgY29tYmluYXRvciBpcyB1c2VkXG5cdFx0XHRcdC8vIGFzIHN1Y2ggc2VsZWN0b3JzIGFyZSBub3QgcmVjb2duaXplZCBieSBxdWVyeVNlbGVjdG9yQWxsLlxuXHRcdFx0XHQvLyBUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhpcyB0ZWNobmlxdWUuXG5cdFx0XHRcdGlmICggbm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0XHQoIHJkZXNjZW5kLnRlc3QoIHNlbGVjdG9yICkgfHwgcmNvbWJpbmF0b3JzLnRlc3QoIHNlbGVjdG9yICkgKSApIHtcblxuXHRcdFx0XHRcdC8vIEV4cGFuZCBjb250ZXh0IGZvciBzaWJsaW5nIHNlbGVjdG9yc1xuXHRcdFx0XHRcdG5ld0NvbnRleHQgPSByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fFxuXHRcdFx0XHRcdFx0Y29udGV4dDtcblxuXHRcdFx0XHRcdC8vIFdlIGNhbiB1c2UgOnNjb3BlIGluc3RlYWQgb2YgdGhlIElEIGhhY2sgaWYgdGhlIGJyb3dzZXJcblx0XHRcdFx0XHQvLyBzdXBwb3J0cyBpdCAmIGlmIHdlJ3JlIG5vdCBjaGFuZ2luZyB0aGUgY29udGV4dC5cblx0XHRcdFx0XHRpZiAoIG5ld0NvbnRleHQgIT09IGNvbnRleHQgfHwgIXN1cHBvcnQuc2NvcGUgKSB7XG5cblx0XHRcdFx0XHRcdC8vIENhcHR1cmUgdGhlIGNvbnRleHQgSUQsIHNldHRpbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0XHRpZiAoICggbmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoIFwiaWRcIiApICkgKSB7XG5cdFx0XHRcdFx0XHRcdG5pZCA9IG5pZC5yZXBsYWNlKCByY3NzZXNjYXBlLCBmY3NzZXNjYXBlICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0LnNldEF0dHJpYnV0ZSggXCJpZFwiLCAoIG5pZCA9IGV4cGFuZG8gKSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFByZWZpeCBldmVyeSBzZWxlY3RvciBpbiB0aGUgbGlzdFxuXHRcdFx0XHRcdGdyb3VwcyA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdFx0XHRcdGkgPSBncm91cHMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0Z3JvdXBzWyBpIF0gPSAoIG5pZCA/IFwiI1wiICsgbmlkIDogXCI6c2NvcGVcIiApICsgXCIgXCIgK1xuXHRcdFx0XHRcdFx0XHR0b1NlbGVjdG9yKCBncm91cHNbIGkgXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRuZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCBcIixcIiApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLFxuXHRcdFx0XHRcdFx0bmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0fSBjYXRjaCAoIHFzYUVycm9yICkge1xuXHRcdFx0XHRcdG5vbm5hdGl2ZVNlbGVjdG9yQ2FjaGUoIHNlbGVjdG9yLCB0cnVlICk7XG5cdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0aWYgKCBuaWQgPT09IGV4cGFuZG8gKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSggXCJpZFwiICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWxsIG90aGVyc1xuXHRyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUga2V5LXZhbHVlIGNhY2hlcyBvZiBsaW1pdGVkIHNpemVcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGhcbiAqXHRwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKVxuICpcdGRlbGV0aW5nIHRoZSBvbGRlc3QgZW50cnlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7XG5cdHZhciBrZXlzID0gW107XG5cblx0ZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7XG5cblx0XHQvLyBVc2UgKGtleSArIFwiIFwiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KVxuXHRcdGlmICgga2V5cy5wdXNoKCBrZXkgKyBcIiBcIiApID4gRXhwci5jYWNoZUxlbmd0aCApIHtcblxuXHRcdFx0Ly8gT25seSBrZWVwIHRoZSBtb3N0IHJlY2VudCBlbnRyaWVzXG5cdFx0XHRkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdO1xuXHRcdH1cblx0XHRyZXR1cm4gKCBjYWNoZVsga2V5ICsgXCIgXCIgXSA9IHZhbHVlICk7XG5cdH1cblx0cmV0dXJuIGNhY2hlO1xufVxuXG4vKipcbiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFya1xuICovXG5mdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkge1xuXHRmblsgZXhwYW5kbyBdID0gdHJ1ZTtcblx0cmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIFN1cHBvcnQgdGVzdGluZyB1c2luZyBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGFzc2VydCggZm4gKSB7XG5cdHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZmllbGRzZXRcIiApO1xuXG5cdHRyeSB7XG5cdFx0cmV0dXJuICEhZm4oIGVsICk7XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fSBmaW5hbGx5IHtcblxuXHRcdC8vIFJlbW92ZSBmcm9tIGl0cyBwYXJlbnQgYnkgZGVmYXVsdFxuXHRcdGlmICggZWwucGFyZW50Tm9kZSApIHtcblx0XHRcdGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsICk7XG5cdFx0fVxuXG5cdFx0Ly8gcmVsZWFzZSBtZW1vcnkgaW4gSUVcblx0XHRlbCA9IG51bGw7XG5cdH1cbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBzYW1lIGhhbmRsZXIgZm9yIGFsbCBvZiB0aGUgc3BlY2lmaWVkIGF0dHJzXG4gKiBAcGFyYW0ge1N0cmluZ30gYXR0cnMgUGlwZS1zZXBhcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGFwcGxpZWRcbiAqL1xuZnVuY3Rpb24gYWRkSGFuZGxlKCBhdHRycywgaGFuZGxlciApIHtcblx0dmFyIGFyciA9IGF0dHJzLnNwbGl0KCBcInxcIiApLFxuXHRcdGkgPSBhcnIubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdEV4cHIuYXR0ckhhbmRsZVsgYXJyWyBpIF0gXSA9IGhhbmRsZXI7XG5cdH1cbn1cblxuLyoqXG4gKiBDaGVja3MgZG9jdW1lbnQgb3JkZXIgb2YgdHdvIHNpYmxpbmdzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGFcbiAqIEBwYXJhbSB7RWxlbWVudH0gYlxuICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyBsZXNzIHRoYW4gMCBpZiBhIHByZWNlZGVzIGIsIGdyZWF0ZXIgdGhhbiAwIGlmIGEgZm9sbG93cyBiXG4gKi9cbmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHtcblx0dmFyIGN1ciA9IGIgJiYgYSxcblx0XHRkaWZmID0gY3VyICYmIGEubm9kZVR5cGUgPT09IDEgJiYgYi5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0YS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7XG5cblx0Ly8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzXG5cdGlmICggZGlmZiApIHtcblx0XHRyZXR1cm4gZGlmZjtcblx0fVxuXG5cdC8vIENoZWNrIGlmIGIgZm9sbG93cyBhXG5cdGlmICggY3VyICkge1xuXHRcdHdoaWxlICggKCBjdXIgPSBjdXIubmV4dFNpYmxpbmcgKSApIHtcblx0XHRcdGlmICggY3VyID09PSBiICkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGEgPyAxIDogLTE7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlc1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gbmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0udHlwZSA9PT0gdHlwZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGJ1dHRvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJ1dHRvblBzZXVkbyggdHlwZSApIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdHJldHVybiAoIG5hbWUgPT09IFwiaW5wdXRcIiB8fCBuYW1lID09PSBcImJ1dHRvblwiICkgJiYgZWxlbS50eXBlID09PSB0eXBlO1xuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgOmVuYWJsZWQvOmRpc2FibGVkXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRpc2FibGVkIHRydWUgZm9yIDpkaXNhYmxlZDsgZmFsc2UgZm9yIDplbmFibGVkXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZURpc2FibGVkUHNldWRvKCBkaXNhYmxlZCApIHtcblxuXHQvLyBLbm93biA6ZGlzYWJsZWQgZmFsc2UgcG9zaXRpdmVzOiBmaWVsZHNldFtkaXNhYmxlZF0gPiBsZWdlbmQ6bnRoLW9mLXR5cGUobisyKSA6Y2FuLWRpc2FibGVcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gT25seSBjZXJ0YWluIGVsZW1lbnRzIGNhbiBtYXRjaCA6ZW5hYmxlZCBvciA6ZGlzYWJsZWRcblx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1lbmFibGVkXG5cdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjc2VsZWN0b3ItZGlzYWJsZWRcblx0XHRpZiAoIFwiZm9ybVwiIGluIGVsZW0gKSB7XG5cblx0XHRcdC8vIENoZWNrIGZvciBpbmhlcml0ZWQgZGlzYWJsZWRuZXNzIG9uIHJlbGV2YW50IG5vbi1kaXNhYmxlZCBlbGVtZW50czpcblx0XHRcdC8vICogbGlzdGVkIGZvcm0tYXNzb2NpYXRlZCBlbGVtZW50cyBpbiBhIGRpc2FibGVkIGZpZWxkc2V0XG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY2F0ZWdvcnktbGlzdGVkXG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY29uY2VwdC1mZS1kaXNhYmxlZFxuXHRcdFx0Ly8gKiBvcHRpb24gZWxlbWVudHMgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0Ly8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NvbmNlcHQtb3B0aW9uLWRpc2FibGVkXG5cdFx0XHQvLyBBbGwgc3VjaCBlbGVtZW50cyBoYXZlIGEgXCJmb3JtXCIgcHJvcGVydHkuXG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSAmJiBlbGVtLmRpc2FibGVkID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHQvLyBPcHRpb24gZWxlbWVudHMgZGVmZXIgdG8gYSBwYXJlbnQgb3B0Z3JvdXAgaWYgcHJlc2VudFxuXHRcdFx0XHRpZiAoIFwibGFiZWxcIiBpbiBlbGVtICkge1xuXHRcdFx0XHRcdGlmICggXCJsYWJlbFwiIGluIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLnBhcmVudE5vZGUuZGlzYWJsZWQgPT09IGRpc2FibGVkO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDExXG5cdFx0XHRcdC8vIFVzZSB0aGUgaXNEaXNhYmxlZCBzaG9ydGN1dCBwcm9wZXJ0eSB0byBjaGVjayBmb3IgZGlzYWJsZWQgZmllbGRzZXQgYW5jZXN0b3JzXG5cdFx0XHRcdHJldHVybiBlbGVtLmlzRGlzYWJsZWQgPT09IGRpc2FibGVkIHx8XG5cblx0XHRcdFx0XHQvLyBXaGVyZSB0aGVyZSBpcyBubyBpc0Rpc2FibGVkLCBjaGVjayBtYW51YWxseVxuXHRcdFx0XHRcdC8qIGpzaGludCAtVzAxOCAqL1xuXHRcdFx0XHRcdGVsZW0uaXNEaXNhYmxlZCAhPT0gIWRpc2FibGVkICYmXG5cdFx0XHRcdFx0aW5EaXNhYmxlZEZpZWxkc2V0KCBlbGVtICkgPT09IGRpc2FibGVkO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cblx0XHQvLyBUcnkgdG8gd2lubm93IG91dCBlbGVtZW50cyB0aGF0IGNhbid0IGJlIGRpc2FibGVkIGJlZm9yZSB0cnVzdGluZyB0aGUgZGlzYWJsZWQgcHJvcGVydHkuXG5cdFx0Ly8gU29tZSB2aWN0aW1zIGdldCBjYXVnaHQgaW4gb3VyIG5ldCAobGFiZWwsIGxlZ2VuZCwgbWVudSwgdHJhY2spLCBidXQgaXQgc2hvdWxkbid0XG5cdFx0Ly8gZXZlbiBleGlzdCBvbiB0aGVtLCBsZXQgYWxvbmUgaGF2ZSBhIGJvb2xlYW4gdmFsdWUuXG5cdFx0fSBlbHNlIGlmICggXCJsYWJlbFwiIGluIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gUmVtYWluaW5nIGVsZW1lbnRzIGFyZSBuZWl0aGVyIDplbmFibGVkIG5vciA6ZGlzYWJsZWRcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBwb3NpdGlvbmFsc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZm4gKSB7XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBhcmd1bWVudCApIHtcblx0XHRhcmd1bWVudCA9ICthcmd1bWVudDtcblx0XHRyZXR1cm4gbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdHZhciBqLFxuXHRcdFx0XHRtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLFxuXHRcdFx0XHRpID0gbWF0Y2hJbmRleGVzLmxlbmd0aDtcblxuXHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCBzZWVkWyAoIGogPSBtYXRjaEluZGV4ZXNbIGkgXSApIF0gKSB7XG5cdFx0XHRcdFx0c2VlZFsgaiBdID0gISggbWF0Y2hlc1sgaiBdID0gc2VlZFsgaiBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH0gKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgYSBub2RlIGZvciB2YWxpZGl0eSBhcyBhIFNpenpsZSBjb250ZXh0XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0PX0gY29udGV4dFxuICogQHJldHVybnMge0VsZW1lbnR8T2JqZWN0fEJvb2xlYW59IFRoZSBpbnB1dCBub2RlIGlmIGFjY2VwdGFibGUsIG90aGVyd2lzZSBhIGZhbHN5IHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHRlc3RDb250ZXh0KCBjb250ZXh0ICkge1xuXHRyZXR1cm4gY29udGV4dCAmJiB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjb250ZXh0O1xufVxuXG4vLyBFeHBvc2Ugc3VwcG9ydCB2YXJzIGZvciBjb252ZW5pZW5jZVxuc3VwcG9ydCA9IFNpenpsZS5zdXBwb3J0ID0ge307XG5cbi8qKlxuICogRGV0ZWN0cyBYTUwgbm9kZXNcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0gQW4gZWxlbWVudCBvciBhIGRvY3VtZW50XG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZmYgZWxlbSBpcyBhIG5vbi1IVE1MIFhNTCBub2RlXG4gKi9cbmlzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHZhciBuYW1lc3BhY2UgPSBlbGVtICYmIGVsZW0ubmFtZXNwYWNlVVJJLFxuXHRcdGRvY0VsZW0gPSBlbGVtICYmICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKS5kb2N1bWVudEVsZW1lbnQ7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD04XG5cdC8vIEFzc3VtZSBIVE1MIHdoZW4gZG9jdW1lbnRFbGVtZW50IGRvZXNuJ3QgeWV0IGV4aXN0LCBzdWNoIGFzIGluc2lkZSBsb2FkaW5nIGlmcmFtZXNcblx0Ly8gaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzQ4MzNcblx0cmV0dXJuICFyaHRtbC50ZXN0KCBuYW1lc3BhY2UgfHwgZG9jRWxlbSAmJiBkb2NFbGVtLm5vZGVOYW1lIHx8IFwiSFRNTFwiICk7XG59O1xuXG4vKipcbiAqIFNldHMgZG9jdW1lbnQtcmVsYXRlZCB2YXJpYWJsZXMgb25jZSBiYXNlZCBvbiB0aGUgY3VycmVudCBkb2N1bWVudFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gW2RvY10gQW4gZWxlbWVudCBvciBkb2N1bWVudCBvYmplY3QgdG8gdXNlIHRvIHNldCB0aGUgZG9jdW1lbnRcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAqL1xuc2V0RG9jdW1lbnQgPSBTaXp6bGUuc2V0RG9jdW1lbnQgPSBmdW5jdGlvbiggbm9kZSApIHtcblx0dmFyIGhhc0NvbXBhcmUsIHN1YldpbmRvdyxcblx0XHRkb2MgPSBub2RlID8gbm9kZS5vd25lckRvY3VtZW50IHx8IG5vZGUgOiBwcmVmZXJyZWREb2M7XG5cblx0Ly8gUmV0dXJuIGVhcmx5IGlmIGRvYyBpcyBpbnZhbGlkIG9yIGFscmVhZHkgc2VsZWN0ZWRcblx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0aWYgKCBkb2MgPT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBlICE9PSA5IHx8ICFkb2MuZG9jdW1lbnRFbGVtZW50ICkge1xuXHRcdHJldHVybiBkb2N1bWVudDtcblx0fVxuXG5cdC8vIFVwZGF0ZSBnbG9iYWwgdmFyaWFibGVzXG5cdGRvY3VtZW50ID0gZG9jO1xuXHRkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXHRkb2N1bWVudElzSFRNTCA9ICFpc1hNTCggZG9jdW1lbnQgKTtcblxuXHQvLyBTdXBwb3J0OiBJRSA5IC0gMTErLCBFZGdlIDEyIC0gMTgrXG5cdC8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgXCJwZXJtaXNzaW9uIGRlbmllZFwiIGVycm9ycyAoalF1ZXJ5ICMxMzkzNilcblx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0aWYgKCBwcmVmZXJyZWREb2MgIT0gZG9jdW1lbnQgJiZcblx0XHQoIHN1YldpbmRvdyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3ICkgJiYgc3ViV2luZG93LnRvcCAhPT0gc3ViV2luZG93ICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgMTEsIEVkZ2Vcblx0XHRpZiAoIHN1YldpbmRvdy5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0c3ViV2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIFwidW5sb2FkXCIsIHVubG9hZEhhbmRsZXIsIGZhbHNlICk7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTAgb25seVxuXHRcdH0gZWxzZSBpZiAoIHN1YldpbmRvdy5hdHRhY2hFdmVudCApIHtcblx0XHRcdHN1YldpbmRvdy5hdHRhY2hFdmVudCggXCJvbnVubG9hZFwiLCB1bmxvYWRIYW5kbGVyICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gU3VwcG9ydDogSUUgOCAtIDExKywgRWRnZSAxMiAtIDE4KywgQ2hyb21lIDw9MTYgLSAyNSBvbmx5LCBGaXJlZm94IDw9My42IC0gMzEgb25seSxcblx0Ly8gU2FmYXJpIDQgLSA1IG9ubHksIE9wZXJhIDw9MTEuNiAtIDEyLnggb25seVxuXHQvLyBJRS9FZGdlICYgb2xkZXIgYnJvd3NlcnMgZG9uJ3Qgc3VwcG9ydCB0aGUgOnNjb3BlIHBzZXVkby1jbGFzcy5cblx0Ly8gU3VwcG9ydDogU2FmYXJpIDYuMCBvbmx5XG5cdC8vIFNhZmFyaSA2LjAgc3VwcG9ydHMgOnNjb3BlIGJ1dCBpdCdzIGFuIGFsaWFzIG9mIDpyb290IHRoZXJlLlxuXHRzdXBwb3J0LnNjb3BlID0gYXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cdFx0ZG9jRWxlbS5hcHBlbmRDaGlsZCggZWwgKS5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICk7XG5cdFx0cmV0dXJuIHR5cGVvZiBlbC5xdWVyeVNlbGVjdG9yQWxsICE9PSBcInVuZGVmaW5lZFwiICYmXG5cdFx0XHQhZWwucXVlcnlTZWxlY3RvckFsbCggXCI6c2NvcGUgZmllbGRzZXQgZGl2XCIgKS5sZW5ndGg7XG5cdH0gKTtcblxuXHQvKiBBdHRyaWJ1dGVzXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBTdXBwb3J0OiBJRTw4XG5cdC8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllc1xuXHQvLyAoZXhjZXB0aW5nIElFOCBib29sZWFucylcblx0c3VwcG9ydC5hdHRyaWJ1dGVzID0gYXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cdFx0ZWwuY2xhc3NOYW1lID0gXCJpXCI7XG5cdFx0cmV0dXJuICFlbC5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NOYW1lXCIgKTtcblx0fSApO1xuXG5cdC8qIGdldEVsZW1lbnQocylCeSpcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSByZXR1cm5zIG9ubHkgZWxlbWVudHNcblx0c3VwcG9ydC5nZXRFbGVtZW50c0J5VGFnTmFtZSA9IGFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXHRcdGVsLmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCBcIlwiICkgKTtcblx0XHRyZXR1cm4gIWVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCBcIipcIiApLmxlbmd0aDtcblx0fSApO1xuXG5cdC8vIFN1cHBvcnQ6IElFPDlcblx0c3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gcm5hdGl2ZS50ZXN0KCBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICk7XG5cblx0Ly8gU3VwcG9ydDogSUU8MTBcblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudEJ5SWQgcmV0dXJucyBlbGVtZW50cyBieSBuYW1lXG5cdC8vIFRoZSBicm9rZW4gZ2V0RWxlbWVudEJ5SWQgbWV0aG9kcyBkb24ndCBwaWNrIHVwIHByb2dyYW1tYXRpY2FsbHktc2V0IG5hbWVzLFxuXHQvLyBzbyB1c2UgYSByb3VuZGFib3V0IGdldEVsZW1lbnRzQnlOYW1lIHRlc3Rcblx0c3VwcG9ydC5nZXRCeUlkID0gYXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cdFx0ZG9jRWxlbS5hcHBlbmRDaGlsZCggZWwgKS5pZCA9IGV4cGFuZG87XG5cdFx0cmV0dXJuICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSB8fCAhZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIGV4cGFuZG8gKS5sZW5ndGg7XG5cdH0gKTtcblxuXHQvLyBJRCBmaWx0ZXIgYW5kIGZpbmRcblx0aWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7XG5cdFx0RXhwci5maWx0ZXJbIFwiSURcIiBdID0gZnVuY3Rpb24oIGlkICkge1xuXHRcdFx0dmFyIGF0dHJJZCA9IGlkLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggXCJpZFwiICkgPT09IGF0dHJJZDtcblx0XHRcdH07XG5cdFx0fTtcblx0XHRFeHByLmZpbmRbIFwiSURcIiBdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXHRcdFx0XHRyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107XG5cdFx0XHR9XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRFeHByLmZpbHRlclsgXCJJRFwiIF0gPSAgZnVuY3Rpb24oIGlkICkge1xuXHRcdFx0dmFyIGF0dHJJZCA9IGlkLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciBub2RlID0gdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuXHRcdFx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggXCJpZFwiICk7XG5cdFx0XHRcdHJldHVybiBub2RlICYmIG5vZGUudmFsdWUgPT09IGF0dHJJZDtcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDYgLSA3IG9ubHlcblx0XHQvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0XG5cdFx0RXhwci5maW5kWyBcIklEXCIgXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRcdHZhciBub2RlLCBpLCBlbGVtcyxcblx0XHRcdFx0XHRlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTtcblxuXHRcdFx0XHRpZiAoIGVsZW0gKSB7XG5cblx0XHRcdFx0XHQvLyBWZXJpZnkgdGhlIGlkIGF0dHJpYnV0ZVxuXHRcdFx0XHRcdG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIFwiaWRcIiApO1xuXHRcdFx0XHRcdGlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHtcblx0XHRcdFx0XHRcdHJldHVybiBbIGVsZW0gXTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBGYWxsIGJhY2sgb24gZ2V0RWxlbWVudHNCeU5hbWVcblx0XHRcdFx0XHRlbGVtcyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUoIGlkICk7XG5cdFx0XHRcdFx0aSA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGVsZW0gPSBlbGVtc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIFwiaWRcIiApO1xuXHRcdFx0XHRcdFx0aWYgKCBub2RlICYmIG5vZGUudmFsdWUgPT09IGlkICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gWyBlbGVtIF07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIFtdO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHQvLyBUYWdcblx0RXhwci5maW5kWyBcIlRBR1wiIF0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID9cblx0XHRmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0XHQvLyBEb2N1bWVudEZyYWdtZW50IG5vZGVzIGRvbid0IGhhdmUgZ0VCVE5cblx0XHRcdH0gZWxzZSBpZiAoIHN1cHBvcnQucXNhICkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgKTtcblx0XHRcdH1cblx0XHR9IDpcblxuXHRcdGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7XG5cdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0dG1wID0gW10sXG5cdFx0XHRcdGkgPSAwLFxuXG5cdFx0XHRcdC8vIEJ5IGhhcHB5IGNvaW5jaWRlbmNlLCBhIChicm9rZW4pIGdFQlROIGFwcGVhcnMgb24gRG9jdW1lbnRGcmFnbWVudCBub2RlcyB0b29cblx0XHRcdFx0cmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0XHQvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzXG5cdFx0XHRpZiAoIHRhZyA9PT0gXCIqXCIgKSB7XG5cdFx0XHRcdHdoaWxlICggKCBlbGVtID0gcmVzdWx0c1sgaSsrIF0gKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHR0bXAucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0bXA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHR9O1xuXG5cdC8vIENsYXNzXG5cdEV4cHIuZmluZFsgXCJDTEFTU1wiIF0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYgZnVuY3Rpb24oIGNsYXNzTmFtZSwgY29udGV4dCApIHtcblx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBjbGFzc05hbWUgKTtcblx0XHR9XG5cdH07XG5cblx0LyogUVNBL21hdGNoZXNTZWxlY3RvclxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gUVNBIGFuZCBtYXRjaGVzU2VsZWN0b3Igc3VwcG9ydFxuXG5cdC8vIG1hdGNoZXNTZWxlY3Rvcig6YWN0aXZlKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoSUU5L09wZXJhIDExLjUpXG5cdHJidWdneU1hdGNoZXMgPSBbXTtcblxuXHQvLyBxU2EoOmZvY3VzKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoQ2hyb21lIDIxKVxuXHQvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3Jcblx0Ly8gd2hlbmV2ZXIgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgIGlzIGFjY2Vzc2VkIG9uIGFuIGlmcmFtZVxuXHQvLyBTbywgd2UgYWxsb3cgOmZvY3VzIHRvIHBhc3MgdGhyb3VnaCBRU0EgYWxsIHRoZSB0aW1lIHRvIGF2b2lkIHRoZSBJRSBlcnJvclxuXHQvLyBTZWUgaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4XG5cdHJidWdneVFTQSA9IFtdO1xuXG5cdGlmICggKCBzdXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApICkgKSB7XG5cblx0XHQvLyBCdWlsZCBRU0EgcmVnZXhcblx0XHQvLyBSZWdleCBzdHJhdGVneSBhZG9wdGVkIGZyb20gRGllZ28gUGVyaW5pXG5cdFx0YXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cblx0XHRcdHZhciBpbnB1dDtcblxuXHRcdFx0Ly8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZVxuXHRcdFx0Ly8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWNpdGx5XG5cdFx0XHQvLyBzZXR0aW5nIGEgYm9vbGVhbiBjb250ZW50IGF0dHJpYnV0ZSxcblx0XHRcdC8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoXG5cdFx0XHQvLyBodHRwczovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIzNTlcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuaW5uZXJIVE1MID0gXCI8YSBpZD0nXCIgKyBleHBhbmRvICsgXCInPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBpZD0nXCIgKyBleHBhbmRvICsgXCItXFxyXFxcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+XCIgK1xuXHRcdFx0XHRcIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+XCI7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTZcblx0XHRcdC8vIE5vdGhpbmcgc2hvdWxkIGJlIHNlbGVjdGVkIHdoZW4gZW1wdHkgc3RyaW5ncyBmb2xsb3cgXj0gb3IgJD0gb3IgKj1cblx0XHRcdC8vIFRoZSB0ZXN0IGF0dHJpYnV0ZSBtdXN0IGJlIHVua25vd24gaW4gT3BlcmEgYnV0IFwic2FmZVwiIGZvciBXaW5SVFxuXHRcdFx0Ly8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9oaDQ2NTM4OC5hc3B4I2F0dHJpYnV0ZV9zZWN0aW9uXG5cdFx0XHRpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW21zYWxsb3djYXB0dXJlXj0nJ11cIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiWypeJF09XCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86Jyd8XFxcIlxcXCIpXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4XG5cdFx0XHQvLyBCb29sZWFuIGF0dHJpYnV0ZXMgYW5kIFwidmFsdWVcIiBhcmUgbm90IHRyZWF0ZWQgY29ycmVjdGx5XG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIltzZWxlY3RlZF1cIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIiooPzp2YWx1ZXxcIiArIGJvb2xlYW5zICsgXCIpXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lPDI5LCBBbmRyb2lkPDQuNCwgU2FmYXJpPDcuMCssIGlPUzw3LjArLCBQaGFudG9tSlM8MS45LjgrXG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIltpZH49XCIgKyBleHBhbmRvICsgXCItXVwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJ+PVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNSAtIDE4K1xuXHRcdFx0Ly8gSUUgMTEvRWRnZSBkb24ndCBmaW5kIGVsZW1lbnRzIG9uIGEgYFtuYW1lPScnXWAgcXVlcnkgaW4gc29tZSBjYXNlcy5cblx0XHRcdC8vIEFkZGluZyBhIHRlbXBvcmFyeSBhdHRyaWJ1dGUgdG8gdGhlIGRvY3VtZW50IGJlZm9yZSB0aGUgc2VsZWN0aW9uIHdvcmtzXG5cdFx0XHQvLyBhcm91bmQgdGhlIGlzc3VlLlxuXHRcdFx0Ly8gSW50ZXJlc3RpbmdseSwgSUUgMTAgJiBvbGRlciBkb24ndCBzZWVtIHRvIGhhdmUgdGhlIGlzc3VlLlxuXHRcdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblx0XHRcdGlucHV0LnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwiXCIgKTtcblx0XHRcdGVsLmFwcGVuZENoaWxkKCBpbnB1dCApO1xuXHRcdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCggXCJbbmFtZT0nJ11cIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIipuYW1lXCIgKyB3aGl0ZXNwYWNlICsgXCIqPVwiICtcblx0XHRcdFx0XHR3aGl0ZXNwYWNlICsgXCIqKD86Jyd8XFxcIlxcXCIpXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gV2Via2l0L09wZXJhIC0gOmNoZWNrZWQgc2hvdWxkIHJldHVybiBzZWxlY3RlZCBvcHRpb24gZWxlbWVudHNcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkXG5cdFx0XHQvLyBJRTggdGhyb3dzIGVycm9yIGhlcmUgYW5kIHdpbGwgbm90IHNlZSBsYXRlciB0ZXN0c1xuXHRcdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCggXCI6Y2hlY2tlZFwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCI6Y2hlY2tlZFwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IFNhZmFyaSA4KywgaU9TIDgrXG5cdFx0XHQvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM2ODUxXG5cdFx0XHQvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJsaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzXG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcImEjXCIgKyBleHBhbmRvICsgXCIrKlwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCIuIy4rWyt+XVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD0zLjYgLSA1IG9ubHlcblx0XHRcdC8vIE9sZCBGaXJlZm94IGRvZXNuJ3QgdGhyb3cgb24gYSBiYWRseS1lc2NhcGVkIGlkZW50aWZpZXIuXG5cdFx0XHRlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIlxcXFxcXGZcIiApO1xuXHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiW1xcXFxyXFxcXG5cXFxcZl1cIiApO1xuXHRcdH0gKTtcblxuXHRcdGFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXHRcdFx0ZWwuaW5uZXJIVE1MID0gXCI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPlwiICtcblx0XHRcdFx0XCI8c2VsZWN0IGRpc2FibGVkPSdkaXNhYmxlZCc+PG9wdGlvbi8+PC9zZWxlY3Q+XCI7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IFdpbmRvd3MgOCBOYXRpdmUgQXBwc1xuXHRcdFx0Ly8gVGhlIHR5cGUgYW5kIG5hbWUgYXR0cmlidXRlcyBhcmUgcmVzdHJpY3RlZCBkdXJpbmcgLmlubmVySFRNTCBhc3NpZ25tZW50XG5cdFx0XHR2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblx0XHRcdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwiaGlkZGVuXCIgKTtcblx0XHRcdGVsLmFwcGVuZENoaWxkKCBpbnB1dCApLnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwiRFwiICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gRW5mb3JjZSBjYXNlLXNlbnNpdGl2aXR5IG9mIG5hbWUgYXR0cmlidXRlXG5cdFx0XHRpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW25hbWU9ZF1cIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwibmFtZVwiICsgd2hpdGVzcGFjZSArIFwiKlsqXiR8IX5dPz1cIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKVxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbCggXCI6ZW5hYmxlZFwiICkubGVuZ3RoICE9PSAyICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCI6ZW5hYmxlZFwiLCBcIjpkaXNhYmxlZFwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOS0xMStcblx0XHRcdC8vIElFJ3MgOmRpc2FibGVkIHNlbGVjdG9yIGRvZXMgbm90IHBpY2sgdXAgdGhlIGNoaWxkcmVuIG9mIGRpc2FibGVkIGZpZWxkc2V0c1xuXHRcdFx0ZG9jRWxlbS5hcHBlbmRDaGlsZCggZWwgKS5kaXNhYmxlZCA9IHRydWU7XG5cdFx0XHRpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiOmRpc2FibGVkXCIgKS5sZW5ndGggIT09IDIgKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIjplbmFibGVkXCIsIFwiOmRpc2FibGVkXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogT3BlcmEgMTAgLSAxMSBvbmx5XG5cdFx0XHQvLyBPcGVyYSAxMC0xMSBkb2VzIG5vdCB0aHJvdyBvbiBwb3N0LWNvbW1hIGludmFsaWQgcHNldWRvc1xuXHRcdFx0ZWwucXVlcnlTZWxlY3RvckFsbCggXCIqLDp4XCIgKTtcblx0XHRcdHJidWdneVFTQS5wdXNoKCBcIiwuKjpcIiApO1xuXHRcdH0gKTtcblx0fVxuXG5cdGlmICggKCBzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKCBtYXRjaGVzID0gZG9jRWxlbS5tYXRjaGVzIHx8XG5cdFx0ZG9jRWxlbS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2NFbGVtLm1vek1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ub01hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubXNNYXRjaGVzU2VsZWN0b3IgKSApICkgKSB7XG5cblx0XHRhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblxuXHRcdFx0Ly8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgcG9zc2libGUgdG8gZG8gbWF0Y2hlc1NlbGVjdG9yXG5cdFx0XHQvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KVxuXHRcdFx0c3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCA9IG1hdGNoZXMuY2FsbCggZWwsIFwiKlwiICk7XG5cblx0XHRcdC8vIFRoaXMgc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb25cblx0XHRcdC8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWRcblx0XHRcdG1hdGNoZXMuY2FsbCggZWwsIFwiW3MhPScnXTp4XCIgKTtcblx0XHRcdHJidWdneU1hdGNoZXMucHVzaCggXCIhPVwiLCBwc2V1ZG9zICk7XG5cdFx0fSApO1xuXHR9XG5cblx0cmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbiggXCJ8XCIgKSApO1xuXHRyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKCBcInxcIiApICk7XG5cblx0LyogQ29udGFpbnNcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXHRoYXNDb21wYXJlID0gcm5hdGl2ZS50ZXN0KCBkb2NFbGVtLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICk7XG5cblx0Ly8gRWxlbWVudCBjb250YWlucyBhbm90aGVyXG5cdC8vIFB1cnBvc2VmdWxseSBzZWxmLWV4Y2x1c2l2ZVxuXHQvLyBBcyBpbiwgYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZlxuXHRjb250YWlucyA9IGhhc0NvbXBhcmUgfHwgcm5hdGl2ZS50ZXN0KCBkb2NFbGVtLmNvbnRhaW5zICkgP1xuXHRcdGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdFx0dmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50IDogYSxcblx0XHRcdFx0YnVwID0gYiAmJiBiLnBhcmVudE5vZGU7XG5cdFx0XHRyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmIChcblx0XHRcdFx0YWRvd24uY29udGFpbnMgP1xuXHRcdFx0XHRcdGFkb3duLmNvbnRhaW5zKCBidXAgKSA6XG5cdFx0XHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAmJiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBidXAgKSAmIDE2XG5cdFx0XHQpICk7XG5cdFx0fSA6XG5cdFx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHRpZiAoIGIgKSB7XG5cdFx0XHRcdHdoaWxlICggKCBiID0gYi5wYXJlbnROb2RlICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBiID09PSBhICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblxuXHQvKiBTb3J0aW5nXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBEb2N1bWVudCBvcmRlciBzb3J0aW5nXG5cdHNvcnRPcmRlciA9IGhhc0NvbXBhcmUgP1xuXHRmdW5jdGlvbiggYSwgYiApIHtcblxuXHRcdC8vIEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsXG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdC8vIFNvcnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb25cblx0XHR2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247XG5cdFx0aWYgKCBjb21wYXJlICkge1xuXHRcdFx0cmV0dXJuIGNvbXBhcmU7XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsY3VsYXRlIHBvc2l0aW9uIGlmIGJvdGggaW5wdXRzIGJlbG9uZyB0byB0aGUgc2FtZSBkb2N1bWVudFxuXHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0Y29tcGFyZSA9ICggYS5vd25lckRvY3VtZW50IHx8IGEgKSA9PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgP1xuXHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYiApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkXG5cdFx0XHQxO1xuXG5cdFx0Ly8gRGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0aWYgKCBjb21wYXJlICYgMSB8fFxuXHRcdFx0KCAhc3VwcG9ydC5zb3J0RGV0YWNoZWQgJiYgYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYSApID09PSBjb21wYXJlICkgKSB7XG5cblx0XHRcdC8vIENob29zZSB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIHJlbGF0ZWQgdG8gb3VyIHByZWZlcnJlZCBkb2N1bWVudFxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRcdGlmICggYSA9PSBkb2N1bWVudCB8fCBhLm93bmVyRG9jdW1lbnQgPT0gcHJlZmVycmVkRG9jICYmXG5cdFx0XHRcdGNvbnRhaW5zKCBwcmVmZXJyZWREb2MsIGEgKSApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0XHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdFx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRcdFx0aWYgKCBiID09IGRvY3VtZW50IHx8IGIub3duZXJEb2N1bWVudCA9PSBwcmVmZXJyZWREb2MgJiZcblx0XHRcdFx0Y29udGFpbnMoIHByZWZlcnJlZERvYywgYiApICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXJcblx0XHRcdHJldHVybiBzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6XG5cdFx0XHRcdDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxO1xuXHR9IDpcblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cblx0XHQvLyBFeGl0IGVhcmx5IGlmIHRoZSBub2RlcyBhcmUgaWRlbnRpY2FsXG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdHZhciBjdXIsXG5cdFx0XHRpID0gMCxcblx0XHRcdGF1cCA9IGEucGFyZW50Tm9kZSxcblx0XHRcdGJ1cCA9IGIucGFyZW50Tm9kZSxcblx0XHRcdGFwID0gWyBhIF0sXG5cdFx0XHRicCA9IFsgYiBdO1xuXG5cdFx0Ly8gUGFyZW50bGVzcyBub2RlcyBhcmUgZWl0aGVyIGRvY3VtZW50cyBvciBkaXNjb25uZWN0ZWRcblx0XHRpZiAoICFhdXAgfHwgIWJ1cCApIHtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdC8qIGVzbGludC1kaXNhYmxlIGVxZXFlcSAqL1xuXHRcdFx0cmV0dXJuIGEgPT0gZG9jdW1lbnQgPyAtMSA6XG5cdFx0XHRcdGIgPT0gZG9jdW1lbnQgPyAxIDpcblx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBlcWVxZXEgKi9cblx0XHRcdFx0YXVwID8gLTEgOlxuXHRcdFx0XHRidXAgPyAxIDpcblx0XHRcdFx0c29ydElucHV0ID9cblx0XHRcdFx0KCBpbmRleE9mKCBzb3J0SW5wdXQsIGEgKSAtIGluZGV4T2YoIHNvcnRJbnB1dCwgYiApICkgOlxuXHRcdFx0XHQwO1xuXG5cdFx0Ly8gSWYgdGhlIG5vZGVzIGFyZSBzaWJsaW5ncywgd2UgY2FuIGRvIGEgcXVpY2sgY2hlY2tcblx0XHR9IGVsc2UgaWYgKCBhdXAgPT09IGJ1cCApIHtcblx0XHRcdHJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTtcblx0XHR9XG5cblx0XHQvLyBPdGhlcndpc2Ugd2UgbmVlZCBmdWxsIGxpc3RzIG9mIHRoZWlyIGFuY2VzdG9ycyBmb3IgY29tcGFyaXNvblxuXHRcdGN1ciA9IGE7XG5cdFx0d2hpbGUgKCAoIGN1ciA9IGN1ci5wYXJlbnROb2RlICkgKSB7XG5cdFx0XHRhcC51bnNoaWZ0KCBjdXIgKTtcblx0XHR9XG5cdFx0Y3VyID0gYjtcblx0XHR3aGlsZSAoICggY3VyID0gY3VyLnBhcmVudE5vZGUgKSApIHtcblx0XHRcdGJwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblxuXHRcdC8vIFdhbGsgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5XG5cdFx0d2hpbGUgKCBhcFsgaSBdID09PSBicFsgaSBdICkge1xuXHRcdFx0aSsrO1xuXHRcdH1cblxuXHRcdHJldHVybiBpID9cblxuXHRcdFx0Ly8gRG8gYSBzaWJsaW5nIGNoZWNrIGlmIHRoZSBub2RlcyBoYXZlIGEgY29tbW9uIGFuY2VzdG9yXG5cdFx0XHRzaWJsaW5nQ2hlY2soIGFwWyBpIF0sIGJwWyBpIF0gKSA6XG5cblx0XHRcdC8vIE90aGVyd2lzZSBub2RlcyBpbiBvdXIgZG9jdW1lbnQgc29ydCBmaXJzdFxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdC8qIGVzbGludC1kaXNhYmxlIGVxZXFlcSAqL1xuXHRcdFx0YXBbIGkgXSA9PSBwcmVmZXJyZWREb2MgPyAtMSA6XG5cdFx0XHRicFsgaSBdID09IHByZWZlcnJlZERvYyA/IDEgOlxuXHRcdFx0LyogZXNsaW50LWVuYWJsZSBlcWVxZXEgKi9cblx0XHRcdDA7XG5cdH07XG5cblx0cmV0dXJuIGRvY3VtZW50O1xufTtcblxuU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbiggZXhwciwgZWxlbWVudHMgKSB7XG5cdHJldHVybiBTaXp6bGUoIGV4cHIsIG51bGwsIG51bGwsIGVsZW1lbnRzICk7XG59O1xuXG5TaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIGVsZW0sIGV4cHIgKSB7XG5cdHNldERvY3VtZW50KCBlbGVtICk7XG5cblx0aWYgKCBzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciAmJiBkb2N1bWVudElzSFRNTCAmJlxuXHRcdCFub25uYXRpdmVTZWxlY3RvckNhY2hlWyBleHByICsgXCIgXCIgXSAmJlxuXHRcdCggIXJidWdneU1hdGNoZXMgfHwgIXJidWdneU1hdGNoZXMudGVzdCggZXhwciApICkgJiZcblx0XHQoICFyYnVnZ3lRU0EgICAgIHx8ICFyYnVnZ3lRU0EudGVzdCggZXhwciApICkgKSB7XG5cblx0XHR0cnkge1xuXHRcdFx0dmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApO1xuXG5cdFx0XHQvLyBJRSA5J3MgbWF0Y2hlc1NlbGVjdG9yIHJldHVybnMgZmFsc2Ugb24gZGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0XHRpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8XG5cblx0XHRcdFx0Ly8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnRcblx0XHRcdFx0Ly8gZnJhZ21lbnQgaW4gSUUgOVxuXHRcdFx0XHRlbGVtLmRvY3VtZW50ICYmIGVsZW0uZG9jdW1lbnQubm9kZVR5cGUgIT09IDExICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKCBlICkge1xuXHRcdFx0bm9ubmF0aXZlU2VsZWN0b3JDYWNoZSggZXhwciwgdHJ1ZSApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBTaXp6bGUoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBbIGVsZW0gXSApLmxlbmd0aCA+IDA7XG59O1xuXG5TaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggY29udGV4dCwgZWxlbSApIHtcblxuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0aWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGNvbnRleHQgKTtcblx0fVxuXHRyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTtcbn07XG5cblNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdGlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdH1cblxuXHR2YXIgZm4gPSBFeHByLmF0dHJIYW5kbGVbIG5hbWUudG9Mb3dlckNhc2UoKSBdLFxuXG5cdFx0Ly8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpXG5cdFx0dmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0Zm4oIGVsZW0sIG5hbWUsICFkb2N1bWVudElzSFRNTCApIDpcblx0XHRcdHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgP1xuXHRcdHZhbCA6XG5cdFx0c3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDpcblx0XHRcdCggdmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkgKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0dmFsLnZhbHVlIDpcblx0XHRcdFx0bnVsbDtcbn07XG5cblNpenpsZS5lc2NhcGUgPSBmdW5jdGlvbiggc2VsICkge1xuXHRyZXR1cm4gKCBzZWwgKyBcIlwiICkucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApO1xufTtcblxuU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHtcblx0dGhyb3cgbmV3IEVycm9yKCBcIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246IFwiICsgbXNnICk7XG59O1xuXG4vKipcbiAqIERvY3VtZW50IHNvcnRpbmcgYW5kIHJlbW92aW5nIGR1cGxpY2F0ZXNcbiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzXG4gKi9cblNpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24oIHJlc3VsdHMgKSB7XG5cdHZhciBlbGVtLFxuXHRcdGR1cGxpY2F0ZXMgPSBbXSxcblx0XHRqID0gMCxcblx0XHRpID0gMDtcblxuXHQvLyBVbmxlc3Mgd2UgKmtub3cqIHdlIGNhbiBkZXRlY3QgZHVwbGljYXRlcywgYXNzdW1lIHRoZWlyIHByZXNlbmNlXG5cdGhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7XG5cdHNvcnRJbnB1dCA9ICFzdXBwb3J0LnNvcnRTdGFibGUgJiYgcmVzdWx0cy5zbGljZSggMCApO1xuXHRyZXN1bHRzLnNvcnQoIHNvcnRPcmRlciApO1xuXG5cdGlmICggaGFzRHVwbGljYXRlICkge1xuXHRcdHdoaWxlICggKCBlbGVtID0gcmVzdWx0c1sgaSsrIF0gKSApIHtcblx0XHRcdGlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSBdICkge1xuXHRcdFx0XHRqID0gZHVwbGljYXRlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHdoaWxlICggai0tICkge1xuXHRcdFx0cmVzdWx0cy5zcGxpY2UoIGR1cGxpY2F0ZXNbIGogXSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdC8vIENsZWFyIGlucHV0IGFmdGVyIHNvcnRpbmcgdG8gcmVsZWFzZSBvYmplY3RzXG5cdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L3NpenpsZS9wdWxsLzIyNVxuXHRzb3J0SW5wdXQgPSBudWxsO1xuXG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciByZXRyaWV2aW5nIHRoZSB0ZXh0IHZhbHVlIG9mIGFuIGFycmF5IG9mIERPTSBub2Rlc1xuICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtXG4gKi9cbmdldFRleHQgPSBTaXp6bGUuZ2V0VGV4dCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHR2YXIgbm9kZSxcblx0XHRyZXQgPSBcIlwiLFxuXHRcdGkgPSAwLFxuXHRcdG5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRpZiAoICFub2RlVHlwZSApIHtcblxuXHRcdC8vIElmIG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5XG5cdFx0d2hpbGUgKCAoIG5vZGUgPSBlbGVtWyBpKysgXSApICkge1xuXG5cdFx0XHQvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2Rlc1xuXHRcdFx0cmV0ICs9IGdldFRleHQoIG5vZGUgKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHtcblxuXHRcdC8vIFVzZSB0ZXh0Q29udGVudCBmb3IgZWxlbWVudHNcblx0XHQvLyBpbm5lclRleHQgdXNhZ2UgcmVtb3ZlZCBmb3IgY29uc2lzdGVuY3kgb2YgbmV3IGxpbmVzIChqUXVlcnkgIzExMTUzKVxuXHRcdGlmICggdHlwZW9mIGVsZW0udGV4dENvbnRlbnQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS50ZXh0Q29udGVudDtcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBUcmF2ZXJzZSBpdHMgY2hpbGRyZW5cblx0XHRcdGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkge1xuXHRcdFx0XHRyZXQgKz0gZ2V0VGV4dCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmICggbm9kZVR5cGUgPT09IDMgfHwgbm9kZVR5cGUgPT09IDQgKSB7XG5cdFx0cmV0dXJuIGVsZW0ubm9kZVZhbHVlO1xuXHR9XG5cblx0Ly8gRG8gbm90IGluY2x1ZGUgY29tbWVudCBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5vZGVzXG5cblx0cmV0dXJuIHJldDtcbn07XG5cbkV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzID0ge1xuXG5cdC8vIENhbiBiZSBhZGp1c3RlZCBieSB0aGUgdXNlclxuXHRjYWNoZUxlbmd0aDogNTAsXG5cblx0Y3JlYXRlUHNldWRvOiBtYXJrRnVuY3Rpb24sXG5cblx0bWF0Y2g6IG1hdGNoRXhwcixcblxuXHRhdHRySGFuZGxlOiB7fSxcblxuXHRmaW5kOiB7fSxcblxuXHRyZWxhdGl2ZToge1xuXHRcdFwiPlwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCIgXCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiB9LFxuXHRcdFwiK1wiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIn5cIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIgfVxuXHR9LFxuXG5cdHByZUZpbHRlcjoge1xuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaFsgMSBdID0gbWF0Y2hbIDEgXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXG5cdFx0XHQvLyBNb3ZlIHRoZSBnaXZlbiB2YWx1ZSB0byBtYXRjaFszXSB3aGV0aGVyIHF1b3RlZCBvciB1bnF1b3RlZFxuXHRcdFx0bWF0Y2hbIDMgXSA9ICggbWF0Y2hbIDMgXSB8fCBtYXRjaFsgNCBdIHx8XG5cdFx0XHRcdG1hdGNoWyA1IF0gfHwgXCJcIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdGlmICggbWF0Y2hbIDIgXSA9PT0gXCJ+PVwiICkge1xuXHRcdFx0XHRtYXRjaFsgMyBdID0gXCIgXCIgKyBtYXRjaFsgMyBdICsgXCIgXCI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgNCApO1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblxuXHRcdFx0LyogbWF0Y2hlcyBmcm9tIG1hdGNoRXhwcltcIkNISUxEXCJdXG5cdFx0XHRcdDEgdHlwZSAob25seXxudGh8Li4uKVxuXHRcdFx0XHQyIHdoYXQgKGNoaWxkfG9mLXR5cGUpXG5cdFx0XHRcdDMgYXJndW1lbnQgKGV2ZW58b2RkfFxcZCp8XFxkKm4oWystXVxcZCspP3wuLi4pXG5cdFx0XHRcdDQgeG4tY29tcG9uZW50IG9mIHhuK3kgYXJndW1lbnQgKFsrLV0/XFxkKm58KVxuXHRcdFx0XHQ1IHNpZ24gb2YgeG4tY29tcG9uZW50XG5cdFx0XHRcdDYgeCBvZiB4bi1jb21wb25lbnRcblx0XHRcdFx0NyBzaWduIG9mIHktY29tcG9uZW50XG5cdFx0XHRcdDggeSBvZiB5LWNvbXBvbmVudFxuXHRcdFx0Ki9cblx0XHRcdG1hdGNoWyAxIF0gPSBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdGlmICggbWF0Y2hbIDEgXS5zbGljZSggMCwgMyApID09PSBcIm50aFwiICkge1xuXG5cdFx0XHRcdC8vIG50aC0qIHJlcXVpcmVzIGFyZ3VtZW50XG5cdFx0XHRcdGlmICggIW1hdGNoWyAzIF0gKSB7XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFsgMCBdICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBudW1lcmljIHggYW5kIHkgcGFyYW1ldGVycyBmb3IgRXhwci5maWx0ZXIuQ0hJTERcblx0XHRcdFx0Ly8gcmVtZW1iZXIgdGhhdCBmYWxzZS90cnVlIGNhc3QgcmVzcGVjdGl2ZWx5IHRvIDAvMVxuXHRcdFx0XHRtYXRjaFsgNCBdID0gKyggbWF0Y2hbIDQgXSA/XG5cdFx0XHRcdFx0bWF0Y2hbIDUgXSArICggbWF0Y2hbIDYgXSB8fCAxICkgOlxuXHRcdFx0XHRcdDIgKiAoIG1hdGNoWyAzIF0gPT09IFwiZXZlblwiIHx8IG1hdGNoWyAzIF0gPT09IFwib2RkXCIgKSApO1xuXHRcdFx0XHRtYXRjaFsgNSBdID0gKyggKCBtYXRjaFsgNyBdICsgbWF0Y2hbIDggXSApIHx8IG1hdGNoWyAzIF0gPT09IFwib2RkXCIgKTtcblxuXHRcdFx0XHQvLyBvdGhlciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWyAzIF0gKSB7XG5cdFx0XHRcdFNpenpsZS5lcnJvciggbWF0Y2hbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0fSxcblxuXHRcdFwiUFNFVURPXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdHZhciBleGNlc3MsXG5cdFx0XHRcdHVucXVvdGVkID0gIW1hdGNoWyA2IF0gJiYgbWF0Y2hbIDIgXTtcblxuXHRcdFx0aWYgKCBtYXRjaEV4cHJbIFwiQ0hJTERcIiBdLnRlc3QoIG1hdGNoWyAwIF0gKSApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFjY2VwdCBxdW90ZWQgYXJndW1lbnRzIGFzLWlzXG5cdFx0XHRpZiAoIG1hdGNoWyAzIF0gKSB7XG5cdFx0XHRcdG1hdGNoWyAyIF0gPSBtYXRjaFsgNCBdIHx8IG1hdGNoWyA1IF0gfHwgXCJcIjtcblxuXHRcdFx0Ly8gU3RyaXAgZXhjZXNzIGNoYXJhY3RlcnMgZnJvbSB1bnF1b3RlZCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIHVucXVvdGVkICYmIHJwc2V1ZG8udGVzdCggdW5xdW90ZWQgKSAmJlxuXG5cdFx0XHRcdC8vIEdldCBleGNlc3MgZnJvbSB0b2tlbml6ZSAocmVjdXJzaXZlbHkpXG5cdFx0XHRcdCggZXhjZXNzID0gdG9rZW5pemUoIHVucXVvdGVkLCB0cnVlICkgKSAmJlxuXG5cdFx0XHRcdC8vIGFkdmFuY2UgdG8gdGhlIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpc1xuXHRcdFx0XHQoIGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoIFwiKVwiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCApICkge1xuXG5cdFx0XHRcdC8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4XG5cdFx0XHRcdG1hdGNoWyAwIF0gPSBtYXRjaFsgMCBdLnNsaWNlKCAwLCBleGNlc3MgKTtcblx0XHRcdFx0bWF0Y2hbIDIgXSA9IHVucXVvdGVkLnNsaWNlKCAwLCBleGNlc3MgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV0dXJuIG9ubHkgY2FwdHVyZXMgbmVlZGVkIGJ5IHRoZSBwc2V1ZG8gZmlsdGVyIG1ldGhvZCAodHlwZSBhbmQgYXJndW1lbnQpXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDMgKTtcblx0XHR9XG5cdH0sXG5cblx0ZmlsdGVyOiB7XG5cblx0XHRcIlRBR1wiOiBmdW5jdGlvbiggbm9kZU5hbWVTZWxlY3RvciApIHtcblx0XHRcdHZhciBub2RlTmFtZSA9IG5vZGVOYW1lU2VsZWN0b3IucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIG5vZGVOYW1lU2VsZWN0b3IgPT09IFwiKlwiID9cblx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0gOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lO1xuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNMQVNTXCI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7XG5cdFx0XHR2YXIgcGF0dGVybiA9IGNsYXNzQ2FjaGVbIGNsYXNzTmFtZSArIFwiIFwiIF07XG5cblx0XHRcdHJldHVybiBwYXR0ZXJuIHx8XG5cdFx0XHRcdCggcGF0dGVybiA9IG5ldyBSZWdFeHAoIFwiKF58XCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFx0XHRcIilcIiArIGNsYXNzTmFtZSArIFwiKFwiICsgd2hpdGVzcGFjZSArIFwifCQpXCIgKSApICYmIGNsYXNzQ2FjaGUoXG5cdFx0XHRcdFx0XHRjbGFzc05hbWUsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcGF0dGVybi50ZXN0KFxuXHRcdFx0XHRcdFx0XHRcdHR5cGVvZiBlbGVtLmNsYXNzTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBlbGVtLmNsYXNzTmFtZSB8fFxuXHRcdFx0XHRcdFx0XHRcdHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiApIHx8XG5cdFx0XHRcdFx0XHRcdFx0XCJcIlxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9ICk7XG5cdFx0fSxcblxuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbmFtZSwgb3BlcmF0b3IsIGNoZWNrICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgcmVzdWx0ID0gU2l6emxlLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdFx0XHRpZiAoIHJlc3VsdCA9PSBudWxsICkge1xuXHRcdFx0XHRcdHJldHVybiBvcGVyYXRvciA9PT0gXCIhPVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggIW9wZXJhdG9yICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVzdWx0ICs9IFwiXCI7XG5cblx0XHRcdFx0LyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuXG5cdFx0XHRcdHJldHVybiBvcGVyYXRvciA9PT0gXCI9XCIgPyByZXN1bHQgPT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCIhPVwiID8gcmVzdWx0ICE9PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiXj1cIiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID09PSAwIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCIqPVwiID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPiAtMSA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiJD1cIiA/IGNoZWNrICYmIHJlc3VsdC5zbGljZSggLWNoZWNrLmxlbmd0aCApID09PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwifj1cIiA/ICggXCIgXCIgKyByZXN1bHQucmVwbGFjZSggcndoaXRlc3BhY2UsIFwiIFwiICkgKyBcIiBcIiApLmluZGV4T2YoIGNoZWNrICkgPiAtMSA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwifD1cIiA/IHJlc3VsdCA9PT0gY2hlY2sgfHwgcmVzdWx0LnNsaWNlKCAwLCBjaGVjay5sZW5ndGggKyAxICkgPT09IGNoZWNrICsgXCItXCIgOlxuXHRcdFx0XHRcdGZhbHNlO1xuXHRcdFx0XHQvKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi9cblxuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJDSElMRFwiOiBmdW5jdGlvbiggdHlwZSwgd2hhdCwgX2FyZ3VtZW50LCBmaXJzdCwgbGFzdCApIHtcblx0XHRcdHZhciBzaW1wbGUgPSB0eXBlLnNsaWNlKCAwLCAzICkgIT09IFwibnRoXCIsXG5cdFx0XHRcdGZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSBcImxhc3RcIixcblx0XHRcdFx0b2ZUeXBlID0gd2hhdCA9PT0gXCJvZi10eXBlXCI7XG5cblx0XHRcdHJldHVybiBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwID9cblxuXHRcdFx0XHQvLyBTaG9ydGN1dCBmb3IgOm50aC0qKG4pXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiAhIWVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdFx0fSA6XG5cblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIF9jb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0dmFyIGNhY2hlLCB1bmlxdWVDYWNoZSwgb3V0ZXJDYWNoZSwgbm9kZSwgbm9kZUluZGV4LCBzdGFydCxcblx0XHRcdFx0XHRcdGRpciA9IHNpbXBsZSAhPT0gZm9yd2FyZCA/IFwibmV4dFNpYmxpbmdcIiA6IFwicHJldmlvdXNTaWJsaW5nXCIsXG5cdFx0XHRcdFx0XHRwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGUsXG5cdFx0XHRcdFx0XHRuYW1lID0gb2ZUeXBlICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxcblx0XHRcdFx0XHRcdHVzZUNhY2hlID0gIXhtbCAmJiAhb2ZUeXBlLFxuXHRcdFx0XHRcdFx0ZGlmZiA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIDooZmlyc3R8bGFzdHxvbmx5KS0oY2hpbGR8b2YtdHlwZSlcblx0XHRcdFx0XHRcdGlmICggc2ltcGxlICkge1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoIGRpciApIHtcblx0XHRcdFx0XHRcdFx0XHRub2RlID0gZWxlbTtcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoICggbm9kZSA9IG5vZGVbIGRpciBdICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG9mVHlwZSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdC8vIFJldmVyc2UgZGlyZWN0aW9uIGZvciA6b25seS0qIChpZiB3ZSBoYXZlbid0IHlldCBkb25lIHNvKVxuXHRcdFx0XHRcdFx0XHRcdHN0YXJ0ID0gZGlyID0gdHlwZSA9PT0gXCJvbmx5XCIgJiYgIXN0YXJ0ICYmIFwibmV4dFNpYmxpbmdcIjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0c3RhcnQgPSBbIGZvcndhcmQgPyBwYXJlbnQuZmlyc3RDaGlsZCA6IHBhcmVudC5sYXN0Q2hpbGQgXTtcblxuXHRcdFx0XHRcdFx0Ly8gbm9uLXhtbCA6bnRoLWNoaWxkKC4uLikgc3RvcmVzIGNhY2hlIGRhdGEgb24gYHBhcmVudGBcblx0XHRcdFx0XHRcdGlmICggZm9yd2FyZCAmJiB1c2VDYWNoZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBTZWVrIGBlbGVtYCBmcm9tIGEgcHJldmlvdXNseS1jYWNoZWQgaW5kZXhcblxuXHRcdFx0XHRcdFx0XHQvLyAuLi5pbiBhIGd6aXAtZnJpZW5kbHkgd2F5XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBwYXJlbnQ7XG5cdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBub2RlWyBleHBhbmRvIF0gfHwgKCBub2RlWyBleHBhbmRvIF0gPSB7fSApO1xuXG5cdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw5IG9ubHlcblx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0KCBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSApO1xuXG5cdFx0XHRcdFx0XHRcdGNhY2hlID0gdW5pcXVlQ2FjaGVbIHR5cGUgXSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdO1xuXHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4ICYmIGNhY2hlWyAyIF07XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBub2RlSW5kZXggJiYgcGFyZW50LmNoaWxkTm9kZXNbIG5vZGVJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKCBub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fFxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gRmFsbGJhY2sgdG8gc2Vla2luZyBgZWxlbWAgZnJvbSB0aGUgc3RhcnRcblx0XHRcdFx0XHRcdFx0XHQoIGRpZmYgPSBub2RlSW5kZXggPSAwICkgfHwgc3RhcnQucG9wKCkgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFdoZW4gZm91bmQsIGNhY2hlIGluZGV4ZXMgb24gYHBhcmVudGAgYW5kIGJyZWFrXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBub2RlLm5vZGVUeXBlID09PSAxICYmICsrZGlmZiAmJiBub2RlID09PSBlbGVtICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGVbIHR5cGUgXSA9IFsgZGlycnVucywgbm9kZUluZGV4LCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBVc2UgcHJldmlvdXNseS1jYWNoZWQgZWxlbWVudCBpbmRleCBpZiBhdmFpbGFibGVcblx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXlcblx0XHRcdFx0XHRcdFx0XHRub2RlID0gZWxlbTtcblx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8ICggbm9kZVsgZXhwYW5kbyBdID0ge30gKTtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw5IG9ubHlcblx0XHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KCBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSApO1xuXG5cdFx0XHRcdFx0XHRcdFx0Y2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRcdG5vZGVJbmRleCA9IGNhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbIDEgXTtcblx0XHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4O1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8geG1sIDpudGgtY2hpbGQoLi4uKVxuXHRcdFx0XHRcdFx0XHQvLyBvciA6bnRoLWxhc3QtY2hpbGQoLi4uKSBvciA6bnRoKC1sYXN0KT8tb2YtdHlwZSguLi4pXG5cdFx0XHRcdFx0XHRcdGlmICggZGlmZiA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBVc2UgdGhlIHNhbWUgbG9vcCBhcyBhYm92ZSB0byBzZWVrIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICggKCBub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KCBkaWZmID0gbm9kZUluZGV4ID0gMCApIHx8IHN0YXJ0LnBvcCgpICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICggKCBvZlR5cGUgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVUeXBlID09PSAxICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0KytkaWZmICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIENhY2hlIHRoZSBpbmRleCBvZiBlYWNoIGVuY291bnRlcmVkIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQoIG5vZGVbIGV4cGFuZG8gXSA9IHt9ICk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCggb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30gKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIGRpZmYgXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggbm9kZSA9PT0gZWxlbSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBJbmNvcnBvcmF0ZSB0aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZVxuXHRcdFx0XHRcdFx0ZGlmZiAtPSBsYXN0O1xuXHRcdFx0XHRcdFx0cmV0dXJuIGRpZmYgPT09IGZpcnN0IHx8ICggZGlmZiAlIGZpcnN0ID09PSAwICYmIGRpZmYgLyBmaXJzdCA+PSAwICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIlBTRVVET1wiOiBmdW5jdGlvbiggcHNldWRvLCBhcmd1bWVudCApIHtcblxuXHRcdFx0Ly8gcHNldWRvLWNsYXNzIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI3BzZXVkby1jbGFzc2VzXG5cdFx0XHQvLyBQcmlvcml0aXplIGJ5IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBlcmNhc2UgbGV0dGVyc1xuXHRcdFx0Ly8gUmVtZW1iZXIgdGhhdCBzZXRGaWx0ZXJzIGluaGVyaXRzIGZyb20gcHNldWRvc1xuXHRcdFx0dmFyIGFyZ3MsXG5cdFx0XHRcdGZuID0gRXhwci5wc2V1ZG9zWyBwc2V1ZG8gXSB8fCBFeHByLnNldEZpbHRlcnNbIHBzZXVkby50b0xvd2VyQ2FzZSgpIF0gfHxcblx0XHRcdFx0XHRTaXp6bGUuZXJyb3IoIFwidW5zdXBwb3J0ZWQgcHNldWRvOiBcIiArIHBzZXVkbyApO1xuXG5cdFx0XHQvLyBUaGUgdXNlciBtYXkgdXNlIGNyZWF0ZVBzZXVkbyB0byBpbmRpY2F0ZSB0aGF0XG5cdFx0XHQvLyBhcmd1bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvblxuXHRcdFx0Ly8ganVzdCBhcyBTaXp6bGUgZG9lc1xuXHRcdFx0aWYgKCBmblsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRyZXR1cm4gZm4oIGFyZ3VtZW50ICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEJ1dCBtYWludGFpbiBzdXBwb3J0IGZvciBvbGQgc2lnbmF0dXJlc1xuXHRcdFx0aWYgKCBmbi5sZW5ndGggPiAxICkge1xuXHRcdFx0XHRhcmdzID0gWyBwc2V1ZG8sIHBzZXVkbywgXCJcIiwgYXJndW1lbnQgXTtcblx0XHRcdFx0cmV0dXJuIEV4cHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eSggcHNldWRvLnRvTG93ZXJDYXNlKCkgKSA/XG5cdFx0XHRcdFx0bWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdFx0XHRcdHZhciBpZHgsXG5cdFx0XHRcdFx0XHRcdG1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSxcblx0XHRcdFx0XHRcdFx0aSA9IG1hdGNoZWQubGVuZ3RoO1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRcdGlkeCA9IGluZGV4T2YoIHNlZWQsIG1hdGNoZWRbIGkgXSApO1xuXHRcdFx0XHRcdFx0XHRzZWVkWyBpZHggXSA9ICEoIG1hdGNoZXNbIGlkeCBdID0gbWF0Y2hlZFsgaSBdICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSApIDpcblx0XHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRcdHJldHVybiBmbiggZWxlbSwgMCwgYXJncyApO1xuXHRcdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmbjtcblx0XHR9XG5cdH0sXG5cblx0cHNldWRvczoge1xuXG5cdFx0Ly8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zXG5cdFx0XCJub3RcIjogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cblx0XHRcdC8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlXG5cdFx0XHQvLyB0byBhdm9pZCB0cmVhdGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZ1xuXHRcdFx0Ly8gc3BhY2VzIGFzIGNvbWJpbmF0b3JzXG5cdFx0XHR2YXIgaW5wdXQgPSBbXSxcblx0XHRcdFx0cmVzdWx0cyA9IFtdLFxuXHRcdFx0XHRtYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApICk7XG5cblx0XHRcdHJldHVybiBtYXRjaGVyWyBleHBhbmRvIF0gP1xuXHRcdFx0XHRtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzLCBfY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHRcdFx0dW5tYXRjaGVkID0gbWF0Y2hlciggc2VlZCwgbnVsbCwgeG1sLCBbXSApLFxuXHRcdFx0XHRcdFx0aSA9IHNlZWQubGVuZ3RoO1xuXG5cdFx0XHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYFxuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoIGVsZW0gPSB1bm1hdGNoZWRbIGkgXSApICkge1xuXHRcdFx0XHRcdFx0XHRzZWVkWyBpIF0gPSAhKCBtYXRjaGVzWyBpIF0gPSBlbGVtICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSwgX2NvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHRpbnB1dFsgMCBdID0gZWxlbTtcblx0XHRcdFx0XHRtYXRjaGVyKCBpbnB1dCwgbnVsbCwgeG1sLCByZXN1bHRzICk7XG5cblx0XHRcdFx0XHQvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0XHRcdGlucHV0WyAwIF0gPSBudWxsO1xuXHRcdFx0XHRcdHJldHVybiAhcmVzdWx0cy5wb3AoKTtcblx0XHRcdFx0fTtcblx0XHR9ICksXG5cblx0XHRcImhhc1wiOiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwO1xuXHRcdFx0fTtcblx0XHR9ICksXG5cblx0XHRcImNvbnRhaW5zXCI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHR0ZXh0ID0gdGV4dC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLnRleHRDb250ZW50IHx8IGdldFRleHQoIGVsZW0gKSApLmluZGV4T2YoIHRleHQgKSA+IC0xO1xuXHRcdFx0fTtcblx0XHR9ICksXG5cblx0XHQvLyBcIldoZXRoZXIgYW4gZWxlbWVudCBpcyByZXByZXNlbnRlZCBieSBhIDpsYW5nKCkgc2VsZWN0b3Jcblx0XHQvLyBpcyBiYXNlZCBzb2xlbHkgb24gdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZVxuXHRcdC8vIGJlaW5nIGVxdWFsIHRvIHRoZSBpZGVudGlmaWVyIEMsXG5cdFx0Ly8gb3IgYmVnaW5uaW5nIHdpdGggdGhlIGlkZW50aWZpZXIgQyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBcIi1cIi5cblx0XHQvLyBUaGUgbWF0Y2hpbmcgb2YgQyBhZ2FpbnN0IHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUgaXMgcGVyZm9ybWVkIGNhc2UtaW5zZW5zaXRpdmVseS5cblx0XHQvLyBUaGUgaWRlbnRpZmllciBDIGRvZXMgbm90IGhhdmUgdG8gYmUgYSB2YWxpZCBsYW5ndWFnZSBuYW1lLlwiXG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNsYW5nLXBzZXVkb1xuXHRcdFwibGFuZ1wiOiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBsYW5nICkge1xuXG5cdFx0XHQvLyBsYW5nIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyXG5cdFx0XHRpZiAoICFyaWRlbnRpZmllci50ZXN0KCBsYW5nIHx8IFwiXCIgKSApIHtcblx0XHRcdFx0U2l6emxlLmVycm9yKCBcInVuc3VwcG9ydGVkIGxhbmc6IFwiICsgbGFuZyApO1xuXHRcdFx0fVxuXHRcdFx0bGFuZyA9IGxhbmcucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgZWxlbUxhbmc7XG5cdFx0XHRcdGRvIHtcblx0XHRcdFx0XHRpZiAoICggZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRcdFx0XHRlbGVtLmxhbmcgOlxuXHRcdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoIFwieG1sOmxhbmdcIiApIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCBcImxhbmdcIiApICkgKSB7XG5cblx0XHRcdFx0XHRcdGVsZW1MYW5nID0gZWxlbUxhbmcudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtTGFuZyA9PT0gbGFuZyB8fCBlbGVtTGFuZy5pbmRleE9mKCBsYW5nICsgXCItXCIgKSA9PT0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gd2hpbGUgKCAoIGVsZW0gPSBlbGVtLnBhcmVudE5vZGUgKSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH07XG5cdFx0fSApLFxuXG5cdFx0Ly8gTWlzY2VsbGFuZW91c1xuXHRcdFwidGFyZ2V0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9uLmhhc2g7XG5cdFx0XHRyZXR1cm4gaGFzaCAmJiBoYXNoLnNsaWNlKCAxICkgPT09IGVsZW0uaWQ7XG5cdFx0fSxcblxuXHRcdFwicm9vdFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBkb2NFbGVtO1xuXHRcdH0sXG5cblx0XHRcImZvY3VzXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiZcblx0XHRcdFx0KCAhZG9jdW1lbnQuaGFzRm9jdXMgfHwgZG9jdW1lbnQuaGFzRm9jdXMoKSApICYmXG5cdFx0XHRcdCEhKCBlbGVtLnR5cGUgfHwgZWxlbS5ocmVmIHx8IH5lbGVtLnRhYkluZGV4ICk7XG5cdFx0fSxcblxuXHRcdC8vIEJvb2xlYW4gcHJvcGVydGllc1xuXHRcdFwiZW5hYmxlZFwiOiBjcmVhdGVEaXNhYmxlZFBzZXVkbyggZmFsc2UgKSxcblx0XHRcImRpc2FibGVkXCI6IGNyZWF0ZURpc2FibGVkUHNldWRvKCB0cnVlICksXG5cblx0XHRcImNoZWNrZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8vIEluIENTUzMsIDpjaGVja2VkIHNob3VsZCByZXR1cm4gYm90aCBjaGVja2VkIGFuZCBzZWxlY3RlZCBlbGVtZW50c1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWRcblx0XHRcdHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgISFlbGVtLmNoZWNrZWQgKSB8fFxuXHRcdFx0XHQoIG5vZGVOYW1lID09PSBcIm9wdGlvblwiICYmICEhZWxlbS5zZWxlY3RlZCApO1xuXHRcdH0sXG5cblx0XHRcInNlbGVjdGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0XG5cdFx0XHQvLyBvcHRpb25zIGluIFNhZmFyaSB3b3JrIHByb3Blcmx5XG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXHRcdFx0XHRlbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7XG5cdFx0fSxcblxuXHRcdC8vIENvbnRlbnRzXG5cdFx0XCJlbXB0eVwiOiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG9cblx0XHRcdC8vIDplbXB0eSBpcyBuZWdhdGVkIGJ5IGVsZW1lbnQgKDEpIG9yIGNvbnRlbnQgbm9kZXMgKHRleHQ6IDM7IGNkYXRhOiA0OyBlbnRpdHkgcmVmOiA1KSxcblx0XHRcdC8vICAgYnV0IG5vdCBieSBvdGhlcnMgKGNvbW1lbnQ6IDg7IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb246IDc7IGV0Yy4pXG5cdFx0XHQvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuXG5cdFx0XHRmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHtcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHRcInBhcmVudFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAhRXhwci5wc2V1ZG9zWyBcImVtcHR5XCIgXSggZWxlbSApO1xuXHRcdH0sXG5cblx0XHQvLyBFbGVtZW50L2lucHV0IHR5cGVzXG5cdFx0XCJoZWFkZXJcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gcmhlYWRlci50ZXN0KCBlbGVtLm5vZGVOYW1lICk7XG5cdFx0fSxcblxuXHRcdFwiaW5wdXRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gcmlucHV0cy50ZXN0KCBlbGVtLm5vZGVOYW1lICk7XG5cdFx0fSxcblxuXHRcdFwiYnV0dG9uXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0udHlwZSA9PT0gXCJidXR0b25cIiB8fCBuYW1lID09PSBcImJ1dHRvblwiO1xuXHRcdH0sXG5cblx0XHRcInRleHRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgYXR0cjtcblx0XHRcdHJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiAmJlxuXHRcdFx0XHRlbGVtLnR5cGUgPT09IFwidGV4dFwiICYmXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUU8OFxuXHRcdFx0XHQvLyBOZXcgSFRNTDUgYXR0cmlidXRlIHZhbHVlcyAoZS5nLiwgXCJzZWFyY2hcIikgYXBwZWFyIHdpdGggZWxlbS50eXBlID09PSBcInRleHRcIlxuXHRcdFx0XHQoICggYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCBcInR5cGVcIiApICkgPT0gbnVsbCB8fFxuXHRcdFx0XHRcdGF0dHIudG9Mb3dlckNhc2UoKSA9PT0gXCJ0ZXh0XCIgKTtcblx0XHR9LFxuXG5cdFx0Ly8gUG9zaXRpb24taW4tY29sbGVjdGlvblxuXHRcdFwiZmlyc3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gWyAwIF07XG5cdFx0fSApLFxuXG5cdFx0XCJsYXN0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZ1bmN0aW9uKCBfbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gWyBsZW5ndGggLSAxIF07XG5cdFx0fSApLFxuXG5cdFx0XCJlcVwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggX21hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHJldHVybiBbIGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTtcblx0XHR9ICksXG5cblx0XHRcImV2ZW5cIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0dmFyIGkgPSAwO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0gKSxcblxuXHRcdFwib2RkXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHZhciBpID0gMTtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9ICksXG5cblx0XHRcImx0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/XG5cdFx0XHRcdGFyZ3VtZW50ICsgbGVuZ3RoIDpcblx0XHRcdFx0YXJndW1lbnQgPiBsZW5ndGggP1xuXHRcdFx0XHRcdGxlbmd0aCA6XG5cdFx0XHRcdFx0YXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7IC0taSA+PSAwOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSApLFxuXG5cdFx0XCJndFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0dmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50O1xuXHRcdFx0Zm9yICggOyArK2kgPCBsZW5ndGg7ICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9IClcblx0fVxufTtcblxuRXhwci5wc2V1ZG9zWyBcIm50aFwiIF0gPSBFeHByLnBzZXVkb3NbIFwiZXFcIiBdO1xuXG4vLyBBZGQgYnV0dG9uL2lucHV0IHR5cGUgcHNldWRvc1xuZm9yICggaSBpbiB7IHJhZGlvOiB0cnVlLCBjaGVja2JveDogdHJ1ZSwgZmlsZTogdHJ1ZSwgcGFzc3dvcmQ6IHRydWUsIGltYWdlOiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlSW5wdXRQc2V1ZG8oIGkgKTtcbn1cbmZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlQnV0dG9uUHNldWRvKCBpICk7XG59XG5cbi8vIEVhc3kgQVBJIGZvciBjcmVhdGluZyBuZXcgc2V0RmlsdGVyc1xuZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9XG5zZXRGaWx0ZXJzLnByb3RvdHlwZSA9IEV4cHIuZmlsdGVycyA9IEV4cHIucHNldWRvcztcbkV4cHIuc2V0RmlsdGVycyA9IG5ldyBzZXRGaWx0ZXJzKCk7XG5cbnRva2VuaXplID0gU2l6emxlLnRva2VuaXplID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBwYXJzZU9ubHkgKSB7XG5cdHZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0eXBlLFxuXHRcdHNvRmFyLCBncm91cHMsIHByZUZpbHRlcnMsXG5cdFx0Y2FjaGVkID0gdG9rZW5DYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdO1xuXG5cdGlmICggY2FjaGVkICkge1xuXHRcdHJldHVybiBwYXJzZU9ubHkgPyAwIDogY2FjaGVkLnNsaWNlKCAwICk7XG5cdH1cblxuXHRzb0ZhciA9IHNlbGVjdG9yO1xuXHRncm91cHMgPSBbXTtcblx0cHJlRmlsdGVycyA9IEV4cHIucHJlRmlsdGVyO1xuXG5cdHdoaWxlICggc29GYXIgKSB7XG5cblx0XHQvLyBDb21tYSBhbmQgZmlyc3QgcnVuXG5cdFx0aWYgKCAhbWF0Y2hlZCB8fCAoIG1hdGNoID0gcmNvbW1hLmV4ZWMoIHNvRmFyICkgKSApIHtcblx0XHRcdGlmICggbWF0Y2ggKSB7XG5cblx0XHRcdFx0Ly8gRG9uJ3QgY29uc3VtZSB0cmFpbGluZyBjb21tYXMgYXMgdmFsaWRcblx0XHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbIDAgXS5sZW5ndGggKSB8fCBzb0Zhcjtcblx0XHRcdH1cblx0XHRcdGdyb3Vwcy5wdXNoKCAoIHRva2VucyA9IFtdICkgKTtcblx0XHR9XG5cblx0XHRtYXRjaGVkID0gZmFsc2U7XG5cblx0XHQvLyBDb21iaW5hdG9yc1xuXHRcdGlmICggKCBtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApICkgKSB7XG5cdFx0XHRtYXRjaGVkID0gbWF0Y2guc2hpZnQoKTtcblx0XHRcdHRva2Vucy5wdXNoKCB7XG5cdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXG5cdFx0XHRcdC8vIENhc3QgZGVzY2VuZGFudCBjb21iaW5hdG9ycyB0byBzcGFjZVxuXHRcdFx0XHR0eXBlOiBtYXRjaFsgMCBdLnJlcGxhY2UoIHJ0cmltLCBcIiBcIiApXG5cdFx0XHR9ICk7XG5cdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApO1xuXHRcdH1cblxuXHRcdC8vIEZpbHRlcnNcblx0XHRmb3IgKCB0eXBlIGluIEV4cHIuZmlsdGVyICkge1xuXHRcdFx0aWYgKCAoIG1hdGNoID0gbWF0Y2hFeHByWyB0eXBlIF0uZXhlYyggc29GYXIgKSApICYmICggIXByZUZpbHRlcnNbIHR5cGUgXSB8fFxuXHRcdFx0XHQoIG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApICkgKSApIHtcblx0XHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHRcdHRva2Vucy5wdXNoKCB7XG5cdFx0XHRcdFx0dmFsdWU6IG1hdGNoZWQsXG5cdFx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0XHRtYXRjaGVzOiBtYXRjaFxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCAhbWF0Y2hlZCApIHtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnZhbGlkIGV4Y2Vzc1xuXHQvLyBpZiB3ZSdyZSBqdXN0IHBhcnNpbmdcblx0Ly8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvciBvciByZXR1cm4gdG9rZW5zXG5cdHJldHVybiBwYXJzZU9ubHkgP1xuXHRcdHNvRmFyLmxlbmd0aCA6XG5cdFx0c29GYXIgP1xuXHRcdFx0U2l6emxlLmVycm9yKCBzZWxlY3RvciApIDpcblxuXHRcdFx0Ly8gQ2FjaGUgdGhlIHRva2Vuc1xuXHRcdFx0dG9rZW5DYWNoZSggc2VsZWN0b3IsIGdyb3VwcyApLnNsaWNlKCAwICk7XG59O1xuXG5mdW5jdGlvbiB0b1NlbGVjdG9yKCB0b2tlbnMgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdHNlbGVjdG9yID0gXCJcIjtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0c2VsZWN0b3IgKz0gdG9rZW5zWyBpIF0udmFsdWU7XG5cdH1cblx0cmV0dXJuIHNlbGVjdG9yO1xufVxuXG5mdW5jdGlvbiBhZGRDb21iaW5hdG9yKCBtYXRjaGVyLCBjb21iaW5hdG9yLCBiYXNlICkge1xuXHR2YXIgZGlyID0gY29tYmluYXRvci5kaXIsXG5cdFx0c2tpcCA9IGNvbWJpbmF0b3IubmV4dCxcblx0XHRrZXkgPSBza2lwIHx8IGRpcixcblx0XHRjaGVja05vbkVsZW1lbnRzID0gYmFzZSAmJiBrZXkgPT09IFwicGFyZW50Tm9kZVwiLFxuXHRcdGRvbmVOYW1lID0gZG9uZSsrO1xuXG5cdHJldHVybiBjb21iaW5hdG9yLmZpcnN0ID9cblxuXHRcdC8vIENoZWNrIGFnYWluc3QgY2xvc2VzdCBhbmNlc3Rvci9wcmVjZWRpbmcgZWxlbWVudFxuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IGVsZW1bIGRpciBdICkgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdHJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gOlxuXG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBhbGwgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRzXG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsXG5cdFx0XHRcdG5ld0NhY2hlID0gWyBkaXJydW5zLCBkb25lTmFtZSBdO1xuXG5cdFx0XHQvLyBXZSBjYW4ndCBzZXQgYXJiaXRyYXJ5IGRhdGEgb24gWE1MIG5vZGVzLCBzbyB0aGV5IGRvbid0IGJlbmVmaXQgZnJvbSBjb21iaW5hdG9yIGNhY2hpbmdcblx0XHRcdGlmICggeG1sICkge1xuXHRcdFx0XHR3aGlsZSAoICggZWxlbSA9IGVsZW1bIGRpciBdICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKCBlbGVtWyBleHBhbmRvIF0gPSB7fSApO1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdCggb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdID0ge30gKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBza2lwICYmIHNraXAgPT09IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSApIHtcblx0XHRcdFx0XHRcdFx0ZWxlbSA9IGVsZW1bIGRpciBdIHx8IGVsZW07XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCAoIG9sZENhY2hlID0gdW5pcXVlQ2FjaGVbIGtleSBdICkgJiZcblx0XHRcdFx0XHRcdFx0b2xkQ2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBvbGRDYWNoZVsgMSBdID09PSBkb25lTmFtZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBBc3NpZ24gdG8gbmV3Q2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKCBuZXdDYWNoZVsgMiBdID0gb2xkQ2FjaGVbIDIgXSApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBSZXVzZSBuZXdjYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlWyBrZXkgXSA9IG5ld0NhY2hlO1xuXG5cdFx0XHRcdFx0XHRcdC8vIEEgbWF0Y2ggbWVhbnMgd2UncmUgZG9uZTsgYSBmYWlsIG1lYW5zIHdlIGhhdmUgdG8ga2VlcCBjaGVja2luZ1xuXHRcdFx0XHRcdFx0XHRpZiAoICggbmV3Q2FjaGVbIDIgXSA9IG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xufVxuXG5mdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7XG5cdHJldHVybiBtYXRjaGVycy5sZW5ndGggPiAxID9cblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0dmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCAhbWF0Y2hlcnNbIGkgXSggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IDpcblx0XHRtYXRjaGVyc1sgMCBdO1xufVxuXG5mdW5jdGlvbiBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciwgY29udGV4dHMsIHJlc3VsdHMgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSBjb250ZXh0cy5sZW5ndGg7XG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHRzWyBpIF0sIHJlc3VsdHMgKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gY29uZGVuc2UoIHVubWF0Y2hlZCwgbWFwLCBmaWx0ZXIsIGNvbnRleHQsIHhtbCApIHtcblx0dmFyIGVsZW0sXG5cdFx0bmV3VW5tYXRjaGVkID0gW10sXG5cdFx0aSA9IDAsXG5cdFx0bGVuID0gdW5tYXRjaGVkLmxlbmd0aCxcblx0XHRtYXBwZWQgPSBtYXAgIT0gbnVsbDtcblxuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRpZiAoICggZWxlbSA9IHVubWF0Y2hlZFsgaSBdICkgKSB7XG5cdFx0XHRpZiAoICFmaWx0ZXIgfHwgZmlsdGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0bmV3VW5tYXRjaGVkLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0aWYgKCBtYXBwZWQgKSB7XG5cdFx0XHRcdFx0bWFwLnB1c2goIGkgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBuZXdVbm1hdGNoZWQ7XG59XG5cbmZ1bmN0aW9uIHNldE1hdGNoZXIoIHByZUZpbHRlciwgc2VsZWN0b3IsIG1hdGNoZXIsIHBvc3RGaWx0ZXIsIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApIHtcblx0aWYgKCBwb3N0RmlsdGVyICYmICFwb3N0RmlsdGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0cG9zdEZpbHRlciA9IHNldE1hdGNoZXIoIHBvc3RGaWx0ZXIgKTtcblx0fVxuXHRpZiAoIHBvc3RGaW5kZXIgJiYgIXBvc3RGaW5kZXJbIGV4cGFuZG8gXSApIHtcblx0XHRwb3N0RmluZGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICk7XG5cdH1cblx0cmV0dXJuIG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHtcblx0XHR2YXIgdGVtcCwgaSwgZWxlbSxcblx0XHRcdHByZU1hcCA9IFtdLFxuXHRcdFx0cG9zdE1hcCA9IFtdLFxuXHRcdFx0cHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCxcblxuXHRcdFx0Ly8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBzZWVkIG9yIGNvbnRleHRcblx0XHRcdGVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKFxuXHRcdFx0XHRzZWxlY3RvciB8fCBcIipcIixcblx0XHRcdFx0Y29udGV4dC5ub2RlVHlwZSA/IFsgY29udGV4dCBdIDogY29udGV4dCxcblx0XHRcdFx0W11cblx0XHRcdCksXG5cblx0XHRcdC8vIFByZWZpbHRlciB0byBnZXQgbWF0Y2hlciBpbnB1dCwgcHJlc2VydmluZyBhIG1hcCBmb3Igc2VlZC1yZXN1bHRzIHN5bmNocm9uaXphdGlvblxuXHRcdFx0bWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGNvbmRlbnNlKCBlbGVtcywgcHJlTWFwLCBwcmVGaWx0ZXIsIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0ZWxlbXMsXG5cblx0XHRcdG1hdGNoZXJPdXQgPSBtYXRjaGVyID9cblxuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGEgcG9zdEZpbmRlciwgb3IgZmlsdGVyZWQgc2VlZCwgb3Igbm9uLXNlZWQgcG9zdEZpbHRlciBvciBwcmVleGlzdGluZyByZXN1bHRzLFxuXHRcdFx0XHRwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/XG5cblx0XHRcdFx0XHQvLyAuLi5pbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBpcyBuZWNlc3Nhcnlcblx0XHRcdFx0XHRbXSA6XG5cblx0XHRcdFx0XHQvLyAuLi5vdGhlcndpc2UgdXNlIHJlc3VsdHMgZGlyZWN0bHlcblx0XHRcdFx0XHRyZXN1bHRzIDpcblx0XHRcdFx0bWF0Y2hlckluO1xuXG5cdFx0Ly8gRmluZCBwcmltYXJ5IG1hdGNoZXNcblx0XHRpZiAoIG1hdGNoZXIgKSB7XG5cdFx0XHRtYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHBvc3RGaWx0ZXJcblx0XHRpZiAoIHBvc3RGaWx0ZXIgKSB7XG5cdFx0XHR0ZW1wID0gY29uZGVuc2UoIG1hdGNoZXJPdXQsIHBvc3RNYXAgKTtcblx0XHRcdHBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTtcblxuXHRcdFx0Ly8gVW4tbWF0Y2ggZmFpbGluZyBlbGVtZW50cyBieSBtb3ZpbmcgdGhlbSBiYWNrIHRvIG1hdGNoZXJJblxuXHRcdFx0aSA9IHRlbXAubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggKCBlbGVtID0gdGVtcFsgaSBdICkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlck91dFsgcG9zdE1hcFsgaSBdIF0gPSAhKCBtYXRjaGVySW5bIHBvc3RNYXBbIGkgXSBdID0gZWxlbSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHtcblx0XHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXG5cdFx0XHRcdFx0Ly8gR2V0IHRoZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNvbmRlbnNpbmcgdGhpcyBpbnRlcm1lZGlhdGUgaW50byBwb3N0RmluZGVyIGNvbnRleHRzXG5cdFx0XHRcdFx0dGVtcCA9IFtdO1xuXHRcdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKCBlbGVtID0gbWF0Y2hlck91dFsgaSBdICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gUmVzdG9yZSBtYXRjaGVySW4gc2luY2UgZWxlbSBpcyBub3QgeWV0IGEgZmluYWwgbWF0Y2hcblx0XHRcdFx0XHRcdFx0dGVtcC5wdXNoKCAoIG1hdGNoZXJJblsgaSBdID0gZWxlbSApICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHBvc3RGaW5kZXIoIG51bGwsICggbWF0Y2hlck91dCA9IFtdICksIHRlbXAsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWRcblx0XHRcdFx0aSA9IG1hdGNoZXJPdXQubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRpZiAoICggZWxlbSA9IG1hdGNoZXJPdXRbIGkgXSApICYmXG5cdFx0XHRcdFx0XHQoIHRlbXAgPSBwb3N0RmluZGVyID8gaW5kZXhPZiggc2VlZCwgZWxlbSApIDogcHJlTWFwWyBpIF0gKSA+IC0xICkge1xuXG5cdFx0XHRcdFx0XHRzZWVkWyB0ZW1wIF0gPSAhKCByZXN1bHRzWyB0ZW1wIF0gPSBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBBZGQgZWxlbWVudHMgdG8gcmVzdWx0cywgdGhyb3VnaCBwb3N0RmluZGVyIGlmIGRlZmluZWRcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2hlck91dCA9IGNvbmRlbnNlKFxuXHRcdFx0XHRtYXRjaGVyT3V0ID09PSByZXN1bHRzID9cblx0XHRcdFx0XHRtYXRjaGVyT3V0LnNwbGljZSggcHJlZXhpc3RpbmcsIG1hdGNoZXJPdXQubGVuZ3RoICkgOlxuXHRcdFx0XHRcdG1hdGNoZXJPdXRcblx0XHRcdCk7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cdFx0XHRcdHBvc3RGaW5kZXIoIG51bGwsIHJlc3VsdHMsIG1hdGNoZXJPdXQsIHhtbCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgbWF0Y2hlck91dCApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSApO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkge1xuXHR2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0bGVhZGluZ1JlbGF0aXZlID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWyAwIF0udHlwZSBdLFxuXHRcdGltcGxpY2l0UmVsYXRpdmUgPSBsZWFkaW5nUmVsYXRpdmUgfHwgRXhwci5yZWxhdGl2ZVsgXCIgXCIgXSxcblx0XHRpID0gbGVhZGluZ1JlbGF0aXZlID8gMSA6IDAsXG5cblx0XHQvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKVxuXHRcdG1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hBbnlDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhPZiggY2hlY2tDb250ZXh0LCBlbGVtICkgPiAtMTtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hlcnMgPSBbIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgcmV0ID0gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8IChcblx0XHRcdFx0KCBjaGVja0NvbnRleHQgPSBjb250ZXh0ICkubm9kZVR5cGUgP1xuXHRcdFx0XHRcdG1hdGNoQ29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRcdG1hdGNoQW55Q29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgKTtcblxuXHRcdFx0Ly8gQXZvaWQgaGFuZ2luZyBvbnRvIGVsZW1lbnQgKGlzc3VlICMyOTkpXG5cdFx0XHRjaGVja0NvbnRleHQgPSBudWxsO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9IF07XG5cblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0aWYgKCAoIG1hdGNoZXIgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbIGkgXS50eXBlIF0gKSApIHtcblx0XHRcdG1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9yKCBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlciApIF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXIgPSBFeHByLmZpbHRlclsgdG9rZW5zWyBpIF0udHlwZSBdLmFwcGx5KCBudWxsLCB0b2tlbnNbIGkgXS5tYXRjaGVzICk7XG5cblx0XHRcdC8vIFJldHVybiBzcGVjaWFsIHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyXG5cdFx0XHRpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHtcblxuXHRcdFx0XHQvLyBGaW5kIHRoZSBuZXh0IHJlbGF0aXZlIG9wZXJhdG9yIChpZiBhbnkpIGZvciBwcm9wZXIgaGFuZGxpbmdcblx0XHRcdFx0aiA9ICsraTtcblx0XHRcdFx0Zm9yICggOyBqIDwgbGVuOyBqKysgKSB7XG5cdFx0XHRcdFx0aWYgKCBFeHByLnJlbGF0aXZlWyB0b2tlbnNbIGogXS50eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHNldE1hdGNoZXIoXG5cdFx0XHRcdFx0aSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksXG5cdFx0XHRcdFx0aSA+IDEgJiYgdG9TZWxlY3RvcihcblxuXHRcdFx0XHRcdC8vIElmIHRoZSBwcmVjZWRpbmcgdG9rZW4gd2FzIGEgZGVzY2VuZGFudCBjb21iaW5hdG9yLCBpbnNlcnQgYW4gaW1wbGljaXQgYW55LWVsZW1lbnQgYCpgXG5cdFx0XHRcdFx0dG9rZW5zXG5cdFx0XHRcdFx0XHQuc2xpY2UoIDAsIGkgLSAxIClcblx0XHRcdFx0XHRcdC5jb25jYXQoIHsgdmFsdWU6IHRva2Vuc1sgaSAtIDIgXS50eXBlID09PSBcIiBcIiA/IFwiKlwiIDogXCJcIiB9IClcblx0XHRcdFx0XHQpLnJlcGxhY2UoIHJ0cmltLCBcIiQxXCIgKSxcblx0XHRcdFx0XHRtYXRjaGVyLFxuXHRcdFx0XHRcdGkgPCBqICYmIG1hdGNoZXJGcm9tVG9rZW5zKCB0b2tlbnMuc2xpY2UoIGksIGogKSApLFxuXHRcdFx0XHRcdGogPCBsZW4gJiYgbWF0Y2hlckZyb21Ub2tlbnMoICggdG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkgKSApLFxuXHRcdFx0XHRcdGogPCBsZW4gJiYgdG9TZWxlY3RvciggdG9rZW5zIClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG1hdGNoZXJzLnB1c2goIG1hdGNoZXIgKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApIHtcblx0dmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCxcblx0XHRieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCxcblx0XHRzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBvdXRlcm1vc3QgKSB7XG5cdFx0XHR2YXIgZWxlbSwgaiwgbWF0Y2hlcixcblx0XHRcdFx0bWF0Y2hlZENvdW50ID0gMCxcblx0XHRcdFx0aSA9IFwiMFwiLFxuXHRcdFx0XHR1bm1hdGNoZWQgPSBzZWVkICYmIFtdLFxuXHRcdFx0XHRzZXRNYXRjaGVkID0gW10sXG5cdFx0XHRcdGNvbnRleHRCYWNrdXAgPSBvdXRlcm1vc3RDb250ZXh0LFxuXG5cdFx0XHRcdC8vIFdlIG11c3QgYWx3YXlzIGhhdmUgZWl0aGVyIHNlZWQgZWxlbWVudHMgb3Igb3V0ZXJtb3N0IGNvbnRleHRcblx0XHRcdFx0ZWxlbXMgPSBzZWVkIHx8IGJ5RWxlbWVudCAmJiBFeHByLmZpbmRbIFwiVEFHXCIgXSggXCIqXCIsIG91dGVybW9zdCApLFxuXG5cdFx0XHRcdC8vIFVzZSBpbnRlZ2VyIGRpcnJ1bnMgaWZmIHRoaXMgaXMgdGhlIG91dGVybW9zdCBtYXRjaGVyXG5cdFx0XHRcdGRpcnJ1bnNVbmlxdWUgPSAoIGRpcnJ1bnMgKz0gY29udGV4dEJhY2t1cCA9PSBudWxsID8gMSA6IE1hdGgucmFuZG9tKCkgfHwgMC4xICksXG5cdFx0XHRcdGxlbiA9IGVsZW1zLmxlbmd0aDtcblxuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdFx0XHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRcdFx0b3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHQgPT0gZG9jdW1lbnQgfHwgY29udGV4dCB8fCBvdXRlcm1vc3Q7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBlbGVtZW50cyBwYXNzaW5nIGVsZW1lbnRNYXRjaGVycyBkaXJlY3RseSB0byByZXN1bHRzXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTw5LCBTYWZhcmlcblx0XHRcdC8vIFRvbGVyYXRlIE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiBcImxlbmd0aFwiOyBTYWZhcmk6IDxudW1iZXI+KSBtYXRjaGluZyBlbGVtZW50cyBieSBpZFxuXHRcdFx0Zm9yICggOyBpICE9PSBsZW4gJiYgKCBlbGVtID0gZWxlbXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBieUVsZW1lbnQgJiYgZWxlbSApIHtcblx0XHRcdFx0XHRqID0gMDtcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdFx0XHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdFx0XHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0XHRcdFx0aWYgKCAhY29udGV4dCAmJiBlbGVtLm93bmVyRG9jdW1lbnQgIT0gZG9jdW1lbnQgKSB7XG5cdFx0XHRcdFx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHRcdFx0XHRcdFx0eG1sID0gIWRvY3VtZW50SXNIVE1MO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR3aGlsZSAoICggbWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1sgaisrIF0gKSApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCB8fCBkb2N1bWVudCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdFx0XHRkaXJydW5zID0gZGlycnVuc1VuaXF1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUcmFjayB1bm1hdGNoZWQgZWxlbWVudHMgZm9yIHNldCBmaWx0ZXJzXG5cdFx0XHRcdGlmICggYnlTZXQgKSB7XG5cblx0XHRcdFx0XHQvLyBUaGV5IHdpbGwgaGF2ZSBnb25lIHRocm91Z2ggYWxsIHBvc3NpYmxlIG1hdGNoZXJzXG5cdFx0XHRcdFx0aWYgKCAoIGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtICkgKSB7XG5cdFx0XHRcdFx0XHRtYXRjaGVkQ291bnQtLTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBMZW5ndGhlbiB0aGUgYXJyYXkgZm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Igbm90XG5cdFx0XHRcdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0XHRcdFx0dW5tYXRjaGVkLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gYGlgIGlzIG5vdyB0aGUgY291bnQgb2YgZWxlbWVudHMgdmlzaXRlZCBhYm92ZSwgYW5kIGFkZGluZyBpdCB0byBgbWF0Y2hlZENvdW50YFxuXHRcdFx0Ly8gbWFrZXMgdGhlIGxhdHRlciBub25uZWdhdGl2ZS5cblx0XHRcdG1hdGNoZWRDb3VudCArPSBpO1xuXG5cdFx0XHQvLyBBcHBseSBzZXQgZmlsdGVycyB0byB1bm1hdGNoZWQgZWxlbWVudHNcblx0XHRcdC8vIE5PVEU6IFRoaXMgY2FuIGJlIHNraXBwZWQgaWYgdGhlcmUgYXJlIG5vIHVubWF0Y2hlZCBlbGVtZW50cyAoaS5lLiwgYG1hdGNoZWRDb3VudGBcblx0XHRcdC8vIGVxdWFscyBgaWApLCB1bmxlc3Mgd2UgZGlkbid0IHZpc2l0IF9hbnlfIGVsZW1lbnRzIGluIHRoZSBhYm92ZSBsb29wIGJlY2F1c2Ugd2UgaGF2ZVxuXHRcdFx0Ly8gbm8gZWxlbWVudCBtYXRjaGVycyBhbmQgbm8gc2VlZC5cblx0XHRcdC8vIEluY3JlbWVudGluZyBhbiBpbml0aWFsbHktc3RyaW5nIFwiMFwiIGBpYCBhbGxvd3MgYGlgIHRvIHJlbWFpbiBhIHN0cmluZyBvbmx5IGluIHRoYXRcblx0XHRcdC8vIGNhc2UsIHdoaWNoIHdpbGwgcmVzdWx0IGluIGEgXCIwMFwiIGBtYXRjaGVkQ291bnRgIHRoYXQgZGlmZmVycyBmcm9tIGBpYCBidXQgaXMgYWxzb1xuXHRcdFx0Ly8gbnVtZXJpY2FsbHkgemVyby5cblx0XHRcdGlmICggYnlTZXQgJiYgaSAhPT0gbWF0Y2hlZENvdW50ICkge1xuXHRcdFx0XHRqID0gMDtcblx0XHRcdFx0d2hpbGUgKCAoIG1hdGNoZXIgPSBzZXRNYXRjaGVyc1sgaisrIF0gKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyKCB1bm1hdGNoZWQsIHNldE1hdGNoZWQsIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBzZWVkICkge1xuXG5cdFx0XHRcdFx0Ly8gUmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZ1xuXHRcdFx0XHRcdGlmICggbWF0Y2hlZENvdW50ID4gMCApIHtcblx0XHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoICEoIHVubWF0Y2hlZFsgaSBdIHx8IHNldE1hdGNoZWRbIGkgXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHNldE1hdGNoZWRbIGkgXSA9IHBvcC5jYWxsKCByZXN1bHRzICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBEaXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlc1xuXHRcdFx0XHRcdHNldE1hdGNoZWQgPSBjb25kZW5zZSggc2V0TWF0Y2hlZCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQWRkIG1hdGNoZXMgdG8gcmVzdWx0c1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBzZXRNYXRjaGVkICk7XG5cblx0XHRcdFx0Ly8gU2VlZGxlc3Mgc2V0IG1hdGNoZXMgc3VjY2VlZGluZyBtdWx0aXBsZSBzdWNjZXNzZnVsIG1hdGNoZXJzIHN0aXB1bGF0ZSBzb3J0aW5nXG5cdFx0XHRcdGlmICggb3V0ZXJtb3N0ICYmICFzZWVkICYmIHNldE1hdGNoZWQubGVuZ3RoID4gMCAmJlxuXHRcdFx0XHRcdCggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAxICkge1xuXG5cdFx0XHRcdFx0U2l6emxlLnVuaXF1ZVNvcnQoIHJlc3VsdHMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnNcblx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXHRcdFx0XHRkaXJydW5zID0gZGlycnVuc1VuaXF1ZTtcblx0XHRcdFx0b3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHRCYWNrdXA7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB1bm1hdGNoZWQ7XG5cdFx0fTtcblxuXHRyZXR1cm4gYnlTZXQgP1xuXHRcdG1hcmtGdW5jdGlvbiggc3VwZXJNYXRjaGVyICkgOlxuXHRcdHN1cGVyTWF0Y2hlcjtcbn1cblxuY29tcGlsZSA9IFNpenpsZS5jb21waWxlID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBtYXRjaCAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHtcblx0dmFyIGksXG5cdFx0c2V0TWF0Y2hlcnMgPSBbXSxcblx0XHRlbGVtZW50TWF0Y2hlcnMgPSBbXSxcblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF07XG5cblx0aWYgKCAhY2FjaGVkICkge1xuXG5cdFx0Ly8gR2VuZXJhdGUgYSBmdW5jdGlvbiBvZiByZWN1cnNpdmUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZWFjaCBlbGVtZW50XG5cdFx0aWYgKCAhbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdH1cblx0XHRpID0gbWF0Y2gubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0Y2FjaGVkID0gbWF0Y2hlckZyb21Ub2tlbnMoIG1hdGNoWyBpIF0gKTtcblx0XHRcdGlmICggY2FjaGVkWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdHNldE1hdGNoZXJzLnB1c2goIGNhY2hlZCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbWVudE1hdGNoZXJzLnB1c2goIGNhY2hlZCApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhY2hlIHRoZSBjb21waWxlZCBmdW5jdGlvblxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGUoXG5cdFx0XHRzZWxlY3Rvcixcblx0XHRcdG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApXG5cdFx0KTtcblxuXHRcdC8vIFNhdmUgc2VsZWN0b3IgYW5kIHRva2VuaXphdGlvblxuXHRcdGNhY2hlZC5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHR9XG5cdHJldHVybiBjYWNoZWQ7XG59O1xuXG4vKipcbiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzZWxlY3RvciBBIHNlbGVjdG9yIG9yIGEgcHJlLWNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZVxuICogQHBhcmFtIHtFbGVtZW50fSBjb250ZXh0XG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0c11cbiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0XG4gKi9cbnNlbGVjdCA9IFNpenpsZS5zZWxlY3QgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLFxuXHRcdGNvbXBpbGVkID0gdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgc2VsZWN0b3IsXG5cdFx0bWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKCBzZWxlY3RvciA9IGNvbXBpbGVkLnNlbGVjdG9yIHx8IHNlbGVjdG9yICkgKTtcblxuXHRyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTtcblxuXHQvLyBUcnkgdG8gbWluaW1pemUgb3BlcmF0aW9ucyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBzZWxlY3RvciBpbiB0aGUgbGlzdCBhbmQgbm8gc2VlZFxuXHQvLyAodGhlIGxhdHRlciBvZiB3aGljaCBndWFyYW50ZWVzIHVzIGNvbnRleHQpXG5cdGlmICggbWF0Y2gubGVuZ3RoID09PSAxICkge1xuXG5cdFx0Ly8gUmVkdWNlIGNvbnRleHQgaWYgdGhlIGxlYWRpbmcgY29tcG91bmQgc2VsZWN0b3IgaXMgYW4gSURcblx0XHR0b2tlbnMgPSBtYXRjaFsgMCBdID0gbWF0Y2hbIDAgXS5zbGljZSggMCApO1xuXHRcdGlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKCB0b2tlbiA9IHRva2Vuc1sgMCBdICkudHlwZSA9PT0gXCJJRFwiICYmXG5cdFx0XHRjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmIGRvY3VtZW50SXNIVE1MICYmIEV4cHIucmVsYXRpdmVbIHRva2Vuc1sgMSBdLnR5cGUgXSApIHtcblxuXHRcdFx0Y29udGV4dCA9ICggRXhwci5maW5kWyBcIklEXCIgXSggdG9rZW4ubWF0Y2hlc1sgMCBdXG5cdFx0XHRcdC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLCBjb250ZXh0ICkgfHwgW10gKVsgMCBdO1xuXHRcdFx0aWYgKCAhY29udGV4dCApIHtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHRcdC8vIFByZWNvbXBpbGVkIG1hdGNoZXJzIHdpbGwgc3RpbGwgdmVyaWZ5IGFuY2VzdHJ5LCBzbyBzdGVwIHVwIGEgbGV2ZWxcblx0XHRcdH0gZWxzZSBpZiAoIGNvbXBpbGVkICkge1xuXHRcdFx0XHRjb250ZXh0ID0gY29udGV4dC5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXG5cdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnNsaWNlKCB0b2tlbnMuc2hpZnQoKS52YWx1ZS5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGZXRjaCBhIHNlZWQgc2V0IGZvciByaWdodC10by1sZWZ0IG1hdGNoaW5nXG5cdFx0aSA9IG1hdGNoRXhwclsgXCJuZWVkc0NvbnRleHRcIiBdLnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHRva2VuID0gdG9rZW5zWyBpIF07XG5cblx0XHRcdC8vIEFib3J0IGlmIHdlIGhpdCBhIGNvbWJpbmF0b3Jcblx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgKCB0eXBlID0gdG9rZW4udHlwZSApIF0gKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAoIGZpbmQgPSBFeHByLmZpbmRbIHR5cGUgXSApICkge1xuXG5cdFx0XHRcdC8vIFNlYXJjaCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBjb21iaW5hdG9yc1xuXHRcdFx0XHRpZiAoICggc2VlZCA9IGZpbmQoXG5cdFx0XHRcdFx0dG9rZW4ubWF0Y2hlc1sgMCBdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICksXG5cdFx0XHRcdFx0cnNpYmxpbmcudGVzdCggdG9rZW5zWyAwIF0udHlwZSApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fFxuXHRcdFx0XHRcdFx0Y29udGV4dFxuXHRcdFx0XHQpICkgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHlcblx0XHRcdFx0XHR0b2tlbnMuc3BsaWNlKCBpLCAxICk7XG5cdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTtcblx0XHRcdFx0XHRpZiAoICFzZWxlY3RvciApIHtcblx0XHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNlZWQgKTtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ29tcGlsZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmluZyBmdW5jdGlvbiBpZiBvbmUgaXMgbm90IHByb3ZpZGVkXG5cdC8vIFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXphdGlvbiBpZiB3ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmVcblx0KCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKFxuXHRcdHNlZWQsXG5cdFx0Y29udGV4dCxcblx0XHQhZG9jdW1lbnRJc0hUTUwsXG5cdFx0cmVzdWx0cyxcblx0XHQhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdCk7XG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuLy8gT25lLXRpbWUgYXNzaWdubWVudHNcblxuLy8gU29ydCBzdGFiaWxpdHlcbnN1cHBvcnQuc29ydFN0YWJsZSA9IGV4cGFuZG8uc3BsaXQoIFwiXCIgKS5zb3J0KCBzb3J0T3JkZXIgKS5qb2luKCBcIlwiICkgPT09IGV4cGFuZG87XG5cbi8vIFN1cHBvcnQ6IENocm9tZSAxNC0zNStcbi8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25cbnN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcyA9ICEhaGFzRHVwbGljYXRlO1xuXG4vLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnRcbnNldERvY3VtZW50KCk7XG5cbi8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBpbiBDaHJvbWUgMjcpXG4vLyBEZXRhY2hlZCBub2RlcyBjb25mb3VuZGluZ2x5IGZvbGxvdyAqZWFjaCBvdGhlcipcbnN1cHBvcnQuc29ydERldGFjaGVkID0gYXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cblx0Ly8gU2hvdWxkIHJldHVybiAxLCBidXQgcmV0dXJucyA0IChmb2xsb3dpbmcpXG5cdHJldHVybiBlbC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJmaWVsZHNldFwiICkgKSAmIDE7XG59ICk7XG5cbi8vIFN1cHBvcnQ6IElFPDhcbi8vIFByZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5IFwiaW50ZXJwb2xhdGlvblwiXG4vLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM2NDI5JTI4VlMuODUlMjkuYXNweFxuaWYgKCAhYXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cdGVsLmlubmVySFRNTCA9IFwiPGEgaHJlZj0nIyc+PC9hPlwiO1xuXHRyZXR1cm4gZWwuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoIFwiaHJlZlwiICkgPT09IFwiI1wiO1xufSApICkge1xuXHRhZGRIYW5kbGUoIFwidHlwZXxocmVmfGhlaWdodHx3aWR0aFwiLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0eXBlXCIgPyAxIDogMiApO1xuXHRcdH1cblx0fSApO1xufVxuXG4vLyBTdXBwb3J0OiBJRTw5XG4vLyBVc2UgZGVmYXVsdFZhbHVlIGluIHBsYWNlIG9mIGdldEF0dHJpYnV0ZShcInZhbHVlXCIpXG5pZiAoICFzdXBwb3J0LmF0dHJpYnV0ZXMgfHwgIWFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXHRlbC5pbm5lckhUTUwgPSBcIjxpbnB1dC8+XCI7XG5cdGVsLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCBcInZhbHVlXCIsIFwiXCIgKTtcblx0cmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gXCJcIjtcbn0gKSApIHtcblx0YWRkSGFuZGxlKCBcInZhbHVlXCIsIGZ1bmN0aW9uKCBlbGVtLCBfbmFtZSwgaXNYTUwgKSB7XG5cdFx0aWYgKCAhaXNYTUwgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kZWZhdWx0VmFsdWU7XG5cdFx0fVxuXHR9ICk7XG59XG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXNcbmlmICggIWFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXHRyZXR1cm4gZWwuZ2V0QXR0cmlidXRlKCBcImRpc2FibGVkXCIgKSA9PSBudWxsO1xufSApICkge1xuXHRhZGRIYW5kbGUoIGJvb2xlYW5zLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0dmFyIHZhbDtcblx0XHRpZiAoICFpc1hNTCApIHtcblx0XHRcdHJldHVybiBlbGVtWyBuYW1lIF0gPT09IHRydWUgPyBuYW1lLnRvTG93ZXJDYXNlKCkgOlxuXHRcdFx0XHQoIHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApICkgJiYgdmFsLnNwZWNpZmllZCA/XG5cdFx0XHRcdFx0dmFsLnZhbHVlIDpcblx0XHRcdFx0XHRudWxsO1xuXHRcdH1cblx0fSApO1xufVxuXG5yZXR1cm4gU2l6emxlO1xuXG59ICkoIHdpbmRvdyApO1xuXG5cblxualF1ZXJ5LmZpbmQgPSBTaXp6bGU7XG5qUXVlcnkuZXhwciA9IFNpenpsZS5zZWxlY3RvcnM7XG5cbi8vIERlcHJlY2F0ZWRcbmpRdWVyeS5leHByWyBcIjpcIiBdID0galF1ZXJ5LmV4cHIucHNldWRvcztcbmpRdWVyeS51bmlxdWVTb3J0ID0galF1ZXJ5LnVuaXF1ZSA9IFNpenpsZS51bmlxdWVTb3J0O1xualF1ZXJ5LnRleHQgPSBTaXp6bGUuZ2V0VGV4dDtcbmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDtcbmpRdWVyeS5jb250YWlucyA9IFNpenpsZS5jb250YWlucztcbmpRdWVyeS5lc2NhcGVTZWxlY3RvciA9IFNpenpsZS5lc2NhcGU7XG5cblxuXG5cbnZhciBkaXIgPSBmdW5jdGlvbiggZWxlbSwgZGlyLCB1bnRpbCApIHtcblx0dmFyIG1hdGNoZWQgPSBbXSxcblx0XHR0cnVuY2F0ZSA9IHVudGlsICE9PSB1bmRlZmluZWQ7XG5cblx0d2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICYmIGVsZW0ubm9kZVR5cGUgIT09IDkgKSB7XG5cdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0aWYgKCB0cnVuY2F0ZSAmJiBqUXVlcnkoIGVsZW0gKS5pcyggdW50aWwgKSApIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRtYXRjaGVkLnB1c2goIGVsZW0gKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG1hdGNoZWQ7XG59O1xuXG5cbnZhciBzaWJsaW5ncyA9IGZ1bmN0aW9uKCBuLCBlbGVtICkge1xuXHR2YXIgbWF0Y2hlZCA9IFtdO1xuXG5cdGZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7XG5cdFx0aWYgKCBuLm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7XG5cdFx0XHRtYXRjaGVkLnB1c2goIG4gKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbWF0Y2hlZDtcbn07XG5cblxudmFyIHJuZWVkc0NvbnRleHQgPSBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQ7XG5cblxuXG5mdW5jdGlvbiBub2RlTmFtZSggZWxlbSwgbmFtZSApIHtcblxuXHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKTtcblxufVxudmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbYS16XVteXFwvXFwwPjpcXHgyMFxcdFxcclxcblxcZl0qKVtcXHgyMFxcdFxcclxcblxcZl0qXFwvPz4oPzo8XFwvXFwxPnwpJC9pICk7XG5cblxuXG4vLyBJbXBsZW1lbnQgdGhlIGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IGZvciBmaWx0ZXIgYW5kIG5vdFxuZnVuY3Rpb24gd2lubm93KCBlbGVtZW50cywgcXVhbGlmaWVyLCBub3QgKSB7XG5cdGlmICggaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gISFxdWFsaWZpZXIuY2FsbCggZWxlbSwgaSwgZWxlbSApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gU2luZ2xlIGVsZW1lbnRcblx0aWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBlbGVtID09PSBxdWFsaWZpZXIgKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEFycmF5bGlrZSBvZiBlbGVtZW50cyAoalF1ZXJ5LCBhcmd1bWVudHMsIEFycmF5KVxuXHRpZiAoIHR5cGVvZiBxdWFsaWZpZXIgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBpbmRleE9mLmNhbGwoIHF1YWxpZmllciwgZWxlbSApID4gLTEgKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEZpbHRlcmVkIGRpcmVjdGx5IGZvciBib3RoIHNpbXBsZSBhbmQgY29tcGxleCBzZWxlY3RvcnNcblx0cmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApO1xufVxuXG5qUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7XG5cdHZhciBlbGVtID0gZWxlbXNbIDAgXTtcblxuXHRpZiAoIG5vdCApIHtcblx0XHRleHByID0gXCI6bm90KFwiICsgZXhwciArIFwiKVwiO1xuXHR9XG5cblx0aWYgKCBlbGVtcy5sZW5ndGggPT09IDEgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBleHByICkgPyBbIGVsZW0gXSA6IFtdO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXMoIGV4cHIsIGpRdWVyeS5ncmVwKCBlbGVtcywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7XG5cdH0gKSApO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGksIHJldCxcblx0XHRcdGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0c2VsZiA9IHRoaXM7XG5cblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5KCBzZWxlY3RvciApLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHNlbGZbIGkgXSwgdGhpcyApICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9ICkgKTtcblx0XHR9XG5cblx0XHRyZXQgPSB0aGlzLnB1c2hTdGFjayggW10gKTtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRqUXVlcnkuZmluZCggc2VsZWN0b3IsIHNlbGZbIGkgXSwgcmV0ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggcmV0ICkgOiByZXQ7XG5cdH0sXG5cdGZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KCB0aGlzLCBzZWxlY3RvciB8fCBbXSwgZmFsc2UgKSApO1xuXHR9LFxuXHRub3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyggdGhpcywgc2VsZWN0b3IgfHwgW10sIHRydWUgKSApO1xuXHR9LFxuXHRpczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiAhIXdpbm5vdyhcblx0XHRcdHRoaXMsXG5cblx0XHRcdC8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXRcblx0XHRcdC8vIHNvICQoXCJwOmZpcnN0XCIpLmlzKFwicDpsYXN0XCIpIHdvbid0IHJldHVybiB0cnVlIGZvciBhIGRvYyB3aXRoIHR3byBcInBcIi5cblx0XHRcdHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiAmJiBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgP1xuXHRcdFx0XHRqUXVlcnkoIHNlbGVjdG9yICkgOlxuXHRcdFx0XHRzZWxlY3RvciB8fCBbXSxcblx0XHRcdGZhbHNlXG5cdFx0KS5sZW5ndGg7XG5cdH1cbn0gKTtcblxuXG4vLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdFxuXG5cbi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KVxudmFyIHJvb3RqUXVlcnksXG5cblx0Ly8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3Ncblx0Ly8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKVxuXHQvLyBTdHJpY3QgSFRNTCByZWNvZ25pdGlvbiAoIzExMjkwOiBtdXN0IHN0YXJ0IHdpdGggPClcblx0Ly8gU2hvcnRjdXQgc2ltcGxlICNpZCBjYXNlIGZvciBzcGVlZFxuXHRycXVpY2tFeHByID0gL14oPzpcXHMqKDxbXFx3XFxXXSs+KVtePl0qfCMoW1xcdy1dKykpJC8sXG5cblx0aW5pdCA9IGpRdWVyeS5mbi5pbml0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByb290ICkge1xuXHRcdHZhciBtYXRjaCwgZWxlbTtcblxuXHRcdC8vIEhBTkRMRTogJChcIlwiKSwgJChudWxsKSwgJCh1bmRlZmluZWQpLCAkKGZhbHNlKVxuXHRcdGlmICggIXNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0Ly8gTWV0aG9kIGluaXQoKSBhY2NlcHRzIGFuIGFsdGVybmF0ZSByb290alF1ZXJ5XG5cdFx0Ly8gc28gbWlncmF0ZSBjYW4gc3VwcG9ydCBqUXVlcnkuc3ViIChnaC0yMTAxKVxuXHRcdHJvb3QgPSByb290IHx8IHJvb3RqUXVlcnk7XG5cblx0XHQvLyBIYW5kbGUgSFRNTCBzdHJpbmdzXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRpZiAoIHNlbGVjdG9yWyAwIF0gPT09IFwiPFwiICYmXG5cdFx0XHRcdHNlbGVjdG9yWyBzZWxlY3Rvci5sZW5ndGggLSAxIF0gPT09IFwiPlwiICYmXG5cdFx0XHRcdHNlbGVjdG9yLmxlbmd0aCA+PSAzICkge1xuXG5cdFx0XHRcdC8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrXG5cdFx0XHRcdG1hdGNoID0gWyBudWxsLCBzZWxlY3RvciwgbnVsbCBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZFxuXHRcdFx0aWYgKCBtYXRjaCAmJiAoIG1hdGNoWyAxIF0gfHwgIWNvbnRleHQgKSApIHtcblxuXHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSlcblx0XHRcdFx0aWYgKCBtYXRjaFsgMSBdICkge1xuXHRcdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFsgMCBdIDogY29udGV4dDtcblxuXHRcdFx0XHRcdC8vIE9wdGlvbiB0byBydW4gc2NyaXB0cyBpcyB0cnVlIGZvciBiYWNrLWNvbXBhdFxuXHRcdFx0XHRcdC8vIEludGVudGlvbmFsbHkgbGV0IHRoZSBlcnJvciBiZSB0aHJvd24gaWYgcGFyc2VIVE1MIGlzIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCB0aGlzLCBqUXVlcnkucGFyc2VIVE1MKFxuXHRcdFx0XHRcdFx0bWF0Y2hbIDEgXSxcblx0XHRcdFx0XHRcdGNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsXG5cdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0KSApO1xuXG5cdFx0XHRcdFx0Ly8gSEFORExFOiAkKGh0bWwsIHByb3BzKVxuXHRcdFx0XHRcdGlmICggcnNpbmdsZVRhZy50ZXN0KCBtYXRjaFsgMSBdICkgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvbnRleHQgKSApIHtcblx0XHRcdFx0XHRcdGZvciAoIG1hdGNoIGluIGNvbnRleHQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gUHJvcGVydGllcyBvZiBjb250ZXh0IGFyZSBjYWxsZWQgYXMgbWV0aG9kcyBpZiBwb3NzaWJsZVxuXHRcdFx0XHRcdFx0XHRpZiAoIGlzRnVuY3Rpb24oIHRoaXNbIG1hdGNoIF0gKSApIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzWyBtYXRjaCBdKCBjb250ZXh0WyBtYXRjaCBdICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uYW5kIG90aGVyd2lzZSBzZXQgYXMgYXR0cmlidXRlc1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYXR0ciggbWF0Y2gsIGNvbnRleHRbIG1hdGNoIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJCgjaWQpXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFsgMiBdICk7XG5cblx0XHRcdFx0XHRpZiAoIGVsZW0gKSB7XG5cblx0XHRcdFx0XHRcdC8vIEluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0XG5cdFx0XHRcdFx0XHR0aGlzWyAwIF0gPSBlbGVtO1xuXHRcdFx0XHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKVxuXHRcdFx0fSBlbHNlIGlmICggIWNvbnRleHQgfHwgY29udGV4dC5qcXVlcnkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGNvbnRleHQgfHwgcm9vdCApLmZpbmQoIHNlbGVjdG9yICk7XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KVxuXHRcdFx0Ly8gKHdoaWNoIGlzIGp1c3QgZXF1aXZhbGVudCB0bzogJChjb250ZXh0KS5maW5kKGV4cHIpXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvciggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICk7XG5cdFx0XHR9XG5cblx0XHQvLyBIQU5ETEU6ICQoRE9NRWxlbWVudClcblx0XHR9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHtcblx0XHRcdHRoaXNbIDAgXSA9IHNlbGVjdG9yO1xuXHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHQvLyBIQU5ETEU6ICQoZnVuY3Rpb24pXG5cdFx0Ly8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5XG5cdFx0fSBlbHNlIGlmICggaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApIHtcblx0XHRcdHJldHVybiByb290LnJlYWR5ICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRyb290LnJlYWR5KCBzZWxlY3RvciApIDpcblxuXHRcdFx0XHQvLyBFeGVjdXRlIGltbWVkaWF0ZWx5IGlmIHJlYWR5IGlzIG5vdCBwcmVzZW50XG5cdFx0XHRcdHNlbGVjdG9yKCBqUXVlcnkgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTtcblx0fTtcblxuLy8gR2l2ZSB0aGUgaW5pdCBmdW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvblxuaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47XG5cbi8vIEluaXRpYWxpemUgY2VudHJhbCByZWZlcmVuY2VcbnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7XG5cblxudmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLFxuXG5cdC8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0XG5cdGd1YXJhbnRlZWRVbmlxdWUgPSB7XG5cdFx0Y2hpbGRyZW46IHRydWUsXG5cdFx0Y29udGVudHM6IHRydWUsXG5cdFx0bmV4dDogdHJ1ZSxcblx0XHRwcmV2OiB0cnVlXG5cdH07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0aGFzOiBmdW5jdGlvbiggdGFyZ2V0ICkge1xuXHRcdHZhciB0YXJnZXRzID0galF1ZXJ5KCB0YXJnZXQsIHRoaXMgKSxcblx0XHRcdGwgPSB0YXJnZXRzLmxlbmd0aDtcblxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzWyBpIF0gKSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRjbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkge1xuXHRcdHZhciBjdXIsXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSB0aGlzLmxlbmd0aCxcblx0XHRcdG1hdGNoZWQgPSBbXSxcblx0XHRcdHRhcmdldHMgPSB0eXBlb2Ygc2VsZWN0b3JzICE9PSBcInN0cmluZ1wiICYmIGpRdWVyeSggc2VsZWN0b3JzICk7XG5cblx0XHQvLyBQb3NpdGlvbmFsIHNlbGVjdG9ycyBuZXZlciBtYXRjaCwgc2luY2UgdGhlcmUncyBubyBfc2VsZWN0aW9uXyBjb250ZXh0XG5cdFx0aWYgKCAhcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvcnMgKSApIHtcblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zm9yICggY3VyID0gdGhpc1sgaSBdOyBjdXIgJiYgY3VyICE9PSBjb250ZXh0OyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblxuXHRcdFx0XHRcdC8vIEFsd2F5cyBza2lwIGRvY3VtZW50IGZyYWdtZW50c1xuXHRcdFx0XHRcdGlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKCB0YXJnZXRzID9cblx0XHRcdFx0XHRcdHRhcmdldHMuaW5kZXgoIGN1ciApID4gLTEgOlxuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGVcblx0XHRcdFx0XHRcdGN1ci5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHRcdFx0XHRqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGN1ciwgc2VsZWN0b3JzICkgKSApIHtcblxuXHRcdFx0XHRcdFx0bWF0Y2hlZC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZVNvcnQoIG1hdGNoZWQgKSA6IG1hdGNoZWQgKTtcblx0fSxcblxuXHQvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBzZXRcblx0aW5kZXg6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnRcblx0XHRpZiAoICFlbGVtICkge1xuXHRcdFx0cmV0dXJuICggdGhpc1sgMCBdICYmIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgPyB0aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aCA6IC0xO1xuXHRcdH1cblxuXHRcdC8vIEluZGV4IGluIHNlbGVjdG9yXG5cdFx0aWYgKCB0eXBlb2YgZWxlbSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBpbmRleE9mLmNhbGwoIGpRdWVyeSggZWxlbSApLCB0aGlzWyAwIF0gKTtcblx0XHR9XG5cblx0XHQvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnRcblx0XHRyZXR1cm4gaW5kZXhPZi5jYWxsKCB0aGlzLFxuXG5cdFx0XHQvLyBJZiBpdCByZWNlaXZlcyBhIGpRdWVyeSBvYmplY3QsIHRoZSBmaXJzdCBlbGVtZW50IGlzIHVzZWRcblx0XHRcdGVsZW0uanF1ZXJ5ID8gZWxlbVsgMCBdIDogZWxlbVxuXHRcdCk7XG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKFxuXHRcdFx0alF1ZXJ5LnVuaXF1ZVNvcnQoXG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgalF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCApIClcblx0XHRcdClcblx0XHQpO1xuXHR9LFxuXG5cdGFkZEJhY2s6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgP1xuXHRcdFx0dGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKVxuXHRcdCk7XG5cdH1cbn0gKTtcblxuZnVuY3Rpb24gc2libGluZyggY3VyLCBkaXIgKSB7XG5cdHdoaWxlICggKCBjdXIgPSBjdXJbIGRpciBdICkgJiYgY3VyLm5vZGVUeXBlICE9PSAxICkge31cblx0cmV0dXJuIGN1cjtcbn1cblxualF1ZXJ5LmVhY2goIHtcblx0cGFyZW50OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdHJldHVybiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAxMSA/IHBhcmVudCA6IG51bGw7XG5cdH0sXG5cdHBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiICk7XG5cdH0sXG5cdHBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIF9pLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInBhcmVudE5vZGVcIiwgdW50aWwgKTtcblx0fSxcblx0bmV4dDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmcoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiApO1xuXHR9LFxuXHRwcmV2OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiApO1xuXHR9LFxuXHRuZXh0QWxsOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcblx0fSxcblx0cHJldkFsbDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiApO1xuXHR9LFxuXHRuZXh0VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBfaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRwcmV2VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBfaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiwgdW50aWwgKTtcblx0fSxcblx0c2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5ncyggKCBlbGVtLnBhcmVudE5vZGUgfHwge30gKS5maXJzdENoaWxkLCBlbGVtICk7XG5cdH0sXG5cdGNoaWxkcmVuOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZ3MoIGVsZW0uZmlyc3RDaGlsZCApO1xuXHR9LFxuXHRjb250ZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0aWYgKCBlbGVtLmNvbnRlbnREb2N1bWVudCAhPSBudWxsICYmXG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDExK1xuXHRcdFx0Ly8gPG9iamVjdD4gZWxlbWVudHMgd2l0aCBubyBgZGF0YWAgYXR0cmlidXRlIGhhcyBhbiBvYmplY3Rcblx0XHRcdC8vIGBjb250ZW50RG9jdW1lbnRgIHdpdGggYSBgbnVsbGAgcHJvdG90eXBlLlxuXHRcdFx0Z2V0UHJvdG8oIGVsZW0uY29udGVudERvY3VtZW50ICkgKSB7XG5cblx0XHRcdHJldHVybiBlbGVtLmNvbnRlbnREb2N1bWVudDtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTEgb25seSwgaU9TIDcgb25seSwgQW5kcm9pZCBCcm93c2VyIDw9NC4zIG9ubHlcblx0XHQvLyBUcmVhdCB0aGUgdGVtcGxhdGUgZWxlbWVudCBhcyBhIHJlZ3VsYXIgb25lIGluIGJyb3dzZXJzIHRoYXRcblx0XHQvLyBkb24ndCBzdXBwb3J0IGl0LlxuXHRcdGlmICggbm9kZU5hbWUoIGVsZW0sIFwidGVtcGxhdGVcIiApICkge1xuXHRcdFx0ZWxlbSA9IGVsZW0uY29udGVudCB8fCBlbGVtO1xuXHRcdH1cblxuXHRcdHJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBlbGVtLmNoaWxkTm9kZXMgKTtcblx0fVxufSwgZnVuY3Rpb24oIG5hbWUsIGZuICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7XG5cdFx0dmFyIG1hdGNoZWQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwgKTtcblxuXHRcdGlmICggbmFtZS5zbGljZSggLTUgKSAhPT0gXCJVbnRpbFwiICkge1xuXHRcdFx0c2VsZWN0b3IgPSB1bnRpbDtcblx0XHR9XG5cblx0XHRpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdG1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgZHVwbGljYXRlc1xuXHRcdFx0aWYgKCAhZ3VhcmFudGVlZFVuaXF1ZVsgbmFtZSBdICkge1xuXHRcdFx0XHRqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlc1xuXHRcdFx0aWYgKCBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkge1xuXHRcdFx0XHRtYXRjaGVkLnJldmVyc2UoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIG1hdGNoZWQgKTtcblx0fTtcbn0gKTtcbnZhciBybm90aHRtbHdoaXRlID0gKCAvW15cXHgyMFxcdFxcclxcblxcZl0rL2cgKTtcblxuXG5cbi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzXG5mdW5jdGlvbiBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkge1xuXHR2YXIgb2JqZWN0ID0ge307XG5cdGpRdWVyeS5lYWNoKCBvcHRpb25zLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10sIGZ1bmN0aW9uKCBfLCBmbGFnICkge1xuXHRcdG9iamVjdFsgZmxhZyBdID0gdHJ1ZTtcblx0fSApO1xuXHRyZXR1cm4gb2JqZWN0O1xufVxuXG4vKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6XG4gKlxuICpcdG9wdGlvbnM6IGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIG9wdGlvbnMgdGhhdCB3aWxsIGNoYW5nZSBob3dcbiAqXHRcdFx0dGhlIGNhbGxiYWNrIGxpc3QgYmVoYXZlcyBvciBhIG1vcmUgdHJhZGl0aW9uYWwgb3B0aW9uIG9iamVjdFxuICpcbiAqIEJ5IGRlZmF1bHQgYSBjYWxsYmFjayBsaXN0IHdpbGwgYWN0IGxpa2UgYW4gZXZlbnQgY2FsbGJhY2sgbGlzdCBhbmQgY2FuIGJlXG4gKiBcImZpcmVkXCIgbXVsdGlwbGUgdGltZXMuXG4gKlxuICogUG9zc2libGUgb3B0aW9uczpcbiAqXG4gKlx0b25jZTpcdFx0XHR3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdG1lbW9yeTpcdFx0XHR3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkXG4gKlx0XHRcdFx0XHRhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCBcIm1lbW9yaXplZFwiXG4gKlx0XHRcdFx0XHR2YWx1ZXMgKGxpa2UgYSBEZWZlcnJlZClcbiAqXG4gKlx0dW5pcXVlOlx0XHRcdHdpbGwgZW5zdXJlIGEgY2FsbGJhY2sgY2FuIG9ubHkgYmUgYWRkZWQgb25jZSAobm8gZHVwbGljYXRlIGluIHRoZSBsaXN0KVxuICpcbiAqXHRzdG9wT25GYWxzZTpcdGludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZVxuICpcbiAqL1xualF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXG5cdC8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWRcblx0Ly8gKHdlIGNoZWNrIGluIGNhY2hlIGZpcnN0KVxuXHRvcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIgP1xuXHRcdGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSA6XG5cdFx0alF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTtcblxuXHR2YXIgLy8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZ1xuXHRcdGZpcmluZyxcblxuXHRcdC8vIExhc3QgZmlyZSB2YWx1ZSBmb3Igbm9uLWZvcmdldHRhYmxlIGxpc3RzXG5cdFx0bWVtb3J5LFxuXG5cdFx0Ly8gRmxhZyB0byBrbm93IGlmIGxpc3Qgd2FzIGFscmVhZHkgZmlyZWRcblx0XHRmaXJlZCxcblxuXHRcdC8vIEZsYWcgdG8gcHJldmVudCBmaXJpbmdcblx0XHRsb2NrZWQsXG5cblx0XHQvLyBBY3R1YWwgY2FsbGJhY2sgbGlzdFxuXHRcdGxpc3QgPSBbXSxcblxuXHRcdC8vIFF1ZXVlIG9mIGV4ZWN1dGlvbiBkYXRhIGZvciByZXBlYXRhYmxlIGxpc3RzXG5cdFx0cXVldWUgPSBbXSxcblxuXHRcdC8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IGFkZC9yZW1vdmUgYXMgbmVlZGVkKVxuXHRcdGZpcmluZ0luZGV4ID0gLTEsXG5cblx0XHQvLyBGaXJlIGNhbGxiYWNrc1xuXHRcdGZpcmUgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gRW5mb3JjZSBzaW5nbGUtZmlyaW5nXG5cdFx0XHRsb2NrZWQgPSBsb2NrZWQgfHwgb3B0aW9ucy5vbmNlO1xuXG5cdFx0XHQvLyBFeGVjdXRlIGNhbGxiYWNrcyBmb3IgYWxsIHBlbmRpbmcgZXhlY3V0aW9ucyxcblx0XHRcdC8vIHJlc3BlY3RpbmcgZmlyaW5nSW5kZXggb3ZlcnJpZGVzIGFuZCBydW50aW1lIGNoYW5nZXNcblx0XHRcdGZpcmVkID0gZmlyaW5nID0gdHJ1ZTtcblx0XHRcdGZvciAoIDsgcXVldWUubGVuZ3RoOyBmaXJpbmdJbmRleCA9IC0xICkge1xuXHRcdFx0XHRtZW1vcnkgPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdFx0XHR3aGlsZSAoICsrZmlyaW5nSW5kZXggPCBsaXN0Lmxlbmd0aCApIHtcblxuXHRcdFx0XHRcdC8vIFJ1biBjYWxsYmFjayBhbmQgY2hlY2sgZm9yIGVhcmx5IHRlcm1pbmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBsaXN0WyBmaXJpbmdJbmRleCBdLmFwcGx5KCBtZW1vcnlbIDAgXSwgbWVtb3J5WyAxIF0gKSA9PT0gZmFsc2UgJiZcblx0XHRcdFx0XHRcdG9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7XG5cblx0XHRcdFx0XHRcdC8vIEp1bXAgdG8gZW5kIGFuZCBmb3JnZXQgdGhlIGRhdGEgc28gLmFkZCBkb2Vzbid0IHJlLWZpcmVcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGg7XG5cdFx0XHRcdFx0XHRtZW1vcnkgPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gRm9yZ2V0IHRoZSBkYXRhIGlmIHdlJ3JlIGRvbmUgd2l0aCBpdFxuXHRcdFx0aWYgKCAhb3B0aW9ucy5tZW1vcnkgKSB7XG5cdFx0XHRcdG1lbW9yeSA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRmaXJpbmcgPSBmYWxzZTtcblxuXHRcdFx0Ly8gQ2xlYW4gdXAgaWYgd2UncmUgZG9uZSBmaXJpbmcgZm9yIGdvb2Rcblx0XHRcdGlmICggbG9ja2VkICkge1xuXG5cdFx0XHRcdC8vIEtlZXAgYW4gZW1wdHkgbGlzdCBpZiB3ZSBoYXZlIGRhdGEgZm9yIGZ1dHVyZSBhZGQgY2FsbHNcblx0XHRcdFx0aWYgKCBtZW1vcnkgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgdGhpcyBvYmplY3QgaXMgc3BlbnRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRsaXN0ID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVjdFxuXHRcdHNlbGYgPSB7XG5cblx0XHRcdC8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3Rcblx0XHRcdGFkZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblxuXHRcdFx0XHRcdC8vIElmIHdlIGhhdmUgbWVtb3J5IGZyb20gYSBwYXN0IHJ1biwgd2Ugc2hvdWxkIGZpcmUgYWZ0ZXIgYWRkaW5nXG5cdFx0XHRcdFx0aWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdFx0cXVldWUucHVzaCggbWVtb3J5ICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0KCBmdW5jdGlvbiBhZGQoIGFyZ3MgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggYXJncywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoICFvcHRpb25zLnVuaXF1ZSB8fCAhc2VsZi5oYXMoIGFyZyApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0bGlzdC5wdXNoKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGFyZyAmJiBhcmcubGVuZ3RoICYmIHRvVHlwZSggYXJnICkgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBJbnNwZWN0IHJlY3Vyc2l2ZWx5XG5cdFx0XHRcdFx0XHRcdFx0YWRkKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdH0gKSggYXJndW1lbnRzICk7XG5cblx0XHRcdFx0XHRpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFJlbW92ZSBhIGNhbGxiYWNrIGZyb20gdGhlIGxpc3Rcblx0XHRcdHJlbW92ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0dmFyIGluZGV4O1xuXHRcdFx0XHRcdHdoaWxlICggKCBpbmRleCA9IGpRdWVyeS5pbkFycmF5KCBhcmcsIGxpc3QsIGluZGV4ICkgKSA+IC0xICkge1xuXHRcdFx0XHRcdFx0bGlzdC5zcGxpY2UoIGluZGV4LCAxICk7XG5cblx0XHRcdFx0XHRcdC8vIEhhbmRsZSBmaXJpbmcgaW5kZXhlc1xuXHRcdFx0XHRcdFx0aWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCApIHtcblx0XHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXgtLTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LlxuXHRcdFx0Ly8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBjYWxsYmFja3MgYXR0YWNoZWQuXG5cdFx0XHRoYXM6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0cmV0dXJuIGZuID9cblx0XHRcdFx0XHRqUXVlcnkuaW5BcnJheSggZm4sIGxpc3QgKSA+IC0xIDpcblx0XHRcdFx0XHRsaXN0Lmxlbmd0aCA+IDA7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0XG5cdFx0XHRlbXB0eTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblx0XHRcdFx0XHRsaXN0ID0gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBEaXNhYmxlIC5maXJlIGFuZCAuYWRkXG5cdFx0XHQvLyBBYm9ydCBhbnkgY3VycmVudC9wZW5kaW5nIGV4ZWN1dGlvbnNcblx0XHRcdC8vIENsZWFyIGFsbCBjYWxsYmFja3MgYW5kIHZhbHVlc1xuXHRcdFx0ZGlzYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxvY2tlZCA9IHF1ZXVlID0gW107XG5cdFx0XHRcdGxpc3QgPSBtZW1vcnkgPSBcIlwiO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHRkaXNhYmxlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhbGlzdDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIERpc2FibGUgLmZpcmVcblx0XHRcdC8vIEFsc28gZGlzYWJsZSAuYWRkIHVubGVzcyB3ZSBoYXZlIG1lbW9yeSAoc2luY2UgaXQgd291bGQgaGF2ZSBubyBlZmZlY3QpXG5cdFx0XHQvLyBBYm9ydCBhbnkgcGVuZGluZyBleGVjdXRpb25zXG5cdFx0XHRsb2NrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bG9ja2VkID0gcXVldWUgPSBbXTtcblx0XHRcdFx0aWYgKCAhbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IG1lbW9yeSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0bG9ja2VkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICEhbG9ja2VkO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2FsbCBhbGwgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdzICkge1xuXHRcdFx0XHRpZiAoICFsb2NrZWQgKSB7XG5cdFx0XHRcdFx0YXJncyA9IGFyZ3MgfHwgW107XG5cdFx0XHRcdFx0YXJncyA9IFsgY29udGV4dCwgYXJncy5zbGljZSA/IGFyZ3Muc2xpY2UoKSA6IGFyZ3MgXTtcblx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBhcmdzICk7XG5cdFx0XHRcdFx0aWYgKCAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzXG5cdFx0XHRmaXJlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0c2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gVG8ga25vdyBpZiB0aGUgY2FsbGJhY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlXG5cdFx0XHRmaXJlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWZpcmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0cmV0dXJuIHNlbGY7XG59O1xuXG5cbmZ1bmN0aW9uIElkZW50aXR5KCB2ICkge1xuXHRyZXR1cm4gdjtcbn1cbmZ1bmN0aW9uIFRocm93ZXIoIGV4ICkge1xuXHR0aHJvdyBleDtcbn1cblxuZnVuY3Rpb24gYWRvcHRWYWx1ZSggdmFsdWUsIHJlc29sdmUsIHJlamVjdCwgbm9WYWx1ZSApIHtcblx0dmFyIG1ldGhvZDtcblxuXHR0cnkge1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIHByb21pc2UgYXNwZWN0IGZpcnN0IHRvIHByaXZpbGVnZSBzeW5jaHJvbm91cyBiZWhhdmlvclxuXHRcdGlmICggdmFsdWUgJiYgaXNGdW5jdGlvbiggKCBtZXRob2QgPSB2YWx1ZS5wcm9taXNlICkgKSApIHtcblx0XHRcdG1ldGhvZC5jYWxsKCB2YWx1ZSApLmRvbmUoIHJlc29sdmUgKS5mYWlsKCByZWplY3QgKTtcblxuXHRcdC8vIE90aGVyIHRoZW5hYmxlc1xuXHRcdH0gZWxzZSBpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUudGhlbiApICkgKSB7XG5cdFx0XHRtZXRob2QuY2FsbCggdmFsdWUsIHJlc29sdmUsIHJlamVjdCApO1xuXG5cdFx0Ly8gT3RoZXIgbm9uLXRoZW5hYmxlc1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIENvbnRyb2wgYHJlc29sdmVgIGFyZ3VtZW50cyBieSBsZXR0aW5nIEFycmF5I3NsaWNlIGNhc3QgYm9vbGVhbiBgbm9WYWx1ZWAgdG8gaW50ZWdlcjpcblx0XHRcdC8vICogZmFsc2U6IFsgdmFsdWUgXS5zbGljZSggMCApID0+IHJlc29sdmUoIHZhbHVlIClcblx0XHRcdC8vICogdHJ1ZTogWyB2YWx1ZSBdLnNsaWNlKCAxICkgPT4gcmVzb2x2ZSgpXG5cdFx0XHRyZXNvbHZlLmFwcGx5KCB1bmRlZmluZWQsIFsgdmFsdWUgXS5zbGljZSggbm9WYWx1ZSApICk7XG5cdFx0fVxuXG5cdC8vIEZvciBQcm9taXNlcy9BKywgY29udmVydCBleGNlcHRpb25zIGludG8gcmVqZWN0aW9uc1xuXHQvLyBTaW5jZSBqUXVlcnkud2hlbiBkb2Vzbid0IHVud3JhcCB0aGVuYWJsZXMsIHdlIGNhbiBza2lwIHRoZSBleHRyYSBjaGVja3MgYXBwZWFyaW5nIGluXG5cdC8vIERlZmVycmVkI3RoZW4gdG8gY29uZGl0aW9uYWxseSBzdXBwcmVzcyByZWplY3Rpb24uXG5cdH0gY2F0Y2ggKCB2YWx1ZSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIG9ubHlcblx0XHQvLyBTdHJpY3QgbW9kZSBmdW5jdGlvbnMgaW52b2tlZCB3aXRob3V0IC5jYWxsLy5hcHBseSBnZXQgZ2xvYmFsLW9iamVjdCBjb250ZXh0XG5cdFx0cmVqZWN0LmFwcGx5KCB1bmRlZmluZWQsIFsgdmFsdWUgXSApO1xuXHR9XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHREZWZlcnJlZDogZnVuY3Rpb24oIGZ1bmMgKSB7XG5cdFx0dmFyIHR1cGxlcyA9IFtcblxuXHRcdFx0XHQvLyBhY3Rpb24sIGFkZCBsaXN0ZW5lciwgY2FsbGJhY2tzLFxuXHRcdFx0XHQvLyAuLi4gLnRoZW4gaGFuZGxlcnMsIGFyZ3VtZW50IGluZGV4LCBbZmluYWwgc3RhdGVdXG5cdFx0XHRcdFsgXCJub3RpZnlcIiwgXCJwcm9ncmVzc1wiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm1lbW9yeVwiICksXG5cdFx0XHRcdFx0alF1ZXJ5LkNhbGxiYWNrcyggXCJtZW1vcnlcIiApLCAyIF0sXG5cdFx0XHRcdFsgXCJyZXNvbHZlXCIsIFwiZG9uZVwiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblx0XHRcdFx0XHRqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSwgMCwgXCJyZXNvbHZlZFwiIF0sXG5cdFx0XHRcdFsgXCJyZWplY3RcIiwgXCJmYWlsXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXHRcdFx0XHRcdGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLCAxLCBcInJlamVjdGVkXCIgXVxuXHRcdFx0XSxcblx0XHRcdHN0YXRlID0gXCJwZW5kaW5nXCIsXG5cdFx0XHRwcm9taXNlID0ge1xuXHRcdFx0XHRzdGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHN0YXRlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRhbHdheXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRcImNhdGNoXCI6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0XHRyZXR1cm4gcHJvbWlzZS50aGVuKCBudWxsLCBmbiApO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIEtlZXAgcGlwZSBmb3IgYmFjay1jb21wYXRcblx0XHRcdFx0cGlwZTogZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkge1xuXHRcdFx0XHRcdHZhciBmbnMgPSBhcmd1bWVudHM7XG5cblx0XHRcdFx0XHRyZXR1cm4galF1ZXJ5LkRlZmVycmVkKCBmdW5jdGlvbiggbmV3RGVmZXIgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggX2ksIHR1cGxlICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIE1hcCB0dXBsZXMgKHByb2dyZXNzLCBkb25lLCBmYWlsKSB0byBhcmd1bWVudHMgKGRvbmUsIGZhaWwsIHByb2dyZXNzKVxuXHRcdFx0XHRcdFx0XHR2YXIgZm4gPSBpc0Z1bmN0aW9uKCBmbnNbIHR1cGxlWyA0IF0gXSApICYmIGZuc1sgdHVwbGVbIDQgXSBdO1xuXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkLnByb2dyZXNzKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLm5vdGlmeSB9KVxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZC5kb25lKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlc29sdmUgfSlcblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWQuZmFpbChmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5yZWplY3QgfSlcblx0XHRcdFx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAxIF0gXSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdFx0XHRcdGlmICggcmV0dXJuZWQgJiYgaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQucHJvbWlzZSgpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5IClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmRvbmUoIG5ld0RlZmVyLnJlc29sdmUgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZmFpbCggbmV3RGVmZXIucmVqZWN0ICk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXShcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm4gPyBbIHJldHVybmVkIF0gOiBhcmd1bWVudHNcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHRmbnMgPSBudWxsO1xuXHRcdFx0XHRcdH0gKS5wcm9taXNlKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoZW46IGZ1bmN0aW9uKCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCwgb25Qcm9ncmVzcyApIHtcblx0XHRcdFx0XHR2YXIgbWF4RGVwdGggPSAwO1xuXHRcdFx0XHRcdGZ1bmN0aW9uIHJlc29sdmUoIGRlcHRoLCBkZWZlcnJlZCwgaGFuZGxlciwgc3BlY2lhbCApIHtcblx0XHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0dmFyIHRoYXQgPSB0aGlzLFxuXHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBhcmd1bWVudHMsXG5cdFx0XHRcdFx0XHRcdFx0bWlnaHRUaHJvdyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIHJldHVybmVkLCB0aGVuO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuM1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElnbm9yZSBkb3VibGUtcmVzb2x1dGlvbiBhdHRlbXB0c1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBkZXB0aCA8IG1heERlcHRoICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkID0gaGFuZGxlci5hcHBseSggdGhhdCwgYXJncyApO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4xXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC00OFxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCByZXR1cm5lZCA9PT0gZGVmZXJyZWQucHJvbWlzZSgpICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCBcIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvblwiICk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb25zIDIuMy4zLjEsIDMuNVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTRcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTc1XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBSZXRyaWV2ZSBgdGhlbmAgb25seSBvbmNlXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGVuID0gcmV0dXJuZWQgJiZcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy40XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTY0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgY2hlY2sgb2JqZWN0cyBhbmQgZnVuY3Rpb25zIGZvciB0aGVuYWJpbGl0eVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQoIHR5cGVvZiByZXR1cm5lZCA9PT0gXCJvYmplY3RcIiB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR5cGVvZiByZXR1cm5lZCA9PT0gXCJmdW5jdGlvblwiICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQudGhlbjtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGEgcmV0dXJuZWQgdGhlbmFibGVcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggaXNGdW5jdGlvbiggdGhlbiApICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFNwZWNpYWwgcHJvY2Vzc29ycyAobm90aWZ5KSBqdXN0IHdhaXQgZm9yIHJlc29sdXRpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBzcGVjaWFsICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoZW4uY2FsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBJZGVudGl0eSwgc3BlY2lhbCApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE5vcm1hbCBwcm9jZXNzb3JzIChyZXNvbHZlKSBhbHNvIGhvb2sgaW50byBwcm9ncmVzc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gLi4uYW5kIGRpc3JlZ2FyZCBvbGRlciByZXNvbHV0aW9uIHZhbHVlc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1heERlcHRoKys7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGVuLmNhbGwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgVGhyb3dlciwgc3BlY2lhbCApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBJZGVudGl0eSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBIYW5kbGUgYWxsIG90aGVyIHJldHVybmVkIHZhbHVlc1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBPbmx5IHN1YnN0aXR1dGUgaGFuZGxlcnMgcGFzcyBvbiBjb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGFuZCBtdWx0aXBsZSB2YWx1ZXMgKG5vbi1zcGVjIGJlaGF2aW9yKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGhhbmRsZXIgIT09IElkZW50aXR5ICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoYXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncyA9IFsgcmV0dXJuZWQgXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFByb2Nlc3MgdGhlIHZhbHVlKHMpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIERlZmF1bHQgcHJvY2VzcyBpcyByZXNvbHZlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCggc3BlY2lhbCB8fCBkZWZlcnJlZC5yZXNvbHZlV2l0aCApKCB0aGF0LCBhcmdzICk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgbm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGNhdGNoIGFuZCByZWplY3QgZXhjZXB0aW9uc1xuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3MgPSBzcGVjaWFsID9cblx0XHRcdFx0XHRcdFx0XHRcdG1pZ2h0VGhyb3cgOlxuXHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWlnaHRUaHJvdygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2sgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayggZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzcy5zdGFja1RyYWNlICk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjQuMVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTYxXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWdub3JlIHBvc3QtcmVzb2x1dGlvbiBleGNlcHRpb25zXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBkZXB0aCArIDEgPj0gbWF4RGVwdGggKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgc3Vic3RpdHV0ZSBoYW5kbGVycyBwYXNzIG9uIGNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGFuZCBtdWx0aXBsZSB2YWx1ZXMgKG5vbi1zcGVjIGJlaGF2aW9yKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBoYW5kbGVyICE9PSBUaHJvd2VyICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGF0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzID0gWyBlIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIHRoYXQsIGFyZ3MgKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjFcblx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTdcblx0XHRcdFx0XHRcdFx0Ly8gUmUtcmVzb2x2ZSBwcm9taXNlcyBpbW1lZGlhdGVseSB0byBkb2RnZSBmYWxzZSByZWplY3Rpb24gZnJvbVxuXHRcdFx0XHRcdFx0XHQvLyBzdWJzZXF1ZW50IGVycm9yc1xuXHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoICkge1xuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3MoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIENhbGwgYW4gb3B0aW9uYWwgaG9vayB0byByZWNvcmQgdGhlIHN0YWNrLCBpbiBjYXNlIG9mIGV4Y2VwdGlvblxuXHRcdFx0XHRcdFx0XHRcdC8vIHNpbmNlIGl0J3Mgb3RoZXJ3aXNlIGxvc3Qgd2hlbiBleGVjdXRpb24gZ29lcyBhc3luY1xuXHRcdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3Muc3RhY2tUcmFjZSA9IGpRdWVyeS5EZWZlcnJlZC5nZXRTdGFja0hvb2soKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIHByb2Nlc3MgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4galF1ZXJ5LkRlZmVycmVkKCBmdW5jdGlvbiggbmV3RGVmZXIgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHByb2dyZXNzX2hhbmRsZXJzLmFkZCggLi4uIClcblx0XHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAzIF0uYWRkKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIsXG5cdFx0XHRcdFx0XHRcdFx0aXNGdW5jdGlvbiggb25Qcm9ncmVzcyApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uUHJvZ3Jlc3MgOlxuXHRcdFx0XHRcdFx0XHRcdFx0SWRlbnRpdHksXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIubm90aWZ5V2l0aFxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAxIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvbkZ1bGZpbGxlZCApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uRnVsZmlsbGVkIDpcblx0XHRcdFx0XHRcdFx0XHRcdElkZW50aXR5XG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmFkZCggLi4uIClcblx0XHRcdFx0XHRcdHR1cGxlc1sgMiBdWyAzIF0uYWRkKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIsXG5cdFx0XHRcdFx0XHRcdFx0aXNGdW5jdGlvbiggb25SZWplY3RlZCApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uUmVqZWN0ZWQgOlxuXHRcdFx0XHRcdFx0XHRcdFx0VGhyb3dlclxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gKS5wcm9taXNlKCk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gR2V0IGEgcHJvbWlzZSBmb3IgdGhpcyBkZWZlcnJlZFxuXHRcdFx0XHQvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0XG5cdFx0XHRcdHByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9iaiAhPSBudWxsID8galF1ZXJ5LmV4dGVuZCggb2JqLCBwcm9taXNlICkgOiBwcm9taXNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVmZXJyZWQgPSB7fTtcblxuXHRcdC8vIEFkZCBsaXN0LXNwZWNpZmljIG1ldGhvZHNcblx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7XG5cdFx0XHR2YXIgbGlzdCA9IHR1cGxlWyAyIF0sXG5cdFx0XHRcdHN0YXRlU3RyaW5nID0gdHVwbGVbIDUgXTtcblxuXHRcdFx0Ly8gcHJvbWlzZS5wcm9ncmVzcyA9IGxpc3QuYWRkXG5cdFx0XHQvLyBwcm9taXNlLmRvbmUgPSBsaXN0LmFkZFxuXHRcdFx0Ly8gcHJvbWlzZS5mYWlsID0gbGlzdC5hZGRcblx0XHRcdHByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRkO1xuXG5cdFx0XHQvLyBIYW5kbGUgc3RhdGVcblx0XHRcdGlmICggc3RhdGVTdHJpbmcgKSB7XG5cdFx0XHRcdGxpc3QuYWRkKFxuXHRcdFx0XHRcdGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdFx0XHQvLyBzdGF0ZSA9IFwicmVzb2x2ZWRcIiAoaS5lLiwgZnVsZmlsbGVkKVxuXHRcdFx0XHRcdFx0Ly8gc3RhdGUgPSBcInJlamVjdGVkXCJcblx0XHRcdFx0XHRcdHN0YXRlID0gc3RhdGVTdHJpbmc7XG5cdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdC8vIHJlamVjdGVkX2NhbGxiYWNrcy5kaXNhYmxlXG5cdFx0XHRcdFx0Ly8gZnVsZmlsbGVkX2NhbGxiYWNrcy5kaXNhYmxlXG5cdFx0XHRcdFx0dHVwbGVzWyAzIC0gaSBdWyAyIF0uZGlzYWJsZSxcblxuXHRcdFx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmRpc2FibGVcblx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZGlzYWJsZVxuXHRcdFx0XHRcdHR1cGxlc1sgMyAtIGkgXVsgMyBdLmRpc2FibGUsXG5cblx0XHRcdFx0XHQvLyBwcm9ncmVzc19jYWxsYmFja3MubG9ja1xuXHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAyIF0ubG9jayxcblxuXHRcdFx0XHRcdC8vIHByb2dyZXNzX2hhbmRsZXJzLmxvY2tcblx0XHRcdFx0XHR0dXBsZXNbIDAgXVsgMyBdLmxvY2tcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMuZmlyZVxuXHRcdFx0Ly8gZnVsZmlsbGVkX2hhbmRsZXJzLmZpcmVcblx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmZpcmVcblx0XHRcdGxpc3QuYWRkKCB0dXBsZVsgMyBdLmZpcmUgKTtcblxuXHRcdFx0Ly8gZGVmZXJyZWQubm90aWZ5ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLm5vdGlmeVdpdGgoLi4uKSB9XG5cdFx0XHQvLyBkZWZlcnJlZC5yZXNvbHZlID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLnJlc29sdmVXaXRoKC4uLikgfVxuXHRcdFx0Ly8gZGVmZXJyZWQucmVqZWN0ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLnJlamVjdFdpdGgoLi4uKSB9XG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXSggdGhpcyA9PT0gZGVmZXJyZWQgPyB1bmRlZmluZWQgOiB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBkZWZlcnJlZC5ub3RpZnlXaXRoID0gbGlzdC5maXJlV2l0aFxuXHRcdFx0Ly8gZGVmZXJyZWQucmVzb2x2ZVdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHQvLyBkZWZlcnJlZC5yZWplY3RXaXRoID0gbGlzdC5maXJlV2l0aFxuXHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdID0gbGlzdC5maXJlV2l0aDtcblx0XHR9ICk7XG5cblx0XHQvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2Vcblx0XHRwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7XG5cblx0XHQvLyBDYWxsIGdpdmVuIGZ1bmMgaWYgYW55XG5cdFx0aWYgKCBmdW5jICkge1xuXHRcdFx0ZnVuYy5jYWxsKCBkZWZlcnJlZCwgZGVmZXJyZWQgKTtcblx0XHR9XG5cblx0XHQvLyBBbGwgZG9uZSFcblx0XHRyZXR1cm4gZGVmZXJyZWQ7XG5cdH0sXG5cblx0Ly8gRGVmZXJyZWQgaGVscGVyXG5cdHdoZW46IGZ1bmN0aW9uKCBzaW5nbGVWYWx1ZSApIHtcblx0XHR2YXJcblxuXHRcdFx0Ly8gY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzXG5cdFx0XHRyZW1haW5pbmcgPSBhcmd1bWVudHMubGVuZ3RoLFxuXG5cdFx0XHQvLyBjb3VudCBvZiB1bnByb2Nlc3NlZCBhcmd1bWVudHNcblx0XHRcdGkgPSByZW1haW5pbmcsXG5cblx0XHRcdC8vIHN1Ym9yZGluYXRlIGZ1bGZpbGxtZW50IGRhdGFcblx0XHRcdHJlc29sdmVDb250ZXh0cyA9IEFycmF5KCBpICksXG5cdFx0XHRyZXNvbHZlVmFsdWVzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICksXG5cblx0XHRcdC8vIHRoZSBwcmltYXJ5IERlZmVycmVkXG5cdFx0XHRwcmltYXJ5ID0galF1ZXJ5LkRlZmVycmVkKCksXG5cblx0XHRcdC8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3Rvcnlcblx0XHRcdHVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7XG5cdFx0XHRcdFx0cmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlO1xuXHRcdFx0XHRcdGlmICggISggLS1yZW1haW5pbmcgKSApIHtcblx0XHRcdFx0XHRcdHByaW1hcnkucmVzb2x2ZVdpdGgoIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZhbHVlcyApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH07XG5cblx0XHQvLyBTaW5nbGUtIGFuZCBlbXB0eSBhcmd1bWVudHMgYXJlIGFkb3B0ZWQgbGlrZSBQcm9taXNlLnJlc29sdmVcblx0XHRpZiAoIHJlbWFpbmluZyA8PSAxICkge1xuXHRcdFx0YWRvcHRWYWx1ZSggc2luZ2xlVmFsdWUsIHByaW1hcnkuZG9uZSggdXBkYXRlRnVuYyggaSApICkucmVzb2x2ZSwgcHJpbWFyeS5yZWplY3QsXG5cdFx0XHRcdCFyZW1haW5pbmcgKTtcblxuXHRcdFx0Ly8gVXNlIC50aGVuKCkgdG8gdW53cmFwIHNlY29uZGFyeSB0aGVuYWJsZXMgKGNmLiBnaC0zMDAwKVxuXHRcdFx0aWYgKCBwcmltYXJ5LnN0YXRlKCkgPT09IFwicGVuZGluZ1wiIHx8XG5cdFx0XHRcdGlzRnVuY3Rpb24oIHJlc29sdmVWYWx1ZXNbIGkgXSAmJiByZXNvbHZlVmFsdWVzWyBpIF0udGhlbiApICkge1xuXG5cdFx0XHRcdHJldHVybiBwcmltYXJ5LnRoZW4oKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBNdWx0aXBsZSBhcmd1bWVudHMgYXJlIGFnZ3JlZ2F0ZWQgbGlrZSBQcm9taXNlLmFsbCBhcnJheSBlbGVtZW50c1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0YWRvcHRWYWx1ZSggcmVzb2x2ZVZhbHVlc1sgaSBdLCB1cGRhdGVGdW5jKCBpICksIHByaW1hcnkucmVqZWN0ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByaW1hcnkucHJvbWlzZSgpO1xuXHR9XG59ICk7XG5cblxuLy8gVGhlc2UgdXN1YWxseSBpbmRpY2F0ZSBhIHByb2dyYW1tZXIgbWlzdGFrZSBkdXJpbmcgZGV2ZWxvcG1lbnQsXG4vLyB3YXJuIGFib3V0IHRoZW0gQVNBUCByYXRoZXIgdGhhbiBzd2FsbG93aW5nIHRoZW0gYnkgZGVmYXVsdC5cbnZhciByZXJyb3JOYW1lcyA9IC9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO1xuXG5qUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayA9IGZ1bmN0aW9uKCBlcnJvciwgc3RhY2sgKSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgOCAtIDkgb25seVxuXHQvLyBDb25zb2xlIGV4aXN0cyB3aGVuIGRldiB0b29scyBhcmUgb3Blbiwgd2hpY2ggY2FuIGhhcHBlbiBhdCBhbnkgdGltZVxuXHRpZiAoIHdpbmRvdy5jb25zb2xlICYmIHdpbmRvdy5jb25zb2xlLndhcm4gJiYgZXJyb3IgJiYgcmVycm9yTmFtZXMudGVzdCggZXJyb3IubmFtZSApICkge1xuXHRcdHdpbmRvdy5jb25zb2xlLndhcm4oIFwialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogXCIgKyBlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjaywgc3RhY2sgKTtcblx0fVxufTtcblxuXG5cblxualF1ZXJ5LnJlYWR5RXhjZXB0aW9uID0gZnVuY3Rpb24oIGVycm9yICkge1xuXHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0dGhyb3cgZXJyb3I7XG5cdH0gKTtcbn07XG5cblxuXG5cbi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeVxudmFyIHJlYWR5TGlzdCA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5qUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7XG5cblx0cmVhZHlMaXN0XG5cdFx0LnRoZW4oIGZuIClcblxuXHRcdC8vIFdyYXAgalF1ZXJ5LnJlYWR5RXhjZXB0aW9uIGluIGEgZnVuY3Rpb24gc28gdGhhdCB0aGUgbG9va3VwXG5cdFx0Ly8gaGFwcGVucyBhdCB0aGUgdGltZSBvZiBlcnJvciBoYW5kbGluZyBpbnN0ZWFkIG9mIGNhbGxiYWNrXG5cdFx0Ly8gcmVnaXN0cmF0aW9uLlxuXHRcdC5jYXRjaCggZnVuY3Rpb24oIGVycm9yICkge1xuXHRcdFx0alF1ZXJ5LnJlYWR5RXhjZXB0aW9uKCBlcnJvciApO1xuXHRcdH0gKTtcblxuXHRyZXR1cm4gdGhpcztcbn07XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLlxuXHRpc1JlYWR5OiBmYWxzZSxcblxuXHQvLyBBIGNvdW50ZXIgdG8gdHJhY2sgaG93IG1hbnkgaXRlbXMgdG8gd2FpdCBmb3IgYmVmb3JlXG5cdC8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxXG5cdHJlYWR5V2FpdDogMSxcblxuXHQvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5XG5cdHJlYWR5OiBmdW5jdGlvbiggd2FpdCApIHtcblxuXHRcdC8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkgcmVhZHlcblx0XHRpZiAoIHdhaXQgPT09IHRydWUgPyAtLWpRdWVyeS5yZWFkeVdhaXQgOiBqUXVlcnkuaXNSZWFkeSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHlcblx0XHRqUXVlcnkuaXNSZWFkeSA9IHRydWU7XG5cblx0XHQvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZVxuXHRcdGlmICggd2FpdCAhPT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRvIGV4ZWN1dGVcblx0XHRyZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LnJlYWR5LnRoZW4gPSByZWFkeUxpc3QudGhlbjtcblxuLy8gVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIgYW5kIHNlbGYgY2xlYW51cCBtZXRob2RcbmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHtcblx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJsb2FkXCIsIGNvbXBsZXRlZCApO1xuXHRqUXVlcnkucmVhZHkoKTtcbn1cblxuLy8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWRcbi8vIGFmdGVyIHRoZSBicm93c2VyIGV2ZW50IGhhcyBhbHJlYWR5IG9jY3VycmVkLlxuLy8gU3VwcG9ydDogSUUgPD05IC0gMTAgb25seVxuLy8gT2xkZXIgSUUgc29tZXRpbWVzIHNpZ25hbHMgXCJpbnRlcmFjdGl2ZVwiIHRvbyBzb29uXG5pZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIiB8fFxuXHQoIGRvY3VtZW50LnJlYWR5U3RhdGUgIT09IFwibG9hZGluZ1wiICYmICFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwgKSApIHtcblxuXHQvLyBIYW5kbGUgaXQgYXN5bmNocm9ub3VzbHkgdG8gYWxsb3cgc2NyaXB0cyB0aGUgb3Bwb3J0dW5pdHkgdG8gZGVsYXkgcmVhZHlcblx0d2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApO1xuXG59IGVsc2Uge1xuXG5cdC8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2tcblx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXG5cdC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG59XG5cblxuXG5cbi8vIE11bHRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIG9mIGEgY29sbGVjdGlvblxuLy8gVGhlIHZhbHVlL3MgY2FuIG9wdGlvbmFsbHkgYmUgZXhlY3V0ZWQgaWYgaXQncyBhIGZ1bmN0aW9uXG52YXIgYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gZWxlbXMubGVuZ3RoLFxuXHRcdGJ1bGsgPSBrZXkgPT0gbnVsbDtcblxuXHQvLyBTZXRzIG1hbnkgdmFsdWVzXG5cdGlmICggdG9UeXBlKCBrZXkgKSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRjaGFpbmFibGUgPSB0cnVlO1xuXHRcdGZvciAoIGkgaW4ga2V5ICkge1xuXHRcdFx0YWNjZXNzKCBlbGVtcywgZm4sIGksIGtleVsgaSBdLCB0cnVlLCBlbXB0eUdldCwgcmF3ICk7XG5cdFx0fVxuXG5cdC8vIFNldHMgb25lIHZhbHVlXG5cdH0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblxuXHRcdGlmICggIWlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyYXcgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICggYnVsayApIHtcblxuXHRcdFx0Ly8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2FpbnN0IHRoZSBlbnRpcmUgc2V0XG5cdFx0XHRpZiAoIHJhdyApIHtcblx0XHRcdFx0Zm4uY2FsbCggZWxlbXMsIHZhbHVlICk7XG5cdFx0XHRcdGZuID0gbnVsbDtcblxuXHRcdFx0Ly8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnVsayA9IGZuO1xuXHRcdFx0XHRmbiA9IGZ1bmN0aW9uKCBlbGVtLCBfa2V5LCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gYnVsay5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIGZuICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdGZuKFxuXHRcdFx0XHRcdGVsZW1zWyBpIF0sIGtleSwgcmF3ID9cblx0XHRcdFx0XHRcdHZhbHVlIDpcblx0XHRcdFx0XHRcdHZhbHVlLmNhbGwoIGVsZW1zWyBpIF0sIGksIGZuKCBlbGVtc1sgaSBdLCBrZXkgKSApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKCBjaGFpbmFibGUgKSB7XG5cdFx0cmV0dXJuIGVsZW1zO1xuXHR9XG5cblx0Ly8gR2V0c1xuXHRpZiAoIGJ1bGsgKSB7XG5cdFx0cmV0dXJuIGZuLmNhbGwoIGVsZW1zICk7XG5cdH1cblxuXHRyZXR1cm4gbGVuID8gZm4oIGVsZW1zWyAwIF0sIGtleSApIDogZW1wdHlHZXQ7XG59O1xuXG5cbi8vIE1hdGNoZXMgZGFzaGVkIHN0cmluZyBmb3IgY2FtZWxpemluZ1xudmFyIHJtc1ByZWZpeCA9IC9eLW1zLS8sXG5cdHJkYXNoQWxwaGEgPSAvLShbYS16XSkvZztcblxuLy8gVXNlZCBieSBjYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpXG5mdW5jdGlvbiBmY2FtZWxDYXNlKCBfYWxsLCBsZXR0ZXIgKSB7XG5cdHJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTtcbn1cblxuLy8gQ29udmVydCBkYXNoZWQgdG8gY2FtZWxDYXNlOyB1c2VkIGJ5IHRoZSBjc3MgYW5kIGRhdGEgbW9kdWxlc1xuLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNVxuLy8gTWljcm9zb2Z0IGZvcmdvdCB0byBodW1wIHRoZWlyIHZlbmRvciBwcmVmaXggKCM5NTcyKVxuZnVuY3Rpb24gY2FtZWxDYXNlKCBzdHJpbmcgKSB7XG5cdHJldHVybiBzdHJpbmcucmVwbGFjZSggcm1zUHJlZml4LCBcIm1zLVwiICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApO1xufVxudmFyIGFjY2VwdERhdGEgPSBmdW5jdGlvbiggb3duZXIgKSB7XG5cblx0Ly8gQWNjZXB0cyBvbmx5OlxuXHQvLyAgLSBOb2RlXG5cdC8vICAgIC0gTm9kZS5FTEVNRU5UX05PREVcblx0Ly8gICAgLSBOb2RlLkRPQ1VNRU5UX05PREVcblx0Ly8gIC0gT2JqZWN0XG5cdC8vICAgIC0gQW55XG5cdHJldHVybiBvd25lci5ub2RlVHlwZSA9PT0gMSB8fCBvd25lci5ub2RlVHlwZSA9PT0gOSB8fCAhKCArb3duZXIubm9kZVR5cGUgKTtcbn07XG5cblxuXG5cbmZ1bmN0aW9uIERhdGEoKSB7XG5cdHRoaXMuZXhwYW5kbyA9IGpRdWVyeS5leHBhbmRvICsgRGF0YS51aWQrKztcbn1cblxuRGF0YS51aWQgPSAxO1xuXG5EYXRhLnByb3RvdHlwZSA9IHtcblxuXHRjYWNoZTogZnVuY3Rpb24oIG93bmVyICkge1xuXG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIG93bmVyIG9iamVjdCBhbHJlYWR5IGhhcyBhIGNhY2hlXG5cdFx0dmFyIHZhbHVlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXG5cdFx0Ly8gSWYgbm90LCBjcmVhdGUgb25lXG5cdFx0aWYgKCAhdmFsdWUgKSB7XG5cdFx0XHR2YWx1ZSA9IHt9O1xuXG5cdFx0XHQvLyBXZSBjYW4gYWNjZXB0IGRhdGEgZm9yIG5vbi1lbGVtZW50IG5vZGVzIGluIG1vZGVybiBicm93c2Vycyxcblx0XHRcdC8vIGJ1dCB3ZSBzaG91bGQgbm90LCBzZWUgIzgzMzUuXG5cdFx0XHQvLyBBbHdheXMgcmV0dXJuIGFuIGVtcHR5IG9iamVjdC5cblx0XHRcdGlmICggYWNjZXB0RGF0YSggb3duZXIgKSApIHtcblxuXHRcdFx0XHQvLyBJZiBpdCBpcyBhIG5vZGUgdW5saWtlbHkgdG8gYmUgc3RyaW5naWZ5LWVkIG9yIGxvb3BlZCBvdmVyXG5cdFx0XHRcdC8vIHVzZSBwbGFpbiBhc3NpZ25tZW50XG5cdFx0XHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdmFsdWU7XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHNlY3VyZSBpdCBpbiBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5XG5cdFx0XHRcdC8vIGNvbmZpZ3VyYWJsZSBtdXN0IGJlIHRydWUgdG8gYWxsb3cgdGhlIHByb3BlcnR5IHRvIGJlXG5cdFx0XHRcdC8vIGRlbGV0ZWQgd2hlbiBkYXRhIGlzIHJlbW92ZWRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIG93bmVyLCB0aGlzLmV4cGFuZG8sIHtcblx0XHRcdFx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZVxuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB2YWx1ZTtcblx0fSxcblx0c2V0OiBmdW5jdGlvbiggb3duZXIsIGRhdGEsIHZhbHVlICkge1xuXHRcdHZhciBwcm9wLFxuXHRcdFx0Y2FjaGUgPSB0aGlzLmNhY2hlKCBvd25lciApO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCBrZXksIHZhbHVlIF0gYXJnc1xuXHRcdC8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1Nylcblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0Y2FjaGVbIGNhbWVsQ2FzZSggZGF0YSApIF0gPSB2YWx1ZTtcblxuXHRcdC8vIEhhbmRsZTogWyBvd25lciwgeyBwcm9wZXJ0aWVzIH0gXSBhcmdzXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gQ29weSB0aGUgcHJvcGVydGllcyBvbmUtYnktb25lIHRvIHRoZSBjYWNoZSBvYmplY3Rcblx0XHRcdGZvciAoIHByb3AgaW4gZGF0YSApIHtcblx0XHRcdFx0Y2FjaGVbIGNhbWVsQ2FzZSggcHJvcCApIF0gPSBkYXRhWyBwcm9wIF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBjYWNoZTtcblx0fSxcblx0Z2V0OiBmdW5jdGlvbiggb3duZXIsIGtleSApIHtcblx0XHRyZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgP1xuXHRcdFx0dGhpcy5jYWNoZSggb3duZXIgKSA6XG5cblx0XHRcdC8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1Nylcblx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSAmJiBvd25lclsgdGhpcy5leHBhbmRvIF1bIGNhbWVsQ2FzZSgga2V5ICkgXTtcblx0fSxcblx0YWNjZXNzOiBmdW5jdGlvbiggb3duZXIsIGtleSwgdmFsdWUgKSB7XG5cblx0XHQvLyBJbiBjYXNlcyB3aGVyZSBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIE5vIGtleSB3YXMgc3BlY2lmaWVkXG5cdFx0Ly8gICAyLiBBIHN0cmluZyBrZXkgd2FzIHNwZWNpZmllZCwgYnV0IG5vIHZhbHVlIHByb3ZpZGVkXG5cdFx0Ly9cblx0XHQvLyBUYWtlIHRoZSBcInJlYWRcIiBwYXRoIGFuZCBhbGxvdyB0aGUgZ2V0IG1ldGhvZCB0byBkZXRlcm1pbmVcblx0XHQvLyB3aGljaCB2YWx1ZSB0byByZXR1cm4sIHJlc3BlY3RpdmVseSBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIFRoZSBlbnRpcmUgY2FjaGUgb2JqZWN0XG5cdFx0Ly8gICAyLiBUaGUgZGF0YSBzdG9yZWQgYXQgdGhlIGtleVxuXHRcdC8vXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fFxuXHRcdFx0XHQoICgga2V5ICYmIHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgKSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmdldCggb3duZXIsIGtleSApO1xuXHRcdH1cblxuXHRcdC8vIFdoZW4gdGhlIGtleSBpcyBub3QgYSBzdHJpbmcsIG9yIGJvdGggYSBrZXkgYW5kIHZhbHVlXG5cdFx0Ly8gYXJlIHNwZWNpZmllZCwgc2V0IG9yIGV4dGVuZCAoZXhpc3Rpbmcgb2JqZWN0cykgd2l0aCBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIEFuIG9iamVjdCBvZiBwcm9wZXJ0aWVzXG5cdFx0Ly8gICAyLiBBIGtleSBhbmQgdmFsdWVcblx0XHQvL1xuXHRcdHRoaXMuc2V0KCBvd25lciwga2V5LCB2YWx1ZSApO1xuXG5cdFx0Ly8gU2luY2UgdGhlIFwic2V0XCIgcGF0aCBjYW4gaGF2ZSB0d28gcG9zc2libGUgZW50cnkgcG9pbnRzXG5cdFx0Ly8gcmV0dXJuIHRoZSBleHBlY3RlZCBkYXRhIGJhc2VkIG9uIHdoaWNoIHBhdGggd2FzIHRha2VuWypdXG5cdFx0cmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IGtleTtcblx0fSxcblx0cmVtb3ZlOiBmdW5jdGlvbiggb3duZXIsIGtleSApIHtcblx0XHR2YXIgaSxcblx0XHRcdGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXG5cdFx0aWYgKCBjYWNoZSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICgga2V5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBrZXlzXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIGtleSApICkge1xuXG5cdFx0XHRcdC8vIElmIGtleSBpcyBhbiBhcnJheSBvZiBrZXlzLi4uXG5cdFx0XHRcdC8vIFdlIGFsd2F5cyBzZXQgY2FtZWxDYXNlIGtleXMsIHNvIHJlbW92ZSB0aGF0LlxuXHRcdFx0XHRrZXkgPSBrZXkubWFwKCBjYW1lbENhc2UgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGtleSA9IGNhbWVsQ2FzZSgga2V5ICk7XG5cblx0XHRcdFx0Ly8gSWYgYSBrZXkgd2l0aCB0aGUgc3BhY2VzIGV4aXN0cywgdXNlIGl0LlxuXHRcdFx0XHQvLyBPdGhlcndpc2UsIGNyZWF0ZSBhbiBhcnJheSBieSBtYXRjaGluZyBub24td2hpdGVzcGFjZVxuXHRcdFx0XHRrZXkgPSBrZXkgaW4gY2FjaGUgP1xuXHRcdFx0XHRcdFsga2V5IF0gOlxuXHRcdFx0XHRcdCgga2V5Lm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10gKTtcblx0XHRcdH1cblxuXHRcdFx0aSA9IGtleS5sZW5ndGg7XG5cblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRkZWxldGUgY2FjaGVbIGtleVsgaSBdIF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIHRoZXJlJ3Mgbm8gbW9yZSBkYXRhXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKSApIHtcblxuXHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MzUgLSA0NVxuXHRcdFx0Ly8gV2Via2l0ICYgQmxpbmsgcGVyZm9ybWFuY2Ugc3VmZmVycyB3aGVuIGRlbGV0aW5nIHByb3BlcnRpZXNcblx0XHRcdC8vIGZyb20gRE9NIG5vZGVzLCBzbyBzZXQgdG8gdW5kZWZpbmVkIGluc3RlYWRcblx0XHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTM3ODYwNyAoYnVnIHJlc3RyaWN0ZWQpXG5cdFx0XHRpZiAoIG93bmVyLm5vZGVUeXBlICkge1xuXHRcdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWxldGUgb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0aGFzRGF0YTogZnVuY3Rpb24oIG93bmVyICkge1xuXHRcdHZhciBjYWNoZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblx0XHRyZXR1cm4gY2FjaGUgIT09IHVuZGVmaW5lZCAmJiAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGNhY2hlICk7XG5cdH1cbn07XG52YXIgZGF0YVByaXYgPSBuZXcgRGF0YSgpO1xuXG52YXIgZGF0YVVzZXIgPSBuZXcgRGF0YSgpO1xuXG5cblxuLy9cdEltcGxlbWVudGF0aW9uIFN1bW1hcnlcbi8vXG4vL1x0MS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRoIDEuOS54IGJyYW5jaFxuLy9cdDIuIEltcHJvdmUgdGhlIG1vZHVsZSdzIG1haW50YWluYWJpbGl0eSBieSByZWR1Y2luZyB0aGUgc3RvcmFnZVxuLy9cdFx0cGF0aHMgdG8gYSBzaW5nbGUgbWVjaGFuaXNtLlxuLy9cdDMuIFVzZSB0aGUgc2FtZSBzaW5nbGUgbWVjaGFuaXNtIHRvIHN1cHBvcnQgXCJwcml2YXRlXCIgYW5kIFwidXNlclwiIGRhdGEuXG4vL1x0NC4gX05ldmVyXyBleHBvc2UgXCJwcml2YXRlXCIgZGF0YSB0byB1c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKVxuLy9cdDUuIEF2b2lkIGV4cG9zaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb24gdXNlciBvYmplY3RzIChlZy4gZXhwYW5kbyBwcm9wZXJ0aWVzKVxuLy9cdDYuIFByb3ZpZGUgYSBjbGVhciBwYXRoIGZvciBpbXBsZW1lbnRhdGlvbiB1cGdyYWRlIHRvIFdlYWtNYXAgaW4gMjAxNFxuXG52YXIgcmJyYWNlID0gL14oPzpcXHtbXFx3XFxXXSpcXH18XFxbW1xcd1xcV10qXFxdKSQvLFxuXHRybXVsdGlEYXNoID0gL1tBLVpdL2c7XG5cbmZ1bmN0aW9uIGdldERhdGEoIGRhdGEgKSB7XG5cdGlmICggZGF0YSA9PT0gXCJ0cnVlXCIgKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRpZiAoIGRhdGEgPT09IFwiZmFsc2VcIiApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRpZiAoIGRhdGEgPT09IFwibnVsbFwiICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Ly8gT25seSBjb252ZXJ0IHRvIGEgbnVtYmVyIGlmIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZSBzdHJpbmdcblx0aWYgKCBkYXRhID09PSArZGF0YSArIFwiXCIgKSB7XG5cdFx0cmV0dXJuICtkYXRhO1xuXHR9XG5cblx0aWYgKCByYnJhY2UudGVzdCggZGF0YSApICkge1xuXHRcdHJldHVybiBKU09OLnBhcnNlKCBkYXRhICk7XG5cdH1cblxuXHRyZXR1cm4gZGF0YTtcbn1cblxuZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHtcblx0dmFyIG5hbWU7XG5cblx0Ly8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueVxuXHQvLyBkYXRhIGZyb20gdGhlIEhUTUw1IGRhdGEtKiBhdHRyaWJ1dGVcblx0aWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRuYW1lID0gXCJkYXRhLVwiICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsIFwiLSQmXCIgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdGRhdGEgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApO1xuXG5cdFx0aWYgKCB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGRhdGEgPSBnZXREYXRhKCBkYXRhICk7XG5cdFx0XHR9IGNhdGNoICggZSApIHt9XG5cblx0XHRcdC8vIE1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGRhdGEgc28gaXQgaXNuJ3QgY2hhbmdlZCBsYXRlclxuXHRcdFx0ZGF0YVVzZXIuc2V0KCBlbGVtLCBrZXksIGRhdGEgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGRhdGE7XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0aGFzRGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRhdGFVc2VyLmhhc0RhdGEoIGVsZW0gKSB8fCBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICk7XG5cdH0sXG5cblx0ZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIGRhdGFVc2VyLmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApO1xuXHR9LFxuXG5cdHJlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFVc2VyLnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9LFxuXG5cdC8vIFRPRE86IE5vdyB0aGF0IGFsbCBjYWxscyB0byBfZGF0YSBhbmQgX3JlbW92ZURhdGEgaGF2ZSBiZWVuIHJlcGxhY2VkXG5cdC8vIHdpdGggZGlyZWN0IGNhbGxzIHRvIGRhdGFQcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLlxuXHRfZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIGRhdGFQcml2LmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApO1xuXHR9LFxuXG5cdF9yZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIG5hbWUgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXHRcdHZhciBpLCBuYW1lLCBkYXRhLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdGF0dHJzID0gZWxlbSAmJiBlbGVtLmF0dHJpYnV0ZXM7XG5cblx0XHQvLyBHZXRzIGFsbCB2YWx1ZXNcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0aWYgKCB0aGlzLmxlbmd0aCApIHtcblx0XHRcdFx0ZGF0YSA9IGRhdGFVc2VyLmdldCggZWxlbSApO1xuXG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhZGF0YVByaXYuZ2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiICkgKSB7XG5cdFx0XHRcdFx0aSA9IGF0dHJzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgMTEgb25seVxuXHRcdFx0XHRcdFx0Ly8gVGhlIGF0dHJzIGVsZW1lbnRzIGNhbiBiZSBudWxsICgjMTQ4OTQpXG5cdFx0XHRcdFx0XHRpZiAoIGF0dHJzWyBpIF0gKSB7XG5cdFx0XHRcdFx0XHRcdG5hbWUgPSBhdHRyc1sgaSBdLm5hbWU7XG5cdFx0XHRcdFx0XHRcdGlmICggbmFtZS5pbmRleE9mKCBcImRhdGEtXCIgKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHRuYW1lID0gY2FtZWxDYXNlKCBuYW1lLnNsaWNlKCA1ICkgKTtcblx0XHRcdFx0XHRcdFx0XHRkYXRhQXR0ciggZWxlbSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0cyBtdWx0aXBsZSB2YWx1ZXNcblx0XHRpZiAoIHR5cGVvZiBrZXkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZGF0YTtcblxuXHRcdFx0Ly8gVGhlIGNhbGxpbmcgalF1ZXJ5IG9iamVjdCAoZWxlbWVudCBtYXRjaGVzKSBpcyBub3QgZW1wdHlcblx0XHRcdC8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlXG5cdFx0XHQvLyBgdmFsdWVgIHBhcmFtZXRlciB3YXMgbm90IHVuZGVmaW5lZC4gQW4gZW1wdHkgalF1ZXJ5IG9iamVjdFxuXHRcdFx0Ly8gd2lsbCByZXN1bHQgaW4gYHVuZGVmaW5lZGAgZm9yIGVsZW0gPSB0aGlzWyAwIF0gd2hpY2ggd2lsbFxuXHRcdFx0Ly8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS5cblx0XHRcdGlmICggZWxlbSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIEF0dGVtcHQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FjaGVcblx0XHRcdFx0Ly8gVGhlIGtleSB3aWxsIGFsd2F5cyBiZSBjYW1lbENhc2VkIGluIERhdGFcblx0XHRcdFx0ZGF0YSA9IGRhdGFVc2VyLmdldCggZWxlbSwga2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBcImRpc2NvdmVyXCIgdGhlIGRhdGEgaW5cblx0XHRcdFx0Ly8gSFRNTDUgY3VzdG9tIGRhdGEtKiBhdHRyc1xuXHRcdFx0XHRkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGtleSApO1xuXHRcdFx0XHRpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdlIHRyaWVkIHJlYWxseSBoYXJkLCBidXQgdGhlIGRhdGEgZG9lc24ndCBleGlzdC5cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgdGhlIGRhdGEuLi5cblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHN0b3JlIHRoZSBjYW1lbENhc2VkIGtleVxuXHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTtcblx0XHRcdH0gKTtcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEsIG51bGwsIHRydWUgKTtcblx0fSxcblxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0ZGF0YVVzZXIucmVtb3ZlKCB0aGlzLCBrZXkgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdHF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgcXVldWU7XG5cblx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHR0eXBlID0gKCB0eXBlIHx8IFwiZnhcIiApICsgXCJxdWV1ZVwiO1xuXHRcdFx0cXVldWUgPSBkYXRhUHJpdi5nZXQoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0Ly8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cFxuXHRcdFx0aWYgKCBkYXRhICkge1xuXHRcdFx0XHRpZiAoICFxdWV1ZSB8fCBBcnJheS5pc0FycmF5KCBkYXRhICkgKSB7XG5cdFx0XHRcdFx0cXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHF1ZXVlLnB1c2goIGRhdGEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHF1ZXVlIHx8IFtdO1xuXHRcdH1cblx0fSxcblxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0XHR2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSxcblx0XHRcdHN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLFxuXHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpLFxuXHRcdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIHR5cGUgKSxcblx0XHRcdG5leHQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTtcblx0XHRcdH07XG5cblx0XHQvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUgdGhlIHByb2dyZXNzIHNlbnRpbmVsXG5cdFx0aWYgKCBmbiA9PT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCk7XG5cdFx0XHRzdGFydExlbmd0aC0tO1xuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cblx0XHRcdC8vIEFkZCBhIHByb2dyZXNzIHNlbnRpbmVsIHRvIHByZXZlbnQgdGhlIGZ4IHF1ZXVlIGZyb20gYmVpbmdcblx0XHRcdC8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWRcblx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICkge1xuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KCBcImlucHJvZ3Jlc3NcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDbGVhciB1cCB0aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1bmN0aW9uXG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdGZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhc3RhcnRMZW5ndGggJiYgaG9va3MgKSB7XG5cdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIE5vdCBwdWJsaWMgLSBnZW5lcmF0ZSBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciByZXR1cm4gdGhlIGN1cnJlbnQgb25lXG5cdF9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR2YXIga2V5ID0gdHlwZSArIFwicXVldWVIb29rc1wiO1xuXHRcdHJldHVybiBkYXRhUHJpdi5nZXQoIGVsZW0sIGtleSApIHx8IGRhdGFQcml2LmFjY2VzcyggZWxlbSwga2V5LCB7XG5cdFx0XHRlbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICkuYWRkKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBbIHR5cGUgKyBcInF1ZXVlXCIsIGtleSBdICk7XG5cdFx0XHR9IClcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHNldHRlciA9IDI7XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZGF0YSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gXCJmeFwiO1xuXHRcdFx0c2V0dGVyLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoIDwgc2V0dGVyICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzIDpcblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlXG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggdGhpcywgdHlwZSApO1xuXG5cdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICYmIHF1ZXVlWyAwIF0gIT09IFwiaW5wcm9ncmVzc1wiICkge1xuXHRcdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0fSxcblx0ZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdH0gKTtcblx0fSxcblx0Y2xlYXJRdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHR9LFxuXG5cdC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGVcblx0Ly8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpXG5cdHByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7XG5cdFx0dmFyIHRtcCxcblx0XHRcdGNvdW50ID0gMSxcblx0XHRcdGRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRlbGVtZW50cyA9IHRoaXMsXG5cdFx0XHRpID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRyZXNvbHZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggISggLS1jb3VudCApICkge1xuXHRcdFx0XHRcdGRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b2JqID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG1wID0gZGF0YVByaXYuZ2V0KCBlbGVtZW50c1sgaSBdLCB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgKTtcblx0XHRcdGlmICggdG1wICYmIHRtcC5lbXB0eSApIHtcblx0XHRcdFx0Y291bnQrKztcblx0XHRcdFx0dG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXNvbHZlKCk7XG5cdFx0cmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApO1xuXHR9XG59ICk7XG52YXIgcG51bSA9ICggL1srLV0/KD86XFxkKlxcLnwpXFxkKyg/OltlRV1bKy1dP1xcZCt8KS8gKS5zb3VyY2U7XG5cbnZhciByY3NzTnVtID0gbmV3IFJlZ0V4cCggXCJeKD86KFsrLV0pPXwpKFwiICsgcG51bSArIFwiKShbYS16JV0qKSRcIiwgXCJpXCIgKTtcblxuXG52YXIgY3NzRXhwYW5kID0gWyBcIlRvcFwiLCBcIlJpZ2h0XCIsIFwiQm90dG9tXCIsIFwiTGVmdFwiIF07XG5cbnZhciBkb2N1bWVudEVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cblxuXG5cdHZhciBpc0F0dGFjaGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblx0XHR9LFxuXHRcdGNvbXBvc2VkID0geyBjb21wb3NlZDogdHJ1ZSB9O1xuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSssIEVkZ2UgMTIgLSAxOCssIGlPUyAxMC4wIC0gMTAuMiBvbmx5XG5cdC8vIENoZWNrIGF0dGFjaG1lbnQgYWNyb3NzIHNoYWRvdyBET00gYm91bmRhcmllcyB3aGVuIHBvc3NpYmxlIChnaC0zNTA0KVxuXHQvLyBTdXBwb3J0OiBpT1MgMTAuMC0xMC4yIG9ubHlcblx0Ly8gRWFybHkgaU9TIDEwIHZlcnNpb25zIHN1cHBvcnQgYGF0dGFjaFNoYWRvd2AgYnV0IG5vdCBgZ2V0Um9vdE5vZGVgLFxuXHQvLyBsZWFkaW5nIHRvIGVycm9ycy4gV2UgbmVlZCB0byBjaGVjayBmb3IgYGdldFJvb3ROb2RlYC5cblx0aWYgKCBkb2N1bWVudEVsZW1lbnQuZ2V0Um9vdE5vZGUgKSB7XG5cdFx0aXNBdHRhY2hlZCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgfHxcblx0XHRcdFx0ZWxlbS5nZXRSb290Tm9kZSggY29tcG9zZWQgKSA9PT0gZWxlbS5vd25lckRvY3VtZW50O1xuXHRcdH07XG5cdH1cbnZhciBpc0hpZGRlbldpdGhpblRyZWUgPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7XG5cblx0XHQvLyBpc0hpZGRlbldpdGhpblRyZWUgbWlnaHQgYmUgY2FsbGVkIGZyb20galF1ZXJ5I2ZpbHRlciBmdW5jdGlvbjtcblx0XHQvLyBpbiB0aGF0IGNhc2UsIGVsZW1lbnQgd2lsbCBiZSBzZWNvbmQgYXJndW1lbnRcblx0XHRlbGVtID0gZWwgfHwgZWxlbTtcblxuXHRcdC8vIElubGluZSBzdHlsZSB0cnVtcHMgYWxsXG5cdFx0cmV0dXJuIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIgfHxcblx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJlxuXG5cdFx0XHQvLyBPdGhlcndpc2UsIGNoZWNrIGNvbXB1dGVkIHN0eWxlXG5cdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDMgLSA0NVxuXHRcdFx0Ly8gRGlzY29ubmVjdGVkIGVsZW1lbnRzIGNhbiBoYXZlIGNvbXB1dGVkIGRpc3BsYXk6IG5vbmUsIHNvIGZpcnN0IGNvbmZpcm0gdGhhdCBlbGVtIGlzXG5cdFx0XHQvLyBpbiB0aGUgZG9jdW1lbnQuXG5cdFx0XHRpc0F0dGFjaGVkKCBlbGVtICkgJiZcblxuXHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSA9PT0gXCJub25lXCI7XG5cdH07XG5cblxuXG5mdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0sIHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkge1xuXHR2YXIgYWRqdXN0ZWQsIHNjYWxlLFxuXHRcdG1heEl0ZXJhdGlvbnMgPSAyMCxcblx0XHRjdXJyZW50VmFsdWUgPSB0d2VlbiA/XG5cdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuLmN1cigpO1xuXHRcdFx0fSA6XG5cdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AsIFwiXCIgKTtcblx0XHRcdH0sXG5cdFx0aW5pdGlhbCA9IGN1cnJlbnRWYWx1ZSgpLFxuXHRcdHVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKSxcblxuXHRcdC8vIFN0YXJ0aW5nIHZhbHVlIGNvbXB1dGF0aW9uIGlzIHJlcXVpcmVkIGZvciBwb3RlbnRpYWwgdW5pdCBtaXNtYXRjaGVzXG5cdFx0aW5pdGlhbEluVW5pdCA9IGVsZW0ubm9kZVR5cGUgJiZcblx0XHRcdCggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdIHx8IHVuaXQgIT09IFwicHhcIiAmJiAraW5pdGlhbCApICYmXG5cdFx0XHRyY3NzTnVtLmV4ZWMoIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AgKSApO1xuXG5cdGlmICggaW5pdGlhbEluVW5pdCAmJiBpbml0aWFsSW5Vbml0WyAzIF0gIT09IHVuaXQgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NTRcblx0XHQvLyBIYWx2ZSB0aGUgaXRlcmF0aW9uIHRhcmdldCB2YWx1ZSB0byBwcmV2ZW50IGludGVyZmVyZW5jZSBmcm9tIENTUyB1cHBlciBib3VuZHMgKGdoLTIxNDQpXG5cdFx0aW5pdGlhbCA9IGluaXRpYWwgLyAyO1xuXG5cdFx0Ly8gVHJ1c3QgdW5pdHMgcmVwb3J0ZWQgYnkgalF1ZXJ5LmNzc1xuXHRcdHVuaXQgPSB1bml0IHx8IGluaXRpYWxJblVuaXRbIDMgXTtcblxuXHRcdC8vIEl0ZXJhdGl2ZWx5IGFwcHJveGltYXRlIGZyb20gYSBub256ZXJvIHN0YXJ0aW5nIHBvaW50XG5cdFx0aW5pdGlhbEluVW5pdCA9ICtpbml0aWFsIHx8IDE7XG5cblx0XHR3aGlsZSAoIG1heEl0ZXJhdGlvbnMtLSApIHtcblxuXHRcdFx0Ly8gRXZhbHVhdGUgYW5kIHVwZGF0ZSBvdXIgYmVzdCBndWVzcyAoZG91YmxpbmcgZ3Vlc3NlcyB0aGF0IHplcm8gb3V0KS5cblx0XHRcdC8vIEZpbmlzaCBpZiB0aGUgc2NhbGUgZXF1YWxzIG9yIGNyb3NzZXMgMSAobWFraW5nIHRoZSBvbGQqbmV3IHByb2R1Y3Qgbm9uLXBvc2l0aXZlKS5cblx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgaW5pdGlhbEluVW5pdCArIHVuaXQgKTtcblx0XHRcdGlmICggKCAxIC0gc2NhbGUgKSAqICggMSAtICggc2NhbGUgPSBjdXJyZW50VmFsdWUoKSAvIGluaXRpYWwgfHwgMC41ICkgKSA8PSAwICkge1xuXHRcdFx0XHRtYXhJdGVyYXRpb25zID0gMDtcblx0XHRcdH1cblx0XHRcdGluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7XG5cblx0XHR9XG5cblx0XHRpbml0aWFsSW5Vbml0ID0gaW5pdGlhbEluVW5pdCAqIDI7XG5cdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvblxuXHRcdHZhbHVlUGFydHMgPSB2YWx1ZVBhcnRzIHx8IFtdO1xuXHR9XG5cblx0aWYgKCB2YWx1ZVBhcnRzICkge1xuXHRcdGluaXRpYWxJblVuaXQgPSAraW5pdGlhbEluVW5pdCB8fCAraW5pdGlhbCB8fCAwO1xuXG5cdFx0Ly8gQXBwbHkgcmVsYXRpdmUgb2Zmc2V0ICgrPS8tPSkgaWYgc3BlY2lmaWVkXG5cdFx0YWRqdXN0ZWQgPSB2YWx1ZVBhcnRzWyAxIF0gP1xuXHRcdFx0aW5pdGlhbEluVW5pdCArICggdmFsdWVQYXJ0c1sgMSBdICsgMSApICogdmFsdWVQYXJ0c1sgMiBdIDpcblx0XHRcdCt2YWx1ZVBhcnRzWyAyIF07XG5cdFx0aWYgKCB0d2VlbiApIHtcblx0XHRcdHR3ZWVuLnVuaXQgPSB1bml0O1xuXHRcdFx0dHdlZW4uc3RhcnQgPSBpbml0aWFsSW5Vbml0O1xuXHRcdFx0dHdlZW4uZW5kID0gYWRqdXN0ZWQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBhZGp1c3RlZDtcbn1cblxuXG52YXIgZGVmYXVsdERpc3BsYXlNYXAgPSB7fTtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKSB7XG5cdHZhciB0ZW1wLFxuXHRcdGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudCxcblx0XHRub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUsXG5cdFx0ZGlzcGxheSA9IGRlZmF1bHREaXNwbGF5TWFwWyBub2RlTmFtZSBdO1xuXG5cdGlmICggZGlzcGxheSApIHtcblx0XHRyZXR1cm4gZGlzcGxheTtcblx0fVxuXG5cdHRlbXAgPSBkb2MuYm9keS5hcHBlbmRDaGlsZCggZG9jLmNyZWF0ZUVsZW1lbnQoIG5vZGVOYW1lICkgKTtcblx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIHRlbXAsIFwiZGlzcGxheVwiICk7XG5cblx0dGVtcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0ZW1wICk7XG5cblx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRkaXNwbGF5ID0gXCJibG9ja1wiO1xuXHR9XG5cdGRlZmF1bHREaXNwbGF5TWFwWyBub2RlTmFtZSBdID0gZGlzcGxheTtcblxuXHRyZXR1cm4gZGlzcGxheTtcbn1cblxuZnVuY3Rpb24gc2hvd0hpZGUoIGVsZW1lbnRzLCBzaG93ICkge1xuXHR2YXIgZGlzcGxheSwgZWxlbSxcblx0XHR2YWx1ZXMgPSBbXSxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoO1xuXG5cdC8vIERldGVybWluZSBuZXcgZGlzcGxheSB2YWx1ZSBmb3IgZWxlbWVudHMgdGhhdCBuZWVkIHRvIGNoYW5nZVxuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTtcblx0XHRpZiAoICFlbGVtLnN0eWxlICkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0ZGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheTtcblx0XHRpZiAoIHNob3cgKSB7XG5cblx0XHRcdC8vIFNpbmNlIHdlIGZvcmNlIHZpc2liaWxpdHkgdXBvbiBjYXNjYWRlLWhpZGRlbiBlbGVtZW50cywgYW4gaW1tZWRpYXRlIChhbmQgc2xvdylcblx0XHRcdC8vIGNoZWNrIGlzIHJlcXVpcmVkIGluIHRoaXMgZmlyc3QgbG9vcCB1bmxlc3Mgd2UgaGF2ZSBhIG5vbmVtcHR5IGRpc3BsYXkgdmFsdWUgKGVpdGhlclxuXHRcdFx0Ly8gaW5saW5lIG9yIGFib3V0LXRvLWJlLXJlc3RvcmVkKVxuXHRcdFx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImRpc3BsYXlcIiApIHx8IG51bGw7XG5cdFx0XHRcdGlmICggIXZhbHVlc1sgaW5kZXggXSApIHtcblx0XHRcdFx0XHRlbGVtLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJiBpc0hpZGRlbldpdGhpblRyZWUoIGVsZW0gKSApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCBkaXNwbGF5ICE9PSBcIm5vbmVcIiApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gXCJub25lXCI7XG5cblx0XHRcdFx0Ly8gUmVtZW1iZXIgd2hhdCB3ZSdyZSBvdmVyd3JpdGluZ1xuXHRcdFx0XHRkYXRhUHJpdi5zZXQoIGVsZW0sIFwiZGlzcGxheVwiLCBkaXNwbGF5ICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gU2V0IHRoZSBkaXNwbGF5IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wIHRvIGF2b2lkIGNvbnN0YW50IHJlZmxvd1xuXHRmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGlmICggdmFsdWVzWyBpbmRleCBdICE9IG51bGwgKSB7XG5cdFx0XHRlbGVtZW50c1sgaW5kZXggXS5zdHlsZS5kaXNwbGF5ID0gdmFsdWVzWyBpbmRleCBdO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50cztcbn1cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMsIHRydWUgKTtcblx0fSxcblx0aGlkZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNob3dIaWRlKCB0aGlzICk7XG5cdH0sXG5cdHRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkge1xuXHRcdGlmICggdHlwZW9mIHN0YXRlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdHJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGlzSGlkZGVuV2l0aGluVHJlZSggdGhpcyApICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5zaG93KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG59ICk7XG52YXIgcmNoZWNrYWJsZVR5cGUgPSAoIC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pICk7XG5cbnZhciBydGFnTmFtZSA9ICggLzwoW2Etel1bXlxcL1xcMD5cXHgyMFxcdFxcclxcblxcZl0qKS9pICk7XG5cbnZhciByc2NyaXB0VHlwZSA9ICggL14kfF5tb2R1bGUkfFxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSApO1xuXG5cblxuKCBmdW5jdGlvbigpIHtcblx0dmFyIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRcdGRpdiA9IGZyYWdtZW50LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKSxcblx0XHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHlcblx0Ly8gQ2hlY2sgc3RhdGUgbG9zdCBpZiB0aGUgbmFtZSBpcyBzZXQgKCMxMTIxNylcblx0Ly8gU3VwcG9ydDogV2luZG93cyBXZWIgQXBwcyAoV1dBKVxuXHQvLyBgbmFtZWAgYW5kIGB0eXBlYCBtdXN0IHVzZSAuc2V0QXR0cmlidXRlIGZvciBXV0EgKCMxNDkwMSlcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJyYWRpb1wiICk7XG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJjaGVja2VkXCIsIFwiY2hlY2tlZFwiICk7XG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwidFwiICk7XG5cblx0ZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgb25seVxuXHQvLyBPbGRlciBXZWJLaXQgZG9lc24ndCBjbG9uZSBjaGVja2VkIHN0YXRlIGNvcnJlY3RseSBpbiBmcmFnbWVudHNcblx0c3VwcG9ydC5jaGVja0Nsb25lID0gZGl2LmNsb25lTm9kZSggdHJ1ZSApLmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5jaGVja2VkO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHQvLyBNYWtlIHN1cmUgdGV4dGFyZWEgKGFuZCBjaGVja2JveCkgZGVmYXVsdFZhbHVlIGlzIHByb3Blcmx5IGNsb25lZFxuXHRkaXYuaW5uZXJIVE1MID0gXCI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+XCI7XG5cdHN1cHBvcnQubm9DbG9uZUNoZWNrZWQgPSAhIWRpdi5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdC8vIElFIDw9OSByZXBsYWNlcyA8b3B0aW9uPiB0YWdzIHdpdGggdGhlaXIgY29udGVudHMgd2hlbiBpbnNlcnRlZCBvdXRzaWRlIG9mXG5cdC8vIHRoZSBzZWxlY3QgZWxlbWVudC5cblx0ZGl2LmlubmVySFRNTCA9IFwiPG9wdGlvbj48L29wdGlvbj5cIjtcblx0c3VwcG9ydC5vcHRpb24gPSAhIWRpdi5sYXN0Q2hpbGQ7XG59ICkoKTtcblxuXG4vLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKVxudmFyIHdyYXBNYXAgPSB7XG5cblx0Ly8gWEhUTUwgcGFyc2VycyBkbyBub3QgbWFnaWNhbGx5IGluc2VydCBlbGVtZW50cyBpbiB0aGVcblx0Ly8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlblxuXHQvLyB0aGlzIGJ5IG9taXR0aW5nIDx0Ym9keT4gb3Igb3RoZXIgcmVxdWlyZWQgZWxlbWVudHMuXG5cdHRoZWFkOiBbIDEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCIgXSxcblx0Y29sOiBbIDIsIFwiPHRhYmxlPjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCIgXSxcblx0dHI6IFsgMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXHR0ZDogWyAzLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiIF0sXG5cblx0X2RlZmF1bHQ6IFsgMCwgXCJcIiwgXCJcIiBdXG59O1xuXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xud3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG5cbi8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5pZiAoICFzdXBwb3J0Lm9wdGlvbiApIHtcblx0d3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uID0gWyAxLCBcIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz5cIiwgXCI8L3NlbGVjdD5cIiBdO1xufVxuXG5cbmZ1bmN0aW9uIGdldEFsbCggY29udGV4dCwgdGFnICkge1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0Ly8gVXNlIHR5cGVvZiB0byBhdm9pZCB6ZXJvLWFyZ3VtZW50IG1ldGhvZCBpbnZvY2F0aW9uIG9uIGhvc3Qgb2JqZWN0cyAoIzE1MTUxKVxuXHR2YXIgcmV0O1xuXG5cdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0cmV0ID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnIHx8IFwiKlwiICk7XG5cblx0fSBlbHNlIGlmICggdHlwZW9mIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRyZXQgPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyB8fCBcIipcIiApO1xuXG5cdH0gZWxzZSB7XG5cdFx0cmV0ID0gW107XG5cdH1cblxuXHRpZiAoIHRhZyA9PT0gdW5kZWZpbmVkIHx8IHRhZyAmJiBub2RlTmFtZSggY29udGV4dCwgdGFnICkgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5tZXJnZSggWyBjb250ZXh0IF0sIHJldCApO1xuXHR9XG5cblx0cmV0dXJuIHJldDtcbn1cblxuXG4vLyBNYXJrIHNjcmlwdHMgYXMgaGF2aW5nIGFscmVhZHkgYmVlbiBldmFsdWF0ZWRcbmZ1bmN0aW9uIHNldEdsb2JhbEV2YWwoIGVsZW1zLCByZWZFbGVtZW50cyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdGRhdGFQcml2LnNldChcblx0XHRcdGVsZW1zWyBpIF0sXG5cdFx0XHRcImdsb2JhbEV2YWxcIixcblx0XHRcdCFyZWZFbGVtZW50cyB8fCBkYXRhUHJpdi5nZXQoIHJlZkVsZW1lbnRzWyBpIF0sIFwiZ2xvYmFsRXZhbFwiIClcblx0XHQpO1xuXHR9XG59XG5cblxudmFyIHJodG1sID0gLzx8JiM/XFx3KzsvO1xuXG5mdW5jdGlvbiBidWlsZEZyYWdtZW50KCBlbGVtcywgY29udGV4dCwgc2NyaXB0cywgc2VsZWN0aW9uLCBpZ25vcmVkICkge1xuXHR2YXIgZWxlbSwgdG1wLCB0YWcsIHdyYXAsIGF0dGFjaGVkLCBqLFxuXHRcdGZyYWdtZW50ID0gY29udGV4dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG5cdFx0bm9kZXMgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsID0gZWxlbXMubGVuZ3RoO1xuXG5cdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRlbGVtID0gZWxlbXNbIGkgXTtcblxuXHRcdGlmICggZWxlbSB8fCBlbGVtID09PSAwICkge1xuXG5cdFx0XHQvLyBBZGQgbm9kZXMgZGlyZWN0bHlcblx0XHRcdGlmICggdG9UeXBlKCBlbGVtICkgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBub2RlcywgZWxlbS5ub2RlVHlwZSA/IFsgZWxlbSBdIDogZWxlbSApO1xuXG5cdFx0XHQvLyBDb252ZXJ0IG5vbi1odG1sIGludG8gYSB0ZXh0IG5vZGVcblx0XHRcdH0gZWxzZSBpZiAoICFyaHRtbC50ZXN0KCBlbGVtICkgKSB7XG5cdFx0XHRcdG5vZGVzLnB1c2goIGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIGVsZW0gKSApO1xuXG5cdFx0XHQvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXNcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRtcCA9IHRtcCB8fCBmcmFnbWVudC5hcHBlbmRDaGlsZCggY29udGV4dC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKTtcblxuXHRcdFx0XHQvLyBEZXNlcmlhbGl6ZSBhIHN0YW5kYXJkIHJlcHJlc2VudGF0aW9uXG5cdFx0XHRcdHRhZyA9ICggcnRhZ05hbWUuZXhlYyggZWxlbSApIHx8IFsgXCJcIiwgXCJcIiBdIClbIDEgXS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHR3cmFwID0gd3JhcE1hcFsgdGFnIF0gfHwgd3JhcE1hcC5fZGVmYXVsdDtcblx0XHRcdFx0dG1wLmlubmVySFRNTCA9IHdyYXBbIDEgXSArIGpRdWVyeS5odG1sUHJlZmlsdGVyKCBlbGVtICkgKyB3cmFwWyAyIF07XG5cblx0XHRcdFx0Ly8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50XG5cdFx0XHRcdGogPSB3cmFwWyAwIF07XG5cdFx0XHRcdHdoaWxlICggai0tICkge1xuXHRcdFx0XHRcdHRtcCA9IHRtcC5sYXN0Q2hpbGQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCB0bXAuY2hpbGROb2RlcyApO1xuXG5cdFx0XHRcdC8vIFJlbWVtYmVyIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyXG5cdFx0XHRcdHRtcCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7XG5cblx0XHRcdFx0Ly8gRW5zdXJlIHRoZSBjcmVhdGVkIG5vZGVzIGFyZSBvcnBoYW5lZCAoIzEyMzkyKVxuXHRcdFx0XHR0bXAudGV4dENvbnRlbnQgPSBcIlwiO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFJlbW92ZSB3cmFwcGVyIGZyb20gZnJhZ21lbnRcblx0ZnJhZ21lbnQudGV4dENvbnRlbnQgPSBcIlwiO1xuXG5cdGkgPSAwO1xuXHR3aGlsZSAoICggZWxlbSA9IG5vZGVzWyBpKysgXSApICkge1xuXG5cdFx0Ly8gU2tpcCBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBjb250ZXh0IGNvbGxlY3Rpb24gKHRyYWMtNDA4Nylcblx0XHRpZiAoIHNlbGVjdGlvbiAmJiBqUXVlcnkuaW5BcnJheSggZWxlbSwgc2VsZWN0aW9uICkgPiAtMSApIHtcblx0XHRcdGlmICggaWdub3JlZCApIHtcblx0XHRcdFx0aWdub3JlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRhdHRhY2hlZCA9IGlzQXR0YWNoZWQoIGVsZW0gKTtcblxuXHRcdC8vIEFwcGVuZCB0byBmcmFnbWVudFxuXHRcdHRtcCA9IGdldEFsbCggZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGVsZW0gKSwgXCJzY3JpcHRcIiApO1xuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGlmICggYXR0YWNoZWQgKSB7XG5cdFx0XHRzZXRHbG9iYWxFdmFsKCB0bXAgKTtcblx0XHR9XG5cblx0XHQvLyBDYXB0dXJlIGV4ZWN1dGFibGVzXG5cdFx0aWYgKCBzY3JpcHRzICkge1xuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHtcblx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBlbGVtLnR5cGUgfHwgXCJcIiApICkge1xuXHRcdFx0XHRcdHNjcmlwdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZyYWdtZW50O1xufVxuXG5cbnZhciBydHlwZW5hbWVzcGFjZSA9IC9eKFteLl0qKSg/OlxcLiguKyl8KS87XG5cbmZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcblx0cmV0dXJuIGZhbHNlO1xufVxuXG4vLyBTdXBwb3J0OiBJRSA8PTkgLSAxMStcbi8vIGZvY3VzKCkgYW5kIGJsdXIoKSBhcmUgYXN5bmNocm9ub3VzLCBleGNlcHQgd2hlbiB0aGV5IGFyZSBuby1vcC5cbi8vIFNvIGV4cGVjdCBmb2N1cyB0byBiZSBzeW5jaHJvbm91cyB3aGVuIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgYWN0aXZlLFxuLy8gYW5kIGJsdXIgdG8gYmUgc3luY2hyb25vdXMgd2hlbiB0aGUgZWxlbWVudCBpcyBub3QgYWxyZWFkeSBhY3RpdmUuXG4vLyAoZm9jdXMgYW5kIGJsdXIgYXJlIGFsd2F5cyBzeW5jaHJvbm91cyBpbiBvdGhlciBzdXBwb3J0ZWQgYnJvd3NlcnMsXG4vLyB0aGlzIGp1c3QgZGVmaW5lcyB3aGVuIHdlIGNhbiBjb3VudCBvbiBpdCkuXG5mdW5jdGlvbiBleHBlY3RTeW5jKCBlbGVtLCB0eXBlICkge1xuXHRyZXR1cm4gKCBlbGVtID09PSBzYWZlQWN0aXZlRWxlbWVudCgpICkgPT09ICggdHlwZSA9PT0gXCJmb2N1c1wiICk7XG59XG5cbi8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG4vLyBBY2Nlc3NpbmcgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBjYW4gdGhyb3cgdW5leHBlY3RlZGx5XG4vLyBodHRwczovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTMzOTNcbmZ1bmN0aW9uIHNhZmVBY3RpdmVFbGVtZW50KCkge1xuXHR0cnkge1xuXHRcdHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXHR9IGNhdGNoICggZXJyICkgeyB9XG59XG5cbmZ1bmN0aW9uIG9uKCBlbGVtLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCBvbmUgKSB7XG5cdHZhciBvcmlnRm4sIHR5cGU7XG5cblx0Ly8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzXG5cdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0Ly8gKCB0eXBlcy1PYmplY3QsIHNlbGVjdG9yLCBkYXRhIClcblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKVxuXHRcdFx0ZGF0YSA9IGRhdGEgfHwgc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcblx0XHRcdG9uKCBlbGVtLCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7XG5cdFx0fVxuXHRcdHJldHVybiBlbGVtO1xuXHR9XG5cblx0aWYgKCBkYXRhID09IG51bGwgJiYgZm4gPT0gbnVsbCApIHtcblxuXHRcdC8vICggdHlwZXMsIGZuIClcblx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdGRhdGEgPSBzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmICggZm4gPT0gbnVsbCApIHtcblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcywgc2VsZWN0b3IsIGZuIClcblx0XHRcdGZuID0gZGF0YTtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gKCB0eXBlcywgZGF0YSwgZm4gKVxuXHRcdFx0Zm4gPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdGZuID0gcmV0dXJuRmFsc2U7XG5cdH0gZWxzZSBpZiAoICFmbiApIHtcblx0XHRyZXR1cm4gZWxlbTtcblx0fVxuXG5cdGlmICggb25lID09PSAxICkge1xuXHRcdG9yaWdGbiA9IGZuO1xuXHRcdGZuID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuXG5cdFx0XHQvLyBDYW4gdXNlIGFuIGVtcHR5IHNldCwgc2luY2UgZXZlbnQgY29udGFpbnMgdGhlIGluZm9cblx0XHRcdGpRdWVyeSgpLm9mZiggZXZlbnQgKTtcblx0XHRcdHJldHVybiBvcmlnRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH07XG5cblx0XHQvLyBVc2Ugc2FtZSBndWlkIHNvIGNhbGxlciBjYW4gcmVtb3ZlIHVzaW5nIG9yaWdGblxuXHRcdGZuLmd1aWQgPSBvcmlnRm4uZ3VpZCB8fCAoIG9yaWdGbi5ndWlkID0galF1ZXJ5Lmd1aWQrKyApO1xuXHR9XG5cdHJldHVybiBlbGVtLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdGpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTtcblx0fSApO1xufVxuXG4vKlxuICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLlxuICogUHJvcHMgdG8gRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5IGZvciBtYW55IG9mIHRoZSBpZGVhcy5cbiAqL1xualF1ZXJ5LmV2ZW50ID0ge1xuXG5cdGdsb2JhbDoge30sXG5cblx0YWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkge1xuXG5cdFx0dmFyIGhhbmRsZU9iakluLCBldmVudEhhbmRsZSwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFQcml2LmdldCggZWxlbSApO1xuXG5cdFx0Ly8gT25seSBhdHRhY2ggZXZlbnRzIHRvIG9iamVjdHMgdGhhdCBhY2NlcHQgZGF0YVxuXHRcdGlmICggIWFjY2VwdERhdGEoIGVsZW0gKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYW4gb2JqZWN0IG9mIGN1c3RvbSBkYXRhIGluIGxpZXUgb2YgdGhlIGhhbmRsZXJcblx0XHRpZiAoIGhhbmRsZXIuaGFuZGxlciApIHtcblx0XHRcdGhhbmRsZU9iakluID0gaGFuZGxlcjtcblx0XHRcdGhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyO1xuXHRcdFx0c2VsZWN0b3IgPSBoYW5kbGVPYmpJbi5zZWxlY3Rvcjtcblx0XHR9XG5cblx0XHQvLyBFbnN1cmUgdGhhdCBpbnZhbGlkIHNlbGVjdG9ycyB0aHJvdyBleGNlcHRpb25zIGF0IGF0dGFjaCB0aW1lXG5cdFx0Ly8gRXZhbHVhdGUgYWdhaW5zdCBkb2N1bWVudEVsZW1lbnQgaW4gY2FzZSBlbGVtIGlzIGEgbm9uLWVsZW1lbnQgbm9kZSAoZS5nLiwgZG9jdW1lbnQpXG5cdFx0aWYgKCBzZWxlY3RvciApIHtcblx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZG9jdW1lbnRFbGVtZW50LCBzZWxlY3RvciApO1xuXHRcdH1cblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBoYW5kbGVyIGhhcyBhIHVuaXF1ZSBJRCwgdXNlZCB0byBmaW5kL3JlbW92ZSBpdCBsYXRlclxuXHRcdGlmICggIWhhbmRsZXIuZ3VpZCApIHtcblx0XHRcdGhhbmRsZXIuZ3VpZCA9IGpRdWVyeS5ndWlkKys7XG5cdFx0fVxuXG5cdFx0Ly8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBmaXJzdFxuXHRcdGlmICggISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7XG5cdFx0XHRldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgPSBPYmplY3QuY3JlYXRlKCBudWxsICk7XG5cdFx0fVxuXHRcdGlmICggISggZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgKSApIHtcblx0XHRcdGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7XG5cblx0XHRcdFx0Ly8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmRcblx0XHRcdFx0Ly8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZFxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgP1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2Vcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx5IGhhbmRsZXJzXG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlXG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cblx0XHRcdC8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVyc1xuXHRcdFx0aGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCgge1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRvcmlnVHlwZTogb3JpZ1R5cGUsXG5cdFx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRcdGhhbmRsZXI6IGhhbmRsZXIsXG5cdFx0XHRcdGd1aWQ6IGhhbmRsZXIuZ3VpZCxcblx0XHRcdFx0c2VsZWN0b3I6IHNlbGVjdG9yLFxuXHRcdFx0XHRuZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLFxuXHRcdFx0XHRuYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKVxuXHRcdFx0fSwgaGFuZGxlT2JqSW4gKTtcblxuXHRcdFx0Ly8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZSBpZiB3ZSdyZSB0aGUgZmlyc3Rcblx0XHRcdGlmICggISggaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSApICkge1xuXHRcdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdID0gW107XG5cdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwO1xuXG5cdFx0XHRcdC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZVxuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnNldHVwIHx8XG5cdFx0XHRcdFx0c3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBldmVudEhhbmRsZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNwZWNpYWwuYWRkICkge1xuXHRcdFx0XHRzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblxuXHRcdFx0XHRpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkge1xuXHRcdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnRcblx0XHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uXG5cdFx0XHRqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlO1xuXHRcdH1cblxuXHR9LFxuXG5cdC8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZFR5cGVzICkge1xuXG5cdFx0dmFyIGosIG9yaWdDb3VudCwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKSAmJiBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdGlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE9uY2UgZm9yIGVhY2ggdHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWRcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50XG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdO1xuXHRcdFx0dG1wID0gdG1wWyAyIF0gJiZcblx0XHRcdFx0bmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbiggXCJcXFxcLig/Oi4qXFxcXC58KVwiICkgKyBcIihcXFxcLnwkKVwiICk7XG5cblx0XHRcdC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHNcblx0XHRcdG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTtcblxuXHRcdFx0XHRpZiAoICggbWFwcGVkVHlwZXMgfHwgb3JpZ1R5cGUgPT09IGhhbmRsZU9iai5vcmlnVHlwZSApICYmXG5cdFx0XHRcdFx0KCAhaGFuZGxlciB8fCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgJiZcblx0XHRcdFx0XHQoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmXG5cdFx0XHRcdFx0KCAhc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciB8fFxuXHRcdFx0XHRcdFx0c2VsZWN0b3IgPT09IFwiKipcIiAmJiBoYW5kbGVPYmouc2VsZWN0b3IgKSApIHtcblx0XHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGosIDEgKTtcblxuXHRcdFx0XHRcdGlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudC0tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIHNwZWNpYWwucmVtb3ZlICkge1xuXHRcdFx0XHRcdFx0c3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3Rcblx0XHRcdC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKVxuXHRcdFx0aWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fFxuXHRcdFx0XHRcdHNwZWNpYWwudGVhcmRvd24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRlbGV0ZSBldmVudHNbIHR5cGUgXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgZGF0YSBhbmQgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZFxuXHRcdGlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkge1xuXHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBcImhhbmRsZSBldmVudHNcIiApO1xuXHRcdH1cblx0fSxcblxuXHRkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkge1xuXG5cdFx0dmFyIGksIGosIHJldCwgbWF0Y2hlZCwgaGFuZGxlT2JqLCBoYW5kbGVyUXVldWUsXG5cdFx0XHRhcmdzID0gbmV3IEFycmF5KCBhcmd1bWVudHMubGVuZ3RoICksXG5cblx0XHRcdC8vIE1ha2UgYSB3cml0YWJsZSBqUXVlcnkuRXZlbnQgZnJvbSB0aGUgbmF0aXZlIGV2ZW50IG9iamVjdFxuXHRcdFx0ZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBuYXRpdmVFdmVudCApLFxuXG5cdFx0XHRoYW5kbGVycyA9IChcblx0XHRcdFx0ZGF0YVByaXYuZ2V0KCB0aGlzLCBcImV2ZW50c1wiICkgfHwgT2JqZWN0LmNyZWF0ZSggbnVsbCApXG5cdFx0XHQpWyBldmVudC50eXBlIF0gfHwgW10sXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGV2ZW50LnR5cGUgXSB8fCB7fTtcblxuXHRcdC8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50XG5cdFx0YXJnc1sgMCBdID0gZXZlbnQ7XG5cblx0XHRmb3IgKCBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdGFyZ3NbIGkgXSA9IGFyZ3VtZW50c1sgaSBdO1xuXHRcdH1cblxuXHRcdGV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpcztcblxuXHRcdC8vIENhbGwgdGhlIHByZURpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZSwgYW5kIGxldCBpdCBiYWlsIGlmIGRlc2lyZWRcblx0XHRpZiAoIHNwZWNpYWwucHJlRGlzcGF0Y2ggJiYgc3BlY2lhbC5wcmVEaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgaGFuZGxlcnNcblx0XHRoYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7XG5cblx0XHQvLyBSdW4gZGVsZWdhdGVzIGZpcnN0OyB0aGV5IG1heSB3YW50IHRvIHN0b3AgcHJvcGFnYXRpb24gYmVuZWF0aCB1c1xuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKCBtYXRjaGVkID0gaGFuZGxlclF1ZXVlWyBpKysgXSApICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0ZXZlbnQuY3VycmVudFRhcmdldCA9IG1hdGNoZWQuZWxlbTtcblxuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggaGFuZGxlT2JqID0gbWF0Y2hlZC5oYW5kbGVyc1sgaisrIF0gKSAmJlxuXHRcdFx0XHQhZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGUgZXZlbnQgaXMgbmFtZXNwYWNlZCwgdGhlbiBlYWNoIGhhbmRsZXIgaXMgb25seSBpbnZva2VkIGlmIGl0IGlzXG5cdFx0XHRcdC8vIHNwZWNpYWxseSB1bml2ZXJzYWwgb3IgaXRzIG5hbWVzcGFjZXMgYXJlIGEgc3VwZXJzZXQgb2YgdGhlIGV2ZW50J3MuXG5cdFx0XHRcdGlmICggIWV2ZW50LnJuYW1lc3BhY2UgfHwgaGFuZGxlT2JqLm5hbWVzcGFjZSA9PT0gZmFsc2UgfHxcblx0XHRcdFx0XHRldmVudC5ybmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHtcblxuXHRcdFx0XHRcdGV2ZW50LmhhbmRsZU9iaiA9IGhhbmRsZU9iajtcblx0XHRcdFx0XHRldmVudC5kYXRhID0gaGFuZGxlT2JqLmRhdGE7XG5cblx0XHRcdFx0XHRyZXQgPSAoICggalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGhhbmRsZU9iai5vcmlnVHlwZSBdIHx8IHt9ICkuaGFuZGxlIHx8XG5cdFx0XHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlciApLmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZXZlbnQucmVzdWx0ID0gcmV0ICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsIHRoZSBwb3N0RGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlXG5cdFx0aWYgKCBzcGVjaWFsLnBvc3REaXNwYXRjaCApIHtcblx0XHRcdHNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHRoYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHtcblx0XHR2YXIgaSwgaGFuZGxlT2JqLCBzZWwsIG1hdGNoZWRIYW5kbGVycywgbWF0Y2hlZFNlbGVjdG9ycyxcblx0XHRcdGhhbmRsZXJRdWV1ZSA9IFtdLFxuXHRcdFx0ZGVsZWdhdGVDb3VudCA9IGhhbmRsZXJzLmRlbGVnYXRlQ291bnQsXG5cdFx0XHRjdXIgPSBldmVudC50YXJnZXQ7XG5cblx0XHQvLyBGaW5kIGRlbGVnYXRlIGhhbmRsZXJzXG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50ICYmXG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OVxuXHRcdFx0Ly8gQmxhY2staG9sZSBTVkcgPHVzZT4gaW5zdGFuY2UgdHJlZXMgKHRyYWMtMTMxODApXG5cdFx0XHRjdXIubm9kZVR5cGUgJiZcblxuXHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA8PTQyXG5cdFx0XHQvLyBTdXBwcmVzcyBzcGVjLXZpb2xhdGluZyBjbGlja3MgaW5kaWNhdGluZyBhIG5vbi1wcmltYXJ5IHBvaW50ZXIgYnV0dG9uICh0cmFjLTM4NjEpXG5cdFx0XHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudC10eXBlLWNsaWNrXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSBvbmx5XG5cdFx0XHQvLyAuLi5idXQgbm90IGFycm93IGtleSBcImNsaWNrc1wiIG9mIHJhZGlvIGlucHV0cywgd2hpY2ggY2FuIGhhdmUgYGJ1dHRvbmAgLTEgKGdoLTIzNDMpXG5cdFx0XHQhKCBldmVudC50eXBlID09PSBcImNsaWNrXCIgJiYgZXZlbnQuYnV0dG9uID49IDEgKSApIHtcblxuXHRcdFx0Zm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7XG5cblx0XHRcdFx0Ly8gRG9uJ3QgY2hlY2sgbm9uLWVsZW1lbnRzICgjMTMyMDgpXG5cdFx0XHRcdC8vIERvbid0IHByb2Nlc3MgY2xpY2tzIG9uIGRpc2FibGVkIGVsZW1lbnRzICgjNjkxMSwgIzgxNjUsICMxMTM4MiwgIzExNzY0KVxuXHRcdFx0XHRpZiAoIGN1ci5ub2RlVHlwZSA9PT0gMSAmJiAhKCBldmVudC50eXBlID09PSBcImNsaWNrXCIgJiYgY3VyLmRpc2FibGVkID09PSB0cnVlICkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlZEhhbmRsZXJzID0gW107XG5cdFx0XHRcdFx0bWF0Y2hlZFNlbGVjdG9ycyA9IHt9O1xuXHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGkgXTtcblxuXHRcdFx0XHRcdFx0Ly8gRG9uJ3QgY29uZmxpY3Qgd2l0aCBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKCMxMzIwMylcblx0XHRcdFx0XHRcdHNlbCA9IGhhbmRsZU9iai5zZWxlY3RvciArIFwiIFwiO1xuXG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRcdG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdID0gaGFuZGxlT2JqLm5lZWRzQ29udGV4dCA/XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5KCBzZWwsIHRoaXMgKS5pbmRleCggY3VyICkgPiAtMSA6XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmZpbmQoIHNlbCwgdGhpcywgbnVsbCwgWyBjdXIgXSApLmxlbmd0aDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gKSB7XG5cdFx0XHRcdFx0XHRcdG1hdGNoZWRIYW5kbGVycy5wdXNoKCBoYW5kbGVPYmogKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVkSGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogY3VyLCBoYW5kbGVyczogbWF0Y2hlZEhhbmRsZXJzIH0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgdGhlIHJlbWFpbmluZyAoZGlyZWN0bHktYm91bmQpIGhhbmRsZXJzXG5cdFx0Y3VyID0gdGhpcztcblx0XHRpZiAoIGRlbGVnYXRlQ291bnQgPCBoYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRoYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaGFuZGxlclF1ZXVlO1xuXHR9LFxuXG5cdGFkZFByb3A6IGZ1bmN0aW9uKCBuYW1lLCBob29rICkge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggalF1ZXJ5LkV2ZW50LnByb3RvdHlwZSwgbmFtZSwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblxuXHRcdFx0Z2V0OiBpc0Z1bmN0aW9uKCBob29rICkgP1xuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRcdHJldHVybiBob29rKCB0aGlzLm9yaWdpbmFsRXZlbnQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gOlxuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbIG5hbWUgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cblx0XHRcdHNldDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsIG5hbWUsIHtcblx0XHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHR3cml0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRmaXg6IGZ1bmN0aW9uKCBvcmlnaW5hbEV2ZW50ICkge1xuXHRcdHJldHVybiBvcmlnaW5hbEV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdG9yaWdpbmFsRXZlbnQgOlxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApO1xuXHR9LFxuXG5cdHNwZWNpYWw6IHtcblx0XHRsb2FkOiB7XG5cblx0XHRcdC8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWRcblx0XHRcdG5vQnViYmxlOiB0cnVlXG5cdFx0fSxcblx0XHRjbGljazoge1xuXG5cdFx0XHQvLyBVdGlsaXplIG5hdGl2ZSBldmVudCB0byBlbnN1cmUgY29ycmVjdCBzdGF0ZSBmb3IgY2hlY2thYmxlIGlucHV0c1xuXHRcdFx0c2V0dXA6IGZ1bmN0aW9uKCBkYXRhICkge1xuXG5cdFx0XHRcdC8vIEZvciBtdXR1YWwgY29tcHJlc3NpYmlsaXR5IHdpdGggX2RlZmF1bHQsIHJlcGxhY2UgYHRoaXNgIGFjY2VzcyB3aXRoIGEgbG9jYWwgdmFyLlxuXHRcdFx0XHQvLyBgfHwgZGF0YWAgaXMgZGVhZCBjb2RlIG1lYW50IG9ubHkgdG8gcHJlc2VydmUgdGhlIHZhcmlhYmxlIHRocm91Z2ggbWluaWZpY2F0aW9uLlxuXHRcdFx0XHR2YXIgZWwgPSB0aGlzIHx8IGRhdGE7XG5cblx0XHRcdFx0Ly8gQ2xhaW0gdGhlIGZpcnN0IGhhbmRsZXJcblx0XHRcdFx0aWYgKCByY2hlY2thYmxlVHlwZS50ZXN0KCBlbC50eXBlICkgJiZcblx0XHRcdFx0XHRlbC5jbGljayAmJiBub2RlTmFtZSggZWwsIFwiaW5wdXRcIiApICkge1xuXG5cdFx0XHRcdFx0Ly8gZGF0YVByaXYuc2V0KCBlbCwgXCJjbGlja1wiLCAuLi4gKVxuXHRcdFx0XHRcdGxldmVyYWdlTmF0aXZlKCBlbCwgXCJjbGlja1wiLCByZXR1cm5UcnVlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZXR1cm4gZmFsc2UgdG8gYWxsb3cgbm9ybWFsIHByb2Nlc3NpbmcgaW4gdGhlIGNhbGxlclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9LFxuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oIGRhdGEgKSB7XG5cblx0XHRcdFx0Ly8gRm9yIG11dHVhbCBjb21wcmVzc2liaWxpdHkgd2l0aCBfZGVmYXVsdCwgcmVwbGFjZSBgdGhpc2AgYWNjZXNzIHdpdGggYSBsb2NhbCB2YXIuXG5cdFx0XHRcdC8vIGB8fCBkYXRhYCBpcyBkZWFkIGNvZGUgbWVhbnQgb25seSB0byBwcmVzZXJ2ZSB0aGUgdmFyaWFibGUgdGhyb3VnaCBtaW5pZmljYXRpb24uXG5cdFx0XHRcdHZhciBlbCA9IHRoaXMgfHwgZGF0YTtcblxuXHRcdFx0XHQvLyBGb3JjZSBzZXR1cCBiZWZvcmUgdHJpZ2dlcmluZyBhIGNsaWNrXG5cdFx0XHRcdGlmICggcmNoZWNrYWJsZVR5cGUudGVzdCggZWwudHlwZSApICYmXG5cdFx0XHRcdFx0ZWwuY2xpY2sgJiYgbm9kZU5hbWUoIGVsLCBcImlucHV0XCIgKSApIHtcblxuXHRcdFx0XHRcdGxldmVyYWdlTmF0aXZlKCBlbCwgXCJjbGlja1wiICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZXR1cm4gbm9uLWZhbHNlIHRvIGFsbG93IG5vcm1hbCBldmVudC1wYXRoIHByb3BhZ2F0aW9uXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIHN1cHByZXNzIG5hdGl2ZSAuY2xpY2soKSBvbiBsaW5rc1xuXHRcdFx0Ly8gQWxzbyBwcmV2ZW50IGl0IGlmIHdlJ3JlIGN1cnJlbnRseSBpbnNpZGUgYSBsZXZlcmFnZWQgbmF0aXZlLWV2ZW50IHN0YWNrXG5cdFx0XHRfZGVmYXVsdDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuXHRcdFx0XHRyZXR1cm4gcmNoZWNrYWJsZVR5cGUudGVzdCggdGFyZ2V0LnR5cGUgKSAmJlxuXHRcdFx0XHRcdHRhcmdldC5jbGljayAmJiBub2RlTmFtZSggdGFyZ2V0LCBcImlucHV0XCIgKSAmJlxuXHRcdFx0XHRcdGRhdGFQcml2LmdldCggdGFyZ2V0LCBcImNsaWNrXCIgKSB8fFxuXHRcdFx0XHRcdG5vZGVOYW1lKCB0YXJnZXQsIFwiYVwiICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGJlZm9yZXVubG9hZDoge1xuXHRcdFx0cG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCAyMCtcblx0XHRcdFx0Ly8gRmlyZWZveCBkb2Vzbid0IGFsZXJ0IGlmIHRoZSByZXR1cm5WYWx1ZSBmaWVsZCBpcyBub3Qgc2V0LlxuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGV2ZW50LnJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuLy8gRW5zdXJlIHRoZSBwcmVzZW5jZSBvZiBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGhhbmRsZXMgbWFudWFsbHktdHJpZ2dlcmVkXG4vLyBzeW50aGV0aWMgZXZlbnRzIGJ5IGludGVycnVwdGluZyBwcm9ncmVzcyB1bnRpbCByZWludm9rZWQgaW4gcmVzcG9uc2UgdG9cbi8vICpuYXRpdmUqIGV2ZW50cyB0aGF0IGl0IGZpcmVzIGRpcmVjdGx5LCBlbnN1cmluZyB0aGF0IHN0YXRlIGNoYW5nZXMgaGF2ZVxuLy8gYWxyZWFkeSBvY2N1cnJlZCBiZWZvcmUgb3RoZXIgbGlzdGVuZXJzIGFyZSBpbnZva2VkLlxuZnVuY3Rpb24gbGV2ZXJhZ2VOYXRpdmUoIGVsLCB0eXBlLCBleHBlY3RTeW5jICkge1xuXG5cdC8vIE1pc3NpbmcgZXhwZWN0U3luYyBpbmRpY2F0ZXMgYSB0cmlnZ2VyIGNhbGwsIHdoaWNoIG11c3QgZm9yY2Ugc2V0dXAgdGhyb3VnaCBqUXVlcnkuZXZlbnQuYWRkXG5cdGlmICggIWV4cGVjdFN5bmMgKSB7XG5cdFx0aWYgKCBkYXRhUHJpdi5nZXQoIGVsLCB0eXBlICkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIGVsLCB0eXBlLCByZXR1cm5UcnVlICk7XG5cdFx0fVxuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIFJlZ2lzdGVyIHRoZSBjb250cm9sbGVyIGFzIGEgc3BlY2lhbCB1bml2ZXJzYWwgaGFuZGxlciBmb3IgYWxsIGV2ZW50IG5hbWVzcGFjZXNcblx0ZGF0YVByaXYuc2V0KCBlbCwgdHlwZSwgZmFsc2UgKTtcblx0alF1ZXJ5LmV2ZW50LmFkZCggZWwsIHR5cGUsIHtcblx0XHRuYW1lc3BhY2U6IGZhbHNlLFxuXHRcdGhhbmRsZXI6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHZhciBub3RBc3luYywgcmVzdWx0LFxuXHRcdFx0XHRzYXZlZCA9IGRhdGFQcml2LmdldCggdGhpcywgdHlwZSApO1xuXG5cdFx0XHRpZiAoICggZXZlbnQuaXNUcmlnZ2VyICYgMSApICYmIHRoaXNbIHR5cGUgXSApIHtcblxuXHRcdFx0XHQvLyBJbnRlcnJ1cHQgcHJvY2Vzc2luZyBvZiB0aGUgb3V0ZXIgc3ludGhldGljIC50cmlnZ2VyKCllZCBldmVudFxuXHRcdFx0XHQvLyBTYXZlZCBkYXRhIHNob3VsZCBiZSBmYWxzZSBpbiBzdWNoIGNhc2VzLCBidXQgbWlnaHQgYmUgYSBsZWZ0b3ZlciBjYXB0dXJlIG9iamVjdFxuXHRcdFx0XHQvLyBmcm9tIGFuIGFzeW5jIG5hdGl2ZSBoYW5kbGVyIChnaC00MzUwKVxuXHRcdFx0XHRpZiAoICFzYXZlZC5sZW5ndGggKSB7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSBhcmd1bWVudHMgZm9yIHVzZSB3aGVuIGhhbmRsaW5nIHRoZSBpbm5lciBuYXRpdmUgZXZlbnRcblx0XHRcdFx0XHQvLyBUaGVyZSB3aWxsIGFsd2F5cyBiZSBhdCBsZWFzdCBvbmUgYXJndW1lbnQgKGFuIGV2ZW50IG9iamVjdCksIHNvIHRoaXMgYXJyYXlcblx0XHRcdFx0XHQvLyB3aWxsIG5vdCBiZSBjb25mdXNlZCB3aXRoIGEgbGVmdG92ZXIgY2FwdHVyZSBvYmplY3QuXG5cdFx0XHRcdFx0c2F2ZWQgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIHRoaXMsIHR5cGUsIHNhdmVkICk7XG5cblx0XHRcdFx0XHQvLyBUcmlnZ2VyIHRoZSBuYXRpdmUgZXZlbnQgYW5kIGNhcHR1cmUgaXRzIHJlc3VsdFxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExK1xuXHRcdFx0XHRcdC8vIGZvY3VzKCkgYW5kIGJsdXIoKSBhcmUgYXN5bmNocm9ub3VzXG5cdFx0XHRcdFx0bm90QXN5bmMgPSBleHBlY3RTeW5jKCB0aGlzLCB0eXBlICk7XG5cdFx0XHRcdFx0dGhpc1sgdHlwZSBdKCk7XG5cdFx0XHRcdFx0cmVzdWx0ID0gZGF0YVByaXYuZ2V0KCB0aGlzLCB0eXBlICk7XG5cdFx0XHRcdFx0aWYgKCBzYXZlZCAhPT0gcmVzdWx0IHx8IG5vdEFzeW5jICkge1xuXHRcdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCB0eXBlLCBmYWxzZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXN1bHQgPSB7fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBzYXZlZCAhPT0gcmVzdWx0ICkge1xuXG5cdFx0XHRcdFx0XHQvLyBDYW5jZWwgdGhlIG91dGVyIHN5bnRoZXRpYyBldmVudFxuXHRcdFx0XHRcdFx0ZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgODYrXG5cdFx0XHRcdFx0XHQvLyBJbiBDaHJvbWUsIGlmIGFuIGVsZW1lbnQgaGF2aW5nIGEgZm9jdXNvdXQgaGFuZGxlciBpcyBibHVycmVkIGJ5XG5cdFx0XHRcdFx0XHQvLyBjbGlja2luZyBvdXRzaWRlIG9mIGl0LCBpdCBpbnZva2VzIHRoZSBoYW5kbGVyIHN5bmNocm9ub3VzbHkuIElmXG5cdFx0XHRcdFx0XHQvLyB0aGF0IGhhbmRsZXIgY2FsbHMgYC5yZW1vdmUoKWAgb24gdGhlIGVsZW1lbnQsIHRoZSBkYXRhIGlzIGNsZWFyZWQsXG5cdFx0XHRcdFx0XHQvLyBsZWF2aW5nIGByZXN1bHRgIHVuZGVmaW5lZC4gV2UgbmVlZCB0byBndWFyZCBhZ2FpbnN0IHRoaXMuXG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0ICYmIHJlc3VsdC52YWx1ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gSWYgdGhpcyBpcyBhbiBpbm5lciBzeW50aGV0aWMgZXZlbnQgZm9yIGFuIGV2ZW50IHdpdGggYSBidWJibGluZyBzdXJyb2dhdGVcblx0XHRcdFx0Ly8gKGZvY3VzIG9yIGJsdXIpLCBhc3N1bWUgdGhhdCB0aGUgc3Vycm9nYXRlIGFscmVhZHkgcHJvcGFnYXRlZCBmcm9tIHRyaWdnZXJpbmcgdGhlXG5cdFx0XHRcdC8vIG5hdGl2ZSBldmVudCBhbmQgcHJldmVudCB0aGF0IGZyb20gaGFwcGVuaW5nIGFnYWluIGhlcmUuXG5cdFx0XHRcdC8vIFRoaXMgdGVjaG5pY2FsbHkgZ2V0cyB0aGUgb3JkZXJpbmcgd3Jvbmcgdy5yLnQuIHRvIGAudHJpZ2dlcigpYCAoaW4gd2hpY2ggdGhlXG5cdFx0XHRcdC8vIGJ1YmJsaW5nIHN1cnJvZ2F0ZSBwcm9wYWdhdGVzICphZnRlciogdGhlIG5vbi1idWJibGluZyBiYXNlKSwgYnV0IHRoYXQgc2VlbXNcblx0XHRcdFx0Ly8gbGVzcyBiYWQgdGhhbiBkdXBsaWNhdGlvbi5cblx0XHRcdFx0fSBlbHNlIGlmICggKCBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9ICkuZGVsZWdhdGVUeXBlICkge1xuXHRcdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIElmIHRoaXMgaXMgYSBuYXRpdmUgZXZlbnQgdHJpZ2dlcmVkIGFib3ZlLCBldmVyeXRoaW5nIGlzIG5vdyBpbiBvcmRlclxuXHRcdFx0Ly8gRmlyZSBhbiBpbm5lciBzeW50aGV0aWMgZXZlbnQgd2l0aCB0aGUgb3JpZ2luYWwgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCBzYXZlZC5sZW5ndGggKSB7XG5cblx0XHRcdFx0Ly8gLi4uYW5kIGNhcHR1cmUgdGhlIHJlc3VsdFxuXHRcdFx0XHRkYXRhUHJpdi5zZXQoIHRoaXMsIHR5cGUsIHtcblx0XHRcdFx0XHR2YWx1ZTogalF1ZXJ5LmV2ZW50LnRyaWdnZXIoXG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExK1xuXHRcdFx0XHRcdFx0Ly8gRXh0ZW5kIHdpdGggdGhlIHByb3RvdHlwZSB0byByZXNldCB0aGUgYWJvdmUgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcblx0XHRcdFx0XHRcdGpRdWVyeS5leHRlbmQoIHNhdmVkWyAwIF0sIGpRdWVyeS5FdmVudC5wcm90b3R5cGUgKSxcblx0XHRcdFx0XHRcdHNhdmVkLnNsaWNlKCAxICksXG5cdFx0XHRcdFx0XHR0aGlzXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0Ly8gQWJvcnQgaGFuZGxpbmcgb2YgdGhlIG5hdGl2ZSBldmVudFxuXHRcdFx0XHRldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gKTtcbn1cblxualF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHtcblxuXHQvLyBUaGlzIFwiaWZcIiBpcyBuZWVkZWQgZm9yIHBsYWluIG9iamVjdHNcblx0aWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0ZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUgKTtcblx0fVxufTtcblxualF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7XG5cblx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkXG5cdGlmICggISggdGhpcyBpbnN0YW5jZW9mIGpRdWVyeS5FdmVudCApICkge1xuXHRcdHJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBFdmVudCBvYmplY3Rcblx0aWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7XG5cdFx0dGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjO1xuXHRcdHRoaXMudHlwZSA9IHNyYy50eXBlO1xuXG5cdFx0Ly8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWRcblx0XHQvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHNyYy5kZWZhdWx0UHJldmVudGVkIHx8XG5cdFx0XHRcdHNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHlcblx0XHRcdFx0c3JjLnJldHVyblZhbHVlID09PSBmYWxzZSA/XG5cdFx0XHRyZXR1cm5UcnVlIDpcblx0XHRcdHJldHVybkZhbHNlO1xuXG5cdFx0Ly8gQ3JlYXRlIHRhcmdldCBwcm9wZXJ0aWVzXG5cdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDw9NiAtIDcgb25seVxuXHRcdC8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCAjMTMxNDMpXG5cdFx0dGhpcy50YXJnZXQgPSAoIHNyYy50YXJnZXQgJiYgc3JjLnRhcmdldC5ub2RlVHlwZSA9PT0gMyApID9cblx0XHRcdHNyYy50YXJnZXQucGFyZW50Tm9kZSA6XG5cdFx0XHRzcmMudGFyZ2V0O1xuXG5cdFx0dGhpcy5jdXJyZW50VGFyZ2V0ID0gc3JjLmN1cnJlbnRUYXJnZXQ7XG5cdFx0dGhpcy5yZWxhdGVkVGFyZ2V0ID0gc3JjLnJlbGF0ZWRUYXJnZXQ7XG5cblx0Ly8gRXZlbnQgdHlwZVxuXHR9IGVsc2Uge1xuXHRcdHRoaXMudHlwZSA9IHNyYztcblx0fVxuXG5cdC8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0XG5cdGlmICggcHJvcHMgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdGhpcywgcHJvcHMgKTtcblx0fVxuXG5cdC8vIENyZWF0ZSBhIHRpbWVzdGFtcCBpZiBpbmNvbWluZyBldmVudCBkb2Vzbid0IGhhdmUgb25lXG5cdHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTtcblxuXHQvLyBNYXJrIGl0IGFzIGZpeGVkXG5cdHRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlO1xufTtcblxuLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sXG5qUXVlcnkuRXZlbnQucHJvdG90eXBlID0ge1xuXHRjb25zdHJ1Y3RvcjogalF1ZXJ5LkV2ZW50LFxuXHRpc0RlZmF1bHRQcmV2ZW50ZWQ6IHJldHVybkZhbHNlLFxuXHRpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblx0aXNTaW11bGF0ZWQ6IGZhbHNlLFxuXG5cdHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdH0sXG5cdHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdH1cblxuXHRcdHRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH1cbn07XG5cbi8vIEluY2x1ZGVzIGFsbCBjb21tb24gZXZlbnQgcHJvcHMgaW5jbHVkaW5nIEtleUV2ZW50IGFuZCBNb3VzZUV2ZW50IHNwZWNpZmljIHByb3BzXG5qUXVlcnkuZWFjaCgge1xuXHRhbHRLZXk6IHRydWUsXG5cdGJ1YmJsZXM6IHRydWUsXG5cdGNhbmNlbGFibGU6IHRydWUsXG5cdGNoYW5nZWRUb3VjaGVzOiB0cnVlLFxuXHRjdHJsS2V5OiB0cnVlLFxuXHRkZXRhaWw6IHRydWUsXG5cdGV2ZW50UGhhc2U6IHRydWUsXG5cdG1ldGFLZXk6IHRydWUsXG5cdHBhZ2VYOiB0cnVlLFxuXHRwYWdlWTogdHJ1ZSxcblx0c2hpZnRLZXk6IHRydWUsXG5cdHZpZXc6IHRydWUsXG5cdFwiY2hhclwiOiB0cnVlLFxuXHRjb2RlOiB0cnVlLFxuXHRjaGFyQ29kZTogdHJ1ZSxcblx0a2V5OiB0cnVlLFxuXHRrZXlDb2RlOiB0cnVlLFxuXHRidXR0b246IHRydWUsXG5cdGJ1dHRvbnM6IHRydWUsXG5cdGNsaWVudFg6IHRydWUsXG5cdGNsaWVudFk6IHRydWUsXG5cdG9mZnNldFg6IHRydWUsXG5cdG9mZnNldFk6IHRydWUsXG5cdHBvaW50ZXJJZDogdHJ1ZSxcblx0cG9pbnRlclR5cGU6IHRydWUsXG5cdHNjcmVlblg6IHRydWUsXG5cdHNjcmVlblk6IHRydWUsXG5cdHRhcmdldFRvdWNoZXM6IHRydWUsXG5cdHRvRWxlbWVudDogdHJ1ZSxcblx0dG91Y2hlczogdHJ1ZSxcblx0d2hpY2g6IHRydWVcbn0sIGpRdWVyeS5ldmVudC5hZGRQcm9wICk7XG5cbmpRdWVyeS5lYWNoKCB7IGZvY3VzOiBcImZvY3VzaW5cIiwgYmx1cjogXCJmb2N1c291dFwiIH0sIGZ1bmN0aW9uKCB0eXBlLCBkZWxlZ2F0ZVR5cGUgKSB7XG5cdGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gPSB7XG5cblx0XHQvLyBVdGlsaXplIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3Rcblx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIENsYWltIHRoZSBmaXJzdCBoYW5kbGVyXG5cdFx0XHQvLyBkYXRhUHJpdi5zZXQoIHRoaXMsIFwiZm9jdXNcIiwgLi4uIClcblx0XHRcdC8vIGRhdGFQcml2LnNldCggdGhpcywgXCJibHVyXCIsIC4uLiApXG5cdFx0XHRsZXZlcmFnZU5hdGl2ZSggdGhpcywgdHlwZSwgZXhwZWN0U3luYyApO1xuXG5cdFx0XHQvLyBSZXR1cm4gZmFsc2UgdG8gYWxsb3cgbm9ybWFsIHByb2Nlc3NpbmcgaW4gdGhlIGNhbGxlclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0sXG5cdFx0dHJpZ2dlcjogZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEZvcmNlIHNldHVwIGJlZm9yZSB0cmlnZ2VyXG5cdFx0XHRsZXZlcmFnZU5hdGl2ZSggdGhpcywgdHlwZSApO1xuXG5cdFx0XHQvLyBSZXR1cm4gbm9uLWZhbHNlIHRvIGFsbG93IG5vcm1hbCBldmVudC1wYXRoIHByb3BhZ2F0aW9uXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0Ly8gU3VwcHJlc3MgbmF0aXZlIGZvY3VzIG9yIGJsdXIgYXMgaXQncyBhbHJlYWR5IGJlaW5nIGZpcmVkXG5cdFx0Ly8gaW4gbGV2ZXJhZ2VOYXRpdmUuXG5cdFx0X2RlZmF1bHQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblxuXHRcdGRlbGVnYXRlVHlwZTogZGVsZWdhdGVUeXBlXG5cdH07XG59ICk7XG5cbi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrc1xuLy8gc28gdGhhdCBldmVudCBkZWxlZ2F0aW9uIHdvcmtzIGluIGpRdWVyeS5cbi8vIERvIHRoZSBzYW1lIGZvciBwb2ludGVyZW50ZXIvcG9pbnRlcmxlYXZlIGFuZCBwb2ludGVyb3Zlci9wb2ludGVyb3V0XG4vL1xuLy8gU3VwcG9ydDogU2FmYXJpIDcgb25seVxuLy8gU2FmYXJpIHNlbmRzIG1vdXNlZW50ZXIgdG9vIG9mdGVuOyBzZWU6XG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NzAyNThcbi8vIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGJ1ZyAoaXQgZXhpc3RlZCBpbiBvbGRlciBDaHJvbWUgdmVyc2lvbnMgYXMgd2VsbCkuXG5qUXVlcnkuZWFjaCgge1xuXHRtb3VzZWVudGVyOiBcIm1vdXNlb3ZlclwiLFxuXHRtb3VzZWxlYXZlOiBcIm1vdXNlb3V0XCIsXG5cdHBvaW50ZXJlbnRlcjogXCJwb2ludGVyb3ZlclwiLFxuXHRwb2ludGVybGVhdmU6IFwicG9pbnRlcm91dFwiXG59LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0ge1xuXHRcdGRlbGVnYXRlVHlwZTogZml4LFxuXHRcdGJpbmRUeXBlOiBmaXgsXG5cblx0XHRoYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHZhciByZXQsXG5cdFx0XHRcdHRhcmdldCA9IHRoaXMsXG5cdFx0XHRcdHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LFxuXHRcdFx0XHRoYW5kbGVPYmogPSBldmVudC5oYW5kbGVPYmo7XG5cblx0XHRcdC8vIEZvciBtb3VzZWVudGVyL2xlYXZlIGNhbGwgdGhlIGhhbmRsZXIgaWYgcmVsYXRlZCBpcyBvdXRzaWRlIHRoZSB0YXJnZXQuXG5cdFx0XHQvLyBOQjogTm8gcmVsYXRlZFRhcmdldCBpZiB0aGUgbW91c2UgbGVmdC9lbnRlcmVkIHRoZSBicm93c2VyIHdpbmRvd1xuXHRcdFx0aWYgKCAhcmVsYXRlZCB8fCAoIHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSApICkge1xuXHRcdFx0XHRldmVudC50eXBlID0gaGFuZGxlT2JqLm9yaWdUeXBlO1xuXHRcdFx0XHRyZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBmaXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0fTtcbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdG9uOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0b25lOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIDEgKTtcblx0fSxcblx0b2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHtcblx0XHR2YXIgaGFuZGxlT2JqLCB0eXBlO1xuXHRcdGlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkge1xuXG5cdFx0XHQvLyAoIGV2ZW50ICkgIGRpc3BhdGNoZWQgalF1ZXJ5LkV2ZW50XG5cdFx0XHRoYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7XG5cdFx0XHRqUXVlcnkoIHR5cGVzLmRlbGVnYXRlVGFyZ2V0ICkub2ZmKFxuXHRcdFx0XHRoYW5kbGVPYmoubmFtZXNwYWNlID9cblx0XHRcdFx0XHRoYW5kbGVPYmoub3JpZ1R5cGUgKyBcIi5cIiArIGhhbmRsZU9iai5uYW1lc3BhY2UgOlxuXHRcdFx0XHRcdGhhbmRsZU9iai5vcmlnVHlwZSxcblx0XHRcdFx0aGFuZGxlT2JqLnNlbGVjdG9yLFxuXHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlclxuXHRcdFx0KTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdIClcblx0XHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRcdHRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggc2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzIFssIGZuXSApXG5cdFx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdFx0Zm4gPSByZXR1cm5GYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cblxudmFyXG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMCAtIDExLCBFZGdlIDEyIC0gMTMgb25seVxuXHQvLyBJbiBJRS9FZGdlIHVzaW5nIHJlZ2V4IGdyb3VwcyBoZXJlIGNhdXNlcyBzZXZlcmUgc2xvd2Rvd25zLlxuXHQvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyL1xuXHRybm9Jbm5lcmh0bWwgPSAvPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxcblxuXHQvLyBjaGVja2VkPVwiY2hlY2tlZFwiIG9yIGNoZWNrZWRcblx0cmNoZWNrZWQgPSAvY2hlY2tlZFxccyooPzpbXj1dfD1cXHMqLmNoZWNrZWQuKS9pLFxuXHRyY2xlYW5TY3JpcHQgPSAvXlxccyo8ISg/OlxcW0NEQVRBXFxbfC0tKXwoPzpcXF1cXF18LS0pPlxccyokL2c7XG5cbi8vIFByZWZlciBhIHRib2R5IG92ZXIgaXRzIHBhcmVudCB0YWJsZSBmb3IgY29udGFpbmluZyBuZXcgcm93c1xuZnVuY3Rpb24gbWFuaXB1bGF0aW9uVGFyZ2V0KCBlbGVtLCBjb250ZW50ICkge1xuXHRpZiAoIG5vZGVOYW1lKCBlbGVtLCBcInRhYmxlXCIgKSAmJlxuXHRcdG5vZGVOYW1lKCBjb250ZW50Lm5vZGVUeXBlICE9PSAxMSA/IGNvbnRlbnQgOiBjb250ZW50LmZpcnN0Q2hpbGQsIFwidHJcIiApICkge1xuXG5cdFx0cmV0dXJuIGpRdWVyeSggZWxlbSApLmNoaWxkcmVuKCBcInRib2R5XCIgKVsgMCBdIHx8IGVsZW07XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxuLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvblxuZnVuY3Rpb24gZGlzYWJsZVNjcmlwdCggZWxlbSApIHtcblx0ZWxlbS50eXBlID0gKCBlbGVtLmdldEF0dHJpYnV0ZSggXCJ0eXBlXCIgKSAhPT0gbnVsbCApICsgXCIvXCIgKyBlbGVtLnR5cGU7XG5cdHJldHVybiBlbGVtO1xufVxuZnVuY3Rpb24gcmVzdG9yZVNjcmlwdCggZWxlbSApIHtcblx0aWYgKCAoIGVsZW0udHlwZSB8fCBcIlwiICkuc2xpY2UoIDAsIDUgKSA9PT0gXCJ0cnVlL1wiICkge1xuXHRcdGVsZW0udHlwZSA9IGVsZW0udHlwZS5zbGljZSggNSApO1xuXHR9IGVsc2Uge1xuXHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBcInR5cGVcIiApO1xuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmZ1bmN0aW9uIGNsb25lQ29weUV2ZW50KCBzcmMsIGRlc3QgKSB7XG5cdHZhciBpLCBsLCB0eXBlLCBwZGF0YU9sZCwgdWRhdGFPbGQsIHVkYXRhQ3VyLCBldmVudHM7XG5cblx0aWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIDEuIENvcHkgcHJpdmF0ZSBkYXRhOiBldmVudHMsIGhhbmRsZXJzLCBldGMuXG5cdGlmICggZGF0YVByaXYuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0cGRhdGFPbGQgPSBkYXRhUHJpdi5nZXQoIHNyYyApO1xuXHRcdGV2ZW50cyA9IHBkYXRhT2xkLmV2ZW50cztcblxuXHRcdGlmICggZXZlbnRzICkge1xuXHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBkZXN0LCBcImhhbmRsZSBldmVudHNcIiApO1xuXG5cdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBldmVudHNbIHR5cGUgXS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggZGVzdCwgdHlwZSwgZXZlbnRzWyB0eXBlIF1bIGkgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gMi4gQ29weSB1c2VyIGRhdGFcblx0aWYgKCBkYXRhVXNlci5oYXNEYXRhKCBzcmMgKSApIHtcblx0XHR1ZGF0YU9sZCA9IGRhdGFVc2VyLmFjY2Vzcyggc3JjICk7XG5cdFx0dWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTtcblxuXHRcdGRhdGFVc2VyLnNldCggZGVzdCwgdWRhdGFDdXIgKTtcblx0fVxufVxuXG4vLyBGaXggSUUgYnVncywgc2VlIHN1cHBvcnQgdGVzdHNcbmZ1bmN0aW9uIGZpeElucHV0KCBzcmMsIGRlc3QgKSB7XG5cdHZhciBub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuXHQvLyBGYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbi5cblx0aWYgKCBub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIHJjaGVja2FibGVUeXBlLnRlc3QoIHNyYy50eXBlICkgKSB7XG5cdFx0ZGVzdC5jaGVja2VkID0gc3JjLmNoZWNrZWQ7XG5cblx0Ly8gRmFpbHMgdG8gcmV0dXJuIHRoZSBzZWxlY3RlZCBvcHRpb24gdG8gdGhlIGRlZmF1bHQgc2VsZWN0ZWQgc3RhdGUgd2hlbiBjbG9uaW5nIG9wdGlvbnNcblx0fSBlbHNlIGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiB8fCBub2RlTmFtZSA9PT0gXCJ0ZXh0YXJlYVwiICkge1xuXHRcdGRlc3QuZGVmYXVsdFZhbHVlID0gc3JjLmRlZmF1bHRWYWx1ZTtcblx0fVxufVxuXG5mdW5jdGlvbiBkb21NYW5pcCggY29sbGVjdGlvbiwgYXJncywgY2FsbGJhY2ssIGlnbm9yZWQgKSB7XG5cblx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRhcmdzID0gZmxhdCggYXJncyApO1xuXG5cdHZhciBmcmFnbWVudCwgZmlyc3QsIHNjcmlwdHMsIGhhc1NjcmlwdHMsIG5vZGUsIGRvYyxcblx0XHRpID0gMCxcblx0XHRsID0gY29sbGVjdGlvbi5sZW5ndGgsXG5cdFx0aU5vQ2xvbmUgPSBsIC0gMSxcblx0XHR2YWx1ZSA9IGFyZ3NbIDAgXSxcblx0XHR2YWx1ZUlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCB2YWx1ZSApO1xuXG5cdC8vIFdlIGNhbid0IGNsb25lTm9kZSBmcmFnbWVudHMgdGhhdCBjb250YWluIGNoZWNrZWQsIGluIFdlYktpdFxuXHRpZiAoIHZhbHVlSXNGdW5jdGlvbiB8fFxuXHRcdFx0KCBsID4gMSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0IXN1cHBvcnQuY2hlY2tDbG9uZSAmJiByY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgKSB7XG5cdFx0cmV0dXJuIGNvbGxlY3Rpb24uZWFjaCggZnVuY3Rpb24oIGluZGV4ICkge1xuXHRcdFx0dmFyIHNlbGYgPSBjb2xsZWN0aW9uLmVxKCBpbmRleCApO1xuXHRcdFx0aWYgKCB2YWx1ZUlzRnVuY3Rpb24gKSB7XG5cdFx0XHRcdGFyZ3NbIDAgXSA9IHZhbHVlLmNhbGwoIHRoaXMsIGluZGV4LCBzZWxmLmh0bWwoKSApO1xuXHRcdFx0fVxuXHRcdFx0ZG9tTWFuaXAoIHNlbGYsIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICk7XG5cdFx0fSApO1xuXHR9XG5cblx0aWYgKCBsICkge1xuXHRcdGZyYWdtZW50ID0gYnVpbGRGcmFnbWVudCggYXJncywgY29sbGVjdGlvblsgMCBdLm93bmVyRG9jdW1lbnQsIGZhbHNlLCBjb2xsZWN0aW9uLCBpZ25vcmVkICk7XG5cdFx0Zmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuXG5cdFx0aWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHtcblx0XHRcdGZyYWdtZW50ID0gZmlyc3Q7XG5cdFx0fVxuXG5cdFx0Ly8gUmVxdWlyZSBlaXRoZXIgbmV3IGNvbnRlbnQgb3IgYW4gaW50ZXJlc3QgaW4gaWdub3JlZCBlbGVtZW50cyB0byBpbnZva2UgdGhlIGNhbGxiYWNrXG5cdFx0aWYgKCBmaXJzdCB8fCBpZ25vcmVkICkge1xuXHRcdFx0c2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdldEFsbCggZnJhZ21lbnQsIFwic2NyaXB0XCIgKSwgZGlzYWJsZVNjcmlwdCApO1xuXHRcdFx0aGFzU2NyaXB0cyA9IHNjcmlwdHMubGVuZ3RoO1xuXG5cdFx0XHQvLyBVc2UgdGhlIG9yaWdpbmFsIGZyYWdtZW50IGZvciB0aGUgbGFzdCBpdGVtXG5cdFx0XHQvLyBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXBcblx0XHRcdC8vIGJlaW5nIGVtcHRpZWQgaW5jb3JyZWN0bHkgaW4gY2VydGFpbiBzaXR1YXRpb25zICgjODA3MCkuXG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdG5vZGUgPSBmcmFnbWVudDtcblxuXHRcdFx0XHRpZiAoIGkgIT09IGlOb0Nsb25lICkge1xuXHRcdFx0XHRcdG5vZGUgPSBqUXVlcnkuY2xvbmUoIG5vZGUsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdC8vIEtlZXAgcmVmZXJlbmNlcyB0byBjbG9uZWQgc2NyaXB0cyBmb3IgbGF0ZXIgcmVzdG9yYXRpb25cblx0XHRcdFx0XHRpZiAoIGhhc1NjcmlwdHMgKSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsIFwic2NyaXB0XCIgKSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNhbGxiYWNrLmNhbGwoIGNvbGxlY3Rpb25bIGkgXSwgbm9kZSwgaSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc1NjcmlwdHMgKSB7XG5cdFx0XHRcdGRvYyA9IHNjcmlwdHNbIHNjcmlwdHMubGVuZ3RoIC0gMSBdLm93bmVyRG9jdW1lbnQ7XG5cblx0XHRcdFx0Ly8gUmVlbmFibGUgc2NyaXB0c1xuXHRcdFx0XHRqUXVlcnkubWFwKCBzY3JpcHRzLCByZXN0b3JlU2NyaXB0ICk7XG5cblx0XHRcdFx0Ly8gRXZhbHVhdGUgZXhlY3V0YWJsZSBzY3JpcHRzIG9uIGZpcnN0IGRvY3VtZW50IGluc2VydGlvblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGhhc1NjcmlwdHM7IGkrKyApIHtcblx0XHRcdFx0XHRub2RlID0gc2NyaXB0c1sgaSBdO1xuXHRcdFx0XHRcdGlmICggcnNjcmlwdFR5cGUudGVzdCggbm9kZS50eXBlIHx8IFwiXCIgKSAmJlxuXHRcdFx0XHRcdFx0IWRhdGFQcml2LmFjY2Vzcyggbm9kZSwgXCJnbG9iYWxFdmFsXCIgKSAmJlxuXHRcdFx0XHRcdFx0alF1ZXJ5LmNvbnRhaW5zKCBkb2MsIG5vZGUgKSApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBub2RlLnNyYyAmJiAoIG5vZGUudHlwZSB8fCBcIlwiICkudG9Mb3dlckNhc2UoKSAgIT09IFwibW9kdWxlXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gT3B0aW9uYWwgQUpBWCBkZXBlbmRlbmN5LCBidXQgd29uJ3QgcnVuIHNjcmlwdHMgaWYgbm90IHByZXNlbnRcblx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuX2V2YWxVcmwgJiYgIW5vZGUubm9Nb2R1bGUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYywge1xuXHRcdFx0XHRcdFx0XHRcdFx0bm9uY2U6IG5vZGUubm9uY2UgfHwgbm9kZS5nZXRBdHRyaWJ1dGUoIFwibm9uY2VcIiApXG5cdFx0XHRcdFx0XHRcdFx0fSwgZG9jICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdERPTUV2YWwoIG5vZGUudGV4dENvbnRlbnQucmVwbGFjZSggcmNsZWFuU2NyaXB0LCBcIlwiICksIG5vZGUsIGRvYyApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBjb2xsZWN0aW9uO1xufVxuXG5mdW5jdGlvbiByZW1vdmUoIGVsZW0sIHNlbGVjdG9yLCBrZWVwRGF0YSApIHtcblx0dmFyIG5vZGUsXG5cdFx0bm9kZXMgPSBzZWxlY3RvciA/IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCBlbGVtICkgOiBlbGVtLFxuXHRcdGkgPSAwO1xuXG5cdGZvciAoIDsgKCBub2RlID0gbm9kZXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRpZiAoICFrZWVwRGF0YSAmJiBub2RlLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBub2RlICkgKTtcblx0XHR9XG5cblx0XHRpZiAoIG5vZGUucGFyZW50Tm9kZSApIHtcblx0XHRcdGlmICgga2VlcERhdGEgJiYgaXNBdHRhY2hlZCggbm9kZSApICkge1xuXHRcdFx0XHRzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIG5vZGUsIFwic2NyaXB0XCIgKSApO1xuXHRcdFx0fVxuXHRcdFx0bm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBub2RlICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0aHRtbFByZWZpbHRlcjogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0cmV0dXJuIGh0bWw7XG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHR2YXIgaSwgbCwgc3JjRWxlbWVudHMsIGRlc3RFbGVtZW50cyxcblx0XHRcdGNsb25lID0gZWxlbS5jbG9uZU5vZGUoIHRydWUgKSxcblx0XHRcdGluUGFnZSA9IGlzQXR0YWNoZWQoIGVsZW0gKTtcblxuXHRcdC8vIEZpeCBJRSBjbG9uaW5nIGlzc3Vlc1xuXHRcdGlmICggIXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgJiYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGVsZW0ubm9kZVR5cGUgPT09IDExICkgJiZcblx0XHRcdFx0IWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkge1xuXG5cdFx0XHQvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6IGh0dHBzOi8vanNwZXJmLmNvbS9nZXRhbGwtdnMtc2l6emxlLzJcblx0XHRcdGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUgKTtcblx0XHRcdHNyY0VsZW1lbnRzID0gZ2V0QWxsKCBlbGVtICk7XG5cblx0XHRcdGZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRmaXhJbnB1dCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lXG5cdFx0aWYgKCBkYXRhQW5kRXZlbnRzICkge1xuXHRcdFx0aWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdFx0c3JjRWxlbWVudHMgPSBzcmNFbGVtZW50cyB8fCBnZXRBbGwoIGVsZW0gKTtcblx0XHRcdFx0ZGVzdEVsZW1lbnRzID0gZGVzdEVsZW1lbnRzIHx8IGdldEFsbCggY2xvbmUgKTtcblxuXHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRjbG9uZUNvcHlFdmVudCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUsIFwic2NyaXB0XCIgKTtcblx0XHRpZiAoIGRlc3RFbGVtZW50cy5sZW5ndGggPiAwICkge1xuXHRcdFx0c2V0R2xvYmFsRXZhbCggZGVzdEVsZW1lbnRzLCAhaW5QYWdlICYmIGdldEFsbCggZWxlbSwgXCJzY3JpcHRcIiApICk7XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0XG5cdFx0cmV0dXJuIGNsb25lO1xuXHR9LFxuXG5cdGNsZWFuRGF0YTogZnVuY3Rpb24oIGVsZW1zICkge1xuXHRcdHZhciBkYXRhLCBlbGVtLCB0eXBlLFxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IGVsZW1zWyBpIF0gKSAhPT0gdW5kZWZpbmVkOyBpKysgKSB7XG5cdFx0XHRpZiAoIGFjY2VwdERhdGEoIGVsZW0gKSApIHtcblx0XHRcdFx0aWYgKCAoIGRhdGEgPSBlbGVtWyBkYXRhUHJpdi5leHBhbmRvIF0gKSApIHtcblx0XHRcdFx0XHRpZiAoIGRhdGEuZXZlbnRzICkge1xuXHRcdFx0XHRcdFx0Zm9yICggdHlwZSBpbiBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBzcGVjaWFsWyB0eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBhdm9pZCBqUXVlcnkuZXZlbnQucmVtb3ZlJ3Mgb3ZlcmhlYWRcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1K1xuXHRcdFx0XHRcdC8vIEFzc2lnbiB1bmRlZmluZWQgaW5zdGVhZCBvZiB1c2luZyBkZWxldGUsIHNlZSBEYXRhI3JlbW92ZVxuXHRcdFx0XHRcdGVsZW1bIGRhdGFQcml2LmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIGVsZW1bIGRhdGFVc2VyLmV4cGFuZG8gXSApIHtcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrXG5cdFx0XHRcdFx0Ly8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlXG5cdFx0XHRcdFx0ZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZGV0YWNoOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHJlbW92ZSggdGhpcywgc2VsZWN0b3IsIHRydWUgKTtcblx0fSxcblxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciApO1xuXHR9LFxuXG5cdHRleHQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS50ZXh0KCB0aGlzICkgOlxuXHRcdFx0XHR0aGlzLmVtcHR5KCkuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0fSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTtcblx0fSxcblxuXHRhcHBlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7XG5cdFx0XHRcdHRhcmdldC5hcHBlbmRDaGlsZCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRwcmVwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0YXJnZXQuZmlyc3RDaGlsZCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRiZWZvcmU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGFmdGVyOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5uZXh0U2libGluZyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRlbXB0eTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGVsZW0sXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgKCBlbGVtID0gdGhpc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdC8vIFByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXG5cdFx0XHRcdC8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzXG5cdFx0XHRcdGVsZW0udGV4dENvbnRlbnQgPSBcIlwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiggZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0ZGF0YUFuZEV2ZW50cyA9IGRhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGZhbHNlIDogZGF0YUFuZEV2ZW50cztcblx0XHRkZWVwRGF0YUFuZEV2ZW50cyA9IGRlZXBEYXRhQW5kRXZlbnRzID09IG51bGwgPyBkYXRhQW5kRXZlbnRzIDogZGVlcERhdGFBbmRFdmVudHM7XG5cblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5jbG9uZSggdGhpcywgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKTtcblx0XHR9ICk7XG5cdH0sXG5cblx0aHRtbDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBlbGVtID0gdGhpc1sgMCBdIHx8IHt9LFxuXHRcdFx0XHRpID0gMCxcblx0XHRcdFx0bCA9IHRoaXMubGVuZ3RoO1xuXG5cdFx0XHRpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0cmV0dXJuIGVsZW0uaW5uZXJIVE1MO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZWUgaWYgd2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5uZXJIVE1MXG5cdFx0XHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhcm5vSW5uZXJodG1sLnRlc3QoIHZhbHVlICkgJiZcblx0XHRcdFx0IXdyYXBNYXBbICggcnRhZ05hbWUuZXhlYyggdmFsdWUgKSB8fCBbIFwiXCIsIFwiXCIgXSApWyAxIF0udG9Mb3dlckNhc2UoKSBdICkge1xuXG5cdFx0XHRcdHZhbHVlID0galF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIHZhbHVlICk7XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0XHRlbGVtID0gdGhpc1sgaSBdIHx8IHt9O1xuXG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3Ncblx0XHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7XG5cdFx0XHRcdFx0XHRcdGVsZW0uaW5uZXJIVE1MID0gdmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZWxlbSA9IDA7XG5cblx0XHRcdFx0Ly8gSWYgdXNpbmcgaW5uZXJIVE1MIHRocm93cyBhbiBleGNlcHRpb24sIHVzZSB0aGUgZmFsbGJhY2sgbWV0aG9kXG5cdFx0XHRcdH0gY2F0Y2ggKCBlICkge31cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0XHR0aGlzLmVtcHR5KCkuYXBwZW5kKCB2YWx1ZSApO1xuXHRcdFx0fVxuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0cmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpZ25vcmVkID0gW107XG5cblx0XHQvLyBNYWtlIHRoZSBjaGFuZ2VzLCByZXBsYWNpbmcgZWFjaCBub24taWdub3JlZCBjb250ZXh0IGVsZW1lbnQgd2l0aCB0aGUgbmV3IGNvbnRlbnRcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuXG5cdFx0XHRpZiAoIGpRdWVyeS5pbkFycmF5KCB0aGlzLCBpZ25vcmVkICkgPCAwICkge1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIHRoaXMgKSApO1xuXHRcdFx0XHRpZiAoIHBhcmVudCApIHtcblx0XHRcdFx0XHRwYXJlbnQucmVwbGFjZUNoaWxkKCBlbGVtLCB0aGlzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEZvcmNlIGNhbGxiYWNrIGludm9jYXRpb25cblx0XHR9LCBpZ25vcmVkICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIHtcblx0YXBwZW5kVG86IFwiYXBwZW5kXCIsXG5cdHByZXBlbmRUbzogXCJwcmVwZW5kXCIsXG5cdGluc2VydEJlZm9yZTogXCJiZWZvcmVcIixcblx0aW5zZXJ0QWZ0ZXI6IFwiYWZ0ZXJcIixcblx0cmVwbGFjZUFsbDogXCJyZXBsYWNlV2l0aFwiXG59LCBmdW5jdGlvbiggbmFtZSwgb3JpZ2luYWwgKSB7XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBlbGVtcyxcblx0XHRcdHJldCA9IFtdLFxuXHRcdFx0aW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLFxuXHRcdFx0bGFzdCA9IGluc2VydC5sZW5ndGggLSAxLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7IGkgPD0gbGFzdDsgaSsrICkge1xuXHRcdFx0ZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUoIHRydWUgKTtcblx0XHRcdGpRdWVyeSggaW5zZXJ0WyBpIF0gKVsgb3JpZ2luYWwgXSggZWxlbXMgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdFx0XHQvLyAuZ2V0KCkgYmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRwdXNoLmFwcGx5KCByZXQsIGVsZW1zLmdldCgpICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTtcblx0fTtcbn0gKTtcbnZhciBybnVtbm9ucHggPSBuZXcgUmVnRXhwKCBcIl4oXCIgKyBwbnVtICsgXCIpKD8hcHgpW2EteiVdKyRcIiwgXCJpXCIgKTtcblxudmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5LCBGaXJlZm94IDw9MzAgKCMxNTA5OCwgIzE0MTUwKVxuXHRcdC8vIElFIHRocm93cyBvbiBlbGVtZW50cyBjcmVhdGVkIGluIHBvcHVwc1xuXHRcdC8vIEZGIG1lYW53aGlsZSB0aHJvd3Mgb24gZnJhbWUgZWxlbWVudHMgdGhyb3VnaCBcImRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGVcIlxuXHRcdHZhciB2aWV3ID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuXG5cdFx0aWYgKCAhdmlldyB8fCAhdmlldy5vcGVuZXIgKSB7XG5cdFx0XHR2aWV3ID0gd2luZG93O1xuXHRcdH1cblxuXHRcdHJldHVybiB2aWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0gKTtcblx0fTtcblxudmFyIHN3YXAgPSBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2sgKSB7XG5cdHZhciByZXQsIG5hbWUsXG5cdFx0b2xkID0ge307XG5cblx0Ly8gUmVtZW1iZXIgdGhlIG9sZCB2YWx1ZXMsIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmVzXG5cdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTtcblx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvcHRpb25zWyBuYW1lIF07XG5cdH1cblxuXHRyZXQgPSBjYWxsYmFjay5jYWxsKCBlbGVtICk7XG5cblx0Ly8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzXG5cdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTtcblx0fVxuXG5cdHJldHVybiByZXQ7XG59O1xuXG5cbnZhciByYm94U3R5bGUgPSBuZXcgUmVnRXhwKCBjc3NFeHBhbmQuam9pbiggXCJ8XCIgKSwgXCJpXCIgKTtcblxuXG5cbiggZnVuY3Rpb24oKSB7XG5cblx0Ly8gRXhlY3V0aW5nIGJvdGggcGl4ZWxQb3NpdGlvbiAmIGJveFNpemluZ1JlbGlhYmxlIHRlc3RzIHJlcXVpcmUgb25seSBvbmUgbGF5b3V0XG5cdC8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uXG5cdGZ1bmN0aW9uIGNvbXB1dGVTdHlsZVRlc3RzKCkge1xuXG5cdFx0Ly8gVGhpcyBpcyBhIHNpbmdsZXRvbiwgd2UgbmVlZCB0byBleGVjdXRlIGl0IG9ubHkgb25jZVxuXHRcdGlmICggIWRpdiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IFwicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O1wiICtcblx0XHRcdFwibWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowXCI7XG5cdFx0ZGl2LnN0eWxlLmNzc1RleHQgPVxuXHRcdFx0XCJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7XCIgK1xuXHRcdFx0XCJtYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O1wiICtcblx0XHRcdFwid2lkdGg6NjAlO3RvcDoxJVwiO1xuXHRcdGRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCggY29udGFpbmVyICkuYXBwZW5kQ2hpbGQoIGRpdiApO1xuXG5cdFx0dmFyIGRpdlN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiApO1xuXHRcdHBpeGVsUG9zaXRpb25WYWwgPSBkaXZTdHlsZS50b3AgIT09IFwiMSVcIjtcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHksIEZpcmVmb3ggPD0zIC0gNDRcblx0XHRyZWxpYWJsZU1hcmdpbkxlZnRWYWwgPSByb3VuZFBpeGVsTWVhc3VyZXMoIGRpdlN0eWxlLm1hcmdpbkxlZnQgKSA9PT0gMTI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBTYWZhcmkgPD05LjEgLSAxMC4xLCBpT1MgPD03LjAgLSA5LjNcblx0XHQvLyBTb21lIHN0eWxlcyBjb21lIGJhY2sgd2l0aCBwZXJjZW50YWdlIHZhbHVlcywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGRuJ3Rcblx0XHRkaXYuc3R5bGUucmlnaHQgPSBcIjYwJVwiO1xuXHRcdHBpeGVsQm94U3R5bGVzVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5yaWdodCApID09PSAzNjtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdFx0Ly8gRGV0ZWN0IG1pc3JlcG9ydGluZyBvZiBjb250ZW50IGRpbWVuc2lvbnMgZm9yIGJveC1zaXppbmc6Ym9yZGVyLWJveCBlbGVtZW50c1xuXHRcdGJveFNpemluZ1JlbGlhYmxlVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS53aWR0aCApID09PSAzNjtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgb25seVxuXHRcdC8vIERldGVjdCBvdmVyZmxvdzpzY3JvbGwgc2NyZXdpbmVzcyAoZ2gtMzY5OSlcblx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD02NFxuXHRcdC8vIERvbid0IGdldCB0cmlja2VkIHdoZW4gem9vbSBhZmZlY3RzIG9mZnNldFdpZHRoIChnaC00MDI5KVxuXHRcdGRpdi5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcblx0XHRzY3JvbGxib3hTaXplVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXYub2Zmc2V0V2lkdGggLyAzICkgPT09IDEyO1xuXG5cdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdC8vIE51bGxpZnkgdGhlIGRpdiBzbyBpdCB3b3VsZG4ndCBiZSBzdG9yZWQgaW4gdGhlIG1lbW9yeSBhbmRcblx0XHQvLyBpdCB3aWxsIGFsc28gYmUgYSBzaWduIHRoYXQgY2hlY2tzIGFscmVhZHkgcGVyZm9ybWVkXG5cdFx0ZGl2ID0gbnVsbDtcblx0fVxuXG5cdGZ1bmN0aW9uIHJvdW5kUGl4ZWxNZWFzdXJlcyggbWVhc3VyZSApIHtcblx0XHRyZXR1cm4gTWF0aC5yb3VuZCggcGFyc2VGbG9hdCggbWVhc3VyZSApICk7XG5cdH1cblxuXHR2YXIgcGl4ZWxQb3NpdGlvblZhbCwgYm94U2l6aW5nUmVsaWFibGVWYWwsIHNjcm9sbGJveFNpemVWYWwsIHBpeGVsQm94U3R5bGVzVmFsLFxuXHRcdHJlbGlhYmxlVHJEaW1lbnNpb25zVmFsLCByZWxpYWJsZU1hcmdpbkxlZnRWYWwsXG5cdFx0Y29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApLFxuXHRcdGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKTtcblxuXHQvLyBGaW5pc2ggZWFybHkgaW4gbGltaXRlZCAobm9uLWJyb3dzZXIpIGVudmlyb25tZW50c1xuXHRpZiAoICFkaXYuc3R5bGUgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHQvLyBTdHlsZSBvZiBjbG9uZWQgZWxlbWVudCBhZmZlY3RzIHNvdXJjZSBlbGVtZW50IGNsb25lZCAoIzg5MDgpXG5cdGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9IFwiY29udGVudC1ib3hcIjtcblx0ZGl2LmNsb25lTm9kZSggdHJ1ZSApLnN0eWxlLmJhY2tncm91bmRDbGlwID0gXCJcIjtcblx0c3VwcG9ydC5jbGVhckNsb25lU3R5bGUgPSBkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPT09IFwiY29udGVudC1ib3hcIjtcblxuXHRqUXVlcnkuZXh0ZW5kKCBzdXBwb3J0LCB7XG5cdFx0Ym94U2l6aW5nUmVsaWFibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBib3hTaXppbmdSZWxpYWJsZVZhbDtcblx0XHR9LFxuXHRcdHBpeGVsQm94U3R5bGVzOiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gcGl4ZWxCb3hTdHlsZXNWYWw7XG5cdFx0fSxcblx0XHRwaXhlbFBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gcGl4ZWxQb3NpdGlvblZhbDtcblx0XHR9LFxuXHRcdHJlbGlhYmxlTWFyZ2luTGVmdDogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHJlbGlhYmxlTWFyZ2luTGVmdFZhbDtcblx0XHR9LFxuXHRcdHNjcm9sbGJveFNpemU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBzY3JvbGxib3hTaXplVmFsO1xuXHRcdH0sXG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTErLCBFZGdlIDE1IC0gMTgrXG5cdFx0Ly8gSUUvRWRnZSBtaXNyZXBvcnQgYGdldENvbXB1dGVkU3R5bGVgIG9mIHRhYmxlIHJvd3Mgd2l0aCB3aWR0aC9oZWlnaHRcblx0XHQvLyBzZXQgaW4gQ1NTIHdoaWxlIGBvZmZzZXQqYCBwcm9wZXJ0aWVzIHJlcG9ydCBjb3JyZWN0IHZhbHVlcy5cblx0XHQvLyBCZWhhdmlvciBpbiBJRSA5IGlzIG1vcmUgc3VidGxlIHRoYW4gaW4gbmV3ZXIgdmVyc2lvbnMgJiBpdCBwYXNzZXNcblx0XHQvLyBzb21lIHZlcnNpb25zIG9mIHRoaXMgdGVzdDsgbWFrZSBzdXJlIG5vdCB0byBtYWtlIGl0IHBhc3MgdGhlcmUhXG5cdFx0Ly9cblx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDcwK1xuXHRcdC8vIE9ubHkgRmlyZWZveCBpbmNsdWRlcyBib3JkZXIgd2lkdGhzXG5cdFx0Ly8gaW4gY29tcHV0ZWQgZGltZW5zaW9ucy4gKGdoLTQ1MjkpXG5cdFx0cmVsaWFibGVUckRpbWVuc2lvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHRhYmxlLCB0ciwgdHJDaGlsZCwgdHJTdHlsZTtcblx0XHRcdGlmICggcmVsaWFibGVUckRpbWVuc2lvbnNWYWwgPT0gbnVsbCApIHtcblx0XHRcdFx0dGFibGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcInRhYmxlXCIgKTtcblx0XHRcdFx0dHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcInRyXCIgKTtcblx0XHRcdFx0dHJDaGlsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKTtcblxuXHRcdFx0XHR0YWJsZS5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O2JvcmRlci1jb2xsYXBzZTpzZXBhcmF0ZVwiO1xuXHRcdFx0XHR0ci5zdHlsZS5jc3NUZXh0ID0gXCJib3JkZXI6MXB4IHNvbGlkXCI7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDg2K1xuXHRcdFx0XHQvLyBIZWlnaHQgc2V0IHRocm91Z2ggY3NzVGV4dCBkb2VzIG5vdCBnZXQgYXBwbGllZC5cblx0XHRcdFx0Ly8gQ29tcHV0ZWQgaGVpZ2h0IHRoZW4gY29tZXMgYmFjayBhcyAwLlxuXHRcdFx0XHR0ci5zdHlsZS5oZWlnaHQgPSBcIjFweFwiO1xuXHRcdFx0XHR0ckNoaWxkLnN0eWxlLmhlaWdodCA9IFwiOXB4XCI7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA4IENocm9tZSA4Nitcblx0XHRcdFx0Ly8gSW4gb3VyIGJvZHlCYWNrZ3JvdW5kLmh0bWwgaWZyYW1lLFxuXHRcdFx0XHQvLyBkaXNwbGF5IGZvciBhbGwgZGl2IGVsZW1lbnRzIGlzIHNldCB0byBcImlubGluZVwiLFxuXHRcdFx0XHQvLyB3aGljaCBjYXVzZXMgYSBwcm9ibGVtIG9ubHkgaW4gQW5kcm9pZCA4IENocm9tZSA4Ni5cblx0XHRcdFx0Ly8gRW5zdXJpbmcgdGhlIGRpdiBpcyBkaXNwbGF5OiBibG9ja1xuXHRcdFx0XHQvLyBnZXRzIGFyb3VuZCB0aGlzIGlzc3VlLlxuXHRcdFx0XHR0ckNoaWxkLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG5cblx0XHRcdFx0ZG9jdW1lbnRFbGVtZW50XG5cdFx0XHRcdFx0LmFwcGVuZENoaWxkKCB0YWJsZSApXG5cdFx0XHRcdFx0LmFwcGVuZENoaWxkKCB0ciApXG5cdFx0XHRcdFx0LmFwcGVuZENoaWxkKCB0ckNoaWxkICk7XG5cblx0XHRcdFx0dHJTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCB0ciApO1xuXHRcdFx0XHRyZWxpYWJsZVRyRGltZW5zaW9uc1ZhbCA9ICggcGFyc2VJbnQoIHRyU3R5bGUuaGVpZ2h0LCAxMCApICtcblx0XHRcdFx0XHRwYXJzZUludCggdHJTdHlsZS5ib3JkZXJUb3BXaWR0aCwgMTAgKSArXG5cdFx0XHRcdFx0cGFyc2VJbnQoIHRyU3R5bGUuYm9yZGVyQm90dG9tV2lkdGgsIDEwICkgKSA9PT0gdHIub2Zmc2V0SGVpZ2h0O1xuXG5cdFx0XHRcdGRvY3VtZW50RWxlbWVudC5yZW1vdmVDaGlsZCggdGFibGUgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZWxpYWJsZVRyRGltZW5zaW9uc1ZhbDtcblx0XHR9XG5cdH0gKTtcbn0gKSgpO1xuXG5cbmZ1bmN0aW9uIGN1ckNTUyggZWxlbSwgbmFtZSwgY29tcHV0ZWQgKSB7XG5cdHZhciB3aWR0aCwgbWluV2lkdGgsIG1heFdpZHRoLCByZXQsXG5cblx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDUxK1xuXHRcdC8vIFJldHJpZXZpbmcgc3R5bGUgYmVmb3JlIGNvbXB1dGVkIHNvbWVob3dcblx0XHQvLyBmaXhlcyBhbiBpc3N1ZSB3aXRoIGdldHRpbmcgd3JvbmcgdmFsdWVzXG5cdFx0Ly8gb24gZGV0YWNoZWQgZWxlbWVudHNcblx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XG5cblx0Y29tcHV0ZWQgPSBjb21wdXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKTtcblxuXHQvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG5lZWRlZCBmb3I6XG5cdC8vICAgLmNzcygnZmlsdGVyJykgKElFIDkgb25seSwgIzEyNTM3KVxuXHQvLyAgIC5jc3MoJy0tY3VzdG9tUHJvcGVydHkpICgjMzE0NClcblx0aWYgKCBjb21wdXRlZCApIHtcblx0XHRyZXQgPSBjb21wdXRlZC5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICkgfHwgY29tcHV0ZWRbIG5hbWUgXTtcblxuXHRcdGlmICggcmV0ID09PSBcIlwiICYmICFpc0F0dGFjaGVkKCBlbGVtICkgKSB7XG5cdFx0XHRyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTtcblx0XHR9XG5cblx0XHQvLyBBIHRyaWJ1dGUgdG8gdGhlIFwiYXdlc29tZSBoYWNrIGJ5IERlYW4gRWR3YXJkc1wiXG5cdFx0Ly8gQW5kcm9pZCBCcm93c2VyIHJldHVybnMgcGVyY2VudGFnZSBmb3Igc29tZSB2YWx1ZXMsXG5cdFx0Ly8gYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVscy5cblx0XHQvLyBUaGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6XG5cdFx0Ly8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXNcblx0XHRpZiAoICFzdXBwb3J0LnBpeGVsQm94U3R5bGVzKCkgJiYgcm51bW5vbnB4LnRlc3QoIHJldCApICYmIHJib3hTdHlsZS50ZXN0KCBuYW1lICkgKSB7XG5cblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXNcblx0XHRcdHdpZHRoID0gc3R5bGUud2lkdGg7XG5cdFx0XHRtaW5XaWR0aCA9IHN0eWxlLm1pbldpZHRoO1xuXHRcdFx0bWF4V2lkdGggPSBzdHlsZS5tYXhXaWR0aDtcblxuXHRcdFx0Ly8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dFxuXHRcdFx0c3R5bGUubWluV2lkdGggPSBzdHlsZS5tYXhXaWR0aCA9IHN0eWxlLndpZHRoID0gcmV0O1xuXHRcdFx0cmV0ID0gY29tcHV0ZWQud2lkdGg7XG5cblx0XHRcdC8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXNcblx0XHRcdHN0eWxlLndpZHRoID0gd2lkdGg7XG5cdFx0XHRzdHlsZS5taW5XaWR0aCA9IG1pbldpZHRoO1xuXHRcdFx0c3R5bGUubWF4V2lkdGggPSBtYXhXaWR0aDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmV0ICE9PSB1bmRlZmluZWQgP1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHRcdC8vIElFIHJldHVybnMgekluZGV4IHZhbHVlIGFzIGFuIGludGVnZXIuXG5cdFx0cmV0ICsgXCJcIiA6XG5cdFx0cmV0O1xufVxuXG5cbmZ1bmN0aW9uIGFkZEdldEhvb2tJZiggY29uZGl0aW9uRm4sIGhvb2tGbiApIHtcblxuXHQvLyBEZWZpbmUgdGhlIGhvb2ssIHdlJ2xsIGNoZWNrIG9uIHRoZSBmaXJzdCBydW4gaWYgaXQncyByZWFsbHkgbmVlZGVkLlxuXHRyZXR1cm4ge1xuXHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGNvbmRpdGlvbkZuKCkgKSB7XG5cblx0XHRcdFx0Ly8gSG9vayBub3QgbmVlZGVkIChvciBpdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgaXQgZHVlXG5cdFx0XHRcdC8vIHRvIG1pc3NpbmcgZGVwZW5kZW5jeSksIHJlbW92ZSBpdC5cblx0XHRcdFx0ZGVsZXRlIHRoaXMuZ2V0O1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIEhvb2sgbmVlZGVkOyByZWRlZmluZSBpdCBzbyB0aGF0IHRoZSBzdXBwb3J0IHRlc3QgaXMgbm90IGV4ZWN1dGVkIGFnYWluLlxuXHRcdFx0cmV0dXJuICggdGhpcy5nZXQgPSBob29rRm4gKS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0fVxuXHR9O1xufVxuXG5cbnZhciBjc3NQcmVmaXhlcyA9IFsgXCJXZWJraXRcIiwgXCJNb3pcIiwgXCJtc1wiIF0sXG5cdGVtcHR5U3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkuc3R5bGUsXG5cdHZlbmRvclByb3BzID0ge307XG5cbi8vIFJldHVybiBhIHZlbmRvci1wcmVmaXhlZCBwcm9wZXJ0eSBvciB1bmRlZmluZWRcbmZ1bmN0aW9uIHZlbmRvclByb3BOYW1lKCBuYW1lICkge1xuXG5cdC8vIENoZWNrIGZvciB2ZW5kb3IgcHJlZml4ZWQgbmFtZXNcblx0dmFyIGNhcE5hbWUgPSBuYW1lWyAwIF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoIDEgKSxcblx0XHRpID0gY3NzUHJlZml4ZXMubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdG5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTtcblx0XHRpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHtcblx0XHRcdHJldHVybiBuYW1lO1xuXHRcdH1cblx0fVxufVxuXG4vLyBSZXR1cm4gYSBwb3RlbnRpYWxseS1tYXBwZWQgalF1ZXJ5LmNzc1Byb3BzIG9yIHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eVxuZnVuY3Rpb24gZmluYWxQcm9wTmFtZSggbmFtZSApIHtcblx0dmFyIGZpbmFsID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF0gfHwgdmVuZG9yUHJvcHNbIG5hbWUgXTtcblxuXHRpZiAoIGZpbmFsICkge1xuXHRcdHJldHVybiBmaW5hbDtcblx0fVxuXHRpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHtcblx0XHRyZXR1cm4gbmFtZTtcblx0fVxuXHRyZXR1cm4gdmVuZG9yUHJvcHNbIG5hbWUgXSA9IHZlbmRvclByb3BOYW1lKCBuYW1lICkgfHwgbmFtZTtcbn1cblxuXG52YXJcblxuXHQvLyBTd2FwcGFibGUgaWYgZGlzcGxheSBpcyBub25lIG9yIHN0YXJ0cyB3aXRoIHRhYmxlXG5cdC8vIGV4Y2VwdCBcInRhYmxlXCIsIFwidGFibGUtY2VsbFwiLCBvciBcInRhYmxlLWNhcHRpb25cIlxuXHQvLyBTZWUgaGVyZSBmb3IgZGlzcGxheSB2YWx1ZXM6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvQ1NTL2Rpc3BsYXlcblx0cmRpc3BsYXlzd2FwID0gL14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFxuXHRyY3VzdG9tUHJvcCA9IC9eLS0vLFxuXHRjc3NTaG93ID0geyBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLCB2aXNpYmlsaXR5OiBcImhpZGRlblwiLCBkaXNwbGF5OiBcImJsb2NrXCIgfSxcblx0Y3NzTm9ybWFsVHJhbnNmb3JtID0ge1xuXHRcdGxldHRlclNwYWNpbmc6IFwiMFwiLFxuXHRcdGZvbnRXZWlnaHQ6IFwiNDAwXCJcblx0fTtcblxuZnVuY3Rpb24gc2V0UG9zaXRpdmVOdW1iZXIoIF9lbGVtLCB2YWx1ZSwgc3VidHJhY3QgKSB7XG5cblx0Ly8gQW55IHJlbGF0aXZlICgrLy0pIHZhbHVlcyBoYXZlIGFscmVhZHkgYmVlblxuXHQvLyBub3JtYWxpemVkIGF0IHRoaXMgcG9pbnRcblx0dmFyIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICk7XG5cdHJldHVybiBtYXRjaGVzID9cblxuXHRcdC8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkIFwic3VidHJhY3RcIiwgZS5nLiwgd2hlbiB1c2VkIGFzIGluIGNzc0hvb2tzXG5cdFx0TWF0aC5tYXgoIDAsIG1hdGNoZXNbIDIgXSAtICggc3VidHJhY3QgfHwgMCApICkgKyAoIG1hdGNoZXNbIDMgXSB8fCBcInB4XCIgKSA6XG5cdFx0dmFsdWU7XG59XG5cbmZ1bmN0aW9uIGJveE1vZGVsQWRqdXN0bWVudCggZWxlbSwgZGltZW5zaW9uLCBib3gsIGlzQm9yZGVyQm94LCBzdHlsZXMsIGNvbXB1dGVkVmFsICkge1xuXHR2YXIgaSA9IGRpbWVuc2lvbiA9PT0gXCJ3aWR0aFwiID8gMSA6IDAsXG5cdFx0ZXh0cmEgPSAwLFxuXHRcdGRlbHRhID0gMDtcblxuXHQvLyBBZGp1c3RtZW50IG1heSBub3QgYmUgbmVjZXNzYXJ5XG5cdGlmICggYm94ID09PSAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICkgKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgKSB7XG5cblx0XHQvLyBCb3RoIGJveCBtb2RlbHMgZXhjbHVkZSBtYXJnaW5cblx0XHRpZiAoIGJveCA9PT0gXCJtYXJnaW5cIiApIHtcblx0XHRcdGRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sIGJveCArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblx0XHR9XG5cblx0XHQvLyBJZiB3ZSBnZXQgaGVyZSB3aXRoIGEgY29udGVudC1ib3gsIHdlJ3JlIHNlZWtpbmcgXCJwYWRkaW5nXCIgb3IgXCJib3JkZXJcIiBvciBcIm1hcmdpblwiXG5cdFx0aWYgKCAhaXNCb3JkZXJCb3ggKSB7XG5cblx0XHRcdC8vIEFkZCBwYWRkaW5nXG5cdFx0XHRkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBhZGRpbmdcIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblxuXHRcdFx0Ly8gRm9yIFwiYm9yZGVyXCIgb3IgXCJtYXJnaW5cIiwgYWRkIGJvcmRlclxuXHRcdFx0aWYgKCBib3ggIT09IFwicGFkZGluZ1wiICkge1xuXHRcdFx0XHRkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXG5cdFx0XHQvLyBCdXQgc3RpbGwga2VlcCB0cmFjayBvZiBpdCBvdGhlcndpc2Vcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGV4dHJhICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cblx0XHQvLyBJZiB3ZSBnZXQgaGVyZSB3aXRoIGEgYm9yZGVyLWJveCAoY29udGVudCArIHBhZGRpbmcgKyBib3JkZXIpLCB3ZSdyZSBzZWVraW5nIFwiY29udGVudFwiIG9yXG5cdFx0Ly8gXCJwYWRkaW5nXCIgb3IgXCJtYXJnaW5cIlxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIEZvciBcImNvbnRlbnRcIiwgc3VidHJhY3QgcGFkZGluZ1xuXHRcdFx0aWYgKCBib3ggPT09IFwiY29udGVudFwiICkge1xuXHRcdFx0XHRkZWx0YSAtPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBhZGRpbmdcIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRm9yIFwiY29udGVudFwiIG9yIFwicGFkZGluZ1wiLCBzdWJ0cmFjdCBib3JkZXJcblx0XHRcdGlmICggYm94ICE9PSBcIm1hcmdpblwiICkge1xuXHRcdFx0XHRkZWx0YSAtPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEFjY291bnQgZm9yIHBvc2l0aXZlIGNvbnRlbnQtYm94IHNjcm9sbCBndXR0ZXIgd2hlbiByZXF1ZXN0ZWQgYnkgcHJvdmlkaW5nIGNvbXB1dGVkVmFsXG5cdGlmICggIWlzQm9yZGVyQm94ICYmIGNvbXB1dGVkVmFsID49IDAgKSB7XG5cblx0XHQvLyBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgaXMgYSByb3VuZGVkIHN1bSBvZiBjb250ZW50LCBwYWRkaW5nLCBzY3JvbGwgZ3V0dGVyLCBhbmQgYm9yZGVyXG5cdFx0Ly8gQXNzdW1pbmcgaW50ZWdlciBzY3JvbGwgZ3V0dGVyLCBzdWJ0cmFjdCB0aGUgcmVzdCBhbmQgcm91bmQgZG93blxuXHRcdGRlbHRhICs9IE1hdGgubWF4KCAwLCBNYXRoLmNlaWwoXG5cdFx0XHRlbGVtWyBcIm9mZnNldFwiICsgZGltZW5zaW9uWyAwIF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSggMSApIF0gLVxuXHRcdFx0Y29tcHV0ZWRWYWwgLVxuXHRcdFx0ZGVsdGEgLVxuXHRcdFx0ZXh0cmEgLVxuXHRcdFx0MC41XG5cblx0XHQvLyBJZiBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgaXMgdW5rbm93biwgdGhlbiB3ZSBjYW4ndCBkZXRlcm1pbmUgY29udGVudC1ib3ggc2Nyb2xsIGd1dHRlclxuXHRcdC8vIFVzZSBhbiBleHBsaWNpdCB6ZXJvIHRvIGF2b2lkIE5hTiAoZ2gtMzk2NClcblx0XHQpICkgfHwgMDtcblx0fVxuXG5cdHJldHVybiBkZWx0YTtcbn1cblxuZnVuY3Rpb24gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApIHtcblxuXHQvLyBTdGFydCB3aXRoIGNvbXB1dGVkIHN0eWxlXG5cdHZhciBzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKSxcblxuXHRcdC8vIFRvIGF2b2lkIGZvcmNpbmcgYSByZWZsb3csIG9ubHkgZmV0Y2ggYm94U2l6aW5nIGlmIHdlIG5lZWQgaXQgKGdoLTQzMjIpLlxuXHRcdC8vIEZha2UgY29udGVudC1ib3ggdW50aWwgd2Uga25vdyBpdCdzIG5lZWRlZCB0byBrbm93IHRoZSB0cnVlIHZhbHVlLlxuXHRcdGJveFNpemluZ05lZWRlZCA9ICFzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgfHwgZXh0cmEsXG5cdFx0aXNCb3JkZXJCb3ggPSBib3hTaXppbmdOZWVkZWQgJiZcblx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCIsXG5cdFx0dmFsdWVJc0JvcmRlckJveCA9IGlzQm9yZGVyQm94LFxuXG5cdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBkaW1lbnNpb24sIHN0eWxlcyApLFxuXHRcdG9mZnNldFByb3AgPSBcIm9mZnNldFwiICsgZGltZW5zaW9uWyAwIF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSggMSApO1xuXG5cdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD01NFxuXHQvLyBSZXR1cm4gYSBjb25mb3VuZGluZyBub24tcGl4ZWwgdmFsdWUgb3IgZmVpZ24gaWdub3JhbmNlLCBhcyBhcHByb3ByaWF0ZS5cblx0aWYgKCBybnVtbm9ucHgudGVzdCggdmFsICkgKSB7XG5cdFx0aWYgKCAhZXh0cmEgKSB7XG5cdFx0XHRyZXR1cm4gdmFsO1xuXHRcdH1cblx0XHR2YWwgPSBcImF1dG9cIjtcblx0fVxuXG5cblx0Ly8gU3VwcG9ydDogSUUgOSAtIDExIG9ubHlcblx0Ly8gVXNlIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBmb3Igd2hlbiBib3ggc2l6aW5nIGlzIHVucmVsaWFibGUuXG5cdC8vIEluIHRob3NlIGNhc2VzLCB0aGUgY29tcHV0ZWQgdmFsdWUgY2FuIGJlIHRydXN0ZWQgdG8gYmUgYm9yZGVyLWJveC5cblx0aWYgKCAoICFzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgJiYgaXNCb3JkZXJCb3ggfHxcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDEwIC0gMTErLCBFZGdlIDE1IC0gMTgrXG5cdFx0Ly8gSUUvRWRnZSBtaXNyZXBvcnQgYGdldENvbXB1dGVkU3R5bGVgIG9mIHRhYmxlIHJvd3Mgd2l0aCB3aWR0aC9oZWlnaHRcblx0XHQvLyBzZXQgaW4gQ1NTIHdoaWxlIGBvZmZzZXQqYCBwcm9wZXJ0aWVzIHJlcG9ydCBjb3JyZWN0IHZhbHVlcy5cblx0XHQvLyBJbnRlcmVzdGluZ2x5LCBpbiBzb21lIGNhc2VzIElFIDkgZG9lc24ndCBzdWZmZXIgZnJvbSB0aGlzIGlzc3VlLlxuXHRcdCFzdXBwb3J0LnJlbGlhYmxlVHJEaW1lbnNpb25zKCkgJiYgbm9kZU5hbWUoIGVsZW0sIFwidHJcIiApIHx8XG5cblx0XHQvLyBGYWxsIGJhY2sgdG8gb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IHdoZW4gdmFsdWUgaXMgXCJhdXRvXCJcblx0XHQvLyBUaGlzIGhhcHBlbnMgZm9yIGlubGluZSBlbGVtZW50cyB3aXRoIG5vIGV4cGxpY2l0IHNldHRpbmcgKGdoLTM1NzEpXG5cdFx0dmFsID09PSBcImF1dG9cIiB8fFxuXG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMSAtIDQuMyBvbmx5XG5cdFx0Ly8gQWxzbyB1c2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciBtaXNyZXBvcnRlZCBpbmxpbmUgZGltZW5zaW9ucyAoZ2gtMzYwMilcblx0XHQhcGFyc2VGbG9hdCggdmFsICkgJiYgalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJpbmxpbmVcIiApICYmXG5cblx0XHQvLyBNYWtlIHN1cmUgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSAmIGNvbm5lY3RlZFxuXHRcdGVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7XG5cblx0XHRpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCI7XG5cblx0XHQvLyBXaGVyZSBhdmFpbGFibGUsIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBhcHByb3hpbWF0ZSBib3JkZXIgYm94IGRpbWVuc2lvbnMuXG5cdFx0Ly8gV2hlcmUgbm90IGF2YWlsYWJsZSAoZS5nLiwgU1ZHKSwgYXNzdW1lIHVucmVsaWFibGUgYm94LXNpemluZyBhbmQgaW50ZXJwcmV0IHRoZVxuXHRcdC8vIHJldHJpZXZlZCB2YWx1ZSBhcyBhIGNvbnRlbnQgYm94IGRpbWVuc2lvbi5cblx0XHR2YWx1ZUlzQm9yZGVyQm94ID0gb2Zmc2V0UHJvcCBpbiBlbGVtO1xuXHRcdGlmICggdmFsdWVJc0JvcmRlckJveCApIHtcblx0XHRcdHZhbCA9IGVsZW1bIG9mZnNldFByb3AgXTtcblx0XHR9XG5cdH1cblxuXHQvLyBOb3JtYWxpemUgXCJcIiBhbmQgYXV0b1xuXHR2YWwgPSBwYXJzZUZsb2F0KCB2YWwgKSB8fCAwO1xuXG5cdC8vIEFkanVzdCBmb3IgdGhlIGVsZW1lbnQncyBib3ggbW9kZWxcblx0cmV0dXJuICggdmFsICtcblx0XHRib3hNb2RlbEFkanVzdG1lbnQoXG5cdFx0XHRlbGVtLFxuXHRcdFx0ZGltZW5zaW9uLFxuXHRcdFx0ZXh0cmEgfHwgKCBpc0JvcmRlckJveCA/IFwiYm9yZGVyXCIgOiBcImNvbnRlbnRcIiApLFxuXHRcdFx0dmFsdWVJc0JvcmRlckJveCxcblx0XHRcdHN0eWxlcyxcblxuXHRcdFx0Ly8gUHJvdmlkZSB0aGUgY3VycmVudCBjb21wdXRlZCBzaXplIHRvIHJlcXVlc3Qgc2Nyb2xsIGd1dHRlciBjYWxjdWxhdGlvbiAoZ2gtMzU4OSlcblx0XHRcdHZhbFxuXHRcdClcblx0KSArIFwicHhcIjtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIEFkZCBpbiBzdHlsZSBwcm9wZXJ0eSBob29rcyBmb3Igb3ZlcnJpZGluZyB0aGUgZGVmYXVsdFxuXHQvLyBiZWhhdmlvciBvZiBnZXR0aW5nIGFuZCBzZXR0aW5nIGEgc3R5bGUgcHJvcGVydHlcblx0Y3NzSG9va3M6IHtcblx0XHRvcGFjaXR5OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRcdFx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdFx0XHRcdC8vIFdlIHNob3VsZCBhbHdheXMgZ2V0IGEgbnVtYmVyIGJhY2sgZnJvbSBvcGFjaXR5XG5cdFx0XHRcdFx0dmFyIHJldCA9IGN1ckNTUyggZWxlbSwgXCJvcGFjaXR5XCIgKTtcblx0XHRcdFx0XHRyZXR1cm4gcmV0ID09PSBcIlwiID8gXCIxXCIgOiByZXQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0Ly8gRG9uJ3QgYXV0b21hdGljYWxseSBhZGQgXCJweFwiIHRvIHRoZXNlIHBvc3NpYmx5LXVuaXRsZXNzIHByb3BlcnRpZXNcblx0Y3NzTnVtYmVyOiB7XG5cdFx0XCJhbmltYXRpb25JdGVyYXRpb25Db3VudFwiOiB0cnVlLFxuXHRcdFwiY29sdW1uQ291bnRcIjogdHJ1ZSxcblx0XHRcImZpbGxPcGFjaXR5XCI6IHRydWUsXG5cdFx0XCJmbGV4R3Jvd1wiOiB0cnVlLFxuXHRcdFwiZmxleFNocmlua1wiOiB0cnVlLFxuXHRcdFwiZm9udFdlaWdodFwiOiB0cnVlLFxuXHRcdFwiZ3JpZEFyZWFcIjogdHJ1ZSxcblx0XHRcImdyaWRDb2x1bW5cIjogdHJ1ZSxcblx0XHRcImdyaWRDb2x1bW5FbmRcIjogdHJ1ZSxcblx0XHRcImdyaWRDb2x1bW5TdGFydFwiOiB0cnVlLFxuXHRcdFwiZ3JpZFJvd1wiOiB0cnVlLFxuXHRcdFwiZ3JpZFJvd0VuZFwiOiB0cnVlLFxuXHRcdFwiZ3JpZFJvd1N0YXJ0XCI6IHRydWUsXG5cdFx0XCJsaW5lSGVpZ2h0XCI6IHRydWUsXG5cdFx0XCJvcGFjaXR5XCI6IHRydWUsXG5cdFx0XCJvcmRlclwiOiB0cnVlLFxuXHRcdFwib3JwaGFuc1wiOiB0cnVlLFxuXHRcdFwid2lkb3dzXCI6IHRydWUsXG5cdFx0XCJ6SW5kZXhcIjogdHJ1ZSxcblx0XHRcInpvb21cIjogdHJ1ZVxuXHR9LFxuXG5cdC8vIEFkZCBpbiBwcm9wZXJ0aWVzIHdob3NlIG5hbWVzIHlvdSB3aXNoIHRvIGZpeCBiZWZvcmVcblx0Ly8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZVxuXHRjc3NQcm9wczoge30sXG5cblx0Ly8gR2V0IGFuZCBzZXQgdGhlIHN0eWxlIHByb3BlcnR5IG9uIGEgRE9NIE5vZGVcblx0c3R5bGU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSwgZXh0cmEgKSB7XG5cblx0XHQvLyBEb24ndCBzZXQgc3R5bGVzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXNcblx0XHRpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhZWxlbS5zdHlsZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWVcblx0XHR2YXIgcmV0LCB0eXBlLCBob29rcyxcblx0XHRcdG9yaWdOYW1lID0gY2FtZWxDYXNlKCBuYW1lICksXG5cdFx0XHRpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICksXG5cdFx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUuIFdlIGRvbid0XG5cdFx0Ly8gd2FudCB0byBxdWVyeSB0aGUgdmFsdWUgaWYgaXQgaXMgYSBDU1MgY3VzdG9tIHByb3BlcnR5XG5cdFx0Ly8gc2luY2UgdGhleSBhcmUgdXNlci1kZWZpbmVkLlxuXHRcdGlmICggIWlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdG5hbWUgPSBmaW5hbFByb3BOYW1lKCBvcmlnTmFtZSApO1xuXHRcdH1cblxuXHRcdC8vIEdldHMgaG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb24sIHRoZW4gdW5wcmVmaXhlZCB2ZXJzaW9uXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07XG5cblx0XHQvLyBDaGVjayBpZiB3ZSdyZSBzZXR0aW5nIGEgdmFsdWVcblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR0eXBlID0gdHlwZW9mIHZhbHVlO1xuXG5cdFx0XHQvLyBDb252ZXJ0IFwiKz1cIiBvciBcIi09XCIgdG8gcmVsYXRpdmUgbnVtYmVycyAoIzczNDUpXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwic3RyaW5nXCIgJiYgKCByZXQgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJiByZXRbIDEgXSApIHtcblx0XHRcdFx0dmFsdWUgPSBhZGp1c3RDU1MoIGVsZW0sIG5hbWUsIHJldCApO1xuXG5cdFx0XHRcdC8vIEZpeGVzIGJ1ZyAjOTIzN1xuXHRcdFx0XHR0eXBlID0gXCJudW1iZXJcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0ICgjNzExNilcblx0XHRcdGlmICggdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSAhPT0gdmFsdWUgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkIHRoZSB1bml0IChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpXG5cdFx0XHQvLyBUaGUgaXNDdXN0b21Qcm9wIGNoZWNrIGNhbiBiZSByZW1vdmVkIGluIGpRdWVyeSA0LjAgd2hlbiB3ZSBvbmx5IGF1dG8tYXBwZW5kXG5cdFx0XHQvLyBcInB4XCIgdG8gYSBmZXcgaGFyZGNvZGVkIHZhbHVlcy5cblx0XHRcdGlmICggdHlwZSA9PT0gXCJudW1iZXJcIiAmJiAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0XHR2YWx1ZSArPSByZXQgJiYgcmV0WyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdID8gXCJcIiA6IFwicHhcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBiYWNrZ3JvdW5kLSogcHJvcHMgYWZmZWN0IG9yaWdpbmFsIGNsb25lJ3MgdmFsdWVzXG5cdFx0XHRpZiAoICFzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSAmJiB2YWx1ZSA9PT0gXCJcIiAmJiBuYW1lLmluZGV4T2YoIFwiYmFja2dyb3VuZFwiICkgPT09IDAgKSB7XG5cdFx0XHRcdHN0eWxlWyBuYW1lIF0gPSBcImluaGVyaXRcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCwgdXNlIHRoYXQgdmFsdWUsIG90aGVyd2lzZSBqdXN0IHNldCB0aGUgc3BlY2lmaWVkIHZhbHVlXG5cdFx0XHRpZiAoICFob29rcyB8fCAhKCBcInNldFwiIGluIGhvb2tzICkgfHxcblx0XHRcdFx0KCB2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGlmICggaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0XHRcdHN0eWxlLnNldFByb3BlcnR5KCBuYW1lLCB2YWx1ZSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN0eWxlWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlXG5cdFx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5nZXQoIGVsZW0sIGZhbHNlLCBleHRyYSApICkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdGhlcndpc2UganVzdCBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIHN0eWxlIG9iamVjdFxuXHRcdFx0cmV0dXJuIHN0eWxlWyBuYW1lIF07XG5cdFx0fVxuXHR9LFxuXG5cdGNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhLCBzdHlsZXMgKSB7XG5cdFx0dmFyIHZhbCwgbnVtLCBob29rcyxcblx0XHRcdG9yaWdOYW1lID0gY2FtZWxDYXNlKCBuYW1lICksXG5cdFx0XHRpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICk7XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUuIFdlIGRvbid0XG5cdFx0Ly8gd2FudCB0byBtb2RpZnkgdGhlIHZhbHVlIGlmIGl0IGlzIGEgQ1NTIGN1c3RvbSBwcm9wZXJ0eVxuXHRcdC8vIHNpbmNlIHRoZXkgYXJlIHVzZXItZGVmaW5lZC5cblx0XHRpZiAoICFpc0N1c3RvbVByb3AgKSB7XG5cdFx0XHRuYW1lID0gZmluYWxQcm9wTmFtZSggb3JpZ05hbWUgKTtcblx0XHR9XG5cblx0XHQvLyBUcnkgcHJlZml4ZWQgbmFtZSBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCBuYW1lXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07XG5cblx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbCA9IGhvb2tzLmdldCggZWxlbSwgdHJ1ZSwgZXh0cmEgKTtcblx0XHR9XG5cblx0XHQvLyBPdGhlcndpc2UsIGlmIGEgd2F5IHRvIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZXhpc3RzLCB1c2UgdGhhdFxuXHRcdGlmICggdmFsID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdC8vIENvbnZlcnQgXCJub3JtYWxcIiB0byBjb21wdXRlZCB2YWx1ZVxuXHRcdGlmICggdmFsID09PSBcIm5vcm1hbFwiICYmIG5hbWUgaW4gY3NzTm9ybWFsVHJhbnNmb3JtICkge1xuXHRcdFx0dmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBudW1lcmljIGlmIGZvcmNlZCBvciBhIHF1YWxpZmllciB3YXMgcHJvdmlkZWQgYW5kIHZhbCBsb29rcyBudW1lcmljXG5cdFx0aWYgKCBleHRyYSA9PT0gXCJcIiB8fCBleHRyYSApIHtcblx0XHRcdG51bSA9IHBhcnNlRmxvYXQoIHZhbCApO1xuXHRcdFx0cmV0dXJuIGV4dHJhID09PSB0cnVlIHx8IGlzRmluaXRlKCBudW0gKSA/IG51bSB8fCAwIDogdmFsO1xuXHRcdH1cblxuXHRcdHJldHVybiB2YWw7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIFsgXCJoZWlnaHRcIiwgXCJ3aWR0aFwiIF0sIGZ1bmN0aW9uKCBfaSwgZGltZW5zaW9uICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIGRpbWVuc2lvbiBdID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHtcblx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0Ly8gQ2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtXG5cdFx0XHRcdC8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0XG5cdFx0XHRcdHJldHVybiByZGlzcGxheXN3YXAudGVzdCggalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSApICYmXG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgOCtcblx0XHRcdFx0XHQvLyBUYWJsZSBjb2x1bW5zIGluIFNhZmFyaSBoYXZlIG5vbi16ZXJvIG9mZnNldFdpZHRoICYgemVyb1xuXHRcdFx0XHRcdC8vIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIHVubGVzcyBkaXNwbGF5IGlzIGNoYW5nZWQuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdFx0XHRcdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYSBkaXNjb25uZWN0ZWQgbm9kZVxuXHRcdFx0XHRcdC8vIGluIElFIHRocm93cyBhbiBlcnJvci5cblx0XHRcdFx0XHQoICFlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoIHx8ICFlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICkgP1xuXHRcdFx0XHRcdHN3YXAoIGVsZW0sIGNzc1Nob3csIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKTtcblx0XHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRcdGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIGV4dHJhICkge1xuXHRcdFx0dmFyIG1hdGNoZXMsXG5cdFx0XHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLFxuXG5cdFx0XHRcdC8vIE9ubHkgcmVhZCBzdHlsZXMucG9zaXRpb24gaWYgdGhlIHRlc3QgaGFzIGEgY2hhbmNlIHRvIGZhaWxcblx0XHRcdFx0Ly8gdG8gYXZvaWQgZm9yY2luZyBhIHJlZmxvdy5cblx0XHRcdFx0c2Nyb2xsYm94U2l6ZUJ1Z2d5ID0gIXN1cHBvcnQuc2Nyb2xsYm94U2l6ZSgpICYmXG5cdFx0XHRcdFx0c3R5bGVzLnBvc2l0aW9uID09PSBcImFic29sdXRlXCIsXG5cblx0XHRcdFx0Ly8gVG8gYXZvaWQgZm9yY2luZyBhIHJlZmxvdywgb25seSBmZXRjaCBib3hTaXppbmcgaWYgd2UgbmVlZCBpdCAoZ2gtMzk5MSlcblx0XHRcdFx0Ym94U2l6aW5nTmVlZGVkID0gc2Nyb2xsYm94U2l6ZUJ1Z2d5IHx8IGV4dHJhLFxuXHRcdFx0XHRpc0JvcmRlckJveCA9IGJveFNpemluZ05lZWRlZCAmJlxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCIsXG5cdFx0XHRcdHN1YnRyYWN0ID0gZXh0cmEgP1xuXHRcdFx0XHRcdGJveE1vZGVsQWRqdXN0bWVudChcblx0XHRcdFx0XHRcdGVsZW0sXG5cdFx0XHRcdFx0XHRkaW1lbnNpb24sXG5cdFx0XHRcdFx0XHRleHRyYSxcblx0XHRcdFx0XHRcdGlzQm9yZGVyQm94LFxuXHRcdFx0XHRcdFx0c3R5bGVzXG5cdFx0XHRcdFx0KSA6XG5cdFx0XHRcdFx0MDtcblxuXHRcdFx0Ly8gQWNjb3VudCBmb3IgdW5yZWxpYWJsZSBib3JkZXItYm94IGRpbWVuc2lvbnMgYnkgY29tcGFyaW5nIG9mZnNldCogdG8gY29tcHV0ZWQgYW5kXG5cdFx0XHQvLyBmYWtpbmcgYSBjb250ZW50LWJveCB0byBnZXQgYm9yZGVyIGFuZCBwYWRkaW5nIChnaC0zNjk5KVxuXHRcdFx0aWYgKCBpc0JvcmRlckJveCAmJiBzY3JvbGxib3hTaXplQnVnZ3kgKSB7XG5cdFx0XHRcdHN1YnRyYWN0IC09IE1hdGguY2VpbChcblx0XHRcdFx0XHRlbGVtWyBcIm9mZnNldFwiICsgZGltZW5zaW9uWyAwIF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSggMSApIF0gLVxuXHRcdFx0XHRcdHBhcnNlRmxvYXQoIHN0eWxlc1sgZGltZW5zaW9uIF0gKSAtXG5cdFx0XHRcdFx0Ym94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIFwiYm9yZGVyXCIsIGZhbHNlLCBzdHlsZXMgKSAtXG5cdFx0XHRcdFx0MC41XG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnZlcnQgdG8gcGl4ZWxzIGlmIHZhbHVlIGFkanVzdG1lbnQgaXMgbmVlZGVkXG5cdFx0XHRpZiAoIHN1YnRyYWN0ICYmICggbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmXG5cdFx0XHRcdCggbWF0Y2hlc1sgMyBdIHx8IFwicHhcIiApICE9PSBcInB4XCIgKSB7XG5cblx0XHRcdFx0ZWxlbS5zdHlsZVsgZGltZW5zaW9uIF0gPSB2YWx1ZTtcblx0XHRcdFx0dmFsdWUgPSBqUXVlcnkuY3NzKCBlbGVtLCBkaW1lbnNpb24gKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKTtcblx0XHR9XG5cdH07XG59ICk7XG5cbmpRdWVyeS5jc3NIb29rcy5tYXJnaW5MZWZ0ID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnJlbGlhYmxlTWFyZ2luTGVmdCxcblx0ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4gKCBwYXJzZUZsb2F0KCBjdXJDU1MoIGVsZW0sIFwibWFyZ2luTGVmdFwiICkgKSB8fFxuXHRcdFx0XHRlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLVxuXHRcdFx0XHRcdHN3YXAoIGVsZW0sIHsgbWFyZ2luTGVmdDogMCB9LCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG5cdFx0XHRcdFx0fSApXG5cdFx0XHQpICsgXCJweFwiO1xuXHRcdH1cblx0fVxuKTtcblxuLy8gVGhlc2UgaG9va3MgYXJlIHVzZWQgYnkgYW5pbWF0ZSB0byBleHBhbmQgcHJvcGVydGllc1xualF1ZXJ5LmVhY2goIHtcblx0bWFyZ2luOiBcIlwiLFxuXHRwYWRkaW5nOiBcIlwiLFxuXHRib3JkZXI6IFwiV2lkdGhcIlxufSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdID0ge1xuXHRcdGV4cGFuZDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0dmFyIGkgPSAwLFxuXHRcdFx0XHRleHBhbmRlZCA9IHt9LFxuXG5cdFx0XHRcdC8vIEFzc3VtZXMgYSBzaW5nbGUgbnVtYmVyIGlmIG5vdCBhIHN0cmluZ1xuXHRcdFx0XHRwYXJ0cyA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlLnNwbGl0KCBcIiBcIiApIDogWyB2YWx1ZSBdO1xuXG5cdFx0XHRmb3IgKCA7IGkgPCA0OyBpKysgKSB7XG5cdFx0XHRcdGV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID1cblx0XHRcdFx0XHRwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBleHBhbmRlZDtcblx0XHR9XG5cdH07XG5cblx0aWYgKCBwcmVmaXggIT09IFwibWFyZ2luXCIgKSB7XG5cdFx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXS5zZXQgPSBzZXRQb3NpdGl2ZU51bWJlcjtcblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGNzczogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcblx0XHRcdHZhciBzdHlsZXMsIGxlbixcblx0XHRcdFx0bWFwID0ge30sXG5cdFx0XHRcdGkgPSAwO1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG5hbWUgKSApIHtcblx0XHRcdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICk7XG5cdFx0XHRcdGxlbiA9IG5hbWUubGVuZ3RoO1xuXG5cdFx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRcdG1hcFsgbmFtZVsgaSBdIF0gPSBqUXVlcnkuY3NzKCBlbGVtLCBuYW1lWyBpIF0sIGZhbHNlLCBzdHlsZXMgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBtYXA7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lLCB2YWx1ZSApIDpcblx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApO1xuXHRcdH0sIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9XG59ICk7XG5cblxuZnVuY3Rpb24gVHdlZW4oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICkge1xuXHRyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApO1xufVxualF1ZXJ5LlR3ZWVuID0gVHdlZW47XG5cblR3ZWVuLnByb3RvdHlwZSA9IHtcblx0Y29uc3RydWN0b3I6IFR3ZWVuLFxuXHRpbml0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcsIHVuaXQgKSB7XG5cdFx0dGhpcy5lbGVtID0gZWxlbTtcblx0XHR0aGlzLnByb3AgPSBwcm9wO1xuXHRcdHRoaXMuZWFzaW5nID0gZWFzaW5nIHx8IGpRdWVyeS5lYXNpbmcuX2RlZmF1bHQ7XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0XHR0aGlzLnN0YXJ0ID0gdGhpcy5ub3cgPSB0aGlzLmN1cigpO1xuXHRcdHRoaXMuZW5kID0gZW5kO1xuXHRcdHRoaXMudW5pdCA9IHVuaXQgfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyBcIlwiIDogXCJweFwiICk7XG5cdH0sXG5cdGN1cjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTtcblxuXHRcdHJldHVybiBob29rcyAmJiBob29rcy5nZXQgP1xuXHRcdFx0aG9va3MuZ2V0KCB0aGlzICkgOlxuXHRcdFx0VHdlZW4ucHJvcEhvb2tzLl9kZWZhdWx0LmdldCggdGhpcyApO1xuXHR9LFxuXHRydW46IGZ1bmN0aW9uKCBwZXJjZW50ICkge1xuXHRcdHZhciBlYXNlZCxcblx0XHRcdGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTtcblxuXHRcdGlmICggdGhpcy5vcHRpb25zLmR1cmF0aW9uICkge1xuXHRcdFx0dGhpcy5wb3MgPSBlYXNlZCA9IGpRdWVyeS5lYXNpbmdbIHRoaXMuZWFzaW5nIF0oXG5cdFx0XHRcdHBlcmNlbnQsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiAqIHBlcmNlbnQsIDAsIDEsIHRoaXMub3B0aW9ucy5kdXJhdGlvblxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5wb3MgPSBlYXNlZCA9IHBlcmNlbnQ7XG5cdFx0fVxuXHRcdHRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVhc2VkICsgdGhpcy5zdGFydDtcblxuXHRcdGlmICggdGhpcy5vcHRpb25zLnN0ZXAgKSB7XG5cdFx0XHR0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKCB0aGlzLmVsZW0sIHRoaXMubm93LCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBob29rcyAmJiBob29rcy5zZXQgKSB7XG5cdFx0XHRob29rcy5zZXQoIHRoaXMgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0VHdlZW4ucHJvcEhvb2tzLl9kZWZhdWx0LnNldCggdGhpcyApO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxufTtcblxuVHdlZW4ucHJvdG90eXBlLmluaXQucHJvdG90eXBlID0gVHdlZW4ucHJvdG90eXBlO1xuXG5Ud2Vlbi5wcm9wSG9va3MgPSB7XG5cdF9kZWZhdWx0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XG5cdFx0XHR2YXIgcmVzdWx0O1xuXG5cdFx0XHQvLyBVc2UgYSBwcm9wZXJ0eSBvbiB0aGUgZWxlbWVudCBkaXJlY3RseSB3aGVuIGl0IGlzIG5vdCBhIERPTSBlbGVtZW50LFxuXHRcdFx0Ly8gb3Igd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyBzdHlsZSBwcm9wZXJ0eSB0aGF0IGV4aXN0cy5cblx0XHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAhPT0gMSB8fFxuXHRcdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gIT0gbnVsbCAmJiB0d2Vlbi5lbGVtLnN0eWxlWyB0d2Vlbi5wcm9wIF0gPT0gbnVsbCApIHtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUGFzc2luZyBhbiBlbXB0eSBzdHJpbmcgYXMgYSAzcmQgcGFyYW1ldGVyIHRvIC5jc3Mgd2lsbCBhdXRvbWF0aWNhbGx5XG5cdFx0XHQvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzLlxuXHRcdFx0Ly8gU2ltcGxlIHZhbHVlcyBzdWNoIGFzIFwiMTBweFwiIGFyZSBwYXJzZWQgdG8gRmxvYXQ7XG5cdFx0XHQvLyBjb21wbGV4IHZhbHVlcyBzdWNoIGFzIFwicm90YXRlKDFyYWQpXCIgYXJlIHJldHVybmVkIGFzLWlzLlxuXHRcdFx0cmVzdWx0ID0galF1ZXJ5LmNzcyggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgXCJcIiApO1xuXG5cdFx0XHQvLyBFbXB0eSBzdHJpbmdzLCBudWxsLCB1bmRlZmluZWQgYW5kIFwiYXV0b1wiIGFyZSBjb252ZXJ0ZWQgdG8gMC5cblx0XHRcdHJldHVybiAhcmVzdWx0IHx8IHJlc3VsdCA9PT0gXCJhdXRvXCIgPyAwIDogcmVzdWx0O1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XG5cblx0XHRcdC8vIFVzZSBzdGVwIGhvb2sgZm9yIGJhY2sgY29tcGF0LlxuXHRcdFx0Ly8gVXNlIGNzc0hvb2sgaWYgaXRzIHRoZXJlLlxuXHRcdFx0Ly8gVXNlIC5zdHlsZSBpZiBhdmFpbGFibGUgYW5kIHVzZSBwbGFpbiBwcm9wZXJ0aWVzIHdoZXJlIGF2YWlsYWJsZS5cblx0XHRcdGlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSApIHtcblx0XHRcdFx0alF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSggdHdlZW4gKTtcblx0XHRcdH0gZWxzZSBpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKFxuXHRcdFx0XHRqUXVlcnkuY3NzSG9va3NbIHR3ZWVuLnByb3AgXSB8fFxuXHRcdFx0XHRcdHR3ZWVuLmVsZW0uc3R5bGVbIGZpbmFsUHJvcE5hbWUoIHR3ZWVuLnByb3AgKSBdICE9IG51bGwgKSApIHtcblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCB0d2Vlbi5ub3cgKyB0d2Vlbi51bml0ICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzXG5Ud2Vlbi5wcm9wSG9va3Muc2Nyb2xsVG9wID0gVHdlZW4ucHJvcEhvb2tzLnNjcm9sbExlZnQgPSB7XG5cdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZWFzaW5nID0ge1xuXHRsaW5lYXI6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiBwO1xuXHR9LFxuXHRzd2luZzogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjtcblx0fSxcblx0X2RlZmF1bHQ6IFwic3dpbmdcIlxufTtcblxualF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7XG5cbi8vIEJhY2sgY29tcGF0IDwxLjggZXh0ZW5zaW9uIHBvaW50XG5qUXVlcnkuZnguc3RlcCA9IHt9O1xuXG5cblxuXG52YXJcblx0ZnhOb3csIGluUHJvZ3Jlc3MsXG5cdHJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLFxuXHRycnVuID0gL3F1ZXVlSG9va3MkLztcblxuZnVuY3Rpb24gc2NoZWR1bGUoKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHtcblx0XHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIHNjaGVkdWxlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBzY2hlZHVsZSwgalF1ZXJ5LmZ4LmludGVydmFsICk7XG5cdFx0fVxuXG5cdFx0alF1ZXJ5LmZ4LnRpY2soKTtcblx0fVxufVxuXG4vLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5XG5mdW5jdGlvbiBjcmVhdGVGeE5vdygpIHtcblx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdGZ4Tm93ID0gdW5kZWZpbmVkO1xuXHR9ICk7XG5cdHJldHVybiAoIGZ4Tm93ID0gRGF0ZS5ub3coKSApO1xufVxuXG4vLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvblxuZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGluY2x1ZGVXaWR0aCApIHtcblx0dmFyIHdoaWNoLFxuXHRcdGkgPSAwLFxuXHRcdGF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTtcblxuXHQvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsXG5cdC8vIG90aGVyd2lzZSBzdGVwIHZhbHVlIGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0XG5cdGluY2x1ZGVXaWR0aCA9IGluY2x1ZGVXaWR0aCA/IDEgOiAwO1xuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7XG5cdFx0d2hpY2ggPSBjc3NFeHBhbmRbIGkgXTtcblx0XHRhdHRyc1sgXCJtYXJnaW5cIiArIHdoaWNoIF0gPSBhdHRyc1sgXCJwYWRkaW5nXCIgKyB3aGljaCBdID0gdHlwZTtcblx0fVxuXG5cdGlmICggaW5jbHVkZVdpZHRoICkge1xuXHRcdGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7XG5cdH1cblxuXHRyZXR1cm4gYXR0cnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVR3ZWVuKCB2YWx1ZSwgcHJvcCwgYW5pbWF0aW9uICkge1xuXHR2YXIgdHdlZW4sXG5cdFx0Y29sbGVjdGlvbiA9ICggQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW10gKS5jb25jYXQoIEFuaW1hdGlvbi50d2VlbmVyc1sgXCIqXCIgXSApLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRpZiAoICggdHdlZW4gPSBjb2xsZWN0aW9uWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgcHJvcCwgdmFsdWUgKSApICkge1xuXG5cdFx0XHQvLyBXZSdyZSBkb25lIHdpdGggdGhpcyBwcm9wZXJ0eVxuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0UHJlZmlsdGVyKCBlbGVtLCBwcm9wcywgb3B0cyApIHtcblx0dmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LFxuXHRcdGlzQm94ID0gXCJ3aWR0aFwiIGluIHByb3BzIHx8IFwiaGVpZ2h0XCIgaW4gcHJvcHMsXG5cdFx0YW5pbSA9IHRoaXMsXG5cdFx0b3JpZyA9IHt9LFxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZSxcblx0XHRoaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApLFxuXHRcdGRhdGFTaG93ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cblx0Ly8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzXG5cdGlmICggIW9wdHMucXVldWUgKSB7XG5cdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIFwiZnhcIiApO1xuXHRcdGlmICggaG9va3MudW5xdWV1ZWQgPT0gbnVsbCApIHtcblx0XHRcdGhvb2tzLnVucXVldWVkID0gMDtcblx0XHRcdG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlO1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICFob29rcy51bnF1ZXVlZCApIHtcblx0XHRcdFx0XHRvbGRmaXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdGhvb2tzLnVucXVldWVkKys7XG5cblx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzXG5cdFx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGhvb2tzLnVucXVldWVkLS07XG5cdFx0XHRcdGlmICggIWpRdWVyeS5xdWV1ZSggZWxlbSwgXCJmeFwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRmb3IgKCBwcm9wIGluIHByb3BzICkge1xuXHRcdHZhbHVlID0gcHJvcHNbIHByb3AgXTtcblx0XHRpZiAoIHJmeHR5cGVzLnRlc3QoIHZhbHVlICkgKSB7XG5cdFx0XHRkZWxldGUgcHJvcHNbIHByb3AgXTtcblx0XHRcdHRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gXCJ0b2dnbGVcIjtcblx0XHRcdGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gXCJoaWRlXCIgOiBcInNob3dcIiApICkge1xuXG5cdFx0XHRcdC8vIFByZXRlbmQgdG8gYmUgaGlkZGVuIGlmIHRoaXMgaXMgYSBcInNob3dcIiBhbmRcblx0XHRcdFx0Ly8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGVcblx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gXCJzaG93XCIgJiYgZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGhpZGRlbiA9IHRydWU7XG5cblx0XHRcdFx0Ly8gSWdub3JlIGFsbCBvdGhlciBuby1vcCBzaG93L2hpZGUgZGF0YVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvcmlnWyBwcm9wIF0gPSBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpXG5cdHByb3BUd2VlbiA9ICFqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcHMgKTtcblx0aWYgKCAhcHJvcFR3ZWVuICYmIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gUmVzdHJpY3QgXCJvdmVyZmxvd1wiIGFuZCBcImRpc3BsYXlcIiBzdHlsZXMgZHVyaW5nIGJveCBhbmltYXRpb25zXG5cdGlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExLCBFZGdlIDEyIC0gMTVcblx0XHQvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFIGRvZXMgbm90IGluZmVyIHRoZSBzaG9ydGhhbmRcblx0XHQvLyBmcm9tIGlkZW50aWNhbGx5LXZhbHVlZCBvdmVyZmxvd1ggYW5kIG92ZXJmbG93WSBhbmQgRWRnZSBqdXN0IG1pcnJvcnNcblx0XHQvLyB0aGUgb3ZlcmZsb3dYIHZhbHVlIHRoZXJlLlxuXHRcdG9wdHMub3ZlcmZsb3cgPSBbIHN0eWxlLm92ZXJmbG93LCBzdHlsZS5vdmVyZmxvd1gsIHN0eWxlLm92ZXJmbG93WSBdO1xuXG5cdFx0Ly8gSWRlbnRpZnkgYSBkaXNwbGF5IHR5cGUsIHByZWZlcnJpbmcgb2xkIHNob3cvaGlkZSBkYXRhIG92ZXIgdGhlIENTUyBjYXNjYWRlXG5cdFx0cmVzdG9yZURpc3BsYXkgPSBkYXRhU2hvdyAmJiBkYXRhU2hvdy5kaXNwbGF5O1xuXHRcdGlmICggcmVzdG9yZURpc3BsYXkgPT0gbnVsbCApIHtcblx0XHRcdHJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXHRcdH1cblx0XHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSApIHtcblx0XHRcdFx0ZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5O1xuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBHZXQgbm9uZW1wdHkgdmFsdWUocykgYnkgdGVtcG9yYXJpbHkgZm9yY2luZyB2aXNpYmlsaXR5XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApO1xuXHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheSB8fCByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFuaW1hdGUgaW5saW5lIGVsZW1lbnRzIGFzIGlubGluZS1ibG9ja1xuXHRcdGlmICggZGlzcGxheSA9PT0gXCJpbmxpbmVcIiB8fCBkaXNwbGF5ID09PSBcImlubGluZS1ibG9ja1wiICYmIHJlc3RvcmVEaXNwbGF5ICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZmxvYXRcIiApID09PSBcIm5vbmVcIiApIHtcblxuXHRcdFx0XHQvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBkaXNwbGF5IHZhbHVlIGF0IHRoZSBlbmQgb2YgcHVyZSBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRcdFx0XHRpZiAoICFwcm9wVHdlZW4gKSB7XG5cdFx0XHRcdFx0YW5pbS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0ZGlzcGxheSA9IHN0eWxlLmRpc3BsYXk7XG5cdFx0XHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09IFwibm9uZVwiID8gXCJcIiA6IGRpc3BsYXk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICggb3B0cy5vdmVyZmxvdyApIHtcblx0XHRzdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0c3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gSW1wbGVtZW50IHNob3cvaGlkZSBhbmltYXRpb25zXG5cdHByb3BUd2VlbiA9IGZhbHNlO1xuXHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cblx0XHQvLyBHZW5lcmFsIHNob3cvaGlkZSBzZXR1cCBmb3IgdGhpcyBlbGVtZW50IGFuaW1hdGlvblxuXHRcdGlmICggIXByb3BUd2VlbiApIHtcblx0XHRcdGlmICggZGF0YVNob3cgKSB7XG5cdFx0XHRcdGlmICggXCJoaWRkZW5cIiBpbiBkYXRhU2hvdyApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRhdGFTaG93ID0gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBcImZ4c2hvd1wiLCB7IGRpc3BsYXk6IHJlc3RvcmVEaXNwbGF5IH0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RvcmUgaGlkZGVuL3Zpc2libGUgZm9yIHRvZ2dsZSBzbyBgLnN0b3AoKS50b2dnbGUoKWAgXCJyZXZlcnNlc1wiXG5cdFx0XHRpZiAoIHRvZ2dsZSApIHtcblx0XHRcdFx0ZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW1cblx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMgKi9cblxuXHRcdFx0XHQvLyBUaGUgZmluYWwgc3RlcCBvZiBhIFwiaGlkZVwiIGFuaW1hdGlvbiBpcyBhY3R1YWxseSBoaWRpbmcgdGhlIGVsZW1lbnRcblx0XHRcdFx0aWYgKCAhaGlkZGVuICkge1xuXHRcdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgXCJmeHNob3dcIiApO1xuXHRcdFx0XHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdC8vIFBlci1wcm9wZXJ0eSBzZXR1cFxuXHRcdHByb3BUd2VlbiA9IGNyZWF0ZVR3ZWVuKCBoaWRkZW4gPyBkYXRhU2hvd1sgcHJvcCBdIDogMCwgcHJvcCwgYW5pbSApO1xuXHRcdGlmICggISggcHJvcCBpbiBkYXRhU2hvdyApICkge1xuXHRcdFx0ZGF0YVNob3dbIHByb3AgXSA9IHByb3BUd2Vlbi5zdGFydDtcblx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRwcm9wVHdlZW4uZW5kID0gcHJvcFR3ZWVuLnN0YXJ0O1xuXHRcdFx0XHRwcm9wVHdlZW4uc3RhcnQgPSAwO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBwcm9wRmlsdGVyKCBwcm9wcywgc3BlY2lhbEVhc2luZyApIHtcblx0dmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rcztcblxuXHQvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3Ncblx0Zm9yICggaW5kZXggaW4gcHJvcHMgKSB7XG5cdFx0bmFtZSA9IGNhbWVsQ2FzZSggaW5kZXggKTtcblx0XHRlYXNpbmcgPSBzcGVjaWFsRWFzaW5nWyBuYW1lIF07XG5cdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXTtcblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRlYXNpbmcgPSB2YWx1ZVsgMSBdO1xuXHRcdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyAwIF07XG5cdFx0fVxuXG5cdFx0aWYgKCBpbmRleCAhPT0gbmFtZSApIHtcblx0XHRcdHByb3BzWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgaW5kZXggXTtcblx0XHR9XG5cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdO1xuXHRcdGlmICggaG9va3MgJiYgXCJleHBhbmRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbHVlID0gaG9va3MuZXhwYW5kKCB2YWx1ZSApO1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBuYW1lIF07XG5cblx0XHRcdC8vIE5vdCBxdWl0ZSAkLmV4dGVuZCwgdGhpcyB3b24ndCBvdmVyd3JpdGUgZXhpc3Rpbmcga2V5cy5cblx0XHRcdC8vIFJldXNpbmcgJ2luZGV4JyBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgXCJuYW1lXCJcblx0XHRcdGZvciAoIGluZGV4IGluIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICEoIGluZGV4IGluIHByb3BzICkgKSB7XG5cdFx0XHRcdFx0cHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgaW5kZXggXTtcblx0XHRcdFx0XHRzcGVjaWFsRWFzaW5nWyBpbmRleCBdID0gZWFzaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZztcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gQW5pbWF0aW9uKCBlbGVtLCBwcm9wZXJ0aWVzLCBvcHRpb25zICkge1xuXHR2YXIgcmVzdWx0LFxuXHRcdHN0b3BwZWQsXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IEFuaW1hdGlvbi5wcmVmaWx0ZXJzLmxlbmd0aCxcblx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvclxuXHRcdFx0ZGVsZXRlIHRpY2suZWxlbTtcblx0XHR9ICksXG5cdFx0dGljayA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBzdG9wcGVkICkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHR2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0XHRyZW1haW5pbmcgPSBNYXRoLm1heCggMCwgYW5pbWF0aW9uLnN0YXJ0VGltZSArIGFuaW1hdGlvbi5kdXJhdGlvbiAtIGN1cnJlbnRUaW1lICksXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCAyLjMgb25seVxuXHRcdFx0XHQvLyBBcmNoYWljIGNyYXNoIGJ1ZyB3b24ndCBhbGxvdyB1cyB0byB1c2UgYDEgLSAoIDAuNSB8fCAwIClgICgjMTI0OTcpXG5cdFx0XHRcdHRlbXAgPSByZW1haW5pbmcgLyBhbmltYXRpb24uZHVyYXRpb24gfHwgMCxcblx0XHRcdFx0cGVyY2VudCA9IDEgLSB0ZW1wLFxuXHRcdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRcdGxlbmd0aCA9IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoO1xuXG5cdFx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggcGVyY2VudCApO1xuXHRcdFx0fVxuXG5cdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgcGVyY2VudCwgcmVtYWluaW5nIF0gKTtcblxuXHRcdFx0Ly8gSWYgdGhlcmUncyBtb3JlIHRvIGRvLCB5aWVsZFxuXHRcdFx0aWYgKCBwZXJjZW50IDwgMSAmJiBsZW5ndGggKSB7XG5cdFx0XHRcdHJldHVybiByZW1haW5pbmc7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIHRoaXMgd2FzIGFuIGVtcHR5IGFuaW1hdGlvbiwgc3ludGhlc2l6ZSBhIGZpbmFsIHByb2dyZXNzIG5vdGlmaWNhdGlvblxuXHRcdFx0aWYgKCAhbGVuZ3RoICkge1xuXHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlc29sdmUgdGhlIGFuaW1hdGlvbiBhbmQgcmVwb3J0IGl0cyBjb25jbHVzaW9uXG5cdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggZWxlbSwgWyBhbmltYXRpb24gXSApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0sXG5cdFx0YW5pbWF0aW9uID0gZGVmZXJyZWQucHJvbWlzZSgge1xuXHRcdFx0ZWxlbTogZWxlbSxcblx0XHRcdHByb3BzOiBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcGVydGllcyApLFxuXHRcdFx0b3B0czogalF1ZXJ5LmV4dGVuZCggdHJ1ZSwge1xuXHRcdFx0XHRzcGVjaWFsRWFzaW5nOiB7fSxcblx0XHRcdFx0ZWFzaW5nOiBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0XG5cdFx0XHR9LCBvcHRpb25zICksXG5cdFx0XHRvcmlnaW5hbFByb3BlcnRpZXM6IHByb3BlcnRpZXMsXG5cdFx0XHRvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsXG5cdFx0XHRzdGFydFRpbWU6IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksXG5cdFx0XHRkdXJhdGlvbjogb3B0aW9ucy5kdXJhdGlvbixcblx0XHRcdHR3ZWVuczogW10sXG5cdFx0XHRjcmVhdGVUd2VlbjogZnVuY3Rpb24oIHByb3AsIGVuZCApIHtcblx0XHRcdFx0dmFyIHR3ZWVuID0galF1ZXJ5LlR3ZWVuKCBlbGVtLCBhbmltYXRpb24ub3B0cywgcHJvcCwgZW5kLFxuXHRcdFx0XHRcdGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmdbIHByb3AgXSB8fCBhbmltYXRpb24ub3B0cy5lYXNpbmcgKTtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVucy5wdXNoKCB0d2VlbiApO1xuXHRcdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0XHR9LFxuXHRcdFx0c3RvcDogZnVuY3Rpb24oIGdvdG9FbmQgKSB7XG5cdFx0XHRcdHZhciBpbmRleCA9IDAsXG5cblx0XHRcdFx0XHQvLyBJZiB3ZSBhcmUgZ29pbmcgdG8gdGhlIGVuZCwgd2Ugd2FudCB0byBydW4gYWxsIHRoZSB0d2VlbnNcblx0XHRcdFx0XHQvLyBvdGhlcndpc2Ugd2Ugc2tpcCB0aGlzIHBhcnRcblx0XHRcdFx0XHRsZW5ndGggPSBnb3RvRW5kID8gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGggOiAwO1xuXHRcdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RvcHBlZCA9IHRydWU7XG5cdFx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIDEgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0XG5cdFx0XHRcdGlmICggZ290b0VuZCApIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0fSApLFxuXHRcdHByb3BzID0gYW5pbWF0aW9uLnByb3BzO1xuXG5cdHByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7XG5cblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRyZXN1bHQgPSBBbmltYXRpb24ucHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApO1xuXHRcdGlmICggcmVzdWx0ICkge1xuXHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCByZXN1bHQuc3RvcCApICkge1xuXHRcdFx0XHRqUXVlcnkuX3F1ZXVlSG9va3MoIGFuaW1hdGlvbi5lbGVtLCBhbmltYXRpb24ub3B0cy5xdWV1ZSApLnN0b3AgPVxuXHRcdFx0XHRcdHJlc3VsdC5zdG9wLmJpbmQoIHJlc3VsdCApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cdH1cblxuXHRqUXVlcnkubWFwKCBwcm9wcywgY3JlYXRlVHdlZW4sIGFuaW1hdGlvbiApO1xuXG5cdGlmICggaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHtcblx0XHRhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTtcblx0fVxuXG5cdC8vIEF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zXG5cdGFuaW1hdGlvblxuXHRcdC5wcm9ncmVzcyggYW5pbWF0aW9uLm9wdHMucHJvZ3Jlc3MgKVxuXHRcdC5kb25lKCBhbmltYXRpb24ub3B0cy5kb25lLCBhbmltYXRpb24ub3B0cy5jb21wbGV0ZSApXG5cdFx0LmZhaWwoIGFuaW1hdGlvbi5vcHRzLmZhaWwgKVxuXHRcdC5hbHdheXMoIGFuaW1hdGlvbi5vcHRzLmFsd2F5cyApO1xuXG5cdGpRdWVyeS5meC50aW1lcihcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0YW5pbTogYW5pbWF0aW9uLFxuXHRcdFx0cXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlXG5cdFx0fSApXG5cdCk7XG5cblx0cmV0dXJuIGFuaW1hdGlvbjtcbn1cblxualF1ZXJ5LkFuaW1hdGlvbiA9IGpRdWVyeS5leHRlbmQoIEFuaW1hdGlvbiwge1xuXG5cdHR3ZWVuZXJzOiB7XG5cdFx0XCIqXCI6IFsgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkge1xuXHRcdFx0dmFyIHR3ZWVuID0gdGhpcy5jcmVhdGVUd2VlbiggcHJvcCwgdmFsdWUgKTtcblx0XHRcdGFkanVzdENTUyggdHdlZW4uZWxlbSwgcHJvcCwgcmNzc051bS5leGVjKCB2YWx1ZSApLCB0d2VlbiApO1xuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH0gXVxuXHR9LFxuXG5cdHR3ZWVuZXI6IGZ1bmN0aW9uKCBwcm9wcywgY2FsbGJhY2sgKSB7XG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBwcm9wcyApICkge1xuXHRcdFx0Y2FsbGJhY2sgPSBwcm9wcztcblx0XHRcdHByb3BzID0gWyBcIipcIiBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wcyA9IHByb3BzLm1hdGNoKCBybm90aHRtbHdoaXRlICk7XG5cdFx0fVxuXG5cdFx0dmFyIHByb3AsXG5cdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0cHJvcCA9IHByb3BzWyBpbmRleCBdO1xuXHRcdFx0QW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gPSBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXTtcblx0XHRcdEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9LFxuXG5cdHByZWZpbHRlcnM6IFsgZGVmYXVsdFByZWZpbHRlciBdLFxuXG5cdHByZWZpbHRlcjogZnVuY3Rpb24oIGNhbGxiYWNrLCBwcmVwZW5kICkge1xuXHRcdGlmICggcHJlcGVuZCApIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cbmpRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBmbiApIHtcblx0dmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBzcGVlZCA9PT0gXCJvYmplY3RcIiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDoge1xuXHRcdGNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8XG5cdFx0XHRpc0Z1bmN0aW9uKCBzcGVlZCApICYmIHNwZWVkLFxuXHRcdGR1cmF0aW9uOiBzcGVlZCxcblx0XHRlYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWlzRnVuY3Rpb24oIGVhc2luZyApICYmIGVhc2luZ1xuXHR9O1xuXG5cdC8vIEdvIHRvIHRoZSBlbmQgc3RhdGUgaWYgZnggYXJlIG9mZlxuXHRpZiAoIGpRdWVyeS5meC5vZmYgKSB7XG5cdFx0b3B0LmR1cmF0aW9uID0gMDtcblxuXHR9IGVsc2Uge1xuXHRcdGlmICggdHlwZW9mIG9wdC5kdXJhdGlvbiAhPT0gXCJudW1iZXJcIiApIHtcblx0XHRcdGlmICggb3B0LmR1cmF0aW9uIGluIGpRdWVyeS5meC5zcGVlZHMgKSB7XG5cdFx0XHRcdG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5zcGVlZHNbIG9wdC5kdXJhdGlvbiBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvcHQuZHVyYXRpb24gPSBqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIE5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVlL3VuZGVmaW5lZC9udWxsIC0+IFwiZnhcIlxuXHRpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHtcblx0XHRvcHQucXVldWUgPSBcImZ4XCI7XG5cdH1cblxuXHQvLyBRdWV1ZWluZ1xuXHRvcHQub2xkID0gb3B0LmNvbXBsZXRlO1xuXG5cdG9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggb3B0Lm9sZCApICkge1xuXHRcdFx0b3B0Lm9sZC5jYWxsKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHQucXVldWUgKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7XG5cdFx0fVxuXHR9O1xuXG5cdHJldHVybiBvcHQ7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGZhZGVUbzogZnVuY3Rpb24oIHNwZWVkLCB0bywgZWFzaW5nLCBjYWxsYmFjayApIHtcblxuXHRcdC8vIFNob3cgYW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0aW5nIG9wYWNpdHkgdG8gMFxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggaXNIaWRkZW5XaXRoaW5UcmVlICkuY3NzKCBcIm9wYWNpdHlcIiwgMCApLnNob3coKVxuXG5cdFx0XHQvLyBBbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWRcblx0XHRcdC5lbmQoKS5hbmltYXRlKCB7IG9wYWNpdHk6IHRvIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH0sXG5cdGFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHR2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApLFxuXHRcdFx0b3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLFxuXHRcdFx0ZG9BbmltYXRpb24gPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBPcGVyYXRlIG9uIGEgY29weSBvZiBwcm9wIHNvIHBlci1wcm9wZXJ0eSBlYXNpbmcgd29uJ3QgYmUgbG9zdFxuXHRcdFx0XHR2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7XG5cblx0XHRcdFx0Ly8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5XG5cdFx0XHRcdGlmICggZW1wdHkgfHwgZGF0YVByaXYuZ2V0KCB0aGlzLCBcImZpbmlzaFwiICkgKSB7XG5cdFx0XHRcdFx0YW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRkb0FuaW1hdGlvbi5maW5pc2ggPSBkb0FuaW1hdGlvbjtcblxuXHRcdHJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID9cblx0XHRcdHRoaXMuZWFjaCggZG9BbmltYXRpb24gKSA6XG5cdFx0XHR0aGlzLnF1ZXVlKCBvcHRhbGwucXVldWUsIGRvQW5pbWF0aW9uICk7XG5cdH0sXG5cdHN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkge1xuXHRcdHZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7XG5cdFx0XHR2YXIgc3RvcCA9IGhvb2tzLnN0b3A7XG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdHN0b3AoIGdvdG9FbmQgKTtcblx0XHR9O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGdvdG9FbmQgPSBjbGVhclF1ZXVlO1xuXHRcdFx0Y2xlYXJRdWV1ZSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGNsZWFyUXVldWUgKSB7XG5cdFx0XHR0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBkZXF1ZXVlID0gdHJ1ZSxcblx0XHRcdFx0aW5kZXggPSB0eXBlICE9IG51bGwgJiYgdHlwZSArIFwicXVldWVIb29rc1wiLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICk7XG5cblx0XHRcdGlmICggaW5kZXggKSB7XG5cdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgKSB7XG5cdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoIGluZGV4IGluIGRhdGEgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7XG5cdFx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJlxuXHRcdFx0XHRcdCggdHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkge1xuXG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0VuZCApO1xuXHRcdFx0XHRcdGRlcXVldWUgPSBmYWxzZTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuXG5cdFx0XHQvLyBUaW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoXG5cdFx0XHQvLyB3aWxsIGRlcXVldWUgYnV0IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmQuXG5cdFx0XHRpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXHRmaW5pc2g6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdGlmICggdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGluZGV4LFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICksXG5cdFx0XHRcdHF1ZXVlID0gZGF0YVsgdHlwZSArIFwicXVldWVcIiBdLFxuXHRcdFx0XHRob29rcyA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlSG9va3NcIiBdLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRsZW5ndGggPSBxdWV1ZSA/IHF1ZXVlLmxlbmd0aCA6IDA7XG5cblx0XHRcdC8vIEVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGFcblx0XHRcdGRhdGEuZmluaXNoID0gdHJ1ZTtcblxuXHRcdFx0Ly8gRW1wdHkgdGhlIHF1ZXVlIGZpcnN0XG5cdFx0XHRqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIFtdICk7XG5cblx0XHRcdGlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHtcblx0XHRcdFx0aG9va3Muc3RvcC5jYWxsKCB0aGlzLCB0cnVlICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIExvb2sgZm9yIGFueSBhY3RpdmUgYW5pbWF0aW9ucywgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmIHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApIHtcblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb29rIGZvciBhbnkgYW5pbWF0aW9ucyBpbiB0aGUgb2xkIHF1ZXVlIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0aWYgKCBxdWV1ZVsgaW5kZXggXSAmJiBxdWV1ZVsgaW5kZXggXS5maW5pc2ggKSB7XG5cdFx0XHRcdFx0cXVldWVbIGluZGV4IF0uZmluaXNoLmNhbGwoIHRoaXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZ1xuXHRcdFx0ZGVsZXRlIGRhdGEuZmluaXNoO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcInRvZ2dsZVwiLCBcInNob3dcIiwgXCJoaWRlXCIgXSwgZnVuY3Rpb24oIF9pLCBuYW1lICkge1xuXHR2YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHNwZWVkID09IG51bGwgfHwgdHlwZW9mIHNwZWVkID09PSBcImJvb2xlYW5cIiA/XG5cdFx0XHRjc3NGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICkgOlxuXHRcdFx0dGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xuXHR9O1xufSApO1xuXG4vLyBHZW5lcmF0ZSBzaG9ydGN1dHMgZm9yIGN1c3RvbSBhbmltYXRpb25zXG5qUXVlcnkuZWFjaCgge1xuXHRzbGlkZURvd246IGdlbkZ4KCBcInNob3dcIiApLFxuXHRzbGlkZVVwOiBnZW5GeCggXCJoaWRlXCIgKSxcblx0c2xpZGVUb2dnbGU6IGdlbkZ4KCBcInRvZ2dsZVwiICksXG5cdGZhZGVJbjogeyBvcGFjaXR5OiBcInNob3dcIiB9LFxuXHRmYWRlT3V0OiB7IG9wYWNpdHk6IFwiaGlkZVwiIH0sXG5cdGZhZGVUb2dnbGU6IHsgb3BhY2l0eTogXCJ0b2dnbGVcIiB9XG59LCBmdW5jdGlvbiggbmFtZSwgcHJvcHMgKSB7XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xuXHR9O1xufSApO1xuXG5qUXVlcnkudGltZXJzID0gW107XG5qUXVlcnkuZngudGljayA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgdGltZXIsXG5cdFx0aSA9IDAsXG5cdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycztcblxuXHRmeE5vdyA9IERhdGUubm93KCk7XG5cblx0Zm9yICggOyBpIDwgdGltZXJzLmxlbmd0aDsgaSsrICkge1xuXHRcdHRpbWVyID0gdGltZXJzWyBpIF07XG5cblx0XHQvLyBSdW4gdGhlIHRpbWVyIGFuZCBzYWZlbHkgcmVtb3ZlIGl0IHdoZW4gZG9uZSAoYWxsb3dpbmcgZm9yIGV4dGVybmFsIHJlbW92YWwpXG5cdFx0aWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7XG5cdFx0XHR0aW1lcnMuc3BsaWNlKCBpLS0sIDEgKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoICF0aW1lcnMubGVuZ3RoICkge1xuXHRcdGpRdWVyeS5meC5zdG9wKCk7XG5cdH1cblx0ZnhOb3cgPSB1bmRlZmluZWQ7XG59O1xuXG5qUXVlcnkuZngudGltZXIgPSBmdW5jdGlvbiggdGltZXIgKSB7XG5cdGpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKTtcblx0alF1ZXJ5LmZ4LnN0YXJ0KCk7XG59O1xuXG5qUXVlcnkuZnguaW50ZXJ2YWwgPSAxMztcbmpRdWVyeS5meC5zdGFydCA9IGZ1bmN0aW9uKCkge1xuXHRpZiAoIGluUHJvZ3Jlc3MgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0aW5Qcm9ncmVzcyA9IHRydWU7XG5cdHNjaGVkdWxlKCk7XG59O1xuXG5qUXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHRpblByb2dyZXNzID0gbnVsbDtcbn07XG5cbmpRdWVyeS5meC5zcGVlZHMgPSB7XG5cdHNsb3c6IDYwMCxcblx0ZmFzdDogMjAwLFxuXG5cdC8vIERlZmF1bHQgc3BlZWRcblx0X2RlZmF1bHQ6IDQwMFxufTtcblxuXG4vLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uXG4vLyBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxMDAzMjQwMTQ3NDcvaHR0cDovL2JsaW5kc2lnbmFscy5jb20vaW5kZXgucGhwLzIwMDkvMDcvanF1ZXJ5LWRlbGF5L1xualF1ZXJ5LmZuLmRlbGF5ID0gZnVuY3Rpb24oIHRpbWUsIHR5cGUgKSB7XG5cdHRpbWUgPSBqUXVlcnkuZnggPyBqUXVlcnkuZnguc3BlZWRzWyB0aW1lIF0gfHwgdGltZSA6IHRpbWU7XG5cdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSwgZnVuY3Rpb24oIG5leHQsIGhvb2tzICkge1xuXHRcdHZhciB0aW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoIG5leHQsIHRpbWUgKTtcblx0XHRob29rcy5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7XG5cdFx0fTtcblx0fSApO1xufTtcblxuXG4oIGZ1bmN0aW9uKCkge1xuXHR2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKSxcblx0XHRzZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcInNlbGVjdFwiICksXG5cdFx0b3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcIm9wdGlvblwiICkgKTtcblxuXHRpbnB1dC50eXBlID0gXCJjaGVja2JveFwiO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjMgb25seVxuXHQvLyBEZWZhdWx0IHZhbHVlIGZvciBhIGNoZWNrYm94IHNob3VsZCBiZSBcIm9uXCJcblx0c3VwcG9ydC5jaGVja09uID0gaW5wdXQudmFsdWUgIT09IFwiXCI7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdC8vIE11c3QgYWNjZXNzIHNlbGVjdGVkSW5kZXggdG8gbWFrZSBkZWZhdWx0IG9wdGlvbnMgc2VsZWN0XG5cdHN1cHBvcnQub3B0U2VsZWN0ZWQgPSBvcHQuc2VsZWN0ZWQ7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdC8vIEFuIGlucHV0IGxvc2VzIGl0cyB2YWx1ZSBhZnRlciBiZWNvbWluZyBhIHJhZGlvXG5cdGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cdGlucHV0LnZhbHVlID0gXCJ0XCI7XG5cdGlucHV0LnR5cGUgPSBcInJhZGlvXCI7XG5cdHN1cHBvcnQucmFkaW9WYWx1ZSA9IGlucHV0LnZhbHVlID09PSBcInRcIjtcbn0gKSgpO1xuXG5cbnZhciBib29sSG9vayxcblx0YXR0ckhhbmRsZSA9IGpRdWVyeS5leHByLmF0dHJIYW5kbGU7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YXR0cjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5hdHRyLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBuYW1lICk7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0YXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gRG9uJ3QgZ2V0L3NldCBhdHRyaWJ1dGVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRmFsbGJhY2sgdG8gcHJvcCB3aGVuIGF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWRcblx0XHRpZiAoIHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSA9PT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRcdHJldHVybiBqUXVlcnkucHJvcCggZWxlbSwgbmFtZSwgdmFsdWUgKTtcblx0XHR9XG5cblx0XHQvLyBBdHRyaWJ1dGUgaG9va3MgYXJlIGRldGVybWluZWQgYnkgdGhlIGxvd2VyY2FzZSB2ZXJzaW9uXG5cdFx0Ly8gR3JhYiBuZWNlc3NhcnkgaG9vayBpZiBvbmUgaXMgZGVmaW5lZFxuXHRcdGlmICggblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkge1xuXHRcdFx0aG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fFxuXHRcdFx0XHQoIGpRdWVyeS5leHByLm1hdGNoLmJvb2wudGVzdCggbmFtZSApID8gYm9vbEhvb2sgOiB1bmRlZmluZWQgKTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHZhbHVlID09PSBudWxsICkge1xuXHRcdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCB2YWx1ZSArIFwiXCIgKTtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKCByZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSApICE9PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cblx0XHRyZXQgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBuYW1lICk7XG5cblx0XHQvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZFxuXHRcdHJldHVybiByZXQgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJldDtcblx0fSxcblxuXHRhdHRySG9va3M6IHtcblx0XHR0eXBlOiB7XG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhc3VwcG9ydC5yYWRpb1ZhbHVlICYmIHZhbHVlID09PSBcInJhZGlvXCIgJiZcblx0XHRcdFx0XHRub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgKSB7XG5cdFx0XHRcdFx0dmFyIHZhbCA9IGVsZW0udmFsdWU7XG5cdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCB2YWx1ZSApO1xuXHRcdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdFx0ZWxlbS52YWx1ZSA9IHZhbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHR2YXIgbmFtZSxcblx0XHRcdGkgPSAwLFxuXG5cdFx0XHQvLyBBdHRyaWJ1dGUgbmFtZXMgY2FuIGNvbnRhaW4gbm9uLUhUTUwgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzXG5cdFx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNhdHRyaWJ1dGVzLTJcblx0XHRcdGF0dHJOYW1lcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICk7XG5cblx0XHRpZiAoIGF0dHJOYW1lcyAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0d2hpbGUgKCAoIG5hbWUgPSBhdHRyTmFtZXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBuYW1lICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIEhvb2tzIGZvciBib29sZWFuIGF0dHJpYnV0ZXNcbmJvb2xIb29rID0ge1xuXHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHtcblx0XHRpZiAoIHZhbHVlID09PSBmYWxzZSApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZVxuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cbn07XG5cbmpRdWVyeS5lYWNoKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCggL1xcdysvZyApLCBmdW5jdGlvbiggX2ksIG5hbWUgKSB7XG5cdHZhciBnZXR0ZXIgPSBhdHRySGFuZGxlWyBuYW1lIF0gfHwgalF1ZXJ5LmZpbmQuYXR0cjtcblxuXHRhdHRySGFuZGxlWyBuYW1lIF0gPSBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0dmFyIHJldCwgaGFuZGxlLFxuXHRcdFx0bG93ZXJjYXNlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuXHRcdGlmICggIWlzWE1MICkge1xuXG5cdFx0XHQvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJlbW92aW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyXG5cdFx0XHRoYW5kbGUgPSBhdHRySGFuZGxlWyBsb3dlcmNhc2VOYW1lIF07XG5cdFx0XHRhdHRySGFuZGxlWyBsb3dlcmNhc2VOYW1lIF0gPSByZXQ7XG5cdFx0XHRyZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVsbCA/XG5cdFx0XHRcdGxvd2VyY2FzZU5hbWUgOlxuXHRcdFx0XHRudWxsO1xuXHRcdFx0YXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gaGFuZGxlO1xuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xufSApO1xuXG5cblxuXG52YXIgcmZvY3VzYWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksXG5cdHJjbGlja2FibGUgPSAvXig/OmF8YXJlYSkkL2k7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0cHJvcDogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5wcm9wLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblxuXHRyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGRlbGV0ZSB0aGlzWyBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWUgXTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHRwcm9wOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IHByb3BlcnRpZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblxuXHRcdFx0Ly8gRml4IG5hbWUgYW5kIGF0dGFjaCBob29rc1xuXHRcdFx0bmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTtcblx0XHRcdGhvb2tzID0galF1ZXJ5LnByb3BIb29rc1sgbmFtZSBdO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVsZW1bIG5hbWUgXTtcblx0fSxcblxuXHRwcm9wSG9va3M6IHtcblx0XHR0YWJJbmRleDoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdFx0XHRcdC8vIGVsZW0udGFiSW5kZXggZG9lc24ndCBhbHdheXMgcmV0dXJuIHRoZVxuXHRcdFx0XHQvLyBjb3JyZWN0IHZhbHVlIHdoZW4gaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXRcblx0XHRcdFx0Ly8gaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTQxMTE2MjMzMzQ3L2h0dHA6Ly9mbHVpZHByb2plY3Qub3JnL2Jsb2cvMjAwOC8wMS8wOS9nZXR0aW5nLXNldHRpbmctYW5kLXJlbW92aW5nLXRhYmluZGV4LXZhbHVlcy13aXRoLWphdmFzY3JpcHQvXG5cdFx0XHRcdC8vIFVzZSBwcm9wZXIgYXR0cmlidXRlIHJldHJpZXZhbCgjMTIwNzIpXG5cdFx0XHRcdHZhciB0YWJpbmRleCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIFwidGFiaW5kZXhcIiApO1xuXG5cdFx0XHRcdGlmICggdGFiaW5kZXggKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBhcnNlSW50KCB0YWJpbmRleCwgMTAgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRyZm9jdXNhYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSB8fFxuXHRcdFx0XHRcdHJjbGlja2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApICYmXG5cdFx0XHRcdFx0ZWxlbS5ocmVmXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybiAwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRwcm9wRml4OiB7XG5cdFx0XCJmb3JcIjogXCJodG1sRm9yXCIsXG5cdFx0XCJjbGFzc1wiOiBcImNsYXNzTmFtZVwiXG5cdH1cbn0gKTtcblxuLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG4vLyBBY2Nlc3NpbmcgdGhlIHNlbGVjdGVkSW5kZXggcHJvcGVydHlcbi8vIGZvcmNlcyB0aGUgYnJvd3NlciB0byByZXNwZWN0IHNldHRpbmcgc2VsZWN0ZWRcbi8vIG9uIHRoZSBvcHRpb25cbi8vIFRoZSBnZXR0ZXIgZW5zdXJlcyBhIGRlZmF1bHQgb3B0aW9uIGlzIHNlbGVjdGVkXG4vLyB3aGVuIGluIGFuIG9wdGdyb3VwXG4vLyBlc2xpbnQgcnVsZSBcIm5vLXVudXNlZC1leHByZXNzaW9uc1wiIGlzIGRpc2FibGVkIGZvciB0aGlzIGNvZGVcbi8vIHNpbmNlIGl0IGNvbnNpZGVycyBzdWNoIGFjY2Vzc2lvbnMgbm9vcFxuaWYgKCAhc3VwcG9ydC5vcHRTZWxlY3RlZCApIHtcblx0alF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvKiBlc2xpbnQgbm8tdW51c2VkLWV4cHJlc3Npb25zOiBcIm9mZlwiICovXG5cblx0XHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRpZiAoIHBhcmVudCAmJiBwYXJlbnQucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0cGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0LyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogXCJvZmZcIiAqL1xuXG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cdFx0XHRcdHBhcmVudC5zZWxlY3RlZEluZGV4O1xuXG5cdFx0XHRcdGlmICggcGFyZW50LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdFx0cGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxualF1ZXJ5LmVhY2goIFtcblx0XCJ0YWJJbmRleFwiLFxuXHRcInJlYWRPbmx5XCIsXG5cdFwibWF4TGVuZ3RoXCIsXG5cdFwiY2VsbFNwYWNpbmdcIixcblx0XCJjZWxsUGFkZGluZ1wiLFxuXHRcInJvd1NwYW5cIixcblx0XCJjb2xTcGFuXCIsXG5cdFwidXNlTWFwXCIsXG5cdFwiZnJhbWVCb3JkZXJcIixcblx0XCJjb250ZW50RWRpdGFibGVcIlxuXSwgZnVuY3Rpb24oKSB7XG5cdGpRdWVyeS5wcm9wRml4WyB0aGlzLnRvTG93ZXJDYXNlKCkgXSA9IHRoaXM7XG59ICk7XG5cblxuXG5cblx0Ly8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UgYWNjb3JkaW5nIHRvIEhUTUwgc3BlY1xuXHQvLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jc3RyaXAtYW5kLWNvbGxhcHNlLWFzY2lpLXdoaXRlc3BhY2Vcblx0ZnVuY3Rpb24gc3RyaXBBbmRDb2xsYXBzZSggdmFsdWUgKSB7XG5cdFx0dmFyIHRva2VucyA9IHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cdFx0cmV0dXJuIHRva2Vucy5qb2luKCBcIiBcIiApO1xuXHR9XG5cblxuZnVuY3Rpb24gZ2V0Q2xhc3MoIGVsZW0gKSB7XG5cdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSAmJiBlbGVtLmdldEF0dHJpYnV0ZSggXCJjbGFzc1wiICkgfHwgXCJcIjtcbn1cblxuZnVuY3Rpb24gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICkge1xuXHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG5cdGlmICggdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiB2YWx1ZS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXHR9XG5cdHJldHVybiBbXTtcbn1cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRhZGRDbGFzczogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGN1clZhbHVlLCBjbGF6eiwgaiwgZmluYWxWYWx1ZSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGogKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRjbGFzc2VzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRpZiAoIGNsYXNzZXMubGVuZ3RoICkge1xuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7XG5cdFx0XHRcdGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCBcIiBcIiArIHN0cmlwQW5kQ29sbGFwc2UoIGN1clZhbHVlICkgKyBcIiBcIiApO1xuXG5cdFx0XHRcdGlmICggY3VyICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGN1ci5pbmRleE9mKCBcIiBcIiArIGNsYXp6ICsgXCIgXCIgKSA8IDAgKSB7XG5cdFx0XHRcdFx0XHRcdGN1ciArPSBjbGF6eiArIFwiIFwiO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuXG5cdFx0XHRcdFx0ZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApO1xuXHRcdFx0XHRcdGlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJjbGFzc1wiLCBmaW5hbFZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0cmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjdXJWYWx1ZSwgY2xhenosIGosIGZpbmFsVmFsdWUsXG5cdFx0XHRpID0gMDtcblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5yZW1vdmVDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiB0aGlzLmF0dHIoIFwiY2xhc3NcIiwgXCJcIiApO1xuXHRcdH1cblxuXHRcdGNsYXNzZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTtcblxuXHRcdGlmICggY2xhc3Nlcy5sZW5ndGggKSB7XG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdGN1clZhbHVlID0gZ2V0Q2xhc3MoIGVsZW0gKTtcblxuXHRcdFx0XHQvLyBUaGlzIGV4cHJlc3Npb24gaXMgaGVyZSBmb3IgYmV0dGVyIGNvbXByZXNzaWJpbGl0eSAoc2VlIGFkZENsYXNzKVxuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBjdXJWYWx1ZSApICsgXCIgXCIgKTtcblxuXHRcdFx0XHRpZiAoIGN1ciApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoICggY2xhenogPSBjbGFzc2VzWyBqKysgXSApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgKmFsbCogaW5zdGFuY2VzXG5cdFx0XHRcdFx0XHR3aGlsZSAoIGN1ci5pbmRleE9mKCBcIiBcIiArIGNsYXp6ICsgXCIgXCIgKSA+IC0xICkge1xuXHRcdFx0XHRcdFx0XHRjdXIgPSBjdXIucmVwbGFjZSggXCIgXCIgKyBjbGF6eiArIFwiIFwiLCBcIiBcIiApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuXG5cdFx0XHRcdFx0ZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApO1xuXHRcdFx0XHRcdGlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJjbGFzc1wiLCBmaW5hbFZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0dG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7XG5cdFx0dmFyIHR5cGUgPSB0eXBlb2YgdmFsdWUsXG5cdFx0XHRpc1ZhbGlkVmFsdWUgPSB0eXBlID09PSBcInN0cmluZ1wiIHx8IEFycmF5LmlzQXJyYXkoIHZhbHVlICk7XG5cblx0XHRpZiAoIHR5cGVvZiBzdGF0ZVZhbCA9PT0gXCJib29sZWFuXCIgJiYgaXNWYWxpZFZhbHVlICkge1xuXHRcdFx0cmV0dXJuIHN0YXRlVmFsID8gdGhpcy5hZGRDbGFzcyggdmFsdWUgKSA6IHRoaXMucmVtb3ZlQ2xhc3MoIHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnRvZ2dsZUNsYXNzKFxuXHRcdFx0XHRcdHZhbHVlLmNhbGwoIHRoaXMsIGksIGdldENsYXNzKCB0aGlzICksIHN0YXRlVmFsICksXG5cdFx0XHRcdFx0c3RhdGVWYWxcblx0XHRcdFx0KTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBjbGFzc05hbWUsIGksIHNlbGYsIGNsYXNzTmFtZXM7XG5cblx0XHRcdGlmICggaXNWYWxpZFZhbHVlICkge1xuXG5cdFx0XHRcdC8vIFRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzXG5cdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRzZWxmID0galF1ZXJ5KCB0aGlzICk7XG5cdFx0XHRcdGNsYXNzTmFtZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTtcblxuXHRcdFx0XHR3aGlsZSAoICggY2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSsrIF0gKSApIHtcblxuXHRcdFx0XHRcdC8vIENoZWNrIGVhY2ggY2xhc3NOYW1lIGdpdmVuLCBzcGFjZSBzZXBhcmF0ZWQgbGlzdFxuXHRcdFx0XHRcdGlmICggc2VsZi5oYXNDbGFzcyggY2xhc3NOYW1lICkgKSB7XG5cdFx0XHRcdFx0XHRzZWxmLnJlbW92ZUNsYXNzKCBjbGFzc05hbWUgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c2VsZi5hZGRDbGFzcyggY2xhc3NOYW1lICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdC8vIFRvZ2dsZSB3aG9sZSBjbGFzcyBuYW1lXG5cdFx0XHR9IGVsc2UgaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGUgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0XHRjbGFzc05hbWUgPSBnZXRDbGFzcyggdGhpcyApO1xuXHRcdFx0XHRpZiAoIGNsYXNzTmFtZSApIHtcblxuXHRcdFx0XHRcdC8vIFN0b3JlIGNsYXNzTmFtZSBpZiBzZXRcblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIHRoaXMsIFwiX19jbGFzc05hbWVfX1wiLCBjbGFzc05hbWUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIElmIHRoZSBlbGVtZW50IGhhcyBhIGNsYXNzIG5hbWUgb3IgaWYgd2UncmUgcGFzc2VkIGBmYWxzZWAsXG5cdFx0XHRcdC8vIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdhcyBvbmUsIHRoZSBhYm92ZSBzYXZlZCBpdCkuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBicmluZyBiYWNrIHdoYXRldmVyIHdhcyBwcmV2aW91c2x5IHNhdmVkIChpZiBhbnl0aGluZyksXG5cdFx0XHRcdC8vIGZhbGxpbmcgYmFjayB0byB0aGUgZW1wdHkgc3RyaW5nIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC5cblx0XHRcdFx0aWYgKCB0aGlzLnNldEF0dHJpYnV0ZSApIHtcblx0XHRcdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSggXCJjbGFzc1wiLFxuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lIHx8IHZhbHVlID09PSBmYWxzZSA/XG5cdFx0XHRcdFx0XHRcdFwiXCIgOlxuXHRcdFx0XHRcdFx0XHRkYXRhUHJpdi5nZXQoIHRoaXMsIFwiX19jbGFzc05hbWVfX1wiICkgfHwgXCJcIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0aGFzQ2xhc3M6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgY2xhc3NOYW1lLCBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRjbGFzc05hbWUgPSBcIiBcIiArIHNlbGVjdG9yICsgXCIgXCI7XG5cdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdCggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBnZXRDbGFzcyggZWxlbSApICkgKyBcIiBcIiApLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufSApO1xuXG5cblxuXG52YXIgcnJldHVybiA9IC9cXHIvZztcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHR2YWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgaG9va3MsIHJldCwgdmFsdWVJc0Z1bmN0aW9uLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXTtcblxuXHRcdGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHRcdGhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8fFxuXHRcdFx0XHRcdGpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07XG5cblx0XHRcdFx0aWYgKCBob29rcyAmJlxuXHRcdFx0XHRcdFwiZ2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0XHQoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgXCJ2YWx1ZVwiICkgKSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXQgPSBlbGVtLnZhbHVlO1xuXG5cdFx0XHRcdC8vIEhhbmRsZSBtb3N0IGNvbW1vbiBzdHJpbmcgY2FzZXNcblx0XHRcdFx0aWYgKCB0eXBlb2YgcmV0ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0XHRcdHJldHVybiByZXQucmVwbGFjZSggcnJldHVybiwgXCJcIiApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gSGFuZGxlIGNhc2VzIHdoZXJlIHZhbHVlIGlzIG51bGwvdW5kZWYgb3IgbnVtYmVyXG5cdFx0XHRcdHJldHVybiByZXQgPT0gbnVsbCA/IFwiXCIgOiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YWx1ZUlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCB2YWx1ZSApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHR2YXIgdmFsO1xuXG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgIT09IDEgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB2YWx1ZUlzRnVuY3Rpb24gKSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlLmNhbGwoIHRoaXMsIGksIGpRdWVyeSggdGhpcyApLnZhbCgpICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YWwgPSB2YWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVHJlYXQgbnVsbC91bmRlZmluZWQgYXMgXCJcIjsgY29udmVydCBudW1iZXJzIHRvIHN0cmluZ1xuXHRcdFx0aWYgKCB2YWwgPT0gbnVsbCApIHtcblx0XHRcdFx0dmFsID0gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0dmFsICs9IFwiXCI7XG5cblx0XHRcdH0gZWxzZSBpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkge1xuXHRcdFx0XHR2YWwgPSBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSArIFwiXCI7XG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblxuXHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07XG5cblx0XHRcdC8vIElmIHNldCByZXR1cm5zIHVuZGVmaW5lZCwgZmFsbCBiYWNrIHRvIG5vcm1hbCBzZXR0aW5nXG5cdFx0XHRpZiAoICFob29rcyB8fCAhKCBcInNldFwiIGluIGhvb2tzICkgfHwgaG9va3Muc2V0KCB0aGlzLCB2YWwsIFwidmFsdWVcIiApID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHRoaXMudmFsdWUgPSB2YWw7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0dmFsSG9va3M6IHtcblx0XHRvcHRpb246IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdFx0dmFyIHZhbCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIFwidmFsdWVcIiApO1xuXHRcdFx0XHRyZXR1cm4gdmFsICE9IG51bGwgP1xuXHRcdFx0XHRcdHZhbCA6XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTEwIC0gMTEgb25seVxuXHRcdFx0XHRcdC8vIG9wdGlvbi50ZXh0IHRocm93cyBleGNlcHRpb25zICgjMTQ2ODYsICMxNDg1OClcblx0XHRcdFx0XHQvLyBTdHJpcCBhbmQgY29sbGFwc2Ugd2hpdGVzcGFjZVxuXHRcdFx0XHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS13aGl0ZXNwYWNlXG5cdFx0XHRcdFx0c3RyaXBBbmRDb2xsYXBzZSggalF1ZXJ5LnRleHQoIGVsZW0gKSApO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0c2VsZWN0OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgdmFsdWUsIG9wdGlvbiwgaSxcblx0XHRcdFx0XHRvcHRpb25zID0gZWxlbS5vcHRpb25zLFxuXHRcdFx0XHRcdGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LFxuXHRcdFx0XHRcdG9uZSA9IGVsZW0udHlwZSA9PT0gXCJzZWxlY3Qtb25lXCIsXG5cdFx0XHRcdFx0dmFsdWVzID0gb25lID8gbnVsbCA6IFtdLFxuXHRcdFx0XHRcdG1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoO1xuXG5cdFx0XHRcdGlmICggaW5kZXggPCAwICkge1xuXHRcdFx0XHRcdGkgPSBtYXg7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpID0gb25lID8gaW5kZXggOiAwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgc2VsZWN0ZWQgb3B0aW9uc1xuXHRcdFx0XHRmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHtcblx0XHRcdFx0XHRvcHRpb24gPSBvcHRpb25zWyBpIF07XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuXHRcdFx0XHRcdC8vIElFOC05IGRvZXNuJ3QgdXBkYXRlIHNlbGVjdGVkIGFmdGVyIGZvcm0gcmVzZXQgKCMyNTUxKVxuXHRcdFx0XHRcdGlmICggKCBvcHRpb24uc2VsZWN0ZWQgfHwgaSA9PT0gaW5kZXggKSAmJlxuXG5cdFx0XHRcdFx0XHRcdC8vIERvbid0IHJldHVybiBvcHRpb25zIHRoYXQgYXJlIGRpc2FibGVkIG9yIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXBcblx0XHRcdFx0XHRcdFx0IW9wdGlvbi5kaXNhYmxlZCAmJlxuXHRcdFx0XHRcdFx0XHQoICFvcHRpb24ucGFyZW50Tm9kZS5kaXNhYmxlZCB8fFxuXHRcdFx0XHRcdFx0XHRcdCFub2RlTmFtZSggb3B0aW9uLnBhcmVudE5vZGUsIFwib3B0Z3JvdXBcIiApICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIEdldCB0aGUgc3BlY2lmaWMgdmFsdWUgZm9yIHRoZSBvcHRpb25cblx0XHRcdFx0XHRcdHZhbHVlID0galF1ZXJ5KCBvcHRpb24gKS52YWwoKTtcblxuXHRcdFx0XHRcdFx0Ly8gV2UgZG9uJ3QgbmVlZCBhbiBhcnJheSBmb3Igb25lIHNlbGVjdHNcblx0XHRcdFx0XHRcdGlmICggb25lICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5XG5cdFx0XHRcdFx0XHR2YWx1ZXMucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdmFsdWVzO1xuXHRcdFx0fSxcblxuXHRcdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRcdHZhciBvcHRpb25TZXQsIG9wdGlvbixcblx0XHRcdFx0XHRvcHRpb25zID0gZWxlbS5vcHRpb25zLFxuXHRcdFx0XHRcdHZhbHVlcyA9IGpRdWVyeS5tYWtlQXJyYXkoIHZhbHVlICksXG5cdFx0XHRcdFx0aSA9IG9wdGlvbnMubGVuZ3RoO1xuXG5cdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdG9wdGlvbiA9IG9wdGlvbnNbIGkgXTtcblxuXHRcdFx0XHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbmQtYXNzaWduICovXG5cblx0XHRcdFx0XHRpZiAoIG9wdGlvbi5zZWxlY3RlZCA9XG5cdFx0XHRcdFx0XHRqUXVlcnkuaW5BcnJheSggalF1ZXJ5LnZhbEhvb2tzLm9wdGlvbi5nZXQoIG9wdGlvbiApLCB2YWx1ZXMgKSA+IC0xXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvcHRpb25TZXQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8qIGVzbGludC1lbmFibGUgbm8tY29uZC1hc3NpZ24gKi9cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0XG5cdFx0XHRcdGlmICggIW9wdGlvblNldCApIHtcblx0XHRcdFx0XHRlbGVtLnNlbGVjdGVkSW5kZXggPSAtMTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdmFsdWVzO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG4vLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlclxualF1ZXJ5LmVhY2goIFsgXCJyYWRpb1wiLCBcImNoZWNrYm94XCIgXSwgZnVuY3Rpb24oKSB7XG5cdGpRdWVyeS52YWxIb29rc1sgdGhpcyBdID0ge1xuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLmNoZWNrZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KCBlbGVtICkudmFsKCksIHZhbHVlICkgPiAtMSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0aWYgKCAhc3VwcG9ydC5jaGVja09uICkge1xuXHRcdGpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gbnVsbCA/IFwib25cIiA6IGVsZW0udmFsdWU7XG5cdFx0fTtcblx0fVxufSApO1xuXG5cblxuXG4vLyBSZXR1cm4galF1ZXJ5IGZvciBhdHRyaWJ1dGVzLW9ubHkgaW5jbHVzaW9uXG5cblxuc3VwcG9ydC5mb2N1c2luID0gXCJvbmZvY3VzaW5cIiBpbiB3aW5kb3c7XG5cblxudmFyIHJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLFxuXHRzdG9wUHJvcGFnYXRpb25DYWxsYmFjayA9IGZ1bmN0aW9uKCBlICkge1xuXHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH07XG5cbmpRdWVyeS5leHRlbmQoIGpRdWVyeS5ldmVudCwge1xuXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkge1xuXG5cdFx0dmFyIGksIGN1ciwgdG1wLCBidWJibGVUeXBlLCBvbnR5cGUsIGhhbmRsZSwgc3BlY2lhbCwgbGFzdEVsZW1lbnQsXG5cdFx0XHRldmVudFBhdGggPSBbIGVsZW0gfHwgZG9jdW1lbnQgXSxcblx0XHRcdHR5cGUgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwidHlwZVwiICkgPyBldmVudC50eXBlIDogZXZlbnQsXG5cdFx0XHRuYW1lc3BhY2VzID0gaGFzT3duLmNhbGwoIGV2ZW50LCBcIm5hbWVzcGFjZVwiICkgPyBldmVudC5uYW1lc3BhY2Uuc3BsaXQoIFwiLlwiICkgOiBbXTtcblxuXHRcdGN1ciA9IGxhc3RFbGVtZW50ID0gdG1wID0gZWxlbSA9IGVsZW0gfHwgZG9jdW1lbnQ7XG5cblx0XHQvLyBEb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2Rlc1xuXHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGZvY3VzL2JsdXIgbW9ycGhzIHRvIGZvY3VzaW4vb3V0OyBlbnN1cmUgd2UncmUgbm90IGZpcmluZyB0aGVtIHJpZ2h0IG5vd1xuXHRcdGlmICggcmZvY3VzTW9ycGgudGVzdCggdHlwZSArIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIHR5cGUuaW5kZXhPZiggXCIuXCIgKSA+IC0xICkge1xuXG5cdFx0XHQvLyBOYW1lc3BhY2VkIHRyaWdnZXI7IGNyZWF0ZSBhIHJlZ2V4cCB0byBtYXRjaCBldmVudCB0eXBlIGluIGhhbmRsZSgpXG5cdFx0XHRuYW1lc3BhY2VzID0gdHlwZS5zcGxpdCggXCIuXCIgKTtcblx0XHRcdHR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7XG5cdFx0XHRuYW1lc3BhY2VzLnNvcnQoKTtcblx0XHR9XG5cdFx0b250eXBlID0gdHlwZS5pbmRleE9mKCBcIjpcIiApIDwgMCAmJiBcIm9uXCIgKyB0eXBlO1xuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGEgalF1ZXJ5LkV2ZW50IG9iamVjdCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nXG5cdFx0ZXZlbnQgPSBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/XG5cdFx0XHRldmVudCA6XG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCB0eXBlLCB0eXBlb2YgZXZlbnQgPT09IFwib2JqZWN0XCIgJiYgZXZlbnQgKTtcblxuXHRcdC8vIFRyaWdnZXIgYml0bWFzazogJiAxIGZvciBuYXRpdmUgaGFuZGxlcnM7ICYgMiBmb3IgalF1ZXJ5IChhbHdheXMgdHJ1ZSlcblx0XHRldmVudC5pc1RyaWdnZXIgPSBvbmx5SGFuZGxlcnMgPyAyIDogMztcblx0XHRldmVudC5uYW1lc3BhY2UgPSBuYW1lc3BhY2VzLmpvaW4oIFwiLlwiICk7XG5cdFx0ZXZlbnQucm5hbWVzcGFjZSA9IGV2ZW50Lm5hbWVzcGFjZSA/XG5cdFx0XHRuZXcgUmVnRXhwKCBcIihefFxcXFwuKVwiICsgbmFtZXNwYWNlcy5qb2luKCBcIlxcXFwuKD86LipcXFxcLnwpXCIgKSArIFwiKFxcXFwufCQpXCIgKSA6XG5cdFx0XHRudWxsO1xuXG5cdFx0Ly8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkXG5cdFx0ZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkO1xuXHRcdGlmICggIWV2ZW50LnRhcmdldCApIHtcblx0XHRcdGV2ZW50LnRhcmdldCA9IGVsZW07XG5cdFx0fVxuXG5cdFx0Ly8gQ2xvbmUgYW55IGluY29taW5nIGRhdGEgYW5kIHByZXBlbmQgdGhlIGV2ZW50LCBjcmVhdGluZyB0aGUgaGFuZGxlciBhcmcgbGlzdFxuXHRcdGRhdGEgPSBkYXRhID09IG51bGwgP1xuXHRcdFx0WyBldmVudCBdIDpcblx0XHRcdGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEsIFsgZXZlbnQgXSApO1xuXG5cdFx0Ly8gQWxsb3cgc3BlY2lhbCBldmVudHMgdG8gZHJhdyBvdXRzaWRlIHRoZSBsaW5lc1xuXHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiBzcGVjaWFsLnRyaWdnZXIgJiYgc3BlY2lhbC50cmlnZ2VyLmFwcGx5KCBlbGVtLCBkYXRhICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBldmVudCBwcm9wYWdhdGlvbiBwYXRoIGluIGFkdmFuY2UsIHBlciBXM0MgZXZlbnRzIHNwZWMgKCM5OTUxKVxuXHRcdC8vIEJ1YmJsZSB1cCB0byBkb2N1bWVudCwgdGhlbiB0byB3aW5kb3c7IHdhdGNoIGZvciBhIGdsb2JhbCBvd25lckRvY3VtZW50IHZhciAoIzk3MjQpXG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5vQnViYmxlICYmICFpc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTtcblx0XHRcdGlmICggIXJmb2N1c01vcnBoLnRlc3QoIGJ1YmJsZVR5cGUgKyB0eXBlICkgKSB7XG5cdFx0XHRcdGN1ciA9IGN1ci5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXHRcdFx0Zm9yICggOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggY3VyICk7XG5cdFx0XHRcdHRtcCA9IGN1cjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5nLiwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pXG5cdFx0XHRpZiAoIHRtcCA9PT0gKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQgKSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZpcmUgaGFuZGxlcnMgb24gdGhlIGV2ZW50IHBhdGhcblx0XHRpID0gMDtcblx0XHR3aGlsZSAoICggY3VyID0gZXZlbnRQYXRoWyBpKysgXSApICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0bGFzdEVsZW1lbnQgPSBjdXI7XG5cdFx0XHRldmVudC50eXBlID0gaSA+IDEgP1xuXHRcdFx0XHRidWJibGVUeXBlIDpcblx0XHRcdFx0c3BlY2lhbC5iaW5kVHlwZSB8fCB0eXBlO1xuXG5cdFx0XHQvLyBqUXVlcnkgaGFuZGxlclxuXHRcdFx0aGFuZGxlID0gKCBkYXRhUHJpdi5nZXQoIGN1ciwgXCJldmVudHNcIiApIHx8IE9iamVjdC5jcmVhdGUoIG51bGwgKSApWyBldmVudC50eXBlIF0gJiZcblx0XHRcdFx0ZGF0YVByaXYuZ2V0KCBjdXIsIFwiaGFuZGxlXCIgKTtcblx0XHRcdGlmICggaGFuZGxlICkge1xuXHRcdFx0XHRoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBOYXRpdmUgaGFuZGxlclxuXHRcdFx0aGFuZGxlID0gb250eXBlICYmIGN1clsgb250eXBlIF07XG5cdFx0XHRpZiAoIGhhbmRsZSAmJiBoYW5kbGUuYXBwbHkgJiYgYWNjZXB0RGF0YSggY3VyICkgKSB7XG5cdFx0XHRcdGV2ZW50LnJlc3VsdCA9IGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7XG5cdFx0XHRcdGlmICggZXZlbnQucmVzdWx0ID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGV2ZW50LnR5cGUgPSB0eXBlO1xuXG5cdFx0Ly8gSWYgbm9ib2R5IHByZXZlbnRlZCB0aGUgZGVmYXVsdCBhY3Rpb24sIGRvIGl0IG5vd1xuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7XG5cblx0XHRcdGlmICggKCAhc3BlY2lhbC5fZGVmYXVsdCB8fFxuXHRcdFx0XHRzcGVjaWFsLl9kZWZhdWx0LmFwcGx5KCBldmVudFBhdGgucG9wKCksIGRhdGEgKSA9PT0gZmFsc2UgKSAmJlxuXHRcdFx0XHRhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cblx0XHRcdFx0Ly8gQ2FsbCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBldmVudC5cblx0XHRcdFx0Ly8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKCM2MTcwKVxuXHRcdFx0XHRpZiAoIG9udHlwZSAmJiBpc0Z1bmN0aW9uKCBlbGVtWyB0eXBlIF0gKSAmJiAhaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0XHRcdC8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2Rcblx0XHRcdFx0XHR0bXAgPSBlbGVtWyBvbnR5cGUgXTtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSBudWxsO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFByZXZlbnQgcmUtdHJpZ2dlcmluZyBvZiB0aGUgc2FtZSBldmVudCwgc2luY2Ugd2UgYWxyZWFkeSBidWJibGVkIGl0IGFib3ZlXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHR5cGU7XG5cblx0XHRcdFx0XHRpZiAoIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRcdFx0XHRsYXN0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBzdG9wUHJvcGFnYXRpb25DYWxsYmFjayApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGVsZW1bIHR5cGUgXSgpO1xuXG5cdFx0XHRcdFx0aWYgKCBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0XHRcdFx0bGFzdEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRcdFx0aWYgKCB0bXAgKSB7XG5cdFx0XHRcdFx0XHRlbGVtWyBvbnR5cGUgXSA9IHRtcDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZXZlbnQucmVzdWx0O1xuXHR9LFxuXG5cdC8vIFBpZ2d5YmFjayBvbiBhIGRvbm9yIGV2ZW50IHRvIHNpbXVsYXRlIGEgZGlmZmVyZW50IG9uZVxuXHQvLyBVc2VkIG9ubHkgZm9yIGBmb2N1cyhpbiB8IG91dClgIGV2ZW50c1xuXHRzaW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0sIGV2ZW50ICkge1xuXHRcdHZhciBlID0galF1ZXJ5LmV4dGVuZChcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoKSxcblx0XHRcdGV2ZW50LFxuXHRcdFx0e1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRpc1NpbXVsYXRlZDogdHJ1ZVxuXHRcdFx0fVxuXHRcdCk7XG5cblx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApO1xuXHR9XG5cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIHRoaXMgKTtcblx0XHR9ICk7XG5cdH0sXG5cdHRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXTtcblx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIGVsZW0sIHRydWUgKTtcblx0XHR9XG5cdH1cbn0gKTtcblxuXG4vLyBTdXBwb3J0OiBGaXJlZm94IDw9NDRcbi8vIEZpcmVmb3ggZG9lc24ndCBoYXZlIGZvY3VzKGluIHwgb3V0KSBldmVudHNcbi8vIFJlbGF0ZWQgdGlja2V0IC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg3Nzg3XG4vL1xuLy8gU3VwcG9ydDogQ2hyb21lIDw9NDggLSA0OSwgU2FmYXJpIDw9OS4wIC0gOS4xXG4vLyBmb2N1cyhpbiB8IG91dCkgZXZlbnRzIGZpcmUgYWZ0ZXIgZm9jdXMgJiBibHVyIGV2ZW50cyxcbi8vIHdoaWNoIGlzIHNwZWMgdmlvbGF0aW9uIC0gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtZm9jdXNldmVudC1ldmVudC1vcmRlclxuLy8gUmVsYXRlZCB0aWNrZXQgLSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NDk4NTdcbmlmICggIXN1cHBvcnQuZm9jdXNpbiApIHtcblx0alF1ZXJ5LmVhY2goIHsgZm9jdXM6IFwiZm9jdXNpblwiLCBibHVyOiBcImZvY3Vzb3V0XCIgfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHtcblxuXHRcdC8vIEF0dGFjaCBhIHNpbmdsZSBjYXB0dXJpbmcgaGFuZGxlciBvbiB0aGUgZG9jdW1lbnQgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0XG5cdFx0dmFyIGhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQuc2ltdWxhdGUoIGZpeCwgZXZlbnQudGFyZ2V0LCBqUXVlcnkuZXZlbnQuZml4KCBldmVudCApICk7XG5cdFx0fTtcblxuXHRcdGpRdWVyeS5ldmVudC5zcGVjaWFsWyBmaXggXSA9IHtcblx0XHRcdHNldHVwOiBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBIYW5kbGU6IHJlZ3VsYXIgbm9kZXMgKHZpYSBgdGhpcy5vd25lckRvY3VtZW50YCksIHdpbmRvd1xuXHRcdFx0XHQvLyAodmlhIGB0aGlzLmRvY3VtZW50YCkgJiBkb2N1bWVudCAodmlhIGB0aGlzYCkuXG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcy5kb2N1bWVudCB8fCB0aGlzLFxuXHRcdFx0XHRcdGF0dGFjaGVzID0gZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCApO1xuXG5cdFx0XHRcdGlmICggIWF0dGFjaGVzICkge1xuXHRcdFx0XHRcdGRvYy5hZGRFdmVudExpc3RlbmVyKCBvcmlnLCBoYW5kbGVyLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCwgKCBhdHRhY2hlcyB8fCAwICkgKyAxICk7XG5cdFx0XHR9LFxuXHRcdFx0dGVhcmRvd246IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZG9jID0gdGhpcy5vd25lckRvY3VtZW50IHx8IHRoaXMuZG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKSAtIDE7XG5cblx0XHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdFx0ZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGRvYywgZml4ICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCBhdHRhY2hlcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fSApO1xufVxudmFyIGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uO1xuXG52YXIgbm9uY2UgPSB7IGd1aWQ6IERhdGUubm93KCkgfTtcblxudmFyIHJxdWVyeSA9ICggL1xcPy8gKTtcblxuXG5cbi8vIENyb3NzLWJyb3dzZXIgeG1sIHBhcnNpbmdcbmpRdWVyeS5wYXJzZVhNTCA9IGZ1bmN0aW9uKCBkYXRhICkge1xuXHR2YXIgeG1sLCBwYXJzZXJFcnJvckVsZW07XG5cdGlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRSA5IC0gMTEgb25seVxuXHQvLyBJRSB0aHJvd3Mgb24gcGFyc2VGcm9tU3RyaW5nIHdpdGggaW52YWxpZCBpbnB1dC5cblx0dHJ5IHtcblx0XHR4bWwgPSAoIG5ldyB3aW5kb3cuRE9NUGFyc2VyKCkgKS5wYXJzZUZyb21TdHJpbmcoIGRhdGEsIFwidGV4dC94bWxcIiApO1xuXHR9IGNhdGNoICggZSApIHt9XG5cblx0cGFyc2VyRXJyb3JFbGVtID0geG1sICYmIHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggXCJwYXJzZXJlcnJvclwiIClbIDAgXTtcblx0aWYgKCAheG1sIHx8IHBhcnNlckVycm9yRWxlbSApIHtcblx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBYTUw6IFwiICsgKFxuXHRcdFx0cGFyc2VyRXJyb3JFbGVtID9cblx0XHRcdFx0alF1ZXJ5Lm1hcCggcGFyc2VyRXJyb3JFbGVtLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKCBlbCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZWwudGV4dENvbnRlbnQ7XG5cdFx0XHRcdH0gKS5qb2luKCBcIlxcblwiICkgOlxuXHRcdFx0XHRkYXRhXG5cdFx0KSApO1xuXHR9XG5cdHJldHVybiB4bWw7XG59O1xuXG5cbnZhclxuXHRyYnJhY2tldCA9IC9cXFtcXF0kLyxcblx0ckNSTEYgPSAvXFxyP1xcbi9nLFxuXHRyc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksXG5cdHJzdWJtaXR0YWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtcblxuZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkge1xuXHR2YXIgbmFtZTtcblxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIG9iaiApICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIGFycmF5IGl0ZW0uXG5cdFx0alF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7XG5cdFx0XHRpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkge1xuXG5cdFx0XHRcdC8vIFRyZWF0IGVhY2ggYXJyYXkgaXRlbSBhcyBhIHNjYWxhci5cblx0XHRcdFx0YWRkKCBwcmVmaXgsIHYgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBJdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMgbnVtZXJpYyBpbmRleC5cblx0XHRcdFx0YnVpbGRQYXJhbXMoXG5cdFx0XHRcdFx0cHJlZml4ICsgXCJbXCIgKyAoIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT0gbnVsbCA/IGkgOiBcIlwiICkgKyBcIl1cIixcblx0XHRcdFx0XHR2LFxuXHRcdFx0XHRcdHRyYWRpdGlvbmFsLFxuXHRcdFx0XHRcdGFkZFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblxuXHR9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgdG9UeXBlKCBvYmogKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXggKyBcIltcIiArIG5hbWUgKyBcIl1cIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS5cblx0XHRhZGQoIHByZWZpeCwgb2JqICk7XG5cdH1cbn1cblxuLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2Zcbi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZ1xualF1ZXJ5LnBhcmFtID0gZnVuY3Rpb24oIGEsIHRyYWRpdGlvbmFsICkge1xuXHR2YXIgcHJlZml4LFxuXHRcdHMgPSBbXSxcblx0XHRhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7XG5cblx0XHRcdC8vIElmIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGludm9rZSBpdCBhbmQgdXNlIGl0cyByZXR1cm4gdmFsdWVcblx0XHRcdHZhciB2YWx1ZSA9IGlzRnVuY3Rpb24oIHZhbHVlT3JGdW5jdGlvbiApID9cblx0XHRcdFx0dmFsdWVPckZ1bmN0aW9uKCkgOlxuXHRcdFx0XHR2YWx1ZU9yRnVuY3Rpb247XG5cblx0XHRcdHNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgXCI9XCIgK1xuXHRcdFx0XHRlbmNvZGVVUklDb21wb25lbnQoIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKTtcblx0XHR9O1xuXG5cdGlmICggYSA9PSBudWxsICkge1xuXHRcdHJldHVybiBcIlwiO1xuXHR9XG5cblx0Ly8gSWYgYW4gYXJyYXkgd2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cy5cblx0aWYgKCBBcnJheS5pc0FycmF5KCBhICkgfHwgKCBhLmpxdWVyeSAmJiAhalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGEgKSApICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzXG5cdFx0alF1ZXJ5LmVhY2goIGEsIGZ1bmN0aW9uKCkge1xuXHRcdFx0YWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTtcblx0XHR9ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIElmIHRyYWRpdGlvbmFsLCBlbmNvZGUgdGhlIFwib2xkXCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyXG5cdFx0Ly8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuXG5cdFx0Zm9yICggcHJlZml4IGluIGEgKSB7XG5cdFx0XHRidWlsZFBhcmFtcyggcHJlZml4LCBhWyBwcmVmaXggXSwgdHJhZGl0aW9uYWwsIGFkZCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb25cblx0cmV0dXJuIHMuam9pbiggXCImXCIgKTtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0c2VyaWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4galF1ZXJ5LnBhcmFtKCB0aGlzLnNlcmlhbGl6ZUFycmF5KCkgKTtcblx0fSxcblx0c2VyaWFsaXplQXJyYXk6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIENhbiBhZGQgcHJvcEhvb2sgZm9yIFwiZWxlbWVudHNcIiB0byBmaWx0ZXIgb3IgYWRkIGZvcm0gZWxlbWVudHNcblx0XHRcdHZhciBlbGVtZW50cyA9IGpRdWVyeS5wcm9wKCB0aGlzLCBcImVsZW1lbnRzXCIgKTtcblx0XHRcdHJldHVybiBlbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkoIGVsZW1lbnRzICkgOiB0aGlzO1xuXHRcdH0gKS5maWx0ZXIoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRcdC8vIFVzZSAuaXMoIFwiOmRpc2FibGVkXCIgKSBzbyB0aGF0IGZpZWxkc2V0W2Rpc2FibGVkXSB3b3Jrc1xuXHRcdFx0cmV0dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoIFwiOmRpc2FibGVkXCIgKSAmJlxuXHRcdFx0XHRyc3VibWl0dGFibGUudGVzdCggdGhpcy5ub2RlTmFtZSApICYmICFyc3VibWl0dGVyVHlwZXMudGVzdCggdHlwZSApICYmXG5cdFx0XHRcdCggdGhpcy5jaGVja2VkIHx8ICFyY2hlY2thYmxlVHlwZS50ZXN0KCB0eXBlICkgKTtcblx0XHR9ICkubWFwKCBmdW5jdGlvbiggX2ksIGVsZW0gKSB7XG5cdFx0XHR2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7XG5cblx0XHRcdGlmICggdmFsID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsICkge1xuXHRcdFx0XHRcdHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCBcIlxcclxcblwiICkgfTtcblx0XHR9ICkuZ2V0KCk7XG5cdH1cbn0gKTtcblxuXG52YXJcblx0cjIwID0gLyUyMC9nLFxuXHRyaGFzaCA9IC8jLiokLyxcblx0cmFudGlDYWNoZSA9IC8oWz8mXSlfPVteJl0qLyxcblx0cmhlYWRlcnMgPSAvXiguKj8pOlsgXFx0XSooW15cXHJcXG5dKikkL21nLFxuXG5cdC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvblxuXHRybG9jYWxQcm90b2NvbCA9IC9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFxuXHRybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLyxcblx0cnByb3RvY29sID0gL15cXC9cXC8vLFxuXG5cdC8qIFByZWZpbHRlcnNcblx0ICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSlcblx0ICogMikgVGhlc2UgYXJlIGNhbGxlZDpcblx0ICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydFxuXHQgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpXG5cdCAqIDMpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogNCkgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiA1KSBleGVjdXRpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0cHJlZmlsdGVycyA9IHt9LFxuXG5cdC8qIFRyYW5zcG9ydHMgYmluZGluZ3Ncblx0ICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0dHJhbnNwb3J0cyA9IHt9LFxuXG5cdC8vIEF2b2lkIGNvbW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvblxuXHRhbGxUeXBlcyA9IFwiKi9cIi5jb25jYXQoIFwiKlwiICksXG5cblx0Ly8gQW5jaG9yIHRhZyBmb3IgcGFyc2luZyB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiYVwiICk7XG5cbm9yaWdpbkFuY2hvci5ocmVmID0gbG9jYXRpb24uaHJlZjtcblxuLy8gQmFzZSBcImNvbnN0cnVjdG9yXCIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydFxuZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7XG5cblx0Ly8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byBcIipcIlxuXHRyZXR1cm4gZnVuY3Rpb24oIGRhdGFUeXBlRXhwcmVzc2lvbiwgZnVuYyApIHtcblxuXHRcdGlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGZ1bmMgPSBkYXRhVHlwZUV4cHJlc3Npb247XG5cdFx0XHRkYXRhVHlwZUV4cHJlc3Npb24gPSBcIipcIjtcblx0XHR9XG5cblx0XHR2YXIgZGF0YVR5cGUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGRhdGFUeXBlcyA9IGRhdGFUeXBlRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIGZ1bmMgKSApIHtcblxuXHRcdFx0Ly8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvblxuXHRcdFx0d2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkge1xuXG5cdFx0XHRcdC8vIFByZXBlbmQgaWYgcmVxdWVzdGVkXG5cdFx0XHRcdGlmICggZGF0YVR5cGVbIDAgXSA9PT0gXCIrXCIgKSB7XG5cdFx0XHRcdFx0ZGF0YVR5cGUgPSBkYXRhVHlwZS5zbGljZSggMSApIHx8IFwiKlwiO1xuXHRcdFx0XHRcdCggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBhcHBlbmRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnB1c2goIGZ1bmMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuLy8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRzXG5mdW5jdGlvbiBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICkge1xuXG5cdHZhciBpbnNwZWN0ZWQgPSB7fSxcblx0XHRzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMgKTtcblxuXHRmdW5jdGlvbiBpbnNwZWN0KCBkYXRhVHlwZSApIHtcblx0XHR2YXIgc2VsZWN0ZWQ7XG5cdFx0aW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTtcblx0XHRqUXVlcnkuZWFjaCggc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdLCBmdW5jdGlvbiggXywgcHJlZmlsdGVyT3JGYWN0b3J5ICkge1xuXHRcdFx0dmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTtcblx0XHRcdGlmICggdHlwZW9mIGRhdGFUeXBlT3JUcmFuc3BvcnQgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0IXNlZWtpbmdUcmFuc3BvcnQgJiYgIWluc3BlY3RlZFsgZGF0YVR5cGVPclRyYW5zcG9ydCBdICkge1xuXG5cdFx0XHRcdG9wdGlvbnMuZGF0YVR5cGVzLnVuc2hpZnQoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0aW5zcGVjdCggZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9IGVsc2UgaWYgKCBzZWVraW5nVHJhbnNwb3J0ICkge1xuXHRcdFx0XHRyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdHJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgXCIqXCIgXSAmJiBpbnNwZWN0KCBcIipcIiApO1xufVxuXG4vLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnNcbi8vIHRoYXQgdGFrZXMgXCJmbGF0XCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpXG4vLyBGaXhlcyAjOTg4N1xuZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7XG5cdHZhciBrZXksIGRlZXAsXG5cdFx0ZmxhdE9wdGlvbnMgPSBqUXVlcnkuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zIHx8IHt9O1xuXG5cdGZvciAoIGtleSBpbiBzcmMgKSB7XG5cdFx0aWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHQoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtleSBdO1xuXHRcdH1cblx0fVxuXHRpZiAoIGRlZXAgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdHJ1ZSwgdGFyZ2V0LCBkZWVwICk7XG5cdH1cblxuXHRyZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6XG4gKiAtIGZpbmRzIHRoZSByaWdodCBkYXRhVHlwZSAobWVkaWF0ZXMgYmV0d2VlbiBjb250ZW50LXR5cGUgYW5kIGV4cGVjdGVkIGRhdGFUeXBlKVxuICogLSByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSB7XG5cblx0dmFyIGN0LCB0eXBlLCBmaW5hbERhdGFUeXBlLCBmaXJzdERhdGFUeXBlLFxuXHRcdGNvbnRlbnRzID0gcy5jb250ZW50cyxcblx0XHRkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcztcblxuXHQvLyBSZW1vdmUgYXV0byBkYXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQtdHlwZSBpbiB0aGUgcHJvY2Vzc1xuXHR3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSBcIipcIiApIHtcblx0XHRkYXRhVHlwZXMuc2hpZnQoKTtcblx0XHRpZiAoIGN0ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRjdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiQ29udGVudC1UeXBlXCIgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBrbm93biBjb250ZW50LXR5cGVcblx0aWYgKCBjdCApIHtcblx0XHRmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkge1xuXHRcdFx0aWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0eXBlIF0udGVzdCggY3QgKSApIHtcblx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSByZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBlXG5cdGlmICggZGF0YVR5cGVzWyAwIF0gaW4gcmVzcG9uc2VzICkge1xuXHRcdGZpbmFsRGF0YVR5cGUgPSBkYXRhVHlwZXNbIDAgXTtcblx0fSBlbHNlIHtcblxuXHRcdC8vIFRyeSBjb252ZXJ0aWJsZSBkYXRhVHlwZXNcblx0XHRmb3IgKCB0eXBlIGluIHJlc3BvbnNlcyApIHtcblx0XHRcdGlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlwZSArIFwiIFwiICsgZGF0YVR5cGVzWyAwIF0gXSApIHtcblx0XHRcdFx0ZmluYWxEYXRhVHlwZSA9IHR5cGU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAhZmlyc3REYXRhVHlwZSApIHtcblx0XHRcdFx0Zmlyc3REYXRhVHlwZSA9IHR5cGU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gT3IganVzdCB1c2UgZmlyc3Qgb25lXG5cdFx0ZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwgZmlyc3REYXRhVHlwZTtcblx0fVxuXG5cdC8vIElmIHdlIGZvdW5kIGEgZGF0YVR5cGVcblx0Ly8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWRcblx0Ly8gYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuXHRpZiAoIGZpbmFsRGF0YVR5cGUgKSB7XG5cdFx0aWYgKCBmaW5hbERhdGFUeXBlICE9PSBkYXRhVHlwZXNbIDAgXSApIHtcblx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCBmaW5hbERhdGFUeXBlICk7XG5cdFx0fVxuXHRcdHJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTtcblx0fVxufVxuXG4vKiBDaGFpbiBjb252ZXJzaW9ucyBnaXZlbiB0aGUgcmVxdWVzdCBhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlXG4gKiBBbHNvIHNldHMgdGhlIHJlc3BvbnNlWFhYIGZpZWxkcyBvbiB0aGUganFYSFIgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICkge1xuXHR2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldixcblx0XHRjb252ZXJ0ZXJzID0ge30sXG5cblx0XHQvLyBXb3JrIHdpdGggYSBjb3B5IG9mIGRhdGFUeXBlcyBpbiBjYXNlIHdlIG5lZWQgdG8gbW9kaWZ5IGl0IGZvciBjb252ZXJzaW9uXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXMuc2xpY2UoKTtcblxuXHQvLyBDcmVhdGUgY29udmVydGVycyBtYXAgd2l0aCBsb3dlcmNhc2VkIGtleXNcblx0aWYgKCBkYXRhVHlwZXNbIDEgXSApIHtcblx0XHRmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHtcblx0XHRcdGNvbnZlcnRlcnNbIGNvbnYudG9Mb3dlckNhc2UoKSBdID0gcy5jb252ZXJ0ZXJzWyBjb252IF07XG5cdFx0fVxuXHR9XG5cblx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdC8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlXG5cdHdoaWxlICggY3VycmVudCApIHtcblxuXHRcdGlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkge1xuXHRcdFx0anFYSFJbIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSBdID0gcmVzcG9uc2U7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWRcblx0XHRpZiAoICFwcmV2ICYmIGlzU3VjY2VzcyAmJiBzLmRhdGFGaWx0ZXIgKSB7XG5cdFx0XHRyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTtcblx0XHR9XG5cblx0XHRwcmV2ID0gY3VycmVudDtcblx0XHRjdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0KCk7XG5cblx0XHRpZiAoIGN1cnJlbnQgKSB7XG5cblx0XHRcdC8vIFRoZXJlJ3Mgb25seSB3b3JrIHRvIGRvIGlmIGN1cnJlbnQgZGF0YVR5cGUgaXMgbm9uLWF1dG9cblx0XHRcdGlmICggY3VycmVudCA9PT0gXCIqXCIgKSB7XG5cblx0XHRcdFx0Y3VycmVudCA9IHByZXY7XG5cblx0XHRcdC8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1cnJlbnRcblx0XHRcdH0gZWxzZSBpZiAoIHByZXYgIT09IFwiKlwiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXJcblx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyBcIiBcIiArIGN1cnJlbnQgXSB8fCBjb252ZXJ0ZXJzWyBcIiogXCIgKyBjdXJyZW50IF07XG5cblx0XHRcdFx0Ly8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXJcblx0XHRcdFx0aWYgKCAhY29udiApIHtcblx0XHRcdFx0XHRmb3IgKCBjb252MiBpbiBjb252ZXJ0ZXJzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBJZiBjb252MiBvdXRwdXRzIGN1cnJlbnRcblx0XHRcdFx0XHRcdHRtcCA9IGNvbnYyLnNwbGl0KCBcIiBcIiApO1xuXHRcdFx0XHRcdFx0aWYgKCB0bXBbIDEgXSA9PT0gY3VycmVudCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBJZiBwcmV2IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYWNjZXB0ZWQgaW5wdXRcblx0XHRcdFx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyBcIiBcIiArIHRtcFsgMCBdIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJzWyBcIiogXCIgKyB0bXBbIDAgXSBdO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGNvbnYgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBDb25kZW5zZSBlcXVpdmFsZW5jZSBjb252ZXJ0ZXJzXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBjb252ID09PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBPdGhlcndpc2UsIGluc2VydCB0aGUgaW50ZXJtZWRpYXRlIGRhdGFUeXBlXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggY29udmVydGVyc1sgY29udjIgXSAhPT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnQgPSB0bXBbIDAgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFwcGx5IGNvbnZlcnRlciAoaWYgbm90IGFuIGVxdWl2YWxlbmNlKVxuXHRcdFx0XHRpZiAoIGNvbnYgIT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHQvLyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2VkIHRvIGJ1YmJsZSwgY2F0Y2ggYW5kIHJldHVybiB0aGVtXG5cdFx0XHRcdFx0aWYgKCBjb252ICYmIHMudGhyb3dzICkge1xuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZTogXCJwYXJzZXJlcnJvclwiLFxuXHRcdFx0XHRcdFx0XHRcdGVycm9yOiBjb252ID8gZSA6IFwiTm8gY29udmVyc2lvbiBmcm9tIFwiICsgcHJldiArIFwiIHRvIFwiICsgY3VycmVudFxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7IHN0YXRlOiBcInN1Y2Nlc3NcIiwgZGF0YTogcmVzcG9uc2UgfTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIENvdW50ZXIgZm9yIGhvbGRpbmcgdGhlIG51bWJlciBvZiBhY3RpdmUgcXVlcmllc1xuXHRhY3RpdmU6IDAsXG5cblx0Ly8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdFxuXHRsYXN0TW9kaWZpZWQ6IHt9LFxuXHRldGFnOiB7fSxcblxuXHRhamF4U2V0dGluZ3M6IHtcblx0XHR1cmw6IGxvY2F0aW9uLmhyZWYsXG5cdFx0dHlwZTogXCJHRVRcIixcblx0XHRpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBsb2NhdGlvbi5wcm90b2NvbCApLFxuXHRcdGdsb2JhbDogdHJ1ZSxcblx0XHRwcm9jZXNzRGF0YTogdHJ1ZSxcblx0XHRhc3luYzogdHJ1ZSxcblx0XHRjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLThcIixcblxuXHRcdC8qXG5cdFx0dGltZW91dDogMCxcblx0XHRkYXRhOiBudWxsLFxuXHRcdGRhdGFUeXBlOiBudWxsLFxuXHRcdHVzZXJuYW1lOiBudWxsLFxuXHRcdHBhc3N3b3JkOiBudWxsLFxuXHRcdGNhY2hlOiBudWxsLFxuXHRcdHRocm93czogZmFsc2UsXG5cdFx0dHJhZGl0aW9uYWw6IGZhbHNlLFxuXHRcdGhlYWRlcnM6IHt9LFxuXHRcdCovXG5cblx0XHRhY2NlcHRzOiB7XG5cdFx0XHRcIipcIjogYWxsVHlwZXMsXG5cdFx0XHR0ZXh0OiBcInRleHQvcGxhaW5cIixcblx0XHRcdGh0bWw6IFwidGV4dC9odG1sXCIsXG5cdFx0XHR4bWw6IFwiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbFwiLFxuXHRcdFx0anNvbjogXCJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHRcIlxuXHRcdH0sXG5cblx0XHRjb250ZW50czoge1xuXHRcdFx0eG1sOiAvXFxieG1sXFxiLyxcblx0XHRcdGh0bWw6IC9cXGJodG1sLyxcblx0XHRcdGpzb246IC9cXGJqc29uXFxiL1xuXHRcdH0sXG5cblx0XHRyZXNwb25zZUZpZWxkczoge1xuXHRcdFx0eG1sOiBcInJlc3BvbnNlWE1MXCIsXG5cdFx0XHR0ZXh0OiBcInJlc3BvbnNlVGV4dFwiLFxuXHRcdFx0anNvbjogXCJyZXNwb25zZUpTT05cIlxuXHRcdH0sXG5cblx0XHQvLyBEYXRhIGNvbnZlcnRlcnNcblx0XHQvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgXCIqXCIpIGFuZCBkZXN0aW5hdGlvbiB0eXBlcyB3aXRoIGEgc2luZ2xlIHNwYWNlXG5cdFx0Y29udmVydGVyczoge1xuXG5cdFx0XHQvLyBDb252ZXJ0IGFueXRoaW5nIHRvIHRleHRcblx0XHRcdFwiKiB0ZXh0XCI6IFN0cmluZyxcblxuXHRcdFx0Ly8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pXG5cdFx0XHRcInRleHQgaHRtbFwiOiB0cnVlLFxuXG5cdFx0XHQvLyBFdmFsdWF0ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uXG5cdFx0XHRcInRleHQganNvblwiOiBKU09OLnBhcnNlLFxuXG5cdFx0XHQvLyBQYXJzZSB0ZXh0IGFzIHhtbFxuXHRcdFx0XCJ0ZXh0IHhtbFwiOiBqUXVlcnkucGFyc2VYTUxcblx0XHR9LFxuXG5cdFx0Ly8gRm9yIG9wdGlvbnMgdGhhdCBzaG91bGRuJ3QgYmUgZGVlcCBleHRlbmRlZDpcblx0XHQvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmXG5cdFx0Ly8gYW5kIHdoZW4geW91IGNyZWF0ZSBvbmUgdGhhdCBzaG91bGRuJ3QgYmVcblx0XHQvLyBkZWVwIGV4dGVuZGVkIChzZWUgYWpheEV4dGVuZClcblx0XHRmbGF0T3B0aW9uczoge1xuXHRcdFx0dXJsOiB0cnVlLFxuXHRcdFx0Y29udGV4dDogdHJ1ZVxuXHRcdH1cblx0fSxcblxuXHQvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldFxuXHQvLyB3aXRoIGJvdGggYWpheFNldHRpbmdzIGFuZCBzZXR0aW5ncyBmaWVsZHMuXG5cdC8vIElmIHRhcmdldCBpcyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuXG5cdGFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzID9cblxuXHRcdFx0Ly8gQnVpbGRpbmcgYSBzZXR0aW5ncyBvYmplY3Rcblx0XHRcdGFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDpcblxuXHRcdFx0Ly8gRXh0ZW5kaW5nIGFqYXhTZXR0aW5nc1xuXHRcdFx0YWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7XG5cdH0sXG5cblx0YWpheFByZWZpbHRlcjogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzICksXG5cdGFqYXhUcmFuc3BvcnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cyApLFxuXG5cdC8vIE1haW4gbWV0aG9kXG5cdGFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBJZiB1cmwgaXMgYW4gb2JqZWN0LCBzaW11bGF0ZSBwcmUtMS41IHNpZ25hdHVyZVxuXHRcdGlmICggdHlwZW9mIHVybCA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdG9wdGlvbnMgPSB1cmw7XG5cdFx0XHR1cmwgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3Rcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdHZhciB0cmFuc3BvcnQsXG5cblx0XHRcdC8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW1cblx0XHRcdGNhY2hlVVJMLFxuXG5cdFx0XHQvLyBSZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcsXG5cdFx0XHRyZXNwb25zZUhlYWRlcnMsXG5cblx0XHRcdC8vIHRpbWVvdXQgaGFuZGxlXG5cdFx0XHR0aW1lb3V0VGltZXIsXG5cblx0XHRcdC8vIFVybCBjbGVhbnVwIHZhclxuXHRcdFx0dXJsQW5jaG9yLFxuXG5cdFx0XHQvLyBSZXF1ZXN0IHN0YXRlIChiZWNvbWVzIGZhbHNlIHVwb24gc2VuZCBhbmQgdHJ1ZSB1cG9uIGNvbXBsZXRpb24pXG5cdFx0XHRjb21wbGV0ZWQsXG5cblx0XHRcdC8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUgdG8gYmUgZGlzcGF0Y2hlZFxuXHRcdFx0ZmlyZUdsb2JhbHMsXG5cblx0XHRcdC8vIExvb3AgdmFyaWFibGVcblx0XHRcdGksXG5cblx0XHRcdC8vIHVuY2FjaGVkIHBhcnQgb2YgdGhlIHVybFxuXHRcdFx0dW5jYWNoZWQsXG5cblx0XHRcdC8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3Rcblx0XHRcdHMgPSBqUXVlcnkuYWpheFNldHVwKCB7fSwgb3B0aW9ucyApLFxuXG5cdFx0XHQvLyBDYWxsYmFja3MgY29udGV4dFxuXHRcdFx0Y2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsXG5cblx0XHRcdC8vIENvbnRleHQgZm9yIGdsb2JhbCBldmVudHMgaXMgY2FsbGJhY2tDb250ZXh0IGlmIGl0IGlzIGEgRE9NIG5vZGUgb3IgalF1ZXJ5IGNvbGxlY3Rpb25cblx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dCA9IHMuY29udGV4dCAmJlxuXHRcdFx0XHQoIGNhbGxiYWNrQ29udGV4dC5ub2RlVHlwZSB8fCBjYWxsYmFja0NvbnRleHQuanF1ZXJ5ICkgP1xuXHRcdFx0XHRqUXVlcnkoIGNhbGxiYWNrQ29udGV4dCApIDpcblx0XHRcdFx0alF1ZXJ5LmV2ZW50LFxuXG5cdFx0XHQvLyBEZWZlcnJlZHNcblx0XHRcdGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRjb21wbGV0ZURlZmVycmVkID0galF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksXG5cblx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRzdGF0dXNDb2RlID0gcy5zdGF0dXNDb2RlIHx8IHt9LFxuXG5cdFx0XHQvLyBIZWFkZXJzICh0aGV5IGFyZSBzZW50IGFsbCBhdCBvbmNlKVxuXHRcdFx0cmVxdWVzdEhlYWRlcnMgPSB7fSxcblx0XHRcdHJlcXVlc3RIZWFkZXJzTmFtZXMgPSB7fSxcblxuXHRcdFx0Ly8gRGVmYXVsdCBhYm9ydCBtZXNzYWdlXG5cdFx0XHRzdHJBYm9ydCA9IFwiY2FuY2VsZWRcIixcblxuXHRcdFx0Ly8gRmFrZSB4aHJcblx0XHRcdGpxWEhSID0ge1xuXHRcdFx0XHRyZWFkeVN0YXRlOiAwLFxuXG5cdFx0XHRcdC8vIEJ1aWxkcyBoZWFkZXJzIGhhc2h0YWJsZSBpZiBuZWVkZWRcblx0XHRcdFx0Z2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKCBrZXkgKSB7XG5cdFx0XHRcdFx0dmFyIG1hdGNoO1xuXHRcdFx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRcdFx0aWYgKCAhcmVzcG9uc2VIZWFkZXJzICkge1xuXHRcdFx0XHRcdFx0XHRyZXNwb25zZUhlYWRlcnMgPSB7fTtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAoIG1hdGNoID0gcmhlYWRlcnMuZXhlYyggcmVzcG9uc2VIZWFkZXJzU3RyaW5nICkgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXNwb25zZUhlYWRlcnNbIG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKSArIFwiIFwiIF0gPVxuXHRcdFx0XHRcdFx0XHRcdFx0KCByZXNwb25zZUhlYWRlcnNbIG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKSArIFwiIFwiIF0gfHwgW10gKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuY29uY2F0KCBtYXRjaFsgMiBdICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1hdGNoID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSArIFwiIFwiIF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBtYXRjaCA9PSBudWxsID8gbnVsbCA6IG1hdGNoLmpvaW4oIFwiLCBcIiApO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFJhdyBzdHJpbmdcblx0XHRcdFx0Z2V0QWxsUmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gY29tcGxldGVkID8gcmVzcG9uc2VIZWFkZXJzU3RyaW5nIDogbnVsbDtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBDYWNoZXMgdGhlIGhlYWRlclxuXHRcdFx0XHRzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRcdG5hbWUgPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSA9XG5cdFx0XHRcdFx0XHRcdHJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8IG5hbWU7XG5cdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyXG5cdFx0XHRcdG92ZXJyaWRlTWltZVR5cGU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdFx0XHRcdGlmICggY29tcGxldGVkID09IG51bGwgKSB7XG5cdFx0XHRcdFx0XHRzLm1pbWVUeXBlID0gdHlwZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdFx0c3RhdHVzQ29kZTogZnVuY3Rpb24oIG1hcCApIHtcblx0XHRcdFx0XHR2YXIgY29kZTtcblx0XHRcdFx0XHRpZiAoIG1hcCApIHtcblx0XHRcdFx0XHRcdGlmICggY29tcGxldGVkICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEV4ZWN1dGUgdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrc1xuXHRcdFx0XHRcdFx0XHRqcVhIUi5hbHdheXMoIG1hcFsganFYSFIuc3RhdHVzIF0gKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gTGF6eS1hZGQgdGhlIG5ldyBjYWxsYmFja3MgaW4gYSB3YXkgdGhhdCBwcmVzZXJ2ZXMgb2xkIG9uZXNcblx0XHRcdFx0XHRcdFx0Zm9yICggY29kZSBpbiBtYXAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0c3RhdHVzQ29kZVsgY29kZSBdID0gWyBzdGF0dXNDb2RlWyBjb2RlIF0sIG1hcFsgY29kZSBdIF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FuY2VsIHRoZSByZXF1ZXN0XG5cdFx0XHRcdGFib3J0OiBmdW5jdGlvbiggc3RhdHVzVGV4dCApIHtcblx0XHRcdFx0XHR2YXIgZmluYWxUZXh0ID0gc3RhdHVzVGV4dCB8fCBzdHJBYm9ydDtcblx0XHRcdFx0XHRpZiAoIHRyYW5zcG9ydCApIHtcblx0XHRcdFx0XHRcdHRyYW5zcG9ydC5hYm9ydCggZmluYWxUZXh0ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGRvbmUoIDAsIGZpbmFsVGV4dCApO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0Ly8gQXR0YWNoIGRlZmVycmVkc1xuXHRcdGRlZmVycmVkLnByb21pc2UoIGpxWEhSICk7XG5cblx0XHQvLyBBZGQgcHJvdG9jb2wgaWYgbm90IHByb3ZpZGVkIChwcmVmaWx0ZXJzIG1pZ2h0IGV4cGVjdCBpdClcblx0XHQvLyBIYW5kbGUgZmFsc3kgdXJsIGluIHRoZSBzZXR0aW5ncyBvYmplY3QgKCMxMDA5MzogY29uc2lzdGVuY3kgd2l0aCBvbGQgc2lnbmF0dXJlKVxuXHRcdC8vIFdlIGFsc28gdXNlIHRoZSB1cmwgcGFyYW1ldGVyIGlmIGF2YWlsYWJsZVxuXHRcdHMudXJsID0gKCAoIHVybCB8fCBzLnVybCB8fCBsb2NhdGlvbi5ocmVmICkgKyBcIlwiIClcblx0XHRcdC5yZXBsYWNlKCBycHJvdG9jb2wsIGxvY2F0aW9uLnByb3RvY29sICsgXCIvL1wiICk7XG5cblx0XHQvLyBBbGlhcyBtZXRob2Qgb3B0aW9uIHRvIHR5cGUgYXMgcGVyIHRpY2tldCAjMTIwMDRcblx0XHRzLnR5cGUgPSBvcHRpb25zLm1ldGhvZCB8fCBvcHRpb25zLnR5cGUgfHwgcy5tZXRob2QgfHwgcy50eXBlO1xuXG5cdFx0Ly8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdFxuXHRcdHMuZGF0YVR5cGVzID0gKCBzLmRhdGFUeXBlIHx8IFwiKlwiICkudG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXG5cdFx0Ly8gQSBjcm9zcy1kb21haW4gcmVxdWVzdCBpcyBpbiBvcmRlciB3aGVuIHRoZSBvcmlnaW4gZG9lc24ndCBtYXRjaCB0aGUgY3VycmVudCBvcmlnaW4uXG5cdFx0aWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7XG5cdFx0XHR1cmxBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImFcIiApO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSwgRWRnZSAxMiAtIDE1XG5cdFx0XHQvLyBJRSB0aHJvd3MgZXhjZXB0aW9uIG9uIGFjY2Vzc2luZyB0aGUgaHJlZiBwcm9wZXJ0eSBpZiB1cmwgaXMgbWFsZm9ybWVkLFxuXHRcdFx0Ly8gZS5nLiBodHRwOi8vZXhhbXBsZS5jb206ODB4L1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dXJsQW5jaG9yLmhyZWYgPSBzLnVybDtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSBvbmx5XG5cdFx0XHRcdC8vIEFuY2hvcidzIGhvc3QgcHJvcGVydHkgaXNuJ3QgY29ycmVjdGx5IHNldCB3aGVuIHMudXJsIGlzIHJlbGF0aXZlXG5cdFx0XHRcdHVybEFuY2hvci5ocmVmID0gdXJsQW5jaG9yLmhyZWY7XG5cdFx0XHRcdHMuY3Jvc3NEb21haW4gPSBvcmlnaW5BbmNob3IucHJvdG9jb2wgKyBcIi8vXCIgKyBvcmlnaW5BbmNob3IuaG9zdCAhPT1cblx0XHRcdFx0XHR1cmxBbmNob3IucHJvdG9jb2wgKyBcIi8vXCIgKyB1cmxBbmNob3IuaG9zdDtcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdC8vIElmIHRoZXJlIGlzIGFuIGVycm9yIHBhcnNpbmcgdGhlIFVSTCwgYXNzdW1lIGl0IGlzIGNyb3NzRG9tYWluLFxuXHRcdFx0XHQvLyBpdCBjYW4gYmUgcmVqZWN0ZWQgYnkgdGhlIHRyYW5zcG9ydCBpZiBpdCBpcyBpbnZhbGlkXG5cdFx0XHRcdHMuY3Jvc3NEb21haW4gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENvbnZlcnQgZGF0YSBpZiBub3QgYWxyZWFkeSBhIHN0cmluZ1xuXHRcdGlmICggcy5kYXRhICYmIHMucHJvY2Vzc0RhdGEgJiYgdHlwZW9mIHMuZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHMuZGF0YSA9IGpRdWVyeS5wYXJhbSggcy5kYXRhLCBzLnRyYWRpdGlvbmFsICk7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgcHJlZmlsdGVyc1xuXHRcdGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYSBwcmVmaWx0ZXIsIHN0b3AgdGhlcmVcblx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdHJldHVybiBqcVhIUjtcblx0XHR9XG5cblx0XHQvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0b1xuXHRcdC8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICgjMTUxMTgpXG5cdFx0ZmlyZUdsb2JhbHMgPSBqUXVlcnkuZXZlbnQgJiYgcy5nbG9iYWw7XG5cblx0XHQvLyBXYXRjaCBmb3IgYSBuZXcgc2V0IG9mIHJlcXVlc3RzXG5cdFx0aWYgKCBmaXJlR2xvYmFscyAmJiBqUXVlcnkuYWN0aXZlKysgPT09IDAgKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggXCJhamF4U3RhcnRcIiApO1xuXHRcdH1cblxuXHRcdC8vIFVwcGVyY2FzZSB0aGUgdHlwZVxuXHRcdHMudHlwZSA9IHMudHlwZS50b1VwcGVyQ2FzZSgpO1xuXG5cdFx0Ly8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnRcblx0XHRzLmhhc0NvbnRlbnQgPSAhcm5vQ29udGVudC50ZXN0KCBzLnR5cGUgKTtcblxuXHRcdC8vIFNhdmUgdGhlIFVSTCBpbiBjYXNlIHdlJ3JlIHRveWluZyB3aXRoIHRoZSBJZi1Nb2RpZmllZC1TaW5jZVxuXHRcdC8vIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciBsYXRlciBvblxuXHRcdC8vIFJlbW92ZSBoYXNoIHRvIHNpbXBsaWZ5IHVybCBtYW5pcHVsYXRpb25cblx0XHRjYWNoZVVSTCA9IHMudXJsLnJlcGxhY2UoIHJoYXNoLCBcIlwiICk7XG5cblx0XHQvLyBNb3JlIG9wdGlvbnMgaGFuZGxpbmcgZm9yIHJlcXVlc3RzIHdpdGggbm8gY29udGVudFxuXHRcdGlmICggIXMuaGFzQ29udGVudCApIHtcblxuXHRcdFx0Ly8gUmVtZW1iZXIgdGhlIGhhc2ggc28gd2UgY2FuIHB1dCBpdCBiYWNrXG5cdFx0XHR1bmNhY2hlZCA9IHMudXJsLnNsaWNlKCBjYWNoZVVSTC5sZW5ndGggKTtcblxuXHRcdFx0Ly8gSWYgZGF0YSBpcyBhdmFpbGFibGUgYW5kIHNob3VsZCBiZSBwcm9jZXNzZWQsIGFwcGVuZCBkYXRhIHRvIHVybFxuXHRcdFx0aWYgKCBzLmRhdGEgJiYgKCBzLnByb2Nlc3NEYXRhIHx8IHR5cGVvZiBzLmRhdGEgPT09IFwic3RyaW5nXCIgKSApIHtcblx0XHRcdFx0Y2FjaGVVUkwgKz0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuZGF0YTtcblxuXHRcdFx0XHQvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5XG5cdFx0XHRcdGRlbGV0ZSBzLmRhdGE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBvciB1cGRhdGUgYW50aS1jYWNoZSBwYXJhbSBpZiBuZWVkZWRcblx0XHRcdGlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdGNhY2hlVVJMID0gY2FjaGVVUkwucmVwbGFjZSggcmFudGlDYWNoZSwgXCIkMVwiICk7XG5cdFx0XHRcdHVuY2FjaGVkID0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/IFwiJlwiIDogXCI/XCIgKSArIFwiXz1cIiArICggbm9uY2UuZ3VpZCsrICkgK1xuXHRcdFx0XHRcdHVuY2FjaGVkO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBQdXQgaGFzaCBhbmQgYW50aS1jYWNoZSBvbiB0aGUgVVJMIHRoYXQgd2lsbCBiZSByZXF1ZXN0ZWQgKGdoLTE3MzIpXG5cdFx0XHRzLnVybCA9IGNhY2hlVVJMICsgdW5jYWNoZWQ7XG5cblx0XHQvLyBDaGFuZ2UgJyUyMCcgdG8gJysnIGlmIHRoaXMgaXMgZW5jb2RlZCBmb3JtIGJvZHkgY29udGVudCAoZ2gtMjY1OClcblx0XHR9IGVsc2UgaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJlxuXHRcdFx0KCBzLmNvbnRlbnRUeXBlIHx8IFwiXCIgKS5pbmRleE9mKCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiICkgPT09IDAgKSB7XG5cdFx0XHRzLmRhdGEgPSBzLmRhdGEucmVwbGFjZSggcjIwLCBcIitcIiApO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTW9kaWZpZWQtU2luY2VcIiwgalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Ob25lLU1hdGNoXCIsIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50XG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5oYXNDb250ZW50ICYmIHMuY29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVudFR5cGUgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiLCBzLmNvbnRlbnRUeXBlICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZVxuXHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoXG5cdFx0XHRcIkFjY2VwdFwiLFxuXHRcdFx0cy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/XG5cdFx0XHRcdHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbIDAgXSBdICtcblx0XHRcdFx0XHQoIHMuZGF0YVR5cGVzWyAwIF0gIT09IFwiKlwiID8gXCIsIFwiICsgYWxsVHlwZXMgKyBcIjsgcT0wLjAxXCIgOiBcIlwiICkgOlxuXHRcdFx0XHRzLmFjY2VwdHNbIFwiKlwiIF1cblx0XHQpO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uXG5cdFx0Zm9yICggaSBpbiBzLmhlYWRlcnMgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApO1xuXHRcdH1cblxuXHRcdC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnRcblx0XHRpZiAoIHMuYmVmb3JlU2VuZCAmJlxuXHRcdFx0KCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBjb21wbGV0ZWQgKSApIHtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuXG5cdFx0XHRyZXR1cm4ganFYSFIuYWJvcnQoKTtcblx0XHR9XG5cblx0XHQvLyBBYm9ydGluZyBpcyBubyBsb25nZXIgYSBjYW5jZWxsYXRpb25cblx0XHRzdHJBYm9ydCA9IFwiYWJvcnRcIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tzIG9uIGRlZmVycmVkc1xuXHRcdGNvbXBsZXRlRGVmZXJyZWQuYWRkKCBzLmNvbXBsZXRlICk7XG5cdFx0anFYSFIuZG9uZSggcy5zdWNjZXNzICk7XG5cdFx0anFYSFIuZmFpbCggcy5lcnJvciApO1xuXG5cdFx0Ly8gR2V0IHRyYW5zcG9ydFxuXHRcdHRyYW5zcG9ydCA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0XG5cdFx0aWYgKCAhdHJhbnNwb3J0ICkge1xuXHRcdFx0ZG9uZSggLTEsIFwiTm8gVHJhbnNwb3J0XCIgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IDE7XG5cblx0XHRcdC8vIFNlbmQgZ2xvYmFsIGV2ZW50XG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4U2VuZFwiLCBbIGpxWEhSLCBzIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYWpheFNlbmQsIHN0b3AgdGhlcmVcblx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRpbWVvdXRcblx0XHRcdGlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkge1xuXHRcdFx0XHR0aW1lb3V0VGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0anFYSFIuYWJvcnQoIFwidGltZW91dFwiICk7XG5cdFx0XHRcdH0sIHMudGltZW91dCApO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb21wbGV0ZWQgPSBmYWxzZTtcblx0XHRcdFx0dHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25lICk7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBSZXRocm93IHBvc3QtY29tcGxldGlvbiBleGNlcHRpb25zXG5cdFx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBQcm9wYWdhdGUgb3RoZXJzIGFzIHJlc3VsdHNcblx0XHRcdFx0ZG9uZSggLTEsIGUgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsYmFjayBmb3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmVcblx0XHRmdW5jdGlvbiBkb25lKCBzdGF0dXMsIG5hdGl2ZVN0YXR1c1RleHQsIHJlc3BvbnNlcywgaGVhZGVycyApIHtcblx0XHRcdHZhciBpc1N1Y2Nlc3MsIHN1Y2Nlc3MsIGVycm9yLCByZXNwb25zZSwgbW9kaWZpZWQsXG5cdFx0XHRcdHN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNUZXh0O1xuXG5cdFx0XHQvLyBJZ25vcmUgcmVwZWF0IGludm9jYXRpb25zXG5cdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb21wbGV0ZWQgPSB0cnVlO1xuXG5cdFx0XHQvLyBDbGVhciB0aW1lb3V0IGlmIGl0IGV4aXN0c1xuXHRcdFx0aWYgKCB0aW1lb3V0VGltZXIgKSB7XG5cdFx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXRUaW1lciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBEZXJlZmVyZW5jZSB0cmFuc3BvcnQgZm9yIGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvblxuXHRcdFx0Ly8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZClcblx0XHRcdHRyYW5zcG9ydCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0Ly8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nID0gaGVhZGVycyB8fCBcIlwiO1xuXG5cdFx0XHQvLyBTZXQgcmVhZHlTdGF0ZVxuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDtcblxuXHRcdFx0Ly8gRGV0ZXJtaW5lIGlmIHN1Y2Nlc3NmdWxcblx0XHRcdGlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0O1xuXG5cdFx0XHQvLyBHZXQgcmVzcG9uc2UgZGF0YVxuXHRcdFx0aWYgKCByZXNwb25zZXMgKSB7XG5cdFx0XHRcdHJlc3BvbnNlID0gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVc2UgYSBub29wIGNvbnZlcnRlciBmb3IgbWlzc2luZyBzY3JpcHQgYnV0IG5vdCBpZiBqc29ucFxuXHRcdFx0aWYgKCAhaXNTdWNjZXNzICYmXG5cdFx0XHRcdGpRdWVyeS5pbkFycmF5KCBcInNjcmlwdFwiLCBzLmRhdGFUeXBlcyApID4gLTEgJiZcblx0XHRcdFx0alF1ZXJ5LmluQXJyYXkoIFwianNvblwiLCBzLmRhdGFUeXBlcyApIDwgMCApIHtcblx0XHRcdFx0cy5jb252ZXJ0ZXJzWyBcInRleHQgc2NyaXB0XCIgXSA9IGZ1bmN0aW9uKCkge307XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnZlcnQgbm8gbWF0dGVyIHdoYXQgKHRoYXQgd2F5IHJlc3BvbnNlWFhYIGZpZWxkcyBhcmUgYWx3YXlzIHNldClcblx0XHRcdHJlc3BvbnNlID0gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICk7XG5cblx0XHRcdC8vIElmIHN1Y2Nlc3NmdWwsIGhhbmRsZSB0eXBlIGNoYWluaW5nXG5cdFx0XHRpZiAoIGlzU3VjY2VzcyApIHtcblxuXHRcdFx0XHQvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLlxuXHRcdFx0XHRpZiAoIHMuaWZNb2RpZmllZCApIHtcblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcIkxhc3QtTW9kaWZpZWRcIiApO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdID0gbW9kaWZpZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiZXRhZ1wiICk7XG5cdFx0XHRcdFx0aWYgKCBtb2RpZmllZCApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdID0gbW9kaWZpZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gaWYgbm8gY29udGVudFxuXHRcdFx0XHRpZiAoIHN0YXR1cyA9PT0gMjA0IHx8IHMudHlwZSA9PT0gXCJIRUFEXCIgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwibm9jb250ZW50XCI7XG5cblx0XHRcdFx0Ly8gaWYgbm90IG1vZGlmaWVkXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHN0YXR1cyA9PT0gMzA0ICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vdG1vZGlmaWVkXCI7XG5cblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBkYXRhLCBsZXQncyBjb252ZXJ0IGl0XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXRlO1xuXHRcdFx0XHRcdHN1Y2Nlc3MgPSByZXNwb25zZS5kYXRhO1xuXHRcdFx0XHRcdGVycm9yID0gcmVzcG9uc2UuZXJyb3I7XG5cdFx0XHRcdFx0aXNTdWNjZXNzID0gIWVycm9yO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0IGFuZCBub3JtYWxpemUgZm9yIG5vbi1hYm9ydHNcblx0XHRcdFx0ZXJyb3IgPSBzdGF0dXNUZXh0O1xuXHRcdFx0XHRpZiAoIHN0YXR1cyB8fCAhc3RhdHVzVGV4dCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJlcnJvclwiO1xuXHRcdFx0XHRcdGlmICggc3RhdHVzIDwgMCApIHtcblx0XHRcdFx0XHRcdHN0YXR1cyA9IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCBkYXRhIGZvciB0aGUgZmFrZSB4aHIgb2JqZWN0XG5cdFx0XHRqcVhIUi5zdGF0dXMgPSBzdGF0dXM7XG5cdFx0XHRqcVhIUi5zdGF0dXNUZXh0ID0gKCBuYXRpdmVTdGF0dXNUZXh0IHx8IHN0YXR1c1RleHQgKSArIFwiXCI7XG5cblx0XHRcdC8vIFN1Y2Nlc3MvRXJyb3Jcblx0XHRcdGlmICggaXNTdWNjZXNzICkge1xuXHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhSIF0gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0anFYSFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApO1xuXHRcdFx0c3RhdHVzQ29kZSA9IHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/IFwiYWpheFN1Y2Nlc3NcIiA6IFwiYWpheEVycm9yXCIsXG5cdFx0XHRcdFx0WyBqcVhIUiwgcywgaXNTdWNjZXNzID8gc3VjY2VzcyA6IGVycm9yIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29tcGxldGVcblx0XHRcdGNvbXBsZXRlRGVmZXJyZWQuZmlyZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCBdICk7XG5cblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBcImFqYXhDb21wbGV0ZVwiLCBbIGpxWEhSLCBzIF0gKTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXJcblx0XHRcdFx0aWYgKCAhKCAtLWpRdWVyeS5hY3RpdmUgKSApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggXCJhamF4U3RvcFwiICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ganFYSFI7XG5cdH0sXG5cblx0Z2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssIFwianNvblwiICk7XG5cdH0sXG5cblx0Z2V0U2NyaXB0OiBmdW5jdGlvbiggdXJsLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCB1bmRlZmluZWQsIGNhbGxiYWNrLCBcInNjcmlwdFwiICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIFsgXCJnZXRcIiwgXCJwb3N0XCIgXSwgZnVuY3Rpb24oIF9pLCBtZXRob2QgKSB7XG5cdGpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHtcblxuXHRcdC8vIFNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0dGVkXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBkYXRhICkgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBjYWxsYmFjaztcblx0XHRcdGNhbGxiYWNrID0gZGF0YTtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gVGhlIHVybCBjYW4gYmUgYW4gb3B0aW9ucyBvYmplY3QgKHdoaWNoIHRoZW4gbXVzdCBoYXZlIC51cmwpXG5cdFx0cmV0dXJuIGpRdWVyeS5hamF4KCBqUXVlcnkuZXh0ZW5kKCB7XG5cdFx0XHR1cmw6IHVybCxcblx0XHRcdHR5cGU6IG1ldGhvZCxcblx0XHRcdGRhdGFUeXBlOiB0eXBlLFxuXHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdHN1Y2Nlc3M6IGNhbGxiYWNrXG5cdFx0fSwgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHVybCApICYmIHVybCApICk7XG5cdH07XG59ICk7XG5cbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBmdW5jdGlvbiggcyApIHtcblx0dmFyIGk7XG5cdGZvciAoIGkgaW4gcy5oZWFkZXJzICkge1xuXHRcdGlmICggaS50b0xvd2VyQ2FzZSgpID09PSBcImNvbnRlbnQtdHlwZVwiICkge1xuXHRcdFx0cy5jb250ZW50VHlwZSA9IHMuaGVhZGVyc1sgaSBdIHx8IFwiXCI7XG5cdFx0fVxuXHR9XG59ICk7XG5cblxualF1ZXJ5Ll9ldmFsVXJsID0gZnVuY3Rpb24oIHVybCwgb3B0aW9ucywgZG9jICkge1xuXHRyZXR1cm4galF1ZXJ5LmFqYXgoIHtcblx0XHR1cmw6IHVybCxcblxuXHRcdC8vIE1ha2UgdGhpcyBleHBsaWNpdCwgc2luY2UgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyB0aHJvdWdoIGFqYXhTZXR1cCAoIzExMjY0KVxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0ZGF0YVR5cGU6IFwic2NyaXB0XCIsXG5cdFx0Y2FjaGU6IHRydWUsXG5cdFx0YXN5bmM6IGZhbHNlLFxuXHRcdGdsb2JhbDogZmFsc2UsXG5cblx0XHQvLyBPbmx5IGV2YWx1YXRlIHRoZSByZXNwb25zZSBpZiBpdCBpcyBzdWNjZXNzZnVsIChnaC00MTI2KVxuXHRcdC8vIGRhdGFGaWx0ZXIgaXMgbm90IGludm9rZWQgZm9yIGZhaWx1cmUgcmVzcG9uc2VzLCBzbyB1c2luZyBpdCBpbnN0ZWFkXG5cdFx0Ly8gb2YgdGhlIGRlZmF1bHQgY29udmVydGVyIGlzIGtsdWRneSBidXQgaXQgd29ya3MuXG5cdFx0Y29udmVydGVyczoge1xuXHRcdFx0XCJ0ZXh0IHNjcmlwdFwiOiBmdW5jdGlvbigpIHt9XG5cdFx0fSxcblx0XHRkYXRhRmlsdGVyOiBmdW5jdGlvbiggcmVzcG9uc2UgKSB7XG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggcmVzcG9uc2UsIG9wdGlvbnMsIGRvYyApO1xuXHRcdH1cblx0fSApO1xufTtcblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciB3cmFwO1xuXG5cdFx0aWYgKCB0aGlzWyAwIF0gKSB7XG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdFx0aHRtbCA9IGh0bWwuY2FsbCggdGhpc1sgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kXG5cdFx0XHR3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCApLmVxKCAwICkuY2xvbmUoIHRydWUgKTtcblxuXHRcdFx0aWYgKCB0aGlzWyAwIF0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0d3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHR3cmFwLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBlbGVtID0gdGhpcztcblxuXHRcdFx0XHR3aGlsZSAoIGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQgKSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZWxlbTtcblx0XHRcdH0gKS5hcHBlbmQoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggaHRtbCApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBJbm5lciggaHRtbC5jYWxsKCB0aGlzLCBpICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksXG5cdFx0XHRcdGNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpO1xuXG5cdFx0XHRpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y29udGVudHMud3JhcEFsbCggaHRtbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLmFwcGVuZCggaHRtbCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHR3cmFwOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgaHRtbElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCBodG1sICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWxJc0Z1bmN0aW9uID8gaHRtbC5jYWxsKCB0aGlzLCBpICkgOiBodG1sICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdHVud3JhcDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHRoaXMucGFyZW50KCBzZWxlY3RvciApLm5vdCggXCJib2R5XCIgKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLnJlcGxhY2VXaXRoKCB0aGlzLmNoaWxkTm9kZXMgKTtcblx0XHR9ICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXhwci5wc2V1ZG9zLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gIWpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSggZWxlbSApO1xufTtcbmpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gISEoIGVsZW0ub2Zmc2V0V2lkdGggfHwgZWxlbS5vZmZzZXRIZWlnaHQgfHwgZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApO1xufTtcblxuXG5cblxualF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSBmdW5jdGlvbigpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuXHR9IGNhdGNoICggZSApIHt9XG59O1xuXG52YXIgeGhyU3VjY2Vzc1N0YXR1cyA9IHtcblxuXHRcdC8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwXG5cdFx0MDogMjAwLFxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHQvLyAjMTQ1MDogc29tZXRpbWVzIElFIHJldHVybnMgMTIyMyB3aGVuIGl0IHNob3VsZCBiZSAyMDRcblx0XHQxMjIzOiAyMDRcblx0fSxcblx0eGhyU3VwcG9ydGVkID0galF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIoKTtcblxuc3VwcG9ydC5jb3JzID0gISF4aHJTdXBwb3J0ZWQgJiYgKCBcIndpdGhDcmVkZW50aWFsc1wiIGluIHhoclN1cHBvcnRlZCApO1xuc3VwcG9ydC5hamF4ID0geGhyU3VwcG9ydGVkID0gISF4aHJTdXBwb3J0ZWQ7XG5cbmpRdWVyeS5hamF4VHJhbnNwb3J0KCBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0dmFyIGNhbGxiYWNrLCBlcnJvckNhbGxiYWNrO1xuXG5cdC8vIENyb3NzIGRvbWFpbiBvbmx5IGFsbG93ZWQgaWYgc3VwcG9ydGVkIHRocm91Z2ggWE1MSHR0cFJlcXVlc3Rcblx0aWYgKCBzdXBwb3J0LmNvcnMgfHwgeGhyU3VwcG9ydGVkICYmICFvcHRpb25zLmNyb3NzRG9tYWluICkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggaGVhZGVycywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHZhciBpLFxuXHRcdFx0XHRcdHhociA9IG9wdGlvbnMueGhyKCk7XG5cblx0XHRcdFx0eGhyLm9wZW4oXG5cdFx0XHRcdFx0b3B0aW9ucy50eXBlLFxuXHRcdFx0XHRcdG9wdGlvbnMudXJsLFxuXHRcdFx0XHRcdG9wdGlvbnMuYXN5bmMsXG5cdFx0XHRcdFx0b3B0aW9ucy51c2VybmFtZSxcblx0XHRcdFx0XHRvcHRpb25zLnBhc3N3b3JkXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZFxuXHRcdFx0XHRpZiAoIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdGZvciAoIGkgaW4gb3B0aW9ucy54aHJGaWVsZHMgKSB7XG5cdFx0XHRcdFx0XHR4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gT3ZlcnJpZGUgbWltZSB0eXBlIGlmIG5lZWRlZFxuXHRcdFx0XHRpZiAoIG9wdGlvbnMubWltZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWltZVR5cGUgKSB7XG5cdFx0XHRcdFx0eGhyLm92ZXJyaWRlTWltZVR5cGUoIG9wdGlvbnMubWltZVR5cGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyXG5cdFx0XHRcdC8vIEZvciBjcm9zcy1kb21haW4gcmVxdWVzdHMsIHNlZWluZyBhcyBjb25kaXRpb25zIGZvciBhIHByZWZsaWdodCBhcmVcblx0XHRcdFx0Ly8gYWtpbiB0byBhIGppZ3NhdyBwdXp6bGUsIHdlIHNpbXBseSBuZXZlciBzZXQgaXQgdG8gYmUgc3VyZS5cblx0XHRcdFx0Ly8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApXG5cdFx0XHRcdC8vIEZvciBzYW1lLWRvbWFpbiByZXF1ZXN0cywgd29uJ3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5IHByb3ZpZGVkLlxuXHRcdFx0XHRpZiAoICFvcHRpb25zLmNyb3NzRG9tYWluICYmICFoZWFkZXJzWyBcIlgtUmVxdWVzdGVkLVdpdGhcIiBdICkge1xuXHRcdFx0XHRcdGhlYWRlcnNbIFwiWC1SZXF1ZXN0ZWQtV2l0aFwiIF0gPSBcIlhNTEh0dHBSZXF1ZXN0XCI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTZXQgaGVhZGVyc1xuXHRcdFx0XHRmb3IgKCBpIGluIGhlYWRlcnMgKSB7XG5cdFx0XHRcdFx0eGhyLnNldFJlcXVlc3RIZWFkZXIoIGksIGhlYWRlcnNbIGkgXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ2FsbGJhY2tcblx0XHRcdFx0Y2FsbGJhY2sgPSBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0XHRjYWxsYmFjayA9IGVycm9yQ2FsbGJhY2sgPSB4aHIub25sb2FkID1cblx0XHRcdFx0XHRcdFx0XHR4aHIub25lcnJvciA9IHhoci5vbmFib3J0ID0geGhyLm9udGltZW91dCA9XG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiYWJvcnRcIiApIHtcblx0XHRcdFx0XHRcdFx0XHR4aHIuYWJvcnQoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gXCJlcnJvclwiICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHRcdFx0XHQvLyBPbiBhIG1hbnVhbCBuYXRpdmUgYWJvcnQsIElFOSB0aHJvd3Ncblx0XHRcdFx0XHRcdFx0XHQvLyBlcnJvcnMgb24gYW55IHByb3BlcnR5IGFjY2VzcyB0aGF0IGlzIG5vdCByZWFkeVN0YXRlXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlb2YgeGhyLnN0YXR1cyAhPT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKCAwLCBcImVycm9yXCIgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoXG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRmlsZTogcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgMDsgc2VlICM4NjA1LCAjMTQyMDdcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHRcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyU3VjY2Vzc1N0YXR1c1sgeGhyLnN0YXR1cyBdIHx8IHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzVGV4dCxcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElFOSBoYXMgbm8gWEhSMiBidXQgdGhyb3dzIG9uIGJpbmFyeSAodHJhYy0xMTQyNilcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpXG5cdFx0XHRcdFx0XHRcdFx0XHQoIHhoci5yZXNwb25zZVR5cGUgfHwgXCJ0ZXh0XCIgKSAhPT0gXCJ0ZXh0XCIgIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgYmluYXJ5OiB4aHIucmVzcG9uc2UgfSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gTGlzdGVuIHRvIGV2ZW50c1xuXHRcdFx0XHR4aHIub25sb2FkID0gY2FsbGJhY2soKTtcblx0XHRcdFx0ZXJyb3JDYWxsYmFjayA9IHhoci5vbmVycm9yID0geGhyLm9udGltZW91dCA9IGNhbGxiYWNrKCBcImVycm9yXCIgKTtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0XHRcdFx0Ly8gVXNlIG9ucmVhZHlzdGF0ZWNoYW5nZSB0byByZXBsYWNlIG9uYWJvcnRcblx0XHRcdFx0Ly8gdG8gaGFuZGxlIHVuY2F1Z2h0IGFib3J0c1xuXHRcdFx0XHRpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0eGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRcdFx0Ly8gQ2hlY2sgcmVhZHlTdGF0ZSBiZWZvcmUgdGltZW91dCBhcyBpdCBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRpZiAoIHhoci5yZWFkeVN0YXRlID09PSA0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFsbG93IG9uZXJyb3IgdG8gYmUgY2FsbGVkIGZpcnN0LFxuXHRcdFx0XHRcdFx0XHQvLyBidXQgdGhhdCB3aWxsIG5vdCBoYW5kbGUgYSBuYXRpdmUgYWJvcnRcblx0XHRcdFx0XHRcdFx0Ly8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGVcblx0XHRcdFx0XHRcdFx0Ly8gYXMgeGhyLm9uZXJyb3IgY2Fubm90IGJlIGFjY2Vzc2VkXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JDYWxsYmFjaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDcmVhdGUgdGhlIGFib3J0IGNhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gY2FsbGJhY2soIFwiYWJvcnRcIiApO1xuXG5cdFx0XHRcdHRyeSB7XG5cblx0XHRcdFx0XHQvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pXG5cdFx0XHRcdFx0eGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApO1xuXHRcdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRcdC8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gUHJldmVudCBhdXRvLWV4ZWN1dGlvbiBvZiBzY3JpcHRzIHdoZW4gbm8gZXhwbGljaXQgZGF0YVR5cGUgd2FzIHByb3ZpZGVkIChTZWUgZ2gtMjQzMilcbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBmdW5jdGlvbiggcyApIHtcblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHMuY29udGVudHMuc2NyaXB0ID0gZmFsc2U7XG5cdH1cbn0gKTtcblxuLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGVcbmpRdWVyeS5hamF4U2V0dXAoIHtcblx0YWNjZXB0czoge1xuXHRcdHNjcmlwdDogXCJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIFwiICtcblx0XHRcdFwiYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0XCJcblx0fSxcblx0Y29udGVudHM6IHtcblx0XHRzY3JpcHQ6IC9cXGIoPzpqYXZhfGVjbWEpc2NyaXB0XFxiL1xuXHR9LFxuXHRjb252ZXJ0ZXJzOiB7XG5cdFx0XCJ0ZXh0IHNjcmlwdFwiOiBmdW5jdGlvbiggdGV4dCApIHtcblx0XHRcdGpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0ICk7XG5cdFx0XHRyZXR1cm4gdGV4dDtcblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpblxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXHRpZiAoIHMuY2FjaGUgPT09IHVuZGVmaW5lZCApIHtcblx0XHRzLmNhY2hlID0gZmFsc2U7XG5cdH1cblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHMudHlwZSA9IFwiR0VUXCI7XG5cdH1cbn0gKTtcblxuLy8gQmluZCBzY3JpcHQgdGFnIGhhY2sgdHJhbnNwb3J0XG5qUXVlcnkuYWpheFRyYW5zcG9ydCggXCJzY3JpcHRcIiwgZnVuY3Rpb24oIHMgKSB7XG5cblx0Ly8gVGhpcyB0cmFuc3BvcnQgb25seSBkZWFscyB3aXRoIGNyb3NzIGRvbWFpbiBvciBmb3JjZWQtYnktYXR0cnMgcmVxdWVzdHNcblx0aWYgKCBzLmNyb3NzRG9tYWluIHx8IHMuc2NyaXB0QXR0cnMgKSB7XG5cdFx0dmFyIHNjcmlwdCwgY2FsbGJhY2s7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBfLCBjb21wbGV0ZSApIHtcblx0XHRcdFx0c2NyaXB0ID0galF1ZXJ5KCBcIjxzY3JpcHQ+XCIgKVxuXHRcdFx0XHRcdC5hdHRyKCBzLnNjcmlwdEF0dHJzIHx8IHt9IClcblx0XHRcdFx0XHQucHJvcCggeyBjaGFyc2V0OiBzLnNjcmlwdENoYXJzZXQsIHNyYzogcy51cmwgfSApXG5cdFx0XHRcdFx0Lm9uKCBcImxvYWQgZXJyb3JcIiwgY2FsbGJhY2sgPSBmdW5jdGlvbiggZXZ0ICkge1xuXHRcdFx0XHRcdFx0c2NyaXB0LnJlbW92ZSgpO1xuXHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBudWxsO1xuXHRcdFx0XHRcdFx0aWYgKCBldnQgKSB7XG5cdFx0XHRcdFx0XHRcdGNvbXBsZXRlKCBldnQudHlwZSA9PT0gXCJlcnJvclwiID8gNDA0IDogMjAwLCBldnQudHlwZSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQvLyBVc2UgbmF0aXZlIERPTSBtYW5pcHVsYXRpb24gdG8gYXZvaWQgb3VyIGRvbU1hbmlwIEFKQVggdHJpY2tlcnlcblx0XHRcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCggc2NyaXB0WyAwIF0gKTtcblx0XHRcdH0sXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxudmFyIG9sZENhbGxiYWNrcyA9IFtdLFxuXHRyanNvbnAgPSAvKD0pXFw/KD89JnwkKXxcXD9cXD8vO1xuXG4vLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzXG5qUXVlcnkuYWpheFNldHVwKCB7XG5cdGpzb25wOiBcImNhbGxiYWNrXCIsXG5cdGpzb25wQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBjYWxsYmFjayA9IG9sZENhbGxiYWNrcy5wb3AoKSB8fCAoIGpRdWVyeS5leHBhbmRvICsgXCJfXCIgKyAoIG5vbmNlLmd1aWQrKyApICk7XG5cdFx0dGhpc1sgY2FsbGJhY2sgXSA9IHRydWU7XG5cdFx0cmV0dXJuIGNhbGxiYWNrO1xuXHR9XG59ICk7XG5cbi8vIERldGVjdCwgbm9ybWFsaXplIG9wdGlvbnMgYW5kIGluc3RhbGwgY2FsbGJhY2tzIGZvciBqc29ucCByZXF1ZXN0c1xualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIFwianNvbiBqc29ucFwiLCBmdW5jdGlvbiggcywgb3JpZ2luYWxTZXR0aW5ncywganFYSFIgKSB7XG5cblx0dmFyIGNhbGxiYWNrTmFtZSwgb3ZlcndyaXR0ZW4sIHJlc3BvbnNlQ29udGFpbmVyLFxuXHRcdGpzb25Qcm9wID0gcy5qc29ucCAhPT0gZmFsc2UgJiYgKCByanNvbnAudGVzdCggcy51cmwgKSA/XG5cdFx0XHRcInVybFwiIDpcblx0XHRcdHR5cGVvZiBzLmRhdGEgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0KCBzLmNvbnRlbnRUeXBlIHx8IFwiXCIgKVxuXHRcdFx0XHRcdC5pbmRleE9mKCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiICkgPT09IDAgJiZcblx0XHRcdFx0cmpzb25wLnRlc3QoIHMuZGF0YSApICYmIFwiZGF0YVwiXG5cdFx0KTtcblxuXHQvLyBIYW5kbGUgaWZmIHRoZSBleHBlY3RlZCBkYXRhIHR5cGUgaXMgXCJqc29ucFwiIG9yIHdlIGhhdmUgYSBwYXJhbWV0ZXIgdG8gc2V0XG5cdGlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gXCJqc29ucFwiICkge1xuXG5cdFx0Ly8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdFxuXHRcdGNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGlzRnVuY3Rpb24oIHMuanNvbnBDYWxsYmFjayApID9cblx0XHRcdHMuanNvbnBDYWxsYmFjaygpIDpcblx0XHRcdHMuanNvbnBDYWxsYmFjaztcblxuXHRcdC8vIEluc2VydCBjYWxsYmFjayBpbnRvIHVybCBvciBmb3JtIGRhdGFcblx0XHRpZiAoIGpzb25Qcm9wICkge1xuXHRcdFx0c1sganNvblByb3AgXSA9IHNbIGpzb25Qcm9wIF0ucmVwbGFjZSggcmpzb25wLCBcIiQxXCIgKyBjYWxsYmFja05hbWUgKTtcblx0XHR9IGVsc2UgaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHtcblx0XHRcdHMudXJsICs9ICggcnF1ZXJ5LnRlc3QoIHMudXJsICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmpzb25wICsgXCI9XCIgKyBjYWxsYmFja05hbWU7XG5cdFx0fVxuXG5cdFx0Ly8gVXNlIGRhdGEgY29udmVydGVyIHRvIHJldHJpZXZlIGpzb24gYWZ0ZXIgc2NyaXB0IGV4ZWN1dGlvblxuXHRcdHMuY29udmVydGVyc1sgXCJzY3JpcHQganNvblwiIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggIXJlc3BvbnNlQ29udGFpbmVyICkge1xuXHRcdFx0XHRqUXVlcnkuZXJyb3IoIGNhbGxiYWNrTmFtZSArIFwiIHdhcyBub3QgY2FsbGVkXCIgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXNwb25zZUNvbnRhaW5lclsgMCBdO1xuXHRcdH07XG5cblx0XHQvLyBGb3JjZSBqc29uIGRhdGFUeXBlXG5cdFx0cy5kYXRhVHlwZXNbIDAgXSA9IFwianNvblwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja1xuXHRcdG92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTtcblx0XHR3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXNwb25zZUNvbnRhaW5lciA9IGFyZ3VtZW50cztcblx0XHR9O1xuXG5cdFx0Ly8gQ2xlYW4tdXAgZnVuY3Rpb24gKGZpcmVzIGFmdGVyIGNvbnZlcnRlcnMpXG5cdFx0anFYSFIuYWx3YXlzKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gSWYgcHJldmlvdXMgdmFsdWUgZGlkbid0IGV4aXN0IC0gcmVtb3ZlIGl0XG5cdFx0XHRpZiAoIG92ZXJ3cml0dGVuID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdGpRdWVyeSggd2luZG93ICkucmVtb3ZlUHJvcCggY2FsbGJhY2tOYW1lICk7XG5cblx0XHRcdC8vIE90aGVyd2lzZSByZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNhdmUgYmFjayBhcyBmcmVlXG5cdFx0XHRpZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkge1xuXG5cdFx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHJlLXVzaW5nIHRoZSBvcHRpb25zIGRvZXNuJ3Qgc2NyZXcgdGhpbmdzIGFyb3VuZFxuXHRcdFx0XHRzLmpzb25wQ2FsbGJhY2sgPSBvcmlnaW5hbFNldHRpbmdzLmpzb25wQ2FsbGJhY2s7XG5cblx0XHRcdFx0Ly8gU2F2ZSB0aGUgY2FsbGJhY2sgbmFtZSBmb3IgZnV0dXJlIHVzZVxuXHRcdFx0XHRvbGRDYWxsYmFja3MucHVzaCggY2FsbGJhY2tOYW1lICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENhbGwgaWYgaXQgd2FzIGEgZnVuY3Rpb24gYW5kIHdlIGhhdmUgYSByZXNwb25zZVxuXHRcdFx0aWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBpc0Z1bmN0aW9uKCBvdmVyd3JpdHRlbiApICkge1xuXHRcdFx0XHRvdmVyd3JpdHRlbiggcmVzcG9uc2VDb250YWluZXJbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXNwb25zZUNvbnRhaW5lciA9IG92ZXJ3cml0dGVuID0gdW5kZWZpbmVkO1xuXHRcdH0gKTtcblxuXHRcdC8vIERlbGVnYXRlIHRvIHNjcmlwdFxuXHRcdHJldHVybiBcInNjcmlwdFwiO1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFN1cHBvcnQ6IFNhZmFyaSA4IG9ubHlcbi8vIEluIFNhZmFyaSA4IGRvY3VtZW50cyBjcmVhdGVkIHZpYSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnRcbi8vIGNvbGxhcHNlIHNpYmxpbmcgZm9ybXM6IHRoZSBzZWNvbmQgb25lIGJlY29tZXMgYSBjaGlsZCBvZiB0aGUgZmlyc3Qgb25lLlxuLy8gQmVjYXVzZSBvZiB0aGF0LCB0aGlzIHNlY3VyaXR5IG1lYXN1cmUgaGFzIHRvIGJlIGRpc2FibGVkIGluIFNhZmFyaSA4LlxuLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNzMzN1xuc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgPSAoIGZ1bmN0aW9uKCkge1xuXHR2YXIgYm9keSA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCggXCJcIiApLmJvZHk7XG5cdGJvZHkuaW5uZXJIVE1MID0gXCI8Zm9ybT48L2Zvcm0+PGZvcm0+PC9mb3JtPlwiO1xuXHRyZXR1cm4gYm9keS5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMjtcbn0gKSgpO1xuXG5cbi8vIEFyZ3VtZW50IFwiZGF0YVwiIHNob3VsZCBiZSBzdHJpbmcgb2YgaHRtbFxuLy8gY29udGV4dCAob3B0aW9uYWwpOiBJZiBzcGVjaWZpZWQsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhpcyBjb250ZXh0LFxuLy8gZGVmYXVsdHMgdG8gZG9jdW1lbnRcbi8vIGtlZXBTY3JpcHRzIChvcHRpb25hbCk6IElmIHRydWUsIHdpbGwgaW5jbHVkZSBzY3JpcHRzIHBhc3NlZCBpbiB0aGUgaHRtbCBzdHJpbmdcbmpRdWVyeS5wYXJzZUhUTUwgPSBmdW5jdGlvbiggZGF0YSwgY29udGV4dCwga2VlcFNjcmlwdHMgKSB7XG5cdGlmICggdHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGtlZXBTY3JpcHRzID0gY29udGV4dDtcblx0XHRjb250ZXh0ID0gZmFsc2U7XG5cdH1cblxuXHR2YXIgYmFzZSwgcGFyc2VkLCBzY3JpcHRzO1xuXG5cdGlmICggIWNvbnRleHQgKSB7XG5cblx0XHQvLyBTdG9wIHNjcmlwdHMgb3IgaW5saW5lIGV2ZW50IGhhbmRsZXJzIGZyb20gYmVpbmcgZXhlY3V0ZWQgaW1tZWRpYXRlbHlcblx0XHQvLyBieSB1c2luZyBkb2N1bWVudC5pbXBsZW1lbnRhdGlvblxuXHRcdGlmICggc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgKSB7XG5cdFx0XHRjb250ZXh0ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCBcIlwiICk7XG5cblx0XHRcdC8vIFNldCB0aGUgYmFzZSBocmVmIGZvciB0aGUgY3JlYXRlZCBkb2N1bWVudFxuXHRcdFx0Ly8gc28gYW55IHBhcnNlZCBlbGVtZW50cyB3aXRoIFVSTHNcblx0XHRcdC8vIGFyZSBiYXNlZCBvbiB0aGUgZG9jdW1lbnQncyBVUkwgKGdoLTI5NjUpXG5cdFx0XHRiYXNlID0gY29udGV4dC5jcmVhdGVFbGVtZW50KCBcImJhc2VcIiApO1xuXHRcdFx0YmFzZS5ocmVmID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZjtcblx0XHRcdGNvbnRleHQuaGVhZC5hcHBlbmRDaGlsZCggYmFzZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb250ZXh0ID0gZG9jdW1lbnQ7XG5cdFx0fVxuXHR9XG5cblx0cGFyc2VkID0gcnNpbmdsZVRhZy5leGVjKCBkYXRhICk7XG5cdHNjcmlwdHMgPSAha2VlcFNjcmlwdHMgJiYgW107XG5cblx0Ly8gU2luZ2xlIHRhZ1xuXHRpZiAoIHBhcnNlZCApIHtcblx0XHRyZXR1cm4gWyBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIHBhcnNlZFsgMSBdICkgXTtcblx0fVxuXG5cdHBhcnNlZCA9IGJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7XG5cblx0aWYgKCBzY3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoICkge1xuXHRcdGpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5tZXJnZSggW10sIHBhcnNlZC5jaGlsZE5vZGVzICk7XG59O1xuXG5cbi8qKlxuICogTG9hZCBhIHVybCBpbnRvIGEgcGFnZVxuICovXG5qUXVlcnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7XG5cdHZhciBzZWxlY3RvciwgdHlwZSwgcmVzcG9uc2UsXG5cdFx0c2VsZiA9IHRoaXMsXG5cdFx0b2ZmID0gdXJsLmluZGV4T2YoIFwiIFwiICk7XG5cblx0aWYgKCBvZmYgPiAtMSApIHtcblx0XHRzZWxlY3RvciA9IHN0cmlwQW5kQ29sbGFwc2UoIHVybC5zbGljZSggb2ZmICkgKTtcblx0XHR1cmwgPSB1cmwuc2xpY2UoIDAsIG9mZiApO1xuXHR9XG5cblx0Ly8gSWYgaXQncyBhIGZ1bmN0aW9uXG5cdGlmICggaXNGdW5jdGlvbiggcGFyYW1zICkgKSB7XG5cblx0XHQvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFja1xuXHRcdGNhbGxiYWNrID0gcGFyYW1zO1xuXHRcdHBhcmFtcyA9IHVuZGVmaW5lZDtcblxuXHQvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nXG5cdH0gZWxzZSBpZiAoIHBhcmFtcyAmJiB0eXBlb2YgcGFyYW1zID09PSBcIm9iamVjdFwiICkge1xuXHRcdHR5cGUgPSBcIlBPU1RcIjtcblx0fVxuXG5cdC8vIElmIHdlIGhhdmUgZWxlbWVudHMgdG8gbW9kaWZ5LCBtYWtlIHRoZSByZXF1ZXN0XG5cdGlmICggc2VsZi5sZW5ndGggPiAwICkge1xuXHRcdGpRdWVyeS5hamF4KCB7XG5cdFx0XHR1cmw6IHVybCxcblxuXHRcdFx0Ly8gSWYgXCJ0eXBlXCIgdmFyaWFibGUgaXMgdW5kZWZpbmVkLCB0aGVuIFwiR0VUXCIgbWV0aG9kIHdpbGwgYmUgdXNlZC5cblx0XHRcdC8vIE1ha2UgdmFsdWUgb2YgdGhpcyBmaWVsZCBleHBsaWNpdCBzaW5jZVxuXHRcdFx0Ly8gdXNlciBjYW4gb3ZlcnJpZGUgaXQgdGhyb3VnaCBhamF4U2V0dXAgbWV0aG9kXG5cdFx0XHR0eXBlOiB0eXBlIHx8IFwiR0VUXCIsXG5cdFx0XHRkYXRhVHlwZTogXCJodG1sXCIsXG5cdFx0XHRkYXRhOiBwYXJhbXNcblx0XHR9ICkuZG9uZSggZnVuY3Rpb24oIHJlc3BvbnNlVGV4dCApIHtcblxuXHRcdFx0Ly8gU2F2ZSByZXNwb25zZSBmb3IgdXNlIGluIGNvbXBsZXRlIGNhbGxiYWNrXG5cdFx0XHRyZXNwb25zZSA9IGFyZ3VtZW50cztcblxuXHRcdFx0c2VsZi5odG1sKCBzZWxlY3RvciA/XG5cblx0XHRcdFx0Ly8gSWYgYSBzZWxlY3RvciB3YXMgc3BlY2lmaWVkLCBsb2NhdGUgdGhlIHJpZ2h0IGVsZW1lbnRzIGluIGEgZHVtbXkgZGl2XG5cdFx0XHRcdC8vIEV4Y2x1ZGUgc2NyaXB0cyB0byBhdm9pZCBJRSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9yc1xuXHRcdFx0XHRqUXVlcnkoIFwiPGRpdj5cIiApLmFwcGVuZCggalF1ZXJ5LnBhcnNlSFRNTCggcmVzcG9uc2VUZXh0ICkgKS5maW5kKCBzZWxlY3RvciApIDpcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UgdXNlIHRoZSBmdWxsIHJlc3VsdFxuXHRcdFx0XHRyZXNwb25zZVRleHQgKTtcblxuXHRcdC8vIElmIHRoZSByZXF1ZXN0IHN1Y2NlZWRzLCB0aGlzIGZ1bmN0aW9uIGdldHMgXCJkYXRhXCIsIFwic3RhdHVzXCIsIFwianFYSFJcIlxuXHRcdC8vIGJ1dCB0aGV5IGFyZSBpZ25vcmVkIGJlY2F1c2UgcmVzcG9uc2Ugd2FzIHNldCBhYm92ZS5cblx0XHQvLyBJZiBpdCBmYWlscywgdGhpcyBmdW5jdGlvbiBnZXRzIFwianFYSFJcIiwgXCJzdGF0dXNcIiwgXCJlcnJvclwiXG5cdFx0fSApLmFsd2F5cyggY2FsbGJhY2sgJiYgZnVuY3Rpb24oIGpxWEhSLCBzdGF0dXMgKSB7XG5cdFx0XHRzZWxmLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRjYWxsYmFjay5hcHBseSggdGhpcywgcmVzcG9uc2UgfHwgWyBqcVhIUi5yZXNwb25zZVRleHQsIHN0YXR1cywganFYSFIgXSApO1xuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdHJldHVybiB0aGlzO1xufTtcblxuXG5cblxualF1ZXJ5LmV4cHIucHNldWRvcy5hbmltYXRlZCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4galF1ZXJ5LmdyZXAoIGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHtcblx0XHRyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTtcblx0fSApLmxlbmd0aDtcbn07XG5cblxuXG5cbmpRdWVyeS5vZmZzZXQgPSB7XG5cdHNldE9mZnNldDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGkgKSB7XG5cdFx0dmFyIGN1clBvc2l0aW9uLCBjdXJMZWZ0LCBjdXJDU1NUb3AsIGN1clRvcCwgY3VyT2Zmc2V0LCBjdXJDU1NMZWZ0LCBjYWxjdWxhdGVQb3NpdGlvbixcblx0XHRcdHBvc2l0aW9uID0galF1ZXJ5LmNzcyggZWxlbSwgXCJwb3NpdGlvblwiICksXG5cdFx0XHRjdXJFbGVtID0galF1ZXJ5KCBlbGVtICksXG5cdFx0XHRwcm9wcyA9IHt9O1xuXG5cdFx0Ly8gU2V0IHBvc2l0aW9uIGZpcnN0LCBpbi1jYXNlIHRvcC9sZWZ0IGFyZSBzZXQgZXZlbiBvbiBzdGF0aWMgZWxlbVxuXHRcdGlmICggcG9zaXRpb24gPT09IFwic3RhdGljXCIgKSB7XG5cdFx0XHRlbGVtLnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xuXHRcdH1cblxuXHRcdGN1ck9mZnNldCA9IGN1ckVsZW0ub2Zmc2V0KCk7XG5cdFx0Y3VyQ1NTVG9wID0galF1ZXJ5LmNzcyggZWxlbSwgXCJ0b3BcIiApO1xuXHRcdGN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCBcImxlZnRcIiApO1xuXHRcdGNhbGN1bGF0ZVBvc2l0aW9uID0gKCBwb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiIHx8IHBvc2l0aW9uID09PSBcImZpeGVkXCIgKSAmJlxuXHRcdFx0KCBjdXJDU1NUb3AgKyBjdXJDU1NMZWZ0ICkuaW5kZXhPZiggXCJhdXRvXCIgKSA+IC0xO1xuXG5cdFx0Ly8gTmVlZCB0byBiZSBhYmxlIHRvIGNhbGN1bGF0ZSBwb3NpdGlvbiBpZiBlaXRoZXJcblx0XHQvLyB0b3Agb3IgbGVmdCBpcyBhdXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4ZWRcblx0XHRpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkge1xuXHRcdFx0Y3VyUG9zaXRpb24gPSBjdXJFbGVtLnBvc2l0aW9uKCk7XG5cdFx0XHRjdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7XG5cdFx0XHRjdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwO1xuXHRcdFx0Y3VyTGVmdCA9IHBhcnNlRmxvYXQoIGN1ckNTU0xlZnQgKSB8fCAwO1xuXHRcdH1cblxuXHRcdGlmICggaXNGdW5jdGlvbiggb3B0aW9ucyApICkge1xuXG5cdFx0XHQvLyBVc2UgalF1ZXJ5LmV4dGVuZCBoZXJlIHRvIGFsbG93IG1vZGlmaWNhdGlvbiBvZiBjb29yZGluYXRlcyBhcmd1bWVudCAoZ2gtMTg0OClcblx0XHRcdG9wdGlvbnMgPSBvcHRpb25zLmNhbGwoIGVsZW0sIGksIGpRdWVyeS5leHRlbmQoIHt9LCBjdXJPZmZzZXQgKSApO1xuXHRcdH1cblxuXHRcdGlmICggb3B0aW9ucy50b3AgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLnRvcCA9ICggb3B0aW9ucy50b3AgLSBjdXJPZmZzZXQudG9wICkgKyBjdXJUb3A7XG5cdFx0fVxuXHRcdGlmICggb3B0aW9ucy5sZWZ0ICE9IG51bGwgKSB7XG5cdFx0XHRwcm9wcy5sZWZ0ID0gKCBvcHRpb25zLmxlZnQgLSBjdXJPZmZzZXQubGVmdCApICsgY3VyTGVmdDtcblx0XHR9XG5cblx0XHRpZiAoIFwidXNpbmdcIiBpbiBvcHRpb25zICkge1xuXHRcdFx0b3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1ckVsZW0uY3NzKCBwcm9wcyApO1xuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdC8vIG9mZnNldCgpIHJlbGF0ZXMgYW4gZWxlbWVudCdzIGJvcmRlciBib3ggdG8gdGhlIGRvY3VtZW50IG9yaWdpblxuXHRvZmZzZXQ6IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXG5cdFx0Ly8gUHJlc2VydmUgY2hhaW5pbmcgZm9yIHNldHRlclxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiBvcHRpb25zID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHR0aGlzIDpcblx0XHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0XHRqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApO1xuXHRcdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0dmFyIHJlY3QsIHdpbixcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF07XG5cblx0XHRpZiAoICFlbGVtICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiB6ZXJvcyBmb3IgZGlzY29ubmVjdGVkIGFuZCBoaWRkZW4gKGRpc3BsYXk6IG5vbmUpIGVsZW1lbnRzIChnaC0yMzEwKVxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHRcdC8vIFJ1bm5pbmcgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IG9uIGFcblx0XHQvLyBkaXNjb25uZWN0ZWQgbm9kZSBpbiBJRSB0aHJvd3MgYW4gZXJyb3Jcblx0XHRpZiAoICFlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAwIH07XG5cdFx0fVxuXG5cdFx0Ly8gR2V0IGRvY3VtZW50LXJlbGF0aXZlIHBvc2l0aW9uIGJ5IGFkZGluZyB2aWV3cG9ydCBzY3JvbGwgdG8gdmlld3BvcnQtcmVsYXRpdmUgZ0JDUlxuXHRcdHJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdHdpbiA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldztcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiByZWN0LnRvcCArIHdpbi5wYWdlWU9mZnNldCxcblx0XHRcdGxlZnQ6IHJlY3QubGVmdCArIHdpbi5wYWdlWE9mZnNldFxuXHRcdH07XG5cdH0sXG5cblx0Ly8gcG9zaXRpb24oKSByZWxhdGVzIGFuIGVsZW1lbnQncyBtYXJnaW4gYm94IHRvIGl0cyBvZmZzZXQgcGFyZW50J3MgcGFkZGluZyBib3hcblx0Ly8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYmVoYXZpb3Igb2YgQ1NTIGFic29sdXRlIHBvc2l0aW9uaW5nXG5cdHBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoICF0aGlzWyAwIF0gKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIG9mZnNldFBhcmVudCwgb2Zmc2V0LCBkb2MsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0cGFyZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfTtcblxuXHRcdC8vIHBvc2l0aW9uOmZpeGVkIGVsZW1lbnRzIGFyZSBvZmZzZXQgZnJvbSB0aGUgdmlld3BvcnQsIHdoaWNoIGl0c2VsZiBhbHdheXMgaGFzIHplcm8gb2Zmc2V0XG5cdFx0aWYgKCBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSA9PT0gXCJmaXhlZFwiICkge1xuXG5cdFx0XHQvLyBBc3N1bWUgcG9zaXRpb246Zml4ZWQgaW1wbGllcyBhdmFpbGFiaWxpdHkgb2YgZ2V0Qm91bmRpbmdDbGllbnRSZWN0XG5cdFx0XHRvZmZzZXQgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdG9mZnNldCA9IHRoaXMub2Zmc2V0KCk7XG5cblx0XHRcdC8vIEFjY291bnQgZm9yIHRoZSAqcmVhbCogb2Zmc2V0IHBhcmVudCwgd2hpY2ggY2FuIGJlIHRoZSBkb2N1bWVudCBvciBpdHMgcm9vdCBlbGVtZW50XG5cdFx0XHQvLyB3aGVuIGEgc3RhdGljYWxseSBwb3NpdGlvbmVkIGVsZW1lbnQgaXMgaWRlbnRpZmllZFxuXHRcdFx0ZG9jID0gZWxlbS5vd25lckRvY3VtZW50O1xuXHRcdFx0b2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQgfHwgZG9jLmRvY3VtZW50RWxlbWVudDtcblx0XHRcdHdoaWxlICggb2Zmc2V0UGFyZW50ICYmXG5cdFx0XHRcdCggb2Zmc2V0UGFyZW50ID09PSBkb2MuYm9keSB8fCBvZmZzZXRQYXJlbnQgPT09IGRvYy5kb2N1bWVudEVsZW1lbnQgKSAmJlxuXHRcdFx0XHRqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwicG9zaXRpb25cIiApID09PSBcInN0YXRpY1wiICkge1xuXG5cdFx0XHRcdG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBvZmZzZXRQYXJlbnQgJiYgb2Zmc2V0UGFyZW50ICE9PSBlbGVtICYmIG9mZnNldFBhcmVudC5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBJbmNvcnBvcmF0ZSBib3JkZXJzIGludG8gaXRzIG9mZnNldCwgc2luY2UgdGhleSBhcmUgb3V0c2lkZSBpdHMgY29udGVudCBvcmlnaW5cblx0XHRcdFx0cGFyZW50T2Zmc2V0ID0galF1ZXJ5KCBvZmZzZXRQYXJlbnQgKS5vZmZzZXQoKTtcblx0XHRcdFx0cGFyZW50T2Zmc2V0LnRvcCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwiYm9yZGVyVG9wV2lkdGhcIiwgdHJ1ZSApO1xuXHRcdFx0XHRwYXJlbnRPZmZzZXQubGVmdCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwiYm9yZGVyTGVmdFdpZHRoXCIsIHRydWUgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTdWJ0cmFjdCBwYXJlbnQgb2Zmc2V0cyBhbmQgZWxlbWVudCBtYXJnaW5zXG5cdFx0cmV0dXJuIHtcblx0XHRcdHRvcDogb2Zmc2V0LnRvcCAtIHBhcmVudE9mZnNldC50b3AgLSBqUXVlcnkuY3NzKCBlbGVtLCBcIm1hcmdpblRvcFwiLCB0cnVlICksXG5cdFx0XHRsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0IC0galF1ZXJ5LmNzcyggZWxlbSwgXCJtYXJnaW5MZWZ0XCIsIHRydWUgKVxuXHRcdH07XG5cdH0sXG5cblx0Ly8gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gZG9jdW1lbnRFbGVtZW50IGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6XG5cdC8vIDEpIEZvciB0aGUgZWxlbWVudCBpbnNpZGUgdGhlIGlmcmFtZSB3aXRob3V0IG9mZnNldFBhcmVudCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm5cblx0Ly8gICAgZG9jdW1lbnRFbGVtZW50IG9mIHRoZSBwYXJlbnQgd2luZG93XG5cdC8vIDIpIEZvciB0aGUgaGlkZGVuIG9yIGRldGFjaGVkIGVsZW1lbnRcblx0Ly8gMykgRm9yIGJvZHkgb3IgaHRtbCBlbGVtZW50LCBpLmUuIGluIGNhc2Ugb2YgdGhlIGh0bWwgbm9kZSAtIGl0IHdpbGwgcmV0dXJuIGl0c2VsZlxuXHQvL1xuXHQvLyBidXQgdGhvc2UgZXhjZXB0aW9ucyB3ZXJlIG5ldmVyIHByZXNlbnRlZCBhcyBhIHJlYWwgbGlmZSB1c2UtY2FzZXNcblx0Ly8gYW5kIG1pZ2h0IGJlIGNvbnNpZGVyZWQgYXMgbW9yZSBwcmVmZXJhYmxlIHJlc3VsdHMuXG5cdC8vXG5cdC8vIFRoaXMgbG9naWMsIGhvd2V2ZXIsIGlzIG5vdCBndWFyYW50ZWVkIGFuZCBjYW4gY2hhbmdlIGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlXG5cdG9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudDtcblxuXHRcdFx0d2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcInBvc2l0aW9uXCIgKSA9PT0gXCJzdGF0aWNcIiApIHtcblx0XHRcdFx0b2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2N1bWVudEVsZW1lbnQ7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbi8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogXCJwYWdlWE9mZnNldFwiLCBzY3JvbGxUb3A6IFwicGFnZVlPZmZzZXRcIiB9LCBmdW5jdGlvbiggbWV0aG9kLCBwcm9wICkge1xuXHR2YXIgdG9wID0gXCJwYWdlWU9mZnNldFwiID09PSBwcm9wO1xuXG5cdGpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdmFsICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBtZXRob2QsIHZhbCApIHtcblxuXHRcdFx0Ly8gQ29hbGVzY2UgZG9jdW1lbnRzIGFuZCB3aW5kb3dzXG5cdFx0XHR2YXIgd2luO1xuXHRcdFx0aWYgKCBpc1dpbmRvdyggZWxlbSApICkge1xuXHRcdFx0XHR3aW4gPSBlbGVtO1xuXHRcdFx0fSBlbHNlIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0d2luID0gZWxlbS5kZWZhdWx0Vmlldztcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHdpbiA/IHdpblsgcHJvcCBdIDogZWxlbVsgbWV0aG9kIF07XG5cdFx0XHR9XG5cblx0XHRcdGlmICggd2luICkge1xuXHRcdFx0XHR3aW4uc2Nyb2xsVG8oXG5cdFx0XHRcdFx0IXRvcCA/IHZhbCA6IHdpbi5wYWdlWE9mZnNldCxcblx0XHRcdFx0XHR0b3AgPyB2YWwgOiB3aW4ucGFnZVlPZmZzZXRcblx0XHRcdFx0KTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbVsgbWV0aG9kIF0gPSB2YWw7XG5cdFx0XHR9XG5cdFx0fSwgbWV0aG9kLCB2YWwsIGFyZ3VtZW50cy5sZW5ndGggKTtcblx0fTtcbn0gKTtcblxuLy8gU3VwcG9ydDogU2FmYXJpIDw9NyAtIDkuMSwgQ2hyb21lIDw9MzcgLSA0OVxuLy8gQWRkIHRoZSB0b3AvbGVmdCBjc3NIb29rcyB1c2luZyBqUXVlcnkuZm4ucG9zaXRpb25cbi8vIFdlYmtpdCBidWc6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yOTA4NFxuLy8gQmxpbmsgYnVnOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD01ODkzNDdcbi8vIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyBwZXJjZW50IHdoZW4gc3BlY2lmaWVkIGZvciB0b3AvbGVmdC9ib3R0b20vcmlnaHQ7XG4vLyByYXRoZXIgdGhhbiBtYWtlIHRoZSBjc3MgbW9kdWxlIGRlcGVuZCBvbiB0aGUgb2Zmc2V0IG1vZHVsZSwganVzdCBjaGVjayBmb3IgaXQgaGVyZVxualF1ZXJ5LmVhY2goIFsgXCJ0b3BcIiwgXCJsZWZ0XCIgXSwgZnVuY3Rpb24oIF9pLCBwcm9wICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIHByb3AgXSA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5waXhlbFBvc2l0aW9uLFxuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGNvbXB1dGVkID0gY3VyQ1NTKCBlbGVtLCBwcm9wICk7XG5cblx0XHRcdFx0Ly8gSWYgY3VyQ1NTIHJldHVybnMgcGVyY2VudGFnZSwgZmFsbGJhY2sgdG8gb2Zmc2V0XG5cdFx0XHRcdHJldHVybiBybnVtbm9ucHgudGVzdCggY29tcHV0ZWQgKSA/XG5cdFx0XHRcdFx0alF1ZXJ5KCBlbGVtICkucG9zaXRpb24oKVsgcHJvcCBdICsgXCJweFwiIDpcblx0XHRcdFx0XHRjb21wdXRlZDtcblx0XHRcdH1cblx0XHR9XG5cdCk7XG59ICk7XG5cblxuLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzXG5qUXVlcnkuZWFjaCggeyBIZWlnaHQ6IFwiaGVpZ2h0XCIsIFdpZHRoOiBcIndpZHRoXCIgfSwgZnVuY3Rpb24oIG5hbWUsIHR5cGUgKSB7XG5cdGpRdWVyeS5lYWNoKCB7XG5cdFx0cGFkZGluZzogXCJpbm5lclwiICsgbmFtZSxcblx0XHRjb250ZW50OiB0eXBlLFxuXHRcdFwiXCI6IFwib3V0ZXJcIiArIG5hbWVcblx0fSwgZnVuY3Rpb24oIGRlZmF1bHRFeHRyYSwgZnVuY05hbWUgKSB7XG5cblx0XHQvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGhcblx0XHRqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHtcblx0XHRcdHZhciBjaGFpbmFibGUgPSBhcmd1bWVudHMubGVuZ3RoICYmICggZGVmYXVsdEV4dHJhIHx8IHR5cGVvZiBtYXJnaW4gIT09IFwiYm9vbGVhblwiICksXG5cdFx0XHRcdGV4dHJhID0gZGVmYXVsdEV4dHJhIHx8ICggbWFyZ2luID09PSB0cnVlIHx8IHZhbHVlID09PSB0cnVlID8gXCJtYXJnaW5cIiA6IFwiYm9yZGVyXCIgKTtcblxuXHRcdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIHR5cGUsIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgZG9jO1xuXG5cdFx0XHRcdGlmICggaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0XHRcdC8vICQoIHdpbmRvdyApLm91dGVyV2lkdGgvSGVpZ2h0IHJldHVybiB3L2ggaW5jbHVkaW5nIHNjcm9sbGJhcnMgKGdoLTE3MjkpXG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmNOYW1lLmluZGV4T2YoIFwib3V0ZXJcIiApID09PSAwID9cblx0XHRcdFx0XHRcdGVsZW1bIFwiaW5uZXJcIiArIG5hbWUgXSA6XG5cdFx0XHRcdFx0XHRlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgXCJjbGllbnRcIiArIG5hbWUgXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHRcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdGRvYyA9IGVsZW0uZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0XHRcdFx0Ly8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLFxuXHRcdFx0XHRcdC8vIHdoaWNoZXZlciBpcyBncmVhdGVzdFxuXHRcdFx0XHRcdHJldHVybiBNYXRoLm1heChcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJzY3JvbGxcIiArIG5hbWUgXSwgZG9jWyBcInNjcm9sbFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcIm9mZnNldFwiICsgbmFtZSBdLCBkb2NbIFwib2Zmc2V0XCIgKyBuYW1lIF0sXG5cdFx0XHRcdFx0XHRkb2NbIFwiY2xpZW50XCIgKyBuYW1lIF1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXG5cdFx0XHRcdFx0Ly8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCwgcmVxdWVzdGluZyBidXQgbm90IGZvcmNpbmcgcGFyc2VGbG9hdFxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIGV4dHJhICkgOlxuXG5cdFx0XHRcdFx0Ly8gU2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudFxuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgdHlwZSwgdmFsdWUsIGV4dHJhICk7XG5cdFx0XHR9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSApO1xuXHRcdH07XG5cdH0gKTtcbn0gKTtcblxuXG5qUXVlcnkuZWFjaCggW1xuXHRcImFqYXhTdGFydFwiLFxuXHRcImFqYXhTdG9wXCIsXG5cdFwiYWpheENvbXBsZXRlXCIsXG5cdFwiYWpheEVycm9yXCIsXG5cdFwiYWpheFN1Y2Nlc3NcIixcblx0XCJhamF4U2VuZFwiXG5dLCBmdW5jdGlvbiggX2ksIHR5cGUgKSB7XG5cdGpRdWVyeS5mblsgdHlwZSBdID0gZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlLCBmbiApO1xuXHR9O1xufSApO1xuXG5cblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0YmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7XG5cdH0sXG5cdHVuYmluZDogZnVuY3Rpb24oIHR5cGVzLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vZmYoIHR5cGVzLCBudWxsLCBmbiApO1xuXHR9LFxuXG5cdGRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBmbiApIHtcblxuXHRcdC8vICggbmFtZXNwYWNlICkgb3IgKCBzZWxlY3RvciwgdHlwZXMgWywgZm5dIClcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/XG5cdFx0XHR0aGlzLm9mZiggc2VsZWN0b3IsIFwiKipcIiApIDpcblx0XHRcdHRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgXCIqKlwiLCBmbiApO1xuXHR9LFxuXG5cdGhvdmVyOiBmdW5jdGlvbiggZm5PdmVyLCBmbk91dCApIHtcblx0XHRyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaChcblx0KCBcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIFwiICtcblx0XCJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBcIiArXG5cdFwiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudVwiICkuc3BsaXQoIFwiIFwiICksXG5cdGZ1bmN0aW9uKCBfaSwgbmFtZSApIHtcblxuXHRcdC8vIEhhbmRsZSBldmVudCBiaW5kaW5nXG5cdFx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7XG5cdFx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDAgP1xuXHRcdFx0XHR0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDpcblx0XHRcdFx0dGhpcy50cmlnZ2VyKCBuYW1lICk7XG5cdFx0fTtcblx0fVxuKTtcblxuXG5cblxuLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5XG4vLyBNYWtlIHN1cmUgd2UgdHJpbSBCT00gYW5kIE5CU1BcbnZhciBydHJpbSA9IC9eW1xcc1xcdUZFRkZcXHhBMF0rfFtcXHNcXHVGRUZGXFx4QTBdKyQvZztcblxuLy8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55XG4vLyBhcmd1bWVudHMuXG4vLyBqUXVlcnkucHJveHkgaXMgZGVwcmVjYXRlZCB0byBwcm9tb3RlIHN0YW5kYXJkcyAoc3BlY2lmaWNhbGx5IEZ1bmN0aW9uI2JpbmQpXG4vLyBIb3dldmVyLCBpdCBpcyBub3Qgc2xhdGVkIGZvciByZW1vdmFsIGFueSB0aW1lIHNvb25cbmpRdWVyeS5wcm94eSA9IGZ1bmN0aW9uKCBmbiwgY29udGV4dCApIHtcblx0dmFyIHRtcCwgYXJncywgcHJveHk7XG5cblx0aWYgKCB0eXBlb2YgY29udGV4dCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHR0bXAgPSBmblsgY29udGV4dCBdO1xuXHRcdGNvbnRleHQgPSBmbjtcblx0XHRmbiA9IHRtcDtcblx0fVxuXG5cdC8vIFF1aWNrIGNoZWNrIHRvIGRldGVybWluZSBpZiB0YXJnZXQgaXMgY2FsbGFibGUsIGluIHRoZSBzcGVjXG5cdC8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuXG5cdGlmICggIWlzRnVuY3Rpb24oIGZuICkgKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdC8vIFNpbXVsYXRlZCBiaW5kXG5cdGFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTtcblx0cHJveHkgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZm4uYXBwbHkoIGNvbnRleHQgfHwgdGhpcywgYXJncy5jb25jYXQoIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApICkgKTtcblx0fTtcblxuXHQvLyBTZXQgdGhlIGd1aWQgb2YgdW5pcXVlIGhhbmRsZXIgdG8gdGhlIHNhbWUgb2Ygb3JpZ2luYWwgaGFuZGxlciwgc28gaXQgY2FuIGJlIHJlbW92ZWRcblx0cHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKys7XG5cblx0cmV0dXJuIHByb3h5O1xufTtcblxualF1ZXJ5LmhvbGRSZWFkeSA9IGZ1bmN0aW9uKCBob2xkICkge1xuXHRpZiAoIGhvbGQgKSB7XG5cdFx0alF1ZXJ5LnJlYWR5V2FpdCsrO1xuXHR9IGVsc2Uge1xuXHRcdGpRdWVyeS5yZWFkeSggdHJ1ZSApO1xuXHR9XG59O1xualF1ZXJ5LmlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xualF1ZXJ5LnBhcnNlSlNPTiA9IEpTT04ucGFyc2U7XG5qUXVlcnkubm9kZU5hbWUgPSBub2RlTmFtZTtcbmpRdWVyeS5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcbmpRdWVyeS5pc1dpbmRvdyA9IGlzV2luZG93O1xualF1ZXJ5LmNhbWVsQ2FzZSA9IGNhbWVsQ2FzZTtcbmpRdWVyeS50eXBlID0gdG9UeXBlO1xuXG5qUXVlcnkubm93ID0gRGF0ZS5ub3c7XG5cbmpRdWVyeS5pc051bWVyaWMgPSBmdW5jdGlvbiggb2JqICkge1xuXG5cdC8vIEFzIG9mIGpRdWVyeSAzLjAsIGlzTnVtZXJpYyBpcyBsaW1pdGVkIHRvXG5cdC8vIHN0cmluZ3MgYW5kIG51bWJlcnMgKHByaW1pdGl2ZXMgb3Igb2JqZWN0cylcblx0Ly8gdGhhdCBjYW4gYmUgY29lcmNlZCB0byBmaW5pdGUgbnVtYmVycyAoZ2gtMjY2Milcblx0dmFyIHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7XG5cdHJldHVybiAoIHR5cGUgPT09IFwibnVtYmVyXCIgfHwgdHlwZSA9PT0gXCJzdHJpbmdcIiApICYmXG5cblx0XHQvLyBwYXJzZUZsb2F0IE5hTnMgbnVtZXJpYy1jYXN0IGZhbHNlIHBvc2l0aXZlcyAoXCJcIilcblx0XHQvLyAuLi5idXQgbWlzaW50ZXJwcmV0cyBsZWFkaW5nLW51bWJlciBzdHJpbmdzLCBwYXJ0aWN1bGFybHkgaGV4IGxpdGVyYWxzIChcIjB4Li4uXCIpXG5cdFx0Ly8gc3VidHJhY3Rpb24gZm9yY2VzIGluZmluaXRpZXMgdG8gTmFOXG5cdFx0IWlzTmFOKCBvYmogLSBwYXJzZUZsb2F0KCBvYmogKSApO1xufTtcblxualF1ZXJ5LnRyaW0gPSBmdW5jdGlvbiggdGV4dCApIHtcblx0cmV0dXJuIHRleHQgPT0gbnVsbCA/XG5cdFx0XCJcIiA6XG5cdFx0KCB0ZXh0ICsgXCJcIiApLnJlcGxhY2UoIHJ0cmltLCBcIlwiICk7XG59O1xuXG5cblxuLy8gUmVnaXN0ZXIgYXMgYSBuYW1lZCBBTUQgbW9kdWxlLCBzaW5jZSBqUXVlcnkgY2FuIGJlIGNvbmNhdGVuYXRlZCB3aXRoIG90aGVyXG4vLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0XG4vLyB1bmRlcnN0YW5kcyBhbm9ueW1vdXMgQU1EIG1vZHVsZXMuIEEgbmFtZWQgQU1EIGlzIHNhZmVzdCBhbmQgbW9zdCByb2J1c3Rcbi8vIHdheSB0byByZWdpc3Rlci4gTG93ZXJjYXNlIGpxdWVyeSBpcyB1c2VkIGJlY2F1c2UgQU1EIG1vZHVsZSBuYW1lcyBhcmVcbi8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZVxuLy8gZmlsZSBuYW1lLiBEbyB0aGlzIGFmdGVyIGNyZWF0aW5nIHRoZSBnbG9iYWwgc28gdGhhdCBpZiBhbiBBTUQgbW9kdWxlIHdhbnRzXG4vLyB0byBjYWxsIG5vQ29uZmxpY3QgdG8gaGlkZSB0aGlzIHZlcnNpb24gb2YgalF1ZXJ5LCBpdCB3aWxsIHdvcmsuXG5cbi8vIE5vdGUgdGhhdCBmb3IgbWF4aW11bSBwb3J0YWJpbGl0eSwgbGlicmFyaWVzIHRoYXQgYXJlIG5vdCBqUXVlcnkgc2hvdWxkXG4vLyBkZWNsYXJlIHRoZW1zZWx2ZXMgYXMgYW5vbnltb3VzIG1vZHVsZXMsIGFuZCBhdm9pZCBzZXR0aW5nIGEgZ2xvYmFsIGlmIGFuXG4vLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVyeSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2pyYnVya2UvcmVxdWlyZWpzL3dpa2kvVXBkYXRpbmctZXhpc3RpbmctbGlicmFyaWVzI3dpa2ktYW5vblxuXG5pZiAoIHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kICkge1xuXHRkZWZpbmUoIFwianF1ZXJ5XCIsIFtdLCBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4galF1ZXJ5O1xuXHR9ICk7XG59XG5cblxuXG5cbnZhclxuXG5cdC8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuXHRfalF1ZXJ5ID0gd2luZG93LmpRdWVyeSxcblxuXHQvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuXHRfJCA9IHdpbmRvdy4kO1xuXG5qUXVlcnkubm9Db25mbGljdCA9IGZ1bmN0aW9uKCBkZWVwICkge1xuXHRpZiAoIHdpbmRvdy4kID09PSBqUXVlcnkgKSB7XG5cdFx0d2luZG93LiQgPSBfJDtcblx0fVxuXG5cdGlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBqUXVlcnkgKSB7XG5cdFx0d2luZG93LmpRdWVyeSA9IF9qUXVlcnk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5O1xufTtcblxuLy8gRXhwb3NlIGpRdWVyeSBhbmQgJCBpZGVudGlmaWVycywgZXZlbiBpbiBBTURcbi8vICgjNzEwMiNjb21tZW50OjEwLCBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzU1Nylcbi8vIGFuZCBDb21tb25KUyBmb3IgYnJvd3NlciBlbXVsYXRvcnMgKCMxMzU2NilcbmlmICggdHlwZW9mIG5vR2xvYmFsID09PSBcInVuZGVmaW5lZFwiICkge1xuXHR3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQgPSBqUXVlcnk7XG59XG5cblxuXG5cbnJldHVybiBqUXVlcnk7XG59ICk7XG4iLCAiLyogUHJpc21KUyAxLjI4LjBcbmh0dHBzOi8vcHJpc21qcy5jb20vZG93bmxvYWQuaHRtbCN0aGVtZXM9cHJpc20tdG9tb3Jyb3cmbGFuZ3VhZ2VzPW1hcmt1cCtjc3MrY2xpa2UramF2YXNjcmlwdCthYmFwK2FibmYrYWN0aW9uc2NyaXB0K2FkYSthZ2RhK2FsK2FudGxyNCthcGFjaGVjb25mK2FwZXgrYXBsK2FwcGxlc2NyaXB0K2FxbCthcmR1aW5vK2FyZmYrYXJtYXNtK2FydHVybythc2NpaWRvYythc3BuZXQrYXNtNjUwMithc21hdG1lbCthdXRvaG90a2V5K2F1dG9pdCthdmlzeW50aCthdnJvLWlkbCthd2srYmFzaCtiYXNpYytiYXRjaCtiYmNvZGUrYmljZXArYmlyYitiaXNvbitibmYrYnJhaW5mdWNrK2JyaWdodHNjcmlwdCticm8rYnNsK2MrY3NoYXJwK2NwcCtjZnNjcmlwdCtjaGFpc2NyaXB0K2NpbCtjbG9qdXJlK2NtYWtlK2NvYm9sK2NvZmZlZXNjcmlwdCtjb25jdXJuYXMrY3NwK2Nvb2tsYW5nK2NvcStjcnlzdGFsK2Nzcy1leHRyYXMrY3N2K2N1ZStjeXBoZXIrZCtkYXJ0K2RhdGF3ZWF2ZStkYXgrZGhhbGwrZGlmZitkamFuZ28rZG5zLXpvbmUtZmlsZStkb2NrZXIrZG90K2VibmYrZWRpdG9yY29uZmlnK2VpZmZlbCtlanMrZWxpeGlyK2VsbStldGx1YStlcmIrZXJsYW5nK2V4Y2VsLWZvcm11bGErZnNoYXJwK2ZhY3RvcitmYWxzZStmaXJlc3RvcmUtc2VjdXJpdHktcnVsZXMrZmxvdytmb3J0cmFuK2Z0bCtnbWwrZ2FwK2djb2RlK2dkc2NyaXB0K2dlZGNvbStnZXR0ZXh0K2doZXJraW4rZ2l0K2dsc2wrZ24rbGlua2VyLXNjcmlwdCtnbytnby1tb2R1bGUrZ3JhZGxlK2dyYXBocWwrZ3Jvb3Z5K2hhbWwraGFuZGxlYmFycytoYXNrZWxsK2hheGUraGNsK2hsc2wraG9vbitodHRwK2hwa3AraHN0cytpY2hpZ29qYW0raWNvbitpY3UtbWVzc2FnZS1mb3JtYXQraWRyaXMraWdub3JlK2luZm9ybTcraW5pK2lvK2oramF2YStqYXZhZG9jK2phdmFkb2NsaWtlK2phdmFzdGFja3RyYWNlK2pleGwram9saWUranEranNkb2MranMtZXh0cmFzK2pzb24ranNvbjUranNvbnAranNzdGFja3RyYWNlK2pzLXRlbXBsYXRlcytqdWxpYStrZWVwYWxpdmVkK2tleW1hbitrb3RsaW4ra3VtaXIra3VzdG8rbGF0ZXgrbGF0dGUrbGVzcytsaWx5cG9uZCtsaXF1aWQrbGlzcCtsaXZlc2NyaXB0K2xsdm0rbG9nK2xvbGNvZGUrbHVhK21hZ21hK21ha2VmaWxlK21hcmtkb3duK21hcmt1cC10ZW1wbGF0aW5nK21hdGErbWF0bGFiK21heHNjcmlwdCttZWwrbWVybWFpZCttaXphcittb25nb2RiK21vbmtleSttb29uc2NyaXB0K24xcWwrbjRqcytuYW5kMnRldHJpcy1oZGwrbmFuaXNjcmlwdCtuYXNtK25lb24rbmV2b2QrbmdpbngrbmltK25peCtuc2lzK29iamVjdGl2ZWMrb2NhbWwrb2RpbitvcGVuY2wrb3BlbnFhc20rb3orcGFyaWdwK3BhcnNlcitwYXNjYWwrcGFzY2FsaWdvK3BzbCtwY2F4aXMrcGVvcGxlY29kZStwZXJsK3BocCtwaHBkb2MrcGhwLWV4dHJhcytwbGFudC11bWwrcGxzcWwrcG93ZXJxdWVyeStwb3dlcnNoZWxsK3Byb2Nlc3NpbmcrcHJvbG9nK3Byb21xbCtwcm9wZXJ0aWVzK3Byb3RvYnVmK3B1ZytwdXBwZXQrcHVyZStwdXJlYmFzaWMrcHVyZXNjcmlwdCtweXRob24rcXNoYXJwK3ErcW1sK3FvcmUrcityYWNrZXQrY3NodG1sK2pzeCt0c3grcmVhc29uK3JlZ2V4K3JlZ28rcmVucHkrcmVzY3JpcHQrcmVzdCtyaXArcm9ib2NvbmYrcm9ib3RmcmFtZXdvcmsrcnVieStydXN0K3NhcytzYXNzK3Njc3Mrc2NhbGErc2NoZW1lK3NoZWxsLXNlc3Npb24rc21hbGkrc21hbGx0YWxrK3NtYXJ0eStzbWwrc29saWRpdHkrc29sdXRpb24tZmlsZStzb3krc3BhcnFsK3NwbHVuay1zcGwrc3FmK3NxbCtzcXVpcnJlbCtzdGFuK3N0YXRhK2llY3N0K3N0eWx1cytzdXBlcmNvbGxpZGVyK3N3aWZ0K3N5c3RlbWQrdDQtdGVtcGxhdGluZyt0NC1jcyt0NC12Yit0YXArdGNsK3R0Mit0ZXh0aWxlK3RvbWwrdHJlbW9yK3R1cnRsZSt0d2lnK3R5cGVzY3JpcHQrdHlwb3NjcmlwdCt1bnJlYWxzY3JpcHQrdW9yYXpvcit1cmkrdit2YWxhK3ZibmV0K3ZlbG9jaXR5K3Zlcmlsb2crdmhkbCt2aW0rdmlzdWFsLWJhc2ljK3dhcnBzY3JpcHQrd2FzbSt3ZWItaWRsK3dnc2wrd2lraSt3b2xmcmFtK3dyZW4reGVvcmEreG1sLWRvYyt4b2pvK3hxdWVyeSt5YW1sK3lhbmcremlnJnBsdWdpbnM9bGluZS1udW1iZXJzK2ZpbGUtaGlnaGxpZ2h0ICovXG4vLy8gPHJlZmVyZW5jZSBsaWI9XCJXZWJXb3JrZXJcIi8+XG5cbnZhciBfc2VsZiA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJylcblx0PyB3aW5kb3cgICAvLyBpZiBpbiBicm93c2VyXG5cdDogKFxuXHRcdCh0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09ICd1bmRlZmluZWQnICYmIHNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSlcblx0XHRcdD8gc2VsZiAvLyBpZiBpbiB3b3JrZXJcblx0XHRcdDoge30gICAvLyBpZiBpbiBub2RlIGpzXG5cdCk7XG5cbi8qKlxuICogUHJpc206IExpZ2h0d2VpZ2h0LCByb2J1c3QsIGVsZWdhbnQgc3ludGF4IGhpZ2hsaWdodGluZ1xuICpcbiAqIEBsaWNlbnNlIE1JVCA8aHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+XG4gKiBAYXV0aG9yIExlYSBWZXJvdSA8aHR0cHM6Ly9sZWEudmVyb3UubWU+XG4gKiBAbmFtZXNwYWNlXG4gKiBAcHVibGljXG4gKi9cbnZhciBQcmlzbSA9IChmdW5jdGlvbiAoX3NlbGYpIHtcblxuXHQvLyBQcml2YXRlIGhlbHBlciB2YXJzXG5cdHZhciBsYW5nID0gLyg/Ol58XFxzKWxhbmcoPzp1YWdlKT8tKFtcXHctXSspKD89XFxzfCQpL2k7XG5cdHZhciB1bmlxdWVJZCA9IDA7XG5cblx0Ly8gVGhlIGdyYW1tYXIgb2JqZWN0IGZvciBwbGFpbnRleHRcblx0dmFyIHBsYWluVGV4dEdyYW1tYXIgPSB7fTtcblxuXG5cdHZhciBfID0ge1xuXHRcdC8qKlxuXHRcdCAqIEJ5IGRlZmF1bHQsIFByaXNtIHdpbGwgYXR0ZW1wdCB0byBoaWdobGlnaHQgYWxsIGNvZGUgZWxlbWVudHMgKGJ5IGNhbGxpbmcge0BsaW5rIFByaXNtLmhpZ2hsaWdodEFsbH0pIG9uIHRoZVxuXHRcdCAqIGN1cnJlbnQgcGFnZSBhZnRlciB0aGUgcGFnZSBmaW5pc2hlZCBsb2FkaW5nLiBUaGlzIG1pZ2h0IGJlIGEgcHJvYmxlbSBpZiBlLmcuIHlvdSB3YW50ZWQgdG8gYXN5bmNocm9ub3VzbHkgbG9hZFxuXHRcdCAqIGFkZGl0aW9uYWwgbGFuZ3VhZ2VzIG9yIHBsdWdpbnMgeW91cnNlbGYuXG5cdFx0ICpcblx0XHQgKiBCeSBzZXR0aW5nIHRoaXMgdmFsdWUgdG8gYHRydWVgLCBQcmlzbSB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGhpZ2hsaWdodCBhbGwgY29kZSBlbGVtZW50cyBvbiB0aGUgcGFnZS5cblx0XHQgKlxuXHRcdCAqIFlvdSBvYnZpb3VzbHkgaGF2ZSB0byBjaGFuZ2UgdGhpcyB2YWx1ZSBiZWZvcmUgdGhlIGF1dG9tYXRpYyBoaWdobGlnaHRpbmcgc3RhcnRlZC4gVG8gZG8gdGhpcywgeW91IGNhbiBhZGQgYW5cblx0XHQgKiBlbXB0eSBQcmlzbSBvYmplY3QgaW50byB0aGUgZ2xvYmFsIHNjb3BlIGJlZm9yZSBsb2FkaW5nIHRoZSBQcmlzbSBzY3JpcHQgbGlrZSB0aGlzOlxuXHRcdCAqXG5cdFx0ICogYGBganNcblx0XHQgKiB3aW5kb3cuUHJpc20gPSB3aW5kb3cuUHJpc20gfHwge307XG5cdFx0ICogUHJpc20ubWFudWFsID0gdHJ1ZTtcblx0XHQgKiAvLyBhZGQgYSBuZXcgPHNjcmlwdD4gdG8gbG9hZCBQcmlzbSdzIHNjcmlwdFxuXHRcdCAqIGBgYFxuXHRcdCAqXG5cdFx0ICogQGRlZmF1bHQgZmFsc2Vcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cblx0XHQgKiBAbWVtYmVyb2YgUHJpc21cblx0XHQgKiBAcHVibGljXG5cdFx0ICovXG5cdFx0bWFudWFsOiBfc2VsZi5QcmlzbSAmJiBfc2VsZi5QcmlzbS5tYW51YWwsXG5cdFx0LyoqXG5cdFx0ICogQnkgZGVmYXVsdCwgaWYgUHJpc20gaXMgaW4gYSB3ZWIgd29ya2VyLCBpdCBhc3N1bWVzIHRoYXQgaXQgaXMgaW4gYSB3b3JrZXIgaXQgY3JlYXRlZCBpdHNlbGYsIHNvIGl0IHVzZXNcblx0XHQgKiBgYWRkRXZlbnRMaXN0ZW5lcmAgdG8gY29tbXVuaWNhdGUgd2l0aCBpdHMgcGFyZW50IGluc3RhbmNlLiBIb3dldmVyLCBpZiB5b3UncmUgdXNpbmcgUHJpc20gbWFudWFsbHkgaW4geW91clxuXHRcdCAqIG93biB3b3JrZXIsIHlvdSBkb24ndCB3YW50IGl0IHRvIGRvIHRoaXMuXG5cdFx0ICpcblx0XHQgKiBCeSBzZXR0aW5nIHRoaXMgdmFsdWUgdG8gYHRydWVgLCBQcmlzbSB3aWxsIG5vdCBhZGQgaXRzIG93biBsaXN0ZW5lcnMgdG8gdGhlIHdvcmtlci5cblx0XHQgKlxuXHRcdCAqIFlvdSBvYnZpb3VzbHkgaGF2ZSB0byBjaGFuZ2UgdGhpcyB2YWx1ZSBiZWZvcmUgUHJpc20gZXhlY3V0ZXMuIFRvIGRvIHRoaXMsIHlvdSBjYW4gYWRkIGFuXG5cdFx0ICogZW1wdHkgUHJpc20gb2JqZWN0IGludG8gdGhlIGdsb2JhbCBzY29wZSBiZWZvcmUgbG9hZGluZyB0aGUgUHJpc20gc2NyaXB0IGxpa2UgdGhpczpcblx0XHQgKlxuXHRcdCAqIGBgYGpzXG5cdFx0ICogd2luZG93LlByaXNtID0gd2luZG93LlByaXNtIHx8IHt9O1xuXHRcdCAqIFByaXNtLmRpc2FibGVXb3JrZXJNZXNzYWdlSGFuZGxlciA9IHRydWU7XG5cdFx0ICogLy8gTG9hZCBQcmlzbSdzIHNjcmlwdFxuXHRcdCAqIGBgYFxuXHRcdCAqXG5cdFx0ICogQGRlZmF1bHQgZmFsc2Vcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cblx0XHQgKiBAbWVtYmVyb2YgUHJpc21cblx0XHQgKiBAcHVibGljXG5cdFx0ICovXG5cdFx0ZGlzYWJsZVdvcmtlck1lc3NhZ2VIYW5kbGVyOiBfc2VsZi5QcmlzbSAmJiBfc2VsZi5QcmlzbS5kaXNhYmxlV29ya2VyTWVzc2FnZUhhbmRsZXIsXG5cblx0XHQvKipcblx0XHQgKiBBIG5hbWVzcGFjZSBmb3IgdXRpbGl0eSBtZXRob2RzLlxuXHRcdCAqXG5cdFx0ICogQWxsIGZ1bmN0aW9uIGluIHRoaXMgbmFtZXNwYWNlIHRoYXQgYXJlIG5vdCBleHBsaWNpdGx5IG1hcmtlZCBhcyBfcHVibGljXyBhcmUgZm9yIF9faW50ZXJuYWwgdXNlIG9ubHlfXyBhbmQgbWF5XG5cdFx0ICogY2hhbmdlIG9yIGRpc2FwcGVhciBhdCBhbnkgdGltZS5cblx0XHQgKlxuXHRcdCAqIEBuYW1lc3BhY2Vcblx0XHQgKiBAbWVtYmVyb2YgUHJpc21cblx0XHQgKi9cblx0XHR1dGlsOiB7XG5cdFx0XHRlbmNvZGU6IGZ1bmN0aW9uIGVuY29kZSh0b2tlbnMpIHtcblx0XHRcdFx0aWYgKHRva2VucyBpbnN0YW5jZW9mIFRva2VuKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBUb2tlbih0b2tlbnMudHlwZSwgZW5jb2RlKHRva2Vucy5jb250ZW50KSwgdG9rZW5zLmFsaWFzKTtcblx0XHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRva2VucykpIHtcblx0XHRcdFx0XHRyZXR1cm4gdG9rZW5zLm1hcChlbmNvZGUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiB0b2tlbnMucmVwbGFjZSgvJi9nLCAnJmFtcDsnKS5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvXFx1MDBhMC9nLCAnICcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIHZhbHVlLlxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7YW55fSBvXG5cdFx0XHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHRcdFx0ICogQGV4YW1wbGVcblx0XHRcdCAqIHR5cGUobnVsbCkgICAgICA9PT0gJ051bGwnXG5cdFx0XHQgKiB0eXBlKHVuZGVmaW5lZCkgPT09ICdVbmRlZmluZWQnXG5cdFx0XHQgKiB0eXBlKDEyMykgICAgICAgPT09ICdOdW1iZXInXG5cdFx0XHQgKiB0eXBlKCdmb28nKSAgICAgPT09ICdTdHJpbmcnXG5cdFx0XHQgKiB0eXBlKHRydWUpICAgICAgPT09ICdCb29sZWFuJ1xuXHRcdFx0ICogdHlwZShbMSwgMl0pICAgID09PSAnQXJyYXknXG5cdFx0XHQgKiB0eXBlKHt9KSAgICAgICAgPT09ICdPYmplY3QnXG5cdFx0XHQgKiB0eXBlKFN0cmluZykgICAgPT09ICdGdW5jdGlvbidcblx0XHRcdCAqIHR5cGUoL2FiYysvKSAgICA9PT0gJ1JlZ0V4cCdcblx0XHRcdCAqL1xuXHRcdFx0dHlwZTogZnVuY3Rpb24gKG8pIHtcblx0XHRcdFx0cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7XG5cdFx0XHR9LFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIFJldHVybnMgYSB1bmlxdWUgbnVtYmVyIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LiBMYXRlciBjYWxscyB3aWxsIHN0aWxsIHJldHVybiB0aGUgc2FtZSBudW1iZXIuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IG9ialxuXHRcdFx0ICogQHJldHVybnMge251bWJlcn1cblx0XHRcdCAqL1xuXHRcdFx0b2JqSWQ6IGZ1bmN0aW9uIChvYmopIHtcblx0XHRcdFx0aWYgKCFvYmpbJ19faWQnXSkge1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosICdfX2lkJywgeyB2YWx1ZTogKyt1bmlxdWVJZCB9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gb2JqWydfX2lkJ107XG5cdFx0XHR9LFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIENyZWF0ZXMgYSBkZWVwIGNsb25lIG9mIHRoZSBnaXZlbiBvYmplY3QuXG5cdFx0XHQgKlxuXHRcdFx0ICogVGhlIG1haW4gaW50ZW5kZWQgdXNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gY2xvbmUgbGFuZ3VhZ2UgZGVmaW5pdGlvbnMuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtUfSBvXG5cdFx0XHQgKiBAcGFyYW0ge1JlY29yZDxudW1iZXIsIGFueT59IFt2aXNpdGVkXVxuXHRcdFx0ICogQHJldHVybnMge1R9XG5cdFx0XHQgKiBAdGVtcGxhdGUgVFxuXHRcdFx0ICovXG5cdFx0XHRjbG9uZTogZnVuY3Rpb24gZGVlcENsb25lKG8sIHZpc2l0ZWQpIHtcblx0XHRcdFx0dmlzaXRlZCA9IHZpc2l0ZWQgfHwge307XG5cblx0XHRcdFx0dmFyIGNsb25lOyB2YXIgaWQ7XG5cdFx0XHRcdHN3aXRjaCAoXy51dGlsLnR5cGUobykpIHtcblx0XHRcdFx0XHRjYXNlICdPYmplY3QnOlxuXHRcdFx0XHRcdFx0aWQgPSBfLnV0aWwub2JqSWQobyk7XG5cdFx0XHRcdFx0XHRpZiAodmlzaXRlZFtpZF0pIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHZpc2l0ZWRbaWRdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Y2xvbmUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovICh7fSk7XG5cdFx0XHRcdFx0XHR2aXNpdGVkW2lkXSA9IGNsb25lO1xuXG5cdFx0XHRcdFx0XHRmb3IgKHZhciBrZXkgaW4gbykge1xuXHRcdFx0XHRcdFx0XHRpZiAoby5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2xvbmVba2V5XSA9IGRlZXBDbG9uZShvW2tleV0sIHZpc2l0ZWQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHJldHVybiAvKiogQHR5cGUge2FueX0gKi8gKGNsb25lKTtcblxuXHRcdFx0XHRcdGNhc2UgJ0FycmF5Jzpcblx0XHRcdFx0XHRcdGlkID0gXy51dGlsLm9iaklkKG8pO1xuXHRcdFx0XHRcdFx0aWYgKHZpc2l0ZWRbaWRdKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB2aXNpdGVkW2lkXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGNsb25lID0gW107XG5cdFx0XHRcdFx0XHR2aXNpdGVkW2lkXSA9IGNsb25lO1xuXG5cdFx0XHRcdFx0XHQoLyoqIEB0eXBlIHtBcnJheX0gKi8oLyoqIEB0eXBlIHthbnl9ICovKG8pKSkuZm9yRWFjaChmdW5jdGlvbiAodiwgaSkge1xuXHRcdFx0XHRcdFx0XHRjbG9uZVtpXSA9IGRlZXBDbG9uZSh2LCB2aXNpdGVkKTtcblx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gLyoqIEB0eXBlIHthbnl9ICovIChjbG9uZSk7XG5cblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0cmV0dXJuIG87XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogUmV0dXJucyB0aGUgUHJpc20gbGFuZ3VhZ2Ugb2YgdGhlIGdpdmVuIGVsZW1lbnQgc2V0IGJ5IGEgYGxhbmd1YWdlLXh4eHhgIG9yIGBsYW5nLXh4eHhgIGNsYXNzLlxuXHRcdFx0ICpcblx0XHRcdCAqIElmIG5vIGxhbmd1YWdlIGlzIHNldCBmb3IgdGhlIGVsZW1lbnQgb3IgdGhlIGVsZW1lbnQgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLCBgbm9uZWAgd2lsbCBiZSByZXR1cm5lZC5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcblx0XHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdFx0XHQgKi9cblx0XHRcdGdldExhbmd1YWdlOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuXHRcdFx0XHR3aGlsZSAoZWxlbWVudCkge1xuXHRcdFx0XHRcdHZhciBtID0gbGFuZy5leGVjKGVsZW1lbnQuY2xhc3NOYW1lKTtcblx0XHRcdFx0XHRpZiAobSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG1bMV0udG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gJ25vbmUnO1xuXHRcdFx0fSxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBTZXRzIHRoZSBQcmlzbSBgbGFuZ3VhZ2UteHh4eGAgY2xhc3Mgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG5cdFx0XHQgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2Vcblx0XHRcdCAqIEByZXR1cm5zIHt2b2lkfVxuXHRcdFx0ICovXG5cdFx0XHRzZXRMYW5ndWFnZTogZnVuY3Rpb24gKGVsZW1lbnQsIGxhbmd1YWdlKSB7XG5cdFx0XHRcdC8vIHJlbW92ZSBhbGwgYGxhbmd1YWdlLXh4eHhgIGNsYXNzZXNcblx0XHRcdFx0Ly8gKHRoaXMgbWlnaHQgbGVhdmUgYmVoaW5kIGEgbGVhZGluZyBzcGFjZSlcblx0XHRcdFx0ZWxlbWVudC5jbGFzc05hbWUgPSBlbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKFJlZ0V4cChsYW5nLCAnZ2knKSwgJycpO1xuXG5cdFx0XHRcdC8vIGFkZCB0aGUgbmV3IGBsYW5ndWFnZS14eHh4YCBjbGFzc1xuXHRcdFx0XHQvLyAodXNpbmcgYGNsYXNzTGlzdGAgd2lsbCBhdXRvbWF0aWNhbGx5IGNsZWFuIHVwIHNwYWNlcyBmb3IgdXMpXG5cdFx0XHRcdGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbGFuZ3VhZ2UtJyArIGxhbmd1YWdlKTtcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogUmV0dXJucyB0aGUgc2NyaXB0IGVsZW1lbnQgdGhhdCBpcyBjdXJyZW50bHkgZXhlY3V0aW5nLlxuXHRcdFx0ICpcblx0XHRcdCAqIFRoaXMgZG9lcyBfX25vdF9fIHdvcmsgZm9yIGxpbmUgc2NyaXB0IGVsZW1lbnQuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHJldHVybnMge0hUTUxTY3JpcHRFbGVtZW50IHwgbnVsbH1cblx0XHRcdCAqL1xuXHRcdFx0Y3VycmVudFNjcmlwdDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICgnY3VycmVudFNjcmlwdCcgaW4gZG9jdW1lbnQgJiYgMSA8IDIgLyogaGFjayB0byB0cmlwIFRTJyBmbG93IGFuYWx5c2lzICovKSB7XG5cdFx0XHRcdFx0cmV0dXJuIC8qKiBAdHlwZSB7YW55fSAqLyAoZG9jdW1lbnQuY3VycmVudFNjcmlwdCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJRTExIHdvcmthcm91bmRcblx0XHRcdFx0Ly8gd2UnbGwgZ2V0IHRoZSBzcmMgb2YgdGhlIGN1cnJlbnQgc2NyaXB0IGJ5IHBhcnNpbmcgSUUxMSdzIGVycm9yIHN0YWNrIHRyYWNlXG5cdFx0XHRcdC8vIHRoaXMgd2lsbCBub3Qgd29yayBmb3IgaW5saW5lIHNjcmlwdHNcblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcigpO1xuXHRcdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0XHQvLyBHZXQgZmlsZSBzcmMgdXJsIGZyb20gc3RhY2suIFNwZWNpZmljYWxseSB3b3JrcyB3aXRoIHRoZSBmb3JtYXQgb2Ygc3RhY2sgdHJhY2VzIGluIElFLlxuXHRcdFx0XHRcdC8vIEEgc3RhY2sgd2lsbCBsb29rIGxpa2UgdGhpczpcblx0XHRcdFx0XHQvL1xuXHRcdFx0XHRcdC8vIEVycm9yXG5cdFx0XHRcdFx0Ly8gICAgYXQgXy51dGlsLmN1cnJlbnRTY3JpcHQgKGh0dHA6Ly9sb2NhbGhvc3QvY29tcG9uZW50cy9wcmlzbS1jb3JlLmpzOjExOTo1KVxuXHRcdFx0XHRcdC8vICAgIGF0IEdsb2JhbCBjb2RlIChodHRwOi8vbG9jYWxob3N0L2NvbXBvbmVudHMvcHJpc20tY29yZS5qczo2MDY6MSlcblxuXHRcdFx0XHRcdHZhciBzcmMgPSAoL2F0IFteKFxcclxcbl0qXFwoKC4qKTpbXjpdKzpbXjpdK1xcKSQvaS5leGVjKGVyci5zdGFjaykgfHwgW10pWzFdO1xuXHRcdFx0XHRcdGlmIChzcmMpIHtcblx0XHRcdFx0XHRcdHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpO1xuXHRcdFx0XHRcdFx0Zm9yICh2YXIgaSBpbiBzY3JpcHRzKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChzY3JpcHRzW2ldLnNyYyA9PSBzcmMpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gc2NyaXB0c1tpXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBSZXR1cm5zIHdoZXRoZXIgYSBnaXZlbiBjbGFzcyBpcyBhY3RpdmUgZm9yIGBlbGVtZW50YC5cblx0XHRcdCAqXG5cdFx0XHQgKiBUaGUgY2xhc3MgY2FuIGJlIGFjdGl2YXRlZCBpZiBgZWxlbWVudGAgb3Igb25lIG9mIGl0cyBhbmNlc3RvcnMgaGFzIHRoZSBnaXZlbiBjbGFzcyBhbmQgaXQgY2FuIGJlIGRlYWN0aXZhdGVkXG5cdFx0XHQgKiBpZiBgZWxlbWVudGAgb3Igb25lIG9mIGl0cyBhbmNlc3RvcnMgaGFzIHRoZSBuZWdhdGVkIHZlcnNpb24gb2YgdGhlIGdpdmVuIGNsYXNzLiBUaGUgX25lZ2F0ZWQgdmVyc2lvbl8gb2YgdGhlXG5cdFx0XHQgKiBnaXZlbiBjbGFzcyBpcyBqdXN0IHRoZSBnaXZlbiBjbGFzcyB3aXRoIGEgYG5vLWAgcHJlZml4LlxuXHRcdFx0ICpcblx0XHRcdCAqIFdoZXRoZXIgdGhlIGNsYXNzIGlzIGFjdGl2ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjbG9zZXN0IGFuY2VzdG9yIG9mIGBlbGVtZW50YCAod2hlcmUgYGVsZW1lbnRgIGl0c2VsZiBpc1xuXHRcdFx0ICogY2xvc2VzdCBhbmNlc3RvcikgdGhhdCBoYXMgdGhlIGdpdmVuIGNsYXNzIG9yIHRoZSBuZWdhdGVkIHZlcnNpb24gb2YgaXQuIElmIG5laXRoZXIgYGVsZW1lbnRgIG5vciBhbnkgb2YgaXRzXG5cdFx0XHQgKiBhbmNlc3RvcnMgaGF2ZSB0aGUgZ2l2ZW4gY2xhc3Mgb3IgdGhlIG5lZ2F0ZWQgdmVyc2lvbiBvZiBpdCwgdGhlbiB0aGUgZGVmYXVsdCBhY3RpdmF0aW9uIHdpbGwgYmUgcmV0dXJuZWQuXG5cdFx0XHQgKlxuXHRcdFx0ICogSW4gdGhlIHBhcmFkb3hpY2FsIHNpdHVhdGlvbiB3aGVyZSB0aGUgY2xvc2VzdCBhbmNlc3RvciBjb250YWlucyBfX2JvdGhfXyB0aGUgZ2l2ZW4gY2xhc3MgYW5kIHRoZSBuZWdhdGVkXG5cdFx0XHQgKiB2ZXJzaW9uIG9mIGl0LCB0aGUgY2xhc3MgaXMgY29uc2lkZXJlZCBhY3RpdmUuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG5cdFx0XHQgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lXG5cdFx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtkZWZhdWx0QWN0aXZhdGlvbj1mYWxzZV1cblx0XHRcdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHRcdFx0ICovXG5cdFx0XHRpc0FjdGl2ZTogZnVuY3Rpb24gKGVsZW1lbnQsIGNsYXNzTmFtZSwgZGVmYXVsdEFjdGl2YXRpb24pIHtcblx0XHRcdFx0dmFyIG5vID0gJ25vLScgKyBjbGFzc05hbWU7XG5cblx0XHRcdFx0d2hpbGUgKGVsZW1lbnQpIHtcblx0XHRcdFx0XHR2YXIgY2xhc3NMaXN0ID0gZWxlbWVudC5jbGFzc0xpc3Q7XG5cdFx0XHRcdFx0aWYgKGNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGNsYXNzTGlzdC5jb250YWlucyhubykpIHtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gISFkZWZhdWx0QWN0aXZhdGlvbjtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgYWxsIGN1cnJlbnRseSBsb2FkZWQgbGFuZ3VhZ2VzIGFuZCB0aGUgc29tZSBoZWxwZXIgZnVuY3Rpb25zIHRvIGNyZWF0ZSBhbmQgbW9kaWZ5IGxhbmd1YWdlcy5cblx0XHQgKlxuXHRcdCAqIEBuYW1lc3BhY2Vcblx0XHQgKiBAbWVtYmVyb2YgUHJpc21cblx0XHQgKiBAcHVibGljXG5cdFx0ICovXG5cdFx0bGFuZ3VhZ2VzOiB7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBncmFtbWFyIGZvciBwbGFpbiwgdW5mb3JtYXR0ZWQgdGV4dC5cblx0XHRcdCAqL1xuXHRcdFx0cGxhaW46IHBsYWluVGV4dEdyYW1tYXIsXG5cdFx0XHRwbGFpbnRleHQ6IHBsYWluVGV4dEdyYW1tYXIsXG5cdFx0XHR0ZXh0OiBwbGFpblRleHRHcmFtbWFyLFxuXHRcdFx0dHh0OiBwbGFpblRleHRHcmFtbWFyLFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIENyZWF0ZXMgYSBkZWVwIGNvcHkgb2YgdGhlIGxhbmd1YWdlIHdpdGggdGhlIGdpdmVuIGlkIGFuZCBhcHBlbmRzIHRoZSBnaXZlbiB0b2tlbnMuXG5cdFx0XHQgKlxuXHRcdFx0ICogSWYgYSB0b2tlbiBpbiBgcmVkZWZgIGFsc28gYXBwZWFycyBpbiB0aGUgY29waWVkIGxhbmd1YWdlLCB0aGVuIHRoZSBleGlzdGluZyB0b2tlbiBpbiB0aGUgY29waWVkIGxhbmd1YWdlXG5cdFx0XHQgKiB3aWxsIGJlIG92ZXJ3cml0dGVuIGF0IGl0cyBvcmlnaW5hbCBwb3NpdGlvbi5cblx0XHRcdCAqXG5cdFx0XHQgKiAjIyBCZXN0IHByYWN0aWNlc1xuXHRcdFx0ICpcblx0XHRcdCAqIFNpbmNlIHRoZSBwb3NpdGlvbiBvZiBvdmVyd3JpdGluZyB0b2tlbnMgKHRva2VuIGluIGByZWRlZmAgdGhhdCBvdmVyd3JpdGUgdG9rZW5zIGluIHRoZSBjb3BpZWQgbGFuZ3VhZ2UpXG5cdFx0XHQgKiBkb2Vzbid0IG1hdHRlciwgdGhleSBjYW4gdGVjaG5pY2FsbHkgYmUgaW4gYW55IG9yZGVyLiBIb3dldmVyLCB0aGlzIGNhbiBiZSBjb25mdXNpbmcgdG8gb3RoZXJzIHRoYXQgdHJ5aW5nIHRvXG5cdFx0XHQgKiB1bmRlcnN0YW5kIHRoZSBsYW5ndWFnZSBkZWZpbml0aW9uIGJlY2F1c2UsIG5vcm1hbGx5LCB0aGUgb3JkZXIgb2YgdG9rZW5zIG1hdHRlcnMgaW4gUHJpc20gZ3JhbW1hcnMuXG5cdFx0XHQgKlxuXHRcdFx0ICogVGhlcmVmb3JlLCBpdCBpcyBlbmNvdXJhZ2VkIHRvIG9yZGVyIG92ZXJ3cml0aW5nIHRva2VucyBhY2NvcmRpbmcgdG8gdGhlIHBvc2l0aW9ucyBvZiB0aGUgb3ZlcndyaXR0ZW4gdG9rZW5zLlxuXHRcdFx0ICogRnVydGhlcm1vcmUsIGFsbCBub24tb3ZlcndyaXRpbmcgdG9rZW5zIHNob3VsZCBiZSBwbGFjZWQgYWZ0ZXIgdGhlIG92ZXJ3cml0aW5nIG9uZXMuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBpZCBvZiB0aGUgbGFuZ3VhZ2UgdG8gZXh0ZW5kLiBUaGlzIGhhcyB0byBiZSBhIGtleSBpbiBgUHJpc20ubGFuZ3VhZ2VzYC5cblx0XHRcdCAqIEBwYXJhbSB7R3JhbW1hcn0gcmVkZWYgVGhlIG5ldyB0b2tlbnMgdG8gYXBwZW5kLlxuXHRcdFx0ICogQHJldHVybnMge0dyYW1tYXJ9IFRoZSBuZXcgbGFuZ3VhZ2UgY3JlYXRlZC5cblx0XHRcdCAqIEBwdWJsaWNcblx0XHRcdCAqIEBleGFtcGxlXG5cdFx0XHQgKiBQcmlzbS5sYW5ndWFnZXNbJ2Nzcy13aXRoLWNvbG9ycyddID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY3NzJywge1xuXHRcdFx0ICogICAgIC8vIFByaXNtLmxhbmd1YWdlcy5jc3MgYWxyZWFkeSBoYXMgYSAnY29tbWVudCcgdG9rZW4sIHNvIHRoaXMgdG9rZW4gd2lsbCBvdmVyd3JpdGUgQ1NTJyAnY29tbWVudCcgdG9rZW5cblx0XHRcdCAqICAgICAvLyBhdCBpdHMgb3JpZ2luYWwgcG9zaXRpb25cblx0XHRcdCAqICAgICAnY29tbWVudCc6IHsgLi4uIH0sXG5cdFx0XHQgKiAgICAgLy8gQ1NTIGRvZXNuJ3QgaGF2ZSBhICdjb2xvcicgdG9rZW4sIHNvIHRoaXMgdG9rZW4gd2lsbCBiZSBhcHBlbmRlZFxuXHRcdFx0ICogICAgICdjb2xvcic6IC9cXGIoPzpyZWR8Z3JlZW58Ymx1ZSlcXGIvXG5cdFx0XHQgKiB9KTtcblx0XHRcdCAqL1xuXHRcdFx0ZXh0ZW5kOiBmdW5jdGlvbiAoaWQsIHJlZGVmKSB7XG5cdFx0XHRcdHZhciBsYW5nID0gXy51dGlsLmNsb25lKF8ubGFuZ3VhZ2VzW2lkXSk7XG5cblx0XHRcdFx0Zm9yICh2YXIga2V5IGluIHJlZGVmKSB7XG5cdFx0XHRcdFx0bGFuZ1trZXldID0gcmVkZWZba2V5XTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBsYW5nO1xuXHRcdFx0fSxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBJbnNlcnRzIHRva2VucyBfYmVmb3JlXyBhbm90aGVyIHRva2VuIGluIGEgbGFuZ3VhZ2UgZGVmaW5pdGlvbiBvciBhbnkgb3RoZXIgZ3JhbW1hci5cblx0XHRcdCAqXG5cdFx0XHQgKiAjIyBVc2FnZVxuXHRcdFx0ICpcblx0XHRcdCAqIFRoaXMgaGVscGVyIG1ldGhvZCBtYWtlcyBpdCBlYXN5IHRvIG1vZGlmeSBleGlzdGluZyBsYW5ndWFnZXMuIEZvciBleGFtcGxlLCB0aGUgQ1NTIGxhbmd1YWdlIGRlZmluaXRpb25cblx0XHRcdCAqIG5vdCBvbmx5IGRlZmluZXMgQ1NTIGhpZ2hsaWdodGluZyBmb3IgQ1NTIGRvY3VtZW50cywgYnV0IGFsc28gbmVlZHMgdG8gZGVmaW5lIGhpZ2hsaWdodGluZyBmb3IgQ1NTIGVtYmVkZGVkXG5cdFx0XHQgKiBpbiBIVE1MIHRocm91Z2ggYDxzdHlsZT5gIGVsZW1lbnRzLiBUbyBkbyB0aGlzLCBpdCBuZWVkcyB0byBtb2RpZnkgYFByaXNtLmxhbmd1YWdlcy5tYXJrdXBgIGFuZCBhZGQgdGhlXG5cdFx0XHQgKiBhcHByb3ByaWF0ZSB0b2tlbnMuIEhvd2V2ZXIsIGBQcmlzbS5sYW5ndWFnZXMubWFya3VwYCBpcyBhIHJlZ3VsYXIgSmF2YVNjcmlwdCBvYmplY3QgbGl0ZXJhbCwgc28gaWYgeW91IGRvXG5cdFx0XHQgKiB0aGlzOlxuXHRcdFx0ICpcblx0XHRcdCAqIGBgYGpzXG5cdFx0XHQgKiBQcmlzbS5sYW5ndWFnZXMubWFya3VwLnN0eWxlID0ge1xuXHRcdFx0ICogICAgIC8vIHRva2VuXG5cdFx0XHQgKiB9O1xuXHRcdFx0ICogYGBgXG5cdFx0XHQgKlxuXHRcdFx0ICogdGhlbiB0aGUgYHN0eWxlYCB0b2tlbiB3aWxsIGJlIGFkZGVkIChhbmQgcHJvY2Vzc2VkKSBhdCB0aGUgZW5kLiBgaW5zZXJ0QmVmb3JlYCBhbGxvd3MgeW91IHRvIGluc2VydCB0b2tlbnNcblx0XHRcdCAqIGJlZm9yZSBleGlzdGluZyB0b2tlbnMuIEZvciB0aGUgQ1NTIGV4YW1wbGUgYWJvdmUsIHlvdSB3b3VsZCB1c2UgaXQgbGlrZSB0aGlzOlxuXHRcdFx0ICpcblx0XHRcdCAqIGBgYGpzXG5cdFx0XHQgKiBQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdtYXJrdXAnLCAnY2RhdGEnLCB7XG5cdFx0XHQgKiAgICAgJ3N0eWxlJzoge1xuXHRcdFx0ICogICAgICAgICAvLyB0b2tlblxuXHRcdFx0ICogICAgIH1cblx0XHRcdCAqIH0pO1xuXHRcdFx0ICogYGBgXG5cdFx0XHQgKlxuXHRcdFx0ICogIyMgU3BlY2lhbCBjYXNlc1xuXHRcdFx0ICpcblx0XHRcdCAqIElmIHRoZSBncmFtbWFycyBvZiBgaW5zaWRlYCBhbmQgYGluc2VydGAgaGF2ZSB0b2tlbnMgd2l0aCB0aGUgc2FtZSBuYW1lLCB0aGUgdG9rZW5zIGluIGBpbnNpZGVgJ3MgZ3JhbW1hclxuXHRcdFx0ICogd2lsbCBiZSBpZ25vcmVkLlxuXHRcdFx0ICpcblx0XHRcdCAqIFRoaXMgYmVoYXZpb3IgY2FuIGJlIHVzZWQgdG8gaW5zZXJ0IHRva2VucyBhZnRlciBgYmVmb3JlYDpcblx0XHRcdCAqXG5cdFx0XHQgKiBgYGBqc1xuXHRcdFx0ICogUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnbWFya3VwJywgJ2NvbW1lbnQnLCB7XG5cdFx0XHQgKiAgICAgJ2NvbW1lbnQnOiBQcmlzbS5sYW5ndWFnZXMubWFya3VwLmNvbW1lbnQsXG5cdFx0XHQgKiAgICAgLy8gdG9rZW5zIGFmdGVyICdjb21tZW50J1xuXHRcdFx0ICogfSk7XG5cdFx0XHQgKiBgYGBcblx0XHRcdCAqXG5cdFx0XHQgKiAjIyBMaW1pdGF0aW9uc1xuXHRcdFx0ICpcblx0XHRcdCAqIFRoZSBtYWluIHByb2JsZW0gYGluc2VydEJlZm9yZWAgaGFzIHRvIHNvbHZlIGlzIGl0ZXJhdGlvbiBvcmRlci4gU2luY2UgRVMyMDE1LCB0aGUgaXRlcmF0aW9uIG9yZGVyIGZvciBvYmplY3Rcblx0XHRcdCAqIHByb3BlcnRpZXMgaXMgZ3VhcmFudGVlZCB0byBiZSB0aGUgaW5zZXJ0aW9uIG9yZGVyIChleGNlcHQgZm9yIGludGVnZXIga2V5cykgYnV0IHNvbWUgYnJvd3NlcnMgYmVoYXZlXG5cdFx0XHQgKiBkaWZmZXJlbnRseSB3aGVuIGtleXMgYXJlIGRlbGV0ZWQgYW5kIHJlLWluc2VydGVkLiBTbyBgaW5zZXJ0QmVmb3JlYCBjYW4ndCBiZSBpbXBsZW1lbnRlZCBieSB0ZW1wb3JhcmlseVxuXHRcdFx0ICogZGVsZXRpbmcgcHJvcGVydGllcyB3aGljaCBpcyBuZWNlc3NhcnkgdG8gaW5zZXJ0IGF0IGFyYml0cmFyeSBwb3NpdGlvbnMuXG5cdFx0XHQgKlxuXHRcdFx0ICogVG8gc29sdmUgdGhpcyBwcm9ibGVtLCBgaW5zZXJ0QmVmb3JlYCBkb2Vzbid0IGFjdHVhbGx5IGluc2VydCB0aGUgZ2l2ZW4gdG9rZW5zIGludG8gdGhlIHRhcmdldCBvYmplY3QuXG5cdFx0XHQgKiBJbnN0ZWFkLCBpdCB3aWxsIGNyZWF0ZSBhIG5ldyBvYmplY3QgYW5kIHJlcGxhY2UgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHRhcmdldCBvYmplY3Qgd2l0aCB0aGUgbmV3IG9uZS4gVGhpc1xuXHRcdFx0ICogY2FuIGJlIGRvbmUgd2l0aG91dCB0ZW1wb3JhcmlseSBkZWxldGluZyBwcm9wZXJ0aWVzLCBzbyB0aGUgaXRlcmF0aW9uIG9yZGVyIGlzIHdlbGwtZGVmaW5lZC5cblx0XHRcdCAqXG5cdFx0XHQgKiBIb3dldmVyLCBvbmx5IHJlZmVyZW5jZXMgdGhhdCBjYW4gYmUgcmVhY2hlZCBmcm9tIGBQcmlzbS5sYW5ndWFnZXNgIG9yIGBpbnNlcnRgIHdpbGwgYmUgcmVwbGFjZWQuIEkuZS4gaWZcblx0XHRcdCAqIHlvdSBob2xkIHRoZSB0YXJnZXQgb2JqZWN0IGluIGEgdmFyaWFibGUsIHRoZW4gdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSB3aWxsIG5vdCBjaGFuZ2UuXG5cdFx0XHQgKlxuXHRcdFx0ICogYGBganNcblx0XHRcdCAqIHZhciBvbGRNYXJrdXAgPSBQcmlzbS5sYW5ndWFnZXMubWFya3VwO1xuXHRcdFx0ICogdmFyIG5ld01hcmt1cCA9IFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ21hcmt1cCcsICdjb21tZW50JywgeyAuLi4gfSk7XG5cdFx0XHQgKlxuXHRcdFx0ICogYXNzZXJ0KG9sZE1hcmt1cCAhPT0gUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cCk7XG5cdFx0XHQgKiBhc3NlcnQobmV3TWFya3VwID09PSBQcmlzbS5sYW5ndWFnZXMubWFya3VwKTtcblx0XHRcdCAqIGBgYFxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBpbnNpZGUgVGhlIHByb3BlcnR5IG9mIGByb290YCAoZS5nLiBhIGxhbmd1YWdlIGlkIGluIGBQcmlzbS5sYW5ndWFnZXNgKSB0aGF0IGNvbnRhaW5zIHRoZVxuXHRcdFx0ICogb2JqZWN0IHRvIGJlIG1vZGlmaWVkLlxuXHRcdFx0ICogQHBhcmFtIHtzdHJpbmd9IGJlZm9yZSBUaGUga2V5IHRvIGluc2VydCBiZWZvcmUuXG5cdFx0XHQgKiBAcGFyYW0ge0dyYW1tYXJ9IGluc2VydCBBbiBvYmplY3QgY29udGFpbmluZyB0aGUga2V5LXZhbHVlIHBhaXJzIHRvIGJlIGluc2VydGVkLlxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBbcm9vdF0gVGhlIG9iamVjdCBjb250YWluaW5nIGBpbnNpZGVgLCBpLmUuIHRoZSBvYmplY3QgdGhhdCBjb250YWlucyB0aGVcblx0XHRcdCAqIG9iamVjdCB0byBiZSBtb2RpZmllZC5cblx0XHRcdCAqXG5cdFx0XHQgKiBEZWZhdWx0cyB0byBgUHJpc20ubGFuZ3VhZ2VzYC5cblx0XHRcdCAqIEByZXR1cm5zIHtHcmFtbWFyfSBUaGUgbmV3IGdyYW1tYXIgb2JqZWN0LlxuXHRcdFx0ICogQHB1YmxpY1xuXHRcdFx0ICovXG5cdFx0XHRpbnNlcnRCZWZvcmU6IGZ1bmN0aW9uIChpbnNpZGUsIGJlZm9yZSwgaW5zZXJ0LCByb290KSB7XG5cdFx0XHRcdHJvb3QgPSByb290IHx8IC8qKiBAdHlwZSB7YW55fSAqLyAoXy5sYW5ndWFnZXMpO1xuXHRcdFx0XHR2YXIgZ3JhbW1hciA9IHJvb3RbaW5zaWRlXTtcblx0XHRcdFx0LyoqIEB0eXBlIHtHcmFtbWFyfSAqL1xuXHRcdFx0XHR2YXIgcmV0ID0ge307XG5cblx0XHRcdFx0Zm9yICh2YXIgdG9rZW4gaW4gZ3JhbW1hcikge1xuXHRcdFx0XHRcdGlmIChncmFtbWFyLmhhc093blByb3BlcnR5KHRva2VuKSkge1xuXG5cdFx0XHRcdFx0XHRpZiAodG9rZW4gPT0gYmVmb3JlKSB7XG5cdFx0XHRcdFx0XHRcdGZvciAodmFyIG5ld1Rva2VuIGluIGluc2VydCkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChpbnNlcnQuaGFzT3duUHJvcGVydHkobmV3VG9rZW4pKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXRbbmV3VG9rZW5dID0gaW5zZXJ0W25ld1Rva2VuXTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gRG8gbm90IGluc2VydCB0b2tlbiB3aGljaCBhbHNvIG9jY3VyIGluIGluc2VydC4gU2VlICMxNTI1XG5cdFx0XHRcdFx0XHRpZiAoIWluc2VydC5oYXNPd25Qcm9wZXJ0eSh0b2tlbikpIHtcblx0XHRcdFx0XHRcdFx0cmV0W3Rva2VuXSA9IGdyYW1tYXJbdG9rZW5dO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBvbGQgPSByb290W2luc2lkZV07XG5cdFx0XHRcdHJvb3RbaW5zaWRlXSA9IHJldDtcblxuXHRcdFx0XHQvLyBVcGRhdGUgcmVmZXJlbmNlcyBpbiBvdGhlciBsYW5ndWFnZSBkZWZpbml0aW9uc1xuXHRcdFx0XHRfLmxhbmd1YWdlcy5ERlMoXy5sYW5ndWFnZXMsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG5cdFx0XHRcdFx0aWYgKHZhbHVlID09PSBvbGQgJiYga2V5ICE9IGluc2lkZSkge1xuXHRcdFx0XHRcdFx0dGhpc1trZXldID0gcmV0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIFRyYXZlcnNlIGEgbGFuZ3VhZ2UgZGVmaW5pdGlvbiB3aXRoIERlcHRoIEZpcnN0IFNlYXJjaFxuXHRcdFx0REZTOiBmdW5jdGlvbiBERlMobywgY2FsbGJhY2ssIHR5cGUsIHZpc2l0ZWQpIHtcblx0XHRcdFx0dmlzaXRlZCA9IHZpc2l0ZWQgfHwge307XG5cblx0XHRcdFx0dmFyIG9iaklkID0gXy51dGlsLm9iaklkO1xuXG5cdFx0XHRcdGZvciAodmFyIGkgaW4gbykge1xuXHRcdFx0XHRcdGlmIChvLmhhc093blByb3BlcnR5KGkpKSB7XG5cdFx0XHRcdFx0XHRjYWxsYmFjay5jYWxsKG8sIGksIG9baV0sIHR5cGUgfHwgaSk7XG5cblx0XHRcdFx0XHRcdHZhciBwcm9wZXJ0eSA9IG9baV07XG5cdFx0XHRcdFx0XHR2YXIgcHJvcGVydHlUeXBlID0gXy51dGlsLnR5cGUocHJvcGVydHkpO1xuXG5cdFx0XHRcdFx0XHRpZiAocHJvcGVydHlUeXBlID09PSAnT2JqZWN0JyAmJiAhdmlzaXRlZFtvYmpJZChwcm9wZXJ0eSldKSB7XG5cdFx0XHRcdFx0XHRcdHZpc2l0ZWRbb2JqSWQocHJvcGVydHkpXSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdERGUyhwcm9wZXJ0eSwgY2FsbGJhY2ssIG51bGwsIHZpc2l0ZWQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChwcm9wZXJ0eVR5cGUgPT09ICdBcnJheScgJiYgIXZpc2l0ZWRbb2JqSWQocHJvcGVydHkpXSkge1xuXHRcdFx0XHRcdFx0XHR2aXNpdGVkW29iaklkKHByb3BlcnR5KV0gPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRERlMocHJvcGVydHksIGNhbGxiYWNrLCBpLCB2aXNpdGVkKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0cGx1Z2luczoge30sXG5cblx0XHQvKipcblx0XHQgKiBUaGlzIGlzIHRoZSBtb3N0IGhpZ2gtbGV2ZWwgZnVuY3Rpb24gaW4gUHJpc21cdTIwMTlzIEFQSS5cblx0XHQgKiBJdCBmZXRjaGVzIGFsbCB0aGUgZWxlbWVudHMgdGhhdCBoYXZlIGEgYC5sYW5ndWFnZS14eHh4YCBjbGFzcyBhbmQgdGhlbiBjYWxscyB7QGxpbmsgUHJpc20uaGlnaGxpZ2h0RWxlbWVudH0gb25cblx0XHQgKiBlYWNoIG9uZSBvZiB0aGVtLlxuXHRcdCAqXG5cdFx0ICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBQcmlzbS5oaWdobGlnaHRBbGxVbmRlcihkb2N1bWVudCwgYXN5bmMsIGNhbGxiYWNrKWAuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IFthc3luYz1mYWxzZV0gU2FtZSBhcyBpbiB7QGxpbmsgUHJpc20uaGlnaGxpZ2h0QWxsVW5kZXJ9LlxuXHRcdCAqIEBwYXJhbSB7SGlnaGxpZ2h0Q2FsbGJhY2t9IFtjYWxsYmFja10gU2FtZSBhcyBpbiB7QGxpbmsgUHJpc20uaGlnaGxpZ2h0QWxsVW5kZXJ9LlxuXHRcdCAqIEBtZW1iZXJvZiBQcmlzbVxuXHRcdCAqIEBwdWJsaWNcblx0XHQgKi9cblx0XHRoaWdobGlnaHRBbGw6IGZ1bmN0aW9uIChhc3luYywgY2FsbGJhY2spIHtcblx0XHRcdF8uaGlnaGxpZ2h0QWxsVW5kZXIoZG9jdW1lbnQsIGFzeW5jLCBjYWxsYmFjayk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEZldGNoZXMgYWxsIHRoZSBkZXNjZW5kYW50cyBvZiBgY29udGFpbmVyYCB0aGF0IGhhdmUgYSBgLmxhbmd1YWdlLXh4eHhgIGNsYXNzIGFuZCB0aGVuIGNhbGxzXG5cdFx0ICoge0BsaW5rIFByaXNtLmhpZ2hsaWdodEVsZW1lbnR9IG9uIGVhY2ggb25lIG9mIHRoZW0uXG5cdFx0ICpcblx0XHQgKiBUaGUgZm9sbG93aW5nIGhvb2tzIHdpbGwgYmUgcnVuOlxuXHRcdCAqIDEuIGBiZWZvcmUtaGlnaGxpZ2h0YWxsYFxuXHRcdCAqIDIuIGBiZWZvcmUtYWxsLWVsZW1lbnRzLWhpZ2hsaWdodGBcblx0XHQgKiAzLiBBbGwgaG9va3Mgb2Yge0BsaW5rIFByaXNtLmhpZ2hsaWdodEVsZW1lbnR9IGZvciBlYWNoIGVsZW1lbnQuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGNvbnRhaW5lciBUaGUgcm9vdCBlbGVtZW50LCB3aG9zZSBkZXNjZW5kYW50cyB0aGF0IGhhdmUgYSBgLmxhbmd1YWdlLXh4eHhgIGNsYXNzIHdpbGwgYmUgaGlnaGxpZ2h0ZWQuXG5cdFx0ICogQHBhcmFtIHtib29sZWFufSBbYXN5bmM9ZmFsc2VdIFdoZXRoZXIgZWFjaCBlbGVtZW50IGlzIHRvIGJlIGhpZ2hsaWdodGVkIGFzeW5jaHJvbm91c2x5IHVzaW5nIFdlYiBXb3JrZXJzLlxuXHRcdCAqIEBwYXJhbSB7SGlnaGxpZ2h0Q2FsbGJhY2t9IFtjYWxsYmFja10gQW4gb3B0aW9uYWwgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBvbiBlYWNoIGVsZW1lbnQgYWZ0ZXIgaXRzIGhpZ2hsaWdodGluZyBpcyBkb25lLlxuXHRcdCAqIEBtZW1iZXJvZiBQcmlzbVxuXHRcdCAqIEBwdWJsaWNcblx0XHQgKi9cblx0XHRoaWdobGlnaHRBbGxVbmRlcjogZnVuY3Rpb24gKGNvbnRhaW5lciwgYXN5bmMsIGNhbGxiYWNrKSB7XG5cdFx0XHR2YXIgZW52ID0ge1xuXHRcdFx0XHRjYWxsYmFjazogY2FsbGJhY2ssXG5cdFx0XHRcdGNvbnRhaW5lcjogY29udGFpbmVyLFxuXHRcdFx0XHRzZWxlY3RvcjogJ2NvZGVbY2xhc3MqPVwibGFuZ3VhZ2UtXCJdLCBbY2xhc3MqPVwibGFuZ3VhZ2UtXCJdIGNvZGUsIGNvZGVbY2xhc3MqPVwibGFuZy1cIl0sIFtjbGFzcyo9XCJsYW5nLVwiXSBjb2RlJ1xuXHRcdFx0fTtcblxuXHRcdFx0Xy5ob29rcy5ydW4oJ2JlZm9yZS1oaWdobGlnaHRhbGwnLCBlbnYpO1xuXG5cdFx0XHRlbnYuZWxlbWVudHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoZW52LmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKGVudi5zZWxlY3RvcikpO1xuXG5cdFx0XHRfLmhvb2tzLnJ1bignYmVmb3JlLWFsbC1lbGVtZW50cy1oaWdobGlnaHQnLCBlbnYpO1xuXG5cdFx0XHRmb3IgKHZhciBpID0gMCwgZWxlbWVudDsgKGVsZW1lbnQgPSBlbnYuZWxlbWVudHNbaSsrXSk7KSB7XG5cdFx0XHRcdF8uaGlnaGxpZ2h0RWxlbWVudChlbGVtZW50LCBhc3luYyA9PT0gdHJ1ZSwgZW52LmNhbGxiYWNrKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogSGlnaGxpZ2h0cyB0aGUgY29kZSBpbnNpZGUgYSBzaW5nbGUgZWxlbWVudC5cblx0XHQgKlxuXHRcdCAqIFRoZSBmb2xsb3dpbmcgaG9va3Mgd2lsbCBiZSBydW46XG5cdFx0ICogMS4gYGJlZm9yZS1zYW5pdHktY2hlY2tgXG5cdFx0ICogMi4gYGJlZm9yZS1oaWdobGlnaHRgXG5cdFx0ICogMy4gQWxsIGhvb2tzIG9mIHtAbGluayBQcmlzbS5oaWdobGlnaHR9LiBUaGVzZSBob29rcyB3aWxsIGJlIHJ1biBieSBhbiBhc3luY2hyb25vdXMgd29ya2VyIGlmIGBhc3luY2AgaXMgYHRydWVgLlxuXHRcdCAqIDQuIGBiZWZvcmUtaW5zZXJ0YFxuXHRcdCAqIDUuIGBhZnRlci1oaWdobGlnaHRgXG5cdFx0ICogNi4gYGNvbXBsZXRlYFxuXHRcdCAqXG5cdFx0ICogU29tZSB0aGUgYWJvdmUgaG9va3Mgd2lsbCBiZSBza2lwcGVkIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgY29udGFpbiBhbnkgdGV4dCBvciB0aGVyZSBpcyBubyBncmFtbWFyIGxvYWRlZCBmb3Jcblx0XHQgKiB0aGUgZWxlbWVudCdzIGxhbmd1YWdlLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIGNvZGUuXG5cdFx0ICogSXQgbXVzdCBoYXZlIGEgY2xhc3Mgb2YgYGxhbmd1YWdlLXh4eHhgIHRvIGJlIHByb2Nlc3NlZCwgd2hlcmUgYHh4eHhgIGlzIGEgdmFsaWQgbGFuZ3VhZ2UgaWRlbnRpZmllci5cblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IFthc3luYz1mYWxzZV0gV2hldGhlciB0aGUgZWxlbWVudCBpcyB0byBiZSBoaWdobGlnaHRlZCBhc3luY2hyb25vdXNseSB1c2luZyBXZWIgV29ya2Vyc1xuXHRcdCAqIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgYW5kIGF2b2lkIGJsb2NraW5nIHRoZSBVSSB3aGVuIGhpZ2hsaWdodGluZyB2ZXJ5IGxhcmdlIGNodW5rcyBvZiBjb2RlLiBUaGlzIG9wdGlvbiBpc1xuXHRcdCAqIFtkaXNhYmxlZCBieSBkZWZhdWx0XShodHRwczovL3ByaXNtanMuY29tL2ZhcS5odG1sI3doeS1pcy1hc3luY2hyb25vdXMtaGlnaGxpZ2h0aW5nLWRpc2FibGVkLWJ5LWRlZmF1bHQpLlxuXHRcdCAqXG5cdFx0ICogTm90ZTogQWxsIGxhbmd1YWdlIGRlZmluaXRpb25zIHJlcXVpcmVkIHRvIGhpZ2hsaWdodCB0aGUgY29kZSBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBtYWluIGBwcmlzbS5qc2AgZmlsZSBmb3Jcblx0XHQgKiBhc3luY2hyb25vdXMgaGlnaGxpZ2h0aW5nIHRvIHdvcmsuIFlvdSBjYW4gYnVpbGQgeW91ciBvd24gYnVuZGxlIG9uIHRoZVxuXHRcdCAqIFtEb3dubG9hZCBwYWdlXShodHRwczovL3ByaXNtanMuY29tL2Rvd25sb2FkLmh0bWwpLlxuXHRcdCAqIEBwYXJhbSB7SGlnaGxpZ2h0Q2FsbGJhY2t9IFtjYWxsYmFja10gQW4gb3B0aW9uYWwgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBhZnRlciB0aGUgaGlnaGxpZ2h0aW5nIGlzIGRvbmUuXG5cdFx0ICogTW9zdGx5IHVzZWZ1bCB3aGVuIGBhc3luY2AgaXMgYHRydWVgLCBzaW5jZSBpbiB0aGF0IGNhc2UsIHRoZSBoaWdobGlnaHRpbmcgaXMgZG9uZSBhc3luY2hyb25vdXNseS5cblx0XHQgKiBAbWVtYmVyb2YgUHJpc21cblx0XHQgKiBAcHVibGljXG5cdFx0ICovXG5cdFx0aGlnaGxpZ2h0RWxlbWVudDogZnVuY3Rpb24gKGVsZW1lbnQsIGFzeW5jLCBjYWxsYmFjaykge1xuXHRcdFx0Ly8gRmluZCBsYW5ndWFnZVxuXHRcdFx0dmFyIGxhbmd1YWdlID0gXy51dGlsLmdldExhbmd1YWdlKGVsZW1lbnQpO1xuXHRcdFx0dmFyIGdyYW1tYXIgPSBfLmxhbmd1YWdlc1tsYW5ndWFnZV07XG5cblx0XHRcdC8vIFNldCBsYW5ndWFnZSBvbiB0aGUgZWxlbWVudCwgaWYgbm90IHByZXNlbnRcblx0XHRcdF8udXRpbC5zZXRMYW5ndWFnZShlbGVtZW50LCBsYW5ndWFnZSk7XG5cblx0XHRcdC8vIFNldCBsYW5ndWFnZSBvbiB0aGUgcGFyZW50LCBmb3Igc3R5bGluZ1xuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcblx0XHRcdGlmIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdwcmUnKSB7XG5cdFx0XHRcdF8udXRpbC5zZXRMYW5ndWFnZShwYXJlbnQsIGxhbmd1YWdlKTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGNvZGUgPSBlbGVtZW50LnRleHRDb250ZW50O1xuXG5cdFx0XHR2YXIgZW52ID0ge1xuXHRcdFx0XHRlbGVtZW50OiBlbGVtZW50LFxuXHRcdFx0XHRsYW5ndWFnZTogbGFuZ3VhZ2UsXG5cdFx0XHRcdGdyYW1tYXI6IGdyYW1tYXIsXG5cdFx0XHRcdGNvZGU6IGNvZGVcblx0XHRcdH07XG5cblx0XHRcdGZ1bmN0aW9uIGluc2VydEhpZ2hsaWdodGVkQ29kZShoaWdobGlnaHRlZENvZGUpIHtcblx0XHRcdFx0ZW52LmhpZ2hsaWdodGVkQ29kZSA9IGhpZ2hsaWdodGVkQ29kZTtcblxuXHRcdFx0XHRfLmhvb2tzLnJ1bignYmVmb3JlLWluc2VydCcsIGVudik7XG5cblx0XHRcdFx0ZW52LmVsZW1lbnQuaW5uZXJIVE1MID0gZW52LmhpZ2hsaWdodGVkQ29kZTtcblxuXHRcdFx0XHRfLmhvb2tzLnJ1bignYWZ0ZXItaGlnaGxpZ2h0JywgZW52KTtcblx0XHRcdFx0Xy5ob29rcy5ydW4oJ2NvbXBsZXRlJywgZW52KTtcblx0XHRcdFx0Y2FsbGJhY2sgJiYgY2FsbGJhY2suY2FsbChlbnYuZWxlbWVudCk7XG5cdFx0XHR9XG5cblx0XHRcdF8uaG9va3MucnVuKCdiZWZvcmUtc2FuaXR5LWNoZWNrJywgZW52KTtcblxuXHRcdFx0Ly8gcGx1Z2lucyBtYXkgY2hhbmdlL2FkZCB0aGUgcGFyZW50L2VsZW1lbnRcblx0XHRcdHBhcmVudCA9IGVudi5lbGVtZW50LnBhcmVudEVsZW1lbnQ7XG5cdFx0XHRpZiAocGFyZW50ICYmIHBhcmVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAncHJlJyAmJiAhcGFyZW50Lmhhc0F0dHJpYnV0ZSgndGFiaW5kZXgnKSkge1xuXHRcdFx0XHRwYXJlbnQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghZW52LmNvZGUpIHtcblx0XHRcdFx0Xy5ob29rcy5ydW4oJ2NvbXBsZXRlJywgZW52KTtcblx0XHRcdFx0Y2FsbGJhY2sgJiYgY2FsbGJhY2suY2FsbChlbnYuZWxlbWVudCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Xy5ob29rcy5ydW4oJ2JlZm9yZS1oaWdobGlnaHQnLCBlbnYpO1xuXG5cdFx0XHRpZiAoIWVudi5ncmFtbWFyKSB7XG5cdFx0XHRcdGluc2VydEhpZ2hsaWdodGVkQ29kZShfLnV0aWwuZW5jb2RlKGVudi5jb2RlKSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGFzeW5jICYmIF9zZWxmLldvcmtlcikge1xuXHRcdFx0XHR2YXIgd29ya2VyID0gbmV3IFdvcmtlcihfLmZpbGVuYW1lKTtcblxuXHRcdFx0XHR3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24gKGV2dCkge1xuXHRcdFx0XHRcdGluc2VydEhpZ2hsaWdodGVkQ29kZShldnQuZGF0YSk7XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0d29ya2VyLnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KHtcblx0XHRcdFx0XHRsYW5ndWFnZTogZW52Lmxhbmd1YWdlLFxuXHRcdFx0XHRcdGNvZGU6IGVudi5jb2RlLFxuXHRcdFx0XHRcdGltbWVkaWF0ZUNsb3NlOiB0cnVlXG5cdFx0XHRcdH0pKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGluc2VydEhpZ2hsaWdodGVkQ29kZShfLmhpZ2hsaWdodChlbnYuY29kZSwgZW52LmdyYW1tYXIsIGVudi5sYW5ndWFnZSkpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBMb3ctbGV2ZWwgZnVuY3Rpb24sIG9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91XHUyMDE5cmUgZG9pbmcuIEl0IGFjY2VwdHMgYSBzdHJpbmcgb2YgdGV4dCBhcyBpbnB1dFxuXHRcdCAqIGFuZCB0aGUgbGFuZ3VhZ2UgZGVmaW5pdGlvbnMgdG8gdXNlLCBhbmQgcmV0dXJucyBhIHN0cmluZyB3aXRoIHRoZSBIVE1MIHByb2R1Y2VkLlxuXHRcdCAqXG5cdFx0ICogVGhlIGZvbGxvd2luZyBob29rcyB3aWxsIGJlIHJ1bjpcblx0XHQgKiAxLiBgYmVmb3JlLXRva2VuaXplYFxuXHRcdCAqIDIuIGBhZnRlci10b2tlbml6ZWBcblx0XHQgKiAzLiBgd3JhcGA6IE9uIGVhY2gge0BsaW5rIFRva2VufS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IEEgc3RyaW5nIHdpdGggdGhlIGNvZGUgdG8gYmUgaGlnaGxpZ2h0ZWQuXG5cdFx0ICogQHBhcmFtIHtHcmFtbWFyfSBncmFtbWFyIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSB0b2tlbnMgdG8gdXNlLlxuXHRcdCAqXG5cdFx0ICogVXN1YWxseSBhIGxhbmd1YWdlIGRlZmluaXRpb24gbGlrZSBgUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cGAuXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlIFRoZSBuYW1lIG9mIHRoZSBsYW5ndWFnZSBkZWZpbml0aW9uIHBhc3NlZCB0byBgZ3JhbW1hcmAuXG5cdFx0ICogQHJldHVybnMge3N0cmluZ30gVGhlIGhpZ2hsaWdodGVkIEhUTUwuXG5cdFx0ICogQG1lbWJlcm9mIFByaXNtXG5cdFx0ICogQHB1YmxpY1xuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogUHJpc20uaGlnaGxpZ2h0KCd2YXIgZm9vID0gdHJ1ZTsnLCBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdCwgJ2phdmFzY3JpcHQnKTtcblx0XHQgKi9cblx0XHRoaWdobGlnaHQ6IGZ1bmN0aW9uICh0ZXh0LCBncmFtbWFyLCBsYW5ndWFnZSkge1xuXHRcdFx0dmFyIGVudiA9IHtcblx0XHRcdFx0Y29kZTogdGV4dCxcblx0XHRcdFx0Z3JhbW1hcjogZ3JhbW1hcixcblx0XHRcdFx0bGFuZ3VhZ2U6IGxhbmd1YWdlXG5cdFx0XHR9O1xuXHRcdFx0Xy5ob29rcy5ydW4oJ2JlZm9yZS10b2tlbml6ZScsIGVudik7XG5cdFx0XHRpZiAoIWVudi5ncmFtbWFyKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignVGhlIGxhbmd1YWdlIFwiJyArIGVudi5sYW5ndWFnZSArICdcIiBoYXMgbm8gZ3JhbW1hci4nKTtcblx0XHRcdH1cblx0XHRcdGVudi50b2tlbnMgPSBfLnRva2VuaXplKGVudi5jb2RlLCBlbnYuZ3JhbW1hcik7XG5cdFx0XHRfLmhvb2tzLnJ1bignYWZ0ZXItdG9rZW5pemUnLCBlbnYpO1xuXHRcdFx0cmV0dXJuIFRva2VuLnN0cmluZ2lmeShfLnV0aWwuZW5jb2RlKGVudi50b2tlbnMpLCBlbnYubGFuZ3VhZ2UpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBUaGlzIGlzIHRoZSBoZWFydCBvZiBQcmlzbSwgYW5kIHRoZSBtb3N0IGxvdy1sZXZlbCBmdW5jdGlvbiB5b3UgY2FuIHVzZS4gSXQgYWNjZXB0cyBhIHN0cmluZyBvZiB0ZXh0IGFzIGlucHV0XG5cdFx0ICogYW5kIHRoZSBsYW5ndWFnZSBkZWZpbml0aW9ucyB0byB1c2UsIGFuZCByZXR1cm5zIGFuIGFycmF5IHdpdGggdGhlIHRva2VuaXplZCBjb2RlLlxuXHRcdCAqXG5cdFx0ICogV2hlbiB0aGUgbGFuZ3VhZ2UgZGVmaW5pdGlvbiBpbmNsdWRlcyBuZXN0ZWQgdG9rZW5zLCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIHJlY3Vyc2l2ZWx5IG9uIGVhY2ggb2YgdGhlc2UgdG9rZW5zLlxuXHRcdCAqXG5cdFx0ICogVGhpcyBtZXRob2QgY291bGQgYmUgdXNlZnVsIGluIG90aGVyIGNvbnRleHRzIGFzIHdlbGwsIGFzIGEgdmVyeSBjcnVkZSBwYXJzZXIuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBBIHN0cmluZyB3aXRoIHRoZSBjb2RlIHRvIGJlIGhpZ2hsaWdodGVkLlxuXHRcdCAqIEBwYXJhbSB7R3JhbW1hcn0gZ3JhbW1hciBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgdG9rZW5zIHRvIHVzZS5cblx0XHQgKlxuXHRcdCAqIFVzdWFsbHkgYSBsYW5ndWFnZSBkZWZpbml0aW9uIGxpa2UgYFByaXNtLmxhbmd1YWdlcy5tYXJrdXBgLlxuXHRcdCAqIEByZXR1cm5zIHtUb2tlblN0cmVhbX0gQW4gYXJyYXkgb2Ygc3RyaW5ncyBhbmQgdG9rZW5zLCBhIHRva2VuIHN0cmVhbS5cblx0XHQgKiBAbWVtYmVyb2YgUHJpc21cblx0XHQgKiBAcHVibGljXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiBsZXQgY29kZSA9IGB2YXIgZm9vID0gMDtgO1xuXHRcdCAqIGxldCB0b2tlbnMgPSBQcmlzbS50b2tlbml6ZShjb2RlLCBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdCk7XG5cdFx0ICogdG9rZW5zLmZvckVhY2godG9rZW4gPT4ge1xuXHRcdCAqICAgICBpZiAodG9rZW4gaW5zdGFuY2VvZiBQcmlzbS5Ub2tlbiAmJiB0b2tlbi50eXBlID09PSAnbnVtYmVyJykge1xuXHRcdCAqICAgICAgICAgY29uc29sZS5sb2coYEZvdW5kIG51bWVyaWMgbGl0ZXJhbDogJHt0b2tlbi5jb250ZW50fWApO1xuXHRcdCAqICAgICB9XG5cdFx0ICogfSk7XG5cdFx0ICovXG5cdFx0dG9rZW5pemU6IGZ1bmN0aW9uICh0ZXh0LCBncmFtbWFyKSB7XG5cdFx0XHR2YXIgcmVzdCA9IGdyYW1tYXIucmVzdDtcblx0XHRcdGlmIChyZXN0KSB7XG5cdFx0XHRcdGZvciAodmFyIHRva2VuIGluIHJlc3QpIHtcblx0XHRcdFx0XHRncmFtbWFyW3Rva2VuXSA9IHJlc3RbdG9rZW5dO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGVsZXRlIGdyYW1tYXIucmVzdDtcblx0XHRcdH1cblxuXHRcdFx0dmFyIHRva2VuTGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7XG5cdFx0XHRhZGRBZnRlcih0b2tlbkxpc3QsIHRva2VuTGlzdC5oZWFkLCB0ZXh0KTtcblxuXHRcdFx0bWF0Y2hHcmFtbWFyKHRleHQsIHRva2VuTGlzdCwgZ3JhbW1hciwgdG9rZW5MaXN0LmhlYWQsIDApO1xuXG5cdFx0XHRyZXR1cm4gdG9BcnJheSh0b2tlbkxpc3QpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAbmFtZXNwYWNlXG5cdFx0ICogQG1lbWJlcm9mIFByaXNtXG5cdFx0ICogQHB1YmxpY1xuXHRcdCAqL1xuXHRcdGhvb2tzOiB7XG5cdFx0XHRhbGw6IHt9LFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIEFkZHMgdGhlIGdpdmVuIGNhbGxiYWNrIHRvIHRoZSBsaXN0IG9mIGNhbGxiYWNrcyBmb3IgdGhlIGdpdmVuIGhvb2suXG5cdFx0XHQgKlxuXHRcdFx0ICogVGhlIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSBob29rIGl0IGlzIHJlZ2lzdGVyZWQgZm9yIGlzIHJ1bi5cblx0XHRcdCAqIEhvb2tzIGFyZSB1c3VhbGx5IGRpcmVjdGx5IHJ1biBieSBhIGhpZ2hsaWdodCBmdW5jdGlvbiBidXQgeW91IGNhbiBhbHNvIHJ1biBob29rcyB5b3Vyc2VsZi5cblx0XHRcdCAqXG5cdFx0XHQgKiBPbmUgY2FsbGJhY2sgZnVuY3Rpb24gY2FuIGJlIHJlZ2lzdGVyZWQgdG8gbXVsdGlwbGUgaG9va3MgYW5kIHRoZSBzYW1lIGhvb2sgbXVsdGlwbGUgdGltZXMuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGhvb2suXG5cdFx0XHQgKiBAcGFyYW0ge0hvb2tDYWxsYmFja30gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIGlzIGdpdmVuIGVudmlyb25tZW50IHZhcmlhYmxlcy5cblx0XHRcdCAqIEBwdWJsaWNcblx0XHRcdCAqL1xuXHRcdFx0YWRkOiBmdW5jdGlvbiAobmFtZSwgY2FsbGJhY2spIHtcblx0XHRcdFx0dmFyIGhvb2tzID0gXy5ob29rcy5hbGw7XG5cblx0XHRcdFx0aG9va3NbbmFtZV0gPSBob29rc1tuYW1lXSB8fCBbXTtcblxuXHRcdFx0XHRob29rc1tuYW1lXS5wdXNoKGNhbGxiYWNrKTtcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogUnVucyBhIGhvb2sgaW52b2tpbmcgYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGVudmlyb25tZW50IHZhcmlhYmxlcy5cblx0XHRcdCAqXG5cdFx0XHQgKiBDYWxsYmFja3Mgd2lsbCBiZSBpbnZva2VkIHN5bmNocm9ub3VzbHkgYW5kIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgcmVnaXN0ZXJlZC5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgaG9vay5cblx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gZW52IFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb2YgdGhlIGhvb2sgcGFzc2VkIHRvIGFsbCBjYWxsYmFja3MgcmVnaXN0ZXJlZC5cblx0XHRcdCAqIEBwdWJsaWNcblx0XHRcdCAqL1xuXHRcdFx0cnVuOiBmdW5jdGlvbiAobmFtZSwgZW52KSB7XG5cdFx0XHRcdHZhciBjYWxsYmFja3MgPSBfLmhvb2tzLmFsbFtuYW1lXTtcblxuXHRcdFx0XHRpZiAoIWNhbGxiYWNrcyB8fCAhY2FsbGJhY2tzLmxlbmd0aCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAodmFyIGkgPSAwLCBjYWxsYmFjazsgKGNhbGxiYWNrID0gY2FsbGJhY2tzW2krK10pOykge1xuXHRcdFx0XHRcdGNhbGxiYWNrKGVudik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0VG9rZW46IFRva2VuXG5cdH07XG5cdF9zZWxmLlByaXNtID0gXztcblxuXG5cdC8vIFR5cGVzY3JpcHQgbm90ZTpcblx0Ly8gVGhlIGZvbGxvd2luZyBjYW4gYmUgdXNlZCB0byBpbXBvcnQgdGhlIFRva2VuIHR5cGUgaW4gSlNEb2M6XG5cdC8vXG5cdC8vICAgQHR5cGVkZWYge0luc3RhbmNlVHlwZTxpbXBvcnQoXCIuL3ByaXNtLWNvcmVcIilbXCJUb2tlblwiXT59IFRva2VuXG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgdG9rZW4uXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFNlZSB7QGxpbmsgVG9rZW4jdHlwZSB0eXBlfVxuXHQgKiBAcGFyYW0ge3N0cmluZyB8IFRva2VuU3RyZWFtfSBjb250ZW50IFNlZSB7QGxpbmsgVG9rZW4jY29udGVudCBjb250ZW50fVxuXHQgKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gW2FsaWFzXSBUaGUgYWxpYXMoZXMpIG9mIHRoZSB0b2tlbi5cblx0ICogQHBhcmFtIHtzdHJpbmd9IFttYXRjaGVkU3RyPVwiXCJdIEEgY29weSBvZiB0aGUgZnVsbCBzdHJpbmcgdGhpcyB0b2tlbiB3YXMgY3JlYXRlZCBmcm9tLlxuXHQgKiBAY2xhc3Ncblx0ICogQGdsb2JhbFxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRmdW5jdGlvbiBUb2tlbih0eXBlLCBjb250ZW50LCBhbGlhcywgbWF0Y2hlZFN0cikge1xuXHRcdC8qKlxuXHRcdCAqIFRoZSB0eXBlIG9mIHRoZSB0b2tlbi5cblx0XHQgKlxuXHRcdCAqIFRoaXMgaXMgdXN1YWxseSB0aGUga2V5IG9mIGEgcGF0dGVybiBpbiBhIHtAbGluayBHcmFtbWFyfS5cblx0XHQgKlxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XG5cdFx0ICogQHNlZSBHcmFtbWFyVG9rZW5cblx0XHQgKiBAcHVibGljXG5cdFx0ICovXG5cdFx0dGhpcy50eXBlID0gdHlwZTtcblx0XHQvKipcblx0XHQgKiBUaGUgc3RyaW5ncyBvciB0b2tlbnMgY29udGFpbmVkIGJ5IHRoaXMgdG9rZW4uXG5cdFx0ICpcblx0XHQgKiBUaGlzIHdpbGwgYmUgYSB0b2tlbiBzdHJlYW0gaWYgdGhlIHBhdHRlcm4gbWF0Y2hlZCBhbHNvIGRlZmluZWQgYW4gYGluc2lkZWAgZ3JhbW1hci5cblx0XHQgKlxuXHRcdCAqIEB0eXBlIHtzdHJpbmcgfCBUb2tlblN0cmVhbX1cblx0XHQgKiBAcHVibGljXG5cdFx0ICovXG5cdFx0dGhpcy5jb250ZW50ID0gY29udGVudDtcblx0XHQvKipcblx0XHQgKiBUaGUgYWxpYXMoZXMpIG9mIHRoZSB0b2tlbi5cblx0XHQgKlxuXHRcdCAqIEB0eXBlIHtzdHJpbmd8c3RyaW5nW119XG5cdFx0ICogQHNlZSBHcmFtbWFyVG9rZW5cblx0XHQgKiBAcHVibGljXG5cdFx0ICovXG5cdFx0dGhpcy5hbGlhcyA9IGFsaWFzO1xuXHRcdC8vIENvcHkgb2YgdGhlIGZ1bGwgc3RyaW5nIHRoaXMgdG9rZW4gd2FzIGNyZWF0ZWQgZnJvbVxuXHRcdHRoaXMubGVuZ3RoID0gKG1hdGNoZWRTdHIgfHwgJycpLmxlbmd0aCB8IDA7XG5cdH1cblxuXHQvKipcblx0ICogQSB0b2tlbiBzdHJlYW0gaXMgYW4gYXJyYXkgb2Ygc3RyaW5ncyBhbmQge0BsaW5rIFRva2VuIFRva2VufSBvYmplY3RzLlxuXHQgKlxuXHQgKiBUb2tlbiBzdHJlYW1zIGhhdmUgdG8gZnVsZmlsbCBhIGZldyBwcm9wZXJ0aWVzIHRoYXQgYXJlIGFzc3VtZWQgYnkgbW9zdCBmdW5jdGlvbnMgKG1vc3RseSBpbnRlcm5hbCBvbmVzKSB0aGF0IHByb2Nlc3Ncblx0ICogdGhlbS5cblx0ICpcblx0ICogMS4gTm8gYWRqYWNlbnQgc3RyaW5ncy5cblx0ICogMi4gTm8gZW1wdHkgc3RyaW5ncy5cblx0ICpcblx0ICogICAgVGhlIG9ubHkgZXhjZXB0aW9uIGhlcmUgaXMgdGhlIHRva2VuIHN0cmVhbSB0aGF0IG9ubHkgY29udGFpbnMgdGhlIGVtcHR5IHN0cmluZyBhbmQgbm90aGluZyBlbHNlLlxuXHQgKlxuXHQgKiBAdHlwZWRlZiB7QXJyYXk8c3RyaW5nIHwgVG9rZW4+fSBUb2tlblN0cmVhbVxuXHQgKiBAZ2xvYmFsXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIHRoZSBnaXZlbiB0b2tlbiBvciB0b2tlbiBzdHJlYW0gdG8gYW4gSFRNTCByZXByZXNlbnRhdGlvbi5cblx0ICpcblx0ICogVGhlIGZvbGxvd2luZyBob29rcyB3aWxsIGJlIHJ1bjpcblx0ICogMS4gYHdyYXBgOiBPbiBlYWNoIHtAbGluayBUb2tlbn0uXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nIHwgVG9rZW4gfCBUb2tlblN0cmVhbX0gbyBUaGUgdG9rZW4gb3IgdG9rZW4gc3RyZWFtIHRvIGJlIGNvbnZlcnRlZC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlIFRoZSBuYW1lIG9mIGN1cnJlbnQgbGFuZ3VhZ2UuXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBIVE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0b2tlbiBvciB0b2tlbiBzdHJlYW0uXG5cdCAqIEBtZW1iZXJvZiBUb2tlblxuXHQgKiBAc3RhdGljXG5cdCAqL1xuXHRUb2tlbi5zdHJpbmdpZnkgPSBmdW5jdGlvbiBzdHJpbmdpZnkobywgbGFuZ3VhZ2UpIHtcblx0XHRpZiAodHlwZW9mIG8gPT0gJ3N0cmluZycpIHtcblx0XHRcdHJldHVybiBvO1xuXHRcdH1cblx0XHRpZiAoQXJyYXkuaXNBcnJheShvKSkge1xuXHRcdFx0dmFyIHMgPSAnJztcblx0XHRcdG8uZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRzICs9IHN0cmluZ2lmeShlLCBsYW5ndWFnZSk7XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBzO1xuXHRcdH1cblxuXHRcdHZhciBlbnYgPSB7XG5cdFx0XHR0eXBlOiBvLnR5cGUsXG5cdFx0XHRjb250ZW50OiBzdHJpbmdpZnkoby5jb250ZW50LCBsYW5ndWFnZSksXG5cdFx0XHR0YWc6ICdzcGFuJyxcblx0XHRcdGNsYXNzZXM6IFsndG9rZW4nLCBvLnR5cGVdLFxuXHRcdFx0YXR0cmlidXRlczoge30sXG5cdFx0XHRsYW5ndWFnZTogbGFuZ3VhZ2Vcblx0XHR9O1xuXG5cdFx0dmFyIGFsaWFzZXMgPSBvLmFsaWFzO1xuXHRcdGlmIChhbGlhc2VzKSB7XG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheShhbGlhc2VzKSkge1xuXHRcdFx0XHRBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShlbnYuY2xhc3NlcywgYWxpYXNlcyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbnYuY2xhc3Nlcy5wdXNoKGFsaWFzZXMpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdF8uaG9va3MucnVuKCd3cmFwJywgZW52KTtcblxuXHRcdHZhciBhdHRyaWJ1dGVzID0gJyc7XG5cdFx0Zm9yICh2YXIgbmFtZSBpbiBlbnYuYXR0cmlidXRlcykge1xuXHRcdFx0YXR0cmlidXRlcyArPSAnICcgKyBuYW1lICsgJz1cIicgKyAoZW52LmF0dHJpYnV0ZXNbbmFtZV0gfHwgJycpLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKSArICdcIic7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICc8JyArIGVudi50YWcgKyAnIGNsYXNzPVwiJyArIGVudi5jbGFzc2VzLmpvaW4oJyAnKSArICdcIicgKyBhdHRyaWJ1dGVzICsgJz4nICsgZW52LmNvbnRlbnQgKyAnPC8nICsgZW52LnRhZyArICc+Jztcblx0fTtcblxuXHQvKipcblx0ICogQHBhcmFtIHtSZWdFeHB9IHBhdHRlcm5cblx0ICogQHBhcmFtIHtudW1iZXJ9IHBvc1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGxvb2tiZWhpbmRcblx0ICogQHJldHVybnMge1JlZ0V4cEV4ZWNBcnJheSB8IG51bGx9XG5cdCAqL1xuXHRmdW5jdGlvbiBtYXRjaFBhdHRlcm4ocGF0dGVybiwgcG9zLCB0ZXh0LCBsb29rYmVoaW5kKSB7XG5cdFx0cGF0dGVybi5sYXN0SW5kZXggPSBwb3M7XG5cdFx0dmFyIG1hdGNoID0gcGF0dGVybi5leGVjKHRleHQpO1xuXHRcdGlmIChtYXRjaCAmJiBsb29rYmVoaW5kICYmIG1hdGNoWzFdKSB7XG5cdFx0XHQvLyBjaGFuZ2UgdGhlIG1hdGNoIHRvIHJlbW92ZSB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBQcmlzbSBsb29rYmVoaW5kIGdyb3VwXG5cdFx0XHR2YXIgbG9va2JlaGluZExlbmd0aCA9IG1hdGNoWzFdLmxlbmd0aDtcblx0XHRcdG1hdGNoLmluZGV4ICs9IGxvb2tiZWhpbmRMZW5ndGg7XG5cdFx0XHRtYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKGxvb2tiZWhpbmRMZW5ndGgpO1xuXHRcdH1cblx0XHRyZXR1cm4gbWF0Y2g7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHRcblx0ICogQHBhcmFtIHtMaW5rZWRMaXN0PHN0cmluZyB8IFRva2VuPn0gdG9rZW5MaXN0XG5cdCAqIEBwYXJhbSB7YW55fSBncmFtbWFyXG5cdCAqIEBwYXJhbSB7TGlua2VkTGlzdE5vZGU8c3RyaW5nIHwgVG9rZW4+fSBzdGFydE5vZGVcblx0ICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0UG9zXG5cdCAqIEBwYXJhbSB7UmVtYXRjaE9wdGlvbnN9IFtyZW1hdGNoXVxuXHQgKiBAcmV0dXJucyB7dm9pZH1cblx0ICogQHByaXZhdGVcblx0ICpcblx0ICogQHR5cGVkZWYgUmVtYXRjaE9wdGlvbnNcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGNhdXNlXG5cdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSByZWFjaFxuXHQgKi9cblx0ZnVuY3Rpb24gbWF0Y2hHcmFtbWFyKHRleHQsIHRva2VuTGlzdCwgZ3JhbW1hciwgc3RhcnROb2RlLCBzdGFydFBvcywgcmVtYXRjaCkge1xuXHRcdGZvciAodmFyIHRva2VuIGluIGdyYW1tYXIpIHtcblx0XHRcdGlmICghZ3JhbW1hci5oYXNPd25Qcm9wZXJ0eSh0b2tlbikgfHwgIWdyYW1tYXJbdG9rZW5dKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcGF0dGVybnMgPSBncmFtbWFyW3Rva2VuXTtcblx0XHRcdHBhdHRlcm5zID0gQXJyYXkuaXNBcnJheShwYXR0ZXJucykgPyBwYXR0ZXJucyA6IFtwYXR0ZXJuc107XG5cblx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgcGF0dGVybnMubGVuZ3RoOyArK2opIHtcblx0XHRcdFx0aWYgKHJlbWF0Y2ggJiYgcmVtYXRjaC5jYXVzZSA9PSB0b2tlbiArICcsJyArIGopIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgcGF0dGVybk9iaiA9IHBhdHRlcm5zW2pdO1xuXHRcdFx0XHR2YXIgaW5zaWRlID0gcGF0dGVybk9iai5pbnNpZGU7XG5cdFx0XHRcdHZhciBsb29rYmVoaW5kID0gISFwYXR0ZXJuT2JqLmxvb2tiZWhpbmQ7XG5cdFx0XHRcdHZhciBncmVlZHkgPSAhIXBhdHRlcm5PYmouZ3JlZWR5O1xuXHRcdFx0XHR2YXIgYWxpYXMgPSBwYXR0ZXJuT2JqLmFsaWFzO1xuXG5cdFx0XHRcdGlmIChncmVlZHkgJiYgIXBhdHRlcm5PYmoucGF0dGVybi5nbG9iYWwpIHtcblx0XHRcdFx0XHQvLyBXaXRob3V0IHRoZSBnbG9iYWwgZmxhZywgbGFzdEluZGV4IHdvbid0IHdvcmtcblx0XHRcdFx0XHR2YXIgZmxhZ3MgPSBwYXR0ZXJuT2JqLnBhdHRlcm4udG9TdHJpbmcoKS5tYXRjaCgvW2ltc3V5XSokLylbMF07XG5cdFx0XHRcdFx0cGF0dGVybk9iai5wYXR0ZXJuID0gUmVnRXhwKHBhdHRlcm5PYmoucGF0dGVybi5zb3VyY2UsIGZsYWdzICsgJ2cnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8qKiBAdHlwZSB7UmVnRXhwfSAqL1xuXHRcdFx0XHR2YXIgcGF0dGVybiA9IHBhdHRlcm5PYmoucGF0dGVybiB8fCBwYXR0ZXJuT2JqO1xuXG5cdFx0XHRcdGZvciAoIC8vIGl0ZXJhdGUgdGhlIHRva2VuIGxpc3QgYW5kIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgdG9rZW4vc3RyaW5nIHBvc2l0aW9uXG5cdFx0XHRcdFx0dmFyIGN1cnJlbnROb2RlID0gc3RhcnROb2RlLm5leHQsIHBvcyA9IHN0YXJ0UG9zO1xuXHRcdFx0XHRcdGN1cnJlbnROb2RlICE9PSB0b2tlbkxpc3QudGFpbDtcblx0XHRcdFx0XHRwb3MgKz0gY3VycmVudE5vZGUudmFsdWUubGVuZ3RoLCBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLm5leHRcblx0XHRcdFx0KSB7XG5cblx0XHRcdFx0XHRpZiAocmVtYXRjaCAmJiBwb3MgPj0gcmVtYXRjaC5yZWFjaCkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIHN0ciA9IGN1cnJlbnROb2RlLnZhbHVlO1xuXG5cdFx0XHRcdFx0aWYgKHRva2VuTGlzdC5sZW5ndGggPiB0ZXh0Lmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0Ly8gU29tZXRoaW5nIHdlbnQgdGVycmlibHkgd3JvbmcsIEFCT1JULCBBQk9SVCFcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoc3RyIGluc3RhbmNlb2YgVG9rZW4pIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHZhciByZW1vdmVDb3VudCA9IDE7IC8vIHRoaXMgaXMgdGhlIHRvIHBhcmFtZXRlciBvZiByZW1vdmVCZXR3ZWVuXG5cdFx0XHRcdFx0dmFyIG1hdGNoO1xuXG5cdFx0XHRcdFx0aWYgKGdyZWVkeSkge1xuXHRcdFx0XHRcdFx0bWF0Y2ggPSBtYXRjaFBhdHRlcm4ocGF0dGVybiwgcG9zLCB0ZXh0LCBsb29rYmVoaW5kKTtcblx0XHRcdFx0XHRcdGlmICghbWF0Y2ggfHwgbWF0Y2guaW5kZXggPj0gdGV4dC5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHZhciBmcm9tID0gbWF0Y2guaW5kZXg7XG5cdFx0XHRcdFx0XHR2YXIgdG8gPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcblx0XHRcdFx0XHRcdHZhciBwID0gcG9zO1xuXG5cdFx0XHRcdFx0XHQvLyBmaW5kIHRoZSBub2RlIHRoYXQgY29udGFpbnMgdGhlIG1hdGNoXG5cdFx0XHRcdFx0XHRwICs9IGN1cnJlbnROb2RlLnZhbHVlLmxlbmd0aDtcblx0XHRcdFx0XHRcdHdoaWxlIChmcm9tID49IHApIHtcblx0XHRcdFx0XHRcdFx0Y3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5uZXh0O1xuXHRcdFx0XHRcdFx0XHRwICs9IGN1cnJlbnROb2RlLnZhbHVlLmxlbmd0aDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC8vIGFkanVzdCBwb3MgKGFuZCBwKVxuXHRcdFx0XHRcdFx0cCAtPSBjdXJyZW50Tm9kZS52YWx1ZS5sZW5ndGg7XG5cdFx0XHRcdFx0XHRwb3MgPSBwO1xuXG5cdFx0XHRcdFx0XHQvLyB0aGUgY3VycmVudCBub2RlIGlzIGEgVG9rZW4sIHRoZW4gdGhlIG1hdGNoIHN0YXJ0cyBpbnNpZGUgYW5vdGhlciBUb2tlbiwgd2hpY2ggaXMgaW52YWxpZFxuXHRcdFx0XHRcdFx0aWYgKGN1cnJlbnROb2RlLnZhbHVlIGluc3RhbmNlb2YgVG9rZW4pIHtcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIGZpbmQgdGhlIGxhc3Qgbm9kZSB3aGljaCBpcyBhZmZlY3RlZCBieSB0aGlzIG1hdGNoXG5cdFx0XHRcdFx0XHRmb3IgKFxuXHRcdFx0XHRcdFx0XHR2YXIgayA9IGN1cnJlbnROb2RlO1xuXHRcdFx0XHRcdFx0XHRrICE9PSB0b2tlbkxpc3QudGFpbCAmJiAocCA8IHRvIHx8IHR5cGVvZiBrLnZhbHVlID09PSAnc3RyaW5nJyk7XG5cdFx0XHRcdFx0XHRcdGsgPSBrLm5leHRcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRyZW1vdmVDb3VudCsrO1xuXHRcdFx0XHRcdFx0XHRwICs9IGsudmFsdWUubGVuZ3RoO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmVtb3ZlQ291bnQtLTtcblxuXHRcdFx0XHRcdFx0Ly8gcmVwbGFjZSB3aXRoIHRoZSBuZXcgbWF0Y2hcblx0XHRcdFx0XHRcdHN0ciA9IHRleHQuc2xpY2UocG9zLCBwKTtcblx0XHRcdFx0XHRcdG1hdGNoLmluZGV4IC09IHBvcztcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bWF0Y2ggPSBtYXRjaFBhdHRlcm4ocGF0dGVybiwgMCwgc3RyLCBsb29rYmVoaW5kKTtcblx0XHRcdFx0XHRcdGlmICghbWF0Y2gpIHtcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuXHRcdFx0XHRcdHZhciBmcm9tID0gbWF0Y2guaW5kZXg7XG5cdFx0XHRcdFx0dmFyIG1hdGNoU3RyID0gbWF0Y2hbMF07XG5cdFx0XHRcdFx0dmFyIGJlZm9yZSA9IHN0ci5zbGljZSgwLCBmcm9tKTtcblx0XHRcdFx0XHR2YXIgYWZ0ZXIgPSBzdHIuc2xpY2UoZnJvbSArIG1hdGNoU3RyLmxlbmd0aCk7XG5cblx0XHRcdFx0XHR2YXIgcmVhY2ggPSBwb3MgKyBzdHIubGVuZ3RoO1xuXHRcdFx0XHRcdGlmIChyZW1hdGNoICYmIHJlYWNoID4gcmVtYXRjaC5yZWFjaCkge1xuXHRcdFx0XHRcdFx0cmVtYXRjaC5yZWFjaCA9IHJlYWNoO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHZhciByZW1vdmVGcm9tID0gY3VycmVudE5vZGUucHJldjtcblxuXHRcdFx0XHRcdGlmIChiZWZvcmUpIHtcblx0XHRcdFx0XHRcdHJlbW92ZUZyb20gPSBhZGRBZnRlcih0b2tlbkxpc3QsIHJlbW92ZUZyb20sIGJlZm9yZSk7XG5cdFx0XHRcdFx0XHRwb3MgKz0gYmVmb3JlLmxlbmd0aDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZW1vdmVSYW5nZSh0b2tlbkxpc3QsIHJlbW92ZUZyb20sIHJlbW92ZUNvdW50KTtcblxuXHRcdFx0XHRcdHZhciB3cmFwcGVkID0gbmV3IFRva2VuKHRva2VuLCBpbnNpZGUgPyBfLnRva2VuaXplKG1hdGNoU3RyLCBpbnNpZGUpIDogbWF0Y2hTdHIsIGFsaWFzLCBtYXRjaFN0cik7XG5cdFx0XHRcdFx0Y3VycmVudE5vZGUgPSBhZGRBZnRlcih0b2tlbkxpc3QsIHJlbW92ZUZyb20sIHdyYXBwZWQpO1xuXG5cdFx0XHRcdFx0aWYgKGFmdGVyKSB7XG5cdFx0XHRcdFx0XHRhZGRBZnRlcih0b2tlbkxpc3QsIGN1cnJlbnROb2RlLCBhZnRlcik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKHJlbW92ZUNvdW50ID4gMSkge1xuXHRcdFx0XHRcdFx0Ly8gYXQgbGVhc3Qgb25lIFRva2VuIG9iamVjdCB3YXMgcmVtb3ZlZCwgc28gd2UgaGF2ZSB0byBkbyBzb21lIHJlbWF0Y2hpbmdcblx0XHRcdFx0XHRcdC8vIHRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHRoZSBjdXJyZW50IHBhdHRlcm4gaXMgZ3JlZWR5XG5cblx0XHRcdFx0XHRcdC8qKiBAdHlwZSB7UmVtYXRjaE9wdGlvbnN9ICovXG5cdFx0XHRcdFx0XHR2YXIgbmVzdGVkUmVtYXRjaCA9IHtcblx0XHRcdFx0XHRcdFx0Y2F1c2U6IHRva2VuICsgJywnICsgaixcblx0XHRcdFx0XHRcdFx0cmVhY2g6IHJlYWNoXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0bWF0Y2hHcmFtbWFyKHRleHQsIHRva2VuTGlzdCwgZ3JhbW1hciwgY3VycmVudE5vZGUucHJldiwgcG9zLCBuZXN0ZWRSZW1hdGNoKTtcblxuXHRcdFx0XHRcdFx0Ly8gdGhlIHJlYWNoIG1pZ2h0IGhhdmUgYmVlbiBleHRlbmRlZCBiZWNhdXNlIG9mIHRoZSByZW1hdGNoaW5nXG5cdFx0XHRcdFx0XHRpZiAocmVtYXRjaCAmJiBuZXN0ZWRSZW1hdGNoLnJlYWNoID4gcmVtYXRjaC5yZWFjaCkge1xuXHRcdFx0XHRcdFx0XHRyZW1hdGNoLnJlYWNoID0gbmVzdGVkUmVtYXRjaC5yZWFjaDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQHR5cGVkZWYgTGlua2VkTGlzdE5vZGVcblx0ICogQHByb3BlcnR5IHtUfSB2YWx1ZVxuXHQgKiBAcHJvcGVydHkge0xpbmtlZExpc3ROb2RlPFQ+IHwgbnVsbH0gcHJldiBUaGUgcHJldmlvdXMgbm9kZS5cblx0ICogQHByb3BlcnR5IHtMaW5rZWRMaXN0Tm9kZTxUPiB8IG51bGx9IG5leHQgVGhlIG5leHQgbm9kZS5cblx0ICogQHRlbXBsYXRlIFRcblx0ICogQHByaXZhdGVcblx0ICovXG5cblx0LyoqXG5cdCAqIEB0ZW1wbGF0ZSBUXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRmdW5jdGlvbiBMaW5rZWRMaXN0KCkge1xuXHRcdC8qKiBAdHlwZSB7TGlua2VkTGlzdE5vZGU8VD59ICovXG5cdFx0dmFyIGhlYWQgPSB7IHZhbHVlOiBudWxsLCBwcmV2OiBudWxsLCBuZXh0OiBudWxsIH07XG5cdFx0LyoqIEB0eXBlIHtMaW5rZWRMaXN0Tm9kZTxUPn0gKi9cblx0XHR2YXIgdGFpbCA9IHsgdmFsdWU6IG51bGwsIHByZXY6IGhlYWQsIG5leHQ6IG51bGwgfTtcblx0XHRoZWFkLm5leHQgPSB0YWlsO1xuXG5cdFx0LyoqIEB0eXBlIHtMaW5rZWRMaXN0Tm9kZTxUPn0gKi9cblx0XHR0aGlzLmhlYWQgPSBoZWFkO1xuXHRcdC8qKiBAdHlwZSB7TGlua2VkTGlzdE5vZGU8VD59ICovXG5cdFx0dGhpcy50YWlsID0gdGFpbDtcblx0XHR0aGlzLmxlbmd0aCA9IDA7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIG5ldyBub2RlIHdpdGggdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBsaXN0LlxuXHQgKlxuXHQgKiBAcGFyYW0ge0xpbmtlZExpc3Q8VD59IGxpc3Rcblx0ICogQHBhcmFtIHtMaW5rZWRMaXN0Tm9kZTxUPn0gbm9kZVxuXHQgKiBAcGFyYW0ge1R9IHZhbHVlXG5cdCAqIEByZXR1cm5zIHtMaW5rZWRMaXN0Tm9kZTxUPn0gVGhlIGFkZGVkIG5vZGUuXG5cdCAqIEB0ZW1wbGF0ZSBUXG5cdCAqL1xuXHRmdW5jdGlvbiBhZGRBZnRlcihsaXN0LCBub2RlLCB2YWx1ZSkge1xuXHRcdC8vIGFzc3VtZXMgdGhhdCBub2RlICE9IGxpc3QudGFpbCAmJiB2YWx1ZXMubGVuZ3RoID49IDBcblx0XHR2YXIgbmV4dCA9IG5vZGUubmV4dDtcblxuXHRcdHZhciBuZXdOb2RlID0geyB2YWx1ZTogdmFsdWUsIHByZXY6IG5vZGUsIG5leHQ6IG5leHQgfTtcblx0XHRub2RlLm5leHQgPSBuZXdOb2RlO1xuXHRcdG5leHQucHJldiA9IG5ld05vZGU7XG5cdFx0bGlzdC5sZW5ndGgrKztcblxuXHRcdHJldHVybiBuZXdOb2RlO1xuXHR9XG5cdC8qKlxuXHQgKiBSZW1vdmVzIGBjb3VudGAgbm9kZXMgYWZ0ZXIgdGhlIGdpdmVuIG5vZGUuIFRoZSBnaXZlbiBub2RlIHdpbGwgbm90IGJlIHJlbW92ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7TGlua2VkTGlzdDxUPn0gbGlzdFxuXHQgKiBAcGFyYW0ge0xpbmtlZExpc3ROb2RlPFQ+fSBub2RlXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudFxuXHQgKiBAdGVtcGxhdGUgVFxuXHQgKi9cblx0ZnVuY3Rpb24gcmVtb3ZlUmFuZ2UobGlzdCwgbm9kZSwgY291bnQpIHtcblx0XHR2YXIgbmV4dCA9IG5vZGUubmV4dDtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50ICYmIG5leHQgIT09IGxpc3QudGFpbDsgaSsrKSB7XG5cdFx0XHRuZXh0ID0gbmV4dC5uZXh0O1xuXHRcdH1cblx0XHRub2RlLm5leHQgPSBuZXh0O1xuXHRcdG5leHQucHJldiA9IG5vZGU7XG5cdFx0bGlzdC5sZW5ndGggLT0gaTtcblx0fVxuXHQvKipcblx0ICogQHBhcmFtIHtMaW5rZWRMaXN0PFQ+fSBsaXN0XG5cdCAqIEByZXR1cm5zIHtUW119XG5cdCAqIEB0ZW1wbGF0ZSBUXG5cdCAqL1xuXHRmdW5jdGlvbiB0b0FycmF5KGxpc3QpIHtcblx0XHR2YXIgYXJyYXkgPSBbXTtcblx0XHR2YXIgbm9kZSA9IGxpc3QuaGVhZC5uZXh0O1xuXHRcdHdoaWxlIChub2RlICE9PSBsaXN0LnRhaWwpIHtcblx0XHRcdGFycmF5LnB1c2gobm9kZS52YWx1ZSk7XG5cdFx0XHRub2RlID0gbm9kZS5uZXh0O1xuXHRcdH1cblx0XHRyZXR1cm4gYXJyYXk7XG5cdH1cblxuXG5cdGlmICghX3NlbGYuZG9jdW1lbnQpIHtcblx0XHRpZiAoIV9zZWxmLmFkZEV2ZW50TGlzdGVuZXIpIHtcblx0XHRcdC8vIGluIE5vZGUuanNcblx0XHRcdHJldHVybiBfO1xuXHRcdH1cblxuXHRcdGlmICghXy5kaXNhYmxlV29ya2VyTWVzc2FnZUhhbmRsZXIpIHtcblx0XHRcdC8vIEluIHdvcmtlclxuXHRcdFx0X3NlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChldnQpIHtcblx0XHRcdFx0dmFyIG1lc3NhZ2UgPSBKU09OLnBhcnNlKGV2dC5kYXRhKTtcblx0XHRcdFx0dmFyIGxhbmcgPSBtZXNzYWdlLmxhbmd1YWdlO1xuXHRcdFx0XHR2YXIgY29kZSA9IG1lc3NhZ2UuY29kZTtcblx0XHRcdFx0dmFyIGltbWVkaWF0ZUNsb3NlID0gbWVzc2FnZS5pbW1lZGlhdGVDbG9zZTtcblxuXHRcdFx0XHRfc2VsZi5wb3N0TWVzc2FnZShfLmhpZ2hsaWdodChjb2RlLCBfLmxhbmd1YWdlc1tsYW5nXSwgbGFuZykpO1xuXHRcdFx0XHRpZiAoaW1tZWRpYXRlQ2xvc2UpIHtcblx0XHRcdFx0XHRfc2VsZi5jbG9zZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCBmYWxzZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIF87XG5cdH1cblxuXHQvLyBHZXQgY3VycmVudCBzY3JpcHQgYW5kIGhpZ2hsaWdodFxuXHR2YXIgc2NyaXB0ID0gXy51dGlsLmN1cnJlbnRTY3JpcHQoKTtcblxuXHRpZiAoc2NyaXB0KSB7XG5cdFx0Xy5maWxlbmFtZSA9IHNjcmlwdC5zcmM7XG5cblx0XHRpZiAoc2NyaXB0Lmhhc0F0dHJpYnV0ZSgnZGF0YS1tYW51YWwnKSkge1xuXHRcdFx0Xy5tYW51YWwgPSB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGhpZ2hsaWdodEF1dG9tYXRpY2FsbHlDYWxsYmFjaygpIHtcblx0XHRpZiAoIV8ubWFudWFsKSB7XG5cdFx0XHRfLmhpZ2hsaWdodEFsbCgpO1xuXHRcdH1cblx0fVxuXG5cdGlmICghXy5tYW51YWwpIHtcblx0XHQvLyBJZiB0aGUgZG9jdW1lbnQgc3RhdGUgaXMgXCJsb2FkaW5nXCIsIHRoZW4gd2UnbGwgdXNlIERPTUNvbnRlbnRMb2FkZWQuXG5cdFx0Ly8gSWYgdGhlIGRvY3VtZW50IHN0YXRlIGlzIFwiaW50ZXJhY3RpdmVcIiBhbmQgdGhlIHByaXNtLmpzIHNjcmlwdCBpcyBkZWZlcnJlZCwgdGhlbiB3ZSdsbCBhbHNvIHVzZSB0aGVcblx0XHQvLyBET01Db250ZW50TG9hZGVkIGV2ZW50IGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUgc29tZSBwbHVnaW5zIG9yIGxhbmd1YWdlcyB3aGljaCBoYXZlIGFsc28gYmVlbiBkZWZlcnJlZCBhbmQgdGhleVxuXHRcdC8vIG1pZ2h0IHRha2UgbG9uZ2VyIG9uZSBhbmltYXRpb24gZnJhbWUgdG8gZXhlY3V0ZSB3aGljaCBjYW4gY3JlYXRlIGEgcmFjZSBjb25kaXRpb24gd2hlcmUgb25seSBzb21lIHBsdWdpbnMgaGF2ZVxuXHRcdC8vIGJlZW4gbG9hZGVkIHdoZW4gUHJpc20uaGlnaGxpZ2h0QWxsKCkgaXMgZXhlY3V0ZWQsIGRlcGVuZGluZyBvbiBob3cgZmFzdCByZXNvdXJjZXMgYXJlIGxvYWRlZC5cblx0XHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL1ByaXNtSlMvcHJpc20vaXNzdWVzLzIxMDJcblx0XHR2YXIgcmVhZHlTdGF0ZSA9IGRvY3VtZW50LnJlYWR5U3RhdGU7XG5cdFx0aWYgKHJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJyB8fCByZWFkeVN0YXRlID09PSAnaW50ZXJhY3RpdmUnICYmIHNjcmlwdCAmJiBzY3JpcHQuZGVmZXIpIHtcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBoaWdobGlnaHRBdXRvbWF0aWNhbGx5Q2FsbGJhY2spO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAod2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuXHRcdFx0XHR3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGhpZ2hsaWdodEF1dG9tYXRpY2FsbHlDYWxsYmFjayk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dChoaWdobGlnaHRBdXRvbWF0aWNhbGx5Q2FsbGJhY2ssIDE2KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gXztcblxufShfc2VsZikpO1xuXG5pZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcblx0bW9kdWxlLmV4cG9ydHMgPSBQcmlzbTtcbn1cblxuLy8gaGFjayBmb3IgY29tcG9uZW50cyB0byB3b3JrIGNvcnJlY3RseSBpbiBub2RlLmpzXG5pZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0Z2xvYmFsLlByaXNtID0gUHJpc207XG59XG5cbi8vIHNvbWUgYWRkaXRpb25hbCBkb2N1bWVudGF0aW9uL3R5cGVzXG5cbi8qKlxuICogVGhlIGV4cGFuc2lvbiBvZiBhIHNpbXBsZSBgUmVnRXhwYCBsaXRlcmFsIHRvIHN1cHBvcnQgYWRkaXRpb25hbCBwcm9wZXJ0aWVzLlxuICpcbiAqIEB0eXBlZGVmIEdyYW1tYXJUb2tlblxuICogQHByb3BlcnR5IHtSZWdFeHB9IHBhdHRlcm4gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBvZiB0aGUgdG9rZW4uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb29rYmVoaW5kPWZhbHNlXSBJZiBgdHJ1ZWAsIHRoZW4gdGhlIGZpcnN0IGNhcHR1cmluZyBncm91cCBvZiBgcGF0dGVybmAgd2lsbCAoZWZmZWN0aXZlbHkpXG4gKiBiZWhhdmUgYXMgYSBsb29rYmVoaW5kIGdyb3VwIG1lYW5pbmcgdGhhdCB0aGUgY2FwdHVyZWQgdGV4dCB3aWxsIG5vdCBiZSBwYXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgb2YgdGhlIG5ldyB0b2tlbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2dyZWVkeT1mYWxzZV0gV2hldGhlciB0aGUgdG9rZW4gaXMgZ3JlZWR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd8c3RyaW5nW119IFthbGlhc10gQW4gb3B0aW9uYWwgYWxpYXMgb3IgbGlzdCBvZiBhbGlhc2VzLlxuICogQHByb3BlcnR5IHtHcmFtbWFyfSBbaW5zaWRlXSBUaGUgbmVzdGVkIGdyYW1tYXIgb2YgdGhpcyB0b2tlbi5cbiAqXG4gKiBUaGUgYGluc2lkZWAgZ3JhbW1hciB3aWxsIGJlIHVzZWQgdG8gdG9rZW5pemUgdGhlIHRleHQgdmFsdWUgb2YgZWFjaCB0b2tlbiBvZiB0aGlzIGtpbmQuXG4gKlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byBtYWtlIG5lc3RlZCBhbmQgZXZlbiByZWN1cnNpdmUgbGFuZ3VhZ2UgZGVmaW5pdGlvbnMuXG4gKlxuICogTm90ZTogVGhpcyBjYW4gY2F1c2UgaW5maW5pdGUgcmVjdXJzaW9uLiBCZSBjYXJlZnVsIHdoZW4geW91IGVtYmVkIGRpZmZlcmVudCBsYW5ndWFnZXMgb3IgZXZlbiB0aGUgc2FtZSBsYW5ndWFnZSBpbnRvXG4gKiBlYWNoIGFub3RoZXIuXG4gKiBAZ2xvYmFsXG4gKiBAcHVibGljXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHcmFtbWFyXG4gKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgUmVnRXhwIHwgR3JhbW1hclRva2VuIHwgQXJyYXk8UmVnRXhwIHwgR3JhbW1hclRva2VuPj59XG4gKiBAcHJvcGVydHkge0dyYW1tYXJ9IFtyZXN0XSBBbiBvcHRpb25hbCBncmFtbWFyIG9iamVjdCB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhpcyBncmFtbWFyLlxuICogQGdsb2JhbFxuICogQHB1YmxpY1xuICovXG5cbi8qKlxuICogQSBmdW5jdGlvbiB3aGljaCB3aWxsIGludm9rZWQgYWZ0ZXIgYW4gZWxlbWVudCB3YXMgc3VjY2Vzc2Z1bGx5IGhpZ2hsaWdodGVkLlxuICpcbiAqIEBjYWxsYmFjayBIaWdobGlnaHRDYWxsYmFja1xuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50IHN1Y2Nlc3NmdWxseSBoaWdobGlnaHRlZC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQGdsb2JhbFxuICogQHB1YmxpY1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEhvb2tDYWxsYmFja1xuICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBlbnYgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBvZiB0aGUgaG9vay5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQGdsb2JhbFxuICogQHB1YmxpY1xuICovXG47XG5QcmlzbS5sYW5ndWFnZXMubWFya3VwID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvPCEtLSg/Oig/ITwhLS0pW1xcc1xcU10pKj8tLT4vLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQncHJvbG9nJzoge1xuXHRcdHBhdHRlcm46IC88XFw/W1xcc1xcU10rP1xcPz4vLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnZG9jdHlwZSc6IHtcblx0XHQvLyBodHRwczovL3d3dy53My5vcmcvVFIveG1sLyNOVC1kb2N0eXBlZGVjbFxuXHRcdHBhdHRlcm46IC88IURPQ1RZUEUoPzpbXj5cIidbXFxdXXxcIlteXCJdKlwifCdbXiddKicpKyg/OlxcWyg/OltePFwiJ1xcXV18XCJbXlwiXSpcInwnW14nXSonfDwoPyEhLS0pfDwhLS0oPzpbXi1dfC0oPyEtPikpKi0tPikqXFxdXFxzKik/Pi9pLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdpbnRlcm5hbC1zdWJzZXQnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oXlteXFxbXSpcXFspW1xcc1xcU10rKD89XFxdPiQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHR9LFxuXHRcdFx0J3N0cmluZyc6IHtcblx0XHRcdFx0cGF0dGVybjogL1wiW15cIl0qXCJ8J1teJ10qJy8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9ePCF8PiR8W1tcXF1dLyxcblx0XHRcdCdkb2N0eXBlLXRhZyc6IC9eRE9DVFlQRS9pLFxuXHRcdFx0J25hbWUnOiAvW15cXHM8PidcIl0rL1xuXHRcdH1cblx0fSxcblx0J2NkYXRhJzoge1xuXHRcdHBhdHRlcm46IC88IVxcW0NEQVRBXFxbW1xcc1xcU10qP1xcXVxcXT4vaSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3RhZyc6IHtcblx0XHRwYXR0ZXJuOiAvPFxcLz8oPyFcXGQpW15cXHM+XFwvPSQ8JV0rKD86XFxzKD86XFxzKlteXFxzPlxcLz1dKyg/Olxccyo9XFxzKig/OlwiW15cIl0qXCJ8J1teJ10qJ3xbXlxccydcIj49XSsoPz1bXFxzPl0pKXwoPz1bXFxzLz5dKSkpKyk/XFxzKlxcLz8+Lyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQndGFnJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXjxcXC8/W15cXHM+XFwvXSsvLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXjxcXC8/Lyxcblx0XHRcdFx0XHQnbmFtZXNwYWNlJzogL15bXlxccz5cXC86XSs6L1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3NwZWNpYWwtYXR0cic6IFtdLFxuXHRcdFx0J2F0dHItdmFsdWUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC89XFxzKig/OlwiW15cIl0qXCJ8J1teJ10qJ3xbXlxccydcIj49XSspLyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXj0vLFxuXHRcdFx0XHRcdFx0XHRhbGlhczogJ2F0dHItZXF1YWxzJ1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogL14oXFxzKilbXCInXXxbXCInXSQvLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLz8+Lyxcblx0XHRcdCdhdHRyLW5hbWUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9bXlxccz5cXC9dKy8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCduYW1lc3BhY2UnOiAvXlteXFxzPlxcLzpdKzovXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH1cblx0fSxcblx0J2VudGl0eSc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvJltcXGRhLXpdezEsOH07L2ksXG5cdFx0XHRhbGlhczogJ25hbWVkLWVudGl0eSdcblx0XHR9LFxuXHRcdC8mI3g/W1xcZGEtZl17MSw4fTsvaVxuXHRdXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMubWFya3VwWyd0YWcnXS5pbnNpZGVbJ2F0dHItdmFsdWUnXS5pbnNpZGVbJ2VudGl0eSddID1cblx0UHJpc20ubGFuZ3VhZ2VzLm1hcmt1cFsnZW50aXR5J107XG5QcmlzbS5sYW5ndWFnZXMubWFya3VwWydkb2N0eXBlJ10uaW5zaWRlWydpbnRlcm5hbC1zdWJzZXQnXS5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMubWFya3VwO1xuXG4vLyBQbHVnaW4gdG8gbWFrZSBlbnRpdHkgdGl0bGUgc2hvdyB0aGUgcmVhbCBlbnRpdHksIGlkZWEgYnkgUm9tYW4gS29tYXJvdlxuUHJpc20uaG9va3MuYWRkKCd3cmFwJywgZnVuY3Rpb24gKGVudikge1xuXG5cdGlmIChlbnYudHlwZSA9PT0gJ2VudGl0eScpIHtcblx0XHRlbnYuYXR0cmlidXRlc1sndGl0bGUnXSA9IGVudi5jb250ZW50LnJlcGxhY2UoLyZhbXA7LywgJyYnKTtcblx0fVxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShQcmlzbS5sYW5ndWFnZXMubWFya3VwLnRhZywgJ2FkZElubGluZWQnLCB7XG5cdC8qKlxuXHQgKiBBZGRzIGFuIGlubGluZWQgbGFuZ3VhZ2UgdG8gbWFya3VwLlxuXHQgKlxuXHQgKiBBbiBleGFtcGxlIG9mIGFuIGlubGluZWQgbGFuZ3VhZ2UgaXMgQ1NTIHdpdGggYDxzdHlsZT5gIHRhZ3MuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0YWdOYW1lIFRoZSBuYW1lIG9mIHRoZSB0YWcgdGhhdCBjb250YWlucyB0aGUgaW5saW5lZCBsYW5ndWFnZS4gVGhpcyBuYW1lIHdpbGwgYmUgdHJlYXRlZCBhc1xuXHQgKiBjYXNlIGluc2Vuc2l0aXZlLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbGFuZyBUaGUgbGFuZ3VhZ2Uga2V5LlxuXHQgKiBAZXhhbXBsZVxuXHQgKiBhZGRJbmxpbmVkKCdzdHlsZScsICdjc3MnKTtcblx0ICovXG5cdHZhbHVlOiBmdW5jdGlvbiBhZGRJbmxpbmVkKHRhZ05hbWUsIGxhbmcpIHtcblx0XHR2YXIgaW5jbHVkZWRDZGF0YUluc2lkZSA9IHt9O1xuXHRcdGluY2x1ZGVkQ2RhdGFJbnNpZGVbJ2xhbmd1YWdlLScgKyBsYW5nXSA9IHtcblx0XHRcdHBhdHRlcm46IC8oXjwhXFxbQ0RBVEFcXFspW1xcc1xcU10rPyg/PVxcXVxcXT4kKS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzW2xhbmddXG5cdFx0fTtcblx0XHRpbmNsdWRlZENkYXRhSW5zaWRlWydjZGF0YSddID0gL148IVxcW0NEQVRBXFxbfFxcXVxcXT4kL2k7XG5cblx0XHR2YXIgaW5zaWRlID0ge1xuXHRcdFx0J2luY2x1ZGVkLWNkYXRhJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvPCFcXFtDREFUQVxcW1tcXHNcXFNdKj9cXF1cXF0+L2ksXG5cdFx0XHRcdGluc2lkZTogaW5jbHVkZWRDZGF0YUluc2lkZVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0aW5zaWRlWydsYW5ndWFnZS0nICsgbGFuZ10gPSB7XG5cdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzW2xhbmddXG5cdFx0fTtcblxuXHRcdHZhciBkZWYgPSB7fTtcblx0XHRkZWZbdGFnTmFtZV0gPSB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyg8X19bXj5dKj4pKD86PCFcXFtDREFUQVxcWyg/OlteXFxdXXxcXF0oPyFcXF0+KSkqXFxdXFxdPnwoPyE8IVxcW0NEQVRBXFxbKVtcXHNcXFNdKSo/KD89PFxcL19fPikvLnNvdXJjZS5yZXBsYWNlKC9fXy9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0YWdOYW1lOyB9KSwgJ2knKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IGluc2lkZVxuXHRcdH07XG5cblx0XHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdtYXJrdXAnLCAnY2RhdGEnLCBkZWYpO1xuXHR9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShQcmlzbS5sYW5ndWFnZXMubWFya3VwLnRhZywgJ2FkZEF0dHJpYnV0ZScsIHtcblx0LyoqXG5cdCAqIEFkZHMgYW4gcGF0dGVybiB0byBoaWdobGlnaHQgbGFuZ3VhZ2VzIGVtYmVkZGVkIGluIEhUTUwgYXR0cmlidXRlcy5cblx0ICpcblx0ICogQW4gZXhhbXBsZSBvZiBhbiBpbmxpbmVkIGxhbmd1YWdlIGlzIENTUyB3aXRoIGBzdHlsZWAgYXR0cmlidXRlcy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IGF0dHJOYW1lIFRoZSBuYW1lIG9mIHRoZSB0YWcgdGhhdCBjb250YWlucyB0aGUgaW5saW5lZCBsYW5ndWFnZS4gVGhpcyBuYW1lIHdpbGwgYmUgdHJlYXRlZCBhc1xuXHQgKiBjYXNlIGluc2Vuc2l0aXZlLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbGFuZyBUaGUgbGFuZ3VhZ2Uga2V5LlxuXHQgKiBAZXhhbXBsZVxuXHQgKiBhZGRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2NzcycpO1xuXHQgKi9cblx0dmFsdWU6IGZ1bmN0aW9uIChhdHRyTmFtZSwgbGFuZykge1xuXHRcdFByaXNtLmxhbmd1YWdlcy5tYXJrdXAudGFnLmluc2lkZVsnc3BlY2lhbC1hdHRyJ10ucHVzaCh7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHRcdC8oXnxbXCInXFxzXSkvLnNvdXJjZSArICcoPzonICsgYXR0ck5hbWUgKyAnKScgKyAvXFxzKj1cXHMqKD86XCJbXlwiXSpcInwnW14nXSonfFteXFxzJ1wiPj1dKyg/PVtcXHM+XSkpLy5zb3VyY2UsXG5cdFx0XHRcdCdpJ1xuXHRcdFx0KSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2F0dHItbmFtZSc6IC9eW15cXHM9XSsvLFxuXHRcdFx0XHQnYXR0ci12YWx1ZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvPVtcXHNcXFNdKy8sXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQndmFsdWUnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8oXj1cXHMqKFtcIiddfCg/IVtcIiddKSkpXFxTW1xcc1xcU10qKD89XFwyJCkvLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRhbGlhczogW2xhbmcsICdsYW5ndWFnZS0nICsgbGFuZ10sXG5cdFx0XHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzW2xhbmddXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogW1xuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0cGF0dGVybjogL149Lyxcblx0XHRcdFx0XHRcdFx0XHRhbGlhczogJ2F0dHItZXF1YWxzJ1xuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHQvXCJ8Jy9cblx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5odG1sID0gUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cDtcblByaXNtLmxhbmd1YWdlcy5tYXRobWwgPSBQcmlzbS5sYW5ndWFnZXMubWFya3VwO1xuUHJpc20ubGFuZ3VhZ2VzLnN2ZyA9IFByaXNtLmxhbmd1YWdlcy5tYXJrdXA7XG5cblByaXNtLmxhbmd1YWdlcy54bWwgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdtYXJrdXAnLCB7fSk7XG5QcmlzbS5sYW5ndWFnZXMuc3NtbCA9IFByaXNtLmxhbmd1YWdlcy54bWw7XG5QcmlzbS5sYW5ndWFnZXMuYXRvbSA9IFByaXNtLmxhbmd1YWdlcy54bWw7XG5QcmlzbS5sYW5ndWFnZXMucnNzID0gUHJpc20ubGFuZ3VhZ2VzLnhtbDtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBzdHJpbmcgPSAvKD86XCIoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXxbXlwiXFxcXFxcclxcbl0pKlwifCcoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXxbXidcXFxcXFxyXFxuXSkqJykvO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5jc3MgPSB7XG5cdFx0J2NvbW1lbnQnOiAvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy8sXG5cdFx0J2F0cnVsZSc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnQFtcXFxcdy1dKD86JyArIC9bXjt7XFxzXCInXXxcXHMrKD8hXFxzKS8uc291cmNlICsgJ3wnICsgc3RyaW5nLnNvdXJjZSArICcpKj8nICsgLyg/Ojt8KD89XFxzKlxceykpLy5zb3VyY2UpLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdydWxlJzogL15AW1xcdy1dKy8sXG5cdFx0XHRcdCdzZWxlY3Rvci1mdW5jdGlvbi1hcmd1bWVudCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKFxcYnNlbGVjdG9yXFxzKlxcKFxccyooPyFbXFxzKV0pKSg/OlteKClcXHNdfFxccysoPyFbXFxzKV0pfFxcKCg/OlteKCldfFxcKFteKCldKlxcKSkqXFwpKSsoPz1cXHMqXFwpKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ3NlbGVjdG9yJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQna2V5d29yZCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXHctXSkoPzphbmR8bm90fG9ubHl8b3IpKD8hW1xcdy1dKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIFNlZSByZXN0IGJlbG93XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQndXJsJzoge1xuXHRcdFx0Ly8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy12YWx1ZXMtMy8jdXJsc1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKCdcXFxcYnVybFxcXFwoKD86JyArIHN0cmluZy5zb3VyY2UgKyAnfCcgKyAvKD86W15cXFxcXFxyXFxuKClcIiddfFxcXFxbXFxzXFxTXSkqLy5zb3VyY2UgKyAnKVxcXFwpJywgJ2knKSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZnVuY3Rpb24nOiAvXnVybC9pLFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlxcKHxcXCkkLyxcblx0XHRcdFx0J3N0cmluZyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJ14nICsgc3RyaW5nLnNvdXJjZSArICckJyksXG5cdFx0XHRcdFx0YWxpYXM6ICd1cmwnXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdzZWxlY3Rvcic6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnKF58W3t9XFxcXHNdKVtee31cXFxcc10oPzpbXnt9O1wiXFwnXFxcXHNdfFxcXFxzKyg/IVtcXFxcc3tdKXwnICsgc3RyaW5nLnNvdXJjZSArICcpKig/PVxcXFxzKlxcXFx7KScpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IHN0cmluZyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J3Byb3BlcnR5Jzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteLVxcd1xceEEwLVxcdUZGRkZdKSg/IVxccylbLV9hLXpcXHhBMC1cXHVGRkZGXSg/Oig/IVxccylbLVxcd1xceEEwLVxcdUZGRkZdKSooPz1cXHMqOikvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdpbXBvcnRhbnQnOiAvIWltcG9ydGFudFxcYi9pLFxuXHRcdCdmdW5jdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXi1hLXowLTldKVstYS16MC05XSsoPz1cXCgpL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQncHVuY3R1YXRpb24nOiAvWygpe307OixdL1xuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5jc3NbJ2F0cnVsZSddLmluc2lkZS5yZXN0ID0gUHJpc20ubGFuZ3VhZ2VzLmNzcztcblxuXHR2YXIgbWFya3VwID0gUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cDtcblx0aWYgKG1hcmt1cCkge1xuXHRcdG1hcmt1cC50YWcuYWRkSW5saW5lZCgnc3R5bGUnLCAnY3NzJyk7XG5cdFx0bWFya3VwLnRhZy5hZGRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2NzcycpO1xuXHR9XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmNsaWtlID0ge1xuXHQnY29tbWVudCc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcXC9cXCpbXFxzXFxTXSo/KD86XFwqXFwvfCQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFw6XSlcXC9cXC8uKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oW1wiJ10pKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjbGFzcy1uYW1lJzoge1xuXHRcdHBhdHRlcm46IC8oXFxiKD86Y2xhc3N8ZXh0ZW5kc3xpbXBsZW1lbnRzfGluc3RhbmNlb2Z8aW50ZXJmYWNlfG5ld3x0cmFpdClcXHMrfFxcYmNhdGNoXFxzK1xcKClbXFx3LlxcXFxdKy9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvWy5cXFxcXS9cblx0XHR9XG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmJyZWFrfGNhdGNofGNvbnRpbnVlfGRvfGVsc2V8ZmluYWxseXxmb3J8ZnVuY3Rpb258aWZ8aW58aW5zdGFuY2VvZnxuZXd8bnVsbHxyZXR1cm58dGhyb3d8dHJ5fHdoaWxlKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0J2Z1bmN0aW9uJzogL1xcYlxcdysoPz1cXCgpLyxcblx0J251bWJlcic6IC9cXGIweFtcXGRhLWZdK1xcYnwoPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86ZVsrLV0/XFxkKyk/L2ksXG5cdCdvcGVyYXRvcic6IC9bPD5dPT98WyE9XT0/PT98LS0/fFxcK1xcKz98JiY/fFxcfFxcfD98Wz8qL35eJV0vLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXTsoKSwuOl0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHQnY2xhc3MtbmFtZSc6IFtcblx0XHRQcmlzbS5sYW5ndWFnZXMuY2xpa2VbJ2NsYXNzLW5hbWUnXSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W14kXFx3XFx4QTAtXFx1RkZGRl0pKD8hXFxzKVtfJEEtWlxceEEwLVxcdUZGRkZdKD86KD8hXFxzKVskXFx3XFx4QTAtXFx1RkZGRl0pKig/PVxcLig/OmNvbnN0cnVjdG9yfHByb3RvdHlwZSkpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdrZXl3b3JkJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oKD86XnxcXH0pXFxzKiljYXRjaFxcYi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W14uXXxcXC5cXC5cXC5cXHMqKVxcYig/OmFzfGFzc2VydCg/PVxccypcXHspfGFzeW5jKD89XFxzKig/OmZ1bmN0aW9uXFxifFxcKHxbJFxcd1xceEEwLVxcdUZGRkZdfCQpKXxhd2FpdHxicmVha3xjYXNlfGNsYXNzfGNvbnN0fGNvbnRpbnVlfGRlYnVnZ2VyfGRlZmF1bHR8ZGVsZXRlfGRvfGVsc2V8ZW51bXxleHBvcnR8ZXh0ZW5kc3xmaW5hbGx5KD89XFxzKig/Olxce3wkKSl8Zm9yfGZyb20oPz1cXHMqKD86WydcIl18JCkpfGZ1bmN0aW9ufCg/OmdldHxzZXQpKD89XFxzKig/OlsjXFxbJFxcd1xceEEwLVxcdUZGRkZdfCQpKXxpZnxpbXBsZW1lbnRzfGltcG9ydHxpbnxpbnN0YW5jZW9mfGludGVyZmFjZXxsZXR8bmV3fG51bGx8b2Z8cGFja2FnZXxwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8cmV0dXJufHN0YXRpY3xzdXBlcnxzd2l0Y2h8dGhpc3x0aHJvd3x0cnl8dHlwZW9mfHVuZGVmaW5lZHx2YXJ8dm9pZHx3aGlsZXx3aXRofHlpZWxkKVxcYi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XSxcblx0Ly8gQWxsb3cgZm9yIGFsbCBub24tQVNDSUkgY2hhcmFjdGVycyAoU2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIwMDg0NDQpXG5cdCdmdW5jdGlvbic6IC8jPyg/IVxccylbXyRhLXpBLVpcXHhBMC1cXHVGRkZGXSg/Oig/IVxccylbJFxcd1xceEEwLVxcdUZGRkZdKSooPz1cXHMqKD86XFwuXFxzKig/OmFwcGx5fGJpbmR8Y2FsbClcXHMqKT9cXCgpLyxcblx0J251bWJlcic6IHtcblx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHQvKF58W15cXHckXSkvLnNvdXJjZSArXG5cdFx0XHQnKD86JyArXG5cdFx0XHQoXG5cdFx0XHRcdC8vIGNvbnN0YW50XG5cdFx0XHRcdC9OYU58SW5maW5pdHkvLnNvdXJjZSArXG5cdFx0XHRcdCd8JyArXG5cdFx0XHRcdC8vIGJpbmFyeSBpbnRlZ2VyXG5cdFx0XHRcdC8wW2JCXVswMV0rKD86X1swMV0rKSpuPy8uc291cmNlICtcblx0XHRcdFx0J3wnICtcblx0XHRcdFx0Ly8gb2N0YWwgaW50ZWdlclxuXHRcdFx0XHQvMFtvT11bMC03XSsoPzpfWzAtN10rKSpuPy8uc291cmNlICtcblx0XHRcdFx0J3wnICtcblx0XHRcdFx0Ly8gaGV4YWRlY2ltYWwgaW50ZWdlclxuXHRcdFx0XHQvMFt4WF1bXFxkQS1GYS1mXSsoPzpfW1xcZEEtRmEtZl0rKSpuPy8uc291cmNlICtcblx0XHRcdFx0J3wnICtcblx0XHRcdFx0Ly8gZGVjaW1hbCBiaWdpbnRcblx0XHRcdFx0L1xcZCsoPzpfXFxkKykqbi8uc291cmNlICtcblx0XHRcdFx0J3wnICtcblx0XHRcdFx0Ly8gZGVjaW1hbCBudW1iZXIgKGludGVnZXIgb3IgZmxvYXQpIGJ1dCBubyBiaWdpbnRcblx0XHRcdFx0Lyg/OlxcZCsoPzpfXFxkKykqKD86XFwuKD86XFxkKyg/Ol9cXGQrKSopPyk/fFxcLlxcZCsoPzpfXFxkKykqKSg/OltFZV1bKy1dP1xcZCsoPzpfXFxkKykqKT8vLnNvdXJjZVxuXHRcdFx0KSArXG5cdFx0XHQnKScgK1xuXHRcdFx0Lyg/IVtcXHckXSkvLnNvdXJjZVxuXHRcdCksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnb3BlcmF0b3InOiAvLS18XFwrXFwrfFxcKlxcKj0/fD0+fCYmPT98XFx8XFx8PT98WyE9XT09fDw8PT98Pj4+Pz0/fFstKyovJSZ8XiE9PD5dPT98XFwuezN9fFxcP1xcPz0/fFxcP1xcLj98W346XS9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFsnY2xhc3MtbmFtZSddWzBdLnBhdHRlcm4gPSAvKFxcYig/OmNsYXNzfGV4dGVuZHN8aW1wbGVtZW50c3xpbnN0YW5jZW9mfGludGVyZmFjZXxuZXcpXFxzKylbXFx3LlxcXFxdKy87XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2phdmFzY3JpcHQnLCAna2V5d29yZCcsIHtcblx0J3JlZ2V4Jzoge1xuXHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdC8vIGxvb2tiZWhpbmRcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvbm8tZHVwZS1jaGFyYWN0ZXJzLWNoYXJhY3Rlci1jbGFzc1xuXHRcdFx0LygoPzpefFteJFxcd1xceEEwLVxcdUZGRkYuXCInXFxdKVxcc118XFxiKD86cmV0dXJufHlpZWxkKSlcXHMqKS8uc291cmNlICtcblx0XHRcdC8vIFJlZ2V4IHBhdHRlcm46XG5cdFx0XHQvLyBUaGVyZSBhcmUgMiByZWdleCBwYXR0ZXJucyBoZXJlLiBUaGUgUmVnRXhwIHNldCBub3RhdGlvbiBwcm9wb3NhbCBhZGRlZCBzdXBwb3J0IGZvciBuZXN0ZWQgY2hhcmFjdGVyXG5cdFx0XHQvLyBjbGFzc2VzIGlmIHRoZSBgdmAgZmxhZyBpcyBwcmVzZW50LiBVbmZvcnR1bmF0ZWx5LCBuZXN0ZWQgQ0NzIGFyZSBib3RoIGNvbnRleHQtZnJlZSBhbmQgaW5jb21wYXRpYmxlXG5cdFx0XHQvLyB3aXRoIHRoZSBvbmx5IHN5bnRheCwgc28gd2UgaGF2ZSB0byBkZWZpbmUgMiBkaWZmZXJlbnQgcmVnZXggcGF0dGVybnMuXG5cdFx0XHQvXFwvLy5zb3VyY2UgK1xuXHRcdFx0Jyg/OicgK1xuXHRcdFx0Lyg/OlxcWyg/OlteXFxdXFxcXFxcclxcbl18XFxcXC4pKlxcXXxcXFxcLnxbXi9cXFxcXFxbXFxyXFxuXSkrXFwvW2RnaW15dXNdezAsN30vLnNvdXJjZSArXG5cdFx0XHQnfCcgK1xuXHRcdFx0Ly8gYHZgIGZsYWcgc3ludGF4LiBUaGlzIHN1cHBvcnRzIDMgbGV2ZWxzIG9mIG5lc3RlZCBjaGFyYWN0ZXIgY2xhc3Nlcy5cblx0XHRcdC8oPzpcXFsoPzpbXltcXF1cXFxcXFxyXFxuXXxcXFxcLnxcXFsoPzpbXltcXF1cXFxcXFxyXFxuXXxcXFxcLnxcXFsoPzpbXltcXF1cXFxcXFxyXFxuXXxcXFxcLikqXFxdKSpcXF0pKlxcXXxcXFxcLnxbXi9cXFxcXFxbXFxyXFxuXSkrXFwvW2RnaW15dXNdezAsN312W2RnaW15dXNdezAsN30vLnNvdXJjZSArXG5cdFx0XHQnKScgK1xuXHRcdFx0Ly8gbG9va2FoZWFkXG5cdFx0XHQvKD89KD86XFxzfFxcL1xcKig/OlteKl18XFwqKD8hXFwvKSkqXFwqXFwvKSooPzokfFtcXHJcXG4sLjs6fSlcXF1dfFxcL1xcLykpLy5zb3VyY2Vcblx0XHQpLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3JlZ2V4LXNvdXJjZSc6IHtcblx0XHRcdFx0cGF0dGVybjogL14oXFwvKVtcXHNcXFNdKyg/PVxcL1thLXpdKiQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1yZWdleCcsXG5cdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnJlZ2V4XG5cdFx0XHR9LFxuXHRcdFx0J3JlZ2V4LWRlbGltaXRlcic6IC9eXFwvfFxcLyQvLFxuXHRcdFx0J3JlZ2V4LWZsYWdzJzogL15bYS16XSskLyxcblx0XHR9XG5cdH0sXG5cdC8vIFRoaXMgbXVzdCBiZSBkZWNsYXJlZCBiZWZvcmUga2V5d29yZCBiZWNhdXNlIHdlIHVzZSBcImZ1bmN0aW9uXCIgaW5zaWRlIHRoZSBsb29rLWZvcndhcmRcblx0J2Z1bmN0aW9uLXZhcmlhYmxlJzoge1xuXHRcdHBhdHRlcm46IC8jPyg/IVxccylbXyRhLXpBLVpcXHhBMC1cXHVGRkZGXSg/Oig/IVxccylbJFxcd1xceEEwLVxcdUZGRkZdKSooPz1cXHMqWz06XVxccyooPzphc3luY1xccyopPyg/OlxcYmZ1bmN0aW9uXFxifCg/OlxcKCg/OlteKCldfFxcKFteKCldKlxcKSkqXFwpfCg/IVxccylbXyRhLXpBLVpcXHhBMC1cXHVGRkZGXSg/Oig/IVxccylbJFxcd1xceEEwLVxcdUZGRkZdKSopXFxzKj0+KSkvLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdH0sXG5cdCdwYXJhbWV0ZXInOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhmdW5jdGlvbig/OlxccysoPyFcXHMpW18kYS16QS1aXFx4QTAtXFx1RkZGRl0oPzooPyFcXHMpWyRcXHdcXHhBMC1cXHVGRkZGXSkqKT9cXHMqXFwoXFxzKikoPyFcXHMpKD86W14oKVxcc118XFxzKyg/IVtcXHMpXSl8XFwoW14oKV0qXFwpKSsoPz1cXHMqXFwpKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteJFxcd1xceEEwLVxcdUZGRkZdKSg/IVxccylbXyRhLXpcXHhBMC1cXHVGRkZGXSg/Oig/IVxccylbJFxcd1xceEEwLVxcdUZGRkZdKSooPz1cXHMqPT4pL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhcXChcXHMqKSg/IVxccykoPzpbXigpXFxzXXxcXHMrKD8hW1xccyldKXxcXChbXigpXSpcXCkpKyg/PVxccypcXClcXHMqPT4pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0XG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKCg/OlxcYnxcXHN8XikoPyEoPzphc3xhc3luY3xhd2FpdHxicmVha3xjYXNlfGNhdGNofGNsYXNzfGNvbnN0fGNvbnRpbnVlfGRlYnVnZ2VyfGRlZmF1bHR8ZGVsZXRlfGRvfGVsc2V8ZW51bXxleHBvcnR8ZXh0ZW5kc3xmaW5hbGx5fGZvcnxmcm9tfGZ1bmN0aW9ufGdldHxpZnxpbXBsZW1lbnRzfGltcG9ydHxpbnxpbnN0YW5jZW9mfGludGVyZmFjZXxsZXR8bmV3fG51bGx8b2Z8cGFja2FnZXxwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8cmV0dXJufHNldHxzdGF0aWN8c3VwZXJ8c3dpdGNofHRoaXN8dGhyb3d8dHJ5fHR5cGVvZnx1bmRlZmluZWR8dmFyfHZvaWR8d2hpbGV8d2l0aHx5aWVsZCkoPyFbJFxcd1xceEEwLVxcdUZGRkZdKSkoPzooPyFcXHMpW18kYS16QS1aXFx4QTAtXFx1RkZGRl0oPzooPyFcXHMpWyRcXHdcXHhBMC1cXHVGRkZGXSkqXFxzKilcXChcXHMqfFxcXVxccypcXChcXHMqKSg/IVxccykoPzpbXigpXFxzXXxcXHMrKD8hW1xccyldKXxcXChbXigpXSpcXCkpKyg/PVxccypcXClcXHMqXFx7KS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFxuXHRcdH1cblx0XSxcblx0J2NvbnN0YW50JzogL1xcYltBLVpdKD86W0EtWl9dfFxcZHg/KSpcXGIvXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnamF2YXNjcmlwdCcsICdzdHJpbmcnLCB7XG5cdCdoYXNoYmFuZyc6IHtcblx0XHRwYXR0ZXJuOiAvXiMhLiovLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ2NvbW1lbnQnXG5cdH0sXG5cdCd0ZW1wbGF0ZS1zdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL2AoPzpcXFxcW1xcc1xcU118XFwkXFx7KD86W157fV18XFx7KD86W157fV18XFx7W159XSpcXH0pKlxcfSkrXFx9fCg/IVxcJFxceylbXlxcXFxgXSkqYC8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3RlbXBsYXRlLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXmB8YCQvLFxuXHRcdFx0XHRhbGlhczogJ3N0cmluZydcblx0XHRcdH0sXG5cdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFteXFxcXF0pKD86XFxcXHsyfSkqKVxcJFxceyg/Oltee31dfFxceyg/Oltee31dfFxce1tefV0qXFx9KSpcXH0pK1xcfS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL15cXCRcXHt8XFx9JC8sXG5cdFx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0cmVzdDogUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdH1cblx0fSxcblx0J3N0cmluZy1wcm9wZXJ0eSc6IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58Wyx7XSlbIFxcdF0qKShbXCInXSkoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXwoPyFcXDIpW15cXFxcXFxyXFxuXSkqXFwyKD89XFxzKjopL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2phdmFzY3JpcHQnLCAnb3BlcmF0b3InLCB7XG5cdCdsaXRlcmFsLXByb3BlcnR5Jzoge1xuXHRcdHBhdHRlcm46IC8oKD86XnxbLHtdKVsgXFx0XSopKD8hXFxzKVtfJGEtekEtWlxceEEwLVxcdUZGRkZdKD86KD8hXFxzKVskXFx3XFx4QTAtXFx1RkZGRl0pKig/PVxccyo6KS9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcbn0pO1xuXG5pZiAoUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cCkge1xuXHRQcmlzbS5sYW5ndWFnZXMubWFya3VwLnRhZy5hZGRJbmxpbmVkKCdzY3JpcHQnLCAnamF2YXNjcmlwdCcpO1xuXG5cdC8vIGFkZCBhdHRyaWJ1dGUgc3VwcG9ydCBmb3IgYWxsIERPTSBldmVudHMuXG5cdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50cyNTdGFuZGFyZF9ldmVudHNcblx0UHJpc20ubGFuZ3VhZ2VzLm1hcmt1cC50YWcuYWRkQXR0cmlidXRlKFxuXHRcdC9vbig/OmFib3J0fGJsdXJ8Y2hhbmdlfGNsaWNrfGNvbXBvc2l0aW9uKD86ZW5kfHN0YXJ0fHVwZGF0ZSl8ZGJsY2xpY2t8ZXJyb3J8Zm9jdXMoPzppbnxvdXQpP3xrZXkoPzpkb3dufHVwKXxsb2FkfG1vdXNlKD86ZG93bnxlbnRlcnxsZWF2ZXxtb3ZlfG91dHxvdmVyfHVwKXxyZXNldHxyZXNpemV8c2Nyb2xsfHNlbGVjdHxzbG90Y2hhbmdlfHN1Ym1pdHx1bmxvYWR8d2hlZWwpLy5zb3VyY2UsXG5cdFx0J2phdmFzY3JpcHQnXG5cdCk7XG59XG5cblByaXNtLmxhbmd1YWdlcy5qcyA9IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0O1xuXG5QcmlzbS5sYW5ndWFnZXMuYWJhcCA9IHtcblx0J2NvbW1lbnQnOiAvXlxcKi4qL20sXG5cdCdzdHJpbmcnOiAvKGB8JykoPzpcXFxcLnwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0J3N0cmluZy10ZW1wbGF0ZSc6IHtcblx0XHRwYXR0ZXJuOiAvKFt8fV0pKD86XFxcXC58W15cXFxcfHtcXHJcXG5dKSooPz1bfHtdKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3N0cmluZydcblx0fSxcblx0LyogRW5kIE9mIExpbmUgY29tbWVudHMgc2hvdWxkIG5vdCBpbnRlcmZlcmUgd2l0aCBzdHJpbmdzIHdoZW4gdGhlXG5cdHF1b3RlIGNoYXJhY3RlciBvY2N1cnMgd2l0aGluIHRoZW0uIFdlIGFzc3VtZSBhIHN0cmluZyBiZWluZyBoaWdobGlnaHRlZFxuXHRpbnNpZGUgYW4gRU9MIGNvbW1lbnQgaXMgbW9yZSBhY2NlcHRhYmxlIHRoYW4gdGhlIG9wcG9zaXRlLlxuXHQqL1xuXHQnZW9sLWNvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyhefFxccylcIi4qL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2NvbW1lbnQnXG5cdH0sXG5cdCdrZXl3b3JkJzoge1xuXHRcdHBhdHRlcm46IC8oXFxzfFxcLnxeKSg/OlxcKi1JTlBVVHxcXD9UT3xBQkFQLVNPVVJDRXxBQkJSRVZJQVRFRHxBQlN8QUJTVFJBQ1R8QUNDRVBUfEFDQ0VQVElOR3xBQ0NFU1NQT0xJQ1l8QUNDT1JESU5HfEFDT1N8QUNUSVZBVElPTnxBQ1RVQUx8QUREfEFERC1DT1JSRVNQT05ESU5HfEFESkFDRU5UfEFGVEVSfEFMSUFTfEFMSUFTRVN8QUxJR058QUxMfEFMTE9DQVRFfEFMUEhBfEFOQUxZU0lTfEFOQUxZWkVSfEFORHxBTll8QVBQRU5EfEFQUEVOREFHRXxBUFBFTkRJTkd8QVBQTElDQVRJT058QVJDSElWRXxBUkVBfEFSSVRITUVUSUN8QVN8QVNDRU5ESU5HfEFTSU58QVNQRUNUfEFTU0VSVHxBU1NJR058QVNTSUdORUR8QVNTSUdOSU5HfEFTU09DSUFUSU9OfEFTWU5DSFJPTk9VU3xBVHxBVEFOfEFUVFJJQlVURVN8QVVUSE9SSVRZfEFVVEhPUklUWS1DSEVDS3xBVkd8QkFDS3xCQUNLR1JPVU5EfEJBQ0tVUHxCQUNLV0FSRHxCQURJfEJBU0V8QkVGT1JFfEJFR0lOfEJFVFdFRU58QklHfEJJTkFSWXxCSU5ESU5HfEJJVHxCSVQtQU5EfEJJVC1OT1R8QklULU9SfEJJVC1YT1J8QkxBQ0t8QkxBTkt8QkxBTktTfEJMT0J8QkxPQ0t8QkxPQ0tTfEJMVUV8Qk9VTkR8Qk9VTkRBUklFU3xCT1VORFN8Qk9YRUR8QlJFQUstUE9JTlR8QlR8QlVGRkVSfEJZfEJZUEFTU0lOR3xCWVRFfEJZVEUtQ0F8QllURS1DTnxCWVRFLUNPfEJZVEUtQ1N8QllURS1OQXxCWVRFLU5TfEJZVEUtT1JERVJ8Q3xDQXxDQUxMfENBTExJTkd8Q0FTRXxDQVNUfENBU1RJTkd8Q0FUQ0h8Q0VJTHxDRU5URVJ8Q0VOVEVSRUR8Q0hBSU58Q0hBSU4tSU5QVVR8Q0hBSU4tUkVRVUVTVHxDSEFOR0V8Q0hBTkdJTkd8Q0hBTk5FTFN8Q0hBUi1UTy1IRVh8Q0hBUkFDVEVSfENIQVJMRU58Q0hFQ0t8Q0hFQ0tCT1h8Q0lSQ1VMQVJ8Q0lffENMQVNTfENMQVNTLUNPRElOR3xDTEFTUy1EQVRBfENMQVNTLUVWRU5UU3xDTEFTUy1NRVRIT0RTfENMQVNTLVBPT0x8Q0xFQU5VUHxDTEVBUnxDTElFTlR8Q0xPQnxDTE9DS3xDTE9TRXxDTnxDTlR8Q098Q09BTEVTQ0V8Q09ERXxDT0RJTkd8Q09MTEVDVHxDT0xPUnxDT0xVTU58Q09MVU1OU3xDT0xfQkFDS0dST1VORHxDT0xfR1JPVVB8Q09MX0hFQURJTkd8Q09MX0tFWXxDT0xfTkVHQVRJVkV8Q09MX05PUk1BTHxDT0xfUE9TSVRJVkV8Q09MX1RPVEFMfENPTU1FTlR8Q09NTUVOVFN8Q09NTUlUfENPTU1PTnxDT01NVU5JQ0FUSU9OfENPTVBBUklOR3xDT01QT05FTlR8Q09NUE9ORU5UU3xDT01QUkVTU0lPTnxDT01QVVRFfENPTkNBVHxDT05DQVRFTkFURXxDT05EfENPTkRFTlNFfENPTkRJVElPTnxDT05ORUNUfENPTk5FQ1RJT058Q09OU1RBTlRTfENPTlRFWFR8Q09OVEVYVFN8Q09OVElOVUV8Q09OVFJPTHxDT05UUk9MU3xDT05WfENPTlZFUlNJT058Q09OVkVSVHxDT1BJRVN8Q09QWXxDT1JSRVNQT05ESU5HfENPU3xDT1NIfENPVU5UfENPVU5UUll8Q09WRVJ8Q1B8Q1BJfENSRUFURXxDUkVBVElOR3xDUklUSUNBTHxDU3xDVVJSRU5DWXxDVVJSRU5DWV9DT05WRVJTSU9OfENVUlJFTlR8Q1VSU09SfENVUlNPUi1TRUxFQ1RJT058Q1VTVE9NRVJ8Q1VTVE9NRVItRlVOQ1RJT058REFOR0VST1VTfERBVEF8REFUQUJBU0V8REFUQUlORk98REFUQVNFVHxEQVRFfERBWUxJR0hUfERCTUFYTEVOfEREXFwvTU1cXC9ZWXxERFxcL01NXFwvWVlZWXxERE1NWVl8REVBTExPQ0FURXxERUNJTUFMU3xERUNJTUFMX1NISUZUfERFQ0xBUkFUSU9OU3xERUVQfERFRkFVTFR8REVGRVJSRUR8REVGSU5FfERFRklOSU5HfERFRklOSVRJT058REVMRVRFfERFTEVUSU5HfERFTUFORHxERVBBUlRNRU5UfERFU0NFTkRJTkd8REVTQ1JJQkV8REVTVElOQVRJT058REVUQUlMfERJQUxPR3xESVJFQ1RPUll8RElTQ09OTkVDVHxESVNQTEFZfERJU1BMQVktTU9ERXxESVNUQU5DRXxESVNUSU5DVHxESVZ8RElWSURFfERJVklERS1DT1JSRVNQT05ESU5HfERJVklTSU9OfERPfERVTU1ZfERVUExJQ0FURXxEVVBMSUNBVEVTfERVUkFUSU9OfERVUklOR3xEWU5BTUlDfERZTlBST3xFfEVBQ0h8RURJVHxFRElUT1ItQ0FMTHxFTFNFfEVMU0VJRnxFTVBUWXxFTkFCTEVEfEVOQUJMSU5HfEVOQ09ESU5HfEVORHxFTkQtRU5IQU5DRU1FTlQtU0VDVElPTnxFTkQtTElORVN8RU5ELU9GLURFRklOSVRJT058RU5ELU9GLUZJTEV8RU5ELU9GLVBBR0V8RU5ELU9GLVNFTEVDVElPTnxFTkRBVHxFTkRDQVNFfEVORENBVENIfEVORENIQUlOfEVORENMQVNTfEVORERPfEVOREVOSEFOQ0VNRU5UfEVOREVYRUN8RU5ERk9SfEVOREZPUk18RU5ERlVOQ1RJT058RU5ESUFOfEVORElGfEVORElOR3xFTkRJTlRFUkZBQ0V8RU5ETE9PUHxFTkRNRVRIT0R8RU5ETU9EVUxFfEVORE9OfEVORFBST1ZJREV8RU5EU0VMRUNUfEVORFRSWXxFTkRXSElMRXxFTkdJTkVFUklOR3xFTkhBTkNFTUVOVHxFTkhBTkNFTUVOVC1QT0lOVHxFTkhBTkNFTUVOVC1TRUNUSU9OfEVOSEFOQ0VNRU5UU3xFTlRSSUVTfEVOVFJZfEVOVklST05NRU5UfEVRfEVRVUFMfEVRVUlWfEVSUk9STUVTU0FHRXxFUlJPUlN8RVNDQVBFfEVTQ0FQSU5HfEVWRU5UfEVWRU5UU3xFWEFDVHxFWENFUFR8RVhDRVBUSU9OfEVYQ0VQVElPTi1UQUJMRXxFWENFUFRJT05TfEVYQ0xVREV8RVhDTFVESU5HfEVYRUN8RVhFQ1VURXxFWElTVFN8RVhJVHxFWElULUNPTU1BTkR8RVhQfEVYUEFORHxFWFBBTkRJTkd8RVhQSVJBVElPTnxFWFBMSUNJVHxFWFBPTkVOVHxFWFBPUlR8RVhQT1JUSU5HfEVYVEVORHxFWFRFTkRFRHxFWFRFTlNJT058RVhUUkFDVHxGQUlMfEZFVENIfEZJRUxEfEZJRUxELUdST1VQU3xGSUVMRC1TWU1CT0x8RklFTEQtU1lNQk9MU3xGSUVMRFN8RklMRXxGSUxURVJ8RklMVEVSLVRBQkxFfEZJTFRFUlN8RklOQUx8RklORHxGSVJTVHxGSVJTVC1MSU5FfEZJWEVELVBPSU5UfEZLRVF8RktHRXxGTE9PUnxGTFVTSHxGT05UfEZPUnxGT1JNfEZPUk1BVHxGT1JXQVJEfEZPVU5EfEZSQUN8RlJBTUV8RlJBTUVTfEZSRUV8RlJJRU5EU3xGUk9NfEZVTkNUSU9OfEZVTkNUSU9OLVBPT0x8RlVOQ1RJT05BTElUWXxGVVJUSEVSfEdBUFN8R0V8R0VORVJBVEV8R0VUfEdJVklOR3xHS0VRfEdLR0V8R0xPQkFMfEdSQU5UfEdSRUFURVJ8R1JFRU58R1JPVVB8R1JPVVBTfEdUfEhBTkRMRXxIQU5ETEVSfEhBUk1MRVNTfEhBU0hFRHxIQVZJTkd8SERCfEhFQUQtTElORVN8SEVBREVSfEhFQURFUlN8SEVBRElOR3xIRUxQLUlEfEhFTFAtUkVRVUVTVHxISURFfEhJR0h8SElOVHxIT0xEfEhPVFNQT1R8SXxJQ09OfElEfElERU5USUZJQ0FUSU9OfElERU5USUZJRVJ8SURTfElGfElHTk9SRXxJR05PUklOR3xJTU1FRElBVEVMWXxJTVBMRU1FTlRBVElPTnxJTVBMRU1FTlRBVElPTlN8SU1QTEVNRU5URUR8SU1QTElDSVR8SU1QT1JUfElNUE9SVElOR3xJTnxJTkFDVElWRXxJTkNMfElOQ0xVREV8SU5DTFVERVN8SU5DTFVESU5HfElOQ1JFTUVOVHxJTkRFWHxJTkRFWC1MSU5FfElORk9UWVBFU3xJTkhFUklUSU5HfElOSVR8SU5JVElBTHxJTklUSUFMSVpBVElPTnxJTk5FUnxJTk9VVHxJTlBVVHxJTlNFUlR8SU5TVEFOQ0VTfElOVEVOU0lGSUVEfElOVEVSRkFDRXxJTlRFUkZBQ0UtUE9PTHxJTlRFUkZBQ0VTfElOVEVSTkFMfElOVEVSVkFMU3xJTlRPfElOVkVSU0V8SU5WRVJURUQtREFURXxJU3xJU098SVRFUkFUT1J8SVROT3xKT0J8Sk9JTnxLRUVQfEtFRVBJTkd8S0VSTkVMfEtFWXxLRVlTfEtFWVdPUkRTfEtJTkR8TEFOR1VBR0V8TEFTVHxMQVRFfExBWU9VVHxMRXxMRUFESU5HfExFQVZFfExFRlR8TEVGVC1KVVNUSUZJRUR8TEVGVFBMVVN8TEVGVFNQQUNFfExFR0FDWXxMRU5HVEh8TEVTU3xMRVR8TEVWRUx8TEVWRUxTfExJS0V8TElORXxMSU5FLUNPVU5UfExJTkUtU0VMRUNUSU9OfExJTkUtU0laRXxMSU5FRkVFRHxMSU5FU3xMSVNUfExJU1QtUFJPQ0VTU0lOR3xMSVNUQk9YfExJVFRMRXxMTEFOR3xMT0FEfExPQUQtT0YtUFJPR1JBTXxMT0J8TE9DQUx8TE9DQUxFfExPQ0FUT1J8TE9HfExPRy1QT0lOVHxMT0cxMHxMT0dGSUxFfExPR0lDQUx8TE9OR3xMT09QfExPV3xMT1dFUnxMUEFEfExQSXxMVHxNfE1BSUx8TUFJTnxNQUpPUi1JRHxNQVBQSU5HfE1BUkdJTnxNQVJLfE1BU0t8TUFUQ0h8TUFUQ0hDT0RFfE1BWHxNQVhJTVVNfE1FRElVTXxNRU1CRVJTfE1FTU9SWXxNRVNIfE1FU1NBR0V8TUVTU0FHRS1JRHxNRVNTQUdFU3xNRVNTQUdJTkd8TUVUSE9EfE1FVEhPRFN8TUlOfE1JTklNVU18TUlOT1ItSUR8TU1cXC9ERFxcL1lZfE1NXFwvRERcXC9ZWVlZfE1NRERZWXxNT0R8TU9ERXxNT0RJRnxNT0RJRklFUnxNT0RJRll8TU9EVUxFfE1PVkV8TU9WRS1DT1JSRVNQT05ESU5HfE1VTFRJUExZfE1VTFRJUExZLUNPUlJFU1BPTkRJTkd8TkF8TkFNRXxOQU1FVEFCfE5BVElWRXxOQnxORXxORVNURUR8TkVTVElOR3xORVd8TkVXLUxJTkV8TkVXLVBBR0V8TkVXLVNFQ1RJT058TkVYVHxOT3xOTy1ESVNQTEFZfE5PLUVYVEVOU0lPTnxOTy1HQVB8Tk8tR0FQU3xOTy1HUk9VUElOR3xOTy1IRUFESU5HfE5PLVNDUk9MTElOR3xOTy1TSUdOfE5PLVRJVExFfE5PLVRPUE9GUEFHRXxOTy1aRVJPfE5PREV8Tk9ERVN8Tk9OLVVOSUNPREV8Tk9OLVVOSVFVRXxOT1R8TlB8TlN8TlVMTHxOVU1CRVJ8TlVNT0ZDSEFSfE98T0JKRUNUfE9CSkVDVFN8T0JMSUdBVE9SWXxPQ0NVUlJFTkNFfE9DQ1VSUkVOQ0VTfE9DQ1VSU3xPRnxPRkZ8T0ZGU0VUfE9MRXxPTnxPTkxZfE9QRU58T1BUSU9OfE9QVElPTkFMfE9QVElPTlN8T1J8T1JERVJ8T1RIRVJ8T1RIRVJTfE9VVHxPVVRFUnxPVVRQVVR8T1VUUFVULUxFTkdUSHxPVkVSRkxPV3xPVkVSTEFZfFBBQ0t8UEFDS0FHRXxQQUR8UEFERElOR3xQQUdFfFBBR0VTfFBBUkFNRVRFUnxQQVJBTUVURVItVEFCTEV8UEFSQU1FVEVSU3xQQVJUfFBBUlRJQUxMWXxQQVRURVJOfFBFUkNFTlRBR0V8UEVSRk9STXxQRVJGT1JNSU5HfFBFUlNPTnxQRnxQRi1TVEFUVVN8UElOS3xQTEFDRVN8UE9PTHxQT1NJVElPTnxQT1NfSElHSHxQT1NfTE9XfFBSQUdNQVN8UFJFQ09NUElMRUR8UFJFRkVSUkVEfFBSRVNFUlZJTkd8UFJJTUFSWXxQUklOVHxQUklOVC1DT05UUk9MfFBSSU9SSVRZfFBSSVZBVEV8UFJPQ0VEVVJFfFBST0NFU1N8UFJPR1JBTXxQUk9QRVJUWXxQUk9URUNURUR8UFJPVklERXxQVUJMSUN8UFVTSEJVVFRPTnxQVVR8UVVFVUUtT05MWXxRVUlDS0lORk98UkFESU9CVVRUT058UkFJU0V8UkFJU0lOR3xSQU5HRXxSQU5HRVN8UkFXfFJFQUR8UkVBRC1PTkxZfFJFQURFUnxSRUNFSVZFfFJFQ0VJVkVEfFJFQ0VJVkVSfFJFQ0VJVklOR3xSRUR8UkVERUZJTklUSU9OfFJFRFVDRXxSRURVQ0VEfFJFRnxSRUZFUkVOQ0V8UkVGUkVTSHxSRUdFWHxSRUpFQ1R8UkVNT1RFfFJFTkFNSU5HfFJFUExBQ0V8UkVQTEFDRU1FTlR8UkVQTEFDSU5HfFJFUE9SVHxSRVFVRVNUfFJFUVVFU1RFRHxSRVNFUlZFfFJFU0VUfFJFU09MVVRJT058UkVTUEVDVElOR3xSRVNQT05TSUJMRXxSRVNVTFR8UkVTVUxUU3xSRVNVTUFCTEV8UkVTVU1FfFJFVFJZfFJFVFVSTnxSRVRVUk5DT0RFfFJFVFVSTklOR3xSSUdIVHxSSUdIVC1KVVNUSUZJRUR8UklHSFRQTFVTfFJJR0hUU1BBQ0V8UklTS3xSTUNfQ09NTVVOSUNBVElPTl9GQUlMVVJFfFJNQ19JTlZBTElEX1NUQVRVU3xSTUNfU1lTVEVNX0ZBSUxVUkV8Uk9MRXxST0xMQkFDS3xST1VORHxST1dTfFJUVEl8UlVOfFNBUHxTQVAtU1BPT0x8U0FWSU5HfFNDQUxFX1BSRVNFUlZJTkd8U0NBTEVfUFJFU0VSVklOR19TQ0lFTlRJRklDfFNDQU58U0NJRU5USUZJQ3xTQ0lFTlRJRklDX1dJVEhfTEVBRElOR19aRVJPfFNDUkVFTnxTQ1JPTEx8U0NST0xMLUJPVU5EQVJZfFNDUk9MTElOR3xTRUFSQ0h8U0VDT05EQVJZfFNFQ09ORFN8U0VDVElPTnxTRUxFQ1R8U0VMRUNULU9QVElPTlN8U0VMRUNUSU9OfFNFTEVDVElPTi1TQ1JFRU58U0VMRUNUSU9OLVNFVHxTRUxFQ1RJT04tU0VUU3xTRUxFQ1RJT04tVEFCTEV8U0VMRUNUSU9OU3xTRUxFQ1RPUnxTRU5EfFNFUEFSQVRFfFNFUEFSQVRFRHxTRVR8U0hBUkVEfFNISUZUfFNIT1JUfFNIT1JURFVNUC1JRHxTSUdOfFNJR05fQVNfUE9TVEZJWHxTSU1QTEV8U0lOfFNJTkdMRXxTSU5IfFNJWkV8U0tJUHxTS0lQUElOR3xTTUFSVHxTT01FfFNPUlR8U09SVEFCTEV8U09SVEVEfFNPVVJDRXxTUEFDRXxTUEVDSUZJRUR8U1BMSVR8U1BPT0x8U1BPVFN8U1FMfFNRTFNDUklQVHxTUVJUfFNUQUJMRXxTVEFNUHxTVEFOREFSRHxTVEFSVC1PRi1TRUxFQ1RJT058U1RBUlRJTkd8U1RBVEV8U1RBVEVNRU5UfFNUQVRFTUVOVFN8U1RBVElDfFNUQVRJQ1N8U1RBVFVTSU5GT3xTVEVQLUxPT1B8U1RPUHxTVFJMRU58U1RSVUNUVVJFfFNUUlVDVFVSRVN8U1RZTEV8U1VCS0VZfFNVQk1BVENIRVN8U1VCTUlUfFNVQlJPVVRJTkV8U1VCU0NSRUVOfFNVQlNUUklOR3xTVUJUUkFDVHxTVUJUUkFDVC1DT1JSRVNQT05ESU5HfFNVRkZJWHxTVU18U1VNTUFSWXxTVU1NSU5HfFNVUFBMSUVEfFNVUFBMWXxTVVBQUkVTU3xTV0lUQ0h8U1dJVENIU1RBVEVTfFNZTUJPTHxTWU5DUE9JTlRTfFNZTlRBWHxTWU5UQVgtQ0hFQ0t8U1lOVEFYLVRSQUNFfFNZU1RFTS1DQUxMfFNZU1RFTS1FWENFUFRJT05TfFNZU1RFTS1FWElUfFRBQnxUQUJCRUR8VEFCTEV8VEFCTEVTfFRBQkxFVklFV3xUQUJTVFJJUHxUQU58VEFOSHxUQVJHRVR8VEFTS3xUQVNLU3xURVNUfFRFU1RJTkd8VEVYVHxURVhUUE9PTHxUSEVOfFRIUk9XfFRJTUV8VElNRVN8VElNRVNUQU1QfFRJTUVaT05FfFRJVExFfFRJVExFLUxJTkVTfFRJVExFQkFSfFRPfFRPS0VOSVpBVElPTnxUT0tFTlN8VE9QLUxJTkVTfFRPUC1PRi1QQUdFfFRSQUNFLUZJTEV8VFJBQ0UtVEFCTEV8VFJBSUxJTkd8VFJBTlNBQ1RJT058VFJBTlNGRVJ8VFJBTlNGT1JNQVRJT058VFJBTlNMQVRFfFRSQU5TUE9SVElOR3xUUk1BQ3xUUlVOQ3xUUlVOQ0FURXxUUlVOQ0FUSU9OfFRSWXxUWVBFfFRZUEUtUE9PTHxUWVBFLVBPT0xTfFRZUEVTfFVMSU5FfFVOQVNTSUdOfFVOREVSfFVOSUNPREV8VU5JT058VU5JUVVFfFVOSVR8VU5JVF9DT05WRVJTSU9OfFVOSVh8VU5QQUNLfFVOVElMfFVOV0lORHxVUHxVUERBVEV8VVBQRVJ8VVNFUnxVU0VSLUNPTU1BTkR8VVNJTkd8VVRGLTh8VkFMSUR8VkFMVUV8VkFMVUUtUkVRVUVTVHxWQUxVRVN8VkFSWXxWQVJZSU5HfFZFUklGSUNBVElPTi1NRVNTQUdFfFZFUlNJT058VklBfFZJRVd8VklTSUJMRXxXQUlUfFdBUk5JTkd8V0hFTnxXSEVORVZFUnxXSEVSRXxXSElMRXxXSURUSHxXSU5ET1d8V0lORE9XU3xXSVRIfFdJVEgtSEVBRElOR3xXSVRILVRJVExFfFdJVEhPVVR8V09SRHxXT1JLfFdSSVRFfFdSSVRFUnxYfFhNTHxYT1J8WFNEfFhTVFJMRU58WUVMTE9XfFlFU3xZWU1NRER8WnxaRVJPfFpPTkUpKD8hW1xcdy1dKS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0LyogTnVtYmVycyBjYW4gYmUgb25seSBpbnRlZ2Vycy4gRGVjaW1hbCBvciBIZXggYXBwZWFyIG9ubHkgYXMgc3RyaW5ncyAqL1xuXHQnbnVtYmVyJzogL1xcYlxcZCtcXGIvLFxuXHQvKiBPcGVyYXRvcnMgbXVzdCBhbHdheXMgYmUgc3Vycm91bmRlZCBieSB3aGl0ZXNwYWNlLCB0aGV5IGNhbm5vdCBiZSBwdXRcblx0YWRqYWNlbnQgdG8gb3BlcmFuZHMuXG5cdCovXG5cdCdvcGVyYXRvcic6IHtcblx0XHRwYXR0ZXJuOiAvKFxccykoPzpcXCpcXCo/fDxbPT5dP3w+PT98XFw/PXxbLStcXC89XSkoPz1cXHMpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdzdHJpbmctb3BlcmF0b3InOiB7XG5cdFx0cGF0dGVybjogLyhcXHMpJiY/KD89XFxzKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHQvKiBUaGUgb2ZmaWNpYWwgZWRpdG9yIGhpZ2hsaWdodHMgKi9cblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCd0b2tlbi1vcGVyYXRvcic6IFt7XG5cdFx0LyogU3BlY2lhbCBvcGVyYXRvcnMgdXNlZCB0byBhY2Nlc3Mgc3RydWN0dXJlIGNvbXBvbmVudHMsIGNsYXNzIG1ldGhvZHMvYXR0cmlidXRlcywgZXRjLiAqL1xuXHRcdHBhdHRlcm46IC8oXFx3KSg/Oi0+P3w9Pnxbfnx7fV0pKD89XFx3KS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHR9LCB7XG5cdFx0LyogU3BlY2lhbCB0b2tlbnMgdXNlZCBkbyBkZWxpbWl0IHN0cmluZyB0ZW1wbGF0ZXMgKi9cblx0XHRwYXR0ZXJuOiAvW3x7fV0vLFxuXHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdH1dLFxuXHQncHVuY3R1YXRpb24nOiAvWywuOigpXS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgY29yZVJ1bGVzID0gJyg/OkFMUEhBfEJJVHxDSEFSfENSfENSTEZ8Q1RMfERJR0lUfERRVU9URXxIRVhESUd8SFRBQnxMRnxMV1NQfE9DVEVUfFNQfFZDSEFSfFdTUCknO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5hYm5mID0ge1xuXHRcdCdjb21tZW50JzogLzsuKi8sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC8oPzolW2lzXSk/XCJbXlwiXFxuXFxyXSpcIi8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL14lW2lzXS9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdyYW5nZSc6IHtcblx0XHRcdHBhdHRlcm46IC8lKD86YlswMV0rLVswMV0rfGRcXGQrLVxcZCt8eFtBLUZcXGRdKy1bQS1GXFxkXSspL2ksXG5cdFx0XHRhbGlhczogJ251bWJlcidcblx0XHR9LFxuXHRcdCd0ZXJtaW5hbCc6IHtcblx0XHRcdHBhdHRlcm46IC8lKD86YlswMV0rKD86XFwuWzAxXSspKnxkXFxkKyg/OlxcLlxcZCspKnx4W0EtRlxcZF0rKD86XFwuW0EtRlxcZF0rKSopL2ksXG5cdFx0XHRhbGlhczogJ251bWJlcidcblx0XHR9LFxuXHRcdCdyZXBldGl0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXFx3LV0pKD86XFxkKlxcKlxcZCp8XFxkKykvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0fSxcblx0XHQnZGVmaW5pdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopKD86W2Etel1bXFx3LV0qfDxbXjw+XFxyXFxuXSo+KSg/PVxccyo9KS9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAna2V5d29yZCcsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLzx8Pi9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdjb3JlLXJ1bGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJyg/OihefFtePFxcXFx3LV0pJyArIGNvcmVSdWxlcyArICd8PCcgKyBjb3JlUnVsZXMgKyAnPikoPyFbXFxcXHctXSknLCAnaScpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiBbJ3J1bGUnLCAnY29uc3RhbnQnXSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvPHw+L1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3J1bGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W148XFx3LV0pW2Etel1bXFx3LV0qfDxbXjw+XFxyXFxuXSo+L2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC88fD4vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnb3BlcmF0b3InOiAvPVxcLz98XFwvLyxcblx0XHQncHVuY3R1YXRpb24nOiAvWygpXFxbXFxdXS9cblx0fTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuYWN0aW9uc2NyaXB0ID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnamF2YXNjcmlwdCcsIHtcblx0J2tleXdvcmQnOiAvXFxiKD86YXN8YnJlYWt8Y2FzZXxjYXRjaHxjbGFzc3xjb25zdHxkZWZhdWx0fGRlbGV0ZXxkb3xkeW5hbWljfGVhY2h8ZWxzZXxleHRlbmRzfGZpbmFsfGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufGdldHxpZnxpbXBsZW1lbnRzfGltcG9ydHxpbnxpbmNsdWRlfGluc3RhbmNlb2Z8aW50ZXJmYWNlfGludGVybmFsfGlzfG5hbWVzcGFjZXxuYXRpdmV8bmV3fG51bGx8b3ZlcnJpZGV8cGFja2FnZXxwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8cmV0dXJufHNldHxzdGF0aWN8c3VwZXJ8c3dpdGNofHRoaXN8dGhyb3d8dHJ5fHR5cGVvZnx1c2V8dmFyfHZvaWR8d2hpbGV8d2l0aClcXGIvLFxuXHQnb3BlcmF0b3InOiAvXFwrXFwrfC0tfCg/OlsrXFwtKlxcLyVeXXwmJj98XFx8XFx8P3w8PD98Pj4/Pj98WyE9XT0/KT0/fFt+P0BdL1xufSk7XG5QcmlzbS5sYW5ndWFnZXMuYWN0aW9uc2NyaXB0WydjbGFzcy1uYW1lJ10uYWxpYXMgPSAnZnVuY3Rpb24nO1xuXG4vLyBkb2Vzbid0IHdvcmsgd2l0aCBBUyBiZWNhdXNlIEFTIGlzIHRvbyBjb21wbGV4XG5kZWxldGUgUHJpc20ubGFuZ3VhZ2VzLmFjdGlvbnNjcmlwdFsncGFyYW1ldGVyJ107XG5kZWxldGUgUHJpc20ubGFuZ3VhZ2VzLmFjdGlvbnNjcmlwdFsnbGl0ZXJhbC1wcm9wZXJ0eSddO1xuXG5pZiAoUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cCkge1xuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdhY3Rpb25zY3JpcHQnLCAnc3RyaW5nJywge1xuXHRcdCd4bWwnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W14uXSk8XFwvP1xcdysoPzpcXHMrW15cXHM+XFwvPV0rPShcInwnKSg/OlxcXFxbXFxzXFxTXXwoPyFcXDIpW15cXFxcXSkqXFwyKSpcXHMqXFwvPz4vLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cFxuXHRcdH1cblx0fSk7XG59XG47XG5QcmlzbS5sYW5ndWFnZXMuYWRhID0ge1xuXHQnY29tbWVudCc6IC8tLS4qLyxcblx0J3N0cmluZyc6IC9cIig/OlwiXCJ8W15cIlxcclxcZlxcbl0pKlwiLyxcblx0J251bWJlcic6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiXFxkKD86Xz9cXGQpKiNbXFxkQS1GXSg/Ol8/W1xcZEEtRl0pKig/OlxcLltcXGRBLUZdKD86Xz9bXFxkQS1GXSkqKT8jKD86RVsrLV0/XFxkKD86Xz9cXGQpKik/L2lcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXGJcXGQoPzpfP1xcZCkqKD86XFwuXFxkKD86Xz9cXGQpKik/KD86RVsrLV0/XFxkKD86Xz9cXGQpKik/XFxiL2lcblx0XHR9XG5cdF0sXG5cdCdhdHRyaWJ1dGUnOiB7XG5cdFx0cGF0dGVybjogL1xcYidcXHcrLyxcblx0XHRhbGlhczogJ2F0dHItbmFtZSdcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86YWJvcnR8YWJzfGFic3RyYWN0fGFjY2VwdHxhY2Nlc3N8YWxpYXNlZHxhbGx8YW5kfGFycmF5fGF0fGJlZ2lufGJvZHl8Y2FzZXxjb25zdGFudHxkZWNsYXJlfGRlbGF5fGRlbHRhfGRpZ2l0c3xkb3xlbHNlfGVsc2lmfGVuZHxlbnRyeXxleGNlcHRpb258ZXhpdHxmb3J8ZnVuY3Rpb258Z2VuZXJpY3xnb3RvfGlmfGlufGludGVyZmFjZXxpc3xsaW1pdGVkfGxvb3B8bW9kfG5ld3xub3R8bnVsbHxvZnxvcnxvdGhlcnN8b3V0fG92ZXJyaWRpbmd8cGFja2FnZXxwcmFnbWF8cHJpdmF0ZXxwcm9jZWR1cmV8cHJvdGVjdGVkfHJhaXNlfHJhbmdlfHJlY29yZHxyZW18cmVuYW1lc3xyZXF1ZXVlfHJldHVybnxyZXZlcnNlfHNlbGVjdHxzZXBhcmF0ZXxzb21lfHN1YnR5cGV8c3luY2hyb25pemVkfHRhZ2dlZHx0YXNrfHRlcm1pbmF0ZXx0aGVufHR5cGV8dW50aWx8dXNlfHdoZW58d2hpbGV8d2l0aHx4b3IpXFxiL2ksXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiL2ksXG5cdCdvcGVyYXRvcic6IC88Wz0+XT98Pj0/fD0+P3w6PXxcXC89P3xcXCpcXCo/fFsmKy1dLyxcblx0J3B1bmN0dWF0aW9uJzogL1xcLlxcLj98Wyw7KCk6XS8sXG5cdCdjaGFyJzogLycuJy8sXG5cdCd2YXJpYWJsZSc6IC9cXGJbYS16XSg/OlxcdykqXFxiL2lcbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHRQcmlzbS5sYW5ndWFnZXMuYWdkYSA9IHtcblx0XHQnY29tbWVudCc6IC9cXHstW1xcc1xcU10qPyg/Oi1cXH18JCl8LS0uKi8sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9cIig/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfFteXFxcXFxcclxcblwiXSkqXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdH0sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1soKXt9XHUyOTgzXHUyOTg0LjtAXS8sXG5cdFx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKCg/OmRhdGF8cmVjb3JkKSArKVxcUysvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHR9LFxuXHRcdCdmdW5jdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopKD8hXFxzKVteOlxcclxcbl0rKD89OikvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0fSxcblx0XHQnb3BlcmF0b3InOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5cXHMqfFxccykoPzpbPXw6XHUyMjAwXHUyMTkyXHUwM0JCXFxcXD9fXXwtPikoPz1cXHMpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0fSxcblx0XHQna2V5d29yZCc6IC9cXGIoPzpTZXR8YWJzdHJhY3R8Y29uc3RydWN0b3J8ZGF0YXxldGEtZXF1YWxpdHl8ZmllbGR8Zm9yYWxsfGhpZGluZ3xpbXBvcnR8aW58aW5kdWN0aXZlfGluZml4fGluZml4bHxpbmZpeHJ8aW5zdGFuY2V8bGV0fG1hY3JvfG1vZHVsZXxtdXR1YWx8bm8tZXRhLWVxdWFsaXR5fG9wZW58b3ZlcmxhcHxwYXR0ZXJufHBvc3R1bGF0ZXxwcmltaXRpdmV8cHJpdmF0ZXxwdWJsaWN8cXVvdGV8cXVvdGVDb250ZXh0fHF1b3RlR29hbHxxdW90ZVRlcm18cmVjb3JkfHJlbmFtaW5nfHJld3JpdGV8c3ludGF4fHRhY3RpY3x1bnF1b3RlfHVucXVvdGVEZWNsfHVucXVvdGVEZWZ8dXNpbmd8dmFyaWFibGV8d2hlcmV8d2l0aClcXGIvLFxuXHR9O1xufShQcmlzbSkpO1xuXG4vLyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L0FML2Jsb2IvbWFzdGVyL2dyYW1tYXIvYWxzeW50YXgudG1sYW5ndWFnZVxuXG5QcmlzbS5sYW5ndWFnZXMuYWwgPSB7XG5cdCdjb21tZW50JzogL1xcL1xcLy4qfFxcL1xcKltcXHNcXFNdKj9cXCpcXC8vLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8nKD86Jyd8W14nXFxyXFxuXSkqJyg/IScpfFwiKD86XCJcInxbXlwiXFxyXFxuXSkqXCIoPyFcIikvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnZnVuY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogLyhcXGIoPzpldmVudHxwcm9jZWR1cmV8dHJpZ2dlcilcXHMrfCg/Ol58W14uXSlcXC5cXHMqKVthLXpfXVxcdyooPz1cXHMqXFwoKS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiBbXG5cdFx0Ly8ga2V5d29yZHNcblx0XHQvXFxiKD86YXJyYXl8YXNzZXJ0ZXJyb3J8YmVnaW58YnJlYWt8Y2FzZXxkb3xkb3dudG98ZWxzZXxlbmR8ZXZlbnR8ZXhpdHxmb3J8Zm9yZWFjaHxmdW5jdGlvbnxpZnxpbXBsZW1lbnRzfGlufGluZGF0YXNldHxpbnRlcmZhY2V8aW50ZXJuYWx8bG9jYWx8b2Z8cHJvY2VkdXJlfHByb2dyYW18cHJvdGVjdGVkfHJlcGVhdHxydW5vbmNsaWVudHxzZWN1cml0eWZpbHRlcmluZ3xzdXBwcmVzc2Rpc3Bvc2V8dGVtcG9yYXJ5fHRoZW58dG98dHJpZ2dlcnx1bnRpbHx2YXJ8d2hpbGV8d2l0aHx3aXRoZXZlbnRzKVxcYi9pLFxuXHRcdC8vIG9iamVjdHMgYW5kIG1ldGFkYXRhIHRoYXQgYXJlIHVzZWQgbGlrZSBrZXl3b3Jkc1xuXHRcdC9cXGIoPzphY3Rpb258YWN0aW9uc3xhZGRhZnRlcnxhZGRiZWZvcmV8YWRkZmlyc3R8YWRkbGFzdHxhcmVhfGFzc2VtYmx5fGNoYXJ0cGFydHxjb2RldW5pdHxjb2x1bW58Y29udHJvbGFkZGlufGN1ZWdyb3VwfGN1c3RvbWl6ZXN8ZGF0YWl0ZW18ZGF0YXNldHxkb3RuZXR8ZWxlbWVudHN8ZW51bXxlbnVtZXh0ZW5zaW9ufGV4dGVuZHN8ZmllbGR8ZmllbGRhdHRyaWJ1dGV8ZmllbGRlbGVtZW50fGZpZWxkZ3JvdXB8ZmllbGRncm91cHN8ZmllbGRzfGZpbHRlcnxmaXhlZHxncmlkfGdyb3VwfGtleXxrZXlzfGxhYmVsfGxhYmVsc3xsYXlvdXR8bW9kaWZ5fG1vdmVhZnRlcnxtb3ZlYmVmb3JlfG1vdmVmaXJzdHxtb3ZlbGFzdHxwYWdlfHBhZ2VjdXN0b21pemF0aW9ufHBhZ2VleHRlbnNpb258cGFydHxwcm9maWxlfHF1ZXJ5fHJlcGVhdGVyfHJlcG9ydHxyZXF1ZXN0cGFnZXxzY2hlbWF8c2VwYXJhdG9yfHN5c3RlbXBhcnR8dGFibGV8dGFibGVlbGVtZW50fHRhYmxlZXh0ZW5zaW9ufHRleHRhdHRyaWJ1dGV8dGV4dGVsZW1lbnR8dHlwZXx1c2VyY29udHJvbHx2YWx1ZXx4bWxwb3J0KVxcYi9pXG5cdF0sXG5cdCdudW1iZXInOiAvXFxiKD86MHhbXFxkYS1mXSt8KD86XFxkKyg/OlxcLlxcZCopP3xcXC5cXGQrKSg/OmVbKy1dP1xcZCspPykoPzpGfExMP3xVKD86TEw/KT8pP1xcYi9pLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi9pLFxuXHQndmFyaWFibGUnOiAvXFxiKD86Q3Vycig/OkZpZWxkTm98UGFnZXxSZXBvcnQpfHg/UmVjfFJlcXVlc3RPcHRpb25zUGFnZSlcXGIvLFxuXHQnY2xhc3MtbmFtZSc6IC9cXGIoPzphdXRvbWF0aW9ufGJpZ2ludGVnZXJ8YmlndGV4dHxibG9ifGJvb2xlYW58Ynl0ZXxjaGFyfGNsaWVudHR5cGV8Y29kZXxjb21wbGV0aW9udHJpZ2dlcmVycm9ybGV2ZWx8Y29ubmVjdGlvbnR5cGV8ZGF0YWJhc2V8ZGF0YWNsYXNzaWZpY2F0aW9ufGRhdGFzY29wZXxkYXRlfGRhdGVmb3JtdWxhfGRhdGV0aW1lfGRlY2ltYWx8ZGVmYXVsdGxheW91dHxkaWFsb2d8ZGljdGlvbmFyeXxkb3RuZXRhc3NlbWJseXxkb3RuZXR0eXBlZGVjbGFyYXRpb258ZHVyYXRpb258ZXJyb3JpbmZvfGVycm9ydHlwZXxleGVjdXRpb25jb250ZXh0fGV4ZWN1dGlvbm1vZGV8ZmllbGRjbGFzc3xmaWVsZHJlZnxmaWVsZHR5cGV8ZmlsZXxmaWx0ZXJwYWdlYnVpbGRlcnxndWlkfGh0dHBjbGllbnR8aHR0cGNvbnRlbnR8aHR0cGhlYWRlcnN8aHR0cHJlcXVlc3RtZXNzYWdlfGh0dHByZXNwb25zZW1lc3NhZ2V8aW5zdHJlYW18aW50ZWdlcnxqb2tlcnxqc29uYXJyYXl8anNvbm9iamVjdHxqc29udG9rZW58anNvbnZhbHVlfGtleXJlZnxsaXN0fG1vZHVsZWRlcGVuZGVuY3lpbmZvfG1vZHVsZWluZm98bm9uZXxub3RpZmljYXRpb258bm90aWZpY2F0aW9uc2NvcGV8b2JqZWN0dHlwZXxvcHRpb258b3V0c3RyZWFtfHBhZ2VyZXN1bHR8cmVjb3JkfHJlY29yZGlkfHJlY29yZHJlZnxyZXBvcnRmb3JtYXR8c2VjdXJpdHlmaWx0ZXJ8c2Vzc2lvbnNldHRpbmdzfHRhYmxlY29ubmVjdGlvbnR5cGV8dGFibGVmaWx0ZXJ8dGVzdGFjdGlvbnx0ZXN0ZmllbGR8dGVzdGZpbHRlcmZpZWxkfHRlc3RwYWdlfHRlc3RwZXJtaXNzaW9uc3x0ZXN0cmVxdWVzdHBhZ2V8dGV4dHx0ZXh0YnVpbGRlcnx0ZXh0Y29uc3R8dGV4dGVuY29kaW5nfHRpbWV8dHJhbnNhY3Rpb25tb2RlbHx0cmFuc2FjdGlvbnR5cGV8dmFyaWFudHx2ZXJib3NpdHl8dmVyc2lvbnx2aWV3fHZpZXdzfHdlYnNlcnZpY2VhY3Rpb25jb250ZXh0fHdlYnNlcnZpY2VhY3Rpb25yZXN1bHRjb2RlfHhtbGF0dHJpYnV0ZXx4bWxhdHRyaWJ1dGVjb2xsZWN0aW9ufHhtbGNkYXRhfHhtbGNvbW1lbnR8eG1sZGVjbGFyYXRpb258eG1sZG9jdW1lbnR8eG1sZG9jdW1lbnR0eXBlfHhtbGVsZW1lbnR8eG1sbmFtZXNwYWNlbWFuYWdlcnx4bWxuYW1ldGFibGV8eG1sbm9kZXx4bWxub2RlbGlzdHx4bWxwcm9jZXNzaW5naW5zdHJ1Y3Rpb258eG1scmVhZG9wdGlvbnN8eG1sdGV4dHx4bWx3cml0ZW9wdGlvbnMpXFxiL2ksXG5cdCdvcGVyYXRvcic6IC9cXC5cXC58Ols9Ol18Wy0rKi9dPT98PD58Wzw+XT0/fD18XFxiKD86YW5kfGRpdnxtb2R8bm90fG9yfHhvcilcXGIvaSxcblx0J3B1bmN0dWF0aW9uJzogL1soKVxcW1xcXXt9Oi47LF0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuYW50bHI0ID0ge1xuXHQnY29tbWVudCc6IC9cXC9cXC8uKnxcXC9cXCpbXFxzXFxTXSo/KD86XFwqXFwvfCQpLyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvJyg/OlxcXFwufFteXFxcXCdcXHJcXG5dKSonLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NoYXJhY3Rlci1jbGFzcyc6IHtcblx0XHRwYXR0ZXJuOiAvXFxbKD86XFxcXC58W15cXFxcXFxdXFxyXFxuXSkqXFxdLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdyZWdleCcsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncmFuZ2UnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oW15bXXwoPzpefFteXFxcXF0pKD86XFxcXFxcXFwpKlxcXFxcXFspLSg/IVxcXSkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0fSxcblx0XHRcdCdlc2NhcGUnOiAvXFxcXCg/OnUoPzpbYS1mQS1GXFxkXXs0fXxcXHtbYS1mQS1GXFxkXStcXH0pfFtwUF1cXHtbPVxcdy1dK1xcfXxbXlxcclxcbnVwUF0pLyxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9bXFxbXFxdXS9cblx0XHR9XG5cdH0sXG5cdCdhY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogL1xceyg/Oltee31dfFxceyg/Oltee31dfFxceyg/Oltee31dfFxce1tee31dKlxcfSkqXFx9KSpcXH0pKlxcfS8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2NvbnRlbnQnOiB7XG5cdFx0XHRcdC8vIHRoaXMgbWlnaHQgYmUgQywgQysrLCBQeXRob24sIEphdmEsIEMjLCBvciBhbnkgb3RoZXIgbGFuZ3VhZ2UgQU5UTFI0IGNvbXBpbGVzIHRvXG5cdFx0XHRcdHBhdHRlcm46IC8oXFx7KVtcXHNcXFNdKyg/PVxcfSkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1t7fV0vXG5cdFx0fVxuXHR9LFxuXHQnY29tbWFuZCc6IHtcblx0XHRwYXR0ZXJuOiAvKC0+XFxzKig/IVxccykpKD86XFxzKig/OixcXHMqKT9cXGJbYS16XVxcdyooPzpcXHMqXFwoW14oKVxcclxcbl0qXFwpKT8pKyg/PVxccyo7KS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnZnVuY3Rpb24nOiAvXFxiXFx3Kyg/PVxccyooPzpbLChdfCQpKS8sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvWywoKV0vXG5cdFx0fVxuXHR9LFxuXHQnYW5ub3RhdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvQFxcdysoPzo6OlxcdyspKi8sXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQnbGFiZWwnOiB7XG5cdFx0cGF0dGVybjogLyNbIFxcdF0qXFx3Ky8sXG5cdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86Y2F0Y2h8Y2hhbm5lbHN8ZmluYWxseXxmcmFnbWVudHxncmFtbWFyfGltcG9ydHxsZXhlcnxsb2NhbHN8bW9kZXxvcHRpb25zfHBhcnNlcnxyZXR1cm5zfHRocm93c3x0b2tlbnMpXFxiLyxcblx0J2RlZmluaXRpb24nOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcYlthLXpdXFx3Kig/PVxccyo6KS8sXG5cdFx0XHRhbGlhczogWydydWxlJywgJ2NsYXNzLW5hbWUnXVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcYltBLVpdXFx3Kig/PVxccyo6KS8sXG5cdFx0XHRhbGlhczogWyd0b2tlbicsICdjb25zdGFudCddXG5cdFx0fSxcblx0XSxcblx0J2NvbnN0YW50JzogL1xcYltBLVpdW0EtWl9dKlxcYi8sXG5cdCdvcGVyYXRvcic6IC9cXC5cXC58LT58W3x+XXxbKis/XVxcPz8vLFxuXHQncHVuY3R1YXRpb24nOiAvWzs6KCk9XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5nNCA9IFByaXNtLmxhbmd1YWdlcy5hbnRscjQ7XG5cblByaXNtLmxhbmd1YWdlcy5hcGFjaGVjb25mID0ge1xuXHQnY29tbWVudCc6IC8jLiovLFxuXHQnZGlyZWN0aXZlLWlubGluZSc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKVxcYig/OkFjY2VwdEZpbHRlcnxBY2NlcHRQYXRoSW5mb3xBY2Nlc3NGaWxlTmFtZXxBY3Rpb258QWRkKD86QWx0fEFsdEJ5RW5jb2Rpbmd8QWx0QnlUeXBlfENoYXJzZXR8RGVmYXVsdENoYXJzZXR8RGVzY3JpcHRpb258RW5jb2Rpbmd8SGFuZGxlcnxJY29ufEljb25CeUVuY29kaW5nfEljb25CeVR5cGV8SW5wdXRGaWx0ZXJ8TGFuZ3VhZ2V8TW9kdWxlSW5mb3xPdXRwdXRGaWx0ZXJ8T3V0cHV0RmlsdGVyQnlUeXBlfFR5cGUpfEFsaWFzfEFsaWFzTWF0Y2h8QWxsb3coPzpDT05ORUNUfEVuY29kZWRTbGFzaGVzfE1ldGhvZHN8T3ZlcnJpZGV8T3ZlcnJpZGVMaXN0KT98QW5vbnltb3VzKD86X0xvZ0VtYWlsfF9NdXN0R2l2ZUVtYWlsfF9Ob1VzZXJJRHxfVmVyaWZ5RW1haWwpP3xBc3luY1JlcXVlc3RXb3JrZXJGYWN0b3J8QXV0aCg/OkJhc2ljQXV0aG9yaXRhdGl2ZXxCYXNpY0Zha2V8QmFzaWNQcm92aWRlcnxCYXNpY1VzZURpZ2VzdEFsZ29yaXRobXxEQkRVc2VyUFdRdWVyeXxEQkRVc2VyUmVhbG1RdWVyeXxEQk1Hcm91cEZpbGV8REJNVHlwZXxEQk1Vc2VyRmlsZXxEaWdlc3QoPzpBbGdvcml0aG18RG9tYWlufE5vbmNlTGlmZXRpbWV8UHJvdmlkZXJ8UW9wfFNobWVtU2l6ZSl8Rm9ybSg/OkF1dGhvcml0YXRpdmV8Qm9keXxEaXNhYmxlTm9TdG9yZXxGYWtlQmFzaWNBdXRofExvY2F0aW9ufExvZ2luUmVxdWlyZWRMb2NhdGlvbnxMb2dpblN1Y2Nlc3NMb2NhdGlvbnxMb2dvdXRMb2NhdGlvbnxNZXRob2R8TWltZXR5cGV8UGFzc3dvcmR8UHJvdmlkZXJ8U2l0ZVBhc3NwaHJhc2V8U2l6ZXxVc2VybmFtZSl8R3JvdXBGaWxlfExEQVAoPzpBdXRob3JpemVQcmVmaXh8QmluZEF1dGhvcml0YXRpdmV8QmluZEROfEJpbmRQYXNzd29yZHxDaGFyc2V0Q29uZmlnfENvbXBhcmVBc1VzZXJ8Q29tcGFyZUROT25TZXJ2ZXJ8RGVyZWZlcmVuY2VBbGlhc2VzfEdyb3VwQXR0cmlidXRlfEdyb3VwQXR0cmlidXRlSXNETnxJbml0aWFsQmluZEFzVXNlcnxJbml0aWFsQmluZFBhdHRlcm58TWF4U3ViR3JvdXBEZXB0aHxSZW1vdGVVc2VyQXR0cmlidXRlfFJlbW90ZVVzZXJJc0ROfFNlYXJjaEFzVXNlcnxTdWJHcm91cEF0dHJpYnV0ZXxTdWJHcm91cENsYXNzfFVybCl8TWVyZ2luZ3xOYW1lfG5DYWNoZSg/OkNvbnRleHR8RW5hYmxlfFByb3ZpZGVGb3J8U09DYWNoZXxUaW1lb3V0KXxuekZjZ2lDaGVja0F1dGhuUHJvdmlkZXJ8bnpGY2dpRGVmaW5lUHJvdmlkZXJ8VHlwZXxVc2VyRmlsZXx6REJETG9naW5Ub1JlZmVyZXJ8ekRCRFF1ZXJ5fHpEQkRSZWRpcmVjdFF1ZXJ5fHpEQk1UeXBlfHpTZW5kRm9yYmlkZGVuT25GYWlsdXJlKXxCYWxhbmNlckdyb3d0aHxCYWxhbmNlckluaGVyaXR8QmFsYW5jZXJNZW1iZXJ8QmFsYW5jZXJQZXJzaXN0fEJyb3dzZXJNYXRjaHxCcm93c2VyTWF0Y2hOb0Nhc2V8QnVmZmVyZWRMb2dzfEJ1ZmZlclNpemV8Q2FjaGUoPzpEZWZhdWx0RXhwaXJlfERldGFpbEhlYWRlcnxEaXJMZW5ndGh8RGlyTGV2ZWxzfERpc2FibGV8RW5hYmxlfEZpbGV8SGVhZGVyfElnbm9yZUNhY2hlQ29udHJvbHxJZ25vcmVIZWFkZXJzfElnbm9yZU5vTGFzdE1vZHxJZ25vcmVRdWVyeVN0cmluZ3xJZ25vcmVVUkxTZXNzaW9uSWRlbnRpZmllcnN8S2V5QmFzZVVSTHxMYXN0TW9kaWZpZWRGYWN0b3J8TG9ja3xMb2NrTWF4QWdlfExvY2tQYXRofE1heEV4cGlyZXxNYXhGaWxlU2l6ZXxNaW5FeHBpcmV8TWluRmlsZVNpemV8TmVnb3RpYXRlZERvY3N8UXVpY2tIYW5kbGVyfFJlYWRTaXplfFJlYWRUaW1lfFJvb3R8U29jYWNoZSg/Ok1heFNpemV8TWF4VGltZXxNaW5UaW1lfFJlYWRTaXplfFJlYWRUaW1lKT98U3RhbGVPbkVycm9yfFN0b3JlRXhwaXJlZHxTdG9yZU5vU3RvcmV8U3RvcmVQcml2YXRlKXxDR0lEU2NyaXB0VGltZW91dHxDR0lNYXBFeHRlbnNpb258Q2hhcnNldERlZmF1bHR8Q2hhcnNldE9wdGlvbnN8Q2hhcnNldFNvdXJjZUVuY3xDaGVja0Nhc2VPbmx5fENoZWNrU3BlbGxpbmd8Q2hyb290RGlyfENvbnRlbnREaWdlc3R8Q29va2llRG9tYWlufENvb2tpZUV4cGlyZXN8Q29va2llTmFtZXxDb29raWVTdHlsZXxDb29raWVUcmFja2luZ3xDb3JlRHVtcERpcmVjdG9yeXxDdXN0b21Mb2d8RGF2fERhdkRlcHRoSW5maW5pdHl8RGF2R2VuZXJpY0xvY2tEQnxEYXZMb2NrREJ8RGF2TWluVGltZW91dHxEQkRFeHB0aW1lfERCREluaXRTUUx8REJES2VlcHxEQkRNYXh8REJETWlufERCRFBhcmFtc3xEQkRQZXJzaXN0fERCRFByZXBhcmVTUUx8REJEcml2ZXJ8RGVmYXVsdEljb258RGVmYXVsdExhbmd1YWdlfERlZmF1bHRSdW50aW1lRGlyfERlZmF1bHRUeXBlfERlZmluZXxEZWZsYXRlKD86QnVmZmVyU2l6ZXxDb21wcmVzc2lvbkxldmVsfEZpbHRlck5vdGV8SW5mbGF0ZUxpbWl0UmVxdWVzdEJvZHl8SW5mbGF0ZVJhdGlvKD86QnVyc3R8TGltaXQpfE1lbUxldmVsfFdpbmRvd1NpemUpfERlbnl8RGlyZWN0b3J5Q2hlY2tIYW5kbGVyfERpcmVjdG9yeUluZGV4fERpcmVjdG9yeUluZGV4UmVkaXJlY3R8RGlyZWN0b3J5U2xhc2h8RG9jdW1lbnRSb290fERUcmFjZVByaXZpbGVnZXN8RHVtcElPSW5wdXR8RHVtcElPT3V0cHV0fEVuYWJsZUV4Y2VwdGlvbkhvb2t8RW5hYmxlTU1BUHxFbmFibGVTZW5kZmlsZXxFcnJvcnxFcnJvckRvY3VtZW50fEVycm9yTG9nfEVycm9yTG9nRm9ybWF0fEV4YW1wbGV8RXhwaXJlc0FjdGl2ZXxFeHBpcmVzQnlUeXBlfEV4cGlyZXNEZWZhdWx0fEV4dGVuZGVkU3RhdHVzfEV4dEZpbHRlckRlZmluZXxFeHRGaWx0ZXJPcHRpb25zfEZhbGxiYWNrUmVzb3VyY2V8RmlsZUVUYWd8RmlsdGVyQ2hhaW58RmlsdGVyRGVjbGFyZXxGaWx0ZXJQcm90b2NvbHxGaWx0ZXJQcm92aWRlcnxGaWx0ZXJUcmFjZXxGb3JjZUxhbmd1YWdlUHJpb3JpdHl8Rm9yY2VUeXBlfEZvcmVuc2ljTG9nfEdwcm9mRGlyfEdyYWNlZnVsU2h1dGRvd25UaW1lb3V0fEdyb3VwfEhlYWRlcnxIZWFkZXJOYW1lfEhlYXJ0YmVhdCg/OkFkZHJlc3N8TGlzdGVufE1heFNlcnZlcnN8U3RvcmFnZSl8SG9zdG5hbWVMb29rdXBzfElkZW50aXR5Q2hlY2t8SWRlbnRpdHlDaGVja1RpbWVvdXR8SW1hcEJhc2V8SW1hcERlZmF1bHR8SW1hcE1lbnV8SW5jbHVkZXxJbmNsdWRlT3B0aW9uYWx8SW5kZXgoPzpIZWFkSW5zZXJ0fElnbm9yZXxJZ25vcmVSZXNldHxPcHRpb25zfE9yZGVyRGVmYXVsdHxTdHlsZVNoZWV0KXxJbnB1dFNlZHxJU0FQSSg/OkFwcGVuZExvZ1RvRXJyb3JzfEFwcGVuZExvZ1RvUXVlcnl8Q2FjaGVGaWxlfEZha2VBc3luY3xMb2dOb3RTdXBwb3J0ZWR8UmVhZEFoZWFkQnVmZmVyKXxLZWVwQWxpdmV8S2VlcEFsaXZlVGltZW91dHxLZXB0Qm9keVNpemV8TGFuZ3VhZ2VQcmlvcml0eXxMREFQKD86Q2FjaGVFbnRyaWVzfENhY2hlVFRMfENvbm5lY3Rpb25Qb29sVFRMfENvbm5lY3Rpb25UaW1lb3V0fExpYnJhcnlEZWJ1Z3xPcENhY2hlRW50cmllc3xPcENhY2hlVFRMfFJlZmVycmFsSG9wTGltaXR8UmVmZXJyYWxzfFJldHJpZXN8UmV0cnlEZWxheXxTaGFyZWRDYWNoZUZpbGV8U2hhcmVkQ2FjaGVTaXplfFRpbWVvdXR8VHJ1c3RlZENsaWVudENlcnR8VHJ1c3RlZEdsb2JhbENlcnR8VHJ1c3RlZE1vZGV8VmVyaWZ5U2VydmVyQ2VydCl8TGltaXQoPzpJbnRlcm5hbFJlY3Vyc2lvbnxSZXF1ZXN0KD86Qm9keXxGaWVsZHN8RmllbGRTaXplfExpbmUpfFhNTFJlcXVlc3RCb2R5KXxMaXN0ZW58TGlzdGVuQmFja0xvZ3xMb2FkRmlsZXxMb2FkTW9kdWxlfExvZ0Zvcm1hdHxMb2dMZXZlbHxMb2dNZXNzYWdlfEx1YUF1dGh6UHJvdmlkZXJ8THVhQ29kZUNhY2hlfEx1YSg/Okhvb2soPzpBY2Nlc3NDaGVja2VyfEF1dGhDaGVja2VyfENoZWNrVXNlcklEfEZpeHVwc3xJbnNlcnRGaWx0ZXJ8TG9nfE1hcFRvU3RvcmFnZXxUcmFuc2xhdGVOYW1lfFR5cGVDaGVja2VyKXxJbmhlcml0fElucHV0RmlsdGVyfE1hcEhhbmRsZXJ8T3V0cHV0RmlsdGVyfFBhY2thZ2VDUGF0aHxQYWNrYWdlUGF0aHxRdWlja0hhbmRsZXJ8Um9vdHxTY29wZSl8TWF4KD86Q29ubmVjdGlvbnNQZXJDaGlsZHxLZWVwQWxpdmVSZXF1ZXN0c3xNZW1GcmVlfFJhbmdlT3ZlcmxhcHN8UmFuZ2VSZXZlcnNhbHN8UmFuZ2VzfFJlcXVlc3RXb3JrZXJzfFNwYXJlU2VydmVyc3xTcGFyZVRocmVhZHN8VGhyZWFkcyl8TWVyZ2VUcmFpbGVyc3xNZXRhRGlyfE1ldGFGaWxlc3xNZXRhU3VmZml4fE1pbWVNYWdpY0ZpbGV8TWluU3BhcmVTZXJ2ZXJzfE1pblNwYXJlVGhyZWFkc3xNTWFwRmlsZXxNb2RlbVN0YW5kYXJkfE1vZE1pbWVVc2VQYXRoSW5mb3xNdWx0aXZpZXdzTWF0Y2h8TXV0ZXh8TmFtZVZpcnR1YWxIb3N0fE5vUHJveHl8TldTU0xUcnVzdGVkQ2VydHN8TldTU0xVcGdyYWRlYWJsZXxPcHRpb25zfE9yZGVyfE91dHB1dFNlZHxQYXNzRW52fFBpZEZpbGV8UHJpdmlsZWdlc01vZGV8UHJvdG9jb2x8UHJvdG9jb2xFY2hvfFByb3h5KD86QWRkSGVhZGVyc3xCYWRIZWFkZXJ8QmxvY2t8RG9tYWlufEVycm9yT3ZlcnJpZGV8RXhwcmVzc0RCTUZpbGV8RXhwcmVzc0RCTVR5cGV8RXhwcmVzc0VuYWJsZXxGdHBEaXJDaGFyc2V0fEZ0cEVzY2FwZVdpbGRjYXJkc3xGdHBMaXN0T25XaWxkY2FyZHxIVE1MKD86QnVmU2l6ZXxDaGFyc2V0T3V0fERvY1R5cGV8RW5hYmxlfEV2ZW50c3xFeHRlbmRlZHxGaXh1cHN8SW50ZXJwfExpbmtzfE1ldGF8U3RyaXBDb21tZW50c3xVUkxNYXApfElPQnVmZmVyU2l6ZXxNYXhGb3J3YXJkc3xQYXNzKD86SW5oZXJpdHxJbnRlcnBvbGF0ZUVudnxNYXRjaHxSZXZlcnNlfFJldmVyc2VDb29raWVEb21haW58UmV2ZXJzZUNvb2tpZVBhdGgpP3xQcmVzZXJ2ZUhvc3R8UmVjZWl2ZUJ1ZmZlclNpemV8UmVtb3RlfFJlbW90ZU1hdGNofFJlcXVlc3RzfFNDR0lJbnRlcm5hbFJlZGlyZWN0fFNDR0lTZW5kZmlsZXxTZXR8U291cmNlQWRkcmVzc3xTdGF0dXN8VGltZW91dHxWaWEpfFJlYWRtZU5hbWV8UmVjZWl2ZUJ1ZmZlclNpemV8UmVkaXJlY3R8UmVkaXJlY3RNYXRjaHxSZWRpcmVjdFBlcm1hbmVudHxSZWRpcmVjdFRlbXB8UmVmbGVjdG9ySGVhZGVyfFJlbW90ZUlQKD86SGVhZGVyfEludGVybmFsUHJveHl8SW50ZXJuYWxQcm94eUxpc3R8UHJveGllc0hlYWRlcnxUcnVzdGVkUHJveHl8VHJ1c3RlZFByb3h5TGlzdCl8UmVtb3ZlQ2hhcnNldHxSZW1vdmVFbmNvZGluZ3xSZW1vdmVIYW5kbGVyfFJlbW92ZUlucHV0RmlsdGVyfFJlbW92ZUxhbmd1YWdlfFJlbW92ZU91dHB1dEZpbHRlcnxSZW1vdmVUeXBlfFJlcXVlc3RIZWFkZXJ8UmVxdWVzdFJlYWRUaW1lb3V0fFJlcXVpcmV8UmV3cml0ZSg/OkJhc2V8Q29uZHxFbmdpbmV8TWFwfE9wdGlvbnN8UnVsZSl8UkxpbWl0Q1BVfFJMaW1pdE1FTXxSTGltaXROUFJPQ3xTYXRpc2Z5fFNjb3JlQm9hcmRGaWxlfFNjcmlwdCg/OkFsaWFzfEFsaWFzTWF0Y2h8SW50ZXJwcmV0ZXJTb3VyY2V8TG9nfExvZ0J1ZmZlcnxMb2dMZW5ndGh8U29jayk/fFNlY3VyZUxpc3RlbnxTZWVSZXF1ZXN0VGFpbHxTZW5kQnVmZmVyU2l6ZXxTZXJ2ZXIoPzpBZG1pbnxBbGlhc3xMaW1pdHxOYW1lfFBhdGh8Um9vdHxTaWduYXR1cmV8VG9rZW5zKXxTZXNzaW9uKD86Q29va2llKD86TmFtZXxOYW1lMnxSZW1vdmUpfENyeXB0byg/OkNpcGhlcnxEcml2ZXJ8UGFzc3BocmFzZXxQYXNzcGhyYXNlRmlsZSl8REJEKD86Q29va2llTmFtZXxDb29raWVOYW1lMnxDb29raWVSZW1vdmV8RGVsZXRlTGFiZWx8SW5zZXJ0TGFiZWx8UGVyVXNlcnxTZWxlY3RMYWJlbHxVcGRhdGVMYWJlbCl8RW52fEV4Y2x1ZGV8SGVhZGVyfEluY2x1ZGV8TWF4QWdlKT98U2V0RW52fFNldEVudklmfFNldEVudklmRXhwcnxTZXRFbnZJZk5vQ2FzZXxTZXRIYW5kbGVyfFNldElucHV0RmlsdGVyfFNldE91dHB1dEZpbHRlcnxTU0lFbmRUYWd8U1NJRXJyb3JNc2d8U1NJRVRhZ3xTU0lMYXN0TW9kaWZpZWR8U1NJTGVnYWN5RXhwclBhcnNlcnxTU0lTdGFydFRhZ3xTU0lUaW1lRm9ybWF0fFNTSVVuZGVmaW5lZEVjaG98U1NMKD86Q0FDZXJ0aWZpY2F0ZUZpbGV8Q0FDZXJ0aWZpY2F0ZVBhdGh8Q0FETlJlcXVlc3RGaWxlfENBRE5SZXF1ZXN0UGF0aHxDQVJldm9jYXRpb25DaGVja3xDQVJldm9jYXRpb25GaWxlfENBUmV2b2NhdGlvblBhdGh8Q2VydGlmaWNhdGVDaGFpbkZpbGV8Q2VydGlmaWNhdGVGaWxlfENlcnRpZmljYXRlS2V5RmlsZXxDaXBoZXJTdWl0ZXxDb21wcmVzc2lvbnxDcnlwdG9EZXZpY2V8RW5naW5lfEZJUFN8SG9ub3JDaXBoZXJPcmRlcnxJbnNlY3VyZVJlbmVnb3RpYXRpb258T0NTUCg/OkRlZmF1bHRSZXNwb25kZXJ8RW5hYmxlfE92ZXJyaWRlUmVzcG9uZGVyfFJlc3BvbmRlclRpbWVvdXR8UmVzcG9uc2VNYXhBZ2V8UmVzcG9uc2VUaW1lU2tld3xVc2VSZXF1ZXN0Tm9uY2UpfE9wZW5TU0xDb25mQ21kfE9wdGlvbnN8UGFzc1BocmFzZURpYWxvZ3xQcm90b2NvbHxQcm94eSg/OkNBQ2VydGlmaWNhdGVGaWxlfENBQ2VydGlmaWNhdGVQYXRofENBUmV2b2NhdGlvbig/OkNoZWNrfEZpbGV8UGF0aCl8Q2hlY2tQZWVyKD86Q058RXhwaXJlfE5hbWUpfENpcGhlclN1aXRlfEVuZ2luZXxNYWNoaW5lQ2VydGlmaWNhdGUoPzpDaGFpbkZpbGV8RmlsZXxQYXRoKXxQcm90b2NvbHxWZXJpZnl8VmVyaWZ5RGVwdGgpfFJhbmRvbVNlZWR8UmVuZWdCdWZmZXJTaXplfFJlcXVpcmV8UmVxdWlyZVNTTHxTZXNzaW9uKD86Q2FjaGV8Q2FjaGVUaW1lb3V0fFRpY2tldEtleUZpbGV8VGlja2V0cyl8U1JQVW5rbm93blVzZXJTZWVkfFNSUFZlcmlmaWVyRmlsZXxTdGFwbGluZyg/OkNhY2hlfEVycm9yQ2FjaGVUaW1lb3V0fEZha2VUcnlMYXRlcnxGb3JjZVVSTHxSZXNwb25kZXJUaW1lb3V0fFJlc3BvbnNlTWF4QWdlfFJlc3BvbnNlVGltZVNrZXd8UmV0dXJuUmVzcG9uZGVyRXJyb3JzfFN0YW5kYXJkQ2FjaGVUaW1lb3V0KXxTdHJpY3RTTklWSG9zdENoZWNrfFVzZXJOYW1lfFVzZVN0YXBsaW5nfFZlcmlmeUNsaWVudHxWZXJpZnlEZXB0aCl8U3RhcnRTZXJ2ZXJzfFN0YXJ0VGhyZWFkc3xTdWJzdGl0dXRlfFN1ZXhlY3xTdWV4ZWNVc2VyR3JvdXB8VGhyZWFkTGltaXR8VGhyZWFkc1BlckNoaWxkfFRocmVhZFN0YWNrU2l6ZXxUaW1lT3V0fFRyYWNlRW5hYmxlfFRyYW5zZmVyTG9nfFR5cGVzQ29uZmlnfFVuRGVmaW5lfFVuZGVmTWFjcm98VW5zZXRFbnZ8VXNlfFVzZUNhbm9uaWNhbE5hbWV8VXNlQ2Fub25pY2FsUGh5c2ljYWxQb3J0fFVzZXJ8VXNlckRpcnxWSG9zdENHSU1vZGV8Vkhvc3RDR0lQcml2c3xWSG9zdEdyb3VwfFZIb3N0UHJpdnN8Vkhvc3RTZWN1cmV8Vkhvc3RVc2VyfFZpcnR1YWwoPzpEb2N1bWVudFJvb3R8U2NyaXB0QWxpYXMpKD86SVApP3xXYXRjaGRvZ0ludGVydmFsfFhCaXRIYWNrfHhtbDJFbmNBbGlhc3x4bWwyRW5jRGVmYXVsdHx4bWwyU3RhcnRQYXJzZSlcXGIvaW0sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXHQnZGlyZWN0aXZlLWJsb2NrJzoge1xuXHRcdHBhdHRlcm46IC88XFwvP1xcYig/OkF1dGhbbnpdUHJvdmlkZXJBbGlhc3xEaXJlY3Rvcnl8RGlyZWN0b3J5TWF0Y2h8RWxzZXxFbHNlSWZ8RmlsZXN8RmlsZXNNYXRjaHxJZnxJZkRlZmluZXxJZk1vZHVsZXxJZlZlcnNpb258TGltaXR8TGltaXRFeGNlcHR8TG9jYXRpb258TG9jYXRpb25NYXRjaHxNYWNyb3xQcm94eXxSZXF1aXJlKD86QWxsfEFueXxOb25lKXxWaXJ0dWFsSG9zdClcXGIuKj4vaSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdkaXJlY3RpdmUtYmxvY2snOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9ePFxcLz9cXHcrLyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL148XFwvPy9cblx0XHRcdFx0fSxcblx0XHRcdFx0YWxpYXM6ICd0YWcnXG5cdFx0XHR9LFxuXHRcdFx0J2RpcmVjdGl2ZS1ibG9jay1wYXJhbWV0ZXInOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8uKltePl0vLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvOi8sXG5cdFx0XHRcdFx0J3N0cmluZyc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC8oXCJ8JykuKlxcMS8sXG5cdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0J3ZhcmlhYmxlJzogL1skJV1cXHs/KD86XFx3XFwuP1stKzpdPykrXFx9Py9cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGFsaWFzOiAnYXR0ci12YWx1ZSdcblx0XHRcdH0sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvPi9cblx0XHR9LFxuXHRcdGFsaWFzOiAndGFnJ1xuXHR9LFxuXHQnZGlyZWN0aXZlLWZsYWdzJzoge1xuXHRcdHBhdHRlcm46IC9cXFsoPzpbXFx3PV0sPykrXFxdLyxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhcInwnKS4qXFwxLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCd2YXJpYWJsZSc6IC9bJCVdXFx7Pyg/Olxcd1xcLj9bLSs6XT8pK1xcfT8vXG5cdFx0fVxuXHR9LFxuXHQndmFyaWFibGUnOiAvWyQlXVxcez8oPzpcXHdcXC4/Wy0rOl0/KStcXH0/Lyxcblx0J3JlZ2V4JzogL1xcXj8uKlxcJHxcXF4uKlxcJD8vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuc3FsID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkoPzpcXC9cXCpbXFxzXFxTXSo/XFwqXFwvfCg/Oi0tfFxcL1xcL3wjKS4qKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQndmFyaWFibGUnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL0AoW1wiJ2BdKSg/OlxcXFxbXFxzXFxTXXwoPyFcXDEpW15cXFxcXSkrXFwxLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0L0BbXFx3LiRdKy9cblx0XSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15AXFxcXF0pKFwifCcpKD86XFxcXFtcXHNcXFNdfCg/IVxcMilbXlxcXFxdfFxcMlxcMikqXFwyLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnaWRlbnRpZmllcic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15AXFxcXF0pYCg/OlxcXFxbXFxzXFxTXXxbXmBcXFxcXXxgYCkqYC8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXmB8YCQvXG5cdFx0fVxuXHR9LFxuXHQnZnVuY3Rpb24nOiAvXFxiKD86QVZHfENPVU5UfEZJUlNUfEZPUk1BVHxMQVNUfExDQVNFfExFTnxNQVh8TUlEfE1JTnxNT0R8Tk9XfFJPVU5EfFNVTXxVQ0FTRSkoPz1cXHMqXFwoKS9pLCAvLyBTaG91bGQgd2UgaGlnaGxpZ2h0IHVzZXIgZGVmaW5lZCBmdW5jdGlvbnMgdG9vP1xuXHQna2V5d29yZCc6IC9cXGIoPzpBQ1RJT058QUREfEFGVEVSfEFMR09SSVRITXxBTEx8QUxURVJ8QU5BTFlaRXxBTll8QVBQTFl8QVN8QVNDfEFVVEhPUklaQVRJT058QVVUT19JTkNSRU1FTlR8QkFDS1VQfEJEQnxCRUdJTnxCRVJLRUxFWURCfEJJR0lOVHxCSU5BUll8QklUfEJMT0J8Qk9PTHxCT09MRUFOfEJSRUFLfEJST1dTRXxCVFJFRXxCVUxLfEJZfENBTEx8Q0FTQ0FERUQ/fENBU0V8Q0hBSU58Q0hBUig/OkFDVEVSfFNFVCk/fENIRUNLKD86UE9JTlQpP3xDTE9TRXxDTFVTVEVSRUR8Q09BTEVTQ0V8Q09MTEFURXxDT0xVTU5TP3xDT01NRU5UfENPTU1JVCg/OlRFRCk/fENPTVBVVEV8Q09OTkVDVHxDT05TSVNURU5UfENPTlNUUkFJTlR8Q09OVEFJTlMoPzpUQUJMRSk/fENPTlRJTlVFfENPTlZFUlR8Q1JFQVRFfENST1NTfENVUlJFTlQoPzpfREFURXxfVElNRXxfVElNRVNUQU1QfF9VU0VSKT98Q1VSU09SfENZQ0xFfERBVEEoPzpCQVNFUz8pP3xEQVRFKD86VElNRSk/fERBWXxEQkNDfERFQUxMT0NBVEV8REVDfERFQ0lNQUx8REVDTEFSRXxERUZBVUxUfERFRklORVJ8REVMQVlFRHxERUxFVEV8REVMSU1JVEVSUz98REVOWXxERVNDfERFU0NSSUJFfERFVEVSTUlOSVNUSUN8RElTQUJMRXxESVNDQVJEfERJU0t8RElTVElOQ1R8RElTVElOQ1RST1d8RElTVFJJQlVURUR8RE98RE9VQkxFfERST1B8RFVNTVl8RFVNUCg/OkZJTEUpP3xEVVBMSUNBVEV8RUxTRSg/OklGKT98RU5BQkxFfEVOQ0xPU0VEfEVORHxFTkdJTkV8RU5VTXxFUlJMVkx8RVJST1JTfEVTQ0FQRUQ/fEVYQ0VQVHxFWEVDKD86VVRFKT98RVhJU1RTfEVYSVR8RVhQTEFJTnxFWFRFTkRFRHxGRVRDSHxGSUVMRFN8RklMRXxGSUxMRkFDVE9SfEZJUlNUfEZJWEVEfEZMT0FUfEZPTExPV0lOR3xGT1IoPzogRUFDSCBST1cpP3xGT1JDRXxGT1JFSUdOfEZSRUVURVhUKD86VEFCTEUpP3xGUk9NfEZVTEx8RlVOQ1RJT058R0VPTUVUUlkoPzpDT0xMRUNUSU9OKT98R0xPQkFMfEdPVE98R1JBTlR8R1JPVVB8SEFORExFUnxIQVNIfEhBVklOR3xIT0xETE9DS3xIT1VSfElERU5USVRZKD86Q09MfF9JTlNFUlQpP3xJRnxJR05PUkV8SU1QT1JUfElOREVYfElORklMRXxJTk5FUnxJTk5PREJ8SU5PVVR8SU5TRVJUfElOVHxJTlRFR0VSfElOVEVSU0VDVHxJTlRFUlZBTHxJTlRPfElOVk9LRVJ8SVNPTEFUSU9OfElURVJBVEV8Sk9JTnxLRVlTP3xLSUxMfExBTkdVQUdFfExBU1R8TEVBVkV8TEVGVHxMRVZFTHxMSU1JVHxMSU5FTk98TElORVN8TElORVNUUklOR3xMT0FEfExPQ0FMfExPQ0t8TE9ORyg/OkJMT0J8VEVYVCl8TE9PUHxNQVRDSCg/OkVEKT98TUVESVVNKD86QkxPQnxJTlR8VEVYVCl8TUVSR0V8TUlERExFSU5UfE1JTlVURXxNT0RFfE1PRElGSUVTfE1PRElGWXxNT05USHxNVUxUSSg/OkxJTkVTVFJJTkd8UE9JTlR8UE9MWUdPTil8TkFUSU9OQUx8TkFUVVJBTHxOQ0hBUnxORVhUfE5PfE5PTkNMVVNURVJFRHxOVUxMSUZ8TlVNRVJJQ3xPRkY/fE9GRlNFVFM/fE9OfE9QRU4oPzpEQVRBU09VUkNFfFFVRVJZfFJPV1NFVCk/fE9QVElNSVpFfE9QVElPTig/OkFMTFkpP3xPUkRFUnxPVVQoPzpFUnxGSUxFKT98T1ZFUnxQQVJUSUFMfFBBUlRJVElPTnxQRVJDRU5UfFBJVk9UfFBMQU58UE9JTlR8UE9MWUdPTnxQUkVDRURJTkd8UFJFQ0lTSU9OfFBSRVBBUkV8UFJFVnxQUklNQVJZfFBSSU5UfFBSSVZJTEVHRVN8UFJPQyg/OkVEVVJFKT98UFVCTElDfFBVUkdFfFFVSUNLfFJBSVNFUlJPUnxSRUFEUz98UkVBTHxSRUNPTkZJR1VSRXxSRUZFUkVOQ0VTfFJFTEVBU0V8UkVOQU1FfFJFUEVBVCg/OkFCTEUpP3xSRVBMQUNFfFJFUExJQ0FUSU9OfFJFUVVJUkV8UkVTSUdOQUx8UkVTVE9SRXxSRVNUUklDVHxSRVRVUk4oPzpJTkd8Uyk/fFJFVk9LRXxSSUdIVHxST0xMQkFDS3xST1VUSU5FfFJPVyg/OkNPVU5UfEdVSURDT0x8Uyk/fFJUUkVFfFJVTEV8U0FWRSg/OlBPSU5UKT98U0NIRU1BfFNFQ09ORHxTRUxFQ1R8U0VSSUFMKD86SVpBQkxFKT98U0VTU0lPTig/Ol9VU0VSKT98U0VUKD86VVNFUik/fFNIQVJFfFNIT1d8U0hVVERPV058U0lNUExFfFNNQUxMSU5UfFNOQVBTSE9UfFNPTUV8U09OQU1FfFNRTHxTVEFSVCg/OklORyk/fFNUQVRJU1RJQ1N8U1RBVFVTfFNUUklQRUR8U1lTVEVNX1VTRVJ8VEFCTEVTP3xUQUJMRVNQQUNFfFRFTVAoPzpPUkFSWXxUQUJMRSk/fFRFUk1JTkFURUR8VEVYVCg/OlNJWkUpP3xUSEVOfFRJTUUoPzpTVEFNUCk/fFRJTlkoPzpCTE9CfElOVHxURVhUKXxUT1A/fFRSQU4oPzpTQUNUSU9OUz8pP3xUUklHR0VSfFRSVU5DQVRFfFRTRVFVQUx8VFlQRVM/fFVOQk9VTkRFRHxVTkNPTU1JVFRFRHxVTkRFRklORUR8VU5JT058VU5JUVVFfFVOTE9DS3xVTlBJVk9UfFVOU0lHTkVEfFVQREFURSg/OlRFWFQpP3xVU0FHRXxVU0V8VVNFUnxVU0lOR3xWQUxVRVM/fFZBUig/OkJJTkFSWXxDSEFSfENIQVJBQ1RFUnxZSU5HKXxWSUVXfFdBSVRGT1J8V0FSTklOR1N8V0hFTnxXSEVSRXxXSElMRXxXSVRIKD86IFJPTExVUHxJTik/fFdPUkt8V1JJVEUoPzpURVhUKT98WUVBUilcXGIvaSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86RkFMU0V8TlVMTHxUUlVFKVxcYi9pLFxuXHQnbnVtYmVyJzogL1xcYjB4W1xcZGEtZl0rXFxifFxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkK1xcYi9pLFxuXHQnb3BlcmF0b3InOiAvWy0rKlxcLz0lXn5dfCYmP3xcXHxcXHw/fCE9P3w8KD86PT4/fDx8Pik/fD5bPj1dP3xcXGIoPzpBTkR8QkVUV0VFTnxESVZ8SUxJS0V8SU58SVN8TElLRXxOT1R8T1J8UkVHRVhQfFJMSUtFfFNPVU5EUyBMSUtFfFhPUilcXGIvaSxcblx0J3B1bmN0dWF0aW9uJzogL1s7W1xcXSgpYCwuXS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIga2V5d29yZHMgPSAvXFxiKD86KD86YWZ0ZXJ8YmVmb3JlKSg/PVxccytbYS16XSl8YWJzdHJhY3R8YWN0aXZhdGV8YW5kfGFueXxhcnJheXxhc3xhc2N8YXV0b25vbW91c3xiZWdpbnxiaWdkZWNpbWFsfGJsb2J8Ym9vbGVhbnxicmVha3xidWxrfGJ5fGJ5dGV8Y2FzZXxjYXN0fGNhdGNofGNoYXJ8Y2xhc3N8Y29sbGVjdHxjb21taXR8Y29uc3R8Y29udGludWV8Y3VycmVuY3l8ZGF0ZXxkYXRldGltZXxkZWNpbWFsfGRlZmF1bHR8ZGVsZXRlfGRlc2N8ZG98ZG91YmxlfGVsc2V8ZW5kfGVudW18ZXhjZXB0aW9ufGV4aXR8ZXhwb3J0fGV4dGVuZHN8ZmluYWx8ZmluYWxseXxmbG9hdHxmb3J8ZnJvbXxnZXQoPz1cXHMqW3t9O10pfGdsb2JhbHxnb3RvfGdyb3VwfGhhdmluZ3xoaW50fGlmfGltcGxlbWVudHN8aW1wb3J0fGlufGlubmVyfGluc2VydHxpbnN0YW5jZW9mfGludHxpbnRlZ2VyfGludGVyZmFjZXxpbnRvfGpvaW58bGlrZXxsaW1pdHxsaXN0fGxvbmd8bG9vcHxtYXB8bWVyZ2V8bmV3fG5vdHxudWxsfG51bGxzfG51bWJlcnxvYmplY3R8b2Z8b258b3J8b3V0ZXJ8b3ZlcnJpZGV8cGFja2FnZXxwYXJhbGxlbHxwcmFnbWF8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJldHJpZXZlfHJldHVybnxyb2xsYmFja3xzZWxlY3R8c2V0fHNob3J0fHNPYmplY3R8c29ydHxzdGF0aWN8c3RyaW5nfHN1cGVyfHN3aXRjaHxzeW5jaHJvbml6ZWR8c3lzdGVtfHRlc3RtZXRob2R8dGhlbnx0aGlzfHRocm93fHRpbWV8dHJhbnNhY3Rpb258dHJhbnNpZW50fHRyaWdnZXJ8dHJ5fHVuZGVsZXRlfHVwZGF0ZXx1cHNlcnR8dXNpbmd8dmlydHVhbHx2b2lkfHdlYnNlcnZpY2V8d2hlbnx3aGVyZXx3aGlsZXwoPzppbmhlcml0ZWR8d2l0aHx3aXRob3V0KVxccytzaGFyaW5nKVxcYi9pO1xuXG5cdHZhciBjbGFzc05hbWUgPSAvXFxiKD86KD89W2Etel9dXFx3KlxccypbPFxcW10pfCg/ITxrZXl3b3JkPikpW0EtWl9dXFx3Kig/OlxccypcXC5cXHMqW0EtWl9dXFx3KikqXFxiKD86XFxzKig/OlxcW1xccypcXF18PCg/OltePD5dfDwoPzpbXjw+XXw8W148Pl0qPikqPikqPikpKi8uc291cmNlXG5cdFx0LnJlcGxhY2UoLzxrZXl3b3JkPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBrZXl3b3Jkcy5zb3VyY2U7IH0pO1xuXHQvKiogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm4gKi9cblx0ZnVuY3Rpb24gaW5zZXJ0Q2xhc3NOYW1lKHBhdHRlcm4pIHtcblx0XHRyZXR1cm4gUmVnRXhwKHBhdHRlcm4ucmVwbGFjZSgvPENMQVNTLU5BTUU+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNsYXNzTmFtZTsgfSksICdpJyk7XG5cdH1cblxuXHR2YXIgY2xhc3NOYW1lSW5zaWRlID0ge1xuXHRcdCdrZXl3b3JkJzoga2V5d29yZHMsXG5cdFx0J3B1bmN0dWF0aW9uJzogL1soKVxcW1xcXXt9Oyw6Ljw+XS9cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuYXBleCA9IHtcblx0XHQnY29tbWVudCc6IFByaXNtLmxhbmd1YWdlcy5jbGlrZS5jb21tZW50LFxuXHRcdCdzdHJpbmcnOiBQcmlzbS5sYW5ndWFnZXMuY2xpa2Uuc3RyaW5nLFxuXHRcdCdzcWwnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKCg/Ols9LCh7Ol18XFxicmV0dXJuKVxccyopXFxbW15cXFtcXF1dKlxcXS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2Utc3FsJyxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnNxbFxuXHRcdH0sXG5cblx0XHQnYW5ub3RhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC9AXFx3K1xcYi8sXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cdFx0J2NsYXNzLW5hbWUnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IGluc2VydENsYXNzTmFtZSgvKFxcYig/OmNsYXNzfGVudW18ZXh0ZW5kc3xpbXBsZW1lbnRzfGluc3RhbmNlb2Z8aW50ZXJmYWNlfG5ld3x0cmlnZ2VyXFxzK1xcdytcXHMrb24pXFxzKyk8Q0xBU1MtTkFNRT4vLnNvdXJjZSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogY2xhc3NOYW1lSW5zaWRlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBjYXN0XG5cdFx0XHRcdHBhdHRlcm46IGluc2VydENsYXNzTmFtZSgvKFxcKFxccyopPENMQVNTLU5BTUU+KD89XFxzKlxcKVxccypbXFx3KF0pLy5zb3VyY2UpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IGNsYXNzTmFtZUluc2lkZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gdmFyaWFibGUvcGFyYW1ldGVyIGRlY2xhcmF0aW9uIGFuZCByZXR1cm4gdHlwZXNcblx0XHRcdFx0cGF0dGVybjogaW5zZXJ0Q2xhc3NOYW1lKC88Q0xBU1MtTkFNRT4oPz1cXHMqXFx3K1xccypbOz0sKCl7Ol0pLy5zb3VyY2UpLFxuXHRcdFx0XHRpbnNpZGU6IGNsYXNzTmFtZUluc2lkZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J3RyaWdnZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYnRyaWdnZXJcXHMrKVxcdytcXGIvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdFx0fSxcblx0XHQna2V5d29yZCc6IGtleXdvcmRzLFxuXHRcdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89XFxzKlxcKCkvaSxcblxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiL2ksXG5cblx0XHQnbnVtYmVyJzogLyg/OlxcQlxcLlxcZCt8XFxiXFxkKyg/OlxcLlxcZCt8TCk/KVxcYi9pLFxuXHRcdCdvcGVyYXRvcic6IC9bIT1dKD86PT0/KT98XFw/XFwuP3wmJnxcXHxcXHx8LS18XFwrXFwrfFstKyovXiZ8XT0/fDp8PDw/PT98PnsxLDN9PT8vLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bKClcXFtcXF17fTssLl0vXG5cdH07XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmFwbCA9IHtcblx0J2NvbW1lbnQnOiAvKD86XHUyMzVEfCNbISBdKS4qJC9tLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8nKD86W14nXFxyXFxuXXwnJykqJy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdudW1iZXInOiAvXHUwMEFGPyg/OlxcZCpcXC4/XFxiXFxkKyg/OmVbK1x1MDBBRl0/XFxkKyk/fFx1MDBBRnxcdTIyMUUpKD86alx1MDBBRj8oPzooPzpcXGQrKD86XFwuXFxkKyk/fFxcLlxcZCspKD86ZVsrXHUwMEFGXT9cXGQrKT98XHUwMEFGfFx1MjIxRSkpPy9pLFxuXHQnc3RhdGVtZW50JzogLzpbQS1aXVthLXpdW0EtWmEtel0qXFxiLyxcblx0J3N5c3RlbS1mdW5jdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvXHUyMzk1W0EtWl0rL2ksXG5cdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0fSxcblx0J2NvbnN0YW50JzogL1tcdTIzNkNcdTIzM0UjXHUyMzk1XHUyMzVFXS8sXG5cdCdmdW5jdGlvbic6IC9bLStcdTAwRDdcdTAwRjdcdTIzMDhcdTIzMEFcdTIyMjN8XHUyMzczXHUyMzc4PypcdTIzNUZcdTI1Q0IhXHUyMzM5PFx1MjI2ND0+XHUyMjY1XHUyMjYwXHUyMjYxXHUyMjYyXHUyMjBBXHUyMzc3XHUyMjJBXHUyMjI5flx1MjIyOFx1MjIyN1x1MjM3MVx1MjM3Mlx1MjM3NCxcdTIzNkFcdTIzM0RcdTIyOTZcdTIzNDlcdTIxOTFcdTIxOTNcdTIyODJcdTIyODNcdTIyODZcdTIyODdcdTIzMzdcdTIzNEJcdTIzNTJcdTIyQTRcdTIyQTVcdTIzNTVcdTIzNEVcdTIyQTNcdTIyQTJcdTIzNDFcdTIzNDJcdTIyNDhcdTIzNkZcdTIxOTdcdTAwQTRcdTIxOTJdLyxcblx0J21vbmFkaWMtb3BlcmF0b3InOiB7XG5cdFx0cGF0dGVybjogL1tcXFxcXFwvXHUyMzNGXHUyMzQwXHUwMEE4XHUyMzY4XHUyMzM2Jlx1MjIyNV0vLFxuXHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdH0sXG5cdCdkeWFkaWMtb3BlcmF0b3InOiB7XG5cdFx0cGF0dGVybjogL1suXHUyMzYzXHUyMzYwXHUyMzY0XHUyMjE4XHUyMzM4QFx1MjMzQVx1MjM2NV0vLFxuXHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdH0sXG5cdCdhc3NpZ25tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cdTIxOTAvLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J3B1bmN0dWF0aW9uJzogL1tcXFs7XFxdKClcdTI1QzdcdTIyQzRdLyxcblx0J2Rmbic6IHtcblx0XHRwYXR0ZXJuOiAvW3t9XHUyMzdBXHUyMzc1XHUyMzc2XHUyMzc5XHUyMjA3XHUyMzZCOl0vLFxuXHRcdGFsaWFzOiAnYnVpbHRpbidcblx0fVxufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmFwcGxlc2NyaXB0ID0ge1xuXHQnY29tbWVudCc6IFtcblx0XHQvLyBBbGxvdyBvbmUgbGV2ZWwgb2YgbmVzdGluZ1xuXHRcdC9cXChcXCooPzpcXChcXCooPzpbXipdfFxcKig/IVxcKSkpKlxcKlxcKXwoPyFcXChcXCopW1xcc1xcU10pKj9cXCpcXCkvLFxuXHRcdC8tLS4rLyxcblx0XHQvIy4rL1xuXHRdLFxuXHQnc3RyaW5nJzogL1wiKD86XFxcXC58W15cIlxcXFxcXHJcXG5dKSpcIi8sXG5cdCdudW1iZXInOiAvKD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OmUtP1xcZCspP1xcYi9pLFxuXHQnb3BlcmF0b3InOiBbXG5cdFx0L1smPVx1MjI2MFx1MjI2NFx1MjI2NSorXFwtXFwvXHUwMEY3Xl18Wzw+XT0/Lyxcblx0XHQvXFxiKD86KD86YmVnaW58ZW5kfHN0YXJ0KXM/IHdpdGh8KD86Y29udGFpbnM/fCg/OmRvZXMgbm90fGRvZXNuJ3QpIGNvbnRhaW4pfCg/OmlzfGlzbid0fGlzIG5vdCkgKD86Y29udGFpbmVkIGJ5fGluKXwoPzooPzppc3xpc24ndHxpcyBub3QpICk/KD86Z3JlYXRlcnxsZXNzKSB0aGFuKD86IG9yIGVxdWFsKT8oPzogdG8pP3woPzpjb21lc3woPzpkb2VzIG5vdHxkb2Vzbid0KSBjb21lKSAoPzphZnRlcnxiZWZvcmUpfCg/OmlzfGlzbid0fGlzIG5vdCkgZXF1YWwoPzogdG8pP3woPzooPzpkb2VzIG5vdHxkb2Vzbid0KSBlcXVhbHxlcXVhbCB0b3xlcXVhbHN8aXMgbm90fGlzbid0KXwoPzphICk/KD86cmVmKD86IHRvKT98cmVmZXJlbmNlIHRvKXwoPzphbmR8YXN8ZGl2fG1vZHxub3R8b3IpKVxcYi9cblx0XSxcblx0J2tleXdvcmQnOiAvXFxiKD86YWJvdXR8YWJvdmV8YWZ0ZXJ8YWdhaW5zdHxhcGFydCBmcm9tfGFyb3VuZHxhc2lkZSBmcm9tfGF0fGJhY2t8YmVmb3JlfGJlZ2lubmluZ3xiZWhpbmR8YmVsb3d8YmVuZWF0aHxiZXNpZGV8YmV0d2VlbnxidXR8Ynl8Y29uc2lkZXJpbmd8Y29udGludWV8Y29weXxkb2VzfGVpZ2h0aHxlbHNlfGVuZHxlcXVhbHxlcnJvcnxldmVyeXxleGl0fGZhbHNlfGZpZnRofGZpcnN0fGZvcnxmb3VydGh8ZnJvbXxmcm9udHxnZXR8Z2l2ZW58Z2xvYmFsfGlmfGlnbm9yaW5nfGlufGluc3RlYWQgb2Z8aW50b3xpc3xpdHxpdHN8bGFzdHxsb2NhbHxtZXxtaWRkbGV8bXl8bmludGh8b2Z8b258b250b3xvdXQgb2Z8b3Zlcnxwcm9wfHByb3BlcnR5fHB1dHxyZXBlYXR8cmV0dXJufHJldHVybmluZ3xzZWNvbmR8c2V0fHNldmVudGh8c2luY2V8c2l4dGh8c29tZXx0ZWxsfHRlbnRofHRoYXR8dGhlfHRoZW58dGhpcmR8dGhyb3VnaHx0aHJ1fHRpbWVvdXR8dGltZXN8dG98dHJhbnNhY3Rpb258dHJ1ZXx0cnl8dW50aWx8d2hlcmV8d2hpbGV8d2hvc2V8d2l0aHx3aXRob3V0KVxcYi8sXG5cdCdjbGFzcy1uYW1lJzogL1xcYig/OlBPU0lYIGZpbGV8UkdCIGNvbG9yfGFsaWFzfGFwcGxpY2F0aW9ufGJvb2xlYW58Y2VudGltZXRlcnN8Y2VudGltZXRyZXN8Y2xhc3N8Y29uc3RhbnR8Y3ViaWMgY2VudGltZXRlcnN8Y3ViaWMgY2VudGltZXRyZXN8Y3ViaWMgZmVldHxjdWJpYyBpbmNoZXN8Y3ViaWMgbWV0ZXJzfGN1YmljIG1ldHJlc3xjdWJpYyB5YXJkc3xkYXRlfGRlZ3JlZXMgQ2Vsc2l1c3xkZWdyZWVzIEZhaHJlbmhlaXR8ZGVncmVlcyBLZWx2aW58ZmVldHxmaWxlfGdhbGxvbnN8Z3JhbXN8aW5jaGVzfGludGVnZXJ8a2lsb2dyYW1zfGtpbG9tZXRlcnN8a2lsb21ldHJlc3xsaXN0fGxpdGVyc3xsaXRyZXN8bWV0ZXJzfG1ldHJlc3xtaWxlc3xudW1iZXJ8b3VuY2VzfHBvdW5kc3xxdWFydHN8cmVhbHxyZWNvcmR8cmVmZXJlbmNlfHNjcmlwdHxzcXVhcmUgZmVldHxzcXVhcmUga2lsb21ldGVyc3xzcXVhcmUga2lsb21ldHJlc3xzcXVhcmUgbWV0ZXJzfHNxdWFyZSBtZXRyZXN8c3F1YXJlIG1pbGVzfHNxdWFyZSB5YXJkc3x0ZXh0fHlhcmRzKVxcYi8sXG5cdCdwdW5jdHVhdGlvbic6IC9be30oKTosXHUwMEFDXHUwMEFCXHUwMEJCXHUzMDBBXHUzMDBCXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5hcWwgPSB7XG5cdCdjb21tZW50JzogL1xcL1xcLy4qfFxcL1xcKltcXHNcXFNdKj9cXCpcXC8vLFxuXHQncHJvcGVydHknOiB7XG5cdFx0cGF0dGVybjogLyhbeyxdXFxzKikoPzooPyFcXGQpXFx3K3woW1wiJ1x1MDBCNGBdKSg/Oig/IVxcMilbXlxcXFxcXHJcXG5dfFxcXFwuKSpcXDIpKD89XFxzKjopLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oW1wiJ10pKD86KD8hXFwxKVteXFxcXFxcclxcbl18XFxcXC4pKlxcMS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdpZGVudGlmaWVyJzoge1xuXHRcdHBhdHRlcm46IC8oW1x1MDBCNGBdKSg/Oig/IVxcMSlbXlxcXFxcXHJcXG5dfFxcXFwuKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQndmFyaWFibGUnOiAvQEA/XFx3Ky8sXG5cdCdrZXl3b3JkJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXFxiV0lUSFxccyspQ09VTlQoPz1cXHMrSU5UT1xcYikvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdC9cXGIoPzpBR0dSRUdBVEV8QUxMfEFORHxBTll8QVNDfENPTExFQ1R8REVTQ3xESVNUSU5DVHxGSUxURVJ8Rk9SfEdSQVBIfElOfElOQk9VTkR8SU5TRVJUfElOVE98S19QQVRIU3xLX1NIT1JURVNUX1BBVEhTfExFVHxMSUtFfExJTUlUfE5PTkV8Tk9UfE5VTEx8T1J8T1VUQk9VTkR8UkVNT1ZFfFJFUExBQ0V8UkVUVVJOfFNIT1JURVNUX1BBVEh8U09SVHxVUERBVEV8VVBTRVJUfFdJTkRPV3xXSVRIKVxcYi9pLFxuXHRcdC8vIHBzZXVkbyBrZXl3b3JkcyBnZXQgYSBsb29rYmVoaW5kIHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlc1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcdy5bXSkoPzpLRUVQfFBSVU5FfFNFQVJDSHxUTylcXGIvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcdy5bXSkoPzpDVVJSRU5UfE5FV3xPTEQpXFxiLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXGJPUFRJT05TKD89XFxzKlxceykvaVxuXHRcdH1cblx0XSxcblx0J2Z1bmN0aW9uJzogL1xcYig/IVxcZClcXHcrKD89XFxzKlxcKCkvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi9pLFxuXHQncmFuZ2UnOiB7XG5cdFx0cGF0dGVybjogL1xcLlxcLi8sXG5cdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0fSxcblx0J251bWJlcic6IFtcblx0XHQvXFxiMGJbMDFdKy9pLFxuXHRcdC9cXGIweFswLTlhLWZdKy9pLFxuXHRcdC8oPzpcXEJcXC5cXGQrfFxcYig/OjB8WzEtOV1cXGQqKSg/OlxcLlxcZCspPykoPzplWystXT9cXGQrKT8vaVxuXHRdLFxuXHQnb3BlcmF0b3InOiAvXFwqezIsfXxbPSFdfnxbIT08Pl09P3wmJnxcXHxcXHx8Wy0rKi8lXS8sXG5cdCdwdW5jdHVhdGlvbic6IC86OnxbPy46LDsoKVtcXF17fV0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuYyA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwvXFwvKD86W15cXHJcXG5cXFxcXXxcXFxcKD86XFxyXFxuP3xcXG58KD8hW1xcclxcbl0pKSkqfFxcL1xcKltcXHNcXFNdKj8oPzpcXCpcXC98JCkvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdC8vIGh0dHBzOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2MvbGFuZ3VhZ2Uvc3RyaW5nX2xpdGVyYWxcblx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXxbXlwiXFxcXFxcclxcbl0pKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0cGF0dGVybjogLyhcXGIoPzplbnVtfHN0cnVjdClcXHMrKD86X19hdHRyaWJ1dGVfX1xccypcXChcXChbXFxzXFxTXSo/XFwpXFwpXFxzKik/KVxcdyt8XFxiW2Etel1cXHcqX3RcXGIvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86X0FsaWduYXN8X0FsaWdub2Z8X0F0b21pY3xfQm9vbHxfQ29tcGxleHxfR2VuZXJpY3xfSW1hZ2luYXJ5fF9Ob3JldHVybnxfU3RhdGljX2Fzc2VydHxfVGhyZWFkX2xvY2FsfF9fYXR0cmlidXRlX198YXNtfGF1dG98YnJlYWt8Y2FzZXxjaGFyfGNvbnN0fGNvbnRpbnVlfGRlZmF1bHR8ZG98ZG91YmxlfGVsc2V8ZW51bXxleHRlcm58ZmxvYXR8Zm9yfGdvdG98aWZ8aW5saW5lfGludHxsb25nfHJlZ2lzdGVyfHJldHVybnxzaG9ydHxzaWduZWR8c2l6ZW9mfHN0YXRpY3xzdHJ1Y3R8c3dpdGNofHR5cGVkZWZ8dHlwZW9mfHVuaW9ufHVuc2lnbmVkfHZvaWR8dm9sYXRpbGV8d2hpbGUpXFxiLyxcblx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1cXHMqXFwoKS9pLFxuXHQnbnVtYmVyJzogLyg/OlxcYjB4KD86W1xcZGEtZl0rKD86XFwuW1xcZGEtZl0qKT98XFwuW1xcZGEtZl0rKSg/OnBbKy1dP1xcZCspP3woPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86ZVsrLV0/XFxkKyk/KVtmdWxdezAsNH0vaSxcblx0J29wZXJhdG9yJzogLz4+PT98PDw9P3wtPnwoWy0rJnw6XSlcXDF8Wz86fl18Wy0rKi8lJnxeIT08Pl09Py9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjJywgJ3N0cmluZycsIHtcblx0J2NoYXInOiB7XG5cdFx0Ly8gaHR0cHM6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvYy9sYW5ndWFnZS9jaGFyYWN0ZXJfY29uc3RhbnRcblx0XHRwYXR0ZXJuOiAvJyg/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfFteJ1xcXFxcXHJcXG5dKXswLDMyfScvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnYycsICdzdHJpbmcnLCB7XG5cdCdtYWNybyc6IHtcblx0XHQvLyBhbGxvdyBmb3IgbXVsdGlsaW5lIG1hY3JvIGRlZmluaXRpb25zXG5cdFx0Ly8gc3BhY2VzIGFmdGVyIHRoZSAjIGNoYXJhY3RlciBjb21waWxlIGZpbmUgd2l0aCBnY2Ncblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKSNcXHMqW2Etel0oPzpbXlxcclxcblxcXFwvXXxcXC8oPyFcXCopfFxcL1xcKig/OlteKl18XFwqKD8hXFwvKSkqXFwqXFwvfFxcXFwoPzpcXHJcXG58W1xcc1xcU10pKSovaW0sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eScsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnc3RyaW5nJzogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gaGlnaGxpZ2h0IHRoZSBwYXRoIG9mIHRoZSBpbmNsdWRlIHN0YXRlbWVudCBhcyBhIHN0cmluZ1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eKCNcXHMqaW5jbHVkZVxccyopPFtePl0rPi8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRQcmlzbS5sYW5ndWFnZXMuY1snc3RyaW5nJ11cblx0XHRcdF0sXG5cdFx0XHQnY2hhcic6IFByaXNtLmxhbmd1YWdlcy5jWydjaGFyJ10sXG5cdFx0XHQnY29tbWVudCc6IFByaXNtLmxhbmd1YWdlcy5jWydjb21tZW50J10sXG5cdFx0XHQnbWFjcm8tbmFtZSc6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXiNcXHMqZGVmaW5lXFxzKylcXHcrXFxiKD8hXFwoKS9pLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXiNcXHMqZGVmaW5lXFxzKylcXHcrXFxiKD89XFwoKS9pLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHRcdFx0fVxuXHRcdFx0XSxcblx0XHRcdC8vIGhpZ2hsaWdodCBtYWNybyBkaXJlY3RpdmVzIGFzIGtleXdvcmRzXG5cdFx0XHQnZGlyZWN0aXZlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXigjXFxzKilbYS16XSsvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0XHR9LFxuXHRcdFx0J2RpcmVjdGl2ZS1oYXNoJzogL14jLyxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC8jI3xcXFxcKD89W1xcclxcbl0pLyxcblx0XHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxTW1xcc1xcU10qLyxcblx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuY1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2MnLCAnZnVuY3Rpb24nLCB7XG5cdC8vIGhpZ2hsaWdodCBwcmVkZWZpbmVkIG1hY3JvcyBhcyBjb25zdGFudHNcblx0J2NvbnN0YW50JzogL1xcYig/OkVPRnxOVUxMfFNFRUtfQ1VSfFNFRUtfRU5EfFNFRUtfU0VUfF9fREFURV9ffF9fRklMRV9ffF9fTElORV9ffF9fVElNRVNUQU1QX198X19USU1FX198X19mdW5jX198c3RkZXJyfHN0ZGlufHN0ZG91dClcXGIvXG59KTtcblxuZGVsZXRlIFByaXNtLmxhbmd1YWdlcy5jWydib29sZWFuJ107XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIga2V5d29yZCA9IC9cXGIoPzphbGlnbmFzfGFsaWdub2Z8YXNtfGF1dG98Ym9vbHxicmVha3xjYXNlfGNhdGNofGNoYXJ8Y2hhcjE2X3R8Y2hhcjMyX3R8Y2hhcjhfdHxjbGFzc3xjb19hd2FpdHxjb19yZXR1cm58Y29feWllbGR8Y29tcGx8Y29uY2VwdHxjb25zdHxjb25zdF9jYXN0fGNvbnN0ZXZhbHxjb25zdGV4cHJ8Y29uc3Rpbml0fGNvbnRpbnVlfGRlY2x0eXBlfGRlZmF1bHR8ZGVsZXRlfGRvfGRvdWJsZXxkeW5hbWljX2Nhc3R8ZWxzZXxlbnVtfGV4cGxpY2l0fGV4cG9ydHxleHRlcm58ZmluYWx8ZmxvYXR8Zm9yfGZyaWVuZHxnb3RvfGlmfGltcG9ydHxpbmxpbmV8aW50fGludDE2X3R8aW50MzJfdHxpbnQ2NF90fGludDhfdHxsb25nfG1vZHVsZXxtdXRhYmxlfG5hbWVzcGFjZXxuZXd8bm9leGNlcHR8bnVsbHB0cnxvcGVyYXRvcnxvdmVycmlkZXxwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8cmVnaXN0ZXJ8cmVpbnRlcnByZXRfY2FzdHxyZXF1aXJlc3xyZXR1cm58c2hvcnR8c2lnbmVkfHNpemVvZnxzdGF0aWN8c3RhdGljX2Fzc2VydHxzdGF0aWNfY2FzdHxzdHJ1Y3R8c3dpdGNofHRlbXBsYXRlfHRoaXN8dGhyZWFkX2xvY2FsfHRocm93fHRyeXx0eXBlZGVmfHR5cGVpZHx0eXBlbmFtZXx1aW50MTZfdHx1aW50MzJfdHx1aW50NjRfdHx1aW50OF90fHVuaW9ufHVuc2lnbmVkfHVzaW5nfHZpcnR1YWx8dm9pZHx2b2xhdGlsZXx3Y2hhcl90fHdoaWxlKVxcYi87XG5cdHZhciBtb2ROYW1lID0gL1xcYig/ITxrZXl3b3JkPilcXHcrKD86XFxzKlxcLlxccypcXHcrKSpcXGIvLnNvdXJjZS5yZXBsYWNlKC88a2V5d29yZD4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4ga2V5d29yZC5zb3VyY2U7IH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5jcHAgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjJywge1xuXHRcdCdjbGFzcy1uYW1lJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhcXGIoPzpjbGFzc3xjb25jZXB0fGVudW18c3RydWN0fHR5cGVuYW1lKVxccyspKD8hPGtleXdvcmQ+KVxcdysvLnNvdXJjZVxuXHRcdFx0XHRcdC5yZXBsYWNlKC88a2V5d29yZD4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4ga2V5d29yZC5zb3VyY2U7IH0pKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdC8vIFRoaXMgaXMgaW50ZW5kZWQgdG8gY2FwdHVyZSB0aGUgY2xhc3MgbmFtZSBvZiBtZXRob2QgaW1wbGVtZW50YXRpb25zIGxpa2U6XG5cdFx0XHQvLyAgIHZvaWQgZm9vOjpiYXIoKSBjb25zdCB7fVxuXHRcdFx0Ly8gSG93ZXZlciEgVGhlIGBmb29gIGluIHRoZSBhYm92ZSBleGFtcGxlIGNvdWxkIGFsc28gYmUgYSBuYW1lc3BhY2UsIHNvIHdlIG9ubHkgY2FwdHVyZSB0aGUgY2xhc3MgbmFtZSBpZlxuXHRcdFx0Ly8gaXQgc3RhcnRzIHdpdGggYW4gdXBwZXJjYXNlIGxldHRlci4gVGhpcyBhcHByb3hpbWF0aW9uIHNob3VsZCBnaXZlIGRlY2VudCByZXN1bHRzLlxuXHRcdFx0L1xcYltBLVpdXFx3Kig/PVxccyo6OlxccypcXHcrXFxzKlxcKCkvLFxuXHRcdFx0Ly8gVGhpcyB3aWxsIGNhcHR1cmUgdGhlIGNsYXNzIG5hbWUgYmVmb3JlIGRlc3RydWN0b3JzIGxpa2U6XG5cdFx0XHQvLyAgIEZvbzo6fkZvbygpIHt9XG5cdFx0XHQvXFxiW0EtWl9dXFx3Kig/PVxccyo6Olxccyp+XFx3K1xccypcXCgpL2ksXG5cdFx0XHQvLyBUaGlzIGFsc28gaW50ZW5kcyB0byBjYXB0dXJlIHRoZSBjbGFzcyBuYW1lIG9mIG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgYnV0IGhlcmUgdGhlIGNsYXNzIGhhcyB0ZW1wbGF0ZVxuXHRcdFx0Ly8gcGFyYW1ldGVycywgc28gaXQgY2FuJ3QgYmUgYSBuYW1lc3BhY2UgKHVudGlsIEMrKyBhZGRzIGdlbmVyaWMgbmFtZXNwYWNlcykuXG5cdFx0XHQvXFxiXFx3Kyg/PVxccyo8KD86W148Pl18PCg/OltePD5dfDxbXjw+XSo+KSo+KSo+XFxzKjo6XFxzKlxcdytcXHMqXFwoKS9cblx0XHRdLFxuXHRcdCdrZXl3b3JkJzoga2V5d29yZCxcblx0XHQnbnVtYmVyJzoge1xuXHRcdFx0cGF0dGVybjogLyg/OlxcYjBiWzAxJ10rfFxcYjB4KD86W1xcZGEtZiddKyg/OlxcLltcXGRhLWYnXSopP3xcXC5bXFxkYS1mJ10rKSg/OnBbKy1dP1tcXGQnXSspP3woPzpcXGJbXFxkJ10rKD86XFwuW1xcZCddKik/fFxcQlxcLltcXGQnXSspKD86ZVsrLV0/W1xcZCddKyk/KVtmdWxdezAsNH0vaSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J29wZXJhdG9yJzogLz4+PT98PDw9P3wtPnwtLXxcXCtcXCt8JiZ8XFx8XFx8fFs/On5dfDw9PnxbLSsqLyUmfF4hPTw+XT0/fFxcYig/OmFuZHxhbmRfZXF8Yml0YW5kfGJpdG9yfG5vdHxub3RfZXF8b3J8b3JfZXF8eG9yfHhvcl9lcSlcXGIvLFxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiL1xuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjcHAnLCAnc3RyaW5nJywge1xuXHRcdCdtb2R1bGUnOiB7XG5cdFx0XHQvLyBodHRwczovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvbGFuZ3VhZ2UvbW9kdWxlc1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0XHQvKFxcYig/OmltcG9ydHxtb2R1bGUpXFxzKykvLnNvdXJjZSArXG5cdFx0XHRcdCcoPzonICtcblx0XHRcdFx0Ly8gaGVhZGVyLW5hbWVcblx0XHRcdFx0L1wiKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8W15cIlxcXFxcXHJcXG5dKSpcInw8W148Plxcclxcbl0qPi8uc291cmNlICtcblx0XHRcdFx0J3wnICtcblx0XHRcdFx0Ly8gbW9kdWxlIG5hbWUgb3IgcGFydGl0aW9uIG9yIGJvdGhcblx0XHRcdFx0Lzxtb2QtbmFtZT4oPzpcXHMqOlxccyo8bW9kLW5hbWU+KT98Olxccyo8bW9kLW5hbWU+Ly5zb3VyY2UucmVwbGFjZSgvPG1vZC1uYW1lPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBtb2ROYW1lOyB9KSArXG5cdFx0XHRcdCcpJ1xuXHRcdFx0KSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3N0cmluZyc6IC9eWzxcIl1bXFxzXFxTXSsvLFxuXHRcdFx0XHQnb3BlcmF0b3InOiAvOi8sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQncmF3LXN0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9SXCIoW14oKVxcXFwgXXswLDE2fSlcXChbXFxzXFxTXSo/XFwpXFwxXCIvLFxuXHRcdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjcHAnLCAna2V5d29yZCcsIHtcblx0XHQnZ2VuZXJpYy1mdW5jdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPyFvcGVyYXRvclxcYilbYS16X11cXHcqXFxzKjwoPzpbXjw+XXw8W148Pl0qPikqPig/PVxccypcXCgpL2ksXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2Z1bmN0aW9uJzogL15cXHcrLyxcblx0XHRcdFx0J2dlbmVyaWMnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLzxbXFxzXFxTXSsvLFxuXHRcdFx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZScsXG5cdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuY3BwXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2NwcCcsICdvcGVyYXRvcicsIHtcblx0XHQnZG91YmxlLWNvbG9uJzoge1xuXHRcdFx0cGF0dGVybjogLzo6Lyxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjcHAnLCAnY2xhc3MtbmFtZScsIHtcblx0XHQvLyB0aGUgYmFzZSBjbGF1c2UgaXMgYW4gb3B0aW9uYWwgbGlzdCBvZiBwYXJlbnQgY2xhc3Nlc1xuXHRcdC8vIGh0dHBzOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9sYW5ndWFnZS9jbGFzc1xuXHRcdCdiYXNlLWNsYXVzZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxiKD86Y2xhc3N8c3RydWN0KVxccytcXHcrXFxzKjpcXHMqKVteO3t9XCInXFxzXSsoPzpcXHMrW147e31cIidcXHNdKykqKD89XFxzKls7e10pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NwcCcsIHt9KVxuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnaW5zaWRlJywgJ2RvdWJsZS1jb2xvbicsIHtcblx0XHQvLyBBbGwgdW50b2tlbml6ZWQgd29yZHMgdGhhdCBhcmUgbm90IG5hbWVzcGFjZXMgc2hvdWxkIGJlIGNsYXNzIG5hbWVzXG5cdFx0J2NsYXNzLW5hbWUnOiAvXFxiW2Etel9dXFx3KlxcYig/IVxccyo6OikvaVxuXHR9LCBQcmlzbS5sYW5ndWFnZXMuY3BwWydiYXNlLWNsYXVzZSddKTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuYXJkdWlubyA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NwcCcsIHtcblx0J2tleXdvcmQnOiAvXFxiKD86U3RyaW5nfGFycmF5fGJvb2x8Ym9vbGVhbnxicmVha3xieXRlfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkb3xkb3VibGV8ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnxnb3RvfGlmfGlufGluc3RhbmNlb2Z8aW50fGludGVnZXJ8bG9uZ3xsb29wfG5ld3xudWxsfHJldHVybnxzZXR1cHxzdHJpbmd8c3dpdGNofHRocm93fHRyeXx2b2lkfHdoaWxlfHdvcmQpXFxiLyxcblx0J2NvbnN0YW50JzogL1xcYig/OkFOQUxPR19NRVNTQUdFfERFRkFVTFR8RElHSVRBTF9NRVNTQUdFfEVYVEVSTkFMfEZJUk1BVEFfU1RSSU5HfEhJR0h8SU5QVVR8SU5QVVRfUFVMTFVQfElOVEVSTkFMfElOVEVSTkFMMVYxfElOVEVSTkFMMlY1NnxMRURfQlVJTFRJTnxMT1d8T1VUUFVUfFJFUE9SVF9BTkFMT0d8UkVQT1JUX0RJR0lUQUx8U0VUX1BJTl9NT0RFfFNZU0VYX1NUQVJUfFNZU1RFTV9SRVNFVClcXGIvLFxuXHQnYnVpbHRpbic6IC9cXGIoPzpBdWRpb3xCU1NJRHxCcmlkZ2V8Q2xpZW50fENvbnNvbGV8RUVQUk9NfEVzcGxvcmF8RXNwbG9yYVRGVHxFdGhlcm5ldHxFdGhlcm5ldENsaWVudHxFdGhlcm5ldFNlcnZlcnxFdGhlcm5ldFVEUHxGaWxlfEZpbGVJT3xGaWxlU3lzdGVtfEZpcm1hdGF8R1BSU3xHU018R1NNQmFuZHxHU01DbGllbnR8R1NNTW9kZW18R1NNUElOfEdTTVNjYW5uZXJ8R1NNU2VydmVyfEdTTVZvaWNlQ2FsbHxHU01fU01TfEh0dHBDbGllbnR8SVBBZGRyZXNzfElScmVhZHxLZXlib2FyZHxLZXlib2FyZENvbnRyb2xsZXJ8TGlxdWlkQ3J5c3RhbHxMaXF1aWRDcnlzdGFsX0kyQ3xNYWlsYm94fE1vdXNlfE1vdXNlQ29udHJvbGxlcnxQSW1hZ2V8UHJvY2Vzc3xSU1NJfFJvYm90Q29udHJvbHxSb2JvdE1vdG9yfFNEfFNQSXxTU0lEfFNjaGVkdWxlcnxTZXJpYWx8U2VydmVyfFNlcnZvfFNvZnR3YXJlU2VyaWFsfFN0ZXBwZXJ8U3RyZWFtfFRGVHxUYXNrfFVTQkhvc3R8V2lGaXxXaUZpQ2xpZW50fFdpRmlTZXJ2ZXJ8V2lGaVVEUHxXaXJlfFl1bkNsaWVudHxZdW5TZXJ2ZXJ8YWJzfGFkZFBhcmFtZXRlcnxhbmFsb2dSZWFkfGFuYWxvZ1JlYWRSZXNvbHV0aW9ufGFuYWxvZ1JlZmVyZW5jZXxhbmFsb2dXcml0ZXxhbmFsb2dXcml0ZVJlc29sdXRpb258YW5zd2VyQ2FsbHxhdHRhY2h8YXR0YWNoR1BSU3xhdHRhY2hJbnRlcnJ1cHR8YXR0YWNoZWR8YXV0b3Njcm9sbHxhdmFpbGFibGV8YmFja2dyb3VuZHxiZWVwfGJlZ2lufGJlZ2luUGFja2V0fGJlZ2luU0R8YmVnaW5TTVN8YmVnaW5TcGVha2VyfGJlZ2luVEZUfGJlZ2luVHJhbnNtaXNzaW9ufGJlZ2luV3JpdGV8Yml0fGJpdENsZWFyfGJpdFJlYWR8Yml0U2V0fGJpdFdyaXRlfGJsaW5rfGJsaW5rVmVyc2lvbnxidWZmZXJ8Y2hhbmdlUElOfGNoZWNrUElOfGNoZWNrUFVLfGNoZWNrUmVnfGNpcmNsZXxjaXR5TmFtZVJlYWR8Y2l0eU5hbWVXcml0ZXxjbGVhcnxjbGVhclNjcmVlbnxjbGlja3xjbG9zZXxjb21wYXNzUmVhZHxjb25maWd8Y29ubmVjdHxjb25uZWN0ZWR8Y29uc3RyYWlufGNvc3xjb3VudHJ5TmFtZVJlYWR8Y291bnRyeU5hbWVXcml0ZXxjcmVhdGVDaGFyfGN1cnNvcnxkZWJ1Z1ByaW50fGRlbGF5fGRlbGF5TWljcm9zZWNvbmRzfGRldGFjaHxkZXRhY2hJbnRlcnJ1cHR8ZGlnaXRhbFJlYWR8ZGlnaXRhbFdyaXRlfGRpc2Nvbm5lY3R8ZGlzcGxheXxkaXNwbGF5TG9nb3N8ZHJhd0JNUHxkcmF3Q29tcGFzc3xlbmNyeXB0aW9uVHlwZXxlbmR8ZW5kUGFja2V0fGVuZFNNU3xlbmRUcmFuc21pc3Npb258ZW5kV3JpdGV8ZXhpc3RzfGV4aXRWYWx1ZXxmaWxsfGZpbmR8ZmluZFVudGlsfGZsdXNofGdhdGV3YXlJUHxnZXR8Z2V0QXN5bmNocm9ub3VzbHl8Z2V0QmFuZHxnZXRCdXR0b258Z2V0Q3VycmVudENhcnJpZXJ8Z2V0SU1FSXxnZXRLZXl8Z2V0TW9kaWZpZXJzfGdldE9lbUtleXxnZXRQSU5Vc2VkfGdldFJlc3VsdHxnZXRTaWduYWxTdHJlbmd0aHxnZXRTb2NrZXR8Z2V0Vm9pY2VDYWxsU3RhdHVzfGdldFhDaGFuZ2V8Z2V0WUNoYW5nZXxoYW5nQ2FsbHxoZWlnaHR8aGlnaEJ5dGV8aG9tZXxpbWFnZXxpbnRlcnJ1cHRzfGlzQWN0aW9uRG9uZXxpc0RpcmVjdG9yeXxpc0xpc3RlbmluZ3xpc1BJTnxpc1ByZXNzZWR8aXNWYWxpZHxrZXlQcmVzc2VkfGtleVJlbGVhc2VkfGtleWJvYXJkUmVhZHxrbm9iUmVhZHxsZWZ0VG9SaWdodHxsaW5lfGxpbmVGb2xsb3dDb25maWd8bGlzdGVufGxpc3Rlbk9uTG9jYWxob3N0fGxvYWRJbWFnZXxsb2NhbElQfGxvd0J5dGV8bWFjQWRkcmVzc3xtYWludGFpbnxtYXB8bWF4fG1lc3NhZ2VBdmFpbGFibGV8bWljcm9zfG1pbGxpc3xtaW58bWtkaXJ8bW90b3JzU3RvcHxtb3RvcnNXcml0ZXxtb3VzZURyYWdnZWR8bW91c2VNb3ZlZHxtb3VzZVByZXNzZWR8bW91c2VSZWxlYXNlZHxtb3ZlfG5vQXV0b3Njcm9sbHxub0JsaW5rfG5vQnVmZmVyfG5vQ3Vyc29yfG5vRGlzcGxheXxub0ZpbGx8bm9JbnRlcnJ1cHRzfG5vTGlzdGVuT25Mb2NhbGhvc3R8bm9TdHJva2V8bm9Ub25lfG9uUmVjZWl2ZXxvblJlcXVlc3R8b3BlbnxvcGVuTmV4dEZpbGV8b3ZlcmZsb3d8cGFyc2VDb21tYW5kfHBhcnNlRmxvYXR8cGFyc2VJbnR8cGFyc2VQYWNrZXR8cGF1c2VNb2RlfHBlZWt8cGluTW9kZXxwbGF5RmlsZXxwbGF5TWVsb2R5fHBvaW50fHBvaW50VG98cG9zaXRpb258cG93fHByZXBhcmV8cHJlc3N8cHJpbnR8cHJpbnRGaXJtd2FyZVZlcnNpb258cHJpbnRWZXJzaW9ufHByaW50bG58cHJvY2Vzc3xwcm9jZXNzSW5wdXR8cHVsc2VJbnxwdXR8cmFuZG9tfHJhbmRvbVNlZWR8cmVhZHxyZWFkQWNjZWxlcm9tZXRlcnxyZWFkQmx1ZXxyZWFkQnV0dG9ufHJlYWRCeXRlc3xyZWFkQnl0ZXNVbnRpbHxyZWFkR3JlZW58cmVhZEpveXN0aWNrQnV0dG9ufHJlYWRKb3lzdGlja1N3aXRjaHxyZWFkSm95c3RpY2tYfHJlYWRKb3lzdGlja1l8cmVhZExpZ2h0U2Vuc29yfHJlYWRNZXNzYWdlfHJlYWRNaWNyb3Bob25lfHJlYWROZXR3b3Jrc3xyZWFkUmVkfHJlYWRTbGlkZXJ8cmVhZFN0cmluZ3xyZWFkU3RyaW5nVW50aWx8cmVhZFRlbXBlcmF0dXJlfHJlYWR5fHJlY3R8cmVsZWFzZXxyZWxlYXNlQWxsfHJlbW90ZUlQfHJlbW90ZU51bWJlcnxyZW1vdGVQb3J0fHJlbW92ZXxyZXF1ZXN0RnJvbXxyZXRyaWV2ZUNhbGxpbmdOdW1iZXJ8cmV3aW5kRGlyZWN0b3J5fHJpZ2h0VG9MZWZ0fHJtZGlyfHJvYm90TmFtZVJlYWR8cm9ib3ROYW1lV3JpdGV8cnVufHJ1bkFzeW5jaHJvbm91c2x5fHJ1blNoZWxsQ29tbWFuZHxydW5TaGVsbENvbW1hbmRBc3luY2hyb25vdXNseXxydW5uaW5nfHNjYW5OZXR3b3Jrc3xzY3JvbGxEaXNwbGF5TGVmdHxzY3JvbGxEaXNwbGF5UmlnaHR8c2Vla3xzZW5kQW5hbG9nfHNlbmREaWdpdGFsUG9ydFBhaXJ8c2VuZERpZ2l0YWxQb3J0c3xzZW5kU3RyaW5nfHNlbmRTeXNleHxzZXJpYWxFdmVudHxzZXRCYW5kfHNldEJpdE9yZGVyfHNldENsb2NrRGl2aWRlcnxzZXRDdXJzb3J8c2V0RE5TfHNldERhdGFNb2RlfHNldEZpcm13YXJlVmVyc2lvbnxzZXRNb2RlfHNldFBJTlVzZWR8c2V0U3BlZWR8c2V0VGV4dFNpemV8c2V0VGltZW91dHxzaGlmdElufHNoaWZ0T3V0fHNodXRkb3dufHNpbnxzaXplfHNxcnR8c3RhcnRMb29wfHN0ZXB8c3RvcHxzdHJva2V8c3VibmV0TWFza3xzd2l0Y2hQSU58dGFufHRlbXBvV3JpdGV8dGV4dHx0b25lfHRyYW5zZmVyfHR1bmVXcml0ZXx0dXJufHVwZGF0ZUlSfHVzZXJOYW1lUmVhZHx1c2VyTmFtZVdyaXRlfHZvaWNlQ2FsbHx3YWl0Q29udGludWV8d2lkdGh8d3JpdGV8d3JpdGVCbHVlfHdyaXRlR3JlZW58d3JpdGVKU09OfHdyaXRlTWVzc2FnZXx3cml0ZU1pY3Jvc2Vjb25kc3x3cml0ZVJHQnx3cml0ZVJlZHx5aWVsZClcXGIvXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmlubyA9IFByaXNtLmxhbmd1YWdlcy5hcmR1aW5vO1xuXG5QcmlzbS5sYW5ndWFnZXMuYXJmZiA9IHtcblx0J2NvbW1lbnQnOiAvJS4qLyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFtcIiddKSg/OlxcXFwufCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC9AKD86YXR0cmlidXRlfGRhdGF8ZW5kfHJlbGF0aW9uKVxcYi9pLFxuXHQnbnVtYmVyJzogL1xcYlxcZCsoPzpcXC5cXGQrKT9cXGIvLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9LF0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuYXJtYXNtID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvOy4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXFxyXFxuXXxcIlwiKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3ZhcmlhYmxlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W14kXSkoPzpcXCR7Mn0pKilcXCRcXHcrLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0J2NoYXInOiB7XG5cdFx0cGF0dGVybjogLycoPzpbXidcXHJcXG5dezAsNH18JycpJy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCd2ZXJzaW9uLXN5bWJvbCc6IHtcblx0XHRwYXR0ZXJuOiAvXFx8W1xcd0BdK1xcfC8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cblx0J2Jvb2xlYW4nOiAvXFxiKD86RkFMU0V8VFJVRSlcXGIvLFxuXHQnZGlyZWN0aXZlJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzpBTElBU3xBTElHTnxBUkVBfEFSTXxBU1NFUlR8QVRUUnxDTnxDT0RFfENPREUxNnxDT0RFMzJ8Q09NTU9OfENQfERBVEF8RENCfERDRHxEQ0RPfERDRFV8RENGRHxEQ0ZEVXxEQ0l8RENRfERDUVV8RENXfERDV1V8RE58RUxJRnxFTFNFfEVORHxFTkRGVU5DfEVORElGfEVORFB8RU5UUll8RVFVfEVYUE9SVHxFWFBPUlRBU3xFWFRFUk58RklFTER8RklMTHxGTnxGVU5DVElPTnxHQkxBfEdCTEx8R0JMU3xHRVR8R0xPQkFMfElGfElNUE9SVHxJTkNCSU58SU5DTFVERXxJTkZPfEtFRVB8TENMQXxMQ0xMfExDTFN8TFRPUkd8TUFDUk98TUFQfE1FTkR8TUVYSVR8Tk9GUHxPUFR8UFJFU0VSVkU4fFBST0N8UU58UkVBRE9OTFl8UkVMT0N8UkVRVUlSRXxSRVFVSVJFOHxSTElTVHxST1VUfFNFVEF8U0VUTHxTRVRTfFNOfFNQQUNFfFNVQlR8VEhVTUJ8VEhVTUJYfFRUTHxXRU5EfFdISUxFKVxcYi8sXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblx0J2luc3RydWN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oKD86XnwoPzpefFteXFxcXF0pKD86XFxyXFxuP3xcXG4pKVsgXFx0XSooPzooPzpbQS1aXVtBLVowLTlfXSpbYS16XVxcdyp8W2Etel1cXHcqfFxcZCspWyBcXHRdKyk/KVxcYltBLVouXStcXGIvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQndmFyaWFibGUnOiAvXFwkXFx3Ky8sXG5cblx0J251bWJlcic6IC8oPzpcXGJbMi05XV9cXGQrfCg/OlxcYlxcZCsoPzpcXC5cXGQrKT98XFxCXFwuXFxkKykoPzplLT9cXGQrKT98XFxiMCg/OltmZF1ffHgpWzAtOWEtZl0rfCZbMC05YS1mXSspXFxiL2ksXG5cblx0J3JlZ2lzdGVyJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzpyXFxkfGxyKVxcYi8sXG5cdFx0YWxpYXM6ICdzeW1ib2wnXG5cdH0sXG5cblx0J29wZXJhdG9yJzogLzw+fDw8fD4+fCYmfFxcfFxcfHxbPSE8Pi9dPT98WytcXC0qJSM/JnxeXXw6W0EtWl0rOi8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKClbXFxdLF0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXNbJ2FybS1hc20nXSA9IFByaXNtLmxhbmd1YWdlcy5hcm1hc207XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBsYW5nXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXR0ZXJuXG5cdCAqL1xuXHR2YXIgY3JlYXRlTGFuZ3VhZ2VTdHJpbmcgPSBmdW5jdGlvbiAobGFuZywgcGF0dGVybikge1xuXHRcdHJldHVybiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoL1xceyEvLnNvdXJjZSArICcoPzonICsgKHBhdHRlcm4gfHwgbGFuZykgKyAnKScgKyAvJFtcXHNcXFNdKlxcfS8uc291cmNlLCAnbScpLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdlbWJlZGRlZCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5cXHshXFx3K1xcYilbXFxzXFxTXSsoPz1cXH0kKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ2xhbmd1YWdlLScgKyBsYW5nLFxuXHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzW2xhbmddXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdFx0fVxuXHRcdH07XG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmFydHVybyA9IHtcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC87LiovLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblxuXHRcdCdjaGFyYWN0ZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvYC5gLyxcblx0XHRcdGFsaWFzOiAnY2hhcicsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXG5cdFx0J251bWJlcic6IHtcblx0XHRcdHBhdHRlcm46IC9cXGJcXGQrKD86XFwuXFxkKyg/OlxcLlxcZCsoPzotW1xcdystXSspPyk/KT9cXGIvLFxuXHRcdH0sXG5cblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL1wiKD86W15cIlxcXFxcXHJcXG5dfFxcXFwuKSpcIi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXG5cdFx0J3JlZ2V4Jzoge1xuXHRcdFx0cGF0dGVybjogL1xce1xcLy4qP1xcL1xcfS8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXG5cdFx0J2h0bWwtc3RyaW5nJzogY3JlYXRlTGFuZ3VhZ2VTdHJpbmcoJ2h0bWwnKSxcblx0XHQnY3NzLXN0cmluZyc6IGNyZWF0ZUxhbmd1YWdlU3RyaW5nKCdjc3MnKSxcblx0XHQnanMtc3RyaW5nJzogY3JlYXRlTGFuZ3VhZ2VTdHJpbmcoJ2pzJyksXG5cdFx0J21kLXN0cmluZyc6IGNyZWF0ZUxhbmd1YWdlU3RyaW5nKCdtZCcpLFxuXHRcdCdzcWwtc3RyaW5nJzogY3JlYXRlTGFuZ3VhZ2VTdHJpbmcoJ3NxbCcpLFxuXHRcdCdzaC1zdHJpbmcnOiBjcmVhdGVMYW5ndWFnZVN0cmluZygnc2hlbGwnLCAnc2gnKSxcblxuXHRcdCdtdWx0aXN0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9cdTAwQkIuKnxcXHs6W1xcc1xcU10qPzpcXH18XFx7W1xcc1xcU10qP1xcfXxeLXs2fSRbXFxzXFxTXSovbSxcblx0XHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cblx0XHQnbGFiZWwnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFx3K1xcYlxcPz86Lyxcblx0XHRcdGFsaWFzOiAncHJvcGVydHknXG5cdFx0fSxcblxuXHRcdCdsaXRlcmFsJzoge1xuXHRcdFx0cGF0dGVybjogLycoPzpcXHcrXFxiXFw/Pzo/KS8sXG5cdFx0XHRhbGlhczogJ2NvbnN0YW50J1xuXHRcdH0sXG5cblx0XHQndHlwZSc6IHtcblx0XHRcdHBhdHRlcm46IC86KD86XFx3K1xcYlxcPz86PykvLFxuXHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHRcdH0sXG5cblx0XHQnY29sb3InOiAvI1xcdysvLFxuXG5cdFx0J3ByZWRpY2F0ZSc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzphbGx8YW5kfGFueXxhc2NpaXxhdHRyfGF0dHJpYnV0ZXxhdHRyaWJ1dGVMYWJlbHxiaW5hcnl8YmxvY2t8Y2hhcnxjb250YWluc3xkYXRhYmFzZXxkYXRlfGRpY3Rpb25hcnl8ZW1wdHl8ZXF1YWx8ZXZlbnxldmVyeXxleGlzdHN8ZmFsc2V8ZmxvYXRpbmd8ZnVuY3Rpb258Z3JlYXRlcnxncmVhdGVyT3JFcXVhbHxpZnxpbnxpbmxpbmV8aW50ZWdlcnxpc3xrZXl8bGFiZWx8bGVhcHxsZXNzfGxlc3NPckVxdWFsfGxpdGVyYWx8bG9naWNhbHxsb3dlcnxuYW5kfG5lZ2F0aXZlfG5vcnxub3R8bm90RXF1YWx8bnVsbHxudW1lcmljfG9kZHxvcnxwYXRofHBhdGhMYWJlbHxwb3NpdGl2ZXxwcmVmaXh8cHJpbWV8cmVnZXh8c2FtZXxzZXR8c29tZXxzb3J0ZWR8c3RhbmRhbG9uZXxzdHJpbmd8c3Vic2V0fHN1ZmZpeHxzdXBlcnNldHxzeW1ib2x8c3ltYm9sTGl0ZXJhbHx0cnVlfHRyeXx0eXBlfHVubGVzc3x1cHBlcnx3aGVufHdoaXRlc3BhY2V8d29yZHx4bm9yfHhvcnx6ZXJvKVxcPy8sXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fSxcblxuXHRcdCdidWlsdGluLWZ1bmN0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYig/OmFic3xhY29zfGFjb3NofGFjc2VjfGFjc2VjaHxhY3RhbnxhY3Rhbmh8YWRkfGFmdGVyfGFsZXJ0fGFsaWFzfGFuZHxhbmdsZXxhcHBlbmR8YXJnfGFyZ3N8YXJpdHl8YXJyYXl8YXN8YXNlY3xhc2VjaHxhc2lufGFzaW5ofGF0YW58YXRhbjJ8YXRhbmh8YXR0cnxhdHRyc3xhdmVyYWdlfGJlZm9yZXxiZW5jaG1hcmt8YmxlbmR8YnJlYWt8Y2FsbHxjYXBpdGFsaXplfGNhc2V8Y2VpbHxjaG9wfGNsZWFyfGNsaXB8Y2xvc2V8Y29sb3J8Y29tYmluZXxjb25qfGNvbnRpbnVlfGNvcHl8Y29zfGNvc2h8Y3JjfGNzZWN8Y3NlY2h8Y3RhbnxjdGFuaHxjdXJzb3J8ZGFya2VufGRlY3xkZWNvZGV8ZGVmaW5lfGRlbGV0ZXxkZXNhdHVyYXRlfGRldmlhdGlvbnxkaWFsb2d8ZGljdGlvbmFyeXxkaWZmZXJlbmNlfGRpZ2VzdHxkaWdpdHN8ZGl2fGRvfGRvd25sb2FkfGRyb3B8ZHVwfGV8ZWxzZXxlbXB0eXxlbmNvZGV8ZW5zdXJlfGVudnxlc2NhcGV8ZXhlY3V0ZXxleGl0fGV4cHxleHRlbmR8ZXh0cmFjdHxmYWN0b3JzfGZkaXZ8ZmlsdGVyfGZpcnN0fGZsYXR0ZW58Zmxvb3J8Zm9sZHxmcm9tfGZ1bmN0aW9ufGdhbW1hfGdjZHxnZXR8Z290b3xoYXNofGh5cG90fGlmfGluY3xpbmRlbnR8aW5kZXh8aW5maW5pdHl8aW5mb3xpbnB1dHxpbnNlcnR8aW5zcGVjdHxpbnRlcnNlY3Rpb258aW52ZXJ0fGphcm98am9pbnxrZXlzfGt1cnRvc2lzfGxhc3R8bGV0fGxldmVuc2h0ZWlufGxpZ2h0ZW58bGlzdHxsbnxsb2d8bG9vcHxsb3dlcnxtYWlsfG1hcHxtYXRjaHxtYXh8bWVkaWFufG1pbnxtb2R8bW9kdWxlfG11bHxuYW5kfG5lZ3xuZXd8bm9yfG5vcm1hbGl6ZXxub3R8bm93fG51bGx8b3BlbnxvcnxvdXRkZW50fHBhZHxwYWxldHRlfHBhbmljfHBhdGh8cGF1c2V8cGVybWlzc2lvbnN8cGVybXV0YXRlfHBpfHBvcHxwb3B1cHxwb3d8cG93ZXJzZXR8cG93bW9kfHByZWZpeHxwcmludHxwcmludHN8cHJvY2Vzc3xwcm9kdWN0fHF1ZXJ5fHJhbmRvbXxyYW5nZXxyZWFkfHJlbGF0aXZlfHJlbW92ZXxyZW5hbWV8cmVuZGVyfHJlcGVhdHxyZXBsYWNlfHJlcXVlc3R8cmV0dXJufHJldmVyc2V8cm91bmR8c2FtcGxlfHNhdHVyYXRlfHNjcmlwdHxzZWN8c2VjaHxzZWxlY3R8c2VydmV8c2V0fHNobHxzaHJ8c2h1ZmZsZXxzaW58c2luaHxzaXplfHNrZXduZXNzfHNsaWNlfHNvcnR8c3BpbnxzcGxpdHxzcXJ0fHNxdWVlemV8c3RhY2t8c3RyaXB8c3VifHN1ZmZpeHxzdW18c3dpdGNofHN5bWJvbHN8c3ltbGlua3xzeXN8dGFrZXx0YW58dGFuaHx0ZXJtaW5hbHx0ZXJtaW5hdGV8dG98dHJ1bmNhdGV8dHJ5fHR5cGV8dW5jbGlwfHVuaW9ufHVuaXF1ZXx1bmxlc3N8dW50aWx8dW56aXB8dXBwZXJ8dmFsdWVzfHZhcnx2YXJpYW5jZXx2b2x1bWV8d2Vidmlld3x3aGlsZXx3aXRofHdvcmR3cmFwfHdyaXRlfHhub3J8eG9yfHppcClcXGIvLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH0sXG5cblx0XHQnc3VnYXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvLT58PT58XFx8fDo6Lyxcblx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0fSxcblxuXHRcdCdwdW5jdHVhdGlvbic6IC9bKClbXFxdLF0vLFxuXG5cdFx0J3N5bWJvbCc6IHtcblx0XHRcdHBhdHRlcm46IC88OnwtOnxcdTAwRjh8QHwjfFxcK3xcXHx8XFwqfFxcJHwtLS18LXwlfFxcL3xcXC5cXC58XFxefH58PXw8fD58XFxcXC9cblx0XHR9LFxuXG5cdFx0J2Jvb2xlYW4nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86ZmFsc2V8bWF5YmV8dHJ1ZSlcXGIvXG5cdFx0fVxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5hcnQgPSBQcmlzbS5sYW5ndWFnZXNbJ2FydHVybyddO1xufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGF0dHJpYnV0ZXMgPSB7XG5cdFx0cGF0dGVybjogLyheWyBcXHRdKilcXFsoPyFcXFspKD86KFtcIickYF0pKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKlxcMnxcXFsoPzpbXlxcW1xcXVxcXFxdfFxcXFwuKSpcXF18W15cXFtcXF1cXFxcXCInJGBdfFxcXFwuKSpcXF0vbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3F1b3RlZCc6IHtcblx0XHRcdFx0cGF0dGVybjogLyhbJGBdKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFwuKSpcXDEvLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlskYF18WyRgXSQvXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnaW50ZXJwcmV0ZWQnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8nKD86W14nXFxcXF18XFxcXC4pKicvLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXid8JyQvXG5cdFx0XHRcdFx0Ly8gU2VlIHJlc3QgYmVsb3dcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdzdHJpbmcnOiAvXCIoPzpbXlwiXFxcXF18XFxcXC4pKlwiLyxcblx0XHRcdCd2YXJpYWJsZSc6IC9cXHcrKD89PSkvLFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXFt8XFxdJHwsLyxcblx0XHRcdCdvcGVyYXRvcic6IC89Lyxcblx0XHRcdC8vIFRoZSBuZWdhdGl2ZSBsb29rLWFoZWFkIHByZXZlbnRzIGJsYW5rIG1hdGNoZXNcblx0XHRcdCdhdHRyLXZhbHVlJzogLyg/IV5cXHMrJCkuKy9cblx0XHR9XG5cdH07XG5cblx0dmFyIGFzY2lpZG9jID0gUHJpc20ubGFuZ3VhZ2VzLmFzY2lpZG9jID0ge1xuXHRcdCdjb21tZW50LWJsb2NrJzoge1xuXHRcdFx0cGF0dGVybjogL14oXFwvezQsfSkoPzpcXHI/XFxufFxccikoPzpbXFxzXFxTXSooPzpcXHI/XFxufFxccikpPz9cXDEvbSxcblx0XHRcdGFsaWFzOiAnY29tbWVudCdcblx0XHR9LFxuXHRcdCd0YWJsZSc6IHtcblx0XHRcdHBhdHRlcm46IC9eXFx8PXszLH0oPzooPzpcXHI/XFxufFxccig/IVxcbikpLiopKj8oPzpcXHI/XFxufFxccilcXHw9ezMsfSQvbSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnc3BlY2lmaWVycyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKD86KD86KD86XFxkKyg/OlxcLlxcZCspP3xcXC5cXGQrKVsrKl0oPzpbPF4+XSg/OlxcLls8Xj5dKT98XFwuWzxePl0pP3xbPF4+XSg/OlxcLls8Xj5dKT98XFwuWzxePl0pW2Etel0qfFthLXpdKykoPz1cXHwpLyxcblx0XHRcdFx0XHRhbGlhczogJ2F0dHItdmFsdWUnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlbfCFdPSovLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBTZWUgcmVzdCBiZWxvd1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQncGFzc3Rocm91Z2gtYmxvY2snOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXihcXCt7NCx9KSg/Olxccj9cXG58XFxyKSg/OltcXHNcXFNdKig/Olxccj9cXG58XFxyKSk/P1xcMSQvbSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlxcKyt8XFwrKyQvXG5cdFx0XHRcdC8vIFNlZSByZXN0IGJlbG93XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvLyBMaXRlcmFsIGJsb2NrcyBhbmQgbGlzdGluZyBibG9ja3Ncblx0XHQnbGl0ZXJhbC1ibG9jayc6IHtcblx0XHRcdHBhdHRlcm46IC9eKC17NCx9fFxcLns0LH0pKD86XFxyP1xcbnxcXHIpKD86W1xcc1xcU10qKD86XFxyP1xcbnxcXHIpKT8/XFwxJC9tLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eKD86LSt8XFwuKyl8KD86LSt8XFwuKykkL1xuXHRcdFx0XHQvLyBTZWUgcmVzdCBiZWxvd1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Ly8gU2lkZWJhciBibG9ja3MsIHF1b3RlIGJsb2NrcywgZXhhbXBsZSBibG9ja3MgYW5kIG9wZW4gYmxvY2tzXG5cdFx0J290aGVyLWJsb2NrJzoge1xuXHRcdFx0cGF0dGVybjogL14oLS18XFwqezQsfXxfezQsfXw9ezQsfSkoPzpcXHI/XFxufFxccikoPzpbXFxzXFxTXSooPzpcXHI/XFxufFxccikpPz9cXDEkL20sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL14oPzotK3xcXCorfF8rfD0rKXwoPzotK3xcXCorfF8rfD0rKSQvXG5cdFx0XHRcdC8vIFNlZSByZXN0IGJlbG93XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIGxpc3QtcHVuY3R1YXRpb24gYW5kIGxpc3QtbGFiZWwgbXVzdCBhcHBlYXIgYmVmb3JlIGluZGVudGVkLWJsb2NrXG5cdFx0J2xpc3QtcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKSg/Oi18XFwqezEsNX18XFwuezEsNX18KD86W2Etel18XFxkKylcXC58W3h2aV0rXFwpKSg/PSApL2ltLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblx0XHQnbGlzdC1sYWJlbCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopW2EtelxcZF0uKyg/Ojp7Miw0fXw7OykoPz1cXHMpL2ltLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHRcdH0sXG5cdFx0J2luZGVudGVkLWJsb2NrJzoge1xuXHRcdFx0cGF0dGVybjogLygoXFxyP1xcbnxcXHIpXFwyKShbIFxcdF0rKVxcUy4qKD86KD86XFxyP1xcbnxcXHIpXFwzLispKig/PVxcMnsyfXwkKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblxuXHRcdCdjb21tZW50JzogL15cXC9cXC8uKi9tLFxuXHRcdCd0aXRsZSc6IHtcblx0XHRcdHBhdHRlcm46IC9eLisoPzpcXHI/XFxufFxccikoPzo9ezMsfXwtezMsfXx+ezMsfXxcXF57Myx9fFxcK3szLH0pJHxePXsxLDV9IC4rfF5cXC4oPyFbXFxzLl0pLiovbSxcblx0XHRcdGFsaWFzOiAnaW1wb3J0YW50Jyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXig/OlxcLnw9Kyl8KD86PSt8LSt8fit8XFxeK3xcXCsrKSQvXG5cdFx0XHRcdC8vIFNlZSByZXN0IGJlbG93XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnYXR0cmlidXRlLWVudHJ5Jzoge1xuXHRcdFx0cGF0dGVybjogL146W146XFxyXFxuXSs6KD86IC4qPyg/OiBcXCsoPzpcXHI/XFxufFxccikuKj8pKik/JC9tLFxuXHRcdFx0YWxpYXM6ICd0YWcnXG5cdFx0fSxcblx0XHQnYXR0cmlidXRlcyc6IGF0dHJpYnV0ZXMsXG5cdFx0J2hyJzoge1xuXHRcdFx0cGF0dGVybjogL14nezMsfSQvbSxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblx0XHQncGFnZS1icmVhayc6IHtcblx0XHRcdHBhdHRlcm46IC9ePHszLH0kL20sXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cdFx0J2FkbW9uaXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXig/OkNBVVRJT058SU1QT1JUQU5UfE5PVEV8VElQfFdBUk5JTkcpOi9tLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH0sXG5cdFx0J2NhbGxvdXQnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopPD9cXGQqPi9tLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ3N5bWJvbCdcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC88XFxkKz4vLFxuXHRcdFx0XHRhbGlhczogJ3N5bWJvbCdcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdtYWNybyc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGJbYS16XFxkXVthLXpcXGQtXSo6Oj8oPzpbXlxcc1xcW1xcXV0qXFxbKD86W15cXF1cXFxcXCInXXwoW1wiJ10pKD86KD8hXFwxKVteXFxcXF18XFxcXC4pKlxcMXxcXFxcLikqXFxdKS8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2Z1bmN0aW9uJzogL15bYS16XFxkLV0rKD89OikvLFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXjo6Py8sXG5cdFx0XHRcdCdhdHRyaWJ1dGVzJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oPzpcXFsoPzpbXlxcXVxcXFxcIiddfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqXFwxfFxcXFwuKSpcXF0pLyxcblx0XHRcdFx0XHRpbnNpZGU6IGF0dHJpYnV0ZXMuaW5zaWRlXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdpbmxpbmUnOiB7XG5cdFx0XHQvKlxuXHRcdFx0VGhlIGluaXRpYWwgbG9vay1iZWhpbmQgcHJldmVudHMgdGhlIGhpZ2hsaWdodGluZyBvZiBlc2NhcGVkIHF1b3RlZCB0ZXh0LlxuXG5cdFx0XHRRdW90ZWQgdGV4dCBjYW4gYmUgbXVsdGktbGluZSBidXQgY2Fubm90IHNwYW4gYW4gZW1wdHkgbGluZS5cblx0XHRcdEFsbCBxdW90ZWQgdGV4dCBjYW4gaGF2ZSBhdHRyaWJ1dGVzIGJlZm9yZSBbZm9vYmFyLCAnZm9vYmFyJywgYmF6PVwiYmFyXCJdLlxuXG5cdFx0XHRGaXJzdCwgd2UgaGFuZGxlIHRoZSBjb25zdHJhaW5lZCBxdW90ZXMuXG5cdFx0XHRUaG9zZSBtdXN0IGJlIGJvdW5kZWQgYnkgbm9uLXdvcmQgY2hhcnMgYW5kIGNhbm5vdCBoYXZlIHNwYWNlcyBiZXR3ZWVuIHRoZSBkZWxpbWl0ZXIgYW5kIHRoZSBmaXJzdCBjaGFyLlxuXHRcdFx0VGhleSBhcmUsIGluIG9yZGVyOiBfZW1waGFzaXNfLCBgYGRvdWJsZSBxdW90ZXMnJywgYHNpbmdsZSBxdW90ZXMnLCBgbW9ub3NwYWNlYCwgJ2VtcGhhc2lzJywgKnN0cm9uZyosICttb25vc3BhY2UrIGFuZCAjdW5xdW90ZWQjXG5cblx0XHRcdFRoZW4gd2UgaGFuZGxlIHRoZSB1bmNvbnN0cmFpbmVkIHF1b3Rlcy5cblx0XHRcdFRob3NlIGRvIG5vdCBoYXZlIHRoZSByZXN0cmljdGlvbnMgb2YgdGhlIGNvbnN0cmFpbmVkIHF1b3Rlcy5cblx0XHRcdFRoZXkgYXJlLCBpbiBvcmRlcjogX19lbXBoYXNpc19fLCAqKnN0cm9uZyoqLCArK21vbm9zcGFjZSsrLCArKytwYXNzdGhyb3VnaCsrKywgIyN1bnF1b3RlZCMjLCAkJHBhc3N0aHJvdWdoJCQsIH5zdWJzY3JpcHR+LCBec3VwZXJzY3JpcHReLCB7YXR0cmlidXRlLXJlZmVyZW5jZX0sIFtbYW5jaG9yXV0sIFtbW2JpYmxpb2dyYXBoeSBhbmNob3JdXV0sIDw8eHJlZj4+LCAoKChpbmRleGVzKSkpIGFuZCAoKGluZGV4ZXMpKVxuXHRcdFx0ICovXG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkoPzooPzpcXEJcXFsoPzpbXlxcXVxcXFxcIiddfChbXCInXSkoPzooPyFcXDIpW15cXFxcXXxcXFxcLikqXFwyfFxcXFwuKSpcXF0pPyg/OlxcYl8oPyFcXHMpKD86IF98W15fXFxcXFxcclxcbl18XFxcXC4pKyg/Oig/Olxccj9cXG58XFxyKSg/OiBffFteX1xcXFxcXHJcXG5dfFxcXFwuKSspKl9cXGJ8XFxCYGAoPyFcXHMpLis/KD86KD86XFxyP1xcbnxcXHIpLis/KSonJ1xcQnxcXEJgKD8hXFxzKSg/OlteYCdcXHNdfFxccytcXFMpK1snYF1cXEJ8XFxCKFsnKisjXSkoPyFcXHMpKD86IFxcM3woPyFcXDMpW15cXFxcXFxyXFxuXXxcXFxcLikrKD86KD86XFxyP1xcbnxcXHIpKD86IFxcM3woPyFcXDMpW15cXFxcXFxyXFxuXXxcXFxcLikrKSpcXDNcXEIpfCg/OlxcWyg/OlteXFxdXFxcXFwiJ118KFtcIiddKSg/Oig/IVxcNClbXlxcXFxdfFxcXFwuKSpcXDR8XFxcXC4pKlxcXSk/KD86KF9ffFxcKlxcKnxcXCtcXCtcXCs/fCMjfFxcJFxcJHxbfl5dKS4rPyg/Oig/Olxccj9cXG58XFxyKS4rPykqXFw1fFxce1tefVxcclxcbl0rXFx9fFxcW1xcW1xcWz8uKz8oPzooPzpcXHI/XFxufFxccikuKz8pKlxcXT9cXF1cXF18PDwuKz8oPzooPzpcXHI/XFxufFxccikuKz8pKj4+fFxcKFxcKFxcKD8uKz8oPzooPzpcXHI/XFxufFxccikuKz8pKlxcKT9cXClcXCkpKS9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnYXR0cmlidXRlcyc6IGF0dHJpYnV0ZXMsXG5cdFx0XHRcdCd1cmwnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14oPzpcXFtcXFtcXFs/Lis/XFxdP1xcXVxcXXw8PC4rPz4+KSQvLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL14oPzpcXFtcXFtcXFs/fDw8KXwoPzpcXF1cXF1cXF0/fD4+KSQvXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnYXR0cmlidXRlLXJlZic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcey4rXFx9JC8sXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQndmFyaWFibGUnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8oXlxceylbYS16XFxkLCtfLV0rLyxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdvcGVyYXRvcic6IC9eWz0/ISMlQCRdfCEoPz1bOn1dKS8sXG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlxce3xcXH0kfDo6Py9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdpdGFsaWMnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14oWydfXSlbXFxzXFxTXStcXDEkLyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eKD86Jyc/fF9fPyl8KD86Jyc/fF9fPykkL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J2JvbGQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15cXCpbXFxzXFxTXStcXCokLyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdHB1bmN0dWF0aW9uOiAvXlxcKlxcKj98XFwqXFwqPyQvXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXig/OmBgP3xcXCt7MSwzfXwjIz98XFwkXFwkfFt+Xl18XFwoXFwoXFwoPyl8KD86Jyc/fFxcK3sxLDN9fCMjP3xcXCRcXCR8W35eYF18XFwpP1xcKVxcKSkkL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3JlcGxhY2VtZW50Jzoge1xuXHRcdFx0cGF0dGVybjogL1xcKCg/OkN8UnxUTSlcXCkvLFxuXHRcdFx0YWxpYXM6ICdidWlsdGluJ1xuXHRcdH0sXG5cdFx0J2VudGl0eSc6IC8mIz9bXFxkYS16XXsxLDh9Oy9pLFxuXHRcdCdsaW5lLWNvbnRpbnVhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnwgKVxcKyQvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH1cblx0fTtcblxuXG5cdC8vIEFsbG93IHNvbWUgbmVzdGluZy4gVGhlcmUgaXMgbm8gcmVjdXJzaW9uIHRob3VnaCwgc28gY2xvbmluZyBzaG91bGQgbm90IGJlIG5lZWRlZC5cblxuXHRmdW5jdGlvbiBjb3B5RnJvbUFzY2lpRG9jKGtleXMpIHtcblx0XHRrZXlzID0ga2V5cy5zcGxpdCgnICcpO1xuXG5cdFx0dmFyIG8gPSB7fTtcblx0XHRmb3IgKHZhciBpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRvW2tleXNbaV1dID0gYXNjaWlkb2Nba2V5c1tpXV07XG5cdFx0fVxuXHRcdHJldHVybiBvO1xuXHR9XG5cblx0YXR0cmlidXRlcy5pbnNpZGVbJ2ludGVycHJldGVkJ10uaW5zaWRlLnJlc3QgPSBjb3B5RnJvbUFzY2lpRG9jKCdtYWNybyBpbmxpbmUgcmVwbGFjZW1lbnQgZW50aXR5Jyk7XG5cblx0YXNjaWlkb2NbJ3Bhc3N0aHJvdWdoLWJsb2NrJ10uaW5zaWRlLnJlc3QgPSBjb3B5RnJvbUFzY2lpRG9jKCdtYWNybycpO1xuXG5cdGFzY2lpZG9jWydsaXRlcmFsLWJsb2NrJ10uaW5zaWRlLnJlc3QgPSBjb3B5RnJvbUFzY2lpRG9jKCdjYWxsb3V0Jyk7XG5cblx0YXNjaWlkb2NbJ3RhYmxlJ10uaW5zaWRlLnJlc3QgPSBjb3B5RnJvbUFzY2lpRG9jKCdjb21tZW50LWJsb2NrIHBhc3N0aHJvdWdoLWJsb2NrIGxpdGVyYWwtYmxvY2sgb3RoZXItYmxvY2sgbGlzdC1wdW5jdHVhdGlvbiBpbmRlbnRlZC1ibG9jayBjb21tZW50IHRpdGxlIGF0dHJpYnV0ZS1lbnRyeSBhdHRyaWJ1dGVzIGhyIHBhZ2UtYnJlYWsgYWRtb25pdGlvbiBsaXN0LWxhYmVsIGNhbGxvdXQgbWFjcm8gaW5saW5lIHJlcGxhY2VtZW50IGVudGl0eSBsaW5lLWNvbnRpbnVhdGlvbicpO1xuXG5cdGFzY2lpZG9jWydvdGhlci1ibG9jayddLmluc2lkZS5yZXN0ID0gY29weUZyb21Bc2NpaURvYygndGFibGUgbGlzdC1wdW5jdHVhdGlvbiBpbmRlbnRlZC1ibG9jayBjb21tZW50IGF0dHJpYnV0ZS1lbnRyeSBhdHRyaWJ1dGVzIGhyIHBhZ2UtYnJlYWsgYWRtb25pdGlvbiBsaXN0LWxhYmVsIG1hY3JvIGlubGluZSByZXBsYWNlbWVudCBlbnRpdHkgbGluZS1jb250aW51YXRpb24nKTtcblxuXHRhc2NpaWRvY1sndGl0bGUnXS5pbnNpZGUucmVzdCA9IGNvcHlGcm9tQXNjaWlEb2MoJ21hY3JvIGlubGluZSByZXBsYWNlbWVudCBlbnRpdHknKTtcblxuXG5cdC8vIFBsdWdpbiB0byBtYWtlIGVudGl0eSB0aXRsZSBzaG93IHRoZSByZWFsIGVudGl0eSwgaWRlYSBieSBSb21hbiBLb21hcm92XG5cdFByaXNtLmhvb2tzLmFkZCgnd3JhcCcsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRpZiAoZW52LnR5cGUgPT09ICdlbnRpdHknKSB7XG5cdFx0XHRlbnYuYXR0cmlidXRlc1sndGl0bGUnXSA9IGVudi5jb250ZW50LnJlcGxhY2UoLyZhbXA7LywgJyYnKTtcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5hZG9jID0gUHJpc20ubGFuZ3VhZ2VzLmFzY2lpZG9jO1xufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0LyoqXG5cdCAqIFJlcGxhY2VzIGFsbCBwbGFjZWhvbGRlcnMgXCI8PG4+PlwiIG9mIGdpdmVuIHBhdHRlcm4gd2l0aCB0aGUgbi10aCByZXBsYWNlbWVudCAoemVybyBiYXNlZCkuXG5cdCAqXG5cdCAqIE5vdGU6IFRoaXMgaXMgYSBzaW1wbGUgdGV4dCBiYXNlZCByZXBsYWNlbWVudC4gQmUgY2FyZWZ1bCB3aGVuIHVzaW5nIGJhY2tyZWZlcmVuY2VzIVxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVybiB0aGUgZ2l2ZW4gcGF0dGVybi5cblx0ICogQHBhcmFtIHtzdHJpbmdbXX0gcmVwbGFjZW1lbnRzIGEgbGlzdCBvZiByZXBsYWNlbWVudCB3aGljaCBjYW4gYmUgaW5zZXJ0ZWQgaW50byB0aGUgZ2l2ZW4gcGF0dGVybi5cblx0ICogQHJldHVybnMge3N0cmluZ30gdGhlIHBhdHRlcm4gd2l0aCBhbGwgcGxhY2Vob2xkZXJzIHJlcGxhY2VkIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyByZXBsYWNlbWVudHMuXG5cdCAqIEBleGFtcGxlIHJlcGxhY2UoL2E8PDA+PmEvLnNvdXJjZSwgWy9iKy8uc291cmNlXSkgPT09IC9hKD86YispYS8uc291cmNlXG5cdCAqL1xuXHRmdW5jdGlvbiByZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VtZW50cykge1xuXHRcdHJldHVybiBwYXR0ZXJuLnJlcGxhY2UoLzw8KFxcZCspPj4vZywgZnVuY3Rpb24gKG0sIGluZGV4KSB7XG5cdFx0XHRyZXR1cm4gJyg/OicgKyByZXBsYWNlbWVudHNbK2luZGV4XSArICcpJztcblx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm5cblx0ICogQHBhcmFtIHtzdHJpbmdbXX0gcmVwbGFjZW1lbnRzXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhZ3NdXG5cdCAqIEByZXR1cm5zIHtSZWdFeHB9XG5cdCAqL1xuXHRmdW5jdGlvbiByZShwYXR0ZXJuLCByZXBsYWNlbWVudHMsIGZsYWdzKSB7XG5cdFx0cmV0dXJuIFJlZ0V4cChyZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VtZW50cyksIGZsYWdzIHx8ICcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmVzdGVkIHBhdHRlcm4gd2hlcmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzdHJpbmcgYDw8c2VsZj4+YCBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgcGF0dGVybiBpdHNlbGYuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXR0ZXJuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkZXB0aExvZzJcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdGZ1bmN0aW9uIG5lc3RlZChwYXR0ZXJuLCBkZXB0aExvZzIpIHtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRlcHRoTG9nMjsgaSsrKSB7XG5cdFx0XHRwYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlKC88PHNlbGY+Pi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiAnKD86JyArIHBhdHRlcm4gKyAnKSc7IH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gcGF0dGVybi5yZXBsYWNlKC88PHNlbGY+Pi9nLCAnW15cXFxcc1xcXFxTXScpO1xuXHR9XG5cblx0Ly8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvZG90bmV0L2NzaGFycC9sYW5ndWFnZS1yZWZlcmVuY2Uva2V5d29yZHMvXG5cdHZhciBrZXl3b3JkS2luZHMgPSB7XG5cdFx0Ly8ga2V5d29yZHMgd2hpY2ggcmVwcmVzZW50IGEgcmV0dXJuIG9yIHZhcmlhYmxlIHR5cGVcblx0XHR0eXBlOiAnYm9vbCBieXRlIGNoYXIgZGVjaW1hbCBkb3VibGUgZHluYW1pYyBmbG9hdCBpbnQgbG9uZyBvYmplY3Qgc2J5dGUgc2hvcnQgc3RyaW5nIHVpbnQgdWxvbmcgdXNob3J0IHZhciB2b2lkJyxcblx0XHQvLyBrZXl3b3JkcyB3aGljaCBhcmUgdXNlZCB0byBkZWNsYXJlIGEgdHlwZVxuXHRcdHR5cGVEZWNsYXJhdGlvbjogJ2NsYXNzIGVudW0gaW50ZXJmYWNlIHJlY29yZCBzdHJ1Y3QnLFxuXHRcdC8vIGNvbnRleHR1YWwga2V5d29yZHNcblx0XHQvLyAoXCJ2YXJcIiBhbmQgXCJkeW5hbWljXCIgYXJlIG1pc3NpbmcgYmVjYXVzZSB0aGV5IGFyZSB1c2VkIGxpa2UgdHlwZXMpXG5cdFx0Y29udGV4dHVhbDogJ2FkZCBhbGlhcyBhbmQgYXNjZW5kaW5nIGFzeW5jIGF3YWl0IGJ5IGRlc2NlbmRpbmcgZnJvbSg/PVxcXFxzKig/OlxcXFx3fCQpKSBnZXQgZ2xvYmFsIGdyb3VwIGludG8gaW5pdCg/PVxcXFxzKjspIGpvaW4gbGV0IG5hbWVvZiBub3Qgbm90bnVsbCBvbiBvciBvcmRlcmJ5IHBhcnRpYWwgcmVtb3ZlIHNlbGVjdCBzZXQgdW5tYW5hZ2VkIHZhbHVlIHdoZW4gd2hlcmUgd2l0aCg/PVxcXFxzKnspJyxcblx0XHQvLyBhbGwgb3RoZXIga2V5d29yZHNcblx0XHRvdGhlcjogJ2Fic3RyYWN0IGFzIGJhc2UgYnJlYWsgY2FzZSBjYXRjaCBjaGVja2VkIGNvbnN0IGNvbnRpbnVlIGRlZmF1bHQgZGVsZWdhdGUgZG8gZWxzZSBldmVudCBleHBsaWNpdCBleHRlcm4gZmluYWxseSBmaXhlZCBmb3IgZm9yZWFjaCBnb3RvIGlmIGltcGxpY2l0IGluIGludGVybmFsIGlzIGxvY2sgbmFtZXNwYWNlIG5ldyBudWxsIG9wZXJhdG9yIG91dCBvdmVycmlkZSBwYXJhbXMgcHJpdmF0ZSBwcm90ZWN0ZWQgcHVibGljIHJlYWRvbmx5IHJlZiByZXR1cm4gc2VhbGVkIHNpemVvZiBzdGFja2FsbG9jIHN0YXRpYyBzd2l0Y2ggdGhpcyB0aHJvdyB0cnkgdHlwZW9mIHVuY2hlY2tlZCB1bnNhZmUgdXNpbmcgdmlydHVhbCB2b2xhdGlsZSB3aGlsZSB5aWVsZCdcblx0fTtcblxuXHQvLyBrZXl3b3Jkc1xuXHRmdW5jdGlvbiBrZXl3b3Jkc1RvUGF0dGVybih3b3Jkcykge1xuXHRcdHJldHVybiAnXFxcXGIoPzonICsgd29yZHMudHJpbSgpLnJlcGxhY2UoLyAvZywgJ3wnKSArICcpXFxcXGInO1xuXHR9XG5cdHZhciB0eXBlRGVjbGFyYXRpb25LZXl3b3JkcyA9IGtleXdvcmRzVG9QYXR0ZXJuKGtleXdvcmRLaW5kcy50eXBlRGVjbGFyYXRpb24pO1xuXHR2YXIga2V5d29yZHMgPSBSZWdFeHAoa2V5d29yZHNUb1BhdHRlcm4oa2V5d29yZEtpbmRzLnR5cGUgKyAnICcgKyBrZXl3b3JkS2luZHMudHlwZURlY2xhcmF0aW9uICsgJyAnICsga2V5d29yZEtpbmRzLmNvbnRleHR1YWwgKyAnICcgKyBrZXl3b3JkS2luZHMub3RoZXIpKTtcblx0dmFyIG5vblR5cGVLZXl3b3JkcyA9IGtleXdvcmRzVG9QYXR0ZXJuKGtleXdvcmRLaW5kcy50eXBlRGVjbGFyYXRpb24gKyAnICcgKyBrZXl3b3JkS2luZHMuY29udGV4dHVhbCArICcgJyArIGtleXdvcmRLaW5kcy5vdGhlcik7XG5cdHZhciBub25Db250ZXh0dWFsS2V5d29yZHMgPSBrZXl3b3Jkc1RvUGF0dGVybihrZXl3b3JkS2luZHMudHlwZSArICcgJyArIGtleXdvcmRLaW5kcy50eXBlRGVjbGFyYXRpb24gKyAnICcgKyBrZXl3b3JkS2luZHMub3RoZXIpO1xuXG5cdC8vIHR5cGVzXG5cdHZhciBnZW5lcmljID0gbmVzdGVkKC88KD86W148Pjs9K1xcLSovJSZ8Xl18PDxzZWxmPj4pKj4vLnNvdXJjZSwgMik7IC8vIHRoZSBpZGVhIGJlaGluZCB0aGUgb3RoZXIgZm9yYmlkZGVuIGNoYXJhY3RlcnMgaXMgdG8gcHJldmVudCBmYWxzZSBwb3NpdGl2ZXMuIFNhbWUgZm9yIHR1cGxlRWxlbWVudC5cblx0dmFyIG5lc3RlZFJvdW5kID0gbmVzdGVkKC9cXCgoPzpbXigpXXw8PHNlbGY+PikqXFwpLy5zb3VyY2UsIDIpO1xuXHR2YXIgbmFtZSA9IC9AP1xcYltBLVphLXpfXVxcdypcXGIvLnNvdXJjZTtcblx0dmFyIGdlbmVyaWNOYW1lID0gcmVwbGFjZSgvPDwwPj4oPzpcXHMqPDwxPj4pPy8uc291cmNlLCBbbmFtZSwgZ2VuZXJpY10pO1xuXHR2YXIgaWRlbnRpZmllciA9IHJlcGxhY2UoLyg/ITw8MD4+KTw8MT4+KD86XFxzKlxcLlxccyo8PDE+PikqLy5zb3VyY2UsIFtub25UeXBlS2V5d29yZHMsIGdlbmVyaWNOYW1lXSk7XG5cdHZhciBhcnJheSA9IC9cXFtcXHMqKD86LFxccyopKlxcXS8uc291cmNlO1xuXHR2YXIgdHlwZUV4cHJlc3Npb25XaXRob3V0VHVwbGUgPSByZXBsYWNlKC88PDA+Pig/OlxccyooPzpcXD9cXHMqKT88PDE+PikqKD86XFxzKlxcPyk/Ly5zb3VyY2UsIFtpZGVudGlmaWVyLCBhcnJheV0pO1xuXHR2YXIgdHVwbGVFbGVtZW50ID0gcmVwbGFjZSgvW14sKCk8PltcXF07PStcXC0qLyUmfF5dfDw8MD4+fDw8MT4+fDw8Mj4+Ly5zb3VyY2UsIFtnZW5lcmljLCBuZXN0ZWRSb3VuZCwgYXJyYXldKTtcblx0dmFyIHR1cGxlID0gcmVwbGFjZSgvXFwoPDwwPj4rKD86LDw8MD4+KykrXFwpLy5zb3VyY2UsIFt0dXBsZUVsZW1lbnRdKTtcblx0dmFyIHR5cGVFeHByZXNzaW9uID0gcmVwbGFjZSgvKD86PDwwPj58PDwxPj4pKD86XFxzKig/OlxcP1xccyopPzw8Mj4+KSooPzpcXHMqXFw/KT8vLnNvdXJjZSwgW3R1cGxlLCBpZGVudGlmaWVyLCBhcnJheV0pO1xuXG5cdHZhciB0eXBlSW5zaWRlID0ge1xuXHRcdCdrZXl3b3JkJzoga2V5d29yZHMsXG5cdFx0J3B1bmN0dWF0aW9uJzogL1s8PigpPywuOltcXF1dL1xuXHR9O1xuXG5cdC8vIHN0cmluZ3MgJiBjaGFyYWN0ZXJzXG5cdC8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2RvdG5ldC9jc2hhcnAvbGFuZ3VhZ2UtcmVmZXJlbmNlL2xhbmd1YWdlLXNwZWNpZmljYXRpb24vbGV4aWNhbC1zdHJ1Y3R1cmUjY2hhcmFjdGVyLWxpdGVyYWxzXG5cdC8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2RvdG5ldC9jc2hhcnAvbGFuZ3VhZ2UtcmVmZXJlbmNlL2xhbmd1YWdlLXNwZWNpZmljYXRpb24vbGV4aWNhbC1zdHJ1Y3R1cmUjc3RyaW5nLWxpdGVyYWxzXG5cdHZhciBjaGFyYWN0ZXIgPSAvJyg/OlteXFxyXFxuJ1xcXFxdfFxcXFwufFxcXFxbVXV4XVtcXGRhLWZBLUZdezEsOH0pJy8uc291cmNlOyAvLyBzaW1wbGlmaWVkIHBhdHRlcm5cblx0dmFyIHJlZ3VsYXJTdHJpbmcgPSAvXCIoPzpcXFxcLnxbXlxcXFxcIlxcclxcbl0pKlwiLy5zb3VyY2U7XG5cdHZhciB2ZXJiYXRpbVN0cmluZyA9IC9AXCIoPzpcIlwifFxcXFxbXFxzXFxTXXxbXlxcXFxcIl0pKlwiKD8hXCIpLy5zb3VyY2U7XG5cblxuXHRQcmlzbS5sYW5ndWFnZXMuY3NoYXJwID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdFx0J3N0cmluZyc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogcmUoLyhefFteJFxcXFxdKTw8MD4+Ly5zb3VyY2UsIFt2ZXJiYXRpbVN0cmluZ10pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IHJlKC8oXnxbXkAkXFxcXF0pPDwwPj4vLnNvdXJjZSwgW3JlZ3VsYXJTdHJpbmddKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnY2xhc3MtbmFtZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gVXNpbmcgc3RhdGljXG5cdFx0XHRcdC8vIHVzaW5nIHN0YXRpYyBTeXN0ZW0uTWF0aDtcblx0XHRcdFx0cGF0dGVybjogcmUoLyhcXGJ1c2luZ1xccytzdGF0aWNcXHMrKTw8MD4+KD89XFxzKjspLy5zb3VyY2UsIFtpZGVudGlmaWVyXSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogdHlwZUluc2lkZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gVXNpbmcgYWxpYXMgKHR5cGUpXG5cdFx0XHRcdC8vIHVzaW5nIFByb2plY3QgPSBQQy5NeUNvbXBhbnkuUHJvamVjdDtcblx0XHRcdFx0cGF0dGVybjogcmUoLyhcXGJ1c2luZ1xccys8PDA+Plxccyo9XFxzKik8PDE+Pig/PVxccyo7KS8uc291cmNlLCBbbmFtZSwgdHlwZUV4cHJlc3Npb25dKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB0eXBlSW5zaWRlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBVc2luZyBhbGlhcyAoYWxpYXMpXG5cdFx0XHRcdC8vIHVzaW5nIFByb2plY3QgPSBQQy5NeUNvbXBhbnkuUHJvamVjdDtcblx0XHRcdFx0cGF0dGVybjogcmUoLyhcXGJ1c2luZ1xccyspPDwwPj4oPz1cXHMqPSkvLnNvdXJjZSwgW25hbWVdKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gVHlwZSBkZWNsYXJhdGlvbnNcblx0XHRcdFx0Ly8gY2xhc3MgRm9vPEEsIEI+XG5cdFx0XHRcdC8vIGludGVyZmFjZSBGb288b3V0IEEsIEI+XG5cdFx0XHRcdHBhdHRlcm46IHJlKC8oXFxiPDwwPj5cXHMrKTw8MT4+Ly5zb3VyY2UsIFt0eXBlRGVjbGFyYXRpb25LZXl3b3JkcywgZ2VuZXJpY05hbWVdKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB0eXBlSW5zaWRlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBTaW5nbGUgY2F0Y2ggZXhjZXB0aW9uIGRlY2xhcmF0aW9uXG5cdFx0XHRcdC8vIGNhdGNoKEZvbylcblx0XHRcdFx0Ly8gKHRoaW5ncyBsaWtlIGNhdGNoKEZvbyBlKSBpcyBjb3ZlcmVkIGJ5IHZhcmlhYmxlIGRlY2xhcmF0aW9uKVxuXHRcdFx0XHRwYXR0ZXJuOiByZSgvKFxcYmNhdGNoXFxzKlxcKFxccyopPDwwPj4vLnNvdXJjZSwgW2lkZW50aWZpZXJdKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB0eXBlSW5zaWRlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBOYW1lIG9mIHRoZSB0eXBlIHBhcmFtZXRlciBvZiBnZW5lcmljIGNvbnN0cmFpbnRzXG5cdFx0XHRcdC8vIHdoZXJlIEZvbyA6IGNsYXNzXG5cdFx0XHRcdHBhdHRlcm46IHJlKC8oXFxid2hlcmVcXHMrKTw8MD4+Ly5zb3VyY2UsIFtuYW1lXSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIENhc3RzIGFuZCBjaGVja3MgdmlhIGFzIGFuZCBpcy5cblx0XHRcdFx0Ly8gYXMgRm9vPEE+LCBpcyBCYXI8Qj5cblx0XHRcdFx0Ly8gKHRoaW5ncyBsaWtlIGlmKGEgaXMgRm9vIGIpIGlzIGNvdmVyZWQgYnkgdmFyaWFibGUgZGVjbGFyYXRpb24pXG5cdFx0XHRcdHBhdHRlcm46IHJlKC8oXFxiKD86aXMoPzpcXHMrbm90KT98YXMpXFxzKyk8PDA+Pi8uc291cmNlLCBbdHlwZUV4cHJlc3Npb25XaXRob3V0VHVwbGVdKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB0eXBlSW5zaWRlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBWYXJpYWJsZSwgZmllbGQgYW5kIHBhcmFtZXRlciBkZWNsYXJhdGlvblxuXHRcdFx0XHQvLyAoRm9vIGJhciwgQmFyIGJheiwgRm9vWywsXSBiYXksIEZvbzxCYXIsIEZvb0JhcjxCYXI+PiBiYXgpXG5cdFx0XHRcdHBhdHRlcm46IHJlKC9cXGI8PDA+Pig/PVxccysoPyE8PDE+Pnx3aXRoXFxzKlxceyk8PDI+Pig/OlxccypbPSw7OnspXFxdXXxcXHMrKD86aW58d2hlbilcXGIpKS8uc291cmNlLCBbdHlwZUV4cHJlc3Npb24sIG5vbkNvbnRleHR1YWxLZXl3b3JkcywgbmFtZV0pLFxuXHRcdFx0XHRpbnNpZGU6IHR5cGVJbnNpZGVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdrZXl3b3JkJzoga2V5d29yZHMsXG5cdFx0Ly8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvZG90bmV0L2NzaGFycC9sYW5ndWFnZS1yZWZlcmVuY2UvbGFuZ3VhZ2Utc3BlY2lmaWNhdGlvbi9sZXhpY2FsLXN0cnVjdHVyZSNsaXRlcmFsc1xuXHRcdCdudW1iZXInOiAvKD86XFxiMCg/OnhbXFxkYS1mX10qW1xcZGEtZl18YlswMV9dKlswMV0pfCg/OlxcQlxcLlxcZCsoPzpfK1xcZCspKnxcXGJcXGQrKD86XytcXGQrKSooPzpcXC5cXGQrKD86XytcXGQrKSopPykoPzplWy0rXT9cXGQrKD86XytcXGQrKSopPykoPzpbZGZsbXVdfGx1fHVsKT9cXGIvaSxcblx0XHQnb3BlcmF0b3InOiAvPj49P3w8PD0/fFstPV0+fChbLSsmfF0pXFwxfH58XFw/XFw/PT98Wy0rKi8lJnxeIT08Pl09Py8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1xcP1xcLj98Ojp8W3t9W1xcXTsoKSwuOl0vXG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2NzaGFycCcsICdudW1iZXInLCB7XG5cdFx0J3JhbmdlJzoge1xuXHRcdFx0cGF0dGVybjogL1xcLlxcLi8sXG5cdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnY3NoYXJwJywgJ3B1bmN0dWF0aW9uJywge1xuXHRcdCduYW1lZC1wYXJhbWV0ZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiByZSgvKFsoLF1cXHMqKTw8MD4+KD89XFxzKjopLy5zb3VyY2UsIFtuYW1lXSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2NzaGFycCcsICdjbGFzcy1uYW1lJywge1xuXHRcdCduYW1lc3BhY2UnOiB7XG5cdFx0XHQvLyBuYW1lc3BhY2UgRm9vLkJhciB7fVxuXHRcdFx0Ly8gdXNpbmcgRm9vLkJhcjtcblx0XHRcdHBhdHRlcm46IHJlKC8oXFxiKD86bmFtZXNwYWNlfHVzaW5nKVxccyspPDwwPj4oPzpcXHMqXFwuXFxzKjw8MD4+KSooPz1cXHMqWzt7XSkvLnNvdXJjZSwgW25hbWVdKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCd0eXBlLWV4cHJlc3Npb24nOiB7XG5cdFx0XHQvLyBkZWZhdWx0KEZvbyksIHR5cGVvZihGb288QmFyPiksIHNpemVvZihpbnQpXG5cdFx0XHRwYXR0ZXJuOiByZSgvKFxcYig/OmRlZmF1bHR8c2l6ZW9mfHR5cGVvZilcXHMqXFwoXFxzKig/IVxccykpKD86W14oKVxcc118XFxzKD8hXFxzKXw8PDA+PikqKD89XFxzKlxcKSkvLnNvdXJjZSwgW25lc3RlZFJvdW5kXSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJyxcblx0XHRcdGluc2lkZTogdHlwZUluc2lkZVxuXHRcdH0sXG5cdFx0J3JldHVybi10eXBlJzoge1xuXHRcdFx0Ly8gRm9vPEJhcj4gRm9yQmFyKCk7IEZvbyBJRm9vLkJhcigpID0+IDBcblx0XHRcdC8vIGludCB0aGlzW2ludCBpbmRleF0gPT4gMDsgVCBJUmVhZE9ubHlMaXN0PFQ+LnRoaXNbaW50IGluZGV4XSA9PiB0aGlzW2luZGV4XTtcblx0XHRcdC8vIGludCBGb28gPT4gMDsgaW50IEZvbyB7IGdldDsgc2V0IH0gPSAwO1xuXHRcdFx0cGF0dGVybjogcmUoLzw8MD4+KD89XFxzKyg/Ojw8MT4+XFxzKig/Oj0+fFsoe118XFwuXFxzKnRoaXNcXHMqXFxbKXx0aGlzXFxzKlxcWykpLy5zb3VyY2UsIFt0eXBlRXhwcmVzc2lvbiwgaWRlbnRpZmllcl0pLFxuXHRcdFx0aW5zaWRlOiB0eXBlSW5zaWRlLFxuXHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHRcdH0sXG5cdFx0J2NvbnN0cnVjdG9yLWludm9jYXRpb24nOiB7XG5cdFx0XHQvLyBuZXcgTGlzdDxGb288QmFyW10+PiB7IH1cblx0XHRcdHBhdHRlcm46IHJlKC8oXFxibmV3XFxzKyk8PDA+Pig/PVxccypbWyh7XSkvLnNvdXJjZSwgW3R5cGVFeHByZXNzaW9uXSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB0eXBlSW5zaWRlLFxuXHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHRcdH0sXG5cdFx0LyonZXhwbGljaXQtaW1wbGVtZW50YXRpb24nOiB7XG5cdFx0XHQvLyBpbnQgSUZvbzxGb28+LkJhciA9PiAwOyB2b2lkIElGb288Rm9vPEZvbz4+LkZvbzxUPigpO1xuXHRcdFx0cGF0dGVybjogcmVwbGFjZSgvXFxiPDwwPj4oPz1cXC48PDE+PikvLCBjbGFzc05hbWUsIG1ldGhvZE9yUHJvcGVydHlEZWNsYXJhdGlvbiksXG5cdFx0XHRpbnNpZGU6IGNsYXNzTmFtZUluc2lkZSxcblx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0XHR9LCovXG5cdFx0J2dlbmVyaWMtbWV0aG9kJzoge1xuXHRcdFx0Ly8gZm9vPEJhcj4oKVxuXHRcdFx0cGF0dGVybjogcmUoLzw8MD4+XFxzKjw8MT4+KD89XFxzKlxcKCkvLnNvdXJjZSwgW25hbWUsIGdlbmVyaWNdKSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZnVuY3Rpb24nOiByZSgvXjw8MD4+Ly5zb3VyY2UsIFtuYW1lXSksXG5cdFx0XHRcdCdnZW5lcmljJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IFJlZ0V4cChnZW5lcmljKSxcblx0XHRcdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnLFxuXHRcdFx0XHRcdGluc2lkZTogdHlwZUluc2lkZVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQndHlwZS1saXN0Jzoge1xuXHRcdFx0Ly8gVGhlIGxpc3Qgb2YgdHlwZXMgaW5oZXJpdGVkIG9yIG9mIGdlbmVyaWMgY29uc3RyYWludHNcblx0XHRcdC8vIGNsYXNzIEZvbzxGPiA6IEJhciwgSUxpc3Q8Rm9vQmFyPlxuXHRcdFx0Ly8gd2hlcmUgRiA6IEJhciwgSUxpc3Q8aW50PlxuXHRcdFx0cGF0dGVybjogcmUoXG5cdFx0XHRcdC9cXGIoKD86PDwwPj5cXHMrPDwxPj58cmVjb3JkXFxzKzw8MT4+XFxzKjw8NT4+fHdoZXJlXFxzKzw8Mj4+KVxccyo6XFxzKikoPzo8PDM+Pnw8PDQ+Pnw8PDE+Plxccyo8PDU+Pnw8PDY+PikoPzpcXHMqLFxccyooPzo8PDM+Pnw8PDQ+Pnw8PDY+PikpKig/PVxccyooPzp3aGVyZXxbeztdfD0+fCQpKS8uc291cmNlLFxuXHRcdFx0XHRbdHlwZURlY2xhcmF0aW9uS2V5d29yZHMsIGdlbmVyaWNOYW1lLCBuYW1lLCB0eXBlRXhwcmVzc2lvbiwga2V5d29yZHMuc291cmNlLCBuZXN0ZWRSb3VuZCwgL1xcYm5ld1xccypcXChcXHMqXFwpLy5zb3VyY2VdXG5cdFx0XHQpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncmVjb3JkLWFyZ3VtZW50cyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiByZSgvKF4oPyFuZXdcXHMqXFwoKTw8MD4+XFxzKik8PDE+Pi8uc291cmNlLCBbZ2VuZXJpY05hbWUsIG5lc3RlZFJvdW5kXSksXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuY3NoYXJwXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdrZXl3b3JkJzoga2V5d29yZHMsXG5cdFx0XHRcdCdjbGFzcy1uYW1lJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCh0eXBlRXhwcmVzc2lvbiksXG5cdFx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZTogdHlwZUluc2lkZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWywoKV0vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQncHJlcHJvY2Vzc29yJzoge1xuXHRcdFx0cGF0dGVybjogLyheW1xcdCBdKikjLiovbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3Byb3BlcnR5Jyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQvLyBoaWdobGlnaHQgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgYXMga2V5d29yZHNcblx0XHRcdFx0J2RpcmVjdGl2ZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKCMpXFxiKD86ZGVmaW5lfGVsaWZ8ZWxzZXxlbmRpZnxlbmRyZWdpb258ZXJyb3J8aWZ8bGluZXxudWxsYWJsZXxwcmFnbWF8cmVnaW9ufHVuZGVmfHdhcm5pbmcpXFxiLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0Ly8gYXR0cmlidXRlc1xuXHR2YXIgcmVndWxhclN0cmluZ09yQ2hhcmFjdGVyID0gcmVndWxhclN0cmluZyArICd8JyArIGNoYXJhY3Rlcjtcblx0dmFyIHJlZ3VsYXJTdHJpbmdDaGFyYWN0ZXJPckNvbW1lbnQgPSByZXBsYWNlKC9cXC8oPyFbKi9dKXxcXC9cXC9bXlxcclxcbl0qW1xcclxcbl18XFwvXFwqKD86W14qXXxcXCooPyFcXC8pKSpcXCpcXC98PDwwPj4vLnNvdXJjZSwgW3JlZ3VsYXJTdHJpbmdPckNoYXJhY3Rlcl0pO1xuXHR2YXIgcm91bmRFeHByZXNzaW9uID0gbmVzdGVkKHJlcGxhY2UoL1teXCInLygpXXw8PDA+PnxcXCg8PHNlbGY+PipcXCkvLnNvdXJjZSwgW3JlZ3VsYXJTdHJpbmdDaGFyYWN0ZXJPckNvbW1lbnRdKSwgMik7XG5cblx0Ly8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvZG90bmV0L2NzaGFycC9wcm9ncmFtbWluZy1ndWlkZS9jb25jZXB0cy9hdHRyaWJ1dGVzLyNhdHRyaWJ1dGUtdGFyZ2V0c1xuXHR2YXIgYXR0clRhcmdldCA9IC9cXGIoPzphc3NlbWJseXxldmVudHxmaWVsZHxtZXRob2R8bW9kdWxlfHBhcmFtfHByb3BlcnR5fHJldHVybnx0eXBlKVxcYi8uc291cmNlO1xuXHR2YXIgYXR0ciA9IHJlcGxhY2UoLzw8MD4+KD86XFxzKlxcKDw8MT4+KlxcKSk/Ly5zb3VyY2UsIFtpZGVudGlmaWVyLCByb3VuZEV4cHJlc3Npb25dKTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjc2hhcnAnLCAnY2xhc3MtbmFtZScsIHtcblx0XHQnYXR0cmlidXRlJzoge1xuXHRcdFx0Ly8gQXR0cmlidXRlc1xuXHRcdFx0Ly8gW0Zvb10sIFtGb28oMSksIEJhcigyLCBQcm9wID0gXCJmb29cIildLCBbcmV0dXJuOiBGb28oMSksIEJhcigyKV0sIFthc3NlbWJseTogRm9vKEJhcildXG5cdFx0XHRwYXR0ZXJuOiByZSgvKCg/Ol58W15cXHNcXHc+KT9dKVxccypcXFtcXHMqKSg/Ojw8MD4+XFxzKjpcXHMqKT88PDE+Pig/OlxccyosXFxzKjw8MT4+KSooPz1cXHMqXFxdKS8uc291cmNlLCBbYXR0clRhcmdldCwgYXR0cl0pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQndGFyZ2V0Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IHJlKC9ePDwwPj4oPz1cXHMqOikvLnNvdXJjZSwgW2F0dHJUYXJnZXRdKSxcblx0XHRcdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdhdHRyaWJ1dGUtYXJndW1lbnRzJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IHJlKC9cXCg8PDA+PipcXCkvLnNvdXJjZSwgW3JvdW5kRXhwcmVzc2lvbl0pLFxuXHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmNzaGFycFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnY2xhc3MtbmFtZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoaWRlbnRpZmllciksXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1s6LF0vXG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXG5cdC8vIHN0cmluZyBpbnRlcnBvbGF0aW9uXG5cdHZhciBmb3JtYXRTdHJpbmcgPSAvOltefVxcclxcbl0rLy5zb3VyY2U7XG5cdC8vIG11bHRpIGxpbmVcblx0dmFyIG1JbnRlcnBvbGF0aW9uUm91bmQgPSBuZXN0ZWQocmVwbGFjZSgvW15cIicvKCldfDw8MD4+fFxcKDw8c2VsZj4+KlxcKS8uc291cmNlLCBbcmVndWxhclN0cmluZ0NoYXJhY3Rlck9yQ29tbWVudF0pLCAyKTtcblx0dmFyIG1JbnRlcnBvbGF0aW9uID0gcmVwbGFjZSgvXFx7KD8hXFx7KSg/Oig/IVt9Ol0pPDwwPj4pKjw8MT4+P1xcfS8uc291cmNlLCBbbUludGVycG9sYXRpb25Sb3VuZCwgZm9ybWF0U3RyaW5nXSk7XG5cdC8vIHNpbmdsZSBsaW5lXG5cdHZhciBzSW50ZXJwb2xhdGlvblJvdW5kID0gbmVzdGVkKHJlcGxhY2UoL1teXCInLygpXXxcXC8oPyFcXCopfFxcL1xcKig/OlteKl18XFwqKD8hXFwvKSkqXFwqXFwvfDw8MD4+fFxcKDw8c2VsZj4+KlxcKS8uc291cmNlLCBbcmVndWxhclN0cmluZ09yQ2hhcmFjdGVyXSksIDIpO1xuXHR2YXIgc0ludGVycG9sYXRpb24gPSByZXBsYWNlKC9cXHsoPyFcXHspKD86KD8hW306XSk8PDA+PikqPDwxPj4/XFx9Ly5zb3VyY2UsIFtzSW50ZXJwb2xhdGlvblJvdW5kLCBmb3JtYXRTdHJpbmddKTtcblxuXHRmdW5jdGlvbiBjcmVhdGVJbnRlcnBvbGF0aW9uSW5zaWRlKGludGVycG9sYXRpb24sIGludGVycG9sYXRpb25Sb3VuZCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogcmUoLygoPzpefFtee10pKD86XFx7XFx7KSopPDwwPj4vLnNvdXJjZSwgW2ludGVycG9sYXRpb25dKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2Zvcm1hdC1zdHJpbmcnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiByZSgvKF5cXHsoPzooPyFbfTpdKTw8MD4+KSopPDwxPj4oPz1cXH0kKS8uc291cmNlLCBbaW50ZXJwb2xhdGlvblJvdW5kLCBmb3JtYXRTdHJpbmddKSxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL146L1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXHt8XFx9JC8sXG5cdFx0XHRcdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtY3NoYXJwJyxcblx0XHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmNzaGFycFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdH07XG5cdH1cblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjc2hhcnAnLCAnc3RyaW5nJywge1xuXHRcdCdpbnRlcnBvbGF0aW9uLXN0cmluZyc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogcmUoLyhefFteXFxcXF0pKD86XFwkQHxAXFwkKVwiKD86XCJcInxcXFxcW1xcc1xcU118XFx7XFx7fDw8MD4+fFteXFxcXHtcIl0pKlwiLy5zb3VyY2UsIFttSW50ZXJwb2xhdGlvbl0pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogY3JlYXRlSW50ZXJwb2xhdGlvbkluc2lkZShtSW50ZXJwb2xhdGlvbiwgbUludGVycG9sYXRpb25Sb3VuZCksXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiByZSgvKF58W15AXFxcXF0pXFwkXCIoPzpcXFxcLnxcXHtcXHt8PDwwPj58W15cXFxcXCJ7XSkqXCIvLnNvdXJjZSwgW3NJbnRlcnBvbGF0aW9uXSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBjcmVhdGVJbnRlcnBvbGF0aW9uSW5zaWRlKHNJbnRlcnBvbGF0aW9uLCBzSW50ZXJwb2xhdGlvblJvdW5kKSxcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdjaGFyJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKGNoYXJhY3RlciksXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5kb3RuZXQgPSBQcmlzbS5sYW5ndWFnZXMuY3MgPSBQcmlzbS5sYW5ndWFnZXMuY3NoYXJwO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5hc3BuZXQgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdtYXJrdXAnLCB7XG5cdCdwYWdlLWRpcmVjdGl2ZSc6IHtcblx0XHRwYXR0ZXJuOiAvPCVcXHMqQC4qJT4vLFxuXHRcdGFsaWFzOiAndGFnJyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwYWdlLWRpcmVjdGl2ZSc6IHtcblx0XHRcdFx0cGF0dGVybjogLzwlXFxzKkBcXHMqKD86QXNzZW1ibHl8Q29udHJvbHxJbXBsZW1lbnRzfEltcG9ydHxNYXN0ZXIoPzpUeXBlKT98T3V0cHV0Q2FjaGV8UGFnZXxQcmV2aW91c1BhZ2VUeXBlfFJlZmVyZW5jZXxSZWdpc3Rlcik/fCU+L2ksXG5cdFx0XHRcdGFsaWFzOiAndGFnJ1xuXHRcdFx0fSxcblx0XHRcdHJlc3Q6IFByaXNtLmxhbmd1YWdlcy5tYXJrdXAudGFnLmluc2lkZVxuXHRcdH1cblx0fSxcblx0J2RpcmVjdGl2ZSc6IHtcblx0XHRwYXR0ZXJuOiAvPCUuKiU+Lyxcblx0XHRhbGlhczogJ3RhZycsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnZGlyZWN0aXZlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvPCVcXHMqP1skPSUjOl17MCwyfXwlPi8sXG5cdFx0XHRcdGFsaWFzOiAndGFnJ1xuXHRcdFx0fSxcblx0XHRcdHJlc3Q6IFByaXNtLmxhbmd1YWdlcy5jc2hhcnBcblx0XHR9XG5cdH1cbn0pO1xuLy8gUmVnZXhwIGNvcGllZCBmcm9tIHByaXNtLW1hcmt1cCwgd2l0aCBhIG5lZ2F0aXZlIGxvb2stYWhlYWQgYWRkZWRcblByaXNtLmxhbmd1YWdlcy5hc3BuZXQudGFnLnBhdHRlcm4gPSAvPCg/ISUpXFwvP1teXFxzPlxcL10rKD86XFxzK1teXFxzPlxcLz1dKyg/Oj0oPzooXCJ8JykoPzpcXFxcW1xcc1xcU118KD8hXFwxKVteXFxcXF0pKlxcMXxbXlxccydcIj49XSspKT8pKlxccypcXC8/Pi87XG5cbi8vIG1hdGNoIGRpcmVjdGl2ZXMgb2YgYXR0cmlidXRlIHZhbHVlIGZvbz1cIjwlIEJhciAlPlwiXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdpbnNpZGUnLCAncHVuY3R1YXRpb24nLCB7XG5cdCdkaXJlY3RpdmUnOiBQcmlzbS5sYW5ndWFnZXMuYXNwbmV0WydkaXJlY3RpdmUnXVxufSwgUHJpc20ubGFuZ3VhZ2VzLmFzcG5ldC50YWcuaW5zaWRlWydhdHRyLXZhbHVlJ10pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdhc3BuZXQnLCAnY29tbWVudCcsIHtcblx0J2FzcC1jb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC88JS0tW1xcc1xcU10qPy0tJT4vLFxuXHRcdGFsaWFzOiBbJ2FzcCcsICdjb21tZW50J11cblx0fVxufSk7XG5cbi8vIHNjcmlwdCBydW5hdD1cInNlcnZlclwiIGNvbnRhaW5zIGNzaGFycCwgbm90IGphdmFzY3JpcHRcblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2FzcG5ldCcsIFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0ID8gJ3NjcmlwdCcgOiAndGFnJywge1xuXHQnYXNwLXNjcmlwdCc6IHtcblx0XHRwYXR0ZXJuOiAvKDxzY3JpcHQoPz0uKnJ1bmF0PVsnXCJdP3NlcnZlclxcYilbXj5dKj4pW1xcc1xcU10qPyg/PTxcXC9zY3JpcHQ+KS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6IFsnYXNwJywgJ3NjcmlwdCddLFxuXHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmNzaGFycCB8fCB7fVxuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmFzbTY1MDIgPSB7XG5cdCdjb21tZW50JzogLzsuKi8sXG5cdCdkaXJlY3RpdmUnOiB7XG5cdFx0cGF0dGVybjogL1xcLlxcdysoPz0gKS8sXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblx0J3N0cmluZyc6IC8oW1wiJ2BdKSg/OlxcXFwufCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHQnb3AtY29kZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86QURDfEFORHxBU0x8QkNDfEJDU3xCRVF8QklUfEJNSXxCTkV8QlBMfEJSS3xCVkN8QlZTfENMQ3xDTER8Q0xJfENMVnxDTVB8Q1BYfENQWXxERUN8REVYfERFWXxFT1J8SU5DfElOWHxJTll8Sk1QfEpTUnxMREF8TERYfExEWXxMU1J8Tk9QfE9SQXxQSEF8UEhQfFBMQXxQTFB8Uk9MfFJPUnxSVEl8UlRTfFNCQ3xTRUN8U0VEfFNFSXxTVEF8U1RYfFNUWXxUQVh8VEFZfFRTWHxUWEF8VFhTfFRZQXxhZGN8YW5kfGFzbHxiY2N8YmNzfGJlcXxiaXR8Ym1pfGJuZXxicGx8YnJrfGJ2Y3xidnN8Y2xjfGNsZHxjbGl8Y2x2fGNtcHxjcHh8Y3B5fGRlY3xkZXh8ZGV5fGVvcnxpbmN8aW54fGlueXxqbXB8anNyfGxkYXxsZHh8bGR5fGxzcnxub3B8b3JhfHBoYXxwaHB8cGxhfHBscHxyb2x8cm9yfHJ0aXxydHN8c2JjfHNlY3xzZWR8c2VpfHN0YXxzdHh8c3R5fHRheHx0YXl8dHN4fHR4YXx0eHN8dHlhKVxcYi8sXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQnaGV4LW51bWJlcic6IHtcblx0XHRwYXR0ZXJuOiAvIz9cXCRbXFxkYS1mXXsxLDR9XFxiL2ksXG5cdFx0YWxpYXM6ICdudW1iZXInXG5cdH0sXG5cdCdiaW5hcnktbnVtYmVyJzoge1xuXHRcdHBhdHRlcm46IC8jPyVbMDFdK1xcYi8sXG5cdFx0YWxpYXM6ICdudW1iZXInXG5cdH0sXG5cdCdkZWNpbWFsLW51bWJlcic6IHtcblx0XHRwYXR0ZXJuOiAvIz9cXGJcXGQrXFxiLyxcblx0XHRhbGlhczogJ251bWJlcidcblx0fSxcblx0J3JlZ2lzdGVyJzoge1xuXHRcdHBhdHRlcm46IC9cXGJbeHlhXVxcYi9pLFxuXHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdH0sXG5cdCdwdW5jdHVhdGlvbic6IC9bKCksOl0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuYXNtYXRtZWwgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC87LiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oW1wiJ2BdKSg/OlxcXFwufCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCdjb25zdGFudCc6IC9cXGIoPzpQT1JUW0EtWl18RERSW0EtWl18KD86RER8UClbQS1aXSg/OlxcZHxbMC0yXVxcZHwzWzAxXSkpXFxiLyxcblxuXHQnZGlyZWN0aXZlJzoge1xuXHRcdHBhdHRlcm46IC9cXC5cXHcrKD89ICkvLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cdCdyLXJlZ2lzdGVyJzoge1xuXHRcdHBhdHRlcm46IC9cXGJyKD86XFxkfFsxMl1cXGR8M1swMV0pXFxiLyxcblx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHR9LFxuXHQnb3AtY29kZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86QURDfEFERHxBRElXfEFORHxBTkRJfEFTUnxCQ0xSfEJMRHxCUkJDfEJSQlN8QlJDQ3xCUkNTfEJSRUFLfEJSRVF8QlJHRXxCUkhDfEJSSFN8QlJJRHxCUklFfEJSTE98QlJMVHxCUk1JfEJSTkV8QlJQTHxCUlNIfEJSVEN8QlJUU3xCUlZDfEJSVlN8QlNFVHxCU1R8Q0FMTHxDQkl8Q0JSfENMQ3xDTEh8Q0xJfENMTnxDTFJ8Q0xTfENMVHxDTFZ8Q0xafENPTXxDUHxDUEN8Q1BJfENQU0V8REVDfERFU3xFSUNBTEx8RUlKTVB8RUxQTXxFT1J8Rk1VTHxGTVVMU3xGTVVMU1V8SUNBTEx8SUpNUHxJTnxJTkN8Sk1QfExBQ3xMQVN8TEFUfExEfExEW0EtWmEtejAtOV18TFBNfExTTHxMU1J8TU9WfE1PVld8TVVMfE1VTFN8TVVMU1V8TkVHfE5PUHxPUnxPUkl8T1VUfFBPUHxQVVNIfFJDQUxMfFJFVHxSRVRJfFJKTVB8Uk9MfFJPUnxTQkN8U0JDSXxTQkl8U0JJQ3xTQklTfFNCSVd8U0JSfFNCUkN8U0JSU3xTRUN8U0VIfFNFSXxTRU58U0VSfFNFU3xTRVR8U0VWfFNFWnxTTEVFUHxTUE18U1R8U1RbQS1aMC05XXxTVUJ8U1VCSXxTV0FQfFRTVHxXRFJ8WENIfGFkY3xhZGR8YWRpd3xhbmR8YW5kaXxhc3J8YmNscnxibGR8YnJiY3xicmJzfGJyY2N8YnJjc3xicmVha3xicmVxfGJyZ2V8YnJoY3xicmhzfGJyaWR8YnJpZXxicmxvfGJybHR8YnJtaXxicm5lfGJycGx8YnJzaHxicnRjfGJydHN8YnJ2Y3xicnZzfGJzZXR8YnN0fGNhbGx8Y2JpfGNicnxjbGN8Y2xofGNsaXxjbG58Y2xyfGNsc3xjbHR8Y2x2fGNsenxjb218Y3B8Y3BjfGNwaXxjcHNlfGRlY3xkZXN8ZWljYWxsfGVpam1wfGVscG18ZW9yfGZtdWx8Zm11bHN8Zm11bHN1fGljYWxsfGlqbXB8aW58aW5jfGptcHxsYWN8bGFzfGxhdHxsZHxsZFthLXowLTldfGxwbXxsc2x8bHNyfG1vdnxtb3Z3fG11bHxtdWxzfG11bHN1fG5lZ3xub3B8b3J8b3JpfG91dHxwb3B8cHVzaHxyY2FsbHxyZXR8cmV0aXxyam1wfHJvbHxyb3J8c2JjfHNiY2l8c2JpfHNiaWN8c2Jpc3xzYml3fHNicnxzYnJjfHNicnN8c2VjfHNlaHxzZWl8c2VufHNlcnxzZXN8c2V0fHNldnxzZXp8c2xlZXB8c3BtfHN0fHN0W2EtekEtWjAtOV18c3VifHN1Yml8c3dhcHx0c3R8d2RyfHhjaClcXGIvLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J2hleC1udW1iZXInOiB7XG5cdFx0cGF0dGVybjogLyM/XFwkW1xcZGEtZl17Miw0fVxcYi9pLFxuXHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHR9LFxuXHQnYmluYXJ5LW51bWJlcic6IHtcblx0XHRwYXR0ZXJuOiAvIz8lWzAxXStcXGIvLFxuXHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHR9LFxuXHQnZGVjaW1hbC1udW1iZXInOiB7XG5cdFx0cGF0dGVybjogLyM/XFxiXFxkK1xcYi8sXG5cdFx0YWxpYXM6ICdudW1iZXInXG5cdH0sXG5cdCdyZWdpc3Rlcic6IHtcblx0XHRwYXR0ZXJuOiAvXFxiW2Fjem52c2h0aXh5XVxcYi9pLFxuXHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdH0sXG5cdCdvcGVyYXRvcic6IC8+Pj0/fDw8PT98JlsmPV0/fFxcfFtcXHw9XT98Wy0rKi8lXiE9PD4/XT0/Lyxcblx0J3B1bmN0dWF0aW9uJzogL1soKSw6XS9cbn07XG5cbi8vIE5PVEVTIC0gZm9sbG93cyBmaXJzdC1maXJzdCBoaWdobGlnaHQgbWV0aG9kLCBibG9jayBpcyBsb2NrZWQgYWZ0ZXIgaGlnaGxpZ2h0LCBkaWZmZXJlbnQgZnJvbSBTeW50YXhIbFxuUHJpc20ubGFuZ3VhZ2VzLmF1dG9ob3RrZXkgPSB7XG5cdCdjb21tZW50JzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxcXHMpOy4qLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXltcXHQgXSopXFwvXFwqKD86W1xcclxcbl0oPyFbIFxcdF0qXFwqXFwvKXxbXlxcclxcbl0pKig/OltcXHJcXG5dWyBcXHRdKlxcKlxcLyk/L20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQndGFnJzoge1xuXHRcdC8vIGxhYmVsc1xuXHRcdHBhdHRlcm46IC9eKFsgXFx0XSopW15cXHMsYFwiOl0rKD89OlsgXFx0XSokKS9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IC9cIig/OlteXCJcXG5cXHJdfFwiXCIpKlwiLyxcblx0J3ZhcmlhYmxlJzogLyVcXHcrJS8sXG5cdCdudW1iZXInOiAvXFxiMHhbXFxkQS1GYS1mXStcXGJ8KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OltFZV0tP1xcZCspPy8sXG5cdCdvcGVyYXRvcic6IC9cXD98XFwvXFwvPz0/fDo9fFxcfFs9fF0/fCZbPSZdP3xcXCtbPStdP3wtWz0tXT98XFwqWz0qXT98PCg/Ojw9P3w+fD0pP3w+Pj89P3xbLl4hPX5dPT98XFxiKD86QU5EfE5PVHxPUilcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cblx0J2NvbW1hbmQnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OkF1dG9UcmltfEJsb2NrSW5wdXR8QnJlYWt8Q2xpY2t8Q2xpcFdhaXR8Q29udGludWV8Q29udHJvbHxDb250cm9sQ2xpY2t8Q29udHJvbEZvY3VzfENvbnRyb2xHZXR8Q29udHJvbEdldEZvY3VzfENvbnRyb2xHZXRQb3N8Q29udHJvbEdldFRleHR8Q29udHJvbE1vdmV8Q29udHJvbFNlbmR8Q29udHJvbFNlbmRSYXd8Q29udHJvbFNldFRleHR8Q29vcmRNb2RlfENyaXRpY2FsfERldGVjdEhpZGRlblRleHR8RGV0ZWN0SGlkZGVuV2luZG93c3xEcml2ZXxEcml2ZUdldHxEcml2ZVNwYWNlRnJlZXxFbnZBZGR8RW52RGl2fEVudkdldHxFbnZNdWx0fEVudlNldHxFbnZTdWJ8RW52VXBkYXRlfEV4aXR8RXhpdEFwcHxGaWxlQXBwZW5kfEZpbGVDb3B5fEZpbGVDb3B5RGlyfEZpbGVDcmVhdGVEaXJ8RmlsZUNyZWF0ZVNob3J0Y3V0fEZpbGVEZWxldGV8RmlsZUVuY29kaW5nfEZpbGVHZXRBdHRyaWJ8RmlsZUdldFNob3J0Y3V0fEZpbGVHZXRTaXplfEZpbGVHZXRUaW1lfEZpbGVHZXRWZXJzaW9ufEZpbGVJbnN0YWxsfEZpbGVNb3ZlfEZpbGVNb3ZlRGlyfEZpbGVSZWFkfEZpbGVSZWFkTGluZXxGaWxlUmVjeWNsZXxGaWxlUmVjeWNsZUVtcHR5fEZpbGVSZW1vdmVEaXJ8RmlsZVNlbGVjdEZpbGV8RmlsZVNlbGVjdEZvbGRlcnxGaWxlU2V0QXR0cmlifEZpbGVTZXRUaW1lfEZvcm1hdFRpbWV8R2V0S2V5U3RhdGV8R29zdWJ8R290b3xHcm91cEFjdGl2YXRlfEdyb3VwQWRkfEdyb3VwQ2xvc2V8R3JvdXBEZWFjdGl2YXRlfEd1aXxHdWlDb250cm9sfEd1aUNvbnRyb2xHZXR8SG90a2V5fEltYWdlU2VhcmNofEluaURlbGV0ZXxJbmlSZWFkfEluaVdyaXRlfElucHV0fElucHV0Qm94fEtleVdhaXR8TGlzdEhvdGtleXN8TGlzdExpbmVzfExpc3RWYXJzfExvb3B8TWVudXxNb3VzZUNsaWNrfE1vdXNlQ2xpY2tEcmFnfE1vdXNlR2V0UG9zfE1vdXNlTW92ZXxNc2dCb3h8T25FeGl0fE91dHB1dERlYnVnfFBhdXNlfFBpeGVsR2V0Q29sb3J8UGl4ZWxTZWFyY2h8UG9zdE1lc3NhZ2V8UHJvY2Vzc3xQcm9ncmVzc3xSYW5kb218UmVnRGVsZXRlfFJlZ1JlYWR8UmVnV3JpdGV8UmVsb2FkfFJlcGVhdHxSZXR1cm58UnVufFJ1bkFzfFJ1bldhaXR8U2VuZHxTZW5kRXZlbnR8U2VuZElucHV0fFNlbmRNZXNzYWdlfFNlbmRNb2RlfFNlbmRQbGF5fFNlbmRSYXd8U2V0QmF0Y2hMaW5lc3xTZXRDYXBzbG9ja1N0YXRlfFNldENvbnRyb2xEZWxheXxTZXREZWZhdWx0TW91c2VTcGVlZHxTZXRFbnZ8U2V0Rm9ybWF0fFNldEtleURlbGF5fFNldE1vdXNlRGVsYXl8U2V0TnVtbG9ja1N0YXRlfFNldFJlZ1ZpZXd8U2V0U2Nyb2xsTG9ja1N0YXRlfFNldFN0b3JlQ2Fwc2xvY2tNb2RlfFNldFRpbWVyfFNldFRpdGxlTWF0Y2hNb2RlfFNldFdpbkRlbGF5fFNldFdvcmtpbmdEaXJ8U2h1dGRvd258U2xlZXB8U29ydHxTb3VuZEJlZXB8U291bmRHZXR8U291bmRHZXRXYXZlVm9sdW1lfFNvdW5kUGxheXxTb3VuZFNldHxTb3VuZFNldFdhdmVWb2x1bWV8U3BsYXNoSW1hZ2V8U3BsYXNoVGV4dE9mZnxTcGxhc2hUZXh0T258U3BsaXRQYXRofFN0YXR1c0JhckdldFRleHR8U3RhdHVzQmFyV2FpdHxTdHJpbmdDYXNlU2Vuc2V8U3RyaW5nR2V0UG9zfFN0cmluZ0xlZnR8U3RyaW5nTGVufFN0cmluZ0xvd2VyfFN0cmluZ01pZHxTdHJpbmdSZXBsYWNlfFN0cmluZ1JpZ2h0fFN0cmluZ1NwbGl0fFN0cmluZ1RyaW1MZWZ0fFN0cmluZ1RyaW1SaWdodHxTdHJpbmdVcHBlcnxTdXNwZW5kfFN5c0dldHxUaHJlYWR8VG9vbFRpcHxUcmFuc2Zvcm18VHJheVRpcHxVUkxEb3dubG9hZFRvRmlsZXxXaW5BY3RpdmF0ZXxXaW5BY3RpdmF0ZUJvdHRvbXxXaW5DbG9zZXxXaW5HZXR8V2luR2V0QWN0aXZlU3RhdHN8V2luR2V0QWN0aXZlVGl0bGV8V2luR2V0Q2xhc3N8V2luR2V0UG9zfFdpbkdldFRleHR8V2luR2V0VGl0bGV8V2luSGlkZXxXaW5LaWxsfFdpbk1heGltaXplfFdpbk1lbnVTZWxlY3RJdGVtfFdpbk1pbmltaXplfFdpbk1pbmltaXplQWxsfFdpbk1pbmltaXplQWxsVW5kb3xXaW5Nb3ZlfFdpblJlc3RvcmV8V2luU2V0fFdpblNldFRpdGxlfFdpblNob3d8V2luV2FpdHxXaW5XYWl0QWN0aXZlfFdpbldhaXRDbG9zZXxXaW5XYWl0Tm90QWN0aXZlKVxcYi9pLFxuXHRcdGFsaWFzOiAnc2VsZWN0b3InXG5cdH0sXG5cblx0J2NvbnN0YW50JzogL1xcYig/OmFfYWhrcGF0aHxhX2Foa3ZlcnNpb258YV9hcHBkYXRhfGFfYXBwZGF0YWNvbW1vbnxhX2F1dG90cmltfGFfYmF0Y2hsaW5lc3xhX2NhcmV0eHxhX2NhcmV0eXxhX2NvbXB1dGVybmFtZXxhX2NvbnRyb2xkZWxheXxhX2N1cnNvcnxhX2RkfGFfZGRkfGFfZGRkZHxhX2RlZmF1bHRtb3VzZXNwZWVkfGFfZGVza3RvcHxhX2Rlc2t0b3Bjb21tb258YV9kZXRlY3RoaWRkZW50ZXh0fGFfZGV0ZWN0aGlkZGVud2luZG93c3xhX2VuZGNoYXJ8YV9ldmVudGluZm98YV9leGl0cmVhc29ufGFfZmlsZWVuY29kaW5nfGFfZm9ybWF0ZmxvYXR8YV9mb3JtYXRpbnRlZ2VyfGFfZ3VpfGFfZ3VpY29udHJvbHxhX2d1aWNvbnRyb2xldmVudHxhX2d1aWV2ZW50fGFfZ3VpaGVpZ2h0fGFfZ3Vpd2lkdGh8YV9ndWl4fGFfZ3VpeXxhX2hvdXJ8YV9pY29uZmlsZXxhX2ljb25oaWRkZW58YV9pY29ubnVtYmVyfGFfaWNvbnRpcHxhX2luZGV4fGFfaXBhZGRyZXNzMXxhX2lwYWRkcmVzczJ8YV9pcGFkZHJlc3MzfGFfaXBhZGRyZXNzNHxhX2lzNjRiaXRvc3xhX2lzYWRtaW58YV9pc2NvbXBpbGVkfGFfaXNjcml0aWNhbHxhX2lzcGF1c2VkfGFfaXNzdXNwZW5kZWR8YV9pc3VuaWNvZGV8YV9rZXlkZWxheXxhX2xhbmd1YWdlfGFfbGFzdGVycm9yfGFfbGluZWZpbGV8YV9saW5lbnVtYmVyfGFfbG9vcGZpZWxkfGFfbG9vcGZpbGVhdHRyaWJ8YV9sb29wZmlsZWRpcnxhX2xvb3BmaWxlZXh0fGFfbG9vcGZpbGVmdWxscGF0aHxhX2xvb3BmaWxlbG9uZ3BhdGh8YV9sb29wZmlsZW5hbWV8YV9sb29wZmlsZXNob3J0bmFtZXxhX2xvb3BmaWxlc2hvcnRwYXRofGFfbG9vcGZpbGVzaXplfGFfbG9vcGZpbGVzaXpla2J8YV9sb29wZmlsZXNpemVtYnxhX2xvb3BmaWxldGltZWFjY2Vzc2VkfGFfbG9vcGZpbGV0aW1lY3JlYXRlZHxhX2xvb3BmaWxldGltZW1vZGlmaWVkfGFfbG9vcHJlYWRsaW5lfGFfbG9vcHJlZ2tleXxhX2xvb3ByZWduYW1lfGFfbG9vcHJlZ3N1YmtleXxhX2xvb3ByZWd0aW1lbW9kaWZpZWR8YV9sb29wcmVndHlwZXxhX21kYXl8YV9taW58YV9tbXxhX21tbXxhX21tbW18YV9tb258YV9tb3VzZWRlbGF5fGFfbXNlY3xhX215ZG9jdW1lbnRzfGFfbm93fGFfbm93dXRjfGFfbnVtYmF0Y2hsaW5lc3xhX29zdHlwZXxhX29zdmVyc2lvbnxhX3ByaW9yaG90a2V5fGFfcHJpb3JrZXl8YV9wcm9ncmFtZmlsZXN8YV9wcm9ncmFtc3xhX3Byb2dyYW1zY29tbW9ufGFfcHRyc2l6ZXxhX3JlZ3ZpZXd8YV9zY3JlZW5kcGl8YV9zY3JlZW5oZWlnaHR8YV9zY3JlZW53aWR0aHxhX3NjcmlwdGRpcnxhX3NjcmlwdGZ1bGxwYXRofGFfc2NyaXB0aHduZHxhX3NjcmlwdG5hbWV8YV9zZWN8YV9zcGFjZXxhX3N0YXJ0bWVudXxhX3N0YXJ0bWVudWNvbW1vbnxhX3N0YXJ0dXB8YV9zdGFydHVwY29tbW9ufGFfc3RyaW5nY2FzZXNlbnNlfGFfdGFifGFfdGVtcHxhX3RoaXNmdW5jfGFfdGhpc2hvdGtleXxhX3RoaXNsYWJlbHxhX3RoaXNtZW51fGFfdGhpc21lbnVpdGVtfGFfdGhpc21lbnVpdGVtcG9zfGFfdGlja2NvdW50fGFfdGltZWlkbGV8YV90aW1laWRsZXBoeXNpY2FsfGFfdGltZXNpbmNlcHJpb3Job3RrZXl8YV90aW1lc2luY2V0aGlzaG90a2V5fGFfdGl0bGVtYXRjaG1vZGV8YV90aXRsZW1hdGNobW9kZXNwZWVkfGFfdXNlcm5hbWV8YV93ZGF5fGFfd2luZGVsYXl8YV93aW5kaXJ8YV93b3JraW5nZGlyfGFfeWRheXxhX3llYXJ8YV95d2Vla3xhX3l5eXl8Y2xpcGJvYXJkfGNsaXBib2FyZGFsbHxjb21zcGVjfGVycm9ybGV2ZWx8cHJvZ3JhbWZpbGVzKVxcYi9pLFxuXG5cdCdidWlsdGluJzogL1xcYig/OmFic3xhY29zfGFzY3xhc2lufGF0YW58Y2VpbHxjaHJ8Y2xhc3N8Y29tb2JqYWN0aXZlfGNvbW9iamFycmF5fGNvbW9iamNvbm5lY3R8Y29tb2JqY3JlYXRlfGNvbW9iamVycm9yfGNvbW9iamZsYWdzfGNvbW9iamdldHxjb21vYmpxdWVyeXxjb21vYmp0eXBlfGNvbW9ianZhbHVlfGNvc3xkbGxjYWxsfGV4cHxmaWxlZXhpc3R8RmlsZW9wZW58Zmxvb3J8Zm9ybWF0fGlsX2FkZHxpbF9jcmVhdGV8aWxfZGVzdHJveXxpbnN0cnxpc2Z1bmN8aXNsYWJlbHxJc09iamVjdHxsbnxsb2d8bHRyaW18bHZfYWRkfGx2X2RlbGV0ZXxsdl9kZWxldGVjb2x8bHZfZ2V0Y291bnR8bHZfZ2V0bmV4dHxsdl9nZXR0ZXh0fGx2X2luc2VydHxsdl9pbnNlcnRjb2x8bHZfbW9kaWZ5fGx2X21vZGlmeWNvbHxsdl9zZXRpbWFnZWxpc3R8bW9kfG51bWdldHxudW1wdXR8b25tZXNzYWdlfHJlZ2V4bWF0Y2h8cmVnZXhyZXBsYWNlfHJlZ2lzdGVyY2FsbGJhY2t8cm91bmR8cnRyaW18c2Jfc2V0aWNvbnxzYl9zZXRwYXJ0c3xzYl9zZXR0ZXh0fHNpbnxzcXJ0fHN0cmxlbnxzdHJyZXBsYWNlfHN0cnNwbGl0fHN1YnN0cnx0YW58dHZfYWRkfHR2X2RlbGV0ZXx0dl9nZXR8dHZfZ2V0Y2hpbGR8dHZfZ2V0Y291bnR8dHZfZ2V0bmV4dHx0dl9nZXRwYXJlbnR8dHZfZ2V0cHJldnx0dl9nZXRzZWxlY3Rpb258dHZfZ2V0dGV4dHx0dl9tb2RpZnl8dmFyc2V0Y2FwYWNpdHl8d2luYWN0aXZlfHdpbmV4aXN0fF9fQ2FsbHxfX0dldHxfX05ld3xfX1NldClcXGIvaSxcblxuXHQnc3ltYm9sJzogL1xcYig/OmFsdHxhbHRkb3dufGFsdHVwfGFwcHNrZXl8YmFja3NwYWNlfGJyb3dzZXJfYmFja3xicm93c2VyX2Zhdm9yaXRlc3xicm93c2VyX2ZvcndhcmR8YnJvd3Nlcl9ob21lfGJyb3dzZXJfcmVmcmVzaHxicm93c2VyX3NlYXJjaHxicm93c2VyX3N0b3B8YnN8Y2Fwc2xvY2t8Y3RybHxjdHJsYnJlYWt8Y3RybGRvd258Y3RybHVwfGRlbHxkZWxldGV8ZG93bnxlbmR8ZW50ZXJ8ZXNjfGVzY2FwZXxmMXxmMTB8ZjExfGYxMnxmMTN8ZjE0fGYxNXxmMTZ8ZjE3fGYxOHxmMTl8ZjJ8ZjIwfGYyMXxmMjJ8ZjIzfGYyNHxmM3xmNHxmNXxmNnxmN3xmOHxmOXxob21lfGluc3xpbnNlcnR8am95MXxqb3kxMHxqb3kxMXxqb3kxMnxqb3kxM3xqb3kxNHxqb3kxNXxqb3kxNnxqb3kxN3xqb3kxOHxqb3kxOXxqb3kyfGpveTIwfGpveTIxfGpveTIyfGpveTIzfGpveTI0fGpveTI1fGpveTI2fGpveTI3fGpveTI4fGpveTI5fGpveTN8am95MzB8am95MzF8am95MzJ8am95NHxqb3k1fGpveTZ8am95N3xqb3k4fGpveTl8am95YXhlc3xqb3lidXR0b25zfGpveWluZm98am95bmFtZXxqb3lwb3Z8am95cnxqb3l1fGpveXZ8am95eHxqb3l5fGpveXp8bGFsdHxsYXVuY2hfYXBwMXxsYXVuY2hfYXBwMnxsYXVuY2hfbWFpbHxsYXVuY2hfbWVkaWF8bGJ1dHRvbnxsY29udHJvbHxsY3RybHxsZWZ0fGxzaGlmdHxsd2lufGx3aW5kb3dufGx3aW51cHxtYnV0dG9ufG1lZGlhX25leHR8bWVkaWFfcGxheV9wYXVzZXxtZWRpYV9wcmV2fG1lZGlhX3N0b3B8bnVtbG9ja3xudW1wYWQwfG51bXBhZDF8bnVtcGFkMnxudW1wYWQzfG51bXBhZDR8bnVtcGFkNXxudW1wYWQ2fG51bXBhZDd8bnVtcGFkOHxudW1wYWQ5fG51bXBhZGFkZHxudW1wYWRjbGVhcnxudW1wYWRkZWx8bnVtcGFkZGl2fG51bXBhZGRvdHxudW1wYWRkb3dufG51bXBhZGVuZHxudW1wYWRlbnRlcnxudW1wYWRob21lfG51bXBhZGluc3xudW1wYWRsZWZ0fG51bXBhZG11bHR8bnVtcGFkcGdkbnxudW1wYWRwZ3VwfG51bXBhZHJpZ2h0fG51bXBhZHN1YnxudW1wYWR1cHxwZ2RufHBndXB8cHJpbnRzY3JlZW58cmFsdHxyYnV0dG9ufHJjb250cm9sfHJjdHJsfHJpZ2h0fHJzaGlmdHxyd2lufHJ3aW5kb3dufHJ3aW51cHxzY3JvbGxsb2NrfHNoaWZ0fHNoaWZ0ZG93bnxzaGlmdHVwfHNwYWNlfHRhYnx1cHx2b2x1bWVfZG93bnx2b2x1bWVfbXV0ZXx2b2x1bWVfdXB8d2hlZWxkb3dufHdoZWVsbGVmdHx3aGVlbHJpZ2h0fHdoZWVsdXB8eGJ1dHRvbjF8eGJ1dHRvbjIpXFxiL2ksXG5cblx0J2RpcmVjdGl2ZSc6IHtcblx0XHRwYXR0ZXJuOiAvI1thLXpdK1xcYi9pLFxuXHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHR9LFxuXG5cdCdrZXl3b3JkJzogL1xcYig/OkFib3J0fEFib3ZlTm9ybWFsfEFkZHxhaGtfY2xhc3N8YWhrX2V4ZXxhaGtfZ3JvdXB8YWhrX2lkfGFoa19waWR8QWxsfEFsbnVtfEFscGhhfEFsdFN1Ym1pdHxBbHRUYWJ8QWx0VGFiQW5kTWVudXxBbHRUYWJNZW51fEFsdFRhYk1lbnVEaXNtaXNzfEFsd2F5c09uVG9wfEF1dG9TaXplfEJhY2tncm91bmR8QmFja2dyb3VuZFRyYW5zfEJlbG93Tm9ybWFsfGJldHdlZW58Qml0QW5kfEJpdE5vdHxCaXRPcnxCaXRTaGlmdExlZnR8Qml0U2hpZnRSaWdodHxCaXRYT3J8Qm9sZHxCb3JkZXJ8QnV0dG9ufEJ5UmVmfENhdGNofENoZWNrYm94fENoZWNrZWR8Q2hlY2tlZEdyYXl8Q2hvb3NlfENob29zZVN0cmluZ3xDbG9zZXxDb2xvcnxDb21ib0JveHxDb250YWluc3xDb250cm9sTGlzdHxDb3VudHxEYXRlfERhdGVUaW1lfERheXN8RERMfERlZmF1bHR8RGVsZXRlQWxsfERlbGltaXRlcnxEZXJlZnxEZXN0cm95fERpZ2l0fERpc2FibGV8RGlzYWJsZWR8RHJvcERvd25MaXN0fEVkaXR8RWplY3R8RWxzZXxFbmFibGV8RW5hYmxlZHxFcnJvcnxFeGlzdHxFeHBhbmR8RXhTdHlsZXxGaWxlU3lzdGVtfEZpbmFsbHl8Rmlyc3R8Rmxhc2h8RmxvYXR8RmxvYXRGYXN0fEZvY3VzfEZvbnR8Zm9yfGdsb2JhbHxHcmlkfEdyb3VwfEdyb3VwQm94fEd1aUNsb3NlfEd1aUNvbnRleHRNZW51fEd1aURyb3BGaWxlc3xHdWlFc2NhcGV8R3VpU2l6ZXxIZHJ8SGlkZGVufEhpZGV8SGlnaHxIS0NDfEhLQ1J8SEtDVXxIS0VZX0NMQVNTRVNfUk9PVHxIS0VZX0NVUlJFTlRfQ09ORklHfEhLRVlfQ1VSUkVOVF9VU0VSfEhLRVlfTE9DQUxfTUFDSElORXxIS0VZX1VTRVJTfEhLTE18SEtVfEhvdXJzfEhTY3JvbGx8SWNvbnxJY29uU21hbGx8SUR8SURMYXN0fElmfElmRXF1YWx8SWZFeGlzdHxJZkdyZWF0ZXJ8SWZHcmVhdGVyT3JFcXVhbHxJZkluU3RyaW5nfElmTGVzc3xJZkxlc3NPckVxdWFsfElmTXNnQm94fElmTm90RXF1YWx8SWZOb3RFeGlzdHxJZk5vdEluU3RyaW5nfElmV2luQWN0aXZlfElmV2luRXhpc3R8SWZXaW5Ob3RBY3RpdmV8SWZXaW5Ob3RFeGlzdHxJZ25vcmV8SW1hZ2VMaXN0fGlufEludGVnZXJ8SW50ZWdlckZhc3R8SW50ZXJydXB0fGlzfGl0YWxpY3xKb2lufExhYmVsfExhc3RGb3VuZHxMYXN0Rm91bmRFeGlzdHxMaW1pdHxMaW5lc3xMaXN0fExpc3RCb3h8TGlzdFZpZXd8bG9jYWx8TG9ja3xMb2dvZmZ8TG93fExvd2VyfExvd2VyY2FzZXxNYWluV2luZG93fE1hcmdpbnxNYXhpbWl6ZXxNYXhpbWl6ZUJveHxNYXhTaXplfE1pbmltaXplfE1pbmltaXplQm94fE1pbk1heHxNaW5TaXplfE1pbnV0ZXN8TW9udGhDYWx8TW91c2V8TW92ZXxNdWx0aXxOQXxOb3xOb0FjdGl2YXRlfE5vRGVmYXVsdHxOb0hpZGV8Tm9JY29ufE5vTWFpbldpbmRvd3xub3JtfE5vcm1hbHxOb1NvcnR8Tm9Tb3J0SGRyfE5vU3RhbmRhcmR8Tm90fE5vVGFifE5vVGltZXJzfE51bWJlcnxPZmZ8T2t8T258T3duRGlhbG9nc3xPd25lcnxQYXJzZXxQYXNzd29yZHxQaWN0dXJlfFBpeGVsfFBvc3xQb3d8UHJpb3JpdHl8UHJvY2Vzc05hbWV8UmFkaW98UmFuZ2V8UmVhZHxSZWFkT25seXxSZWFsdGltZXxSZWRyYXd8UmVnaW9ufFJFR19CSU5BUll8UkVHX0RXT1JEfFJFR19FWFBBTkRfU1p8UkVHX01VTFRJX1NafFJFR19TWnxSZWxhdGl2ZXxSZW5hbWV8UmVwb3J0fFJlc2l6ZXxSZXN0b3JlfFJldHJ5fFJHQnxTY3JlZW58U2Vjb25kc3xTZWN0aW9ufFNlcmlhbHxTZXRMYWJlbHxTaGlmdEFsdFRhYnxTaG93fFNpbmdsZXxTbGlkZXJ8U29ydERlc2N8U3RhbmRhcmR8c3RhdGljfFN0YXR1c3xTdGF0dXNCYXJ8U3RhdHVzQ0R8c3RyaWtlfFN0eWxlfFN1Ym1pdHxTeXNNZW51fFRhYjJ8VGFiU3RvcHxUZXh0fFRoZW1lfFRocm93fFRpbGV8VG9nZ2xlQ2hlY2t8VG9nZ2xlRW5hYmxlfFRvb2xXaW5kb3d8VG9wfFRvcG1vc3R8VHJhbnNDb2xvcnxUcmFuc3BhcmVudHxUcmF5fFRyZWVWaWV3fFRyeXxUcnlBZ2FpbnxUeXBlfFVuQ2hlY2t8dW5kZXJsaW5lfFVuaWNvZGV8VW5sb2NrfFVudGlsfFVwRG93bnxVcHBlcnxVcHBlcmNhc2V8VXNlRXJyb3JMZXZlbHxWaXN8VmlzRmlyc3R8VmlzaWJsZXxWU2Nyb2xsfFdhaXR8V2FpdENsb3NlfFdhbnRDdHJsQXxXYW50RjJ8V2FudFJldHVybnxXaGlsZXxXcmFwfFhkaWdpdHx4bXx4cHx4c3xZZXN8eW18eXB8eXMpXFxiL2ksXG5cdCdmdW5jdGlvbic6IC9bXigpOyBcXHQsXFxuKypcXC09Pz46XFxcXFxcLzwmJVxcW1xcXV0rKD89XFwoKS8sXG5cdCdwdW5jdHVhdGlvbic6IC9be31bXFxdKCk6LF0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuYXV0b2l0ID0ge1xuXHQnY29tbWVudCc6IFtcblx0XHQvOy4qLyxcblx0XHR7XG5cdFx0XHQvLyBUaGUgbXVsdGktbGluZSBjb21tZW50cyBkZWxpbWl0ZXJzIGNhbiBhY3R1YWxseSBiZSBjb21tZW50ZWQgb3V0IHdpdGggXCI7XCJcblx0XHRcdHBhdHRlcm46IC8oXltcXHQgXSopIyg/OmNvbW1lbnRzLXN0YXJ0fGNzKVtcXHNcXFNdKj9eWyBcXHRdKiMoPzpjZXxjb21tZW50cy1lbmQpL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQndXJsJzoge1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSojaW5jbHVkZVxccyspKD86PFteXFxyXFxuPl0rPnxcIlteXFxyXFxuXCJdK1wiKS9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFtcIiddKSg/OlxcMVxcMXwoPyFcXDEpW15cXHJcXG5dKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCd2YXJpYWJsZSc6IC8oWyUkQF0pXFx3K1xcMS9cblx0XHR9XG5cdH0sXG5cdCdkaXJlY3RpdmUnOiB7XG5cdFx0cGF0dGVybjogLyheW1xcdCBdKikjW1xcdy1dKy9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQnZnVuY3Rpb24nOiAvXFxiXFx3Kyg/PVxcKCkvLFxuXHQvLyBWYXJpYWJsZXMgYW5kIG1hY3Jvc1xuXHQndmFyaWFibGUnOiAvWyRAXVxcdysvLFxuXHQna2V5d29yZCc6IC9cXGIoPzpDYXNlfENvbnN0fENvbnRpbnVlKD86Q2FzZXxMb29wKXxEZWZhdWx0fERpbXxEb3xFbHNlKD86SWYpP3xFbmQoPzpGdW5jfElmfFNlbGVjdHxTd2l0Y2h8V2l0aCl8RW51bXxFeGl0KD86TG9vcCk/fEZvcnxGdW5jfEdsb2JhbHxJZnxJbnxMb2NhbHxOZXh0fE51bGx8UmVEaW18U2VsZWN0fFN0YXRpY3xTdGVwfFN3aXRjaHxUaGVufFRvfFVudGlsfFZvbGF0aWxlfFdFbmR8V2hpbGV8V2l0aClcXGIvaSxcblx0J251bWJlcic6IC9cXGIoPzoweFtcXGRhLWZdK3xcXGQrKD86XFwuXFxkKyk/KD86ZVsrLV0/XFxkKyk/KVxcYi9pLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpGYWxzZXxUcnVlKVxcYi9pLFxuXHQnb3BlcmF0b3InOiAvPFs9Pl0/fFstKypcXC89Jj5dPT98Wz9eXXxcXGIoPzpBbmR8Tm90fE9yKVxcYi9pLFxuXHQncHVuY3R1YXRpb24nOiAvW1xcW1xcXSgpLiw6XS9cbn07XG5cbi8vIGh0dHA6Ly9hdmlzeW50aC5ubC9pbmRleC5waHAvVGhlX2Z1bGxfQXZpU3ludGhfZ3JhbW1hclxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdGZ1bmN0aW9uIHJlcGxhY2UocGF0dGVybiwgcmVwbGFjZW1lbnRzKSB7XG5cdFx0cmV0dXJuIHBhdHRlcm4ucmVwbGFjZSgvPDwoXFxkKyk+Pi9nLCBmdW5jdGlvbiAobSwgaW5kZXgpIHtcblx0XHRcdHJldHVybiByZXBsYWNlbWVudHNbK2luZGV4XTtcblx0XHR9KTtcblx0fVxuXG5cdGZ1bmN0aW9uIHJlKHBhdHRlcm4sIHJlcGxhY2VtZW50cywgZmxhZ3MpIHtcblx0XHRyZXR1cm4gUmVnRXhwKHJlcGxhY2UocGF0dGVybiwgcmVwbGFjZW1lbnRzKSwgZmxhZ3MgfHwgJycpO1xuXHR9XG5cblx0dmFyIHR5cGVzID0gL2Jvb2x8Y2xpcHxmbG9hdHxpbnR8c3RyaW5nfHZhbC8uc291cmNlO1xuXHR2YXIgaW50ZXJuYWxzID0gW1xuXHRcdC8vIGJvb2xzXG5cdFx0L2lzKD86Ym9vbHxjbGlwfGZsb2F0fGludHxzdHJpbmcpfGRlZmluZWR8KD86KD86aW50ZXJuYWwpP2Z1bmN0aW9ufHZhcik/ZXhpc3RzPy8uc291cmNlLFxuXHRcdC8vIGNvbnRyb2xcblx0XHQvYXBwbHl8YXNzZXJ0fGRlZmF1bHR8ZXZhbHxpbXBvcnR8bm9wfHNlbGVjdHx1bmRlZmluZWQvLnNvdXJjZSxcblx0XHQvLyBnbG9iYWxcblx0XHQvb3B0Xyg/OmFsbG93ZmxvYXRhdWRpb3xhdmlwYWRzY2FubGluZXN8ZHdjaGFubmVsbWFza3xlbmFibGVfKD86YjY0YXxwbGFuYXJ0b3BhY2tlZHJnYnx2MjEwfHkzXzEwXzEwfHkzXzEwXzE2KXx1c2V3YXZlZXh0ZW5zaWJsZXx2ZHVicGxhbmFyaGFjayl8c2V0KD86Y2FjaGVtb2RlfG1heGNwdXxtZW1vcnltYXh8cGxhbmFybGVnYWN5YWxpZ25tZW50fHdvcmtpbmdkaXIpLy5zb3VyY2UsXG5cdFx0Ly8gY29udlxuXHRcdC9oZXgoPzp2YWx1ZSk/fHZhbHVlLy5zb3VyY2UsXG5cdFx0Ly8gbnVtZXJpY1xuXHRcdC9hYnN8Y2VpbHxjb250aW51ZWQoPzpkZW5vbWluYXRvcnxudW1lcmF0b3IpP3xleHB8Zmxvb3J8Zm1vZHxmcmFjfGxvZyg/OjEwKT98bWF4fG1pbnxtdWxkaXZ8cGl8cG93fHJhbmR8cm91bmR8c2lnbnxzcGxpbmV8c3FydC8uc291cmNlLFxuXHRcdC8vIHRyaWdcblx0XHQvYT9zaW5oP3xhP2Nvc2g/fGE/dGFuWzJoXT8vLnNvdXJjZSxcblx0XHQvLyBiaXRcblx0XHQvKD86Yml0KD86YW5kfG5vdHx4P29yfFtscl0/c2hpZnRbYXNsdV0/fHNoW2xyXXxzYVtscl18W2xyXXJvdGF0ZWw/fHJvW3JsXXx0ZT9zdHxzZXQoPzpjb3VudCk/fGNsKD86ZWEpP3J8Y2goPzphbik/Z2U/KSkvLnNvdXJjZSxcblx0XHQvLyBydW50aW1lXG5cdFx0L2F2ZXJhZ2UoPzpbYmdyXXxjaHJvbWFbdXZdfGx1bWEpfCg/OltyZ2JdfGNocm9tYVt1dl18bHVtYXxyZ2J8W3l1dl0oPz1kaWZmZXJlbmNlKD86ZnJvbXByZXZpb3VzfHRvbmV4dCkpKWRpZmZlcmVuY2UoPzpmcm9tcHJldmlvdXN8dG9uZXh0KT98W3l1dnJnYl1wbGFuZSg/Om1lZGlhbnxtaW58bWF4fG1pbm1heGRpZmZlcmVuY2UpLy5zb3VyY2UsXG5cdFx0Ly8gc2NyaXB0XG5cdFx0L2dldHByb2Nlc3NpbmZvfGxvZ21zZ3xzY3JpcHQoPzpkaXIoPzp1dGY4KT98ZmlsZSg/OnV0ZjgpP3xuYW1lKD86dXRmOCk/KXxzZXRsb2dwYXJhbXMvLnNvdXJjZSxcblx0XHQvLyBzdHJpbmdcblx0XHQvY2hyfCg/OmZpbGx8ZmluZHxsZWZ0fG1pZHxyZXBsYWNlfHJldnxyaWdodClzdHJ8Zm9ybWF0fFtsdV1jYXNlfG9yZHxzdHIoPzpjbXBpP3xmcm9tdXRmOHxsZW58dG91dGY4KXx0aW1lfHRyaW0oPzphbGx8bGVmdHxyaWdodCkvLnNvdXJjZSxcblx0XHQvLyB2ZXJzaW9uXG5cdFx0L2lzdmVyc2lvbm9yZ3JlYXRlcnx2ZXJzaW9uKD86bnVtYmVyfHN0cmluZykvLnNvdXJjZSxcblx0XHQvLyBoZWxwZXJcblx0XHQvYnVpbGRwaXhlbHR5cGV8Y29sb3JzcGFjZW5hbWV0b3BpeGVsdHlwZS8uc291cmNlLFxuXHRcdC8vIGF2c3BsdXNcblx0XHQvYWRkYXV0b2xvYWRkaXJ8b24oPzpjcHV8Y3VkYSl8cHJlZmV0Y2h8c2V0ZmlsdGVybXRtb2RlLy5zb3VyY2Vcblx0XS5qb2luKCd8Jyk7XG5cdHZhciBwcm9wZXJ0aWVzID0gW1xuXHRcdC8vIGNvbnRlbnRcblx0XHQvaGFzKD86YXVkaW98dmlkZW8pLy5zb3VyY2UsXG5cdFx0Ly8gcmVzb2x1dGlvblxuXHRcdC9oZWlnaHR8d2lkdGgvLnNvdXJjZSxcblx0XHQvLyBmcmFtZXJhdGVcblx0XHQvZnJhbWUoPzpjb3VudHxyYXRlKXxmcmFtZXJhdGUoPzpkZW5vbWluYXRvcnxudW1lcmF0b3IpLy5zb3VyY2UsXG5cdFx0Ly8gaW50ZXJsYWNpbmdcblx0XHQvZ2V0cGFyaXR5fGlzKD86ZmllbGR8ZnJhbWUpYmFzZWQvLnNvdXJjZSxcblx0XHQvLyBjb2xvciBmb3JtYXRcblx0XHQvYml0c3BlcmNvbXBvbmVudHxjb21wb25lbnRzaXplfGhhc2FscGhhfGlzKD86cGxhbmFyKD86cmdiYT8pP3xpbnRlcmxlYXZlZHxyZ2IoPzoyNHwzMnw0OHw2NCk/fHkoPzo4fHUoPzp2YT98eTIpKT98eXYoPzoxMnwxNnwyNHw0MTEpfDQyMHw0MjJ8NDQ0fHBhY2tlZHJnYil8bnVtY29tcG9uZW50c3xwaXhlbHR5cGUvLnNvdXJjZSxcblx0XHQvLyBhdWRpb1xuXHRcdC9hdWRpbyg/OmJpdHN8Y2hhbm5lbHN8ZHVyYXRpb258bGVuZ3RoKD86W2ZzXXxoaXxsbyk/fHJhdGUpfGlzYXVkaW8oPzpmbG9hdHxpbnQpLy5zb3VyY2Vcblx0XS5qb2luKCd8Jyk7XG5cdHZhciBmaWx0ZXJzID0gW1xuXHRcdC8vIHNvdXJjZVxuXHRcdC9hdmkoPzpmaWxlKT9zb3VyY2V8ZGlyZWN0c2hvd3NvdXJjZXxpbWFnZSg/OnJlYWRlcnxzb3VyY2V8c291cmNlYW5pbSl8b3BlbmRtbHNvdXJjZXxzZWdtZW50ZWQoPzphdmlzb3VyY2V8ZGlyZWN0c2hvd3NvdXJjZSl8d2F2c291cmNlLy5zb3VyY2UsXG5cdFx0Ly8gY29sb3Jcblx0XHQvY29sb3J5dXZ8Y29udmVydGJhY2t0b3l1eTJ8Y29udmVydHRvKD86UkdCKD86MjR8MzJ8NDh8NjQpfCg/OnBsYW5hcik/UkdCQT98WTg/fFlWKD86MTJ8MTZ8MjR8NDExKXxZVVZBPyg/OjQxMXw0MjB8NDIyfDQ0NCl8WVVZMil8Zml4bHVtaW5hbmNlfGdyW2FlXXlzY2FsZXxpbnZlcnR8bGV2ZWxzfGxpbWl0ZXJ8bWVyZ2VhP3JnYnxtZXJnZSg/OmNocm9tYXxsdW1hKXxyZ2JhZGp1c3R8c2hvdyg/OmFscGhhfGJsdWV8Z3JlZW58cmVkKXxzd2FwdXZ8dHdlYWt8W3V2XXRveTg/fHl0b3V2Ly5zb3VyY2UsXG5cdFx0Ly8gb3ZlcmxheVxuXHRcdC8oPzpjb2xvcmtleXxyZXNldCltYXNrfGxheWVyfG1hc2soPzpocyk/fG1lcmdlfG92ZXJsYXl8c3VidHJhY3QvLnNvdXJjZSxcblx0XHQvLyBnZW9tZXRyeVxuXHRcdC9hZGRib3JkZXJzfCg/OmJpY3ViaWN8YmlsaW5lYXJ8YmxhY2ttYW58Z2F1c3N8bGFuY3pvczR8bGFuY3pvc3xwb2ludHxzaW5jfHNwbGluZSg/OjE2fDM2fDY0KSlyZXNpemV8Y3JvcCg/OmJvdHRvbSk/fGZsaXAoPzpob3Jpem9udGFsfHZlcnRpY2FsKXwoPzpob3Jpem9udGFsfHZlcnRpY2FsKT9yZWR1Y2VieTJ8bGV0dGVyYm94fHNrZXdyb3dzfHR1cm4oPzoxODB8bGVmdHxyaWdodCkvLnNvdXJjZSxcblx0XHQvLyBwaXhlbFxuXHRcdC9ibHVyfGZpeGJyb2tlbmNocm9tYXVwc2FtcGxpbmd8Z2VuZXJhbGNvbnZvbHV0aW9ufCg/OnNwYXRpYWx8dGVtcG9yYWwpc29mdGVufHNoYXJwZW4vLnNvdXJjZSxcblx0XHQvLyB0aW1lbGluZVxuXHRcdC90cmltfCg/OnVuKT9hbGlnbmVkc3BsaWNlfCg/OmFzc3VtZXxhc3N1bWVzY2FsZWR8Y2hhbmdlfGNvbnZlcnQpRlBTfCg/OmRlbGV0ZXxkdXBsaWNhdGUpZnJhbWV8ZGlzc29sdmV8ZmFkZSg/OmlufGlvfG91dClbMDJdP3xmcmVlemVmcmFtZXxpbnRlcmxlYXZlfGxvb3B8cmV2ZXJzZXxzZWxlY3QoPzpldmVufG9kZHwoPzpyYW5nZSk/ZXZlcnkpLy5zb3VyY2UsXG5cdFx0Ly8gaW50ZXJsYWNlXG5cdFx0L2Fzc3VtZVtidF1mZnxhc3N1bWUoPzpmaWVsZHxmcmFtZSliYXNlZHxib2J8Y29tcGxlbWVudHBhcml0eXxkb3VibGV3ZWF2ZXxwZWN1bGlhcmJsZW5kfHB1bGxkb3dufHNlcGFyYXRlKD86Y29sdW1uc3xmaWVsZHN8cm93cyl8c3dhcGZpZWxkc3x3ZWF2ZSg/OmNvbHVtbnN8cm93cyk/Ly5zb3VyY2UsXG5cdFx0Ly8gYXVkaW9cblx0XHQvYW1wbGlmeSg/OmRiKT98YXNzdW1lc2FtcGxlcmF0ZXxhdWRpb2R1Yig/OmV4KT98YXVkaW90cmltfGNvbnZlcnRhdWRpb3RvKD86KD86OHwxNnwyNHwzMiliaXR8ZmxvYXQpfGNvbnZlcnR0b21vbm98ZGVsYXlhdWRpb3xlbnN1cmV2YnJtcDNzeW5jfGdldCg/OmxlZnR8cmlnaHQpP2NoYW5uZWx8a2lsbCg/OmF1ZGlvfHZpZGVvKXxtZXJnZWNoYW5uZWxzfG1peGF1ZGlvfG1vbm90b3N0ZXJlb3xub3JtYWxpemV8cmVzYW1wbGVhdWRpb3xzc3JjfHN1cGVyZXF8dGltZXN0cmV0Y2gvLnNvdXJjZSxcblx0XHQvLyBjb25kaXRpb25hbFxuXHRcdC9hbmltYXRlfGFwcGx5cmFuZ2V8Y29uZGl0aW9uYWwoPzpmaWx0ZXJ8cmVhZGVyfHNlbGVjdCl8ZnJhbWVldmFsdWF0ZXxzY3JpcHRjbGlwfHRjcCg/OnNlcnZlcnxzb3VyY2UpfHdyaXRlZmlsZSg/OmVuZHxpZnxzdGFydCk/Ly5zb3VyY2UsXG5cdFx0Ly8gZXhwb3J0XG5cdFx0L2ltYWdld3JpdGVyLy5zb3VyY2UsXG5cdFx0Ly8gZGVidWdcblx0XHQvYmxhY2tuZXNzfGJsYW5rY2xpcHxjb2xvcmJhcnMoPzpoZCk/fGNvbXBhcmV8ZHVtcGZpbHRlcmdyYXBofGVjaG98aGlzdG9ncmFtfGluZm98bWVzc2FnZWNsaXB8cHJlcm9sbHxzZXRncmFwaGFuYWx5c2lzfHNob3coPzpmcmFtZW51bWJlcnxzbXB0ZXx0aW1lKXxzaG93Zml2ZXZlcnNpb25zfHN0YWNrKD86aG9yaXpvbnRhbHx2ZXJ0aWNhbCl8c3VidGl0bGV8dG9uZXx2ZXJzaW9uLy5zb3VyY2Vcblx0XS5qb2luKCd8Jyk7XG5cdHZhciBhbGxpbnRlcm5hbHMgPSBbaW50ZXJuYWxzLCBwcm9wZXJ0aWVzLCBmaWx0ZXJzXS5qb2luKCd8Jyk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmF2aXN5bnRoID0ge1xuXHRcdCdjb21tZW50JzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyBNYXRjaGVzIFsqICpdIG5lc3RhYmxlIGJsb2NrIGNvbW1lbnRzLCBidXQgb25seSBzdXBwb3J0cyAxIGxldmVsIG9mIG5lc3RlZCBjb21tZW50c1xuXHRcdFx0XHQvLyAvXFxbXFwqKD86W15cXFsqXXxcXFsoPyFcXCopfFxcKig/IVxcXSl8PHNlbGY+KSpcXCpcXF0vXG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVxcW1xcKig/OlteXFxbKl18XFxbKD8hXFwqKXxcXCooPyFcXF0pfFxcW1xcKig/OlteXFxbKl18XFxbKD8hXFwqKXxcXCooPyFcXF0pKSpcXCpcXF0pKlxcKlxcXS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gTWF0Y2hlcyAvKiAqLyBibG9jayBjb21tZW50c1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcXC9cXCpbXFxzXFxTXSo/KD86XFwqXFwvfCQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBNYXRjaGVzICMgY29tbWVudHNcblx0XHRcdFx0cGF0dGVybjogLyhefFteXFxcXCRdKSMuKi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cblx0XHQvLyBIYW5kbGUgYmVmb3JlIHN0cmluZ3MgYmVjYXVzZSBvcHRpb25hbCBhcmd1bWVudHMgYXJlIHN1cnJvdW5kZWQgYnkgZG91YmxlIHF1b3Rlc1xuXHRcdCdhcmd1bWVudCc6IHtcblx0XHRcdHBhdHRlcm46IHJlKC9cXGIoPzo8PDA+PilcXHMrKFwiPylcXHcrXFwxLy5zb3VyY2UsIFt0eXBlc10sICdpJyksXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2tleXdvcmQnOiAvXlxcdysvXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIE9wdGlvbmFsIGFyZ3VtZW50IGFzc2lnbm1lbnRcblx0XHQnYXJndW1lbnQtbGFiZWwnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFssKF1bXFxzXFxcXF0qKVxcdytcXHMqPSg/IT0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2FyZ3VtZW50LW5hbWUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15cXHcrLyxcblx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvPSQvXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdCdzdHJpbmcnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vIHRyaXBsZSBkb3VibGUtcXVvdGVkXG5cdFx0XHRcdHBhdHRlcm46IC9cIlwiXCJbXFxzXFxTXSo/XCJcIlwiLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gc2luZ2xlIGRvdWJsZS1xdW90ZWRcblx0XHRcdFx0cGF0dGVybjogL1wiKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8W15cIlxcXFxcXHJcXG5dKSpcIi8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2NvbnN0YW50Jzoge1xuXHRcdFx0XHRcdFx0Ly8gVGhlc2UgKmFyZSogY2FzZS1zZW5zaXRpdmUhXG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxiKD86REVGQVVMVF9NVF9NT0RFfCg/Ok1BSU5TQ1JJUFR8UFJPR1JBTXxTQ1JJUFQpRElSfCg/Ok1BQ0hJTkV8VVNFUilfKD86Q0xBU1NJQ3xQTFVTKV9QTFVHSU5TKVxcYi9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXG5cdFx0Ly8gVGhlIHNwZWNpYWwgXCJsYXN0XCIgdmFyaWFibGUgdGhhdCB0YWtlcyB0aGUgdmFsdWUgb2YgdGhlIGxhc3QgaW1wbGljaXRseSByZXR1cm5lZCBjbGlwXG5cdFx0J3ZhcmlhYmxlJzogL1xcYig/Omxhc3QpXFxiL2ksXG5cblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXxub3x0cnVlfHllcylcXGIvaSxcblxuXHRcdCdrZXl3b3JkJzogL1xcYig/OmNhdGNofGVsc2V8Zm9yfGZ1bmN0aW9ufGdsb2JhbHxpZnxyZXR1cm58dHJ5fHdoaWxlfF9fRU5EX18pXFxiL2ksXG5cblx0XHQnY29uc3RhbnQnOiAvXFxiTVRfKD86TVVMVElfSU5TVEFOQ0V8TklDRV9GSUxURVJ8U0VSSUFMSVpFRHxTUEVDSUFMX01UKVxcYi8sXG5cblx0XHQvLyBBdmlTeW50aCdzIGludGVybmFsIGZ1bmN0aW9ucywgZmlsdGVycywgYW5kIHByb3BlcnRpZXNcblx0XHQnYnVpbHRpbi1mdW5jdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IHJlKC9cXGIoPzo8PDA+PilcXGIvLnNvdXJjZSwgW2FsbGludGVybmFsc10sICdpJyksXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH0sXG5cblx0XHQndHlwZS1jYXN0Jzoge1xuXHRcdFx0cGF0dGVybjogcmUoL1xcYig/Ojw8MD4+KSg/PVxccypcXCgpLy5zb3VyY2UsIFt0eXBlc10sICdpJyksXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fSxcblxuXHRcdC8vIEV4dGVybmFsL3VzZXItZGVmaW5lZCBmaWx0ZXJzXG5cdFx0J2Z1bmN0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYlthLXpfXVxcdyooPz1cXHMqXFwoKXwoXFwuKVthLXpfXVxcdypcXGIvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXG5cdFx0Ly8gTWF0Y2hlcyBhIFxcIGFzIHRoZSBmaXJzdCBvciBsYXN0IGNoYXJhY3RlciBvbiBhIGxpbmVcblx0XHQnbGluZS1jb250aW51YXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKVxcXFx8XFxcXCg/PVsgXFx0XSokKS9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblxuXHRcdCdudW1iZXInOiAvXFxCXFwkKD86W1xcZGEtZl17Nn18W1xcZGEtZl17OH0pXFxifCg/Oig/OlxcYnxcXEItKVxcZCsoPzpcXC5cXGQqKT9cXGJ8XFxCXFwuXFxkK1xcYikvaSxcblxuXHRcdCdvcGVyYXRvcic6IC9cXCtcXCs/fFshPTw+XT0/fCYmfFxcfFxcfHxbPzoqLyUtXS8sXG5cblx0XHQncHVuY3R1YXRpb24nOiAvW3t9XFxbXFxdKCk7LC5dL1xuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5hdnMgPSBQcmlzbS5sYW5ndWFnZXMuYXZpc3ludGg7XG5cbn0oUHJpc20pKTtcblxuLy8gR2l0SHViOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2F2cm9cbi8vIERvY3M6IGh0dHBzOi8vYXZyby5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9pZGwuaHRtbFxuXG5QcmlzbS5sYW5ndWFnZXNbJ2F2cm8taWRsJ10gPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXC9cXC8uKnxcXC9cXCpbXFxzXFxTXSo/XFwqXFwvLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcIig/OlteXFxyXFxuXCJcXFxcXXxcXFxcLikqXCIvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J2Fubm90YXRpb24nOiB7XG5cdFx0cGF0dGVybjogL0AoPzpbJFxcdy4tXXxgW15cXHJcXG5gXStgKSsvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHR9LFxuXHQnZnVuY3Rpb24taWRlbnRpZmllcic6IHtcblx0XHRwYXR0ZXJuOiAvYFteXFxyXFxuYF0rYCg/PVxccypcXCgpLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0fSxcblx0J2lkZW50aWZpZXInOiB7XG5cdFx0cGF0dGVybjogL2BbXlxcclxcbmBdK2AvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCdjbGFzcy1uYW1lJzoge1xuXHRcdHBhdHRlcm46IC8oXFxiKD86ZW51bXxlcnJvcnxwcm90b2NvbHxyZWNvcmR8dGhyb3dzKVxcYlxccyspWyRcXHddKy8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86YXJyYXl8Ym9vbGVhbnxieXRlc3xkYXRlfGRlY2ltYWx8ZG91YmxlfGVudW18ZXJyb3J8ZmFsc2V8Zml4ZWR8ZmxvYXR8aWRsfGltcG9ydHxpbnR8bG9jYWxfdGltZXN0YW1wX21zfGxvbmd8bWFwfG51bGx8b25ld2F5fHByb3RvY29sfHJlY29yZHxzY2hlbWF8c3RyaW5nfHRocm93c3x0aW1lX21zfHRpbWVzdGFtcF9tc3x0cnVlfHVuaW9ufHV1aWR8dm9pZClcXGIvLFxuXHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVxccypcXCgpL2ksXG5cblx0J251bWJlcic6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXHcuXSktPyg/Oig/OlxcZCsoPzpcXC5cXGQqKT98XFwuXFxkKykoPzplWystXT9cXGQrKT98MHgoPzpbYS1mMC05XSsoPzpcXC5bYS1mMC05XSopP3xcXC5bYS1mMC05XSspKD86cFsrLV0/XFxkKyk/KVtkZmxdPyg/IVtcXHcuXSkvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdC8tP1xcYig/OkluZmluaXR5fE5hTilcXGIvXG5cdF0sXG5cblx0J29wZXJhdG9yJzogLz0vLFxuXHQncHVuY3R1YXRpb24nOiAvWygpXFxbXFxde308Pi46LDstXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5hdmRsID0gUHJpc20ubGFuZ3VhZ2VzWydhdnJvLWlkbCddO1xuXG5QcmlzbS5sYW5ndWFnZXMuYXdrID0ge1xuXHQnaGFzaGJhbmcnOiB7XG5cdFx0cGF0dGVybjogL14jIS4qLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdjb21tZW50J1xuXHR9LFxuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvIy4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcIig/OlteXFxcXFwiXFxyXFxuXXxcXFxcLikqXCIvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdyZWdleCc6IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58W15cXHdcXHMpXSlcXHMqKVxcLyg/OlteXFwvXFxcXFxcclxcbl18XFxcXC4pKlxcLy8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQndmFyaWFibGUnOiAvXFwkXFx3Ky8sXG5cdCdrZXl3b3JkJzogL1xcYig/OkJFR0lOfEJFR0lORklMRXxFTkR8RU5ERklMRXxicmVha3xjYXNlfGNvbnRpbnVlfGRlZmF1bHR8ZGVsZXRlfGRvfGVsc2V8ZXhpdHxmb3J8ZnVuY3Rpb258Z2V0bGluZXxpZnxpbnxuZXh0fG5leHRmaWxlfHByaW50Zj98cmV0dXJufHN3aXRjaHx3aGlsZSlcXGJ8QCg/OmluY2x1ZGV8bG9hZClcXGIvLFxuXG5cdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89XFxzKlxcKCkvaSxcblx0J251bWJlcic6IC9cXGIoPzpcXGQrKD86XFwuXFxkKyk/KD86ZVsrLV0/XFxkKyk/fDB4W2EtZkEtRjAtOV0rKVxcYi8sXG5cblx0J29wZXJhdG9yJzogLy0tfFxcK1xcK3whP358PiZ8Pj58PDx8KD86XFwqXFwqfFs8PiE9K1xcLSovJV5dKT0/fCYmfFxcfFt8Jl18Wz86XS8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKClbXFxde30sO10vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuZ2F3ayA9IFByaXNtLmxhbmd1YWdlcy5hd2s7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0Ly8gJCBzZXQgfCBncmVwICdeW0EtWl1bXls6c3BhY2U6XV0qPScgfCBjdXQgLWQ9IC1mMSB8IHRyICdcXG4nICd8J1xuXHQvLyArIExDX0FMTCwgUkFORE9NLCBSRVBMWSwgU0VDT05EUy5cblx0Ly8gKyBtYWtlIHN1cmUgUFMxLi40IGFyZSBoZXJlIGFzIHRoZXkgYXJlIG5vdCBhbHdheXMgc2V0LFxuXHQvLyAtIHNvbWUgdXNlbGVzcyB0aGluZ3MuXG5cdHZhciBlbnZWYXJzID0gJ1xcXFxiKD86QkFTSHxCQVNIT1BUU3xCQVNIX0FMSUFTRVN8QkFTSF9BUkdDfEJBU0hfQVJHVnxCQVNIX0NNRFN8QkFTSF9DT01QTEVUSU9OX0NPTVBBVF9ESVJ8QkFTSF9MSU5FTk98QkFTSF9SRU1BVENIfEJBU0hfU09VUkNFfEJBU0hfVkVSU0lORk98QkFTSF9WRVJTSU9OfENPTE9SVEVSTXxDT0xVTU5TfENPTVBfV09SREJSRUFLU3xEQlVTX1NFU1NJT05fQlVTX0FERFJFU1N8REVGQVVMVFNfUEFUSHxERVNLVE9QX1NFU1NJT058RElSU1RBQ0t8RElTUExBWXxFVUlEfEdETVNFU1NJT058R0RNX0xBTkd8R05PTUVfS0VZUklOR19DT05UUk9MfEdOT01FX0tFWVJJTkdfUElEfEdQR19BR0VOVF9JTkZPfEdST1VQU3xISVNUQ09OVFJPTHxISVNURklMRXxISVNURklMRVNJWkV8SElTVFNJWkV8SE9NRXxIT1NUTkFNRXxIT1NUVFlQRXxJRlN8SU5TVEFOQ0V8Sk9CfExBTkd8TEFOR1VBR0V8TENfQUREUkVTU3xMQ19BTEx8TENfSURFTlRJRklDQVRJT058TENfTUVBU1VSRU1FTlR8TENfTU9ORVRBUll8TENfTkFNRXxMQ19OVU1FUklDfExDX1BBUEVSfExDX1RFTEVQSE9ORXxMQ19USU1FfExFU1NDTE9TRXxMRVNTT1BFTnxMSU5FU3xMT0dOQU1FfExTX0NPTE9SU3xNQUNIVFlQRXxNQUlMQ0hFQ0t8TUFOREFUT1JZX1BBVEh8Tk9fQVRfQlJJREdFfE9MRFBXRHxPUFRFUlJ8T1BUSU5EfE9SQklUX1NPQ0tFVERJUnxPU1RZUEV8UEFQRVJTSVpFfFBBVEh8UElQRVNUQVRVU3xQUElEfFBTMXxQUzJ8UFMzfFBTNHxQV0R8UkFORE9NfFJFUExZfFNFQ09ORFN8U0VMSU5VWF9JTklUfFNFU1NJT058U0VTU0lPTlRZUEV8U0VTU0lPTl9NQU5BR0VSfFNIRUxMfFNIRUxMT1BUU3xTSExWTHxTU0hfQVVUSF9TT0NLfFRFUk18VUlEfFVQU1RBUlRfRVZFTlRTfFVQU1RBUlRfSU5TVEFOQ0V8VVBTVEFSVF9KT0J8VVBTVEFSVF9TRVNTSU9OfFVTRVJ8V0lORE9XSUR8WEFVVEhPUklUWXxYREdfQ09ORklHX0RJUlN8WERHX0NVUlJFTlRfREVTS1RPUHxYREdfREFUQV9ESVJTfFhER19HUkVFVEVSX0RBVEFfRElSfFhER19NRU5VX1BSRUZJWHxYREdfUlVOVElNRV9ESVJ8WERHX1NFQVR8WERHX1NFQVRfUEFUSHxYREdfU0VTU0lPTl9ERVNLVE9QfFhER19TRVNTSU9OX0lEfFhER19TRVNTSU9OX1BBVEh8WERHX1NFU1NJT05fVFlQRXxYREdfVlROUnxYTU9ESUZJRVJTKVxcXFxiJztcblxuXHR2YXIgY29tbWFuZEFmdGVySGVyZWRvYyA9IHtcblx0XHRwYXR0ZXJuOiAvKF4oW1wiJ10/KVxcdytcXDIpWyBcXHRdK1xcUy4qLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAncHVuY3R1YXRpb24nLCAvLyB0aGlzIGxvb2tzIHJlYXNvbmFibHkgd2VsbCBpbiBhbGwgdGhlbWVzXG5cdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHR9O1xuXG5cdHZhciBpbnNpZGVTdHJpbmcgPSB7XG5cdFx0J2Jhc2gnOiBjb21tYW5kQWZ0ZXJIZXJlZG9jLFxuXHRcdCdlbnZpcm9ubWVudCc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnXFxcXCQnICsgZW52VmFycyksXG5cdFx0XHRhbGlhczogJ2NvbnN0YW50J1xuXHRcdH0sXG5cdFx0J3ZhcmlhYmxlJzogW1xuXHRcdFx0Ly8gWzBdOiBBcml0aG1ldGljIEVudmlyb25tZW50XG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXCQ/XFwoXFwoW1xcc1xcU10rP1xcKVxcKS8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYSAkIHNpZ24gYXQgdGhlIGJlZ2lubmluZyBoaWdobGlnaHQgJCgoIGFuZCApKSBhcyB2YXJpYWJsZVxuXHRcdFx0XHRcdCd2YXJpYWJsZSc6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyheXFwkXFwoXFwoW1xcc1xcU10rKVxcKVxcKS8sXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQvXlxcJFxcKFxcKC9cblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdCdudW1iZXInOiAvXFxiMHhbXFxkQS1GYS1mXStcXGJ8KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OltFZV0tP1xcZCspPy8sXG5cdFx0XHRcdFx0Ly8gT3BlcmF0b3JzIGFjY29yZGluZyB0byBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2Jhc2gvbWFudWFsL2Jhc2hyZWYuaHRtbCNTaGVsbC1Bcml0aG1ldGljXG5cdFx0XHRcdFx0J29wZXJhdG9yJzogLy0tfFxcK1xcK3xcXCpcXCo9P3w8PD0/fD4+PT98JiZ8XFx8XFx8fFs9IStcXC0qLyU8Pl4mfF09P3xbP346XS8sXG5cdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgbm8gJCBzaWduIGF0IHRoZSBiZWdpbm5pbmcgaGlnaGxpZ2h0ICgoIGFuZCApKSBhcyBwdW5jdHVhdGlvblxuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXChcXCg/fFxcKVxcKT98LHw7L1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0Ly8gWzFdOiBDb21tYW5kIFN1YnN0aXR1dGlvblxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFwkXFwoKD86XFwoW14pXStcXCl8W14oKV0pK1xcKXxgW15gXStgLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQndmFyaWFibGUnOiAvXlxcJFxcKHxeYHxcXCkkfGAkL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0Ly8gWzJdOiBCcmFjZSBleHBhbnNpb25cblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcJFxce1tefV0rXFx9Lyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnb3BlcmF0b3InOiAvOlstPT8rXT98WyFcXC9dfCMjP3wlJT98XFxeXFxeP3wsLD8vLFxuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bXFxbXFxdXS8sXG5cdFx0XHRcdFx0J2Vudmlyb25tZW50Jzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogUmVnRXhwKCcoXFxcXHspJyArIGVudlZhcnMpLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGFsaWFzOiAnY29uc3RhbnQnXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0L1xcJCg/Olxcdyt8WyM/KiFAJF0pL1xuXHRcdF0sXG5cdFx0Ly8gRXNjYXBlIHNlcXVlbmNlcyBmcm9tIGVjaG8gYW5kIHByaW50ZidzIG1hbnVhbHMsIGFuZCBlc2NhcGVkIHF1b3Rlcy5cblx0XHQnZW50aXR5JzogL1xcXFwoPzpbYWJjZUVmbnJ0dlxcXFxcIl18Tz9bMC03XXsxLDN9fFVbMC05YS1mQS1GXXs4fXx1WzAtOWEtZkEtRl17NH18eFswLTlhLWZBLUZdezEsMn0pL1xuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5iYXNoID0ge1xuXHRcdCdzaGViYW5nJzoge1xuXHRcdFx0cGF0dGVybjogL14jIVxccypcXC8uKi8sXG5cdFx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0XHR9LFxuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXCJ7XFxcXCRdKSMuKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnZnVuY3Rpb24tbmFtZSc6IFtcblx0XHRcdC8vIGEpIGZ1bmN0aW9uIGZvbyB7XG5cdFx0XHQvLyBiKSBmb28oKSB7XG5cdFx0XHQvLyBjKSBmdW5jdGlvbiBmb28oKSB7XG5cdFx0XHQvLyBidXQgbm90IFx1MjAxQ2ZvbyB7XHUyMDFEXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGEpIGFuZCBjKVxuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcYmZ1bmN0aW9uXFxzKylbXFx3LV0rKD89KD86XFxzKlxcKD86XFxzKlxcKSk/XFxzKlxceykvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gYilcblx0XHRcdFx0cGF0dGVybjogL1xcYltcXHctXSsoPz1cXHMqXFwoXFxzKlxcKVxccypcXHspLyxcblx0XHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHRcdH1cblx0XHRdLFxuXHRcdC8vIEhpZ2hsaWdodCB2YXJpYWJsZSBuYW1lcyBhcyB2YXJpYWJsZXMgaW4gZm9yIGFuZCBzZWxlY3QgYmVnaW5uaW5ncy5cblx0XHQnZm9yLW9yLXNlbGVjdCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxiKD86Zm9yfHNlbGVjdClcXHMrKVxcdysoPz1cXHMraW5cXHMpLyxcblx0XHRcdGFsaWFzOiAndmFyaWFibGUnLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0Ly8gSGlnaGxpZ2h0IHZhcmlhYmxlIG5hbWVzIGFzIHZhcmlhYmxlcyBpbiB0aGUgbGVmdC1oYW5kIHBhcnRcblx0XHQvLyBvZiBhc3NpZ25tZW50cyAoXHUyMDFDPVx1MjAxRCBhbmQgXHUyMDFDKz1cdTIwMUQpLlxuXHRcdCdhc3NpZ24tbGVmdCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXFxzO3wmXXxbPD5dXFwoKVxcdysoPz1cXCs/PSkvLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdlbnZpcm9ubWVudCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJyhefFtcXFxcczt8Jl18Wzw+XVxcXFwoKScgKyBlbnZWYXJzKSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAnY29uc3RhbnQnXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRhbGlhczogJ3ZhcmlhYmxlJyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdzdHJpbmcnOiBbXG5cdFx0XHQvLyBTdXBwb3J0IGZvciBIZXJlLWRvY3VtZW50cyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IZXJlX2RvY3VtZW50XG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbXjxdKTw8LT9cXHMqKShcXHcrKVxcc1tcXHNcXFNdKj8oPzpcXHI/XFxufFxccilcXDIvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogaW5zaWRlU3RyaW5nXG5cdFx0XHR9LFxuXHRcdFx0Ly8gSGVyZS1kb2N1bWVudCB3aXRoIHF1b3RlcyBhcm91bmQgdGhlIHRhZ1xuXHRcdFx0Ly8gXHUyMTkyIE5vIGV4cGFuc2lvbiAoc28gbm8gXHUyMDFDaW5zaWRlXHUyMDFEKS5cblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFtePF0pPDwtP1xccyopKFtcIiddKShcXHcrKVxcMlxcc1tcXHNcXFNdKj8oPzpcXHI/XFxufFxccilcXDMvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdiYXNoJzogY29tbWFuZEFmdGVySGVyZWRvY1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0Ly8gXHUyMDFDTm9ybWFsXHUyMDFEIHN0cmluZ1xuXHRcdFx0e1xuXHRcdFx0XHQvLyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2Jhc2gvbWFudWFsL2h0bWxfbm9kZS9Eb3VibGUtUXVvdGVzLmh0bWxcblx0XHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0oPzpcXFxcXFxcXCkqKVwiKD86XFxcXFtcXHNcXFNdfFxcJFxcKFteKV0rXFwpfFxcJCg/IVxcKCl8YFteYF0rYHxbXlwiXFxcXGAkXSkqXCIvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogaW5zaWRlU3RyaW5nXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2Jhc2gvbWFudWFsL2h0bWxfbm9kZS9TaW5nbGUtUXVvdGVzLmh0bWxcblx0XHRcdFx0cGF0dGVybjogLyhefFteJFxcXFxdKSdbXiddKicvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYmFzaC9tYW51YWwvaHRtbF9ub2RlL0FOU0lfMDAyZEMtUXVvdGluZy5odG1sXG5cdFx0XHRcdHBhdHRlcm46IC9cXCQnKD86W14nXFxcXF18XFxcXFtcXHNcXFNdKSonLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnZW50aXR5JzogaW5zaWRlU3RyaW5nLmVudGl0eVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnZW52aXJvbm1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJ1xcXFwkPycgKyBlbnZWYXJzKSxcblx0XHRcdGFsaWFzOiAnY29uc3RhbnQnXG5cdFx0fSxcblx0XHQndmFyaWFibGUnOiBpbnNpZGVTdHJpbmcudmFyaWFibGUsXG5cdFx0J2Z1bmN0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFtcXHM7fCZdfFs8Pl1cXCgpKD86YWRkfGFwcm9wb3N8YXB0fGFwdC1jYWNoZXxhcHQtZ2V0fGFwdGl0dWRlfGFzcGVsbHxhdXRvbXlzcWxiYWNrdXB8YXdrfGJhc2VuYW1lfGJhc2h8YmN8YmNvbnNvbGV8Ymd8YnppcDJ8Y2FsfGNhdHxjZmRpc2t8Y2hncnB8Y2hrY29uZmlnfGNobW9kfGNob3dufGNocm9vdHxja3N1bXxjbGVhcnxjbXB8Y29sdW1ufGNvbW18Y29tcG9zZXJ8Y3B8Y3Jvbnxjcm9udGFifGNzcGxpdHxjdXJsfGN1dHxkYXRlfGRjfGRkfGRkcmVzY3VlfGRlYm9vdHN0cmFwfGRmfGRpZmZ8ZGlmZjN8ZGlnfGRpcnxkaXJjb2xvcnN8ZGlybmFtZXxkaXJzfGRtZXNnfGRvY2tlcnxkb2NrZXItY29tcG9zZXxkdXxlZ3JlcHxlamVjdHxlbnZ8ZXRodG9vbHxleHBhbmR8ZXhwZWN0fGV4cHJ8ZmRmb3JtYXR8ZmRpc2t8Zmd8ZmdyZXB8ZmlsZXxmaW5kfGZtdHxmb2xkfGZvcm1hdHxmcmVlfGZzY2t8ZnRwfGZ1c2VyfGdhd2t8Z2l0fGdwYXJ0ZWR8Z3JlcHxncm91cGFkZHxncm91cGRlbHxncm91cG1vZHxncm91cHN8Z3J1Yi1ta2NvbmZpZ3xnemlwfGhhbHR8aGVhZHxoZ3xoaXN0b3J5fGhvc3R8aG9zdG5hbWV8aHRvcHxpY29udnxpZHxpZmNvbmZpZ3xpZmRvd258aWZ1cHxpbXBvcnR8aW5zdGFsbHxpcHxqb2JzfGpvaW58a2lsbHxraWxsYWxsfGxlc3N8bGlua3xsbnxsb2NhdGV8bG9nbmFtZXxsb2dyb3RhdGV8bG9va3xscGN8bHByfGxwcmludHxscHJpbnRkfGxwcmludHF8bHBybXxsc3xsc29mfGx5bnh8bWFrZXxtYW58bWN8bWRhZG18bWtjb25maWd8bWtkaXJ8bWtlMmZzfG1rZmlmb3xta2ZzfG1raXNvZnN8bWtub2R8bWtzd2FwfG1tdnxtb3JlfG1vc3R8bW91bnR8bXRvb2xzfG10cnxtdXR0fG12fG5hbm98bmN8bmV0c3RhdHxuaWNlfG5sfG5vZGV8bm9odXB8bm90aWZ5LXNlbmR8bnBtfG5zbG9va3VwfG9wfG9wZW58cGFydGVkfHBhc3N3ZHxwYXN0ZXxwYXRoY2hrfHBpbmd8cGtpbGx8cG5wbXxwb2RtYW58cG9kbWFuLWNvbXBvc2V8cG9wZHxwcnxwcmludGNhcHxwcmludGVudnxwc3xwdXNoZHxwdnxxdW90YXxxdW90YWNoZWNrfHF1b3RhY3RsfHJhbXxyYXJ8cmNwfHJlYm9vdHxyZW1zeW5jfHJlbmFtZXxyZW5pY2V8cmV2fHJtfHJtZGlyfHJwbXxyc3luY3xzY3B8c2NyZWVufHNkaWZmfHNlZHxzZW5kbWFpbHxzZXF8c2VydmljZXxzZnRwfHNofHNoZWxsY2hlY2t8c2h1ZnxzaHV0ZG93bnxzbGVlcHxzbG9jYXRlfHNvcnR8c3BsaXR8c3NofHN0YXR8c3RyYWNlfHN1fHN1ZG98c3VtfHN1c3BlbmR8c3dhcG9ufHN5bmN8dGFjfHRhaWx8dGFyfHRlZXx0aW1lfHRpbWVvdXR8dG9wfHRvdWNofHRyfHRyYWNlcm91dGV8dHNvcnR8dHR5fHVtb3VudHx1bmFtZXx1bmV4cGFuZHx1bmlxfHVuaXRzfHVucmFyfHVuc2hhcnx1bnppcHx1cGRhdGUtZ3J1Ynx1cHRpbWV8dXNlcmFkZHx1c2VyZGVsfHVzZXJtb2R8dXNlcnN8dXVkZWNvZGV8dXVlbmNvZGV8dnx2Y3BrZ3x2ZGlyfHZpfHZpbXx2aXJzaHx2bXN0YXR8d2FpdHx3YXRjaHx3Y3x3Z2V0fHdoZXJlaXN8d2hpY2h8d2hvfHdob2FtaXx3cml0ZXx4YXJnc3x4ZGctb3Blbnx5YXJufHllc3x6ZW5pdHl8emlwfHpzaHx6eXBwZXIpKD89JHxbKVxcczt8Jl0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdrZXl3b3JkJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFtcXHM7fCZdfFs8Pl1cXCgpKD86Y2FzZXxkb3xkb25lfGVsaWZ8ZWxzZXxlc2FjfGZpfGZvcnxmdW5jdGlvbnxpZnxpbnxzZWxlY3R8dGhlbnx1bnRpbHx3aGlsZSkoPz0kfFspXFxzO3wmXSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0Ly8gaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9iYXNoL21hbnVhbC9odG1sX25vZGUvU2hlbGwtQnVpbHRpbi1Db21tYW5kcy5odG1sXG5cdFx0J2J1aWx0aW4nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W1xcczt8Jl18Wzw+XVxcKCkoPzpcXC58OnxhbGlhc3xiaW5kfGJyZWFrfGJ1aWx0aW58Y2FsbGVyfGNkfGNvbW1hbmR8Y29udGludWV8ZGVjbGFyZXxlY2hvfGVuYWJsZXxldmFsfGV4ZWN8ZXhpdHxleHBvcnR8Z2V0b3B0c3xoYXNofGhlbHB8bGV0fGxvY2FsfGxvZ291dHxtYXBmaWxlfHByaW50Znxwd2R8cmVhZHxyZWFkYXJyYXl8cmVhZG9ubHl8cmV0dXJufHNldHxzaGlmdHxzaG9wdHxzb3VyY2V8dGVzdHx0aW1lc3x0cmFwfHR5cGV8dHlwZXNldHx1bGltaXR8dW1hc2t8dW5hbGlhc3x1bnNldCkoPz0kfFspXFxzO3wmXSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdC8vIEFsaWFzIGFkZGVkIHRvIG1ha2UgdGhvc2UgZWFzaWVyIHRvIGRpc3Rpbmd1aXNoIGZyb20gc3RyaW5ncy5cblx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0XHR9LFxuXHRcdCdib29sZWFuJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFtcXHM7fCZdfFs8Pl1cXCgpKD86ZmFsc2V8dHJ1ZSkoPz0kfFspXFxzO3wmXSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2ZpbGUtZGVzY3JpcHRvcic6IHtcblx0XHRcdHBhdHRlcm46IC9cXEImXFxkXFxiLyxcblx0XHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHRcdH0sXG5cdFx0J29wZXJhdG9yJzoge1xuXHRcdFx0Ly8gTG90cyBvZiByZWRpcmVjdGlvbnMgaGVyZSwgYnV0IG5vdCBqdXN0IHRoYXQuXG5cdFx0XHRwYXR0ZXJuOiAvXFxkPzw+fD5cXHx8XFwrPXw9Wz1+XT98IT0/fDw8WzwtXT98WyZcXGRdPz4+fFxcZFs8Pl0mP3xbPD5dWyY9XT98Jls+Jl0/fFxcfFsmfF0/Lyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZmlsZS1kZXNjcmlwdG9yJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eXFxkLyxcblx0XHRcdFx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1xcJD9cXChcXCg/fFxcKVxcKT98XFwuXFwufFt7fVtcXF07XFxcXF0vLFxuXHRcdCdudW1iZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58XFxzKSg/OlsxLTldXFxkKnwwKSg/OlsuLF1cXGQrKT9cXGIvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0fTtcblxuXHRjb21tYW5kQWZ0ZXJIZXJlZG9jLmluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy5iYXNoO1xuXG5cdC8qIFBhdHRlcm5zIGluIGNvbW1hbmQgc3Vic3RpdHV0aW9uLiAqL1xuXHR2YXIgdG9CZUNvcGllZCA9IFtcblx0XHQnY29tbWVudCcsXG5cdFx0J2Z1bmN0aW9uLW5hbWUnLFxuXHRcdCdmb3Itb3Itc2VsZWN0Jyxcblx0XHQnYXNzaWduLWxlZnQnLFxuXHRcdCdzdHJpbmcnLFxuXHRcdCdlbnZpcm9ubWVudCcsXG5cdFx0J2Z1bmN0aW9uJyxcblx0XHQna2V5d29yZCcsXG5cdFx0J2J1aWx0aW4nLFxuXHRcdCdib29sZWFuJyxcblx0XHQnZmlsZS1kZXNjcmlwdG9yJyxcblx0XHQnb3BlcmF0b3InLFxuXHRcdCdwdW5jdHVhdGlvbicsXG5cdFx0J251bWJlcidcblx0XTtcblx0dmFyIGluc2lkZSA9IGluc2lkZVN0cmluZy52YXJpYWJsZVsxXS5pbnNpZGU7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgdG9CZUNvcGllZC5sZW5ndGg7IGkrKykge1xuXHRcdGluc2lkZVt0b0JlQ29waWVkW2ldXSA9IFByaXNtLmxhbmd1YWdlcy5iYXNoW3RvQmVDb3BpZWRbaV1dO1xuXHR9XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnNoZWxsID0gUHJpc20ubGFuZ3VhZ2VzLmJhc2g7XG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5iYXNpYyA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyg/OiF8UkVNXFxiKS4rL2ksXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQna2V5d29yZCc6IC9eUkVNL2lcblx0XHR9XG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86XCJcInxbISMkJSYnKCkqLFxcLzo7PD0+P15cXHcgK1xcLS5dKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdudW1iZXInOiAvKD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OkVbKy1dP1xcZCspPy9pLFxuXHQna2V5d29yZCc6IC9cXGIoPzpBU3xCRUVQfEJMT0FEfEJTQVZFfENBTEwoPzogQUJTT0xVVEUpP3xDQVNFfENIQUlOfENIRElSfENMRUFSfENMT1NFfENMU3xDT018Q09NTU9OfENPTlNUfERBVEF8REVDTEFSRXxERUYoPzogRk58IFNFR3xEQkx8SU5UfExOR3xTTkd8U1RSKXxESU18RE98RE9VQkxFfEVMU0V8RUxTRUlGfEVORHxFTlZJUk9OfEVSQVNFfEVSUk9SfEVYSVR8RklFTER8RklMRVN8Rk9SfEZVTkNUSU9OfEdFVHxHT1NVQnxHT1RPfElGfElOUFVUfElOVEVHRVJ8SU9DVEx8S0VZfEtJTEx8TElORSBJTlBVVHxMT0NBVEV8TE9DS3xMT05HfExPT1B8TFNFVHxNS0RJUnxOQU1FfE5FWFR8T0ZGfE9OKD86IENPTXwgRVJST1J8IEtFWXwgVElNRVIpP3xPUEVOfE9QVElPTiBCQVNFfE9VVHxQT0tFfFBVVHxSRUFEfFJFRElNfFJFTXxSRVNUT1JFfFJFU1VNRXxSRVRVUk58Uk1ESVJ8UlNFVHxSVU58U0VMRUNUIENBU0V8U0hBUkVEfFNIRUxMfFNJTkdMRXxTTEVFUHxTVEFUSUN8U1RFUHxTVE9QfFNUUklOR3xTVUJ8U1dBUHxTWVNURU18VEhFTnxUSU1FUnxUT3xUUk9GRnxUUk9OfFRZUEV8VU5MT0NLfFVOVElMfFVTSU5HfFZJRVcgUFJJTlR8V0FJVHxXRU5EfFdISUxFfFdSSVRFKSg/OlxcJHxcXGIpL2ksXG5cdCdmdW5jdGlvbic6IC9cXGIoPzpBQlN8QUNDRVNTfEFDT1N8QU5HTEV8QVJFQXxBUklUSE1FVElDfEFSUkFZfEFTSU58QVNLfEFUfEFUTnxCQVNFfEJFR0lOfEJSRUFLfENBVVNFfENFSUx8Q0hSfENMSVB8Q09MTEFURXxDT0xPUnxDT058Q09TfENPU0h8Q09UfENTQ3xEQVRFfERBVFVNfERFQlVHfERFQ0lNQUx8REVGfERFR3xERUdSRUVTfERFTEVURXxERVR8REVWSUNFfERJU1BMQVl8RE9UfEVMQVBTRUR8RVBTfEVSQVNBQkxFfEVYTElORXxFWFB8RVhURVJOQUx8RVhUWVBFfEZJTEVUWVBFfEZJWEVEfEZQfEdPfEdSQVBIfEhBTkRMRVJ8SUROfElNQUdFfElOfElOVHxJTlRFUk5BTHxJUHxJU3xLRVlFRHxMQk9VTkR8TENBU0V8TEVGVHxMRU58TEVOR1RIfExFVHxMSU5FfExJTkVTfExPR3xMT0cxMHxMT0cyfExUUklNfE1BUkdJTnxNQVR8TUFYfE1BWE5VTXxNSUR8TUlOfE1JU1NJTkd8TU9EfE5BVElWRXxOVUx8TlVNRVJJQ3xPRnxPUFRJT058T1JEfE9SR0FOSVpBVElPTnxPVVRJTnxPVVRQVVR8UEl8UE9JTlR8UE9JTlRFUnxQT0lOVFN8UE9TfFBSSU5UfFBST0dSQU18UFJPTVBUfFJBRHxSQURJQU5TfFJBTkRPTUlaRXxSRUNPUkR8UkVDU0laRXxSRUNUWVBFfFJFTEFUSVZFfFJFTUFJTkRFUnxSRVBFQVR8UkVTVHxSRVRSWXxSRVdSSVRFfFJJR0hUfFJORHxST1VORHxSVFJJTXxTQU1FfFNFQ3xTRUxFQ1R8U0VRVUVOVElBTHxTRVR8U0VUVEVSfFNHTnxTSU58U0lOSHxTSVpFfFNLSVB8U1FSfFNUQU5EQVJEfFNUQVRVU3xTVFJ8U1RSRUFNfFNUWUxFfFRBQnxUQU58VEFOSHxURU1QTEFURXxURVhUfFRIRVJFfFRJTUV8VElNRU9VVHxUUkFDRXxUUkFOU0ZPUk18VFJVTkNBVEV8VUJPVU5EfFVDQVNFfFVTRXxWQUx8VkFSSUFCTEV8VklFV1BPUlR8V0hFTnxXSU5ET1d8V0lUSHxaRVJ8Wk9ORVdJRFRIKSg/OlxcJHxcXGIpL2ksXG5cdCdvcGVyYXRvcic6IC88Wz0+XT98Pj0/fFsrXFwtKlxcL149Jl18XFxiKD86QU5EfEVRVnxJTVB8Tk9UfE9SfFhPUilcXGIvaSxcblx0J3B1bmN0dWF0aW9uJzogL1ssOzooKV0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdHZhciB2YXJpYWJsZSA9IC8lJT9bfjpcXHddKyU/fCFcXFMrIS87XG5cdHZhciBwYXJhbWV0ZXIgPSB7XG5cdFx0cGF0dGVybjogL1xcL1thLXo/XSsoPz1bIDpdfCQpOj98LVthLXpdXFxifC0tW2Etei1dK1xcYi9pbSxcblx0XHRhbGlhczogJ2F0dHItbmFtZScsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvOi9cblx0XHR9XG5cdH07XG5cdHZhciBzdHJpbmcgPSAvXCIoPzpbXFxcXFwiXVwifFteXCJdKSpcIig/IVwiKS87XG5cdHZhciBudW1iZXIgPSAvKD86XFxifC0pXFxkK1xcYi87XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmJhdGNoID0ge1xuXHRcdCdjb21tZW50JzogW1xuXHRcdFx0L146Oi4qL20sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbJihdKVsgXFx0XSopcmVtXFxiKD86W15eJilcXHJcXG5dfFxcXig/OlxcclxcbnxbXFxzXFxTXSkpKi9pbSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2xhYmVsJzoge1xuXHRcdFx0cGF0dGVybjogL146LiovbSxcblx0XHRcdGFsaWFzOiAncHJvcGVydHknXG5cdFx0fSxcblx0XHQnY29tbWFuZCc6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gRk9SIGNvbW1hbmRcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFsmKF0pWyBcXHRdKilmb3IoPzogXFwvW2Etej9dKD86WyA6XSg/OlwiW15cIl0qXCJ8W15cXHNcIi9dXFxTKikpPykqIFxcUysgaW4gXFwoW14pXStcXCkgZG8vaW0sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdrZXl3b3JkJzogL1xcYig/OmRvfGluKVxcYnxeZm9yXFxiL2ksXG5cdFx0XHRcdFx0J3N0cmluZyc6IHN0cmluZyxcblx0XHRcdFx0XHQncGFyYW1ldGVyJzogcGFyYW1ldGVyLFxuXHRcdFx0XHRcdCd2YXJpYWJsZSc6IHZhcmlhYmxlLFxuXHRcdFx0XHRcdCdudW1iZXInOiBudW1iZXIsXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1soKScsXS9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gSUYgY29tbWFuZFxuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58WyYoXSlbIFxcdF0qKWlmKD86IFxcL1thLXo/XSg/OlsgOl0oPzpcIlteXCJdKlwifFteXFxzXCIvXVxcUyopKT8pKiAoPzpub3QgKT8oPzpjbWRleHR2ZXJzaW9uIFxcZCt8ZGVmaW5lZCBcXHcrfGVycm9ybGV2ZWwgXFxkK3xleGlzdCBcXFMrfCg/OlwiW15cIl0qXCJ8KD8hXCIpKD86KD8hPT0pXFxTKSspPyg/Oj09fCAoPzplcXV8Z2VxfGd0cnxsZXF8bHNzfG5lcSkgKSg/OlwiW15cIl0qXCJ8W15cXHNcIl1cXFMqKSkvaW0sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdrZXl3b3JkJzogL1xcYig/OmNtZGV4dHZlcnNpb258ZGVmaW5lZHxlcnJvcmxldmVsfGV4aXN0fG5vdClcXGJ8XmlmXFxiL2ksXG5cdFx0XHRcdFx0J3N0cmluZyc6IHN0cmluZyxcblx0XHRcdFx0XHQncGFyYW1ldGVyJzogcGFyYW1ldGVyLFxuXHRcdFx0XHRcdCd2YXJpYWJsZSc6IHZhcmlhYmxlLFxuXHRcdFx0XHRcdCdudW1iZXInOiBudW1iZXIsXG5cdFx0XHRcdFx0J29wZXJhdG9yJzogL1xcXnw9PXxcXGIoPzplcXV8Z2VxfGd0cnxsZXF8bHNzfG5lcSlcXGIvaVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBFTFNFIGNvbW1hbmRcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFsmKCldKVsgXFx0XSopZWxzZVxcYi9pbSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2tleXdvcmQnOiAvXmVsc2VcXGIvaVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBTRVQgY29tbWFuZFxuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58WyYoXSlbIFxcdF0qKXNldCg/OiBcXC9bYS16XSg/OlsgOl0oPzpcIlteXCJdKlwifFteXFxzXCIvXVxcUyopKT8pKiAoPzpbXl4mKVxcclxcbl18XFxeKD86XFxyXFxufFtcXHNcXFNdKSkqL2ltLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQna2V5d29yZCc6IC9ec2V0XFxiL2ksXG5cdFx0XHRcdFx0J3N0cmluZyc6IHN0cmluZyxcblx0XHRcdFx0XHQncGFyYW1ldGVyJzogcGFyYW1ldGVyLFxuXHRcdFx0XHRcdCd2YXJpYWJsZSc6IFtcblx0XHRcdFx0XHRcdHZhcmlhYmxlLFxuXHRcdFx0XHRcdFx0L1xcdysoPz0oPzpbKlxcLyUrXFwtJl58XXw8PHw+Pik/PSkvXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHQnbnVtYmVyJzogbnVtYmVyLFxuXHRcdFx0XHRcdCdvcGVyYXRvcic6IC9bKlxcLyUrXFwtJl58XT0/fDw8PT98Pj49P3xbIX5fPV0vLFxuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bKCknLF0vXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIE90aGVyIGNvbW1hbmRzXG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbJihdKVsgXFx0XSpAPylcXHcrXFxiKD86XCIoPzpbXFxcXFwiXVwifFteXCJdKSpcIig/IVwiKXxbXlwiXiYpXFxyXFxuXXxcXF4oPzpcXHJcXG58W1xcc1xcU10pKSovbSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2tleXdvcmQnOiAvXlxcdytcXGIvLFxuXHRcdFx0XHRcdCdzdHJpbmcnOiBzdHJpbmcsXG5cdFx0XHRcdFx0J3BhcmFtZXRlcic6IHBhcmFtZXRlcixcblx0XHRcdFx0XHQnbGFiZWwnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5cXHMqKTpcXFMrL20sXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCd2YXJpYWJsZSc6IHZhcmlhYmxlLFxuXHRcdFx0XHRcdCdudW1iZXInOiBudW1iZXIsXG5cdFx0XHRcdFx0J29wZXJhdG9yJzogL1xcXi9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J29wZXJhdG9yJzogL1smQF0vLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bKCknXS9cblx0fTtcbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmJiY29kZSA9IHtcblx0J3RhZyc6IHtcblx0XHRwYXR0ZXJuOiAvXFxbXFwvP1teXFxzPVxcXV0rKD86XFxzKj1cXHMqKD86XCJbXlwiXSpcInwnW14nXSonfFteXFxzJ1wiXFxdPV0rKSk/KD86XFxzK1teXFxzPVxcXV0rXFxzKj1cXHMqKD86XCJbXlwiXSpcInwnW14nXSonfFteXFxzJ1wiXFxdPV0rKSkqXFxzKlxcXS8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQndGFnJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXlxcW1xcLz9bXlxccz1cXF1dKy8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFxbXFwvPy9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdhdHRyLXZhbHVlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvPVxccyooPzpcIlteXCJdKlwifCdbXiddKid8W15cXHMnXCJcXF09XSspLyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogW1xuXHRcdFx0XHRcdFx0L149Lyxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogL14oXFxzKilbXCInXXxbXCInXSQvLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcXS8sXG5cdFx0XHQnYXR0ci1uYW1lJzogL1teXFxzPVxcXV0rL1xuXHRcdH1cblx0fVxufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnNob3J0Y29kZSA9IFByaXNtLmxhbmd1YWdlcy5iYmNvZGU7XG5cbi8vIGJhc2VkIGxvb3NlbHkgdXBvbjogaHR0cHM6Ly9naXRodWIuY29tL0F6dXJlL2JpY2VwL2Jsb2IvbWFpbi9zcmMvdGV4dG1hdGUvYmljZXAudG1sYW5ndWFnZVxuUHJpc20ubGFuZ3VhZ2VzLmJpY2VwID0ge1xuXHQnY29tbWVudCc6IFtcblx0XHR7XG5cdFx0XHQvLyBtdWx0aWxpbmUgY29tbWVudHMgZWcgLyogQVNERiAqL1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pXFwvXFwqW1xcc1xcU10qPyg/OlxcKlxcL3wkKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHQvLyBzaW5nbGVsaW5lIGNvbW1lbnRzIGVnIC8vIEFTREZcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFw6XSlcXC9cXC8uKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHRdLFxuXG5cdCdwcm9wZXJ0eSc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKFtcXHJcXG5dWyBcXHRdKilbYS16X11cXHcqKD89WyBcXHRdKjopL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKFtcXHJcXG5dWyBcXHRdKiknKD86XFxcXC58XFwkKD8hXFx7KXxbXidcXFxcXFxyXFxuJF0pKicoPz1bIFxcdF0qOikvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J3N0cmluZyc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvJycnW14nXVtcXHNcXFNdKj8nJycvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcJ10pJyg/OlxcXFwufFxcJCg/IVxceyl8W14nXFxcXFxcclxcbiRdKSonLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0fVxuXHRdLFxuXHQnaW50ZXJwb2xhdGVkLXN0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcJ10pJyg/OlxcXFwufFxcJCg/Oig/IVxceyl8XFx7W157fVxcclxcbl0qXFx9KXxbXidcXFxcXFxyXFxuJF0pKicvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9cXCRcXHtbXnt9XFxyXFxuXSpcXH0vLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC8oXlxcJFxceylbXFxzXFxTXSsoPz1cXH0kKS8sXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlxcJFxce3xcXH0kLyxcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdH1cblx0fSxcblxuXHQnZGF0YXR5cGUnOiB7XG5cdFx0cGF0dGVybjogLyhcXGIoPzpvdXRwdXR8cGFyYW0pXFxiWyBcXHRdK1xcdytbIFxcdF0rKVxcdytcXGIvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHR9LFxuXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL0F6dXJlL2JpY2VwL2Jsb2IvMTE0YTMyNTFiNGU2ZTMwMDgyYTU4NzI5ZjE5YThjYzRlMzc0ZmZhNi9zcmMvdGV4dG1hdGUvYmljZXAudG1sYW5ndWFnZSNMMTg0XG5cdCdrZXl3b3JkJzogL1xcYig/OmV4aXN0aW5nfGZvcnxpZnxpbnxtb2R1bGV8bnVsbHxvdXRwdXR8cGFyYW18cmVzb3VyY2V8dGFyZ2V0U2NvcGV8dmFyKVxcYi8sXG5cblx0J2RlY29yYXRvcic6IC9AXFx3K1xcYi8sXG5cdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89WyBcXHRdKlxcKCkvaSxcblxuXHQnbnVtYmVyJzogLyg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzpFWystXT9cXGQrKT8vaSxcblx0J29wZXJhdG9yJzogLy0tfFxcK1xcK3xcXCpcXCo9P3w9PnwmJj0/fFxcfFxcfD0/fFshPV09PXw8PD0/fD4+Pj89P3xbLSsqLyUmfF4hPTw+XT0/fFxcLnszfXxcXD9cXD89P3xcXD9cXC4/fFt+Ol0vLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXTsoKSwuOl0vLFxufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmJpY2VwWydpbnRlcnBvbGF0ZWQtc3RyaW5nJ10uaW5zaWRlWydpbnRlcnBvbGF0aW9uJ10uaW5zaWRlWydleHByZXNzaW9uJ10uaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLmJpY2VwO1xuXG5QcmlzbS5sYW5ndWFnZXMuYmlyYiA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9yPyhcInwnKSg/OlxcXFwufCg/IVxcMSlbXlxcXFxdKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY2xhc3MtbmFtZSc6IFtcblx0XHQvXFxiW0EtWl0oPzpbXFxkX10qW2EtekEtWl1cXHcqKT9cXGIvLFxuXG5cdFx0Ly8gbWF0Y2hlcyB2YXJpYWJsZSBhbmQgZnVuY3Rpb24gcmV0dXJuIHR5cGVzIChwYXJhbWV0ZXJzIGFzIHdlbGwpLlxuXHRcdC9cXGIoPzpbQS1aXVxcdyp8KD8hKD86dmFyfHZvaWQpXFxiKVthLXpdXFx3KikoPz1cXHMrXFx3K1xccypbOyw9KCldKS9cblx0XSxcblx0J2tleXdvcmQnOiAvXFxiKD86YXNzZXJ0fGJyZWFrfGNhc2V8Y2xhc3N8Y29uc3R8ZGVmYXVsdHxlbHNlfGVudW18ZmluYWx8Zm9sbG93c3xmb3J8Z3JhYnxpZnxuZXN0fG5ld3xuZXh0fG5vU2VlYnxyZXR1cm58c3RhdGljfHN3aXRjaHx0aHJvd3x2YXJ8dm9pZHx3aGlsZSlcXGIvLFxuXHQnb3BlcmF0b3InOiAvXFwrXFwrfC0tfCYmfFxcfFxcfHw8PD0/fD4+PT98fig/OlxcLz0/KT98WytcXC0qXFwvJSZefD0hPD5dPT98XFw/fDovLFxuXHQndmFyaWFibGUnOiAvXFxiW2Etel9dXFx3KlxcYi8sXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnYmlyYicsICdmdW5jdGlvbicsIHtcblx0J21ldGFkYXRhJzoge1xuXHRcdHBhdHRlcm46IC88XFx3Kz4vLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ3N5bWJvbCdcblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5iaXNvbiA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2MnLCB7fSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2Jpc29uJywgJ2NvbW1lbnQnLCB7XG5cdCdiaXNvbic6IHtcblx0XHQvLyBUaGlzIHNob3VsZCBtYXRjaCBhbGwgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZVxuXHRcdC8vIGluY2x1ZGluZyB0aGUgcHJvbG9ndWUocyksIHRoZSBiaXNvbiBkZWNsYXJhdGlvbnMgYW5kXG5cdFx0Ly8gdGhlIGdyYW1tYXIgcnVsZXMuXG5cdFx0cGF0dGVybjogL14oPzpbXiVdfCUoPyElKSkqJSVbXFxzXFxTXSo/JSUvLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2MnOiB7XG5cdFx0XHRcdC8vIEFsbG93IGZvciBvbmUgbGV2ZWwgb2YgbmVzdGVkIGJyYWNlc1xuXHRcdFx0XHRwYXR0ZXJuOiAvJVxce1tcXHNcXFNdKj8lXFx9fFxceyg/Olxce1tefV0qXFx9fFtee31dKSpcXH0vLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL14lP1xce3wlP1xcfSQvLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdiaXNvbi12YXJpYWJsZSc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9bJEBdKD86PFteXFxzPl0rPik/W1xcdyRdKy8sXG5cdFx0XHRcdFx0XHRhbGlhczogJ3ZhcmlhYmxlJyxcblx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvPHw+L1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0cmVzdDogUHJpc20ubGFuZ3VhZ2VzLmNcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdjb21tZW50JzogUHJpc20ubGFuZ3VhZ2VzLmMuY29tbWVudCxcblx0XHRcdCdzdHJpbmcnOiBQcmlzbS5sYW5ndWFnZXMuYy5zdHJpbmcsXG5cdFx0XHQncHJvcGVydHknOiAvXFxTKyg/PTopLyxcblx0XHRcdCdrZXl3b3JkJzogLyVcXHcrLyxcblx0XHRcdCdudW1iZXInOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXkBdKVxcYig/OjB4W1xcZGEtZl0rfFxcZCspL2ksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvJVslP118W3w6O1xcW1xcXTw+XS9cblx0XHR9XG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuYm5mID0ge1xuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIlteXFxyXFxuXCJdKlwifCdbXlxcclxcbiddKicvXG5cdH0sXG5cdCdkZWZpbml0aW9uJzoge1xuXHRcdHBhdHRlcm46IC88W148PlxcclxcblxcdF0rPig/PVxccyo6Oj0pLyxcblx0XHRhbGlhczogWydydWxlJywgJ2tleXdvcmQnXSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9ePHw+JC9cblx0XHR9XG5cdH0sXG5cdCdydWxlJzoge1xuXHRcdHBhdHRlcm46IC88W148PlxcclxcblxcdF0rPi8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXjx8PiQvXG5cdFx0fVxuXHR9LFxuXHQnb3BlcmF0b3InOiAvOjo9fFt8KClbXFxde30qKz9dfFxcLnszfS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5yYm5mID0gUHJpc20ubGFuZ3VhZ2VzLmJuZjtcblxuUHJpc20ubGFuZ3VhZ2VzLmJyYWluZnVjayA9IHtcblx0J3BvaW50ZXInOiB7XG5cdFx0cGF0dGVybjogLzx8Pi8sXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQnaW5jcmVtZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXCsvLFxuXHRcdGFsaWFzOiAnaW5zZXJ0ZWQnXG5cdH0sXG5cdCdkZWNyZW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLy0vLFxuXHRcdGFsaWFzOiAnZGVsZXRlZCdcblx0fSxcblx0J2JyYW5jaGluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXFxbfFxcXS8sXG5cdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdH0sXG5cdCdvcGVyYXRvcic6IC9bLixdLyxcblx0J2NvbW1lbnQnOiAvXFxTKy9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5icmlnaHRzY3JpcHQgPSB7XG5cdCdjb21tZW50JzogLyg/OlxcYnJlbXwnKS4qL2ksXG5cdCdkaXJlY3RpdmUtc3RhdGVtZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSopIyg/OmNvbnN0fGVsc2UoPzpbXFx0IF0raWYpP3xlbmRbXFx0IF0raWZ8ZXJyb3J8aWYpLiovaW0sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3Byb3BlcnR5Jyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdlcnJvci1tZXNzYWdlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF4jZXJyb3IpLisvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0J2RpcmVjdGl2ZSc6IHtcblx0XHRcdFx0cGF0dGVybjogL14jKD86Y29uc3R8ZWxzZSg/OltcXHQgXStpZik/fGVuZFtcXHQgXStpZnxlcnJvcnxpZikvLFxuXHRcdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0XHR9LFxuXHRcdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQncHJvcGVydHknOiB7XG5cdFx0cGF0dGVybjogLyhbXFxyXFxueyxdW1xcdCBdKikoPzooPyFcXGQpXFx3K3xcIig/OlteXCJcXHJcXG5dfFwiXCIpKlwiKD8hXCIpKSg/PVsgXFx0XSo6KS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXFxyXFxuXXxcIlwiKSpcIig/IVwiKS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjbGFzcy1uYW1lJzoge1xuXHRcdHBhdHRlcm46IC8oXFxiQXNbXFx0IF0rKVxcdysvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OkFzfERpbXxFYWNofEVsc2V8RWxzZWlmfEVuZHxFeGl0fEZvcnxGdW5jdGlvbnxHb3RvfElmfElufFByaW50fFJldHVybnxTdGVwfFN0b3B8U3VifFRoZW58VG98V2hpbGUpXFxiL2ksXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiL2ksXG5cdCdmdW5jdGlvbic6IC9cXGIoPyFcXGQpXFx3Kyg/PVtcXHQgXSpcXCgpLyxcblx0J251bWJlcic6IC8oPzpcXGJcXGQrKD86XFwuXFxkKyk/KD86W2VkXVsrLV1cXGQrKT98JmhbYS1mXFxkXSspXFxiWyUmISNdPy9pLFxuXHQnb3BlcmF0b3InOiAvLS18XFwrXFwrfD4+PT98PDw9P3w8PnxbLSsqL1xcXFw8Pl09P3xbOl49P118XFxiKD86YW5kfG1vZHxub3R8b3IpXFxiL2ksXG5cdCdwdW5jdHVhdGlvbic6IC9bLiw7KClbXFxde31dLyxcblx0J2NvbnN0YW50JzogL1xcYig/OkxJTkVfTlVNKVxcYi9pXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuYnJpZ2h0c2NyaXB0WydkaXJlY3RpdmUtc3RhdGVtZW50J10uaW5zaWRlLmV4cHJlc3Npb24uaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLmJyaWdodHNjcmlwdDtcblxuUHJpc20ubGFuZ3VhZ2VzLmJybyA9IHtcblxuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcJF0pIy4qLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2l0YWxpYyc6IC9cXGIoPzpGSVhNRXxUT0RPfFhYWClcXGIvXG5cdFx0fVxuXHR9LFxuXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhbXCInXSkoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQnYm9vbGVhbic6IC9cXGJbVEZdXFxiLyxcblxuXHQnZnVuY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogLyhcXGIoPzpldmVudHxmdW5jdGlvbnxob29rKVsgXFx0XSspXFx3Kyg/Ojo6XFx3Kyk/Lyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cblx0J2J1aWx0aW4nOiAvKD86QCg/OmxvYWQoPzotKD86cGx1Z2lufHNpZ3MpKT98dW5sb2FkfHByZWZpeGVzfGlmbj9kZWZ8ZWxzZXwoPzplbmQpP2lmfERJUnxGSUxFTkFNRSkpfCg/OiY/KD86YWRkX2Z1bmN8Y3JlYXRlX2V4cGlyZXxkZWZhdWx0fGRlbGV0ZV9mdW5jfGVuY3J5cHR8ZXJyb3JfaGFuZGxlcnxleHBpcmVfZnVuY3xncm91cHxsb2d8bWVyZ2VhYmxlfG9wdGlvbmFsfHBlcnNpc3RlbnR8cHJpb3JpdHl8cmF3X291dHB1dHxyZWFkX2V4cGlyZXxyZWRlZnxyb3RhdGVfaW50ZXJ2YWx8cm90YXRlX3NpemV8c3luY2hyb25pemVkfHR5cGVfY29sdW1ufHdyaXRlX2V4cGlyZSkpLyxcblxuXHQnY29uc3RhbnQnOiB7XG5cdFx0cGF0dGVybjogLyhcXGJjb25zdFsgXFx0XSspXFx3Ky9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblxuXHQna2V5d29yZCc6IC9cXGIoPzphZGR8YWRkcnxhbGFybXxhbnl8Ym9vbHxicmVha3xjb25zdHxjb250aW51ZXxjb3VudHxkZWxldGV8ZG91YmxlfGVsc2V8ZW51bXxldmVudHxleHBvcnR8ZmlsZXxmb3J8ZnVuY3Rpb258Z2xvYmFsfGhvb2t8aWZ8aW58aW50fGludGVydmFsfGxvY2FsfG1vZHVsZXxuZXh0fG9mfG9wYXF1ZXxwYXR0ZXJufHBvcnR8cHJpbnR8cmVjb3JkfHJldHVybnxzY2hlZHVsZXxzZXR8c3RyaW5nfHN1Ym5ldHx0YWJsZXx0aW1lfHRpbWVvdXR8dXNpbmd8dmVjdG9yfHdoZW4pXFxiLyxcblxuXHQnb3BlcmF0b3InOiAvLS0/fFxcK1xcKz98IT0/PT98PD0/fD49P3w9PT89P3wmJnxcXHxcXHw/fFxcP3xcXCp8XFwvfH58XFxefCUvLFxuXG5cdCdudW1iZXInOiAvXFxiMHhbXFxkYS1mXStcXGJ8KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OmVbKy1dP1xcZCspPy9pLFxuXG5cdCdwdW5jdHVhdGlvbic6IC9be31bXFxdOygpLC46XS9cbn07XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLW1pc2xlYWRpbmctY2hhcmFjdGVyLWNsYXNzICovXG5cbi8vIDFDOkVudGVycHJpc2Vcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EaXZlcnN1czIzL1xuLy9cblByaXNtLmxhbmd1YWdlcy5ic2wgPSB7XG5cdCdjb21tZW50JzogL1xcL1xcLy4qLyxcblx0J3N0cmluZyc6IFtcblx0XHQvLyBcdTA0MjFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0M0FcdTA0Mzhcblx0XHQvLyBTdHJpbmdzXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1wiKD86W15cIl18XCJcIikqXCIoPyFcIikvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQvLyBcdTA0MTRcdTA0MzBcdTA0NDJcdTA0MzAgXHUwNDM4IFx1MDQzMlx1MDQ0MFx1MDQzNVx1MDQzQ1x1MDQ0RlxuXHRcdC8vIERhdGUgJiB0aW1lXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLycoPzpbXidcXHJcXG5cXFxcXXxcXFxcLikqJy9cblx0XHR9XG5cdF0sXG5cdCdrZXl3b3JkJzogW1xuXHRcdHtcblx0XHRcdC8vIFJVXG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXHdcXHUwNDAwLVxcdTA0ODRcXHUwNDg3LVxcdTA1MmZcXHUxZDJiXFx1MWQ3OFxcdTJkZTAtXFx1MmRmZlxcdWE2NDAtXFx1YTY5ZlxcdWZlMmVcXHVmZTJmXSkoPzpcdTA0M0ZcdTA0M0VcdTA0M0FcdTA0MzB8XHUwNDM0XHUwNDNCXHUwNDRGfFx1MDQzRFx1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQzOXxcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0NDBcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEN8XHUwNDNGXHUwNDNFXHUwNDNGXHUwNDRCXHUwNDQyXHUwNDNBXHUwNDMwfFx1MDQzOFx1MDQ0MVx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNXxcdTA0MzJcdTA0NEJcdTA0MzdcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NENcdTA0MzhcdTA0NDFcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzV8XHUwNDM4XHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDM1fFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzNVx1MDQ0Nlx1MDQzRlx1MDQzRVx1MDQzRlx1MDQ0Qlx1MDQ0Mlx1MDQzQVx1MDQzOHxcdTA0M0RcdTA0MzVcdTA0M0VcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0V8XHUwNDQ0XHUwNDQzXHUwNDNEXHUwNDNBXHUwNDQ2XHUwNDM4XHUwNDRGfFx1MDQzRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzQ3xcdTA0MzJcdTA0M0VcdTA0MzdcdTA0MzJcdTA0NDBcdTA0MzBcdTA0NDJ8XHUwNDNBXHUwNDNFXHUwNDNEXHUwNDM1XHUwNDQ2XHUwNDQ0XHUwNDQzXHUwNDNEXHUwNDNBXHUwNDQ2XHUwNDM4XHUwNDM4fFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOHxcdTA0MzhcdTA0M0RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0MzVcdTA0NDFcdTA0M0JcdTA0Mzh8XHUwNDNGXHUwNDQwXHUwNDNFXHUwNDQ2XHUwNDM1XHUwNDM0XHUwNDQzXHUwNDQwXHUwNDMwfFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzNVx1MDQ0Nlx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQ0Nlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0MFx1MDQ0QnxcdTA0NDJcdTA0M0VcdTA0MzNcdTA0MzRcdTA0MzB8XHUwNDM3XHUwNDNEXHUwNDMwXHUwNDQ3fFx1MDQ0RFx1MDQzQVx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQ0MFx1MDQ0MnxcdTA0M0FcdTA0M0VcdTA0M0RcdTA0MzVcdTA0NDZcdTA0MzVcdTA0NDFcdTA0M0JcdTA0Mzh8XHUwNDM4XHUwNDM3fFx1MDQzQVx1MDQzMFx1MDQzNlx1MDQzNFx1MDQzRVx1MDQzM1x1MDQzRXxcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M0RcdTA0MzB8XHUwNDNCXHUwNDNFXHUwNDM2XHUwNDRDfFx1MDQzRlx1MDQzRXxcdTA0NDZcdTA0MzhcdTA0M0FcdTA0M0J8XHUwNDNBXHUwNDNFXHUwNDNEXHUwNDM1XHUwNDQ2XHUwNDQ2XHUwNDM4XHUwNDNBXHUwNDNCXHUwNDMwfFx1MDQzMlx1MDQ0Qlx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzRFx1MDQzOFx1MDQ0Mlx1MDQ0QykoPyFbXFx3XFx1MDQwMC1cXHUwNDg0XFx1MDQ4Ny1cXHUwNTJmXFx1MWQyYlxcdTFkNzhcXHUyZGUwLVxcdTJkZmZcXHVhNjQwLVxcdWE2OWZcXHVmZTJlXFx1ZmUyZl0pL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHQvLyBFTlxuXHRcdFx0cGF0dGVybjogL1xcYig/OmJyZWFrfGRvfGVhY2h8ZWxzZXxlbHNlaWZ8ZW5kZG98ZW5kZnVuY3Rpb258ZW5kaWZ8ZW5kcHJvY2VkdXJlfGVuZHRyeXxleGNlcHR8ZXhlY3V0ZXxleHBvcnR8ZmFsc2V8Zm9yfGZ1bmN0aW9ufGlmfGlufG5ld3xudWxsfHByb2NlZHVyZXxyYWlzZXxyZXR1cm58dGhlbnx0b3x0cnVlfHRyeXx1bmRlZmluZWR8dmFsfHZhcnx3aGlsZSlcXGIvaVxuXHRcdH1cblx0XSxcblx0J251bWJlcic6IHtcblx0XHRwYXR0ZXJuOiAvKF4oPz1cXGQpfFteXFx3XFx1MDQwMC1cXHUwNDg0XFx1MDQ4Ny1cXHUwNTJmXFx1MWQyYlxcdTFkNzhcXHUyZGUwLVxcdTJkZmZcXHVhNjQwLVxcdWE2OWZcXHVmZTJlXFx1ZmUyZl0pKD86XFxkKyg/OlxcLlxcZCopP3xcXC5cXGQrKSg/OkVbKy1dP1xcZCspPy9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J29wZXJhdG9yJzogW1xuXHRcdC9bPD4rXFwtKi9dPT98WyU9XS8sXG5cdFx0Ly8gUlVcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXHdcXHUwNDAwLVxcdTA0ODRcXHUwNDg3LVxcdTA1MmZcXHUxZDJiXFx1MWQ3OFxcdTJkZTAtXFx1MmRmZlxcdWE2NDAtXFx1YTY5ZlxcdWZlMmVcXHVmZTJmXSkoPzpcdTA0Mzh8XHUwNDM4XHUwNDNCXHUwNDM4fFx1MDQzRFx1MDQzNSkoPyFbXFx3XFx1MDQwMC1cXHUwNDg0XFx1MDQ4Ny1cXHUwNTJmXFx1MWQyYlxcdTFkNzhcXHUyZGUwLVxcdTJkZmZcXHVhNjQwLVxcdWE2OWZcXHVmZTJlXFx1ZmUyZl0pL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQvLyBFTlxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzphbmR8bm90fG9yKVxcYi9pXG5cdFx0fVxuXHRdLFxuXHQncHVuY3R1YXRpb24nOiAvXFwoXFwufFxcLlxcKXxbKClcXFtcXF06OywuXS8sXG5cdCdkaXJlY3RpdmUnOiBbXG5cdFx0Ly8gXHUwNDIyXHUwNDM1XHUwNDMzXHUwNDM4IFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzRVx1MDQ0MFx1MDQzMCBcdTA0MzJcdTA0MzhcdTA0MzRcdTA0MzAgJlx1MDQxQVx1MDQzQlx1MDQzOFx1MDQzNVx1MDQzRFx1MDQ0MiwgJlx1MDQyMVx1MDQzNVx1MDQ0MFx1MDQzMlx1MDQzNVx1MDQ0MCwgLi4uXG5cdFx0Ly8gUHJlcHJvY2Vzc29yIHRhZ3Mgb2YgdGhlIHR5cGUgJkNsaWVudCwgJlNlcnZlciwgLi4uXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL14oWyBcXHRdKikmLiovbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0XHR9LFxuXHRcdC8vIFx1MDQxOFx1MDQzRFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzQVx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0M0VcdTA0NDBcdTA0MzAgXHUwNDMyXHUwNDM4XHUwNDM0XHUwNDMwOlxuXHRcdC8vICNcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDIxXHUwNDM1XHUwNDQwXHUwNDMyXHUwNDM1XHUwNDQwIFx1MDQyMlx1MDQzRVx1MDQzM1x1MDQzNFx1MDQzMFxuXHRcdC8vIC4uLlxuXHRcdC8vICNcdTA0MUFcdTA0M0VcdTA0M0RcdTA0MzVcdTA0NDZcdTA0MTVcdTA0NDFcdTA0M0JcdTA0Mzhcblx0XHQvLyBQcmVwcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zIG9mIHRoZSBmb3JtOlxuXHRcdC8vICNJZiBTZXJ2ZXIgVGhlblxuXHRcdC8vIC4uLlxuXHRcdC8vICNFbmRJZlxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9eKFsgXFx0XSopIy4qL2dtLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHRcdH1cblx0XVxufTtcblxuUHJpc20ubGFuZ3VhZ2VzLm9zY3JpcHQgPSBQcmlzbS5sYW5ndWFnZXNbJ2JzbCddO1xuXG4vLyBodHRwczovL2NmZG9jcy5vcmcvc2NyaXB0XG5QcmlzbS5sYW5ndWFnZXMuY2ZzY3JpcHQgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0J2NvbW1lbnQnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pXFwvXFwqW1xcc1xcU10qPyg/OlxcKlxcL3wkKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdhbm5vdGF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oPzpefFteLl0pQFtcXHdcXC5dKy8sXG5cdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXDpdKVxcL1xcLy4qLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFic3RyYWN0fGJyZWFrfGNhdGNofGNvbXBvbmVudHxjb250aW51ZXxkZWZhdWx0fGRvfGVsc2V8ZXh0ZW5kc3xmaW5hbHxmaW5hbGx5fGZvcnxmdW5jdGlvbnxpZnxpbnxpbmNsdWRlfHBhY2thZ2V8cHJpdmF0ZXxwcm9wZXJ0eXxwdWJsaWN8cmVtb3RlfHJlcXVpcmVkfHJldGhyb3d8cmV0dXJufHN0YXRpY3xzd2l0Y2h8dGhyb3d8dHJ5fHZhcnx3aGlsZXx4bWwpXFxiKD8hXFxzKj0pLyxcblx0J29wZXJhdG9yJzogW1xuXHRcdC9cXCtcXCt8LS18JiZ8XFx8XFx8fDo6fD0+fFshPV09PXxbLSsqLyUmfF4hPTw+XT0/fFxcPyg/OlxcLnw6KT98Oi8sXG5cdFx0L1xcYig/OmFuZHxjb250YWluc3xlcXxlcXVhbHxlcXZ8Z3R8Z3RlfGltcHxpc3xsdHxsdGV8bW9kfG5vdHxvcnx4b3IpXFxiL1xuXHRdLFxuXHQnc2NvcGUnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OmFwcGxpY2F0aW9ufGFyZ3VtZW50c3xjZ2l8Y2xpZW50fGNvb2tpZXxsb2NhbHxzZXNzaW9ufHN1cGVyfHRoaXN8dmFyaWFibGVzKVxcYi8sXG5cdFx0YWxpYXM6ICdnbG9iYWwnXG5cdH0sXG5cdCd0eXBlJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzphbnl8YXJyYXl8YmluYXJ5fGJvb2xlYW58ZGF0ZXxndWlkfG51bWVyaWN8cXVlcnl8c3RyaW5nfHN0cnVjdHx1dWlkfHZvaWR8eG1sKVxcYi8sXG5cdFx0YWxpYXM6ICdidWlsdGluJ1xuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnY2ZzY3JpcHQnLCAna2V5d29yZCcsIHtcblx0Ly8gVGhpcyBtdXN0IGJlIGRlY2xhcmVkIGJlZm9yZSBrZXl3b3JkIGJlY2F1c2Ugd2UgdXNlIFwiZnVuY3Rpb25cIiBpbnNpZGUgdGhlIGxvb2thaGVhZFxuXHQnZnVuY3Rpb24tdmFyaWFibGUnOiB7XG5cdFx0cGF0dGVybjogL1tfJGEtekEtWlxceEEwLVxcdUZGRkZdKD86KD8hXFxzKVskXFx3XFx4QTAtXFx1RkZGRl0pKig/PVxccypbPTpdXFxzKig/OlxcYmZ1bmN0aW9uXFxifCg/OlxcKCg/OlteKCldfFxcKFteKCldKlxcKSkqXFwpfCg/IVxccylbXyRhLXpBLVpcXHhBMC1cXHVGRkZGXSg/Oig/IVxccylbJFxcd1xceEEwLVxcdUZGRkZdKSopXFxzKj0+KSkvLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdH1cbn0pO1xuXG5kZWxldGUgUHJpc20ubGFuZ3VhZ2VzLmNmc2NyaXB0WydjbGFzcy1uYW1lJ107XG5QcmlzbS5sYW5ndWFnZXMuY2ZjID0gUHJpc20ubGFuZ3VhZ2VzWydjZnNjcmlwdCddO1xuXG5QcmlzbS5sYW5ndWFnZXMuY2hhaXNjcmlwdCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKScoPzpbXidcXFxcXXxcXFxcW1xcc1xcU10pKicvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjbGFzcy1uYW1lJzogW1xuXHRcdHtcblx0XHRcdC8vIGUuZy4gY2xhc3MgUmVjdGFuZ2xlIHsgLi4uIH1cblx0XHRcdHBhdHRlcm46IC8oXFxiY2xhc3NcXHMrKVxcdysvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Ly8gZS5nLiBhdHRyIFJlY3RhbmdsZTo6aGVpZ2h0LCBkZWYgUmVjdGFuZ2xlOjphcmVhKCkgeyAuLi4gfVxuXHRcdFx0cGF0dGVybjogLyhcXGIoPzphdHRyfGRlZilcXHMrKVxcdysoPz1cXHMqOjopLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmF0dHJ8YXV0b3xicmVha3xjYXNlfGNhdGNofGNsYXNzfGNvbnRpbnVlfGRlZnxkZWZhdWx0fGVsc2V8ZmluYWxseXxmb3J8ZnVufGdsb2JhbHxpZnxyZXR1cm58c3dpdGNofHRoaXN8dHJ5fHZhcnx3aGlsZSlcXGIvLFxuXHQnbnVtYmVyJzogW1xuXHRcdFByaXNtLmxhbmd1YWdlcy5jcHAubnVtYmVyLFxuXHRcdC9cXGIoPzpJbmZpbml0eXxOYU4pXFxiL1xuXHRdLFxuXHQnb3BlcmF0b3InOiAvPj49P3w8PD0/fFxcfFxcfHwmJnw6Wzo9XT98LS18XFwrXFwrfFs9ITw+K1xcLSovJXwmXl09P3xbP35dfGBbXmBcXHJcXG5dezEsNH1gLyxcbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjaGFpc2NyaXB0JywgJ29wZXJhdG9yJywge1xuXHQncGFyYW1ldGVyLXR5cGUnOiB7XG5cdFx0Ly8gZS5nLiBkZWYgZm9vKGludCB4LCBWZWN0b3IgeSkgey4uLn1cblx0XHRwYXR0ZXJuOiAvKFssKF1cXHMqKVxcdysoPz1cXHMrXFx3KS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdH0sXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnY2hhaXNjcmlwdCcsICdzdHJpbmcnLCB7XG5cdCdzdHJpbmctaW50ZXJwb2xhdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcIig/OlteXCIkXFxcXF18XFxcXFtcXHNcXFNdfFxcJCg/IVxceyl8XFwkXFx7KD86W157fV18XFx7KD86W157fV18XFx7W157fV0qXFx9KSpcXH0pKlxcfSkqXCIvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbXlxcXFxdKSg/OlxcXFx7Mn0pKilcXCRcXHsoPzpbXnt9XXxcXHsoPzpbXnt9XXxcXHtbXnt9XSpcXH0pKlxcfSkqXFx9Lyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2ludGVycG9sYXRpb24tZXhwcmVzc2lvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC8oXlxcJFxceylbXFxzXFxTXSsoPz1cXH0kKS8sXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuY2hhaXNjcmlwdFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J2ludGVycG9sYXRpb24tcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcJFxce3xcXH0kLyxcblx0XHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0fVxuXHR9LFxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5jaWwgPSB7XG5cdCdjb21tZW50JzogL1xcL1xcLy4qLyxcblxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oW1wiJ10pKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J2RpcmVjdGl2ZSc6IHtcblx0XHRwYXR0ZXJuOiAvKF58XFxXKVxcLlthLXpdKyg/PVxccykvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHR9LFxuXG5cdC8vIEFjdHVhbGx5IGFuIGFzc2VtYmx5IHJlZmVyZW5jZVxuXHQndmFyaWFibGUnOiAvXFxbW1xcd1xcLl0rXFxdLyxcblxuXG5cdCdrZXl3b3JkJzogL1xcYig/OmFic3RyYWN0fGFuc2l8YXNzZW1ibHl8YXV0b3xhdXRvY2hhcnxiZWZvcmVmaWVsZGluaXR8Ym9vbHxic3RyfGJ5dmFsc3RyfGNhdGNofGNoYXJ8Y2lsfGNsYXNzfGN1cnJlbmN5fGRhdGV8ZGVjaW1hbHxkZWZhdWx0fGVudW18ZXJyb3J8ZXhwbGljaXR8ZXh0ZW5kc3xleHRlcm58ZmFtYW5kYXNzZW18ZmFtaWx5fGZhbW9yYXNzZW18ZmluYWwoPzpseSk/fGZsb2F0MzJ8ZmxvYXQ2NHxoaWRlYnlzaWd8dT9pbnQoPzo4fDE2fDMyfDY0KT98aWFudHxpZGlzcGF0Y2h8aW1wbGVtZW50c3xpbXBvcnR8aW5pdG9ubHl8aW5zdGFuY2V8aW50ZXJmYWNlfGl1bmtub3dufGxpdGVyYWx8bHBzdHJ8bHBzdHJ1Y3R8bHB0c3RyfGxwd3N0cnxtYW5hZ2VkfG1ldGhvZHxuYXRpdmUoPzpUeXBlKT98bmVzdGVkfG5ld3Nsb3R8b2JqZWN0KD86cmVmKT98cGludm9rZWltcGx8cHJpdmF0ZXxwcml2YXRlc2NvcGV8cHVibGljfHJlcXNlY29ianxydHNwZWNpYWxuYW1lfHJ1bnRpbWV8c2VhbGVkfHNlcXVlbnRpYWx8c2VyaWFsaXphYmxlfHNwZWNpYWxuYW1lfHN0YXRpY3xzdHJpbmd8c3RydWN0fHN5c2NoYXJ8dGJzdHJ8dW5pY29kZXx1bm1hbmFnZWRleHB8dW5zaWduZWR8dmFsdWUoPzp0eXBlKT98dmFyaWFudHx2aXJ0dWFsfHZvaWQpXFxiLyxcblxuXHQnZnVuY3Rpb24nOiAvXFxiKD86KD86Y29uc3RyYWluZWR8bm98cmVhZG9ubHl8dGFpbHx1bmFsaWduZWR8dm9sYXRpbGUpXFwuKT8oPzpjb252XFwuKD86W2l1XVsxMjQ4XT98b3ZmXFwuW2l1XVsxMjQ4XT8oPzpcXC51bik/fHJcXC51bnxyNHxyOCl8bGRjXFwuKD86aTQoPzpcXC5cXGQrfFxcLlttTV0xfFxcLnMpP3xpOHxyNHxyOCl8bGRlbGVtKD86XFwuW2l1XVsxMjQ4XT98XFwucls0OF18XFwucmVmfGEpP3xsZGluZFxcLig/OltpdV1bMTI0OF0/fHJbNDhdfHJlZil8c3RlbGVtXFwuPyg/OmlbMTI0OF0/fHJbNDhdfHJlZik/fHN0aW5kXFwuKD86aVsxMjQ4XT98cls0OF18cmVmKT98ZW5kKD86ZmF1bHR8ZmlsdGVyfGZpbmFsbHkpfGxkYXJnKD86XFwuWzAtM3NdfGEoPzpcXC5zKT8pP3xsZGxvYyg/OlxcLlxcZCt8XFwucyk/fHN1Yig/OlxcLm92Zig/OlxcLnVuKT8pP3xtdWwoPzpcXC5vdmYoPzpcXC51bik/KT98YWRkKD86XFwub3ZmKD86XFwudW4pPyk/fHN0bG9jKD86XFwuWzAtM3NdKT98cmVmYW55KD86dHlwZXx2YWwpfGJsdCg/OlxcLnVuKT8oPzpcXC5zKT98YmxlKD86XFwudW4pPyg/OlxcLnMpP3xiZ3QoPzpcXC51bik/KD86XFwucyk/fGJnZSg/OlxcLnVuKT8oPzpcXC5zKT98dW5ib3goPzpcXC5hbnkpP3xpbml0KD86YmxrfG9iail8Y2FsbCg/Oml8dmlydCk/fGJyZmFsc2UoPzpcXC5zKT98Ym5lXFwudW4oPzpcXC5zKT98bGRsb2NhKD86XFwucyk/fGJyemVybyg/OlxcLnMpP3xicnRydWUoPzpcXC5zKT98YnJudWxsKD86XFwucyk/fGJyaW5zdCg/OlxcLnMpP3xzdGFyZyg/OlxcLnMpP3xsZWF2ZSg/OlxcLnMpP3xzaHIoPzpcXC51bik/fHJlbSg/OlxcLnVuKT98ZGl2KD86XFwudW4pP3xjbHQoPzpcXC51bik/fGFsaWdubWVudHxjYXN0Y2xhc3N8bGR2aXJ0ZnRufGJlcSg/OlxcLnMpP3xja2Zpbml0ZXxsZHNmbGRhfGxkdG9rZW58bG9jYWxsb2N8bWtyZWZhbnl8cmV0aHJvd3xjZ3RcXC51bnxhcmdsaXN0fHN3aXRjaHxzdHNmbGR8c2l6ZW9mfG5ld29ianxuZXdhcnJ8bGRzZmxkfGxkbnVsbHxsZGZsZGF8aXNpbnN0fHRocm93fHN0b2JqfHN0ZmxkfGxkc3RyfGxkb2JqfGxkbGVufGxkZnRufGxkZmxkfGNwb2JqfGNwYmxrfGJyZWFrfGJyXFwuc3x4b3J8c2hsfHJldHxwb3B8bm90fG5vcHxuZWd8am1wfGR1cHxjZ3R8Y2VxfGJveHxhbmR8b3J8YnIpXFxiLyxcblxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdCdudW1iZXInOiAvXFxiLT8oPzoweFswLTlhLWZdK3xcXGQrKSg/OlxcLlswLTlhLWZdKyk/XFxiL2ksXG5cblx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF07KCksOj1dfElMX1swLTlBLVphLXpdKy9cbn07XG5cbi8vIENvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qZWx1YXJkL3ByaXNtLWNsb2p1cmVcblByaXNtLmxhbmd1YWdlcy5jbG9qdXJlID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvOy4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXFxcXF18XFxcXC4pKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NoYXInOiAvXFxcXFxcdysvLFxuXHQnc3ltYm9sJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXFxzKClcXFtcXF17fSxdKTo6P1tcXHcqKyE/Jzw+PS8uLV0rLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzoge1xuXHRcdHBhdHRlcm46IC8oXFwoKSg/Oi18LT58LT4+fFxcLnxcXC5cXC58XFwqfFxcL3xcXCt8PHw8PXw9fD09fD58Pj18YWNjZXNzb3J8YWdlbnR8YWdlbnQtZXJyb3JzfGFnZXR8YWxlbmd0aHxhbGwtbnN8YWx0ZXJ8YW5kfGFwcGVuZC1jaGlsZHxhcHBseXxhcnJheS1tYXB8YXNldHxhc2V0LWJvb2xlYW58YXNldC1ieXRlfGFzZXQtY2hhcnxhc2V0LWRvdWJsZXxhc2V0LWZsb2F0fGFzZXQtaW50fGFzZXQtbG9uZ3xhc2V0LXNob3J0fGFzc2VydHxhc3NvY3xhd2FpdHxhd2FpdC1mb3J8YmVhbnxiaW5kaW5nfGJpdC1hbmR8Yml0LW5vdHxiaXQtb3J8Yml0LXNoaWZ0LWxlZnR8Yml0LXNoaWZ0LXJpZ2h0fGJpdC14b3J8Ym9vbGVhbnxicmFuY2hcXD98YnV0bGFzdHxieXRlfGNhc3R8Y2hhcnxjaGlsZHJlbnxjbGFzc3xjbGVhci1hZ2VudC1lcnJvcnN8Y29tbWVudHxjb21tdXRlfGNvbXB8Y29tcGFyYXRvcnxjb21wbGVtZW50fGNvbmNhdHxjb25kfGNvbmp8Y29uc3xjb25zdGFudGx5fGNvbnN0cnVjdC1wcm94eXxjb250YWluc1xcP3xjb3VudHxjcmVhdGUtbnN8Y3JlYXRlLXN0cnVjdHxjeWNsZXxkZWN8ZGVjbGFyZXxkZWZ8ZGVmLXxkZWZpbmxpbmV8ZGVmaW50ZXJmYWNlfGRlZm1hY3JvfGRlZm1ldGhvZHxkZWZtdWx0aXxkZWZufGRlZm4tfGRlZm9uY2V8ZGVmcHJvamVjdHxkZWZwcm90b2NvbHxkZWZyZWNvcmR8ZGVmc3RydWN0fGRlZnR5cGV8ZGVyZWZ8ZGlmZmVyZW5jZXxkaXNqfGRpc3NvY3xkaXN0aW5jdHxkb3xkb2FsbHxkb2N8ZG9ydW58ZG9zZXF8ZG9zeW5jfGRvdGltZXN8ZG90b3xkb3VibGV8ZG93bnxkcm9wfGRyb3Atd2hpbGV8ZWRpdHxlbmRcXD98ZW5zdXJlfGV2YWx8ZXZlcnlcXD98ZmFsc2VcXD98ZmZpcnN0fGZpbGUtc2VxfGZpbHRlcnxmaW5kfGZpbmQtZG9jfGZpbmQtbnN8ZmluZC12YXJ8Zmlyc3R8ZmxvYXR8Zmx1c2h8Zm58Zm5zZXF8Zm9yfGZyZXN0fGdlbnN5bXxnZXR8Z2V0LXByb3h5LWNsYXNzfGhhc2gtbWFwfGhhc2gtc2V0fGlkZW50aWNhbFxcP3xpZGVudGl0eXxpZnxpZi1sZXR8aWYtbm90fGltcG9ydHxpbi1uc3xpbmN8aW5kZXh8aW5zZXJ0LWNoaWxkfGluc2VydC1sZWZ0fGluc2VydC1yaWdodHxpbnNwZWN0LXRhYmxlfGluc3BlY3QtdHJlZXxpbnN0YW5jZVxcP3xpbnR8aW50ZXJsZWF2ZXxpbnRlcnNlY3Rpb258aW50b3xpbnRvLWFycmF5fGl0ZXJhdGV8am9pbnxrZXl8a2V5c3xrZXl3b3JkfGtleXdvcmRcXD98bGFzdHxsYXp5LWNhdHxsYXp5LWNvbnN8bGVmdHxsZWZ0c3xsZXR8bGluZS1zZXF8bGlzdHxsaXN0XFwqfGxvYWR8bG9hZC1maWxlfGxvY2tpbmd8bG9uZ3xsb29wfG1hY3JvZXhwYW5kfG1hY3JvZXhwYW5kLTF8bWFrZS1hcnJheXxtYWtlLW5vZGV8bWFwfG1hcC1pbnZlcnR8bWFwXFw/fG1hcGNhdHxtYXh8bWF4LWtleXxtZW1mbnxtZXJnZXxtZXJnZS13aXRofG1ldGF8bWlufG1pbi1rZXl8bW9uaXRvci1lbnRlcnxuYW1lfG5hbWVzcGFjZXxuZWdcXD98bmV3fG5ld2xpbmV8bmV4dHxuaWxcXD98bm9kZXxub3R8bm90LWFueVxcP3xub3QtZXZlcnlcXD98bm90PXxuc3xucy1pbXBvcnRzfG5zLWludGVybnN8bnMtbWFwfG5zLW5hbWV8bnMtcHVibGljc3xucy1yZWZlcnN8bnMtcmVzb2x2ZXxucy11bm1hcHxudGh8bnRocmVzdHxvcnxwYXJzZXxwYXJ0aWFsfHBhdGh8cGVla3xwb3B8cG9zXFw/fHByfHByLXN0cnxwcmludHxwcmludC1zdHJ8cHJpbnRsbnxwcmludGxuLXN0cnxwcm58cHJuLXN0cnxwcm9qZWN0fHByb3h5fHByb3h5LW1hcHBpbmdzfHF1b3R8cXVvdGV8cmFuZHxyYW5kLWludHxyYW5nZXxyZS1maW5kfHJlLWdyb3Vwc3xyZS1tYXRjaGVyfHJlLW1hdGNoZXN8cmUtcGF0dGVybnxyZS1zZXF8cmVhZHxyZWFkLWxpbmV8cmVjdXJ8cmVkdWNlfHJlZnxyZWYtc2V0fHJlZmVyfHJlbXxyZW1vdmV8cmVtb3ZlLW1ldGhvZHxyZW1vdmUtbnN8cmVuYW1lfHJlbmFtZS1rZXlzfHJlcGVhdHxyZXBsYWNlfHJlcGxpY2F0ZXxyZXNvbHZlfHJlc3R8cmVzdWx0c2V0LXNlcXxyZXZlcnNlfHJmaXJzdHxyaWdodHxyaWdodHN8cm9vdHxycmVzdHxyc2VxfHNlY29uZHxzZWxlY3R8c2VsZWN0LWtleXN8c2VuZHxzZW5kLW9mZnxzZXF8c2VxLXppcHxzZXFcXD98c2V0fHNldCF8c2hvcnR8c2x1cnB8c29tZXxzb3J0fHNvcnQtYnl8c29ydGVkLW1hcHxzb3J0ZWQtbWFwLWJ5fHNvcnRlZC1zZXR8c3BlY2lhbC1zeW1ib2xcXD98c3BsaXQtYXR8c3BsaXQtd2l0aHxzdHJ8c3RyaW5nXFw/fHN0cnVjdHxzdHJ1Y3QtbWFwfHN1YnN8c3VidmVjfHN5bWJvbHxzeW1ib2xcXD98c3luY3x0YWtlfHRha2UtbnRofHRha2Utd2hpbGV8dGVzdHx0aHJvd3x0aW1lfHRvLWFycmF5fHRvLWFycmF5LTJkfHRyZWUtc2VxfHRydWVcXD98dHJ5fHVuaW9ufHVwfHVwZGF0ZS1wcm94eXx2YWx8dmFsc3x2YXJ8dmFyLWdldHx2YXItc2V0fHZhclxcP3x2ZWN0b3J8dmVjdG9yLXppcHx2ZWN0b3JcXD98d2hlbnx3aGVuLWZpcnN0fHdoZW4tbGV0fHdoZW4tbm90fHdpdGgtbG9jYWwtdmFyc3x3aXRoLW1ldGF8d2l0aC1vcGVufHdpdGgtb3V0LXN0cnx4bWwtc2VxfHhtbC16aXB8emVyb1xcP3x6aXBtYXB8emlwcGVyKSg/PVtcXHMpXXwkKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXxuaWx8dHJ1ZSlcXGIvLFxuXHQnbnVtYmVyJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcdyRAXSkoPzpcXGQrKD86Wy8uXVxcZCspPyg/OmVbKy1dP1xcZCspP3wweFthLWYwLTldK3xbMS05XVxcZD9yW2EtejAtOV0rKVtsbW5dPyg/IVtcXHckQF0pL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnZnVuY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogLygoPzpefFteJ10pXFwoKVtcXHcqKyE/Jzw+PS8uLV0rKD89W1xccyldfCQpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdvcGVyYXRvcic6IC9bI0BeYH5dLyxcblx0J3B1bmN0dWF0aW9uJzogL1t7fVxcW1xcXSgpLF0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuY21ha2UgPSB7XG5cdCdjb21tZW50JzogLyMuKi8sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86W15cXFxcXCJdfFxcXFwuKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9cXCRcXHsoPzpbXnt9JF18XFwkXFx7W157fSRdKlxcfSkqXFx9Lyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcJFxce3xcXH0vLFxuXHRcdFx0XHRcdCd2YXJpYWJsZSc6IC9cXHcrL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQndmFyaWFibGUnOiAvXFxiKD86Q01BS0VfXFx3K3xcXHcrXyg/Oig/OkJJTkFSWXxTT1VSQ0UpX0RJUnxERVNDUklQVElPTnxIT01FUEFHRV9VUkx8Uk9PVHxWRVJTSU9OKD86X01BSk9SfF9NSU5PUnxfUEFUQ0h8X1RXRUFLKT8pfCg/OkFORFJPSUR8QVBQTEV8Qk9STEFORHxCVUlMRF9TSEFSRURfTElCU3xDQUNIRXxDUEFDS18oPzpBQlNPTFVURV9ERVNUSU5BVElPTl9GSUxFU3xDT01QT05FTlRfSU5DTFVERV9UT1BMRVZFTF9ESVJFQ1RPUll8RVJST1JfT05fQUJTT0xVVEVfSU5TVEFMTF9ERVNUSU5BVElPTnxJTkNMVURFX1RPUExFVkVMX0RJUkVDVE9SWXxJTlNUQUxMX0RFRkFVTFRfRElSRUNUT1JZX1BFUk1JU1NJT05TfElOU1RBTExfU0NSSVBUfFBBQ0tBR0lOR19JTlNUQUxMX1BSRUZJWHxTRVRfREVTVERJUnxXQVJOX09OX0FCU09MVVRFX0lOU1RBTExfREVTVElOQVRJT04pfENURVNUXyg/OkJJTkFSWV9ESVJFQ1RPUll8QlVJTERfQ09NTUFORHxCVUlMRF9OQU1FfEJaUl9DT01NQU5EfEJaUl9VUERBVEVfT1BUSU9OU3xDSEFOR0VfSUR8Q0hFQ0tPVVRfQ09NTUFORHxDT05GSUdVUkFUSU9OX1RZUEV8Q09ORklHVVJFX0NPTU1BTkR8Q09WRVJBR0VfQ09NTUFORHxDT1ZFUkFHRV9FWFRSQV9GTEFHU3xDVVJMX09QVElPTlN8Q1VTVE9NXyg/OkNPVkVSQUdFX0VYQ0xVREV8RVJST1JfRVhDRVBUSU9OfEVSUk9SX01BVENIfEVSUk9SX1BPU1RfQ09OVEVYVHxFUlJPUl9QUkVfQ09OVEVYVHxNQVhJTVVNX0ZBSUxFRF9URVNUX09VVFBVVF9TSVpFfE1BWElNVU1fTlVNQkVSX09GXyg/OkVSUk9SU3xXQVJOSU5HUyl8TUFYSU1VTV9QQVNTRURfVEVTVF9PVVRQVVRfU0laRXxNRU1DSEVDS19JR05PUkV8UE9TVF9NRU1DSEVDS3xQT1NUX1RFU1R8UFJFX01FTUNIRUNLfFBSRV9URVNUfFRFU1RTX0lHTk9SRXxXQVJOSU5HX0VYQ0VQVElPTnxXQVJOSU5HX01BVENIKXxDVlNfQ0hFQ0tPVVR8Q1ZTX0NPTU1BTkR8Q1ZTX1VQREFURV9PUFRJT05TfERST1BfTE9DQVRJT058RFJPUF9NRVRIT0R8RFJPUF9TSVRFfERST1BfU0lURV9DREFTSHxEUk9QX1NJVEVfUEFTU1dPUkR8RFJPUF9TSVRFX1VTRVJ8RVhUUkFfQ09WRVJBR0VfR0xPQnxHSVRfQ09NTUFORHxHSVRfSU5JVF9TVUJNT0RVTEVTfEdJVF9VUERBVEVfQ1VTVE9NfEdJVF9VUERBVEVfT1BUSU9OU3xIR19DT01NQU5EfEhHX1VQREFURV9PUFRJT05TfExBQkVMU19GT1JfU1VCUFJPSkVDVFN8TUVNT1JZQ0hFQ0tfKD86Q09NTUFORHxDT01NQU5EX09QVElPTlN8U0FOSVRJWkVSX09QVElPTlN8U1VQUFJFU1NJT05TX0ZJTEV8VFlQRSl8TklHSFRMWV9TVEFSVF9USU1FfFA0X0NMSUVOVHxQNF9DT01NQU5EfFA0X09QVElPTlN8UDRfVVBEQVRFX09QVElPTlN8UlVOX0NVUlJFTlRfU0NSSVBUfFNDUF9DT01NQU5EfFNJVEV8U09VUkNFX0RJUkVDVE9SWXxTVUJNSVRfVVJMfFNWTl9DT01NQU5EfFNWTl9PUFRJT05TfFNWTl9VUERBVEVfT1BUSU9OU3xURVNUX0xPQUR8VEVTVF9USU1FT1VUfFRSSUdHRVJfU0lURXxVUERBVEVfQ09NTUFORHxVUERBVEVfT1BUSU9OU3xVUERBVEVfVkVSU0lPTl9PTkxZfFVTRV9MQVVOQ0hFUlMpfENZR1dJTnxFTlZ8RVhFQ1VUQUJMRV9PVVRQVVRfUEFUSHxHSFMtTVVMVEl8SU9TfExJQlJBUllfT1VUUFVUX1BBVEh8TUlOR1d8TVNWQyg/OjEwfDExfDEyfDE0fDYwfDcwfDcxfDgwfDkwfF9JREV8X1RPT0xTRVRfVkVSU0lPTnxfVkVSU0lPTik/fE1TWVN8UFJPSkVDVF9OQU1FfFVOSVh8V0lOMzJ8V0lOQ0V8V0lORE9XU19QSE9ORXxXSU5ET1dTX1NUT1JFfFhDT0RFKSlcXGIvLFxuXHQncHJvcGVydHknOiAvXFxiKD86Y3h4X1xcdyt8KD86QVJDSElWRV9PVVRQVVRfKD86RElSRUNUT1JZfE5BTUUpfENPTVBJTEVfREVGSU5JVElPTlN8Q09NUElMRV9QREJfTkFNRXxDT01QSUxFX1BEQl9PVVRQVVRfRElSRUNUT1JZfEVYQ0xVREVfRlJPTV9ERUZBVUxUX0JVSUxEfElNUE9SVEVEXyg/OklNUExJQnxMSUJOQU1FfExJTktfREVQRU5ERU5UX0xJQlJBUklFU3xMSU5LX0lOVEVSRkFDRV9MQU5HVUFHRVN8TElOS19JTlRFUkZBQ0VfTElCUkFSSUVTfExJTktfSU5URVJGQUNFX01VTFRJUExJQ0lUWXxMT0NBVElPTnxOT19TT05BTUV8T0JKRUNUU3xTT05BTUUpfElOVEVSUFJPQ0VEVVJBTF9PUFRJTUlaQVRJT058TElCUkFSWV9PVVRQVVRfRElSRUNUT1JZfExJQlJBUllfT1VUUFVUX05BTUV8TElOS19GTEFHU3xMSU5LX0lOVEVSRkFDRV9MSUJSQVJJRVN8TElOS19JTlRFUkZBQ0VfTVVMVElQTElDSVRZfExPQ0FUSU9OfE1BUF9JTVBPUlRFRF9DT05GSUd8T1NYX0FSQ0hJVEVDVFVSRVN8T1VUUFVUX05BTUV8UERCX05BTUV8UERCX09VVFBVVF9ESVJFQ1RPUll8UlVOVElNRV9PVVRQVVRfRElSRUNUT1JZfFJVTlRJTUVfT1VUUFVUX05BTUV8U1RBVElDX0xJQlJBUllfRkxBR1N8VlNfQ1NIQVJQfFZTX0RPVE5FVF9SRUZFUkVOQ0VQUk9QfFZTX0RPVE5FVF9SRUZFUkVOQ0V8VlNfR0xPQkFMX1NFQ1RJT05fUE9TVHxWU19HTE9CQUxfU0VDVElPTl9QUkV8VlNfR0xPQkFMfFhDT0RFX0FUVFJJQlVURSlfXFx3K3xcXHcrXyg/OkNMQU5HX1RJRFl8Q09NUElMRVJfTEFVTkNIRVJ8Q1BQQ0hFQ0t8Q1BQTElOVHxJTkNMVURFX1dIQVRfWU9VX1VTRXxPVVRQVVRfTkFNRXxQT1NURklYfFZJU0lCSUxJVFlfUFJFU0VUKXxBQlNUUkFDVHxBRERJVElPTkFMX01BS0VfQ0xFQU5fRklMRVN8QURWQU5DRUR8QUxJQVNFRF9UQVJHRVR8QUxMT1dfRFVQTElDQVRFX0NVU1RPTV9UQVJHRVRTfEFORFJPSURfKD86QU5UX0FERElUSU9OQUxfT1BUSU9OU3xBUEl8QVBJX01JTnxBUkNIfEFTU0VUU19ESVJFQ1RPUklFU3xHVUl8SkFSX0RFUEVOREVOQ0lFU3xOQVRJVkVfTElCX0RFUEVOREVOQ0lFU3xOQVRJVkVfTElCX0RJUkVDVE9SSUVTfFBST0NFU1NfTUFYfFBST0dVQVJEfFBST0dVQVJEX0NPTkZJR19QQVRIfFNFQ1VSRV9QUk9QU19QQVRIfFNLSVBfQU5UX1NURVB8U1RMX1RZUEUpfEFSQ0hJVkVfT1VUUFVUX0RJUkVDVE9SWXxBVFRBQ0hFRF9GSUxFU3xBVFRBQ0hFRF9GSUxFU19PTl9GQUlMfEFVVE9HRU5fKD86QlVJTERfRElSfE9SSUdJTl9ERVBFTkRTfFBBUkFMTEVMfFNPVVJDRV9HUk9VUHxUQVJHRVRTX0ZPTERFUnxUQVJHRVRfREVQRU5EUyl8QVVUT01PQ3xBVVRPTU9DXyg/OkNPTVBJTEVSX1BSRURFRklORVN8REVQRU5EX0ZJTFRFUlN8RVhFQ1VUQUJMRXxNQUNST19OQU1FU3xNT0NfT1BUSU9OU3xTT1VSQ0VfR1JPVVB8VEFSR0VUU19GT0xERVIpfEFVVE9SQ0N8QVVUT1JDQ19FWEVDVVRBQkxFfEFVVE9SQ0NfT1BUSU9OU3xBVVRPUkNDX1NPVVJDRV9HUk9VUHxBVVRPVUlDfEFVVE9VSUNfRVhFQ1VUQUJMRXxBVVRPVUlDX09QVElPTlN8QVVUT1VJQ19TRUFSQ0hfUEFUSFN8QklOQVJZX0RJUnxCVUlMRFNZU1RFTV9UQVJHRVRTfEJVSUxEX1JQQVRIfEJVSUxEX1JQQVRIX1VTRV9PUklHSU58QlVJTERfV0lUSF9JTlNUQUxMX05BTUVfRElSfEJVSUxEX1dJVEhfSU5TVEFMTF9SUEFUSHxCVU5ETEV8QlVORExFX0VYVEVOU0lPTnxDQUNIRV9WQVJJQUJMRVN8Q0xFQU5fTk9fQ1VTVE9NfENPTU1PTl9MQU5HVUFHRV9SVU5USU1FfENPTVBBVElCTEVfSU5URVJGQUNFXyg/OkJPT0x8TlVNQkVSX01BWHxOVU1CRVJfTUlOfFNUUklORyl8Q09NUElMRV8oPzpERUZJTklUSU9OU3xGRUFUVVJFU3xGTEFHU3xPUFRJT05TfFBEQl9OQU1FfFBEQl9PVVRQVVRfRElSRUNUT1JZKXxDT1NUfENQQUNLX0RFU0tUT1BfU0hPUlRDVVRTfENQQUNLX05FVkVSX09WRVJXUklURXxDUEFDS19QRVJNQU5FTlR8Q1BBQ0tfU1RBUlRVUF9TSE9SVENVVFN8Q1BBQ0tfU1RBUlRfTUVOVV9TSE9SVENVVFN8Q1BBQ0tfV0lYX0FDTHxDUk9TU0NPTVBJTElOR19FTVVMQVRPUnxDVURBX0VYVEVOU0lPTlN8Q1VEQV9QVFhfQ09NUElMQVRJT058Q1VEQV9SRVNPTFZFX0RFVklDRV9TWU1CT0xTfENVREFfU0VQQVJBQkxFX0NPTVBJTEFUSU9OfENVREFfU1RBTkRBUkR8Q1VEQV9TVEFOREFSRF9SRVFVSVJFRHxDWFhfRVhURU5TSU9OU3xDWFhfU1RBTkRBUkR8Q1hYX1NUQU5EQVJEX1JFUVVJUkVEfENfRVhURU5TSU9OU3xDX1NUQU5EQVJEfENfU1RBTkRBUkRfUkVRVUlSRUR8REVCVUdfQ09ORklHVVJBVElPTlN8REVGSU5FX1NZTUJPTHxERUZJTklUSU9OU3xERVBFTkRTfERFUExPWU1FTlRfQURESVRJT05BTF9GSUxFU3xERVBMT1lNRU5UX1JFTU9URV9ESVJFQ1RPUll8RElTQUJMRUR8RElTQUJMRURfRkVBVFVSRVN8RUNMSVBTRV9FWFRSQV9DUFJPSkVDVF9DT05URU5UU3xFQ0xJUFNFX0VYVFJBX05BVFVSRVN8RU5BQkxFRF9GRUFUVVJFU3xFTkFCTEVEX0xBTkdVQUdFU3xFTkFCTEVfRVhQT1JUU3xFTlZJUk9OTUVOVHxFWENMVURFX0ZST01fQUxMfEVYQ0xVREVfRlJPTV9ERUZBVUxUX0JVSUxEfEVYUE9SVF9OQU1FfEVYUE9SVF9QUk9QRVJUSUVTfEVYVEVSTkFMX09CSkVDVHxFY2hvU3RyaW5nfEZBSUxfUkVHVUxBUl9FWFBSRVNTSU9OfEZJTkRfTElCUkFSWV9VU0VfTElCMzJfUEFUSFN8RklORF9MSUJSQVJZX1VTRV9MSUI2NF9QQVRIU3xGSU5EX0xJQlJBUllfVVNFX0xJQlgzMl9QQVRIU3xGSU5EX0xJQlJBUllfVVNFX09QRU5CU0RfVkVSU0lPTklOR3xGSVhUVVJFU19DTEVBTlVQfEZJWFRVUkVTX1JFUVVJUkVEfEZJWFRVUkVTX1NFVFVQfEZPTERFUnxGUkFNRVdPUkt8Rm9ydHJhbl9GT1JNQVR8Rm9ydHJhbl9NT0RVTEVfRElSRUNUT1JZfEdFTkVSQVRFRHxHRU5FUkFUT1JfRklMRV9OQU1FfEdFTkVSQVRPUl9JU19NVUxUSV9DT05GSUd8R0hTX0lOVEVHUklUWV9BUFB8R0hTX05PX1NPVVJDRV9HUk9VUF9GSUxFfEdMT0JBTF9ERVBFTkRTX0RFQlVHX01PREV8R0xPQkFMX0RFUEVORFNfTk9fQ1lDTEVTfEdOVXRvTVN8SEFTX0NYWHxIRUFERVJfRklMRV9PTkxZfEhFTFBTVFJJTkd8SU1QTElDSVRfREVQRU5EU19JTkNMVURFX1RSQU5TRk9STXxJTVBPUlRFRHxJTVBPUlRFRF8oPzpDT01NT05fTEFOR1VBR0VfUlVOVElNRXxDT05GSUdVUkFUSU9OU3xHTE9CQUx8SU1QTElCfExJQk5BTUV8TElOS19ERVBFTkRFTlRfTElCUkFSSUVTfExJTktfSU5URVJGQUNFXyg/OkxBTkdVQUdFU3xMSUJSQVJJRVN8TVVMVElQTElDSVRZKXxMT0NBVElPTnxOT19TT05BTUV8T0JKRUNUU3xTT05BTUUpfElNUE9SVF9QUkVGSVh8SU1QT1JUX1NVRkZJWHxJTkNMVURFX0RJUkVDVE9SSUVTfElOQ0xVREVfUkVHVUxBUl9FWFBSRVNTSU9OfElOU1RBTExfTkFNRV9ESVJ8SU5TVEFMTF9SUEFUSHxJTlNUQUxMX1JQQVRIX1VTRV9MSU5LX1BBVEh8SU5URVJGQUNFXyg/OkFVVE9VSUNfT1BUSU9OU3xDT01QSUxFX0RFRklOSVRJT05TfENPTVBJTEVfRkVBVFVSRVN8Q09NUElMRV9PUFRJT05TfElOQ0xVREVfRElSRUNUT1JJRVN8TElOS19ERVBFTkRTfExJTktfRElSRUNUT1JJRVN8TElOS19MSUJSQVJJRVN8TElOS19PUFRJT05TfFBPU0lUSU9OX0lOREVQRU5ERU5UX0NPREV8U09VUkNFU3xTWVNURU1fSU5DTFVERV9ESVJFQ1RPUklFUyl8SU5URVJQUk9DRURVUkFMX09QVElNSVpBVElPTnxJTl9UUllfQ09NUElMRXxJT1NfSU5TVEFMTF9DT01CSU5FRHxKT0JfUE9PTFN8Sk9CX1BPT0xfQ09NUElMRXxKT0JfUE9PTF9MSU5LfEtFRVBfRVhURU5TSU9OfExBQkVMU3xMQU5HVUFHRXxMSUJSQVJZX09VVFBVVF9ESVJFQ1RPUll8TElOS0VSX0xBTkdVQUdFfExJTktfKD86REVQRU5EU3xERVBFTkRTX05PX1NIQVJFRHxESVJFQ1RPUklFU3xGTEFHU3xJTlRFUkZBQ0VfTElCUkFSSUVTfElOVEVSRkFDRV9NVUxUSVBMSUNJVFl8TElCUkFSSUVTfE9QVElPTlN8U0VBUkNIX0VORF9TVEFUSUN8U0VBUkNIX1NUQVJUX1NUQVRJQ3xXSEFUX1lPVV9VU0UpfExJU1RGSUxFX1NUQUNLfExPQ0FUSU9OfE1BQ09TWF9CVU5ETEV8TUFDT1NYX0JVTkRMRV9JTkZPX1BMSVNUfE1BQ09TWF9GUkFNRVdPUktfSU5GT19QTElTVHxNQUNPU1hfUEFDS0FHRV9MT0NBVElPTnxNQUNPU1hfUlBBVEh8TUFDUk9TfE1BTlVBTExZX0FEREVEX0RFUEVOREVOQ0lFU3xNRUFTVVJFTUVOVHxNT0RJRklFRHxOQU1FfE5PX1NPTkFNRXxOT19TWVNURU1fRlJPTV9JTVBPUlRFRHxPQkpFQ1RfREVQRU5EU3xPQkpFQ1RfT1VUUFVUU3xPU1hfQVJDSElURUNUVVJFU3xPVVRQVVRfTkFNRXxQQUNLQUdFU19GT1VORHxQQUNLQUdFU19OT1RfRk9VTkR8UEFSRU5UX0RJUkVDVE9SWXxQQVNTX1JFR1VMQVJfRVhQUkVTU0lPTnxQREJfTkFNRXxQREJfT1VUUFVUX0RJUkVDVE9SWXxQT1NJVElPTl9JTkRFUEVOREVOVF9DT0RFfFBPU1RfSU5TVEFMTF9TQ1JJUFR8UFJFREVGSU5FRF9UQVJHRVRTX0ZPTERFUnxQUkVGSVh8UFJFX0lOU1RBTExfU0NSSVBUfFBSSVZBVEVfSEVBREVSfFBST0NFU1NPUlN8UFJPQ0VTU09SX0FGRklOSVRZfFBST0pFQ1RfTEFCRUx8UFVCTElDX0hFQURFUnxSRVBPUlRfVU5ERUZJTkVEX1BST1BFUlRJRVN8UkVRVUlSRURfRklMRVN8UkVTT1VSQ0V8UkVTT1VSQ0VfTE9DS3xSVUxFX0xBVU5DSF9DT01QSUxFfFJVTEVfTEFVTkNIX0NVU1RPTXxSVUxFX0xBVU5DSF9MSU5LfFJVTEVfTUVTU0FHRVN8UlVOVElNRV9PVVRQVVRfRElSRUNUT1JZfFJVTl9TRVJJQUx8U0tJUF9BVVRPR0VOfFNLSVBfQVVUT01PQ3xTS0lQX0FVVE9SQ0N8U0tJUF9BVVRPVUlDfFNLSVBfQlVJTERfUlBBVEh8U0tJUF9SRVRVUk5fQ09ERXxTT1VSQ0VTfFNPVVJDRV9ESVJ8U09WRVJTSU9OfFNUQVRJQ19MSUJSQVJZX0ZMQUdTfFNUQVRJQ19MSUJSQVJZX09QVElPTlN8U1RSSU5HU3xTVUJESVJFQ1RPUklFU3xTVUZGSVh8U1lNQk9MSUN8VEFSR0VUX0FSQ0hJVkVTX01BWV9CRV9TSEFSRURfTElCU3xUQVJHRVRfTUVTU0FHRVN8VEFSR0VUX1NVUFBPUlRTX1NIQVJFRF9MSUJTfFRFU1RTfFRFU1RfSU5DTFVERV9GSUxFfFRFU1RfSU5DTFVERV9GSUxFU3xUSU1FT1VUfFRJTUVPVVRfQUZURVJfTUFUQ0h8VFlQRXxVU0VfRk9MREVSU3xWQUxVRXxWQVJJQUJMRVN8VkVSU0lPTnxWSVNJQklMSVRZX0lOTElORVNfSElEREVOfFZTXyg/OkNPTkZJR1VSQVRJT05fVFlQRXxDT1BZX1RPX09VVF9ESVJ8REVCVUdHRVJfKD86Q09NTUFORHxDT01NQU5EX0FSR1VNRU5UU3xFTlZJUk9OTUVOVHxXT1JLSU5HX0RJUkVDVE9SWSl8REVQTE9ZTUVOVF9DT05URU5UfERFUExPWU1FTlRfTE9DQVRJT058RE9UTkVUX1JFRkVSRU5DRVN8RE9UTkVUX1JFRkVSRU5DRVNfQ09QWV9MT0NBTHxJTkNMVURFX0lOX1ZTSVh8SU9UX1NUQVJUVVBfVEFTS3xLRVlXT1JEfFJFU09VUkNFX0dFTkVSQVRPUnxTQ0NfQVVYUEFUSHxTQ0NfTE9DQUxQQVRIfFNDQ19QUk9KRUNUTkFNRXxTQ0NfUFJPVklERVJ8U0RLX1JFRkVSRU5DRVN8U0hBREVSXyg/OkRJU0FCTEVfT1BUSU1JWkFUSU9OU3xFTkFCTEVfREVCVUd8RU5UUllQT0lOVHxGTEFHU3xNT0RFTHxPQkpFQ1RfRklMRV9OQU1FfE9VVFBVVF9IRUFERVJfRklMRXxUWVBFfFZBUklBQkxFX05BTUUpfFNUQVJUVVBfUFJPSkVDVHxUT09MX09WRVJSSURFfFVTRVJfUFJPUFN8V0lOUlRfQ09NUE9ORU5UfFdJTlJUX0VYVEVOU0lPTlN8V0lOUlRfUkVGRVJFTkNFU3xYQU1MX1RZUEUpfFdJTExfRkFJTHxXSU4zMl9FWEVDVVRBQkxFfFdJTkRPV1NfRVhQT1JUX0FMTF9TWU1CT0xTfFdPUktJTkdfRElSRUNUT1JZfFdSQVBfRVhDTFVERXxYQ09ERV8oPzpFTUlUX0VGRkVDVElWRV9QTEFURk9STV9OQU1FfEVYUExJQ0lUX0ZJTEVfVFlQRXxGSUxFX0FUVFJJQlVURVN8TEFTVF9LTk9XTl9GSUxFX1RZUEV8UFJPRFVDVF9UWVBFfFNDSEVNRV8oPzpBRERSRVNTX1NBTklUSVpFUnxBRERSRVNTX1NBTklUSVpFUl9VU0VfQUZURVJfUkVUVVJOfEFSR1VNRU5UU3xESVNBQkxFX01BSU5fVEhSRUFEX0NIRUNLRVJ8RFlOQU1JQ19MSUJSQVJZX0xPQURTfERZTkFNSUNfTElOS0VSX0FQSV9VU0FHRXxFTlZJUk9OTUVOVHxFWEVDVVRBQkxFfEdVQVJEX01BTExPQ3xNQUlOX1RIUkVBRF9DSEVDS0VSX1NUT1B8TUFMTE9DX0dVQVJEX0VER0VTfE1BTExPQ19TQ1JJQkJMRXxNQUxMT0NfU1RBQ0t8VEhSRUFEX1NBTklUSVpFUig/Ol9TVE9QKT98VU5ERUZJTkVEX0JFSEFWSU9VUl9TQU5JVElaRVIoPzpfU1RPUCk/fFpPTUJJRV9PQkpFQ1RTKSl8WENURVNUKVxcYi8sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFkZF9jb21waWxlX2RlZmluaXRpb25zfGFkZF9jb21waWxlX29wdGlvbnN8YWRkX2N1c3RvbV9jb21tYW5kfGFkZF9jdXN0b21fdGFyZ2V0fGFkZF9kZWZpbml0aW9uc3xhZGRfZGVwZW5kZW5jaWVzfGFkZF9leGVjdXRhYmxlfGFkZF9saWJyYXJ5fGFkZF9saW5rX29wdGlvbnN8YWRkX3N1YmRpcmVjdG9yeXxhZGRfdGVzdHxhdXhfc291cmNlX2RpcmVjdG9yeXxicmVha3xidWlsZF9jb21tYW5kfGJ1aWxkX25hbWV8Y21ha2VfaG9zdF9zeXN0ZW1faW5mb3JtYXRpb258Y21ha2VfbWluaW11bV9yZXF1aXJlZHxjbWFrZV9wYXJzZV9hcmd1bWVudHN8Y21ha2VfcG9saWN5fGNvbmZpZ3VyZV9maWxlfGNvbnRpbnVlfGNyZWF0ZV90ZXN0X3NvdXJjZWxpc3R8Y3Rlc3RfYnVpbGR8Y3Rlc3RfY29uZmlndXJlfGN0ZXN0X2NvdmVyYWdlfGN0ZXN0X2VtcHR5X2JpbmFyeV9kaXJlY3Rvcnl8Y3Rlc3RfbWVtY2hlY2t8Y3Rlc3RfcmVhZF9jdXN0b21fZmlsZXN8Y3Rlc3RfcnVuX3NjcmlwdHxjdGVzdF9zbGVlcHxjdGVzdF9zdGFydHxjdGVzdF9zdWJtaXR8Y3Rlc3RfdGVzdHxjdGVzdF91cGRhdGV8Y3Rlc3RfdXBsb2FkfGRlZmluZV9wcm9wZXJ0eXxlbHNlfGVsc2VpZnxlbmFibGVfbGFuZ3VhZ2V8ZW5hYmxlX3Rlc3Rpbmd8ZW5kZm9yZWFjaHxlbmRmdW5jdGlvbnxlbmRpZnxlbmRtYWNyb3xlbmR3aGlsZXxleGVjX3Byb2dyYW18ZXhlY3V0ZV9wcm9jZXNzfGV4cG9ydHxleHBvcnRfbGlicmFyeV9kZXBlbmRlbmNpZXN8ZmlsZXxmaW5kX2ZpbGV8ZmluZF9saWJyYXJ5fGZpbmRfcGFja2FnZXxmaW5kX3BhdGh8ZmluZF9wcm9ncmFtfGZsdGtfd3JhcF91aXxmb3JlYWNofGZ1bmN0aW9ufGdldF9jbWFrZV9wcm9wZXJ0eXxnZXRfZGlyZWN0b3J5X3Byb3BlcnR5fGdldF9maWxlbmFtZV9jb21wb25lbnR8Z2V0X3Byb3BlcnR5fGdldF9zb3VyY2VfZmlsZV9wcm9wZXJ0eXxnZXRfdGFyZ2V0X3Byb3BlcnR5fGdldF90ZXN0X3Byb3BlcnR5fGlmfGluY2x1ZGV8aW5jbHVkZV9kaXJlY3Rvcmllc3xpbmNsdWRlX2V4dGVybmFsX21zcHJvamVjdHxpbmNsdWRlX2d1YXJkfGluY2x1ZGVfcmVndWxhcl9leHByZXNzaW9ufGluc3RhbGx8aW5zdGFsbF9maWxlc3xpbnN0YWxsX3Byb2dyYW1zfGluc3RhbGxfdGFyZ2V0c3xsaW5rX2RpcmVjdG9yaWVzfGxpbmtfbGlicmFyaWVzfGxpc3R8bG9hZF9jYWNoZXxsb2FkX2NvbW1hbmR8bWFjcm98bWFrZV9kaXJlY3Rvcnl8bWFya19hc19hZHZhbmNlZHxtYXRofG1lc3NhZ2V8b3B0aW9ufG91dHB1dF9yZXF1aXJlZF9maWxlc3xwcm9qZWN0fHF0X3dyYXBfY3BwfHF0X3dyYXBfdWl8cmVtb3ZlfHJlbW92ZV9kZWZpbml0aW9uc3xyZXR1cm58c2VwYXJhdGVfYXJndW1lbnRzfHNldHxzZXRfZGlyZWN0b3J5X3Byb3BlcnRpZXN8c2V0X3Byb3BlcnR5fHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllc3xzZXRfdGFyZ2V0X3Byb3BlcnRpZXN8c2V0X3Rlc3RzX3Byb3BlcnRpZXN8c2l0ZV9uYW1lfHNvdXJjZV9ncm91cHxzdHJpbmd8c3ViZGlyX2RlcGVuZHN8c3ViZGlyc3x0YXJnZXRfY29tcGlsZV9kZWZpbml0aW9uc3x0YXJnZXRfY29tcGlsZV9mZWF0dXJlc3x0YXJnZXRfY29tcGlsZV9vcHRpb25zfHRhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzfHRhcmdldF9saW5rX2RpcmVjdG9yaWVzfHRhcmdldF9saW5rX2xpYnJhcmllc3x0YXJnZXRfbGlua19vcHRpb25zfHRhcmdldF9zb3VyY2VzfHRyeV9jb21waWxlfHRyeV9ydW58dW5zZXR8dXNlX21hbmdsZWRfbWVzYXx1dGlsaXR5X3NvdXJjZXx2YXJpYWJsZV9yZXF1aXJlc3x2YXJpYWJsZV93YXRjaHx3aGlsZXx3cml0ZV9maWxlKSg/PVxccypcXCgpXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86RkFMU0V8T0ZGfE9OfFRSVUUpXFxiLyxcblx0J25hbWVzcGFjZSc6IC9cXGIoPzpJTlRFUkZBQ0V8UFJJVkFURXxQUk9QRVJUSUVTfFBVQkxJQ3xTSEFSRUR8U1RBVElDfFRBUkdFVF9PQkpFQ1RTKVxcYi8sXG5cdCdvcGVyYXRvcic6IC9cXGIoPzpBTkR8REVGSU5FRHxFUVVBTHxHUkVBVEVSfExFU1N8TUFUQ0hFU3xOT1R8T1J8U1RSRVFVQUx8U1RSR1JFQVRFUnxTVFJMRVNTfFZFUlNJT05fRVFVQUx8VkVSU0lPTl9HUkVBVEVSfFZFUlNJT05fTEVTUylcXGIvLFxuXHQnaW5zZXJ0ZWQnOiB7XG5cdFx0cGF0dGVybjogL1xcYlxcdys6OlxcdytcXGIvLFxuXHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0fSxcblx0J251bWJlcic6IC9cXGJcXGQrKD86XFwuXFxkKykqXFxiLyxcblx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1cXHMqXFwoKVxcYi9pLFxuXHQncHVuY3R1YXRpb24nOiAvWygpPn1dfFxcJFs8e10vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuY29ib2wgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXCo+Lip8KF5bIFxcdF0qKVxcKi4qL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvW3h6Z25dPyg/OlwiKD86W15cXHJcXG5cIl18XCJcIikqXCIoPyFcIil8Jyg/OlteXFxyXFxuJ118JycpKicoPyEnKSkvaSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQnbGV2ZWwnOiB7XG5cdFx0cGF0dGVybjogLyheWyBcXHRdKilcXGQrXFxiL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdudW1iZXInXG5cdH0sXG5cblx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2FudGxyL2dyYW1tYXJzLXY0L2Jsb2IvNDJlZGQ1YjY4N2QxODNiNWZhNjc5ZTg1OGE4MjI5N2JkMjcxNDFlNy9jb2JvbDg1L0NvYm9sODUuZzQjTDEwMTVcblx0XHRwYXR0ZXJuOiAvKFxcYnBpYyg/OnR1cmUpP1xccyspKD86KD86Wy1cXHckLyw6Kis8Pl18XFwuKD8hXFxzfCQpKSg/OlxcKFxcZCtcXCkpPykrL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdudW1iZXInOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFwoKVxcZCsvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1soKV0vXG5cdFx0fVxuXHR9LFxuXG5cdCdrZXl3b3JkJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcdy1dKSg/OkFCT1JUfEFDQ0VQVHxBQ0NFU1N8QUREfEFERFJFU1N8QURWQU5DSU5HfEFGVEVSfEFMSUdORUR8QUxMfEFMUEhBQkVUfEFMUEhBQkVUSUN8QUxQSEFCRVRJQy1MT1dFUnxBTFBIQUJFVElDLVVQUEVSfEFMUEhBTlVNRVJJQ3xBTFBIQU5VTUVSSUMtRURJVEVEfEFMU098QUxURVJ8QUxURVJOQVRFfEFOWXxBUkV8QVJFQXxBUkVBU3xBU3xBU0NFTkRJTkd8QVNDSUl8QVNTSUdOfEFTU09DSUFURUQtREFUQXxBU1NPQ0lBVEVELURBVEEtTEVOR1RIfEFUfEFUVFJJQlVURXxBVVRIT1J8QVVUT3xBVVRPLVNLSVB8QkFDS0dST1VORC1DT0xPUnxCQUNLR1JPVU5ELUNPTE9VUnxCQVNJU3xCRUVQfEJFRk9SRXxCRUdJTk5JTkd8QkVMTHxCSU5BUll8QklUfEJMQU5LfEJMSU5LfEJMT0NLfEJPVFRPTXxCT1VORFN8Qll8QllGVU5DVElPTnxCWVRJVExFfENBTEx8Q0FOQ0VMfENBUEFCTEV8Q0NTVkVSU0lPTnxDRHxDRnxDSHxDSEFJTklOR3xDSEFOR0VEfENIQU5ORUx8Q0hBUkFDVEVSfENIQVJBQ1RFUlN8Q0xBU1N8Q0xBU1MtSUR8Q0xPQ0stVU5JVFN8Q0xPU0V8Q0xPU0UtRElTUE9TSVRJT058Q09CT0x8Q09ERXxDT0RFLVNFVHxDT0x8Q09MTEFUSU5HfENPTFVNTnxDT00tUkVHfENPTU1BfENPTU1JVE1FTlR8Q09NTU9OfENPTU1VTklDQVRJT058Q09NUHxDT01QLTF8Q09NUC0yfENPTVAtM3xDT01QLTR8Q09NUC01fENPTVBVVEFUSU9OQUx8Q09NUFVUQVRJT05BTC0xfENPTVBVVEFUSU9OQUwtMnxDT01QVVRBVElPTkFMLTN8Q09NUFVUQVRJT05BTC00fENPTVBVVEFUSU9OQUwtNXxDT01QVVRFfENPTkZJR1VSQVRJT058Q09OVEFJTlN8Q09OVEVOVHxDT05USU5VRXxDT05UUk9MfENPTlRST0wtUE9JTlR8Q09OVFJPTFN8Q09OVkVOVElPTnxDT05WRVJUSU5HfENPUFl8Q09SUnxDT1JSRVNQT05ESU5HfENPVU5UfENSVU5DSHxDVVJSRU5DWXxDVVJTT1J8REFUQXxEQVRBLUJBU0V8REFURXxEQVRFLUNPTVBJTEVEfERBVEUtV1JJVFRFTnxEQVl8REFZLU9GLVdFRUt8REJDU3xERXxERUJVRy1DT05URU5UU3xERUJVRy1JVEVNfERFQlVHLUxJTkV8REVCVUctTkFNRXxERUJVRy1TVUItMXxERUJVRy1TVUItMnxERUJVRy1TVUItM3xERUJVR0dJTkd8REVDSU1BTC1QT0lOVHxERUNMQVJBVElWRVN8REVGQVVMVHxERUZBVUxULURJU1BMQVl8REVGSU5JVElPTnxERUxFVEV8REVMSU1JVEVEfERFTElNSVRFUnxERVBFTkRJTkd8REVTQ0VORElOR3xERVNUSU5BVElPTnxERVRBSUx8REZIUkVTUHxERkhWQUxVRXxESVNBQkxFfERJU0t8RElTUExBWXxESVNQTEFZLTF8RElWSURFfERJVklTSU9OfERPTlRDQVJFfERPVUJMRXxET1dOfERVUExJQ0FURVN8RFlOQU1JQ3xFQkNESUN8RUdDU3xFR0l8RUxTRXxFTUl8RU1QVFktQ0hFQ0t8RU5BQkxFfEVORHxFTkQtQUNDRVBUfEVORC1BRER8RU5ELUNBTEx8RU5ELUNPTVBVVEV8RU5ELURFTEVURXxFTkQtRElWSURFfEVORC1FVkFMVUFURXxFTkQtSUZ8RU5ELU1VTFRJUExZfEVORC1PRi1QQUdFfEVORC1QRVJGT1JNfEVORC1SRUFEfEVORC1SRUNFSVZFfEVORC1SRVRVUk58RU5ELVJFV1JJVEV8RU5ELVNFQVJDSHxFTkQtU1RBUlR8RU5ELVNUUklOR3xFTkQtU1VCVFJBQ1R8RU5ELVVOU1RSSU5HfEVORC1XUklURXxFTkRJTkd8RU5URVJ8RU5UUll8RU5UUlktUFJPQ0VEVVJFfEVOVklST05NRU5UfEVPTHxFT1B8RU9TfEVSQVNFfEVSUk9SfEVTQ0FQRXxFU0l8RVZBTFVBVEV8RVZFTlR8RVZFUll8RVhDRVBUSU9OfEVYQ0xVU0lWRXxFWEhJQklUfEVYSVR8RVhQT1JUfEVYVEVORHxFWFRFTkRFRHxFWFRFUk5BTHxGRHxGSUxFfEZJTEUtQ09OVFJPTHxGSUxMRVJ8RklOQUx8RklSU1R8Rk9PVElOR3xGT1J8Rk9SRUdST1VORC1DT0xPUnxGT1JFR1JPVU5ELUNPTE9VUnxGUk9NfEZVTEx8RlVOQ1RJT058RlVOQ1RJT04tUE9JTlRFUnxGVU5DVElPTk5BTUV8R0VORVJBVEV8R0lWSU5HfEdMT0JBTHxHT3xHT0JBQ0t8R1JJRHxHUk9VUHxIRUFESU5HfEhJR0gtVkFMVUV8SElHSC1WQUxVRVN8SElHSExJR0hUfEktT3xJLU8tQ09OVFJPTHxJRHxJREVOVElGSUNBVElPTnxJRnxJTVBMSUNJVHxJTVBPUlR8SU58SU5ERVh8SU5ERVhFRHxJTkRJQ0FURXxJTklUSUFMfElOSVRJQUxJWkV8SU5JVElBVEV8SU5QVVR8SU5QVVQtT1VUUFVUfElOU1BFQ1R8SU5TVEFMTEFUSU9OfElOVEVHRVJ8SU5UT3xJTlZBTElEfElOVk9LRXxJU3xKVVNUfEpVU1RJRklFRHxLQU5KSXxLRVBUfEtFWXxLRVlCT0FSRHxMQUJFTHxMQU5HVUFHRXxMQVNUfExCfExEfExFQURJTkd8TEVGVHxMRUZUTElORXxMRU5HVEh8TEVOR1RILUNIRUNLfExJQkFDQ0VTU3xMSUJQQVJBTUVURVJ8TElCUkFSWXxMSU1JVHxMSU1JVFN8TElOQUdFfExJTkFHRS1DT1VOVEVSfExJTkV8TElORS1DT1VOVEVSfExJTkVTfExJTktBR0V8TElTVHxMT0NBTHxMT0NBTC1TVE9SQUdFfExPQ0t8TE9ORy1EQVRFfExPTkctVElNRXxMT1ctVkFMVUV8TE9XLVZBTFVFU3xMT1dFUnxMT1dMSUdIVHxNRU1PUll8TUVSR0V8TUVTU0FHRXxNTUREWVlZWXxNT0RFfE1PRFVMRVN8TU9SRS1MQUJFTFN8TU9WRXxNVUxUSVBMRXxNVUxUSVBMWXxOQU1FRHxOQVRJT05BTHxOQVRJT05BTC1FRElURUR8TkFUSVZFfE5FR0FUSVZFfE5FVFdPUkt8TkVYVHxOT3xOTy1FQ0hPfE5VTEx8TlVMTFN8TlVNQkVSfE5VTUVSSUN8TlVNRVJJQy1EQVRFfE5VTUVSSUMtRURJVEVEfE5VTUVSSUMtVElNRXxPQkpFQ1QtQ09NUFVURVJ8T0NDVVJTfE9EVHxPRnxPRkZ8T01JVFRFRHxPTnxPUEVOfE9QVElPTkFMfE9SREVSfE9SREVSTFl8T1JHQU5JWkFUSU9OfE9USEVSfE9VVFBVVHxPVkVSRkxPV3xPVkVSTElORXxPV058UEFDS0VELURFQ0lNQUx8UEFERElOR3xQQUdFfFBBR0UtQ09VTlRFUnxQQVNTV09SRHxQRVJGT1JNfFBGfFBIfFBJQ3xQSUNUVVJFfFBMVVN8UE9JTlRFUnxQT1JUfFBPU0lUSU9OfFBPU0lUSVZFfFBSSU5URVJ8UFJJTlRJTkd8UFJJVkFURXxQUk9DRURVUkV8UFJPQ0VEVVJFLVBPSU5URVJ8UFJPQ0VEVVJFU3xQUk9DRUVEfFBST0NFU1N8UFJPR1JBTXxQUk9HUkFNLUlEfFBST0dSQU0tTElCUkFSWXxQUk9NUFR8UFVSR0V8UVVFVUV8UVVPVEV8UVVPVEVTfFJBTkRPTXxSRHxSRUFEfFJFQURFUnxSRUFMfFJFQ0VJVkV8UkVDRUlWRUR8UkVDT1JEfFJFQ09SRElOR3xSRUNPUkRTfFJFQ1VSU0lWRXxSRURFRklORVN8UkVFTHxSRUZ8UkVGRVJFTkNFfFJFRkVSRU5DRVN8UkVMQVRJVkV8UkVMRUFTRXxSRU1BSU5ERVJ8UkVNQVJLU3xSRU1PVEV8UkVNT1ZBTHxSRU1PVkV8UkVOQU1FU3xSRVBMQUNFfFJFUExBQ0lOR3xSRVBPUlR8UkVQT1JUSU5HfFJFUE9SVFN8UkVRVUlSRUR8UkVSVU58UkVTRVJWRXxSRVNFVHxSRVRVUk58UkVUVVJOLUNPREV8UkVUVVJOSU5HfFJFVkVSU0UtVklERU98UkVWRVJTRUR8UkVXSU5EfFJFV1JJVEV8UkZ8Ukh8UklHSFR8Uk9VTkRFRHxSVU58U0FNRXxTQVZFfFNDUkVFTnxTRHxTRUFSQ0h8U0VDVElPTnxTRUNVUkV8U0VDVVJJVFl8U0VHTUVOVHxTRUdNRU5ULUxJTUlUfFNFTEVDVHxTRU5EfFNFTlRFTkNFfFNFUEFSQVRFfFNFUVVFTkNFfFNFUVVFTlRJQUx8U0VUfFNIQVJFRHxTSEFSRURCWUFMTHxTSEFSRURCWVJVTlVOSVR8U0hBUklOR3xTSElGVC1JTnxTSElGVC1PVVR8U0hPUlQtREFURXxTSUdOfFNJWkV8U09SVHxTT1JULUNPTlRST0x8U09SVC1DT1JFLVNJWkV8U09SVC1GSUxFLVNJWkV8U09SVC1NRVJHRXxTT1JULU1FU1NBR0V8U09SVC1NT0RFLVNJWkV8U09SVC1SRVRVUk58U09VUkNFfFNPVVJDRS1DT01QVVRFUnxTUEFDRXxTUEFDRVN8U1BFQ0lBTC1OQU1FU3xTVEFOREFSRHxTVEFOREFSRC0xfFNUQU5EQVJELTJ8U1RBUlR8U1RBVFVTfFNUT1B8U1RSSU5HfFNVQi1RVUVVRS0xfFNVQi1RVUVVRS0yfFNVQi1RVUVVRS0zfFNVQlRSQUNUfFNVTXxTVVBQUkVTU3xTWU1CT0x8U1lNQk9MSUN8U1lOQ3xTWU5DSFJPTklaRUR8VEFCTEV8VEFMTFl8VEFMTFlJTkd8VEFQRXxUQVNLfFRFUk1JTkFMfFRFUk1JTkFURXxURVNUfFRFWFR8VEhFTnxUSFJFQUR8VEhSRUFELUxPQ0FMfFRIUk9VR0h8VEhSVXxUSU1FfFRJTUVSfFRJTUVTfFRJVExFfFRPfFRPREFZUy1EQVRFfFRPREFZUy1OQU1FfFRPUHxUUkFJTElOR3xUUlVOQ0FURUR8VFlQRXxUWVBFREVGfFVOREVSTElORXxVTklUfFVOU1RSSU5HfFVOVElMfFVQfFVQT058VVNBR0V8VVNFfFVTSU5HfFZBTFVFfFZBTFVFU3xWQVJZSU5HfFZJUlRVQUx8V0FJVHxXSEVOfFdIRU4tQ09NUElMRUR8V0lUSHxXT1JEU3xXT1JLSU5HLVNUT1JBR0V8V1JJVEV8WUVBUnxZWVlZREREfFlZWVlNTUREfFpFUk8tRklMTHxaRVJPRVN8WkVST1MpKD8hW1xcdy1dKS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblxuXHQnYm9vbGVhbic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXHctXSkoPzpmYWxzZXx0cnVlKSg/IVtcXHctXSkvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdudW1iZXInOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFx3LV0pKD86WystXT8oPzooPzpcXGQrKD86Wy4sXVxcZCspP3xbLixdXFxkKykoPzplWystXT9cXGQrKT98emVybykpKD8hW1xcdy1dKS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J29wZXJhdG9yJzogW1xuXHRcdC88PnxbPD5dPT98Wz0rKi8mXS8sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFx3LV0pKD86LXxhbmR8ZXF1YWx8Z3JlYXRlcnxsZXNzfG5vdHxvcnx0aGFuKSg/IVtcXHctXSkvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdwdW5jdHVhdGlvbic6IC9bLjosKCldL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdC8vIElnbm9yZSBjb21tZW50cyBzdGFydGluZyB3aXRoIHsgdG8gcHJpdmlsZWdlIHN0cmluZyBpbnRlcnBvbGF0aW9uIGhpZ2hsaWdodGluZ1xuXHR2YXIgY29tbWVudCA9IC8jKD8hXFx7KS4rLztcblx0dmFyIGludGVycG9sYXRpb24gPSB7XG5cdFx0cGF0dGVybjogLyNcXHtbXn1dK1xcfS8sXG5cdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuY29mZmVlc2NyaXB0ID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnamF2YXNjcmlwdCcsIHtcblx0XHQnY29tbWVudCc6IGNvbW1lbnQsXG5cdFx0J3N0cmluZyc6IFtcblxuXHRcdFx0Ly8gU3RyaW5ncyBhcmUgbXVsdGlsaW5lXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8nKD86XFxcXFtcXHNcXFNdfFteXFxcXCddKSonLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFN0cmluZ3MgYXJlIG11bHRpbGluZVxuXHRcdFx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcW1xcc1xcU118W15cXFxcXCJdKSpcIi8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2ludGVycG9sYXRpb24nOiBpbnRlcnBvbGF0aW9uXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXHRcdCdrZXl3b3JkJzogL1xcYig/OmFuZHxicmVha3xieXxjYXRjaHxjbGFzc3xjb250aW51ZXxkZWJ1Z2dlcnxkZWxldGV8ZG98ZWFjaHxlbHNlfGV4dGVuZHxleHRlbmRzfGZhbHNlfGZpbmFsbHl8Zm9yfGlmfGlufGluc3RhbmNlb2Z8aXN8aXNudHxsZXR8bG9vcHxuYW1lc3BhY2V8bmV3fG5vfG5vdHxudWxsfG9mfG9mZnxvbnxvcnxvd258cmV0dXJufHN1cGVyfHN3aXRjaHx0aGVufHRoaXN8dGhyb3d8dHJ1ZXx0cnl8dHlwZW9mfHVuZGVmaW5lZHx1bmxlc3N8dW50aWx8d2hlbnx3aGlsZXx3aW5kb3d8d2l0aHx5ZXN8eWllbGQpXFxiLyxcblx0XHQnY2xhc3MtbWVtYmVyJzoge1xuXHRcdFx0cGF0dGVybjogL0AoPyFcXGQpXFx3Ky8sXG5cdFx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnY29mZmVlc2NyaXB0JywgJ2NvbW1lbnQnLCB7XG5cdFx0J211bHRpbGluZS1jb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogLyMjI1tcXHNcXFNdKz8jIyMvLFxuXHRcdFx0YWxpYXM6ICdjb21tZW50J1xuXHRcdH0sXG5cblx0XHQvLyBCbG9jayByZWdleHAgY2FuIGNvbnRhaW4gY29tbWVudHMgYW5kIGludGVycG9sYXRpb25cblx0XHQnYmxvY2stcmVnZXgnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwvezN9W1xcc1xcU10qP1xcL3szfS8sXG5cdFx0XHRhbGlhczogJ3JlZ2V4Jyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnY29tbWVudCc6IGNvbW1lbnQsXG5cdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzogaW50ZXJwb2xhdGlvblxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnY29mZmVlc2NyaXB0JywgJ3N0cmluZycsIHtcblx0XHQnaW5saW5lLWphdmFzY3JpcHQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvYCg/OlxcXFxbXFxzXFxTXXxbXlxcXFxgXSkqYC8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXmB8YCQvLFxuXHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdzY3JpcHQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1qYXZhc2NyaXB0Jyxcblx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gQmxvY2sgc3RyaW5nc1xuXHRcdCdtdWx0aWxpbmUtc3RyaW5nJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvJycnW1xcc1xcU10qPycnJy8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdzdHJpbmcnXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXCJcIlwiW1xcc1xcU10qP1wiXCJcIi8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRpbnRlcnBvbGF0aW9uOiBpbnRlcnBvbGF0aW9uXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdXG5cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnY29mZmVlc2NyaXB0JywgJ2tleXdvcmQnLCB7XG5cdFx0Ly8gT2JqZWN0IHByb3BlcnR5XG5cdFx0J3Byb3BlcnR5JzogLyg/IVxcZClcXHcrKD89XFxzKjooPyE6KSkvXG5cdH0pO1xuXG5cdGRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMuY29mZmVlc2NyaXB0Wyd0ZW1wbGF0ZS1zdHJpbmcnXTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuY29mZmVlID0gUHJpc20ubGFuZ3VhZ2VzLmNvZmZlZXNjcmlwdDtcbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmNvbmN1cm5hcyA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pKD86XFwvXFwqW1xcc1xcU10qPyg/OlxcKlxcL3wkKXxcXC9cXC8uKikvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdsYW5nZXh0Jzoge1xuXHRcdHBhdHRlcm46IC9cXGJcXHcrXFxzKlxcfFxcfFtcXHNcXFNdKz9cXHxcXHwvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdjbGFzcy1uYW1lJzogL15cXHcrLyxcblx0XHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oXlxccypcXHxcXHwpW1xcc1xcU10rKD89XFx8XFx8JCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcfFxcfC9cblx0XHR9XG5cdH0sXG5cdCdmdW5jdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxzKWRlZlsgXFx0XSspW2EtekEtWl9dXFx3Kig/PVxccypcXCgpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFic3RyYWN0fGFjdG9yfGFsc298YW5ub3RhdGlvbnxhc3NlcnR8YXN5bmN8YXdhaXR8Ym9vbHxib29sZWFufGJyZWFrfGJ5dGV8Y2FzZXxjYXRjaHxjaGFuZ2VkfGNoYXJ8Y2xhc3N8Y2xvc2VkfGNvbnN0YW50fGNvbnRpbnVlfGRlZnxkZWZhdWx0fGRlbHxkb3VibGV8ZWxpZnxlbHNlfGVudW18ZXZlcnl8ZXh0ZW5kc3xmYWxzZXxmaW5hbGx5fGZsb2F0fGZvcnxmcm9tfGdsb2JhbHxncHVkZWZ8Z3B1a2VybmVsfGlmfGltcG9ydHxpbnxpbml0fGluamVjdHxpbnR8bGFtYmRhfGxvY2FsfGxvbmd8bG9vcHxtYXRjaHxuZXd8bm9kZWZhdWx0fG51bGx8b2Z8b25jaGFuZ2V8b3BlbnxvdXR8b3ZlcnJpZGV8cGFja2FnZXxwYXJmb3J8cGFyZm9yc3luY3xwb3N0fHByZXxwcml2YXRlfHByb3RlY3RlZHxwcm92aWRlfHByb3ZpZGVyfHB1YmxpY3xyZXR1cm58c2hhcmVkfHNob3J0fHNpbmdsZXxzaXplX3R8c2l6ZW9mfHN1cGVyfHN5bmN8dGhpc3x0aHJvd3x0cmFpdHx0cmFuc3x0cmFuc2llbnR8dHJ1ZXx0cnl8dHlwZWRlZnx1bmNoZWNrZWR8dXNpbmd8dmFsfHZhcnx2b2lkfHdoaWxlfHdpdGgpXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQnbnVtYmVyJzogL1xcYjBiWzAxXVswMV9dKkw/XFxifFxcYjB4KD86W1xcZGEtZl9dKlxcLik/W1xcZGEtZl9wKy1dK1xcYnwoPzpcXGJcXGRbXFxkX10qKD86XFwuW1xcZF9dKik/fFxcQlxcLlxcZFtcXGRfXSopKD86ZVsrLV0/XFxkW1xcZF9dKik/W2RmbHNdPy9pLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXTsoKSwuOl0vLFxuXHQnb3BlcmF0b3InOiAvPD09fD49PXw9PnwtPnw8LXw8PnwmPT18Jjw+fFxcPzo/fFxcLlxcP3xcXCtcXCt8LS18Wy0rKi89PD5dPT98WyFefl18XFxiKD86YW5kfGFzfGJhbmR8Ym9yfGJ4b3J8Y29tcHxpc3xpc25vdHxtb2R8b3IpXFxiPT8vLFxuXHQnYW5ub3RhdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvQCg/Olxcdys6KT8oPzpcXHcrfFxcW1teXFxdXStcXF0pPy8sXG5cdFx0YWxpYXM6ICdidWlsdGluJ1xuXHR9XG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjb25jdXJuYXMnLCAnbGFuZ2V4dCcsIHtcblx0J3JlZ2V4LWxpdGVyYWwnOiB7XG5cdFx0cGF0dGVybjogL1xcYnIoXCJ8JykoPzpcXFxcLnwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFteXFxcXF0pKD86XFxcXHsyfSkqKVxceyg/Oltee31dfFxceyg/Oltee31dfFxce1tefV0qXFx9KSpcXH0pK1xcfS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmNvbmN1cm5hc1xuXHRcdFx0fSxcblx0XHRcdCdyZWdleCc6IC9bXFxzXFxTXSsvXG5cdFx0fVxuXHR9LFxuXHQnc3RyaW5nLWxpdGVyYWwnOiB7XG5cdFx0cGF0dGVybjogLyg/OlxcQnxcXGJzKShcInwnKSg/OlxcXFwufCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W15cXFxcXSkoPzpcXFxcezJ9KSopXFx7KD86W157fV18XFx7KD86W157fV18XFx7W159XSpcXH0pKlxcfSkrXFx9Lyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuY29uY3VybmFzXG5cdFx0XHR9LFxuXHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0fVxuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmNvbmMgPSBQcmlzbS5sYW5ndWFnZXMuY29uY3VybmFzO1xuXG4vKipcbiAqIE9yaWdpbmFsIGJ5IFNjb3R0IEhlbG1lLlxuICpcbiAqIFJlZmVyZW5jZTogaHR0cHM6Ly9zY290dGhlbG1lLmNvLnVrL2NzcC1jaGVhdC1zaGVldC9cbiAqXG4gKiBTdXBwb3J0cyB0aGUgZm9sbG93aW5nOlxuICogIC0gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUDEvXG4gKiAgLSBodHRwczovL3d3dy53My5vcmcvVFIvQ1NQMi9cbiAqICAtIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1AzL1xuICovXG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVxuXHQgKiBAcmV0dXJucyB7UmVnRXhwfVxuXHQgKi9cblx0ZnVuY3Rpb24gdmFsdWUoc291cmNlKSB7XG5cdFx0cmV0dXJuIFJlZ0V4cCgvKFsgXFx0XSkvLnNvdXJjZSArICcoPzonICsgc291cmNlICsgJyknICsgLyg/PVtcXHM7XXwkKS8uc291cmNlLCAnaScpO1xuXHR9XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmNzcCA9IHtcblx0XHQnZGlyZWN0aXZlJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFtcXHM7XSkoPzpiYXNlLXVyaXxibG9jay1hbGwtbWl4ZWQtY29udGVudHwoPzpjaGlsZHxjb25uZWN0fGRlZmF1bHR8Zm9udHxmcmFtZXxpbWd8bWFuaWZlc3R8bWVkaWF8b2JqZWN0fHByZWZldGNofHNjcmlwdHxzdHlsZXx3b3JrZXIpLXNyY3xkaXNvd24tb3BlbmVyfGZvcm0tYWN0aW9ufGZyYW1lLSg/OmFuY2VzdG9yc3xvcHRpb25zKXxpbnB1dC1wcm90ZWN0aW9uKD86LSg/OmNsaXB8c2VsZWN0b3JzKSk/fG5hdmlnYXRlLXRvfHBsdWdpbi10eXBlc3xwb2xpY3ktdXJpfHJlZmVycmVyfHJlZmxlY3RlZC14c3N8cmVwb3J0LSg/OnRvfHVyaSl8cmVxdWlyZS1zcmktZm9yfHNhbmRib3h8KD86c2NyaXB0fHN0eWxlKS1zcmMtKD86YXR0cnxlbGVtKXx1cGdyYWRlLWluc2VjdXJlLXJlcXVlc3RzKSg/PVtcXHM7XXwkKS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncHJvcGVydHknXG5cdFx0fSxcblx0XHQnc2NoZW1lJzoge1xuXHRcdFx0cGF0dGVybjogdmFsdWUoL1thLXpdW2EtejAtOS4rLV0qOi8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdub25lJzoge1xuXHRcdFx0cGF0dGVybjogdmFsdWUoLydub25lJy8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fSxcblx0XHQnbm9uY2UnOiB7XG5cdFx0XHRwYXR0ZXJuOiB2YWx1ZSgvJ25vbmNlLVstKy9cXHc9XSsnLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHRcdH0sXG5cdFx0J2hhc2gnOiB7XG5cdFx0XHRwYXR0ZXJuOiB2YWx1ZSgvJ3NoYSg/OjI1NnwzODR8NTEyKS1bLSsvXFx3PV0rJy8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ251bWJlcidcblx0XHR9LFxuXHRcdCdob3N0Jzoge1xuXHRcdFx0cGF0dGVybjogdmFsdWUoXG5cdFx0XHRcdC9bYS16XVthLXowLTkuKy1dKjpcXC9cXC9bXlxcczssJ10qLy5zb3VyY2UgK1xuXHRcdFx0XHQnfCcgK1xuXHRcdFx0XHQvXFwqW15cXHM7LCddKi8uc291cmNlICtcblx0XHRcdFx0J3wnICtcblx0XHRcdFx0L1thLXowLTktXSsoPzpcXC5bYS16MC05LV0rKSsoPzo6W1xcZCpdKyk/KD86XFwvW15cXHM7LCddKik/Ly5zb3VyY2Vcblx0XHRcdCksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICd1cmwnLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdpbXBvcnRhbnQnOiAvXFwqL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IHZhbHVlKC8ndW5zYWZlLVthLXotXSsnLy5zb3VyY2UpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ3Vuc2FmZSdcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IHZhbHVlKC8nW2Etei1dKycvLnNvdXJjZSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnc2FmZSdcblx0XHRcdH0sXG5cdFx0XSxcblx0XHQncHVuY3R1YXRpb24nOiAvOy9cblx0fTtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0Ly8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jb29rbGFuZy9zcGVjL2Jsb2IvbWFpbi9FQk5GLm1kXG5cblx0dmFyIHNpbmdsZV90b2tlbl9zdWZmaXggPSAvKD86KD8hXFxzKVtcXGQkKzw9YS16QS1aXFx4ODAtXFx1RkZGRl0pKy8uc291cmNlO1xuXHR2YXIgbXVsdGlfdG9rZW5faW5maXggPSAvW157fUAjXSsvLnNvdXJjZTtcblx0dmFyIG11bHRpX3Rva2VuX3N1ZmZpeCA9IC9cXHtbXn0jQF0qXFx9Ly5zb3VyY2U7XG5cblx0dmFyIG11bHRpX3Rva2VuID0gbXVsdGlfdG9rZW5faW5maXggKyBtdWx0aV90b2tlbl9zdWZmaXg7XG5cblx0dmFyIHRpbWVyX3VuaXRzID0gLyg/Omh8aG91cnN8aHJzfG18bWlufG1pbnV0ZXMpLy5zb3VyY2U7XG5cblx0dmFyIGFtb3VudF9ncm91cF9pbXBsID0ge1xuXHRcdHBhdHRlcm46IC9cXHtbXnt9XSpcXH0vLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2Ftb3VudCc6IHtcblx0XHRcdFx0cGF0dGVybjogLyhbXFx7fF0pW157fXwqJV0rLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdudW1iZXInLFxuXHRcdFx0fSxcblx0XHRcdCd1bml0Jzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCUpW159XSsvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ3N5bWJvbCcsXG5cdFx0XHR9LFxuXHRcdFx0J3NlcnZpbmdzLXNjYWxlcic6IHtcblx0XHRcdFx0cGF0dGVybjogL1xcKi8sXG5cdFx0XHRcdGFsaWFzOiAnb3BlcmF0b3InLFxuXHRcdFx0fSxcblx0XHRcdCdzZXJ2aW5ncy1hbHRlcm5hdGl2ZS1zZXBhcmF0b3InOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9cXHwvLFxuXHRcdFx0XHRhbGlhczogJ29wZXJhdG9yJyxcblx0XHRcdH0sXG5cdFx0XHQndW5pdC1zZXBhcmF0b3InOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oPzolfChcXCopJSkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ29wZXJhdG9yJyxcblx0XHRcdH0sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvW3t9XS8sXG5cdFx0fVxuXHR9O1xuXG5cblx0UHJpc20ubGFuZ3VhZ2VzLmNvb2tsYW5nID0ge1xuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0Ly8gWy0gY29tbWVudCAtXVxuXHRcdFx0Ly8gLS0gY29tbWVudFxuXHRcdFx0cGF0dGVybjogL1xcWy1bXFxzXFxTXSo/LVxcXXwtLS4qLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHR9LFxuXHRcdCdtZXRhJzogeyAvLyA+PiBrZXk6IHZhbHVlXG5cdFx0XHRwYXR0ZXJuOiAvPj4uKjouKi8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3Byb3BlcnR5JzogeyAvLyBrZXk6XG5cdFx0XHRcdFx0cGF0dGVybjogLyg+PlxccyopW15cXHM6XSg/OlteOl0qW15cXHM6XSk/Lyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnY29va3dhcmUtZ3JvdXAnOiB7IC8vICMuLi57Li4ufSwgIy4uLlxuXHRcdFx0cGF0dGVybjogbmV3IFJlZ0V4cCgnIyg/Oidcblx0XHRcdFx0KyBtdWx0aV90b2tlblxuXHRcdFx0XHQrICd8J1xuXHRcdFx0XHQrIHNpbmdsZV90b2tlbl9zdWZmaXhcblx0XHRcdFx0KyAnKSdcblx0XHRcdCksXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2Nvb2t3YXJlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IG5ldyBSZWdFeHAoJyheIykoPzonXG5cdFx0XHRcdFx0XHQrIG11bHRpX3Rva2VuX2luZml4XG5cdFx0XHRcdFx0XHQrICcpJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ3ZhcmlhYmxlJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0J2Nvb2t3YXJlLWtleXdvcmQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14jLyxcblx0XHRcdFx0XHRhbGlhczogJ2tleXdvcmQnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQncXVhbnRpdHktZ3JvdXAnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogbmV3IFJlZ0V4cCgvXFx7W157fUAjXSpcXH0vKSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdxdWFudGl0eSc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogbmV3IFJlZ0V4cCgvKF5cXHspLy5zb3VyY2UgKyBtdWx0aV90b2tlbl9pbmZpeCksXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGFsaWFzOiAnbnVtYmVyJyxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvW3t9XS8sXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0J2luZ3JlZGllbnQtZ3JvdXAnOiB7IC8vIEAuLi57Li4ufSwgQC4uLlxuXHRcdFx0cGF0dGVybjogbmV3IFJlZ0V4cCgnQCg/Oidcblx0XHRcdFx0KyBtdWx0aV90b2tlblxuXHRcdFx0XHQrICd8J1xuXHRcdFx0XHQrIHNpbmdsZV90b2tlbl9zdWZmaXhcblx0XHRcdFx0KyAnKScpLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdpbmdyZWRpZW50Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IG5ldyBSZWdFeHAoJyheQCkoPzonXG5cdFx0XHRcdFx0XHQrIG11bHRpX3Rva2VuX2luZml4XG5cdFx0XHRcdFx0XHQrICcpJyksXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ3ZhcmlhYmxlJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0J2luZ3JlZGllbnQta2V5d29yZCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXkAvLFxuXHRcdFx0XHRcdGFsaWFzOiAna2V5d29yZCcsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdhbW91bnQtZ3JvdXAnOiBhbW91bnRfZ3JvdXBfaW1wbCxcblx0XHRcdH1cblx0XHR9LFxuXHRcdCd0aW1lci1ncm91cCc6IHsgLy8gfnRpbWVyey4uLn1cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvc29ydC1hbHRlcm5hdGl2ZXNcblx0XHRcdHBhdHRlcm46IC9+KD8hXFxzKVteQCN+e31dKlxce1tee31dKlxcfS8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3RpbWVyJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXn4pW157XSsvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICd2YXJpYWJsZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdkdXJhdGlvbi1ncm91cCc6IHsgLy8gey4uLn1cblx0XHRcdFx0XHRwYXR0ZXJuOiAvXFx7W157fV0qXFx9Lyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9be31dLyxcblx0XHRcdFx0XHRcdCd1bml0Jzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiBuZXcgUmVnRXhwKC8oJVxccyopLy5zb3VyY2UgKyB0aW1lcl91bml0cyArIC9cXGIvLnNvdXJjZSksXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGFsaWFzOiAnc3ltYm9sJyxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQnb3BlcmF0b3InOiAvJS8sXG5cdFx0XHRcdFx0XHQnZHVyYXRpb24nOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9cXGQrLyxcblx0XHRcdFx0XHRcdFx0YWxpYXM6ICdudW1iZXInLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCd0aW1lci1rZXl3b3JkJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9efi8sXG5cdFx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJyxcblx0XHRcdFx0fSxcblx0XHRcdH1cblx0XHR9XG5cdH07XG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHQvLyBodHRwczovL2dpdGh1Yi5jb20vY29xL2NvcVxuXG5cdHZhciBjb21tZW50U291cmNlID0gL1xcKFxcKig/OlteKCpdfFxcKCg/IVxcKil8XFwqKD8hXFwpKXw8c2VsZj4pKlxcKlxcKS8uc291cmNlO1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IDI7IGkrKykge1xuXHRcdGNvbW1lbnRTb3VyY2UgPSBjb21tZW50U291cmNlLnJlcGxhY2UoLzxzZWxmPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBjb21tZW50U291cmNlOyB9KTtcblx0fVxuXHRjb21tZW50U291cmNlID0gY29tbWVudFNvdXJjZS5yZXBsYWNlKC88c2VsZj4vZywgJ1tdJyk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmNvcSA9IHtcblx0XHQnY29tbWVudCc6IFJlZ0V4cChjb21tZW50U291cmNlKSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL1wiKD86W15cIl18XCJcIikqXCIoPyFcIikvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnYXR0cmlidXRlJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHRcdFx0LyNcXFsoPzpbXlxcW1xcXShcIl18XCIoPzpbXlwiXXxcIlwiKSpcIig/IVwiKXxcXCgoPyFcXCopfDxjb21tZW50PikqXFxdLy5zb3VyY2Vcblx0XHRcdFx0XHRcdC5yZXBsYWNlKC88Y29tbWVudD4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gY29tbWVudFNvdXJjZTsgfSlcblx0XHRcdFx0KSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ2F0dHItbmFtZScsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdjb21tZW50JzogUmVnRXhwKGNvbW1lbnRTb3VyY2UpLFxuXHRcdFx0XHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXXxcIlwiKSpcIig/IVwiKS8sXG5cdFx0XHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0J29wZXJhdG9yJzogLz0vLFxuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eI1xcW3xcXF0kfFssKCldL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxiKD86Q3VtdWxhdGl2ZXxHbG9iYWx8TG9jYWx8TW9ub21vcnBoaWN8Tm9uQ3VtdWxhdGl2ZXxQb2x5bW9ycGhpY3xQcml2YXRlfFByb2dyYW0pXFxiLyxcblx0XHRcdFx0YWxpYXM6ICdhdHRyLW5hbWUnXG5cdFx0XHR9XG5cdFx0XSxcblxuXHRcdCdrZXl3b3JkJzogL1xcYig/OkFib3J0fEFib3V0fEFkZHxBZG1pdHxBZG1pdHRlZHxBbGx8QXJndW1lbnRzfEFzfEFzc3VtcHRpb25zfEF4aW9tfEF4aW9tc3xCYWNrfEJhY2tUb3xCYWNrdHJhY2V8QmluT3B8QmluT3BTcGVjfEJpblJlbHxCaW5kfEJsYWNrbGlzdHxDYW5vbmljYWx8Q2FzZXxDZHxDaGVja3xDbGFzc3xDbGFzc2VzfENsb3NlfENvRml4cG9pbnR8Q29JbmR1Y3RpdmV8Q29lcmNpb258Q29lcmNpb25zfENvbGxlY3Rpb258Q29tYmluZWR8Q29tcHV0ZXxDb25qZWN0dXJlfENvbmplY3R1cmVzfENvbnN0YW50fENvbnN0YW50c3xDb25zdHJhaW50fENvbnN0cnVjdG9yc3xDb250ZXh0fENvcm9sbGFyeXxDcmVhdGV8Q3N0T3B8Q3VzdG9tfEN1dHxEZWJ1Z3xEZWNsYXJlfERlZmluZWR8RGVmaW5pdGlvbnxEZWxpbWl0fERlcGVuZGVuY2llc3xEZXBlbmRlbnR8RGVyaXZlfERpZmZzfERyb3B8RWxpbWluYXRpb258RW5kfEVudHJ5fEVxdWFsaXR5fEV2YWx8RXhhbXBsZXxFeGlzdGVudGlhbHxFeGlzdGVudGlhbHN8RXhpc3Rpbmd8RXhwb3J0fEV4dGVybnxFeHRyYWN0aW9ufEZhY3R8RmFpbHxGaWVsZHxGaWxlfEZpcnN0b3JkZXJ8Rml4cG9pbnR8RmxhZ3N8Rm9jdXN8RnJvbXxGdW5jbGFzc3xGdW5jdGlvbnxGdW5jdGlvbmFsfEdDfEdlbmVyYWxpemFibGV8R29hbHxHcmFifEdyYW1tYXJ8R3JhcGh8R3VhcmRlZHxIYXNrZWxsfEhlYXB8SGlkZXxIaW50fEhpbnREYnxIaW50c3xIeXBvdGhlc2VzfEh5cG90aGVzaXN8SUZ8SWRlbnRpdHl8SW1tZWRpYXRlfEltcGxpY2l0fEltcGxpY2l0c3xJbXBvcnR8SW5jbHVkZXxJbmR1Y3Rpb258SW5kdWN0aXZlfEluZml4fEluZm98SW5pdGlhbHxJbmpUeXB8SW5saW5lfEluc3BlY3R8SW5zdGFuY2V8SW5zdGFuY2VzfEludHJvfEludHJvc3xJbnZlcnNpb258SW52ZXJzaW9uX2NsZWFyfEpTT058TGFuZ3VhZ2V8TGVmdHxMZW1tYXxMZXR8TGlhfExpYnJhcmllc3xMaWJyYXJ5fExvYWR8TG9hZFBhdGh8TG9jYXRlfEx0YWN8THRhYzJ8TUx8TWF0Y2h8TWV0aG9kfE1pbmltYWxpdHl8TW9kdWxlfE1vZHVsZXN8TW9ycGhpc218TmV4dHxOb0lubGluZXxOb3RhdGlvbnxOdW1iZXJ8T0NhbWx8T2JsaWdhdGlvbnxPYmxpZ2F0aW9uc3xPcGFxdWV8T3BlbnxPcHRpbWl6ZXxQYXJhbWV0ZXJ8UGFyYW1ldGVyc3xQYXJhbWV0cmljfFBhdGh8UGF0aHN8UHJlbmV4fFByZXRlcm18UHJpbWl0aXZlfFByaW50fFByb2ZpbGV8UHJvamVjdGlvbnN8UHJvb2Z8UHJvcHxQcm9wQmluT3B8UHJvcE9wfFByb3BVT3B8UHJvcGVydHl8UHJvcG9zaXRpb258UHdkfFFlZHxRdWl0fFJlY3xSZWNvcmR8UmVjdXJzaXZlfFJlZGlyZWN0fFJlZHVjdGlvbnxSZWdpc3RlcnxSZWxhdGlvbnxSZW1hcmt8UmVtb3ZlfFJlcXVpcmV8UmVzZXJ2ZWR8UmVzZXR8UmVzb2x2ZXxSZXN0YXJ0fFJld3JpdGV8UmlnaHR8UmluZ3xSaW5nc3xTUHJvcHxTYXR1cmF0ZXxTYXZlfFNjaGVtZXxTY29wZXxTY29wZXN8U2VhcmNofFNlYXJjaEhlYWR8U2VhcmNoUGF0dGVybnxTZWFyY2hSZXdyaXRlfFNlY3Rpb258U2VwYXJhdGV8U2V0fFNldG9pZHxTaG93fFNpZ25hdHVyZXN8U29sdmV8U29sdmVyfFNvcnR8U29ydGNsYXNzfFNvcnRlZHxTcGVjfFN0ZXB8U3RyYXRlZ2llc3xTdHJhdGVneXxTdHJpbmd8U3RydWN0dXJlfFN1YkNsYXNzfFN1YmdyYXBofFN1Y2hUaGF0fFRhY3RpY3xUZXJtfFRlc3RDb21waWxlfFRoZW9yZW18VGltZXxUaW1lb3V0fFRvfFRyYW5zcGFyZW50fFR5cGV8VHlwZWNsYXNzZXN8VHlwZXN8VHlwaW5nfFVuT3B8VW5PcFNwZWN8VW5kZWxpbWl0fFVuZG98VW5mb2N1c3xVbmZvY3VzZWR8VW5mb2xkfFVuaXZlcnNlfFVuaXZlcnNlc3xVbnNoZWx2ZXxWYXJpYWJsZXxWYXJpYWJsZXN8VmFyaWFudHxWZXJib3NlfFZpZXd8VmlzaWJpbGl0eXxaaWZ5fF98YXBwbHl8YXN8YXR8Ynl8Y29maXh8ZWxzZXxlbmR8ZXhpc3RzfGV4aXN0czJ8Zml4fGZvcnxmb3JhbGx8ZnVufGlmfGlufGxldHxtYXRjaHxtZWFzdXJlfG1vdmV8cmVtb3ZlZHxyZXR1cm58c3RydWN0fHRoZW58dXNpbmd8d2Z8d2hlcmV8d2l0aClcXGIvLFxuXG5cdFx0J251bWJlcic6IC9cXGIoPzoweFthLWYwLTldW2EtZjAtOV9dKig/OlxcLlthLWYwLTlfXSspPyg/OnBbKy1dP1xcZFtcXGRfXSopP3xcXGRbXFxkX10qKD86XFwuW1xcZF9dKyk/KD86ZVsrLV0/XFxkW1xcZF9dKik/KVxcYi9pLFxuXG5cdFx0J3B1bmN0Jzoge1xuXHRcdFx0cGF0dGVybjogL0BcXHt8XFx7XFx8fFxcWz18Oj4vLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXHRcdCdvcGVyYXRvcic6IC9cXC9cXFxcfFxcXFxcXC98XFwuezIsM318OnsxLDJ9PXxcXCpcXCp8Wy09XT58PCg/Oi0+P3xbKzo9Pl18PDopfD4oPzo9fC0+KXxcXHxbLXxdP3xbLSElJiorLzw9Pj9AXn4nXS8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1xcLlxcKHxgXFwofEBcXHt8YFxce3xcXHtcXHx8XFxbPXw6PnxbOi4sOygpe31cXFtcXF1dL1xuXHR9O1xuXG59KFByaXNtKSk7XG5cbi8qKlxuICogT3JpZ2luYWwgYnkgU2FtdWVsIEZsb3Jlc1xuICpcbiAqIEFkZHMgdGhlIGZvbGxvd2luZyBuZXcgdG9rZW4gY2xhc3NlczpcbiAqICAgICBjb25zdGFudCwgYnVpbHRpbiwgdmFyaWFibGUsIHN5bWJvbCwgcmVnZXhcbiAqL1xuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHRQcmlzbS5sYW5ndWFnZXMucnVieSA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogLyMuKnxePWJlZ2luXFxzW1xcc1xcU10qP149ZW5kL20sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdjbGFzcy1uYW1lJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXGIoPzpjbGFzc3xtb2R1bGUpXFxzK3xcXGJjYXRjaFxccytcXCgpW1xcdy5cXFxcXSt8XFxiW0EtWl9dXFx3Kig/PVxccypcXC5cXHMqbmV3XFxiKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bLlxcXFxdL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiAvXFxiKD86QkVHSU58RU5EfGFsaWFzfGFuZHxiZWdpbnxicmVha3xjYXNlfGNsYXNzfGRlZnxkZWZpbmVfbWV0aG9kfGRlZmluZWR8ZG98ZWFjaHxlbHNlfGVsc2lmfGVuZHxlbnN1cmV8ZXh0ZW5kfGZvcnxpZnxpbnxpbmNsdWRlfG1vZHVsZXxuZXd8bmV4dHxuaWx8bm90fG9yfHByZXBlbmR8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJhaXNlfHJlZG98cmVxdWlyZXxyZXNjdWV8cmV0cnl8cmV0dXJufHNlbGZ8c3VwZXJ8dGhlbnx0aHJvd3x1bmRlZnx1bmxlc3N8dW50aWx8d2hlbnx3aGlsZXx5aWVsZClcXGIvLFxuXHRcdCdvcGVyYXRvcic6IC9cXC57MiwzfXwmXFwufD09PXw8Pz0+fFshPV0/fnwoPzomJnxcXHxcXHx8PDx8Pj58XFwqXFwqfFsrXFwtKi8lPD4hXiZ8PV0pPT98Wz86XS8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1soKXt9W1xcXS4sO10vLFxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdydWJ5JywgJ29wZXJhdG9yJywge1xuXHRcdCdkb3VibGUtY29sb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvOjovLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXHR9KTtcblxuXHR2YXIgaW50ZXJwb2xhdGlvbiA9IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58W15cXFxcXSkoPzpcXFxcezJ9KSopI1xceyg/Oltee31dfFxce1tee31dKlxcfSkqXFx9Lyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2NvbnRlbnQnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eKCNcXHspW1xcc1xcU10rKD89XFx9JCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5ydWJ5XG5cdFx0XHR9LFxuXHRcdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdFx0cGF0dGVybjogL14jXFx7fFxcfSQvLFxuXHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHRkZWxldGUgUHJpc20ubGFuZ3VhZ2VzLnJ1YnkuZnVuY3Rpb247XG5cblx0dmFyIHBlcmNlbnRFeHByZXNzaW9uID0gJyg/OicgKyBbXG5cdFx0LyhbXmEtekEtWjAtOVxcc3soXFxbPD1dKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFxbXFxzXFxTXSkqXFwxLy5zb3VyY2UsXG5cdFx0L1xcKCg/OlteKClcXFxcXXxcXFxcW1xcc1xcU118XFwoKD86W14oKVxcXFxdfFxcXFxbXFxzXFxTXSkqXFwpKSpcXCkvLnNvdXJjZSxcblx0XHQvXFx7KD86W157fVxcXFxdfFxcXFxbXFxzXFxTXXxcXHsoPzpbXnt9XFxcXF18XFxcXFtcXHNcXFNdKSpcXH0pKlxcfS8uc291cmNlLFxuXHRcdC9cXFsoPzpbXlxcW1xcXVxcXFxdfFxcXFxbXFxzXFxTXXxcXFsoPzpbXlxcW1xcXVxcXFxdfFxcXFxbXFxzXFxTXSkqXFxdKSpcXF0vLnNvdXJjZSxcblx0XHQvPCg/OltePD5cXFxcXXxcXFxcW1xcc1xcU118PCg/OltePD5cXFxcXXxcXFxcW1xcc1xcU10pKj4pKj4vLnNvdXJjZVxuXHRdLmpvaW4oJ3wnKSArICcpJztcblxuXHR2YXIgc3ltYm9sTmFtZSA9IC8oPzpcIig/OlxcXFwufFteXCJcXFxcXFxyXFxuXSkqXCJ8KD86XFxiW2EtekEtWl9dXFx3KnxbXlxcc1xcMC1cXHg3Rl0rKVs/IV0/fFxcJC4pLy5zb3VyY2U7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgncnVieScsICdrZXl3b3JkJywge1xuXHRcdCdyZWdleC1saXRlcmFsJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyVyLy5zb3VyY2UgKyBwZXJjZW50RXhwcmVzc2lvbiArIC9bZWdpbW5vc3V4XXswLDZ9Ly5zb3VyY2UpLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzogaW50ZXJwb2xhdGlvbixcblx0XHRcdFx0XHQncmVnZXgnOiAvW1xcc1xcU10rL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W14vXSlcXC8oPyFcXC8pKD86XFxbW15cXHJcXG5cXF1dK1xcXXxcXFxcLnxbXlsvXFxcXFxcclxcbl0pK1xcL1tlZ2ltbm9zdXhdezAsNn0oPz1cXHMqKD86JHxbXFxyXFxuLC47fSkjXSkpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IGludGVycG9sYXRpb24sXG5cdFx0XHRcdFx0J3JlZ2V4JzogL1tcXHNcXFNdKy9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J3ZhcmlhYmxlJzogL1tAJF0rW2EtekEtWl9dXFx3Kig/Ols/IV18XFxiKS8sXG5cdFx0J3N5bWJvbCc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXnxbXjpdKTovLnNvdXJjZSArIHN5bWJvbE5hbWUpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKFtcXHJcXG57KCxdWyBcXHRdKikvLnNvdXJjZSArIHN5bWJvbE5hbWUgKyAvKD89Oig/ITopKS8uc291cmNlKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdF0sXG5cdFx0J21ldGhvZC1kZWZpbml0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXGJkZWZcXHMrKVxcdysoPzpcXHMqXFwuXFxzKlxcdyspPy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdmdW5jdGlvbic6IC9cXGJcXHcrJC8sXG5cdFx0XHRcdCdrZXl3b3JkJzogL15zZWxmXFxiLyxcblx0XHRcdFx0J2NsYXNzLW5hbWUnOiAvXlxcdysvLFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgncnVieScsICdzdHJpbmcnLCB7XG5cdFx0J3N0cmluZy1saXRlcmFsJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyVbcVFpSXdXc10/Ly5zb3VyY2UgKyBwZXJjZW50RXhwcmVzc2lvbiksXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2ludGVycG9sYXRpb24nOiBpbnRlcnBvbGF0aW9uLFxuXHRcdFx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFwifCcpKD86I1xce1tefV0rXFx9fCMoPyFcXHspfFxcXFwoPzpcXHJcXG58W1xcc1xcU10pfCg/IVxcMSlbXlxcXFwjXFxyXFxuXSkqXFwxLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IGludGVycG9sYXRpb24sXG5cdFx0XHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC88PFstfl0/KFthLXpfXVxcdyopW1xcclxcbl0oPzouKltcXHJcXG5dKSo/W1xcdCBdKlxcMS9pLFxuXHRcdFx0XHRhbGlhczogJ2hlcmVkb2Mtc3RyaW5nJyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL148PFstfl0/W2Etel9dXFx3KnxcXGJbYS16X11cXHcqJC9pLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdCdzeW1ib2wnOiAvXFxiXFx3Ky8sXG5cdFx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9ePDxbLX5dPy9cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzogaW50ZXJwb2xhdGlvbixcblx0XHRcdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLzw8Wy1+XT8nKFthLXpfXVxcdyopJ1tcXHJcXG5dKD86LipbXFxyXFxuXSkqP1tcXHQgXSpcXDEvaSxcblx0XHRcdFx0YWxpYXM6ICdoZXJlZG9jLXN0cmluZycsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9ePDxbLX5dPydbYS16X11cXHcqJ3xcXGJbYS16X11cXHcqJC9pLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdCdzeW1ib2wnOiAvXFxiXFx3Ky8sXG5cdFx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9ePDxbLX5dPyd8JyQvLFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXHRcdCdjb21tYW5kLWxpdGVyYWwnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvJXgvLnNvdXJjZSArIHBlcmNlbnRFeHByZXNzaW9uKSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IGludGVycG9sYXRpb24sXG5cdFx0XHRcdFx0J2NvbW1hbmQnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0XHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL2AoPzojXFx7W159XStcXH18Iyg/IVxceyl8XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8W15cXFxcYCNcXHJcXG5dKSpgLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IGludGVycG9sYXRpb24sXG5cdFx0XHRcdFx0J2NvbW1hbmQnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0XHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF1cblx0fSk7XG5cblx0ZGVsZXRlIFByaXNtLmxhbmd1YWdlcy5ydWJ5LnN0cmluZztcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdydWJ5JywgJ251bWJlcicsIHtcblx0XHQnYnVpbHRpbic6IC9cXGIoPzpBcnJheXxCaWdudW18QmluZGluZ3xDbGFzc3xDb250aW51YXRpb258RGlyfEV4Y2VwdGlvbnxGYWxzZUNsYXNzfEZpbGV8Rml4bnVtfEZsb2F0fEhhc2h8SU98SW50ZWdlcnxNYXRjaERhdGF8TWV0aG9kfE1vZHVsZXxOaWxDbGFzc3xOdW1lcmljfE9iamVjdHxQcm9jfFJhbmdlfFJlZ2V4cHxTdGF0fFN0cmluZ3xTdHJ1Y3R8U3ltYm9sfFRNU3xUaHJlYWR8VGhyZWFkR3JvdXB8VGltZXxUcnVlQ2xhc3MpXFxiLyxcblx0XHQnY29uc3RhbnQnOiAvXFxiW0EtWl1bQS1aMC05X10qKD86Wz8hXXxcXGIpL1xuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMucmIgPSBQcmlzbS5sYW5ndWFnZXMucnVieTtcbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHRQcmlzbS5sYW5ndWFnZXMuY3J5c3RhbCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ3J1YnknLCB7XG5cdFx0J2tleXdvcmQnOiBbXG5cdFx0XHQvXFxiKD86X19ESVJfX3xfX0VORF9MSU5FX198X19GSUxFX198X19MSU5FX198YWJzdHJhY3R8YWxpYXN8YW5ub3RhdGlvbnxhc3xhc218YmVnaW58YnJlYWt8Y2FzZXxjbGFzc3xkZWZ8ZG98ZWxzZXxlbHNpZnxlbmR8ZW5zdXJlfGVudW18ZXh0ZW5kfGZvcnxmdW58aWZ8aWZkZWZ8aW5jbHVkZXxpbnN0YW5jZV9zaXplb2Z8bGlifG1hY3JvfG1vZHVsZXxuZXh0fG9mfG91dHxwb2ludGVyb2Z8cHJpdmF0ZXxwcm90ZWN0ZWR8cHRyfHJlcXVpcmV8cmVzY3VlfHJldHVybnxzZWxlY3R8c2VsZnxzaXplb2Z8c3RydWN0fHN1cGVyfHRoZW58dHlwZXx0eXBlb2Z8dW5kZWZ8dW5pbml0aWFsaXplZHx1bmlvbnx1bmxlc3N8dW50aWx8d2hlbnx3aGlsZXx3aXRofHlpZWxkKVxcYi8sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFwuXFxzKikoPzppc19hfHJlc3BvbmRzX3RvKVxcPy8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdudW1iZXInOiAvXFxiKD86MGJbMDFfXSpbMDFdfDBvWzAtN19dKlswLTddfDB4W1xcZGEtZkEtRl9dKltcXGRhLWZBLUZdfCg/OlxcZCg/OltcXGRfXSpcXGQpPykoPzpcXC5bXFxkX10qXFxkKT8oPzpbZUVdWystXT9bXFxkX10qXFxkKT8pKD86Xyg/Olt1aWZdKD86OHwxNnwzMnw2NCkpPyk/XFxiLyxcblx0XHQnb3BlcmF0b3InOiBbXG5cdFx0XHQvLT4vLFxuXHRcdFx0UHJpc20ubGFuZ3VhZ2VzLnJ1Ynkub3BlcmF0b3IsXG5cdFx0XSxcblx0XHQncHVuY3R1YXRpb24nOiAvWygpe31bXFxdLiw7XFxcXF0vLFxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjcnlzdGFsJywgJ3N0cmluZy1saXRlcmFsJywge1xuXHRcdCdhdHRyaWJ1dGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvQFxcWy4qP1xcXS8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXkBcXFt8XFxdJC8sXG5cdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0fSxcblx0XHRcdFx0J2F0dHJpYnV0ZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXihcXHMqKVxcdysvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnYXJncyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxTKD86W1xcc1xcU10qXFxTKT8vLFxuXHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmNyeXN0YWxcblx0XHRcdFx0fSxcblx0XHRcdH1cblx0XHR9LFxuXHRcdCdleHBhbnNpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFx7KD86XFx7Lio/XFx9fCUuKj8lKVxcfS8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2NvbnRlbnQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14oXFx7LilbXFxzXFxTXSsoPz0uXFx9JCkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuY3J5c3RhbFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eXFx7W1xceyVdfFtcXH0lXVxcfSQvLFxuXHRcdFx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdjaGFyJzoge1xuXHRcdFx0cGF0dGVybjogLycoPzpbXlxcXFxcXHJcXG5dezEsMn18XFxcXCg/Oi58dSg/OltBLUZhLWYwLTldezEsNH18XFx7W0EtRmEtZjAtOV17MSw2fVxcfSkpKScvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHR9KTtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIHN0cmluZyA9IC8oXCJ8JykoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLztcblx0dmFyIHNlbGVjdG9ySW5zaWRlO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5jc3Muc2VsZWN0b3IgPSB7XG5cdFx0cGF0dGVybjogUHJpc20ubGFuZ3VhZ2VzLmNzcy5zZWxlY3Rvci5wYXR0ZXJuLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiBzZWxlY3Rvckluc2lkZSA9IHtcblx0XHRcdCdwc2V1ZG8tZWxlbWVudCc6IC86KD86YWZ0ZXJ8YmVmb3JlfGZpcnN0LWxldHRlcnxmaXJzdC1saW5lfHNlbGVjdGlvbil8OjpbLVxcd10rLyxcblx0XHRcdCdwc2V1ZG8tY2xhc3MnOiAvOlstXFx3XSsvLFxuXHRcdFx0J2NsYXNzJzogL1xcLlstXFx3XSsvLFxuXHRcdFx0J2lkJzogLyNbLVxcd10rLyxcblx0XHRcdCdhdHRyaWJ1dGUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnXFxcXFsoPzpbXltcXFxcXVwiXFwnXXwnICsgc3RyaW5nLnNvdXJjZSArICcpKlxcXFxdJyksXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXFt8XFxdJC8sXG5cdFx0XHRcdFx0J2Nhc2Utc2Vuc2l0aXZpdHknOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKFxccylbc2ldJC9pLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCduYW1lc3BhY2UnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXihcXHMqKSg/Oig/IVxccylbLSpcXHdcXHhBMC1cXHVGRkZGXSkqXFx8KD8hPSkvLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFx8JC9cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdhdHRyLW5hbWUnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXihcXHMqKSg/Oig/IVxccylbLVxcd1xceEEwLVxcdUZGRkZdKSsvLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J2F0dHItdmFsdWUnOiBbXG5cdFx0XHRcdFx0XHRzdHJpbmcsXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8oPVxccyopKD86KD8hXFxzKVstXFx3XFx4QTAtXFx1RkZGRl0pKyg/PVxccyokKS8sXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdCdvcGVyYXRvcic6IC9bfH4qXiRdPz0vXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnbi10aCc6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXFwoXFxzKilbKy1dP1xcZCpbXFxkbl0oPzpcXHMqWystXVxccypcXGQrKT8oPz1cXHMqXFwpKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdudW1iZXInOiAvW1xcZG5dKy8sXG5cdFx0XHRcdFx0XHQnb3BlcmF0b3InOiAvWystXS9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKFxcKFxccyopKD86ZXZlbnxvZGQpKD89XFxzKlxcKSkvaSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH1cblx0XHRcdF0sXG5cdFx0XHQnY29tYmluYXRvcic6IC8+fFxcK3x+fFxcfFxcfC8sXG5cblx0XHRcdC8vIHRoZSBgdGFnYCB0b2tlbiBoYXMgYmVlbiBleGlzdGVkIGFuZCByZW1vdmVkLlxuXHRcdFx0Ly8gYmVjYXVzZSB3ZSBjYW4ndCBmaW5kIGEgcGVyZmVjdCB0b2tlbml6ZSB0byBtYXRjaCBpdC5cblx0XHRcdC8vIGlmIHlvdSB3YW50IHRvIGFkZCBpdCwgcGxlYXNlIHJlYWQgaHR0cHM6Ly9naXRodWIuY29tL1ByaXNtSlMvcHJpc20vcHVsbC8yMzczIGZpcnN0LlxuXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvWygpLF0vLFxuXHRcdH1cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuY3NzWydhdHJ1bGUnXS5pbnNpZGVbJ3NlbGVjdG9yLWZ1bmN0aW9uLWFyZ3VtZW50J10uaW5zaWRlID0gc2VsZWN0b3JJbnNpZGU7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnY3NzJywgJ3Byb3BlcnR5Jywge1xuXHRcdCd2YXJpYWJsZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXi1cXHdcXHhBMC1cXHVGRkZGXSktLSg/IVxccylbLV9hLXpcXHhBMC1cXHVGRkZGXSg/Oig/IVxccylbLVxcd1xceEEwLVxcdUZGRkZdKSovaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdH0pO1xuXG5cdHZhciB1bml0ID0ge1xuXHRcdHBhdHRlcm46IC8oXFxiXFxkKykoPzolfFthLXpdKyg/IVtcXHctXSkpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH07XG5cdC8vIDEyMyAtMTIzIC4xMjMgLS4xMjMgMTIuMyAtMTIuM1xuXHR2YXIgbnVtYmVyID0ge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcdy4tXSktPyg/OlxcZCsoPzpcXC5cXGQrKT98XFwuXFxkKykvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjc3MnLCAnZnVuY3Rpb24nLCB7XG5cdFx0J29wZXJhdG9yJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXHMpWytcXC0qXFwvXSg/PVxccykvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0Ly8gQ0FSRUZVTCFcblx0XHQvLyBQcmV2aWV3ZXJzIGFuZCBJbmxpbmUgY29sb3IgdXNlIGhleGNvZGUgYW5kIGNvbG9yLlxuXHRcdCdoZXhjb2RlJzoge1xuXHRcdFx0cGF0dGVybjogL1xcQiNbXFxkYS1mXXszLDh9XFxiL2ksXG5cdFx0XHRhbGlhczogJ2NvbG9yJ1xuXHRcdH0sXG5cdFx0J2NvbG9yJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXHctXSkoPzpBbGljZUJsdWV8QW50aXF1ZVdoaXRlfEFxdWF8QXF1YW1hcmluZXxBenVyZXxCZWlnZXxCaXNxdWV8QmxhY2t8QmxhbmNoZWRBbG1vbmR8Qmx1ZXxCbHVlVmlvbGV0fEJyb3dufEJ1cmx5V29vZHxDYWRldEJsdWV8Q2hhcnRyZXVzZXxDaG9jb2xhdGV8Q29yYWx8Q29ybmZsb3dlckJsdWV8Q29ybnNpbGt8Q3JpbXNvbnxDeWFufERhcmtCbHVlfERhcmtDeWFufERhcmtHb2xkZW5Sb2R8RGFya0dyW2FlXXl8RGFya0dyZWVufERhcmtLaGFraXxEYXJrTWFnZW50YXxEYXJrT2xpdmVHcmVlbnxEYXJrT3JhbmdlfERhcmtPcmNoaWR8RGFya1JlZHxEYXJrU2FsbW9ufERhcmtTZWFHcmVlbnxEYXJrU2xhdGVCbHVlfERhcmtTbGF0ZUdyW2FlXXl8RGFya1R1cnF1b2lzZXxEYXJrVmlvbGV0fERlZXBQaW5rfERlZXBTa3lCbHVlfERpbUdyW2FlXXl8RG9kZ2VyQmx1ZXxGaXJlQnJpY2t8RmxvcmFsV2hpdGV8Rm9yZXN0R3JlZW58RnVjaHNpYXxHYWluc2Jvcm98R2hvc3RXaGl0ZXxHb2xkfEdvbGRlblJvZHxHclthZV15fEdyZWVufEdyZWVuWWVsbG93fEhvbmV5RGV3fEhvdFBpbmt8SW5kaWFuUmVkfEluZGlnb3xJdm9yeXxLaGFraXxMYXZlbmRlcnxMYXZlbmRlckJsdXNofExhd25HcmVlbnxMZW1vbkNoaWZmb258TGlnaHRCbHVlfExpZ2h0Q29yYWx8TGlnaHRDeWFufExpZ2h0R29sZGVuUm9kWWVsbG93fExpZ2h0R3JbYWVdeXxMaWdodEdyZWVufExpZ2h0UGlua3xMaWdodFNhbG1vbnxMaWdodFNlYUdyZWVufExpZ2h0U2t5Qmx1ZXxMaWdodFNsYXRlR3JbYWVdeXxMaWdodFN0ZWVsQmx1ZXxMaWdodFllbGxvd3xMaW1lfExpbWVHcmVlbnxMaW5lbnxNYWdlbnRhfE1hcm9vbnxNZWRpdW1BcXVhTWFyaW5lfE1lZGl1bUJsdWV8TWVkaXVtT3JjaGlkfE1lZGl1bVB1cnBsZXxNZWRpdW1TZWFHcmVlbnxNZWRpdW1TbGF0ZUJsdWV8TWVkaXVtU3ByaW5nR3JlZW58TWVkaXVtVHVycXVvaXNlfE1lZGl1bVZpb2xldFJlZHxNaWRuaWdodEJsdWV8TWludENyZWFtfE1pc3R5Um9zZXxNb2NjYXNpbnxOYXZham9XaGl0ZXxOYXZ5fE9sZExhY2V8T2xpdmV8T2xpdmVEcmFifE9yYW5nZXxPcmFuZ2VSZWR8T3JjaGlkfFBhbGVHb2xkZW5Sb2R8UGFsZUdyZWVufFBhbGVUdXJxdW9pc2V8UGFsZVZpb2xldFJlZHxQYXBheWFXaGlwfFBlYWNoUHVmZnxQZXJ1fFBpbmt8UGx1bXxQb3dkZXJCbHVlfFB1cnBsZXxSZWJlY2NhUHVycGxlfFJlZHxSb3N5QnJvd258Um95YWxCbHVlfFNhZGRsZUJyb3dufFNhbG1vbnxTYW5keUJyb3dufFNlYUdyZWVufFNlYVNoZWxsfFNpZW5uYXxTaWx2ZXJ8U2t5Qmx1ZXxTbGF0ZUJsdWV8U2xhdGVHclthZV15fFNub3d8U3ByaW5nR3JlZW58U3RlZWxCbHVlfFRhbnxUZWFsfFRoaXN0bGV8VG9tYXRvfFRyYW5zcGFyZW50fFR1cnF1b2lzZXxWaW9sZXR8V2hlYXR8V2hpdGV8V2hpdGVTbW9rZXxZZWxsb3d8WWVsbG93R3JlZW4pKD8hW1xcdy1dKS9pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxiKD86aHNsfHJnYilcXChcXHMqXFxkezEsM31cXHMqLFxccypcXGR7MSwzfSU/XFxzKixcXHMqXFxkezEsM30lP1xccypcXClcXEJ8XFxiKD86aHNsfHJnYilhXFwoXFxzKlxcZHsxLDN9XFxzKixcXHMqXFxkezEsM30lP1xccyosXFxzKlxcZHsxLDN9JT9cXHMqLFxccyooPzowfDA/XFwuXFxkK3wxKVxccypcXClcXEIvaSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3VuaXQnOiB1bml0LFxuXHRcdFx0XHRcdCdudW1iZXInOiBudW1iZXIsXG5cdFx0XHRcdFx0J2Z1bmN0aW9uJzogL1tcXHctXSsoPz1cXCgpLyxcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWygpLF0vXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXHRcdC8vIGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlcmUgaXMgbm8gYm91bmRhcnkgYXNzZXJ0aW9uIGFmdGVyIHRoZSBoZXggZGlnaXRzXG5cdFx0J2VudGl0eSc6IC9cXFxcW1xcZGEtZl17MSw4fS9pLFxuXHRcdCd1bml0JzogdW5pdCxcblx0XHQnbnVtYmVyJzogbnVtYmVyXG5cdH0pO1xuXG59KFByaXNtKSk7XG5cbi8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0MTgwXG5cblByaXNtLmxhbmd1YWdlcy5jc3YgPSB7XG5cdCd2YWx1ZSc6IC9bXlxcclxcbixcIl0rfFwiKD86W15cIl18XCJcIikqXCIoPyFcIikvLFxuXHQncHVuY3R1YXRpb24nOiAvLC9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHQvLyBodHRwczovL2N1ZWxhbmcub3JnL2RvY3MvcmVmZXJlbmNlcy9zcGVjL1xuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvc3RyaWN0XG5cdHZhciBzdHJpbmdFc2NhcGUgPSAvXFxcXCg/Oig/IVxcMil8XFwyKD86W14oKVxcclxcbl18XFwoW14oKV0qXFwpKSkvLnNvdXJjZTtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9zdHJpY3Rcblx0dmFyIHN0cmluZ1R5cGVzID0gL1wiXCJcIig/OlteXFxcXFwiXXxcIig/IVwiXCJcXDIpfDxlc2M+KSpcIlwiXCIvLnNvdXJjZSArXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9zdHJpY3Rcblx0XHQnfCcgKyAvJycnKD86W15cXFxcJ118Jyg/IScnXFwyKXw8ZXNjPikqJycnLy5zb3VyY2UgK1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvc3RyaWN0XG5cdFx0J3wnICsgL1wiKD86W15cXFxcXFxyXFxuXCJdfFwiKD8hXFwyKXw8ZXNjPikqXCIvLnNvdXJjZSArXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9zdHJpY3Rcblx0XHQnfCcgKyAvJyg/OlteXFxcXFxcclxcbiddfCcoPyFcXDIpfDxlc2M+KSonLy5zb3VyY2U7XG5cdHZhciBzdHJpbmdMaXRlcmFsID0gJyg/OicgKyBzdHJpbmdUeXBlcy5yZXBsYWNlKC88ZXNjPi9nLCBzdHJpbmdFc2NhcGUpICsgJyknO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5jdWUgPSB7XG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwvXFwvLiovLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnc3RyaW5nLWxpdGVyYWwnOiB7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL3N0cmljdFxuXHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXnxbXiNcIidcXFxcXSkoIyopLy5zb3VyY2UgKyBzdHJpbmdMaXRlcmFsICsgLyg/IVtcIiddKVxcMi8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0Ly8gSSdtIHVzaW5nIGRpcnR5IGhhY2sgaGVyZS4gV2UgaGF2ZSB0byBrbm93IHRoZSBudW1iZXIgaGFzaGVzIGF0IHRoZSBzdGFydCBvZiB0aGUgc3RyaW5nIHNvbWVob3csXG5cdFx0XHRcdC8vIGJ1dCB3ZSBjYW4ndCBsb29rIGJhY2suIFNvIGluc3RlYWQsIHdlIHdpbGwgdXNlIGEgbG9va2FoZWFkLCBnbyB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIGFuZFxuXHRcdFx0XHQvLyBjYXB0dXJlIHRoZSBoYXNoZXMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLlxuXHRcdFx0XHQnZXNjYXBlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oPz1bXFxzXFxTXSpbXCInXSgjKikkKVxcXFxcXDEoPzpVW2EtZkEtRjAtOV17MSw4fXx1W2EtZkEtRjAtOV17MSw0fXx4W2EtZkEtRjAtOV17MSwyfXxcXGR7MiwzfXxbXihdKS8sXG5cdFx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKD89W1xcc1xcU10qW1wiJ10oIyopJClcXFxcXFwxXFwoW14oKV0qXFwpLyxcblx0XHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlxcXFwjKlxcKHxcXCkkLyxcblx0XHRcdFx0XHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0XHRcdFx0aW5zaWRlOiBudWxsXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0J2tleXdvcmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXHckXSkoPzpmb3J8aWZ8aW1wb3J0fGlufGxldHxudWxsfHBhY2thZ2UpKD8hW1xcdyRdKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnYm9vbGVhbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcdyRdKSg/OmZhbHNlfHRydWUpKD8hW1xcdyRdKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnYnVpbHRpbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcdyRdKSg/OmJvb2x8Ynl0ZXN8ZmxvYXR8ZmxvYXQoPzozMnw2NCl8dT9pbnQoPzo4fDE2fDMyfDY0fDEyOCk/fG51bWJlcnxydW5lfHN0cmluZykoPyFbXFx3JF0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXG5cdFx0J2F0dHJpYnV0ZSc6IHtcblx0XHRcdHBhdHRlcm46IC9AW1xcdyRdKyg/PVxccypcXCgpLyxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fSxcblx0XHQnZnVuY3Rpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXHckXSlbYS16XyRdW1xcdyRdKig/PVxccypcXCgpL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblxuXHRcdCdudW1iZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXHckLl0pKD86MGJbMDFdKyg/Ol9bMDFdKykqfDBvWzAtN10rKD86X1swLTddKykqfDBbeFhdWzAtOUEtRmEtZl0rKD86X1swLTlBLUZhLWZdKykqfCg/OlxcZCsoPzpfXFxkKykqKD86XFwuKD86XFxkKyg/Ol9cXGQrKSopPyk/fFxcLlxcZCsoPzpfXFxkKykqKSg/OltlRV1bKy1dP1xcZCsoPzpfXFxkKykqKT8oPzpbS01HVFBdaT8pPykoPyFbXFx3JF0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXG5cdFx0J29wZXJhdG9yJzogL1xcLnszfXxfXFx8X3wmJj98XFx8XFx8P3xbPSFdfnxbPD49IV09P3xbK1xcLSovP10vLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bKClbXFxde30sLjpdL1xuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5jdWVbJ3N0cmluZy1saXRlcmFsJ10uaW5zaWRlLmludGVycG9sYXRpb24uaW5zaWRlLmV4cHJlc3Npb24uaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLmN1ZTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuY3lwaGVyID0ge1xuXHQvLyBodHRwczovL25lbzRqLmNvbS9kb2NzL2N5cGhlci1tYW51YWwvY3VycmVudC9zeW50YXgvY29tbWVudHMvXG5cdCdjb21tZW50JzogL1xcL1xcLy4qLyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXFxcXFxcclxcbl18XFxcXC4pKlwifCcoPzpbXidcXFxcXFxyXFxuXXxcXFxcLikqJy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjbGFzcy1uYW1lJzoge1xuXHRcdHBhdHRlcm46IC8oOlxccyopKD86XFx3K3xgKD86W15gXFxcXFxcclxcbl0pKmApKD89XFxzKlt7KTpdKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3JlbGF0aW9uc2hpcCc6IHtcblx0XHRwYXR0ZXJuOiAvKC1cXFtcXHMqKD86XFx3K1xccyp8YCg/OlteYFxcXFxcXHJcXG5dKSpgXFxzKik/Olxccyp8XFx8XFxzKjpcXHMqKSg/Olxcdyt8YCg/OlteYFxcXFxcXHJcXG5dKSpgKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblx0J2lkZW50aWZpZXInOiB7XG5cdFx0cGF0dGVybjogL2AoPzpbXmBcXFxcXFxyXFxuXSkqYC8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J3ZhcmlhYmxlJzogL1xcJFxcdysvLFxuXG5cdC8vIGh0dHBzOi8vbmVvNGouY29tL2RvY3MvY3lwaGVyLW1hbnVhbC9jdXJyZW50L3N5bnRheC9yZXNlcnZlZC9cblx0J2tleXdvcmQnOiAvXFxiKD86QUREfEFMTHxBTkR8QVN8QVNDfEFTQ0VORElOR3xBU1NFUlR8Qll8Q0FMTHxDQVNFfENPTU1JVHxDT05TVFJBSU5UfENPTlRBSU5TfENSRUFURXxDU1Z8REVMRVRFfERFU0N8REVTQ0VORElOR3xERVRBQ0h8RElTVElOQ1R8RE98RFJPUHxFTFNFfEVORHxFTkRTfEVYSVNUU3xGT1J8Rk9SRUFDSHxJTnxJTkRFWHxJU3xKT0lOfEtFWXxMSU1JVHxMT0FEfE1BTkRBVE9SWXxNQVRDSHxNRVJHRXxOT0RFfE5PVHxPRnxPTnxPUFRJT05BTHxPUnxPUkRFUig/PVxccytCWSl8UEVSSU9ESUN8UkVNT1ZFfFJFUVVJUkV8UkVUVVJOfFNDQUxBUnxTQ0FOfFNFVHxTS0lQfFNUQVJUfFNUQVJUU3xUSEVOfFVOSU9OfFVOSVFVRXxVTldJTkR8VVNJTkd8V0hFTnxXSEVSRXxXSVRIfFhPUnxZSUVMRClcXGIvaSxcblxuXHQnZnVuY3Rpb24nOiAvXFxiXFx3K1xcYig/PVxccypcXCgpLyxcblxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXxudWxsfHRydWUpXFxiL2ksXG5cdCdudW1iZXInOiAvXFxiKD86MHhbXFxkYS1mQS1GXSt8XFxkKyg/OlxcLlxcZCspPyg/OltlRV1bKy1dP1xcZCspPylcXGIvLFxuXHQvLyBodHRwczovL25lbzRqLmNvbS9kb2NzL2N5cGhlci1tYW51YWwvY3VycmVudC9zeW50YXgvb3BlcmF0b3JzL1xuXHQnb3BlcmF0b3InOiAvOnw8LS0/fC0tPz4/fDw+fD1+P3xbPD5dPT98WysqLyVefF18XFwuXFwuXFwuPy8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKClbXFxde30sOy5dL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmQgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0J2NvbW1lbnQnOiBbXG5cdFx0e1xuXHRcdFx0Ly8gU2hlYmFuZ1xuXHRcdFx0cGF0dGVybjogL15cXHMqIyEuKy8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKF58W15cXFxcXSkvLnNvdXJjZSArICcoPzonICsgW1xuXHRcdFx0XHQvLyAvKyBjb21tZW50ICsvXG5cdFx0XHRcdC8vIEFsbG93IG9uZSBsZXZlbCBvZiBuZXN0aW5nXG5cdFx0XHRcdC9cXC9cXCsoPzpcXC9cXCsoPzpbXitdfFxcKyg/IVxcLykpKlxcK1xcL3woPyFcXC9cXCspW1xcc1xcU10pKj9cXCtcXC8vLnNvdXJjZSxcblx0XHRcdFx0Ly8gLy8gY29tbWVudFxuXHRcdFx0XHQvXFwvXFwvLiovLnNvdXJjZSxcblx0XHRcdFx0Ly8gLyogY29tbWVudCAqL1xuXHRcdFx0XHQvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy8uc291cmNlXG5cdFx0XHRdLmpvaW4oJ3wnKSArICcpJyksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQnc3RyaW5nJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChbXG5cdFx0XHRcdC8vIHJcIlwiLCB4XCJcIlxuXHRcdFx0XHQvXFxiW3J4XVwiKD86XFxcXFtcXHNcXFNdfFteXFxcXFwiXSkqXCJbY3dkXT8vLnNvdXJjZSxcblxuXHRcdFx0XHQvLyBxXCJbXVwiLCBxXCIoKVwiLCBxXCI8PlwiLCBxXCJ7fVwiXG5cdFx0XHRcdC9cXGJxXCIoPzpcXFtbXFxzXFxTXSo/XFxdfFxcKFtcXHNcXFNdKj9cXCl8PFtcXHNcXFNdKj8+fFxce1tcXHNcXFNdKj9cXH0pXCIvLnNvdXJjZSxcblxuXHRcdFx0XHQvLyBxXCJJREVOVFxuXHRcdFx0XHQvLyAuLi5cblx0XHRcdFx0Ly8gSURFTlRcIlxuXHRcdFx0XHQvXFxicVwiKCg/IVxcZClcXHcrKSRbXFxzXFxTXSo/XlxcMVwiLy5zb3VyY2UsXG5cblx0XHRcdFx0Ly8gcVwiLy9cIiwgcVwifHxcIiwgZXRjLlxuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL3N0cmljdFxuXHRcdFx0XHQvXFxicVwiKC4pW1xcc1xcU10qP1xcMlwiLy5zb3VyY2UsXG5cblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9zdHJpY3Rcblx0XHRcdFx0LyhbXCJgXSkoPzpcXFxcW1xcc1xcU118KD8hXFwzKVteXFxcXF0pKlxcM1tjd2RdPy8uc291cmNlXG5cdFx0XHRdLmpvaW4oJ3wnKSwgJ20nKSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcYnFcXHsoPzpcXHtbXnt9XSpcXH18W157fV0pKlxcfS8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ3Rva2VuLXN0cmluZydcblx0XHR9XG5cdF0sXG5cblx0Ly8gSW4gb3JkZXI6ICQsIGtleXdvcmRzIGFuZCBzcGVjaWFsIHRva2VucywgZ2xvYmFsbHkgZGVmaW5lZCBzeW1ib2xzXG5cdCdrZXl3b3JkJzogL1xcJHxcXGIoPzpfXyg/Oig/OkRBVEV8RU9GfEZJTEV8RlVOQ1RJT058TElORXxNT0RVTEV8UFJFVFRZX0ZVTkNUSU9OfFRJTUVTVEFNUHxUSU1FfFZFTkRPUnxWRVJTSU9OKV9ffGdzaGFyZWR8cGFyYW1ldGVyc3x0cmFpdHN8dmVjdG9yKXxhYnN0cmFjdHxhbGlhc3xhbGlnbnxhc218YXNzZXJ0fGF1dG98Ym9keXxib29sfGJyZWFrfGJ5dGV8Y2FzZXxjYXN0fGNhdGNofGNkb3VibGV8Y2VudHxjZmxvYXR8Y2hhcnxjbGFzc3xjb25zdHxjb250aW51ZXxjcmVhbHxkY2hhcnxkZWJ1Z3xkZWZhdWx0fGRlbGVnYXRlfGRlbGV0ZXxkZXByZWNhdGVkfGRvfGRvdWJsZXxkc3RyaW5nfGVsc2V8ZW51bXxleHBvcnR8ZXh0ZXJufGZhbHNlfGZpbmFsfGZpbmFsbHl8ZmxvYXR8Zm9yfGZvcmVhY2h8Zm9yZWFjaF9yZXZlcnNlfGZ1bmN0aW9ufGdvdG98aWRvdWJsZXxpZnxpZmxvYXR8aW1tdXRhYmxlfGltcG9ydHxpbm91dHxpbnR8aW50ZXJmYWNlfGludmFyaWFudHxpcmVhbHxsYXp5fGxvbmd8bWFjcm98bWl4aW58bW9kdWxlfG5ld3xub3Rocm93fG51bGx8b3V0fG92ZXJyaWRlfHBhY2thZ2V8cHJhZ21hfHByaXZhdGV8cHJvdGVjdGVkfHB0cmRpZmZfdHxwdWJsaWN8cHVyZXxyZWFsfHJlZnxyZXR1cm58c2NvcGV8c2hhcmVkfHNob3J0fHNpemVfdHxzdGF0aWN8c3RyaW5nfHN0cnVjdHxzdXBlcnxzd2l0Y2h8c3luY2hyb25pemVkfHRlbXBsYXRlfHRoaXN8dGhyb3d8dHJ1ZXx0cnl8dHlwZWRlZnx0eXBlaWR8dHlwZW9mfHVieXRlfHVjZW50fHVpbnR8dWxvbmd8dW5pb258dW5pdHRlc3R8dXNob3J0fHZlcnNpb258dm9pZHx2b2xhdGlsZXx3Y2hhcnx3aGlsZXx3aXRofHdzdHJpbmcpXFxiLyxcblxuXHQnbnVtYmVyJzogW1xuXHRcdC8vIFRoZSBsb29rYmVoaW5kIGFuZCB0aGUgbmVnYXRpdmUgbG9vay1haGVhZCB0cnkgdG8gcHJldmVudCBiYWQgaGlnaGxpZ2h0aW5nIG9mIHRoZSAuLiBvcGVyYXRvclxuXHRcdC8vIEhleGFkZWNpbWFsIG51bWJlcnMgbXVzdCBiZSBoYW5kbGVkIHNlcGFyYXRlbHkgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBleHBvbmVudCBcImVcIlxuXHRcdC9cXGIweFxcLj9bYS1mXFxkX10rKD86KD8hXFwuXFwuKVxcLlthLWZcXGRfXSopPyg/OnBbKy1dP1thLWZcXGRfXSspP1t1bGZpXXswLDR9L2ksXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLygoPzpcXC5cXC4pPykoPzpcXGIwYlxcLj98XFxifFxcLilcXGRbXFxkX10qKD86KD8hXFwuXFwuKVxcLltcXGRfXSopPyg/OmVbKy1dP1xcZFtcXGRfXSopP1t1bGZpXXswLDR9L2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdLFxuXG5cdCdvcGVyYXRvcic6IC9cXHxbfD1dP3wmWyY9XT98XFwrWys9XT98LVstPV0/fFxcLj9cXC5cXC58PVs+PV0/fCEoPzppW25zXVxcYnw8Pj89P3w+PT98PSk/fFxcYmlbbnNdXFxifCg/OjxbPD5dP3w+Pj8+P3xcXF5cXF58WypcXC8lXn5dKT0/L1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2QnLCAnc3RyaW5nJywge1xuXHQvLyBDaGFyYWN0ZXJzXG5cdC8vICdhJywgJ1xcXFwnLCAnXFxuJywgJ1xceEZGJywgJ1xcMzc3JywgJ1xcdUZGRkYnLCAnXFxVMDAxMEZGRkYnLCAnXFxxdW90J1xuXHQnY2hhcic6IC8nKD86XFxcXCg/OlxcV3xcXHcrKXxbXlxcXFxdKScvXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnZCcsICdrZXl3b3JkJywge1xuXHQncHJvcGVydHknOiAvXFxCQFxcdyovXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnZCcsICdmdW5jdGlvbicsIHtcblx0J3JlZ2lzdGVyJzoge1xuXHRcdC8vIElhc20gcmVnaXN0ZXJzXG5cdFx0cGF0dGVybjogL1xcYig/OltBQkNEXVtMSFhdfEU/KD86QlB8REl8U0l8U1ApfFtCU11QTHxbRUNTREdGXVN8Q1JbMDIzNF18W0RTXUlMfERSWzAxMjM2N118RVtBQkNEXVh8WD9NTVswLTddfFIoPzoxWzAtNV18Wzg5XSlbQldEXT98UltBQkNEXVh8UltCU11QfFJbRFNdSXxUUlszLTddfFhNTSg/OjFbMC01XXxbODldKXxZTU0oPzoxWzAtNV18XFxkKSlcXGJ8XFxiU1QoPzpcXChbMC03XVxcKXxcXGIpLyxcblx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHR9XG59KTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHR2YXIga2V5d29yZHMgPSBbXG5cdFx0L1xcYig/OmFzeW5jfHN5bmN8eWllbGQpXFwqLyxcblx0XHQvXFxiKD86YWJzdHJhY3R8YXNzZXJ0fGFzeW5jfGF3YWl0fGJyZWFrfGNhc2V8Y2F0Y2h8Y2xhc3N8Y29uc3R8Y29udGludWV8Y292YXJpYW50fGRlZmF1bHR8ZGVmZXJyZWR8ZG98ZHluYW1pY3xlbHNlfGVudW18ZXhwb3J0fGV4dGVuZHN8ZXh0ZW5zaW9ufGV4dGVybmFsfGZhY3Rvcnl8ZmluYWx8ZmluYWxseXxmb3J8Z2V0fGhpZGV8aWZ8aW1wbGVtZW50c3xpbXBvcnR8aW58aW50ZXJmYWNlfGxpYnJhcnl8bWl4aW58bmV3fG51bGx8b258b3BlcmF0b3J8cGFydHxyZXRocm93fHJldHVybnxzZXR8c2hvd3xzdGF0aWN8c3VwZXJ8c3dpdGNofHN5bmN8dGhpc3x0aHJvd3x0cnl8dHlwZWRlZnx2YXJ8dm9pZHx3aGlsZXx3aXRofHlpZWxkKVxcYi9cblx0XTtcblxuXHQvLyBIYW5kbGVzIG5hbWVkIGltcG9ydHMsIHN1Y2ggYXMgaHR0cC5DbGllbnRcblx0dmFyIHBhY2thZ2VQcmVmaXggPSAvKF58W15cXHcuXSkoPzpbYS16XVxcdypcXHMqXFwuXFxzKikqKD86W0EtWl1cXHcqXFxzKlxcLlxccyopKi8uc291cmNlO1xuXG5cdC8vIGJhc2VkIG9uIHRoZSBkYXJ0IG5hbWluZyBjb252ZW50aW9uc1xuXHR2YXIgY2xhc3NOYW1lID0ge1xuXHRcdHBhdHRlcm46IFJlZ0V4cChwYWNrYWdlUHJlZml4ICsgL1tBLVpdKD86W1xcZF9BLVpdKlthLXpdXFx3Kik/XFxiLy5zb3VyY2UpLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnbmFtZXNwYWNlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXlthLXpdXFx3Kig/OlxccypcXC5cXHMqW2Etel1cXHcqKSooPzpcXHMqXFwuKT8vLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdH1cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuZGFydCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHRcdCdjbGFzcy1uYW1lJzogW1xuXHRcdFx0Y2xhc3NOYW1lLFxuXHRcdFx0e1xuXHRcdFx0XHQvLyB2YXJpYWJsZXMgYW5kIHBhcmFtZXRlcnNcblx0XHRcdFx0Ly8gdGhpcyB0byBzdXBwb3J0IGNsYXNzIG5hbWVzIChvciBnZW5lcmljIHBhcmFtZXRlcnMpIHdoaWNoIGRvIG5vdCBjb250YWluIGEgbG93ZXIgY2FzZSBsZXR0ZXIgKGFsc28gd29ya3MgZm9yIG1ldGhvZHMpXG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cChwYWNrYWdlUHJlZml4ICsgL1tBLVpdXFx3Kig/PVxccytcXHcrXFxzKls7LD0oKV0pLy5zb3VyY2UpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IGNsYXNzTmFtZS5pbnNpZGVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdrZXl3b3JkJzoga2V5d29yZHMsXG5cdFx0J29wZXJhdG9yJzogL1xcYmlzIXxcXGIoPzphc3xpcylcXGJ8XFwrXFwrfC0tfCYmfFxcfFxcfHw8PD0/fD4+PT98fig/OlxcLz0/KT98WytcXC0qXFwvJSZefD0hPD5dPT98XFw/L1xuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdkYXJ0JywgJ3N0cmluZycsIHtcblx0XHQnc3RyaW5nLWxpdGVyYWwnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvcj8oPzooXCJcIlwifCcnJylbXFxzXFxTXSo/XFwxfChbXCInXSkoPzpcXFxcLnwoPyFcXDIpW15cXFxcXFxyXFxuXSkqXFwyKD8hXFwyKSkvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbXlxcXFxdKSg/OlxcXFx7Mn0pKilcXCQoPzpcXHcrfFxceyg/Oltee31dfFxce1tee31dKlxcfSkqXFx9KS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFwkXFx7P3xcXH0kLyxcblx0XHRcdFx0XHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuZGFydFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnc3RyaW5nJzogdW5kZWZpbmVkXG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2RhcnQnLCAnY2xhc3MtbmFtZScsIHtcblx0XHQnbWV0YWRhdGEnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvQFxcdysvLFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2RhcnQnLCAnY2xhc3MtbmFtZScsIHtcblx0XHQnZ2VuZXJpY3MnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvPCg/OltcXHdcXHMsLiY/XXw8KD86W1xcd1xccywuJj9dfDwoPzpbXFx3XFxzLC4mP118PFtcXHdcXHMsLiY/XSo+KSo+KSo+KSo+Lyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnY2xhc3MtbmFtZSc6IGNsYXNzTmFtZSxcblx0XHRcdFx0J2tleXdvcmQnOiBrZXl3b3Jkcyxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1s8PigpLC46XS8sXG5cdFx0XHRcdCdvcGVyYXRvcic6IC9bPyZ8XS9cblx0XHRcdH1cblx0XHR9LFxuXHR9KTtcbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHRQcmlzbS5sYW5ndWFnZXMuZGF0YXdlYXZlID0ge1xuXHRcdCd1cmwnOiAvXFxiW0EtWmEtel0rOlxcL1xcL1tcXHcvOi4/PSYtXSt8XFxidXJuOltcXHc6Lj89Ji1dKy8sXG5cdFx0J3Byb3BlcnR5Jzoge1xuXHRcdFx0cGF0dGVybjogLyg/OlxcYlxcdysjKT8oPzpcIig/OlxcXFwufFteXFxcXFwiXFxyXFxuXSkqXCJ8XFxiXFx3KykoPz1cXHMqWzpAXSkvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogLyhbXCInYF0pKD86XFxcXFtcXHNcXFNdfCg/IVxcMSlbXlxcXFxdKSpcXDEvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnbWltZS10eXBlJzogL1xcYig/OmFwcGxpY2F0aW9ufGF1ZGlvfGltYWdlfG11bHRpcGFydHx0ZXh0fHZpZGVvKVxcL1tcXHcrLV0rLyxcblx0XHQnZGF0ZSc6IHtcblx0XHRcdHBhdHRlcm46IC9cXHxbXFx3OistXStcXHwvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnY29tbWVudCc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pXFwvXFwqW1xcc1xcU10qPyg/OlxcKlxcL3wkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhefFteXFxcXDpdKVxcL1xcLy4qLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQncmVnZXgnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwvKD86W15cXFxcXFwvXFxyXFxuXXxcXFxcW15cXHJcXG5dKStcXC8vLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQna2V5d29yZCc6IC9cXGIoPzphbmR8YXN8YXR8Y2FzZXxkb3xlbHNlfGZ1bnxpZnxpbnB1dHxpc3xtYXRjaHxub3R8bnN8bnVsbHxvcnxvdXRwdXR8dHlwZXx1bmxlc3N8dXBkYXRlfHVzaW5nfHZhcilcXGIvLFxuXHRcdCdmdW5jdGlvbic6IC9cXGJbQS1aX11cXHcqKD89XFxzKlxcKCkvaSxcblx0XHQnbnVtYmVyJzogLy0/XFxiXFxkKyg/OlxcLlxcZCspPyg/OmVbKy1dP1xcZCspP1xcYi9pLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9be31bXFxdOygpLC46QF0vLFxuXHRcdCdvcGVyYXRvcic6IC88PHw+PnwtPnxbPD5+PV09P3whPXwtLT8tP3xcXCtcXCs/fCF8XFw/Lyxcblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdH07XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmRheCA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pKD86XFwvXFwqW1xcc1xcU10qP1xcKlxcL3woPzotLXxcXC9cXC8pLiopLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdkYXRhLWZpZWxkJzoge1xuXHRcdHBhdHRlcm46IC8nKD86W14nXXwnJykqJyg/IScpKD86XFxbWyBcXHdcXHhBMC1cXHVGRkZGXStcXF0pP3xcXHcrXFxbWyBcXHdcXHhBMC1cXHVGRkZGXStcXF0vLFxuXHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHR9LFxuXHQnbWVhc3VyZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxbWyBcXHdcXHhBMC1cXHVGRkZGXStcXF0vLFxuXHRcdGFsaWFzOiAnY29uc3RhbnQnXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86W15cIl18XCJcIikqXCIoPyFcIikvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnZnVuY3Rpb24nOiAvXFxiKD86QUJTfEFDT1N8QUNPU0h8QUNPVHxBQ09USHxBRERDT0xVTU5TfEFERE1JU1NJTkdJVEVNU3xBTEx8QUxMQ1JPU1NGSUxURVJFRHxBTExFWENFUFR8QUxMTk9CTEFOS1JPV3xBTExTRUxFQ1RFRHxBTkR8QVBQUk9YSU1BVEVESVNUSU5DVENPVU5UfEFTSU58QVNJTkh8QVRBTnxBVEFOSHxBVkVSQUdFfEFWRVJBR0VBfEFWRVJBR0VYfEJFVEFcXC5ESVNUfEJFVEFcXC5JTlZ8QkxBTkt8Q0FMQ1VMQVRFfENBTENVTEFURVRBQkxFfENBTEVOREFSfENBTEVOREFSQVVUT3xDRUlMSU5HfENISVNRXFwuRElTVHxDSElTUVxcLkRJU1RcXC5SVHxDSElTUVxcLklOVnxDSElTUVxcLklOVlxcLlJUfENMT1NJTkdCQUxBTkNFTU9OVEh8Q0xPU0lOR0JBTEFOQ0VRVUFSVEVSfENMT1NJTkdCQUxBTkNFWUVBUnxDT0FMRVNDRXxDT01CSU58Q09NQklOQXxDT01CSU5FVkFMVUVTfENPTkNBVEVOQVRFfENPTkNBVEVOQVRFWHxDT05GSURFTkNFXFwuTk9STXxDT05GSURFTkNFXFwuVHxDT05UQUlOU3xDT05UQUlOU1JPV3xDT05UQUlOU1NUUklOR3xDT05UQUlOU1NUUklOR0VYQUNUfENPTlZFUlR8Q09TfENPU0h8Q09UfENPVEh8Q09VTlR8Q09VTlRBfENPVU5UQVh8Q09VTlRCTEFOS3xDT1VOVFJPV1N8Q09VTlRYfENST1NTRklMVEVSfENST1NTSk9JTnxDVVJSRU5DWXxDVVJSRU5UR1JPVVB8Q1VTVE9NREFUQXxEQVRBVEFCTEV8REFURXxEQVRFQUREfERBVEVESUZGfERBVEVTQkVUV0VFTnxEQVRFU0lOUEVSSU9EfERBVEVTTVREfERBVEVTUVREfERBVEVTWVREfERBVEVWQUxVRXxEQVl8REVHUkVFU3xERVRBSUxST1dTfERJU1RJTkNUfERJU1RJTkNUQ09VTlR8RElTVElOQ1RDT1VOVE5PQkxBTkt8RElWSURFfEVBUkxJRVJ8RUFSTElFU1R8RURBVEV8RU5ET0ZNT05USHxFTkRPRlFVQVJURVJ8RU5ET0ZZRUFSfEVPTU9OVEh8RVJST1J8RVZFTnxFWEFDVHxFWENFUFR8RVhQfEVYUE9OXFwuRElTVHxGQUNUfEZBTFNFfEZJTFRFUnxGSUxURVJTfEZJTkR8RklSU1REQVRFfEZJUlNUTk9OQkxBTkt8RklSU1ROT05CTEFOS1ZBTFVFfEZJWEVEfEZMT09SfEZPUk1BVHxHQ0R8R0VORVJBVEV8R0VORVJBVEVBTEx8R0VORVJBVEVTRVJJRVN8R0VPTUVBTnxHRU9NRUFOWHxHUk9VUEJZfEhBU09ORUZJTFRFUnxIQVNPTkVWQUxVRXxIT1VSfElGfElGXFwuRUFHRVJ8SUZFUlJPUnxJR05PUkV8SU5UfElOVEVSU0VDVHxJU0JMQU5LfElTQ1JPU1NGSUxURVJFRHxJU0VNUFRZfElTRVJST1J8SVNFVkVOfElTRklMVEVSRUR8SVNJTlNDT1BFfElTTE9HSUNBTHxJU05PTlRFWFR8SVNOVU1CRVJ8SVNPXFwuQ0VJTElOR3xJU09ERHxJU09OT1JBRlRFUnxJU1NFTEVDVEVETUVBU1VSRXxJU1NVQlRPVEFMfElTVEVYVHxLRUVQRklMVEVSU3xLRVlXT1JETUFUQ0h8TEFTVERBVEV8TEFTVE5PTkJMQU5LfExBU1ROT05CTEFOS1ZBTFVFfExDTXxMRUZUfExFTnxMTnxMT0d8TE9HMTB8TE9PS1VQVkFMVUV8TE9XRVJ8TUFYfE1BWEF8TUFYWHxNRURJQU58TUVESUFOWHxNSUR8TUlOfE1JTkF8TUlOVVRFfE1JTlh8TU9EfE1PTlRIfE1ST1VORHxOQVRVUkFMSU5ORVJKT0lOfE5BVFVSQUxMRUZUT1VURVJKT0lOfE5FWFREQVl8TkVYVE1PTlRIfE5FWFRRVUFSVEVSfE5FWFRZRUFSfE5PTlZJU1VBTHxOT1JNXFwuRElTVHxOT1JNXFwuSU5WfE5PUk1cXC5TXFwuRElTVHxOT1JNXFwuU1xcLklOVnxOT1R8Tk9XfE9ERHxPUEVOSU5HQkFMQU5DRU1PTlRIfE9QRU5JTkdCQUxBTkNFUVVBUlRFUnxPUEVOSU5HQkFMQU5DRVlFQVJ8T1J8UEFSQUxMRUxQRVJJT0R8UEFUSHxQQVRIQ09OVEFJTlN8UEFUSElURU18UEFUSElURU1SRVZFUlNFfFBBVEhMRU5HVEh8UEVSQ0VOVElMRVxcLkVYQ3xQRVJDRU5USUxFXFwuSU5DfFBFUkNFTlRJTEVYXFwuRVhDfFBFUkNFTlRJTEVYXFwuSU5DfFBFUk1VVHxQSXxQT0lTU09OXFwuRElTVHxQT1dFUnxQUkVWSU9VU0RBWXxQUkVWSU9VU01PTlRIfFBSRVZJT1VTUVVBUlRFUnxQUkVWSU9VU1lFQVJ8UFJPRFVDVHxQUk9EVUNUWHxRVUFSVEVSfFFVT1RJRU5UfFJBRElBTlN8UkFORHxSQU5EQkVUV0VFTnxSQU5LXFwuRVF8UkFOS1h8UkVMQVRFRHxSRUxBVEVEVEFCTEV8UkVNT1ZFRklMVEVSU3xSRVBMQUNFfFJFUFR8UklHSFR8Uk9MTFVQfFJPTExVUEFERElTU1VCVE9UQUx8Uk9MTFVQR1JPVVB8Uk9MTFVQSVNTVUJUT1RBTHxST1VORHxST1VORERPV058Uk9VTkRVUHxST1d8U0FNRVBFUklPRExBU1RZRUFSfFNBTVBMRXxTRUFSQ0h8U0VDT05EfFNFTEVDVENPTFVNTlN8U0VMRUNURURNRUFTVVJFfFNFTEVDVEVETUVBU1VSRUZPUk1BVFNUUklOR3xTRUxFQ1RFRE1FQVNVUkVOQU1FfFNFTEVDVEVEVkFMVUV8U0lHTnxTSU58U0lOSHxTUVJUfFNRUlRQSXxTVEFSVE9GTU9OVEh8U1RBUlRPRlFVQVJURVJ8U1RBUlRPRllFQVJ8U1RERVZcXC5QfFNUREVWXFwuU3xTVERFVlhcXC5QfFNUREVWWFxcLlN8U1VCU1RJVFVURXxTVUJTVElUVVRFV0lUSElOREVYfFNVTXxTVU1NQVJJWkV8U1VNTUFSSVpFQ09MVU1OU3xTVU1YfFNXSVRDSHxUXFwuRElTVHxUXFwuRElTVFxcLjJUfFRcXC5ESVNUXFwuUlR8VFxcLklOVnxUXFwuSU5WXFwuMlR8VEFOfFRBTkh8VElNRXxUSU1FVkFMVUV8VE9EQVl8VE9QTnxUT1BOUEVSTEVWRUx8VE9QTlNLSVB8VE9UQUxNVER8VE9UQUxRVER8VE9UQUxZVER8VFJFQVRBU3xUUklNfFRSVUV8VFJVTkN8VU5JQ0hBUnxVTklDT0RFfFVOSU9OfFVQUEVSfFVTRVJFTEFUSU9OU0hJUHxVU0VSTkFNRXxVU0VST0JKRUNUSUR8VVNFUlBSSU5DSVBBTE5BTUV8VVRDTk9XfFVUQ1RPREFZfFZBTFVFfFZBTFVFU3xWQVJcXC5QfFZBUlxcLlN8VkFSWFxcLlB8VkFSWFxcLlN8V0VFS0RBWXxXRUVLTlVNfFhJUlJ8WE5QVnxZRUFSfFlFQVJGUkFDKSg/PVxccypcXCgpL2ksXG5cdCdrZXl3b3JkJzogL1xcYig/OkRFRklORXxFVkFMVUFURXxNRUFTVVJFfE9SREVSXFxzK0JZfFJFVFVSTnxWQVJ8U1RBUlRcXHMrQVR8QVNDfERFU0MpXFxiL2ksXG5cdCdib29sZWFuJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzpGQUxTRXxOVUxMfFRSVUUpXFxiL2ksXG5cdFx0YWxpYXM6ICdjb25zdGFudCdcblx0fSxcblx0J251bWJlcic6IC9cXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCtcXGIvLFxuXHQnb3BlcmF0b3InOiAvOj18Wy0rKlxcLz1eXXwmJj98XFx8XFx8fDwoPzo9Pj98PHw+KT98Pls+PV0/fFxcYig/OklOfE5PVClcXGIvaSxcblx0J3B1bmN0dWF0aW9uJzogL1s7XFxbXFxdKCl7fWAsLl0vXG59O1xuXG4vLyBBQk5GIGdyYW1tYXI6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZGhhbGwtbGFuZy9kaGFsbC1sYW5nL2Jsb2IvbWFzdGVyL3N0YW5kYXJkL2RoYWxsLmFibmZcblxuUHJpc20ubGFuZ3VhZ2VzLmRoYWxsID0ge1xuXHQvLyBNdWx0aS1saW5lIGNvbW1lbnRzIGNhbiBiZSBuZXN0ZWQuIEUuZy4gey0gZm9vIHstIGJhciAtfSAtfVxuXHQvLyBUaGUgbXVsdGktbGluZSBwYXR0ZXJuIGlzIGVzc2VudGlhbGx5IHRoaXM6XG5cdC8vICAgXFx7LSg/OlteLXtdfC0oPyFcXH0pfFxceyg/IS0pfDxTRUxGPikqLVxcfVxuXHQnY29tbWVudCc6IC8tLS4qfFxcey0oPzpbXi17XXwtKD8hXFx9KXxcXHsoPyEtKXxcXHstKD86W14te118LSg/IVxcfSl8XFx7KD8hLSkpKi1cXH0pKi1cXH0vLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlteXCJcXFxcXXxcXFxcLikqXCJ8JycoPzpbXiddfCcoPyEnKXwnJyd8JydcXCRcXHspKicnKD8hJ3xcXCQpLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogL1xcJFxce1tee31dKlxcfS8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogLyheXFwkXFx7KVtcXHNcXFNdKyg/PVxcfSQpLyxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRhbGlhczogJ2xhbmd1YWdlLWRoYWxsJyxcblx0XHRcdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmxvd1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcJFxce3xcXH0vXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdCdsYWJlbCc6IHtcblx0XHRwYXR0ZXJuOiAvYFteYF0qYC8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCd1cmwnOiB7XG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2RoYWxsLWxhbmcvZGhhbGwtbGFuZy9ibG9iLzVmZGU4ZWYxYmVhZDZmYjRlOTk5ZDNjMWZmZTcwNDRjZDAxOWQ2M2Evc3RhbmRhcmQvZGhhbGwuYWJuZiNMNTk2XG5cdFx0cGF0dGVybjogL1xcYmh0dHBzPzpcXC9cXC9bXFx3LjolISQmJyorOz1Afi1dKyg/OlxcL1tcXHcuOiUhJCYnKis7PUB+LV0qKSooPzpcXD9bLz9cXHcuOiUhJCYnKis7PUB+LV0qKT8vLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnZW52Jzoge1xuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kaGFsbC1sYW5nL2RoYWxsLWxhbmcvYmxvYi81ZmRlOGVmMWJlYWQ2ZmI0ZTk5OWQzYzFmZmU3MDQ0Y2QwMTlkNjNhL3N0YW5kYXJkL2RoYWxsLmFibmYjTDY2MVxuXHRcdHBhdHRlcm46IC9cXGJlbnY6KD86KD8hXFxkKVxcdyt8XCIoPzpbXlwiXFxcXD1dfFxcXFwuKSpcIikvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdmdW5jdGlvbic6IC9eZW52Lyxcblx0XHRcdCdvcGVyYXRvcic6IC9eOi8sXG5cdFx0XHQndmFyaWFibGUnOiAvW1xcc1xcU10rL1xuXHRcdH1cblx0fSxcblx0J2hhc2gnOiB7XG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2RoYWxsLWxhbmcvZGhhbGwtbGFuZy9ibG9iLzVmZGU4ZWYxYmVhZDZmYjRlOTk5ZDNjMWZmZTcwNDRjZDAxOWQ2M2Evc3RhbmRhcmQvZGhhbGwuYWJuZiNMNzI1XG5cdFx0cGF0dGVybjogL1xcYnNoYTI1NjpbXFxkYS1mQS1GXXs2NH1cXGIvLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2Z1bmN0aW9uJzogL3NoYTI1Ni8sXG5cdFx0XHQnb3BlcmF0b3InOiAvOi8sXG5cdFx0XHQnbnVtYmVyJzogL1tcXGRhLWZBLUZdezY0fS9cblx0XHR9XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2RoYWxsLWxhbmcvZGhhbGwtbGFuZy9ibG9iLzVmZGU4ZWYxYmVhZDZmYjRlOTk5ZDNjMWZmZTcwNDRjZDAxOWQ2M2Evc3RhbmRhcmQvZGhhbGwuYWJuZiNMMzU5XG5cdCdrZXl3b3JkJzogL1xcYig/OmFzfGFzc2VydHxlbHNlfGZvcmFsbHxpZnxpbnxsZXR8bWVyZ2V8bWlzc2luZ3x0aGVufHRvTWFwfHVzaW5nfHdpdGgpXFxifFxcdTIyMDAvLFxuXHQnYnVpbHRpbic6IC9cXGIoPzpOb25lfFNvbWUpXFxiLyxcblxuXHQnYm9vbGVhbic6IC9cXGIoPzpGYWxzZXxUcnVlKVxcYi8sXG5cdCdudW1iZXInOiAvXFxiTmFOXFxifC0/XFxiSW5maW5pdHlcXGJ8WystXT9cXGIoPzoweFtcXGRhLWZBLUZdK3xcXGQrKD86XFwuXFxkKyk/KD86ZVsrLV0/XFxkKyk/KVxcYi8sXG5cdCdvcGVyYXRvcic6IC9cXC9cXFxcfFxcL1xcL1xcXFxcXFxcfCYmfFxcfFxcfHw9PT18WyE9XT18XFwvXFwvfC0+fFxcK1xcK3w6OnxbKyojQD06Pzw+fFxcXFxcXHUyMjI3XFx1MmE1M1xcdTIyNjFcXHUyYWZkXFx1MDNiYlxcdTIxOTJdLyxcblx0J3B1bmN0dWF0aW9uJzogL1xcLlxcLnxbe31cXFtcXF0oKSwuL10vLFxuXG5cdC8vIHdlJ2xsIGp1c3QgYXNzdW1lIHRoYXQgZXZlcnkgY2FwaXRhbCB3b3JkIGxlZnQgaXMgYSB0eXBlIG5hbWVcblx0J2NsYXNzLW5hbWUnOiAvXFxiW0EtWl1cXHcqXFxiL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmRoYWxsLnN0cmluZy5pbnNpZGUuaW50ZXJwb2xhdGlvbi5pbnNpZGUuZXhwcmVzc2lvbi5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMuZGhhbGw7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHRQcmlzbS5sYW5ndWFnZXMuZGlmZiA9IHtcblx0XHQnY29vcmQnOiBbXG5cdFx0XHQvLyBNYXRjaCBhbGwga2luZHMgb2YgY29vcmQgbGluZXMgKHByZWZpeGVkIGJ5IFwiKysrXCIsIFwiLS0tXCIgb3IgXCIqKipcIikuXG5cdFx0XHQvXig/OlxcKnszfXwtezN9fFxcK3szfSkuKiQvbSxcblx0XHRcdC8vIE1hdGNoIFwiQEAgLi4uIEBAXCIgY29vcmQgbGluZXMgaW4gdW5pZmllZCBkaWZmLlxuXHRcdFx0L15AQC4qQEAkL20sXG5cdFx0XHQvLyBNYXRjaCBjb29yZCBsaW5lcyBpbiBub3JtYWwgZGlmZiAoc3RhcnRzIHdpdGggYSBudW1iZXIpLlxuXHRcdFx0L15cXGQuKiQvbVxuXHRcdF1cblxuXHRcdC8vIGRlbGV0ZWQsIGluc2VydGVkLCB1bmNoYW5nZWQsIGRpZmZcblx0fTtcblxuXHQvKipcblx0ICogQSBtYXAgZnJvbSB0aGUgbmFtZSBvZiBhIGJsb2NrIHRvIGl0cyBsaW5lIHByZWZpeC5cblx0ICpcblx0ICogQHR5cGUge09iamVjdDxzdHJpbmcsIHN0cmluZz59XG5cdCAqL1xuXHR2YXIgUFJFRklYRVMgPSB7XG5cdFx0J2RlbGV0ZWQtc2lnbic6ICctJyxcblx0XHQnZGVsZXRlZC1hcnJvdyc6ICc8Jyxcblx0XHQnaW5zZXJ0ZWQtc2lnbic6ICcrJyxcblx0XHQnaW5zZXJ0ZWQtYXJyb3cnOiAnPicsXG5cdFx0J3VuY2hhbmdlZCc6ICcgJyxcblx0XHQnZGlmZic6ICchJyxcblx0fTtcblxuXHQvLyBhZGQgYSB0b2tlbiBmb3IgZWFjaCBwcmVmaXhcblx0T2JqZWN0LmtleXMoUFJFRklYRVMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcblx0XHR2YXIgcHJlZml4ID0gUFJFRklYRVNbbmFtZV07XG5cblx0XHR2YXIgYWxpYXMgPSBbXTtcblx0XHRpZiAoIS9eXFx3KyQvLnRlc3QobmFtZSkpIHsgLy8gXCJkZWxldGVkLXNpZ25cIiAtPiBcImRlbGV0ZWRcIlxuXHRcdFx0YWxpYXMucHVzaCgvXFx3Ky8uZXhlYyhuYW1lKVswXSk7XG5cdFx0fVxuXHRcdGlmIChuYW1lID09PSAnZGlmZicpIHtcblx0XHRcdGFsaWFzLnB1c2goJ2JvbGQnKTtcblx0XHR9XG5cblx0XHRQcmlzbS5sYW5ndWFnZXMuZGlmZltuYW1lXSA9IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnXig/OlsnICsgcHJlZml4ICsgJ10uKig/Olxcclxcbj98XFxufCg/IVtcXFxcc1xcXFxTXSkpKSsnLCAnbScpLFxuXHRcdFx0YWxpYXM6IGFsaWFzLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdsaW5lJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oLikoPz1bXFxzXFxTXSkuKig/Olxcclxcbj98XFxuKT8vLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0J3ByZWZpeCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10vLFxuXHRcdFx0XHRcdGFsaWFzOiAvXFx3Ky8uZXhlYyhuYW1lKVswXVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHR9KTtcblxuXHQvLyBtYWtlIHByZWZpeGVzIGF2YWlsYWJsZSB0byBEaWZmIHBsdWdpblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoUHJpc20ubGFuZ3VhZ2VzLmRpZmYsICdQUkVGSVhFUycsIHtcblx0XHR2YWx1ZTogUFJFRklYRVNcblx0fSk7XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBwbGFjZWhvbGRlciBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlIGlkIGFuZCBpbmRleC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaW5kZXhcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdGZ1bmN0aW9uIGdldFBsYWNlaG9sZGVyKGxhbmd1YWdlLCBpbmRleCkge1xuXHRcdHJldHVybiAnX19fJyArIGxhbmd1YWdlLnRvVXBwZXJDYXNlKCkgKyBpbmRleCArICdfX18nO1xuXHR9XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddID0ge30sIHtcblx0XHRidWlsZFBsYWNlaG9sZGVyczoge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUb2tlbml6ZSBhbGwgaW5saW5lIHRlbXBsYXRpbmcgZXhwcmVzc2lvbnMgbWF0Y2hpbmcgYHBsYWNlaG9sZGVyUGF0dGVybmAuXG5cdFx0XHQgKlxuXHRcdFx0ICogSWYgYHJlcGxhY2VGaWx0ZXJgIGlzIHByb3ZpZGVkLCBvbmx5IG1hdGNoZXMgb2YgYHBsYWNlaG9sZGVyUGF0dGVybmAgZm9yIHdoaWNoIGByZXBsYWNlRmlsdGVyYCByZXR1cm5zXG5cdFx0XHQgKiBgdHJ1ZWAgd2lsbCBiZSByZXBsYWNlZC5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge29iamVjdH0gZW52IFRoZSBlbnZpcm9ubWVudCBvZiB0aGUgYGJlZm9yZS10b2tlbml6ZWAgaG9vay5cblx0XHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSBUaGUgbGFuZ3VhZ2UgaWQuXG5cdFx0XHQgKiBAcGFyYW0ge1JlZ0V4cH0gcGxhY2Vob2xkZXJQYXR0ZXJuIFRoZSBtYXRjaGVzIG9mIHRoaXMgcGF0dGVybiB3aWxsIGJlIHJlcGxhY2VkIGJ5IHBsYWNlaG9sZGVycy5cblx0XHRcdCAqIEBwYXJhbSB7KG1hdGNoOiBzdHJpbmcpID0+IGJvb2xlYW59IFtyZXBsYWNlRmlsdGVyXVxuXHRcdFx0ICovXG5cdFx0XHR2YWx1ZTogZnVuY3Rpb24gKGVudiwgbGFuZ3VhZ2UsIHBsYWNlaG9sZGVyUGF0dGVybiwgcmVwbGFjZUZpbHRlcikge1xuXHRcdFx0XHRpZiAoZW52Lmxhbmd1YWdlICE9PSBsYW5ndWFnZSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciB0b2tlblN0YWNrID0gZW52LnRva2VuU3RhY2sgPSBbXTtcblxuXHRcdFx0XHRlbnYuY29kZSA9IGVudi5jb2RlLnJlcGxhY2UocGxhY2Vob2xkZXJQYXR0ZXJuLCBmdW5jdGlvbiAobWF0Y2gpIHtcblx0XHRcdFx0XHRpZiAodHlwZW9mIHJlcGxhY2VGaWx0ZXIgPT09ICdmdW5jdGlvbicgJiYgIXJlcGxhY2VGaWx0ZXIobWF0Y2gpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHZhciBpID0gdG9rZW5TdGFjay5sZW5ndGg7XG5cdFx0XHRcdFx0dmFyIHBsYWNlaG9sZGVyO1xuXG5cdFx0XHRcdFx0Ly8gQ2hlY2sgZm9yIGV4aXN0aW5nIHN0cmluZ3Ncblx0XHRcdFx0XHR3aGlsZSAoZW52LmNvZGUuaW5kZXhPZihwbGFjZWhvbGRlciA9IGdldFBsYWNlaG9sZGVyKGxhbmd1YWdlLCBpKSkgIT09IC0xKSB7XG5cdFx0XHRcdFx0XHQrK2k7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gQ3JlYXRlIGEgc3BhcnNlIGFycmF5XG5cdFx0XHRcdFx0dG9rZW5TdGFja1tpXSA9IG1hdGNoO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHBsYWNlaG9sZGVyO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHQvLyBTd2l0Y2ggdGhlIGdyYW1tYXIgdG8gbWFya3VwXG5cdFx0XHRcdGVudi5ncmFtbWFyID0gUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cDtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHRva2VuaXplUGxhY2Vob2xkZXJzOiB7XG5cdFx0XHQvKipcblx0XHRcdCAqIFJlcGxhY2UgcGxhY2Vob2xkZXJzIHdpdGggcHJvcGVyIHRva2VucyBhZnRlciB0b2tlbml6aW5nLlxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7b2JqZWN0fSBlbnYgVGhlIGVudmlyb25tZW50IG9mIHRoZSBgYWZ0ZXItdG9rZW5pemVgIGhvb2suXG5cdFx0XHQgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2UgVGhlIGxhbmd1YWdlIGlkLlxuXHRcdFx0ICovXG5cdFx0XHR2YWx1ZTogZnVuY3Rpb24gKGVudiwgbGFuZ3VhZ2UpIHtcblx0XHRcdFx0aWYgKGVudi5sYW5ndWFnZSAhPT0gbGFuZ3VhZ2UgfHwgIWVudi50b2tlblN0YWNrKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU3dpdGNoIHRoZSBncmFtbWFyIGJhY2tcblx0XHRcdFx0ZW52LmdyYW1tYXIgPSBQcmlzbS5sYW5ndWFnZXNbbGFuZ3VhZ2VdO1xuXG5cdFx0XHRcdHZhciBqID0gMDtcblx0XHRcdFx0dmFyIGtleXMgPSBPYmplY3Qua2V5cyhlbnYudG9rZW5TdGFjayk7XG5cblx0XHRcdFx0ZnVuY3Rpb24gd2Fsa1Rva2Vucyh0b2tlbnMpIHtcblx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0Ly8gYWxsIHBsYWNlaG9sZGVycyBhcmUgcmVwbGFjZWQgYWxyZWFkeVxuXHRcdFx0XHRcdFx0aWYgKGogPj0ga2V5cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHZhciB0b2tlbiA9IHRva2Vuc1tpXTtcblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnIHx8ICh0b2tlbi5jb250ZW50ICYmIHR5cGVvZiB0b2tlbi5jb250ZW50ID09PSAnc3RyaW5nJykpIHtcblx0XHRcdFx0XHRcdFx0dmFyIGsgPSBrZXlzW2pdO1xuXHRcdFx0XHRcdFx0XHR2YXIgdCA9IGVudi50b2tlblN0YWNrW2tdO1xuXHRcdFx0XHRcdFx0XHR2YXIgcyA9IHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycgPyB0b2tlbiA6IHRva2VuLmNvbnRlbnQ7XG5cdFx0XHRcdFx0XHRcdHZhciBwbGFjZWhvbGRlciA9IGdldFBsYWNlaG9sZGVyKGxhbmd1YWdlLCBrKTtcblxuXHRcdFx0XHRcdFx0XHR2YXIgaW5kZXggPSBzLmluZGV4T2YocGxhY2Vob2xkZXIpO1xuXHRcdFx0XHRcdFx0XHRpZiAoaW5kZXggPiAtMSkge1xuXHRcdFx0XHRcdFx0XHRcdCsrajtcblxuXHRcdFx0XHRcdFx0XHRcdHZhciBiZWZvcmUgPSBzLnN1YnN0cmluZygwLCBpbmRleCk7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIG1pZGRsZSA9IG5ldyBQcmlzbS5Ub2tlbihsYW5ndWFnZSwgUHJpc20udG9rZW5pemUodCwgZW52LmdyYW1tYXIpLCAnbGFuZ3VhZ2UtJyArIGxhbmd1YWdlLCB0KTtcblx0XHRcdFx0XHRcdFx0XHR2YXIgYWZ0ZXIgPSBzLnN1YnN0cmluZyhpbmRleCArIHBsYWNlaG9sZGVyLmxlbmd0aCk7XG5cblx0XHRcdFx0XHRcdFx0XHR2YXIgcmVwbGFjZW1lbnQgPSBbXTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoYmVmb3JlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXBsYWNlbWVudC5wdXNoLmFwcGx5KHJlcGxhY2VtZW50LCB3YWxrVG9rZW5zKFtiZWZvcmVdKSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHJlcGxhY2VtZW50LnB1c2gobWlkZGxlKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoYWZ0ZXIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJlcGxhY2VtZW50LnB1c2guYXBwbHkocmVwbGFjZW1lbnQsIHdhbGtUb2tlbnMoW2FmdGVyXSkpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0b2tlbnMuc3BsaWNlLmFwcGx5KHRva2VucywgW2ksIDFdLmNvbmNhdChyZXBsYWNlbWVudCkpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0b2tlbi5jb250ZW50ID0gcmVwbGFjZW1lbnQ7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHRva2VuLmNvbnRlbnQgLyogJiYgdHlwZW9mIHRva2VuLmNvbnRlbnQgIT09ICdzdHJpbmcnICovKSB7XG5cdFx0XHRcdFx0XHRcdHdhbGtUb2tlbnModG9rZW4uY29udGVudCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRva2Vucztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHdhbGtUb2tlbnMoZW52LnRva2Vucyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxufShQcmlzbSkpO1xuXG4vLyBEamFuZ28vSmluamEyIHN5bnRheCBkZWZpbml0aW9uIGZvciBQcmlzbS5qcyA8aHR0cDovL3ByaXNtanMuY29tPiBzeW50YXggaGlnaGxpZ2h0ZXIuXG4vLyBNb3N0bHkgaXQgd29ya3MgT0sgYnV0IGNhbiBwYWludCBjb2RlIGluY29ycmVjdGx5IG9uIGNvbXBsZXggaHRtbC90ZW1wbGF0ZSB0YWcgY29tYmluYXRpb25zLlxuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmRqYW5nbyA9IHtcblx0XHQnY29tbWVudCc6IC9eXFx7I1tcXHNcXFNdKj8jXFx9JC8sXG5cdFx0J3RhZyc6IHtcblx0XHRcdHBhdHRlcm46IC8oXlxceyVbKy1dP1xccyopXFx3Ky8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH0sXG5cdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdHBhdHRlcm46IC9eXFx7W3slXVsrLV0/fFsrLV0/W30lXVxcfSQvLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFwifCcpKD86XFxcXC58KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdmaWx0ZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcfClcXHcrLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH0sXG5cdFx0J3Rlc3QnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYmlzXFxzKyg/Om5vdFxccyspPykoPyFub3RcXGIpXFx3Ky8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9LFxuXHRcdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcrKD89XFxzKlxcKCkvaSxcblx0XHQna2V5d29yZCc6IC9cXGIoPzphbmR8YXN8Ynl8ZWxzZXxmb3J8aWZ8aW1wb3J0fGlufGlzfGxvb3B8bm90fG9yfHJlY3Vyc2l2ZXx3aXRofHdpdGhvdXQpXFxiLyxcblx0XHQnb3BlcmF0b3InOiAvWy0rJT1dPT98IT18XFwqXFwqPz0/fFxcL1xcLz89P3w8Wzw9Pl0/fD5bPT5dP3xbJnxefl0vLFxuXHRcdCdudW1iZXInOiAvXFxiXFxkKyg/OlxcLlxcZCspP1xcYi8sXG5cdFx0J2Jvb2xlYW4nOiAvW0ZmXWFsc2V8W05uXW9uZXxbVHRdcnVlLyxcblx0XHQndmFyaWFibGUnOiAvXFxiXFx3K1xcYi8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF0oKSwuOjtdL1xuXHR9O1xuXG5cblx0dmFyIHBhdHRlcm4gPSAvXFx7XFx7W1xcc1xcU10qP1xcfVxcfXxcXHslW1xcc1xcU10qPyVcXH18XFx7I1tcXHNcXFNdKj8jXFx9L2c7XG5cdHZhciBtYXJrdXBUZW1wbGF0aW5nID0gUHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddO1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYmVmb3JlLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdG1hcmt1cFRlbXBsYXRpbmcuYnVpbGRQbGFjZWhvbGRlcnMoZW52LCAnZGphbmdvJywgcGF0dGVybik7XG5cdH0pO1xuXHRQcmlzbS5ob29rcy5hZGQoJ2FmdGVyLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdG1hcmt1cFRlbXBsYXRpbmcudG9rZW5pemVQbGFjZWhvbGRlcnMoZW52LCAnZGphbmdvJyk7XG5cdH0pO1xuXG5cdC8vIEFkZCBhbiBKaW5qYTIgYWxpYXNcblx0UHJpc20ubGFuZ3VhZ2VzLmppbmphMiA9IFByaXNtLmxhbmd1YWdlcy5kamFuZ287XG5cdFByaXNtLmhvb2tzLmFkZCgnYmVmb3JlLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdG1hcmt1cFRlbXBsYXRpbmcuYnVpbGRQbGFjZWhvbGRlcnMoZW52LCAnamluamEyJywgcGF0dGVybik7XG5cdH0pO1xuXHRQcmlzbS5ob29rcy5hZGQoJ2FmdGVyLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdG1hcmt1cFRlbXBsYXRpbmcudG9rZW5pemVQbGFjZWhvbGRlcnMoZW52LCAnamluamEyJyk7XG5cdH0pO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlc1snZG5zLXpvbmUtZmlsZSddID0ge1xuXHQnY29tbWVudCc6IC87LiovLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlxcXFwufFteXCJcXFxcXFxyXFxuXSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQndmFyaWFibGUnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyheXFwkT1JJR0lOWyBcXHRdKylcXFMrL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFxccylAKD89XFxzfCQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0fVxuXHRdLFxuXHQna2V5d29yZCc6IC9eXFwkKD86SU5DTFVERXxPUklHSU58VFRMKSg/PVxcc3wkKS9tLFxuXHQnY2xhc3MnOiB7XG5cdFx0Ly8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzEwMzUjcGFnZS0xM1xuXHRcdHBhdHRlcm46IC8oXnxcXHMpKD86Q0h8Q1N8SFN8SU4pKD89XFxzfCQpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J3R5cGUnOiB7XG5cdFx0Ly8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGlzdF9vZl9ETlNfcmVjb3JkX3R5cGVzXG5cdFx0cGF0dGVybjogLyhefFxccykoPzpBfEE2fEFBQUF8QUZTREJ8QVBMfEFUTUF8Q0FBfENETlNLRVl8Q0RTfENFUlR8Q05BTUV8REhDSUR8RExWfEROQU1FfEROU0tFWXxEU3xFSUR8R0lEfEdQT1N8SElORk98SElQfElQU0VDS0VZfElTRE58S0VZfEtYfExPQ3xNQUlMQXxNQUlMQnxNQnxNRHxNRnxNR3xNSU5GT3xNUnxNWHxOQVBUUnxOQnxOQlNUQVR8TklNTE9DfE5JTkZPfE5TfE5TQVB8TlNBUC1QVFJ8TlNFQ3xOU0VDM3xOU0VDM1BBUkFNfE5VTEx8TlhUfE9QRU5QR1BLRVl8UFRSfFBYfFJLRVl8UlB8UlJTSUd8UlR8U0lHfFNJTkt8U01JTUVBfFNPQXxTUEZ8U1JWfFNTSEZQfFRBfFRLRVl8VExTQXxUU0lHfFRYVHxVSUR8VUlORk98VU5TUEVDfFVSSXxXS1N8WDI1KSg/PVxcc3wkKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdwdW5jdHVhdGlvbic6IC9bKCldL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzWydkbnMtem9uZSddID0gUHJpc20ubGFuZ3VhZ2VzWydkbnMtem9uZS1maWxlJ107XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHQvLyBNYW55IG9mIHRoZSBmb2xsb3dpbmcgcmVnZXhlcyB3aWxsIGNvbnRhaW4gbmVnYXRlZCBsb29rYWhlYWRzIGxpa2UgYFsgXFx0XSsoPyFbIFxcdF0pYC4gVGhpcyBpcyBhIHRyaWNrIHRvIGVuc3VyZVxuXHQvLyB0aGF0IHF1YW50aWZpZXJzIGJlaGF2ZSAqYXRvbWljYWxseSouIEF0b21pYyBxdWFudGlmaWVycyBhcmUgbmVjZXNzYXJ5IHRvIHByZXZlbnQgZXhwb25lbnRpYWwgYmFja3RyYWNraW5nLlxuXG5cdHZhciBzcGFjZUFmdGVyQmFja1NsYXNoID0gL1xcXFxbXFxyXFxuXSg/Olxcc3xcXFxcW1xcclxcbl18Iy4qKD8hLikpKig/IVtcXHMjXXxcXFxcW1xcclxcbl0pLy5zb3VyY2U7XG5cdC8vIEF0IGxlYXN0IG9uZSBzcGFjZSwgY29tbWVudCwgb3IgbGluZSBicmVha1xuXHR2YXIgc3BhY2UgPSAvKD86WyBcXHRdKyg/IVsgXFx0XSkoPzo8U1BfQlM+KT98PFNQX0JTPikvLnNvdXJjZVxuXHRcdC5yZXBsYWNlKC88U1BfQlM+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNwYWNlQWZ0ZXJCYWNrU2xhc2g7IH0pO1xuXG5cdHZhciBzdHJpbmcgPSAvXCIoPzpbXlwiXFxcXFxcclxcbl18XFxcXCg/OlxcclxcbnxbXFxzXFxTXSkpKlwifCcoPzpbXidcXFxcXFxyXFxuXXxcXFxcKD86XFxyXFxufFtcXHNcXFNdKSkqJy8uc291cmNlO1xuXHR2YXIgb3B0aW9uID0gLy0tW1xcdy1dKz0oPzo8U1RSPnwoPyFbXCInXSkoPzpbXlxcc1xcXFxdfFxcXFwuKSspLy5zb3VyY2UucmVwbGFjZSgvPFNUUj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gc3RyaW5nOyB9KTtcblxuXHR2YXIgc3RyaW5nUnVsZSA9IHtcblx0XHRwYXR0ZXJuOiBSZWdFeHAoc3RyaW5nKSxcblx0XHRncmVlZHk6IHRydWVcblx0fTtcblx0dmFyIGNvbW1lbnRSdWxlID0ge1xuXHRcdHBhdHRlcm46IC8oXlsgXFx0XSopIy4qL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fTtcblxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZmxhZ3Ncblx0ICogQHJldHVybnMge1JlZ0V4cH1cblx0ICovXG5cdGZ1bmN0aW9uIHJlKHNvdXJjZSwgZmxhZ3MpIHtcblx0XHRzb3VyY2UgPSBzb3VyY2Vcblx0XHRcdC5yZXBsYWNlKC88T1BUPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBvcHRpb247IH0pXG5cdFx0XHQucmVwbGFjZSgvPFNQPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBzcGFjZTsgfSk7XG5cblx0XHRyZXR1cm4gUmVnRXhwKHNvdXJjZSwgZmxhZ3MpO1xuXHR9XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmRvY2tlciA9IHtcblx0XHQnaW5zdHJ1Y3Rpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKSg/OkFERHxBUkd8Q01EfENPUFl8RU5UUllQT0lOVHxFTlZ8RVhQT1NFfEZST018SEVBTFRIQ0hFQ0t8TEFCRUx8TUFJTlRBSU5FUnxPTkJVSUxEfFJVTnxTSEVMTHxTVE9QU0lHTkFMfFVTRVJ8Vk9MVU1FfFdPUktESVIpKD89XFxzKSg/OlxcXFwufFteXFxyXFxuXFxcXF0pKig/OlxcXFwkKD86XFxzfCMuKiQpKig/IVtcXHMjXSkoPzpcXFxcLnxbXlxcclxcblxcXFxdKSopKi9pbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J29wdGlvbnMnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogcmUoLyheKD86T05CVUlMRDxTUD4pP1xcdys8U1A+KTxPUFQ+KD86PFNQPjxPUFQ+KSovLnNvdXJjZSwgJ2knKSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdwcm9wZXJ0eSc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyhefFxccyktLVtcXHctXSsvLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J3N0cmluZyc6IFtcblx0XHRcdFx0XHRcdFx0c3RyaW5nUnVsZSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8oPSkoPyFbXCInXSkoPzpbXlxcc1xcXFxdfFxcXFwuKSsvLFxuXHRcdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdCdvcGVyYXRvcic6IC9cXFxcJC9tLFxuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLz0vXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQna2V5d29yZCc6IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHQvLyBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvcmVmZXJlbmNlL2J1aWxkZXIvI2hlYWx0aGNoZWNrXG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiByZSgvKF4oPzpPTkJVSUxEPFNQPik/SEVBTFRIQ0hFQ0s8U1A+KD86PE9QVD48U1A+KSopKD86Q01EfE5PTkUpXFxiLy5zb3VyY2UsICdpJyksXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHQvLyBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvcmVmZXJlbmNlL2J1aWxkZXIvI2Zyb21cblx0XHRcdFx0XHRcdHBhdHRlcm46IHJlKC8oXig/Ok9OQlVJTEQ8U1A+KT9GUk9NPFNQPig/OjxPUFQ+PFNQPikqKD8hLS0pW14gXFx0XFxcXF0rPFNQPilBUy8uc291cmNlLCAnaScpLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL3JlZmVyZW5jZS9idWlsZGVyLyNvbmJ1aWxkXG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiByZSgvKF5PTkJVSUxEPFNQPilcXHcrLy5zb3VyY2UsICdpJyksXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcdysvLFxuXHRcdFx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRdLFxuXHRcdFx0XHQnY29tbWVudCc6IGNvbW1lbnRSdWxlLFxuXHRcdFx0XHQnc3RyaW5nJzogc3RyaW5nUnVsZSxcblx0XHRcdFx0J3ZhcmlhYmxlJzogL1xcJCg/Olxcdyt8XFx7W157fVwiJ1xcXFxdKlxcfSkvLFxuXHRcdFx0XHQnb3BlcmF0b3InOiAvXFxcXCQvbVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2NvbW1lbnQnOiBjb21tZW50UnVsZVxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5kb2NrZXJmaWxlID0gUHJpc20ubGFuZ3VhZ2VzLmRvY2tlcjtcblxufShQcmlzbSkpO1xuXG4vLyBodHRwczovL3d3dy5ncmFwaHZpei5vcmcvZG9jL2luZm8vbGFuZy5odG1sXG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgSUQgPSAnKD86JyArIFtcblx0XHQvLyBhbiBpZGVudGlmaWVyXG5cdFx0L1thLXpBLVpfXFx4ODAtXFx1RkZGRl1bXFx3XFx4ODAtXFx1RkZGRl0qLy5zb3VyY2UsXG5cdFx0Ly8gYSBudW1iZXJcblx0XHQvLT8oPzpcXC5cXGQrfFxcZCsoPzpcXC5cXGQqKT8pLy5zb3VyY2UsXG5cdFx0Ly8gYSBkb3VibGUtcXVvdGVkIHN0cmluZ1xuXHRcdC9cIlteXCJcXFxcXSooPzpcXFxcW1xcc1xcU11bXlwiXFxcXF0qKSpcIi8uc291cmNlLFxuXHRcdC8vIEhUTUwtbGlrZSBzdHJpbmdcblx0XHQvPCg/OltePD5dfCg/ITwhLS0pPCg/OltePD5cIiddfFwiW15cIl0qXCJ8J1teJ10qJykrPnw8IS0tKD86W14tXXwtKD8hLT4pKSotLT4pKj4vLnNvdXJjZVxuXHRdLmpvaW4oJ3wnKSArICcpJztcblxuXHR2YXIgSURJbnNpZGUgPSB7XG5cdFx0J21hcmt1cCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXjwpW1xcc1xcU10rKD89PiQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogWydsYW5ndWFnZS1tYXJrdXAnLCAnbGFuZ3VhZ2UtaHRtbCcsICdsYW5ndWFnZS14bWwnXSxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cFxuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZmxhZ3Ncblx0ICogQHJldHVybnMge1JlZ0V4cH1cblx0ICovXG5cdGZ1bmN0aW9uIHdpdGhJRChzb3VyY2UsIGZsYWdzKSB7XG5cdFx0cmV0dXJuIFJlZ0V4cChzb3VyY2UucmVwbGFjZSgvPElEPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBJRDsgfSksIGZsYWdzKTtcblx0fVxuXG5cdFByaXNtLmxhbmd1YWdlcy5kb3QgPSB7XG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwvXFwvLip8XFwvXFwqW1xcc1xcU10qP1xcKlxcL3xeIy4qL20sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdncmFwaC1uYW1lJzoge1xuXHRcdFx0cGF0dGVybjogd2l0aElEKC8oXFxiKD86ZGlncmFwaHxncmFwaHxzdWJncmFwaClbIFxcdFxcclxcbl0rKTxJRD4vLnNvdXJjZSwgJ2knKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnLFxuXHRcdFx0aW5zaWRlOiBJREluc2lkZVxuXHRcdH0sXG5cdFx0J2F0dHItdmFsdWUnOiB7XG5cdFx0XHRwYXR0ZXJuOiB3aXRoSUQoLyg9WyBcXHRcXHJcXG5dKik8SUQ+Ly5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZTogSURJbnNpZGVcblx0XHR9LFxuXHRcdCdhdHRyLW5hbWUnOiB7XG5cdFx0XHRwYXR0ZXJuOiB3aXRoSUQoLyhbXFxbOywgXFx0XFxyXFxuXSk8SUQ+KD89WyBcXHRcXHJcXG5dKj0pLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZTogSURJbnNpZGVcblx0XHR9LFxuXHRcdCdrZXl3b3JkJzogL1xcYig/OmRpZ3JhcGh8ZWRnZXxncmFwaHxub2RlfHN0cmljdHxzdWJncmFwaClcXGIvaSxcblx0XHQnY29tcGFzcy1wb2ludCc6IHtcblx0XHRcdHBhdHRlcm46IC8oOlsgXFx0XFxyXFxuXSopKD86W2V3Y19dfFtuc11bZXddPykoPyFbXFx3XFx4ODAtXFx1RkZGRl0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2J1aWx0aW4nXG5cdFx0fSxcblx0XHQnbm9kZSc6IHtcblx0XHRcdHBhdHRlcm46IHdpdGhJRCgvKF58W14tLlxcd1xceDgwLVxcdUZGRkZcXFxcXSk8SUQ+Ly5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZTogSURJbnNpZGVcblx0XHR9LFxuXHRcdCdvcGVyYXRvcic6IC9bPTpdfC1bLT5dLyxcblx0XHQncHVuY3R1YXRpb24nOiAvW1xcW1xcXXt9OyxdL1xuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5ndiA9IFByaXNtLmxhbmd1YWdlcy5kb3Q7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmVibmYgPSB7XG5cdCdjb21tZW50JzogL1xcKFxcKltcXHNcXFNdKj9cXCpcXCkvLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIlteXCJcXHJcXG5dKlwifCdbXidcXHJcXG5dKicvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3BlY2lhbCc6IHtcblx0XHRwYXR0ZXJuOiAvXFw/W14/XFxyXFxuXSpcXD8vLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdH0sXG5cblx0J2RlZmluaXRpb24nOiB7XG5cdFx0cGF0dGVybjogL14oW1xcdCBdKilbYS16XVxcdyooPzpbIFxcdF0rW2Etel1cXHcqKSooPz1cXHMqPSkvaW0sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogWydydWxlJywgJ2tleXdvcmQnXVxuXHR9LFxuXHQncnVsZSc6IC9cXGJbYS16XVxcdyooPzpbIFxcdF0rW2Etel1cXHcqKSpcXGIvaSxcblxuXHQncHVuY3R1YXRpb24nOiAvXFwoWzovXXxbOi9dXFwpfFsuLDsoKVtcXF17fV0vLFxuXHQnb3BlcmF0b3InOiAvWy09fCovIV0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuZWRpdG9yY29uZmlnID0ge1xuXHQvLyBodHRwczovL2VkaXRvcmNvbmZpZy1zcGVjaWZpY2F0aW9uLnJlYWR0aGVkb2NzLmlvXG5cdCdjb21tZW50JzogL1s7I10uKi8sXG5cdCdzZWN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oXlsgXFx0XSopXFxbLitcXF0vbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnc2VsZWN0b3InLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3JlZ2V4JzogL1xcXFxcXFxcW1xcW1xcXXt9LCE/LipdLywgLy8gRXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycyB3aXRoICdcXFxcJ1xuXHRcdFx0J29wZXJhdG9yJzogL1shP118XFwuXFwufFxcKnsxLDJ9Lyxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9bXFxbXFxde30sXS9cblx0XHR9XG5cdH0sXG5cdCdrZXknOiB7XG5cdFx0cGF0dGVybjogLyheWyBcXHRdKilbXlxccz1dKyg/PVsgXFx0XSo9KS9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdhdHRyLW5hbWUnXG5cdH0sXG5cdCd2YWx1ZSc6IHtcblx0XHRwYXR0ZXJuOiAvPS4qLyxcblx0XHRhbGlhczogJ2F0dHItdmFsdWUnLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL149L1xuXHRcdH1cblx0fVxufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmVpZmZlbCA9IHtcblx0J2NvbW1lbnQnOiAvLS0uKi8sXG5cdCdzdHJpbmcnOiBbXG5cdFx0Ly8gQWxpZ25lZC12ZXJiYXRpbS1zdHJpbmdzXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1wiKFteW10qKVxcW1tcXHNcXFNdKj9cXF1cXDFcIi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdC8vIE5vbi1hbGlnbmVkLXZlcmJhdGltLXN0cmluZ3Ncblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXCIoW157XSopXFx7W1xcc1xcU10qP1xcfVxcMVwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0Ly8gU2luZ2xlLWxpbmUgc3RyaW5nXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1wiKD86JSg/Oig/IVxcbilcXHMpKlxcblxccyolfCVcXFN8W14lXCJcXHJcXG5dKSpcIi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdF0sXG5cdC8vIG5vcm1hbCBjaGFyIHwgc3BlY2lhbCBjaGFyIHwgY2hhciBjb2RlXG5cdCdjaGFyJzogLycoPzolLnxbXiUnXFxyXFxuXSkrJy8sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFjcm9zc3xhZ2VudHxhbGlhc3xhbGx8YW5kfGFzfGFzc2lnbnxhdHRhY2hlZHxhdHRyaWJ1dGV8Y2hlY2t8Y2xhc3N8Y29udmVydHxjcmVhdGV8Q3VycmVudHxkZWJ1Z3xkZWZlcnJlZHxkZXRhY2hhYmxlfGRvfGVsc2V8ZWxzZWlmfGVuZHxlbnN1cmV8ZXhwYW5kZWR8ZXhwb3J0fGV4dGVybmFsfGZlYXR1cmV8ZnJvbXxmcm96ZW58aWZ8aW1wbGllc3xpbmhlcml0fGluc3BlY3R8aW52YXJpYW50fGxpa2V8bG9jYWx8bG9vcHxub3R8bm90ZXxvYnNvbGV0ZXxvbGR8b25jZXxvcnxQcmVjdXJzb3J8cmVkZWZpbmV8cmVuYW1lfHJlcXVpcmV8cmVzY3VlfFJlc3VsdHxyZXRyeXxzZWxlY3R8c2VwYXJhdGV8c29tZXx0aGVufHVuZGVmaW5lfHVudGlsfHZhcmlhbnR8Vm9pZHx3aGVufHhvcilcXGIvaSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86RmFsc2V8VHJ1ZSlcXGIvaSxcblx0Ly8gQ29udmVudGlvbjogY2xhc3MtbmFtZXMgYXJlIGFsd2F5cyBhbGwgdXBwZXItY2FzZSBjaGFyYWN0ZXJzXG5cdCdjbGFzcy1uYW1lJzogL1xcYltBLVpdW1xcZEEtWl9dKlxcYi8sXG5cdCdudW1iZXInOiBbXG5cdFx0Ly8gaGV4YSB8IG9jdGFsIHwgYmluXG5cdFx0L1xcYjBbeGNiXVtcXGRhLWZdKD86XypbXFxkYS1mXSkqXFxiL2ksXG5cdFx0Ly8gRGVjaW1hbFxuXHRcdC8oPzpcXGJcXGQoPzpfKlxcZCkqKT9cXC4oPzooPzpcXGQoPzpfKlxcZCkqKT9lWystXT8pP1xcZCg/Ol8qXFxkKSpcXGJ8XFxiXFxkKD86XypcXGQpKlxcYlxcLj8vaVxuXHRdLFxuXHQncHVuY3R1YXRpb24nOiAvOj18PDx8Pj58XFwoXFx8fFxcfFxcKXwtPnxcXC4oPz1cXHcpfFt7fVtcXF07KCksOj9dLyxcblx0J29wZXJhdG9yJzogL1xcXFxcXFxcfFxcfFxcLlxcLlxcfHxcXC5cXC58XFwvW35cXC89XT98Wz48XT0/fFstKypePX5dL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdFByaXNtLmxhbmd1YWdlcy5lanMgPSB7XG5cdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdHBhdHRlcm46IC9ePCVbLV89XT98Wy1fXT8lPiQvLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXHRcdCdjb21tZW50JzogL14jW1xcc1xcU10qLyxcblx0XHQnbGFuZ3VhZ2UtamF2YXNjcmlwdCc6IHtcblx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFxuXHRcdH1cblx0fTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2JlZm9yZS10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHR2YXIgZWpzUGF0dGVybiA9IC88JSg/ISUpW1xcc1xcU10rPyU+L2c7XG5cdFx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLmJ1aWxkUGxhY2Vob2xkZXJzKGVudiwgJ2VqcycsIGVqc1BhdHRlcm4pO1xuXHR9KTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2FmdGVyLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS50b2tlbml6ZVBsYWNlaG9sZGVycyhlbnYsICdlanMnKTtcblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmV0YSA9IFByaXNtLmxhbmd1YWdlcy5lanM7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmVsaXhpciA9IHtcblx0J2RvYyc6IHtcblx0XHRwYXR0ZXJuOiAvQCg/OmRvY3xtb2R1bGVkb2MpXFxzKyg/OihcIlwiXCJ8JycnKVtcXHNcXFNdKj9cXDF8KFwifCcpKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8KD8hXFwyKVteXFxcXFxcclxcbl0pKlxcMikvLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2F0dHJpYnV0ZSc6IC9eQFxcdysvLFxuXHRcdFx0J3N0cmluZyc6IC9bJ1wiXVtcXHNcXFNdKy9cblx0XHR9XG5cdH0sXG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8jLiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQvLyB+clwiXCJcImZvb1wiXCJcIiAobXVsdGktbGluZSksIH5yJycnZm9vJycnIChtdWx0aS1saW5lKSwgfnIvZm9vLywgfnJ8Zm9vfCwgfnJcImZvb1wiLCB+cidmb28nLCB+cihmb28pLCB+cltmb29dLCB+cntmb299LCB+cjxmb28+XG5cdCdyZWdleCc6IHtcblx0XHRwYXR0ZXJuOiAvfltyUl0oPzooXCJcIlwifCcnJykoPzpcXFxcW1xcc1xcU118KD8hXFwxKVteXFxcXF0pK1xcMXwoW1xcL3xcIiddKSg/OlxcXFwufCg/IVxcMilbXlxcXFxcXHJcXG5dKStcXDJ8XFwoKD86XFxcXC58W15cXFxcKVxcclxcbl0pK1xcKXxcXFsoPzpcXFxcLnxbXlxcXFxcXF1cXHJcXG5dKStcXF18XFx7KD86XFxcXC58W15cXFxcfVxcclxcbl0pK1xcfXw8KD86XFxcXC58W15cXFxcPlxcclxcbl0pKz4pW3Vpc214ZnJdKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiBbXG5cdFx0e1xuXHRcdFx0Ly8gfnNcIlwiXCJmb29cIlwiXCIgKG11bHRpLWxpbmUpLCB+cycnJ2ZvbycnJyAobXVsdGktbGluZSksIH5zL2Zvby8sIH5zfGZvb3wsIH5zXCJmb29cIiwgfnMnZm9vJywgfnMoZm9vKSwgfnNbZm9vXSwgfnN7Zm9vfSAod2l0aCBpbnRlcnBvbGF0aW9uIGNhcmUpLCB+czxmb28+XG5cdFx0XHRwYXR0ZXJuOiAvfltjQ3NTd1ddKD86KFwiXCJcInwnJycpKD86XFxcXFtcXHNcXFNdfCg/IVxcMSlbXlxcXFxdKStcXDF8KFtcXC98XCInXSkoPzpcXFxcLnwoPyFcXDIpW15cXFxcXFxyXFxuXSkrXFwyfFxcKCg/OlxcXFwufFteXFxcXClcXHJcXG5dKStcXCl8XFxbKD86XFxcXC58W15cXFxcXFxdXFxyXFxuXSkrXFxdfFxceyg/OlxcXFwufCNcXHtbXn1dK1xcfXwjKD8hXFx7KXxbXiNcXFxcfVxcclxcbl0pK1xcfXw8KD86XFxcXC58W15cXFxcPlxcclxcbl0pKz4pW2NzYV0/Lyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQvLyBTZWUgaW50ZXJwb2xhdGlvbiBiZWxvd1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhcIlwiXCJ8JycnKVtcXHNcXFNdKj9cXDEvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdC8vIFNlZSBpbnRlcnBvbGF0aW9uIGJlbG93XG5cdFx0XHR9XG5cdFx0fSxcblx0XHR7XG5cdFx0XHQvLyBNdWx0aS1saW5lIHN0cmluZ3MgYXJlIGFsbG93ZWRcblx0XHRcdHBhdHRlcm46IC8oXCJ8JykoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQvLyBTZWUgaW50ZXJwb2xhdGlvbiBiZWxvd1xuXHRcdFx0fVxuXHRcdH1cblx0XSxcblx0J2F0b20nOiB7XG5cdFx0Ly8gTG9vay1iZWhpbmQgcHJldmVudHMgYmFkIGhpZ2hsaWdodGluZyBvZiB0aGUgOjogb3BlcmF0b3Jcblx0XHRwYXR0ZXJuOiAvKF58W146XSk6XFx3Ky8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3N5bWJvbCdcblx0fSxcblx0J21vZHVsZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiW0EtWl1cXHcqXFxiLyxcblx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdH0sXG5cdC8vIExvb2stYWhlYWQgcHJldmVudHMgYmFkIGhpZ2hsaWdodGluZyBvZiB0aGUgOjogb3BlcmF0b3Jcblx0J2F0dHItbmFtZSc6IC9cXGJcXHcrXFw/PzooPyE6KS8sXG5cdCdhcmd1bWVudCc6IHtcblx0XHQvLyBMb29rLWJlaGluZCBwcmV2ZW50cyBiYWQgaGlnaGxpZ2h0aW5nIG9mIHRoZSAmJiBvcGVyYXRvclxuXHRcdHBhdHRlcm46IC8oXnxbXiZdKSZcXGQrLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdH0sXG5cdCdhdHRyaWJ1dGUnOiB7XG5cdFx0cGF0dGVybjogL0BcXHcrLyxcblx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHR9LFxuXHQnZnVuY3Rpb24nOiAvXFxiW19hLXpBLVpdXFx3Kls/IV0/KD86KD89XFxzKig/OlxcLlxccyopP1xcKCl8KD89XFwvXFxkKSkvLFxuXHQnbnVtYmVyJzogL1xcYig/OjBbYm94XVthLWZcXGRfXSt8XFxkW1xcZF9dKikoPzpcXC5bXFxkX10rKT8oPzplWystXT9bXFxkX10rKT9cXGIvaSxcblx0J2tleXdvcmQnOiAvXFxiKD86YWZ0ZXJ8YWxpYXN8YW5kfGNhc2V8Y2F0Y2h8Y29uZHxkZWYoPzpjYWxsYmFja3xkZWxlZ2F0ZXxleGNlcHRpb258aW1wbHxtYWNyb3xtb2R1bGV8bnxucHxwfHByb3RvY29sfHN0cnVjdCk/fGRvfGVsc2V8ZW5kfGZufGZvcnxpZnxpbXBvcnR8bm90fG9yfHF1b3RlfHJhaXNlfHJlcXVpcmV8cmVzY3VlfHRyeXx1bmxlc3N8dW5xdW90ZXx1c2V8d2hlbilcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXxuaWx8dHJ1ZSlcXGIvLFxuXHQnb3BlcmF0b3InOiBbXG5cdFx0L1xcYmluXFxifCYmP3xcXHxbfD5dP3xcXFxcXFxcXHw6OnxcXC5cXC5cXC4/fFxcK1xcKz98LVstPl0/fDxbLT0+XXw+PXwhPT0/fFxcQiF8PSg/Oj09P3xbPn5dKT98WypcXC9eXS8sXG5cdFx0e1xuXHRcdFx0Ly8gV2UgZG9uJ3Qgd2FudCB0byBtYXRjaCA8PFxuXHRcdFx0cGF0dGVybjogLyhbXjxdKTwoPyE8KS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHQvLyBXZSBkb24ndCB3YW50IHRvIG1hdGNoID4+XG5cdFx0XHRwYXR0ZXJuOiAvKFtePl0pPig/IT4pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdwdW5jdHVhdGlvbic6IC88PHw+PnxbLiwlXFxbXFxde30oKV0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuZWxpeGlyLnN0cmluZy5mb3JFYWNoKGZ1bmN0aW9uIChvKSB7XG5cdG8uaW5zaWRlID0ge1xuXHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyNcXHtbXn1dK1xcfS8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXiNcXHt8XFx9JC8sXG5cdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0fSxcblx0XHRcdFx0cmVzdDogUHJpc20ubGFuZ3VhZ2VzLmVsaXhpclxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuZWxtID0ge1xuXHQnY29tbWVudCc6IC8tLS4qfFxcey1bXFxzXFxTXSo/LVxcfS8sXG5cdCdjaGFyJzoge1xuXHRcdHBhdHRlcm46IC8nKD86W15cXFxcJ1xcclxcbl18XFxcXCg/OlthYmZucnR2XFxcXCddfFxcZCt8eFswLTlhLWZBLUZdK3x1XFx7WzAtOWEtZkEtRl0rXFx9KSknLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IFtcblx0XHR7XG5cdFx0XHQvLyBNdWx0aWxpbmUgc3RyaW5ncyBhcmUgd3JhcHBlZCBpbiB0cmlwbGUgXCIuIFF1b3RlcyBtYXkgYXBwZWFyIHVuZXNjYXBlZC5cblx0XHRcdHBhdHRlcm46IC9cIlwiXCJbXFxzXFxTXSo/XCJcIlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1wiKD86W15cXFxcXCJcXHJcXG5dfFxcXFwuKSpcIi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdpbXBvcnQtc3RhdGVtZW50Jzoge1xuXHRcdC8vIFRoZSBpbXBvcnRlZCBvciBoaWRkZW4gbmFtZXMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGlzIGltcG9ydFxuXHRcdC8vIHN0YXRlbWVudC4gVGhpcyBpcyBiZWNhdXNlIHdlIHdhbnQgdG8gaGlnaGxpZ2h0IHRob3NlIGV4YWN0bHkgbGlrZVxuXHRcdC8vIHdlIGRvIGZvciB0aGUgbmFtZXMgaW4gdGhlIHByb2dyYW0uXG5cdFx0cGF0dGVybjogLyheW1xcdCBdKilpbXBvcnRcXHMrW0EtWl1cXHcqKD86XFwuW0EtWl1cXHcqKSooPzpcXHMrYXNcXHMrKD86W0EtWl1cXHcqKSg/OlxcLltBLVpdXFx3KikqKT8oPzpcXHMrZXhwb3NpbmdcXHMrKT8vbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2tleXdvcmQnOiAvXFxiKD86YXN8ZXhwb3Npbmd8aW1wb3J0KVxcYi9cblx0XHR9XG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFsaWFzfGFzfGNhc2V8ZWxzZXxleHBvc2luZ3xpZnxpbnxpbmZpeGx8aW5maXhyfGxldHxtb2R1bGV8b2Z8dGhlbnx0eXBlKVxcYi8sXG5cdC8vIFRoZXNlIGFyZSBidWlsdGluIHZhcmlhYmxlcyBvbmx5LiBDb25zdHJ1Y3RvcnMgYXJlIGhpZ2hsaWdodGVkIGxhdGVyIGFzIGEgY29uc3RhbnQuXG5cdCdidWlsdGluJzogL1xcYig/OmFic3xhY29zfGFsd2F5c3xhc2lufGF0YW58YXRhbjJ8Y2VpbGluZ3xjbGFtcHxjb21wYXJlfGNvc3xjdXJyeXxkZWdyZWVzfGV8ZmxpcHxmbG9vcnxmcm9tUG9sYXJ8aWRlbnRpdHl8aXNJbmZpbml0ZXxpc05hTnxsb2dCYXNlfG1heHxtaW58bmVnYXRlfG5ldmVyfG5vdHxwaXxyYWRpYW5zfHJlbXxyb3VuZHxzaW58c3FydHx0YW58dG9GbG9hdHx0b1BvbGFyfHRvU3RyaW5nfHRydW5jYXRlfHR1cm5zfHVuY3Vycnl8eG9yKVxcYi8sXG5cdC8vIGRlY2ltYWwgaW50ZWdlcnMgYW5kIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgfCBoZXhhZGVjaW1hbCBpbnRlZ2Vyc1xuXHQnbnVtYmVyJzogL1xcYig/OlxcZCsoPzpcXC5cXGQrKT8oPzplWystXT9cXGQrKT98MHhbMC05YS1mXSspXFxiL2ksXG5cdC8vIE1vc3Qgb2YgdGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBvZiB0aGUgbWVhbmluZyBvZiBhIHNpbmdsZSAnLicuXG5cdC8vIElmIGl0IHN0YW5kcyBhbG9uZSBmcmVlbHksIGl0IGlzIHRoZSBmdW5jdGlvbiBjb21wb3NpdGlvbi5cblx0Ly8gSXQgbWF5IGFsc28gYmUgYSBzZXBhcmF0b3IgYmV0d2VlbiBhIG1vZHVsZSBuYW1lIGFuZCBhbiBpZGVudGlmaWVyID0+IG5vXG5cdC8vIG9wZXJhdG9yLiBJZiBpdCBjb21lcyB0b2dldGhlciB3aXRoIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycyBpdCBpcyBhblxuXHQvLyBvcGVyYXRvciB0b28uXG5cdC8vIFZhbGlkIG9wZXJhdG9yIGNoYXJhY3RlcnMgaW4gMC4xODogKy0vKj0uJDw+OiZ8Xj8lI0B+IVxuXHQvLyBSZWY6IGh0dHBzOi8vZ3JvdXBzLmdvb2dsZS5jb20vZm9ydW0vIyFtc2cvZWxtLWRldi8wQUhTbkRka1NrUS9FMFNWVTcwSkVRQUpcblx0J29wZXJhdG9yJzogL1xcc1xcLlxcc3xbK1xcLS8qPS4kPD46JnxePyUjQH4hXXsyLH18WytcXC0vKj0kPD46JnxePyUjQH4hXS8sXG5cdC8vIEluIEVsbSwgbmVhcmx5IGV2ZXJ5dGhpbmcgaXMgYSB2YXJpYWJsZSwgZG8gbm90IGhpZ2hsaWdodCB0aGVzZS5cblx0J2h2YXJpYWJsZSc6IC9cXGIoPzpbQS1aXVxcdypcXC4pKlthLXpdXFx3KlxcYi8sXG5cdCdjb25zdGFudCc6IC9cXGIoPzpbQS1aXVxcdypcXC4pKltBLVpdXFx3KlxcYi8sXG5cdCdwdW5jdHVhdGlvbic6IC9be31bXFxdfCgpLC46XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5sdWEgPSB7XG5cdCdjb21tZW50JzogL14jIS4rfC0tKD86XFxbKD0qKVxcW1tcXHNcXFNdKj9cXF1cXDFcXF18LiopL20sXG5cdC8vIFxceiBtYXkgYmUgdXNlZCB0byBza2lwIHRoZSBmb2xsb3dpbmcgc3BhY2Vcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFtcIiddKSg/Oig/IVxcMSlbXlxcXFxcXHJcXG5dfFxcXFx6KD86XFxyXFxufFxccyl8XFxcXCg/OlxcclxcbnxbXnpdKSkqXFwxfFxcWyg9KilcXFtbXFxzXFxTXSo/XFxdXFwyXFxdLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J251bWJlcic6IC9cXGIweFthLWZcXGRdKyg/OlxcLlthLWZcXGRdKik/KD86cFsrLV0/XFxkKyk/XFxifFxcYlxcZCsoPzpcXC5cXEJ8KD86XFwuXFxkKik/KD86ZVsrLV0/XFxkKyk/XFxiKXxcXEJcXC5cXGQrKD86ZVsrLV0/XFxkKyk/XFxiL2ksXG5cdCdrZXl3b3JkJzogL1xcYig/OmFuZHxicmVha3xkb3xlbHNlfGVsc2VpZnxlbmR8ZmFsc2V8Zm9yfGZ1bmN0aW9ufGdvdG98aWZ8aW58bG9jYWx8bmlsfG5vdHxvcnxyZXBlYXR8cmV0dXJufHRoZW58dHJ1ZXx1bnRpbHx3aGlsZSlcXGIvLFxuXHQnZnVuY3Rpb24nOiAvKD8hXFxkKVxcdysoPz1cXHMqKD86Wyh7XSkpLyxcblx0J29wZXJhdG9yJzogW1xuXHRcdC9bLSsqJV4mfCNdfFxcL1xcLz98PFs8PV0/fD5bPj1dP3xbPX5dPT8vLFxuXHRcdHtcblx0XHRcdC8vIE1hdGNoIFwiLi5cIiBidXQgZG9uJ3QgYnJlYWsgXCIuLi5cIlxuXHRcdFx0cGF0dGVybjogLyhefFteLl0pXFwuXFwuKD8hXFwuKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQncHVuY3R1YXRpb24nOiAvW1xcW1xcXSgpe30sO118XFwuK3w6Ky9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHRQcmlzbS5sYW5ndWFnZXMuZXRsdWEgPSB7XG5cdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdHBhdHRlcm46IC9ePCVbLT1dP3wtPyU+JC8sXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cdFx0J2xhbmd1YWdlLWx1YSc6IHtcblx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMubHVhXG5cdFx0fVxuXHR9O1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYmVmb3JlLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdHZhciBwYXR0ZXJuID0gLzwlW1xcc1xcU10rPyU+L2c7XG5cdFx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLmJ1aWxkUGxhY2Vob2xkZXJzKGVudiwgJ2V0bHVhJywgcGF0dGVybik7XG5cdH0pO1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYWZ0ZXItdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLnRva2VuaXplUGxhY2Vob2xkZXJzKGVudiwgJ2V0bHVhJyk7XG5cdH0pO1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHRQcmlzbS5sYW5ndWFnZXMuZXJiID0ge1xuXHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXihcXHMqKTwlPT98JT4oPz1cXHMqJCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblx0XHQncnVieSc6IHtcblx0XHRcdHBhdHRlcm46IC9cXHMqXFxTW1xcc1xcU10qLyxcblx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtcnVieScsXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5ydWJ5XG5cdFx0fVxuXHR9O1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYmVmb3JlLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdHZhciBlcmJQYXR0ZXJuID0gLzwlPT8oPzpbXlxcclxcbl18W1xcclxcbl0oPyE9YmVnaW4pfFtcXHJcXG5dPWJlZ2luXFxzKD86W15cXHJcXG5dfFtcXHJcXG5dKD8hPWVuZCkpKltcXHJcXG5dPWVuZCkrPyU+L2c7XG5cdFx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLmJ1aWxkUGxhY2Vob2xkZXJzKGVudiwgJ2VyYicsIGVyYlBhdHRlcm4pO1xuXHR9KTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2FmdGVyLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS50b2tlbml6ZVBsYWNlaG9sZGVycyhlbnYsICdlcmInKTtcblx0fSk7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmVybGFuZyA9IHtcblx0J2NvbW1lbnQnOiAvJS4rLyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcLnxbXlxcXFxcIlxcclxcbl0pKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3F1b3RlZC1mdW5jdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvJyg/OlxcXFwufFteXFxcXCdcXHJcXG5dKSsnKD89XFwoKS8sXG5cdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0fSxcblx0J3F1b3RlZC1hdG9tJzoge1xuXHRcdHBhdHRlcm46IC8nKD86XFxcXC58W15cXFxcJ1xcclxcbl0pKycvLFxuXHRcdGFsaWFzOiAnYXRvbSdcblx0fSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQna2V5d29yZCc6IC9cXGIoPzphZnRlcnxiZWdpbnxjYXNlfGNhdGNofGVuZHxmdW58aWZ8b2Z8cmVjZWl2ZXx0cnl8d2hlbilcXGIvLFxuXHQnbnVtYmVyJzogW1xuXHRcdC9cXCRcXFxcPy4vLFxuXHRcdC9cXGJcXGQrI1thLXowLTldKy9pLFxuXHRcdC8oPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86ZVsrLV0/XFxkKyk/L2lcblx0XSxcblx0J2Z1bmN0aW9uJzogL1xcYlthLXpdW1xcd0BdKig/PVxcKCkvLFxuXHQndmFyaWFibGUnOiB7XG5cdFx0Ly8gTG9vay1iZWhpbmQgaXMgdXNlZCB0byBwcmV2ZW50IHdyb25nIGhpZ2hsaWdodGluZyBvZiBhdG9tcyBjb250YWluaW5nIFwiQFwiXG5cdFx0cGF0dGVybjogLyhefFteQF0pKD86XFxifFxcPylbQS1aX11bXFx3QF0qLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdvcGVyYXRvcic6IFtcblx0XHQvWz1cXC88PjpdPXw9WzpcXC9dPXxcXCtcXCs/fC0tP3xbPSpcXC8hXXxcXGIoPzphbmR8YW5kYWxzb3xiYW5kfGJub3R8Ym9yfGJzbHxic3J8YnhvcnxkaXZ8bm90fG9yfG9yZWxzZXxyZW18eG9yKVxcYi8sXG5cdFx0e1xuXHRcdFx0Ly8gV2UgZG9uJ3Qgd2FudCB0byBtYXRjaCA8PFxuXHRcdFx0cGF0dGVybjogLyhefFtePF0pPCg/ITwpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdC8vIFdlIGRvbid0IHdhbnQgdG8gbWF0Y2ggPj5cblx0XHRcdHBhdHRlcm46IC8oXnxbXj5dKT4oPyE+KS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQnYXRvbSc6IC9cXGJbYS16XVtcXHdAXSovLFxuXHQncHVuY3R1YXRpb24nOiAvWygpW1xcXXt9OjssLiN8XXw8PHw+Pi9cblxufTtcblxuUHJpc20ubGFuZ3VhZ2VzWydleGNlbC1mb3JtdWxhJ10gPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXFxiTlxcKFxccyopXCIoPzpbXlwiXXxcIlwiKSpcIig/PVxccypcXCkpL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXXxcIlwiKSpcIig/IVwiKS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdyZWZlcmVuY2UnOiB7XG5cdFx0Ly8gaHR0cHM6Ly93d3cuYWJsZWJpdHMuY29tL29mZmljZS1hZGRpbnMtYmxvZy8yMDE1LzEyLzA4L2V4Y2VsLXJlZmVyZW5jZS1hbm90aGVyLXNoZWV0LXdvcmtib29rL1xuXG5cdFx0Ly8gU2FsZXMhQjJcblx0XHQvLyAnV2ludGVyIHNhbGVzJyFCMlxuXHRcdC8vIFtTYWxlcy54bHN4XUphbiFCMjpCNVxuXHRcdC8vIEQ6XFxSZXBvcnRzXFxbU2FsZXMueGxzeF1KYW4hQjI6QjVcblx0XHQvLyAnW1NhbGVzLnhsc3hdSmFuIHNhbGVzJyFCMjpCNVxuXHRcdC8vICdEOlxcUmVwb3J0c1xcW1NhbGVzLnhsc3hdSmFuIHNhbGVzJyFCMjpCNVxuXG5cdFx0cGF0dGVybjogLyg/OidbXiddKid8KD86W15cXHMoKVtcXF17fTw+Kj9cIic7LCQmXSpcXFtbXl5cXHMoKVtcXF17fTw+Kj9cIiddK1xcXSk/XFx3KykhLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J29wZXJhdG9yJzogLyEkLyxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC8nLyxcblx0XHRcdCdzaGVldCc6IHtcblx0XHRcdFx0cGF0dGVybjogL1teW1xcXV0rJC8sXG5cdFx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0XHR9LFxuXHRcdFx0J2ZpbGUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9cXFtbXltcXF1dK1xcXSQvLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvW1tcXF1dL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3BhdGgnOiAvW1xcc1xcU10rL1xuXHRcdH1cblx0fSxcblx0J2Z1bmN0aW9uLW5hbWUnOiB7XG5cdFx0cGF0dGVybjogL1xcYltBLVpdXFx3Kig/PVxcKCkvaSxcblx0XHRhbGlhczogJ2J1aWx0aW4nXG5cdH0sXG5cdCdyYW5nZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFwkP1xcYig/OltBLVpdK1xcJD9cXGQrOlxcJD9bQS1aXStcXCQ/XFxkK3xbQS1aXSs6XFwkP1tBLVpdK3xcXGQrOlxcJD9cXGQrKVxcYi9pLFxuXHRcdGFsaWFzOiAnc2VsZWN0b3InLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J29wZXJhdG9yJzogLzovLFxuXHRcdFx0J2NlbGwnOiAvXFwkP1tBLVpdK1xcJD9cXGQrL2ksXG5cdFx0XHQnY29sdW1uJzogL1xcJD9bQS1aXSsvaSxcblx0XHRcdCdyb3cnOiAvXFwkP1xcZCsvXG5cdFx0fVxuXHR9LFxuXHQnY2VsbCc6IHtcblx0XHQvLyBFeGNlbCBpcyBjYXNlIGluc2Vuc2l0aXZlLCBzbyB0aGUgc3RyaW5nIFwiZm9vMVwiIGNvdWxkIGJlIGVpdGhlciBhIHZhcmlhYmxlIG9yIGEgY2VsbC5cblx0XHQvLyBUbyBjb21iYXQgdGhpcywgd2UgbWF0Y2ggY2VsbHMgY2FzZSBpbnNlbnNpdGl2ZSwgaWYgdGhlIGNvbnRhaW4gYXQgbGVhc3Qgb25lIFwiJFwiLCBhbmQgY2FzZSBzZW5zaXRpdmUgb3RoZXJ3aXNlLlxuXHRcdHBhdHRlcm46IC9cXGJbQS1aXStcXGQrXFxifFxcJFtBLVphLXpdK1xcJD9cXGQrXFxifFxcYltBLVphLXpdK1xcJFxcZCtcXGIvLFxuXHRcdGFsaWFzOiAnc2VsZWN0b3InXG5cdH0sXG5cdCdudW1iZXInOiAvKD86XFxiXFxkKyg/OlxcLlxcZCspP3xcXEJcXC5cXGQrKSg/OmVbKy1dP1xcZCspP1xcYi9pLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpGQUxTRXxUUlVFKVxcYi9pLFxuXHQnb3BlcmF0b3InOiAvWy0rKi9eJT0mLF18PFs9Pl0/fD49Py8sXG5cdCdwdW5jdHVhdGlvbic6IC9bW1xcXSgpO3t9fF0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXNbJ3hsc3gnXSA9IFByaXNtLmxhbmd1YWdlc1sneGxzJ10gPSBQcmlzbS5sYW5ndWFnZXNbJ2V4Y2VsLWZvcm11bGEnXTtcblxuUHJpc20ubGFuZ3VhZ2VzLmZzaGFycCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHQnY29tbWVudCc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcXChcXCooPyFcXCkpW1xcc1xcU10qP1xcKlxcKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcOl0pXFwvXFwvLiovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKD86XCJcIlwiW1xcc1xcU10qP1wiXCJcInxAXCIoPzpcIlwifFteXCJdKSpcInxcIig/OlxcXFxbXFxzXFxTXXxbXlxcXFxcIl0pKlwiKUI/Lyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0cGF0dGVybjogLyhcXGIoPzpleGNlcHRpb258aW5oZXJpdHxpbnRlcmZhY2V8bmV3fG9mfHR5cGUpXFxzK3xcXHdcXHMqOlxccyp8XFxzOlxcPz8+XFxzKilbLlxcd10rXFxiKD86XFxzKig/Oi0+fFxcKilcXHMqWy5cXHddK1xcYikqKD8hXFxzKls6Ll0pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J29wZXJhdG9yJzogLy0+fFxcKi8sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdH1cblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86bGV0fHJldHVybnx1c2V8eWllbGQpKD86IVxcQnxcXGIpfFxcYig/OmFic3RyYWN0fGFuZHxhc3xhc3J8YXNzZXJ0fGF0b21pY3xiYXNlfGJlZ2lufGJyZWFrfGNoZWNrZWR8Y2xhc3N8Y29tcG9uZW50fGNvbnN0fGNvbnN0cmFpbnR8Y29uc3RydWN0b3J8Y29udGludWV8ZGVmYXVsdHxkZWxlZ2F0ZXxkb3xkb25lfGRvd25jYXN0fGRvd250b3xlYWdlcnxlbGlmfGVsc2V8ZW5kfGV2ZW50fGV4Y2VwdGlvbnxleHRlcm58ZXh0ZXJuYWx8ZmFsc2V8ZmluYWxseXxmaXhlZHxmb3J8ZnVufGZ1bmN0aW9ufGZ1bmN0b3J8Z2xvYmFsfGlmfGlufGluY2x1ZGV8aW5oZXJpdHxpbmxpbmV8aW50ZXJmYWNlfGludGVybmFsfGxhbmR8bGF6eXxsb3J8bHNsfGxzcnxseG9yfG1hdGNofG1lbWJlcnxtZXRob2R8bWl4aW58bW9kfG1vZHVsZXxtdXRhYmxlfG5hbWVzcGFjZXxuZXd8bm90fG51bGx8b2JqZWN0fG9mfG9wZW58b3J8b3ZlcnJpZGV8cGFyYWxsZWx8cHJpdmF0ZXxwcm9jZXNzfHByb3RlY3RlZHxwdWJsaWN8cHVyZXxyZWN8c2VhbGVkfHNlbGVjdHxzaWd8c3RhdGljfHN0cnVjdHx0YWlsY2FsbHx0aGVufHRvfHRyYWl0fHRydWV8dHJ5fHR5cGV8dXBjYXN0fHZhbHx2aXJ0dWFsfHZvaWR8dm9sYXRpbGV8d2hlbnx3aGlsZXx3aXRoKVxcYi8sXG5cdCdudW1iZXInOiBbXG5cdFx0L1xcYjB4W1xcZGEtZkEtRl0rKD86TEZ8bGZ8dW4pP1xcYi8sXG5cdFx0L1xcYjBiWzAxXSsoPzp1eXx5KT9cXGIvLFxuXHRcdC8oPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86W2ZtXXxlWystXT9cXGQrKT9cXGIvaSxcblx0XHQvXFxiXFxkKyg/OltJbExzeV18VUx8dVtsc3ldPyk/XFxiL1xuXHRdLFxuXHQnb3BlcmF0b3InOiAvKFs8Pn4mXl0pXFwxXFwxfChbKi46PD4mXSlcXDJ8PC18LT58WyE9Ol09fDw/XFx8ezEsM30+P3xcXD8/KD86PD18Pj18PD58Wy0rKi8lPTw+XSlcXD8/fFshP14mXXx+Wyt+LV18Oj58OlxcPz4/L1xufSk7XG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdmc2hhcnAnLCAna2V5d29yZCcsIHtcblx0J3ByZXByb2Nlc3Nvcic6IHtcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKSMuKi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eScsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnZGlyZWN0aXZlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF4jKVxcYig/OmVsc2V8ZW5kaWZ8aWZ8bGlnaHR8bGluZXxub3dhcm4pXFxiLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSk7XG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdmc2hhcnAnLCAncHVuY3R1YXRpb24nLCB7XG5cdCdjb21wdXRhdGlvbi1leHByZXNzaW9uJzoge1xuXHRcdHBhdHRlcm46IC9cXGJbX2Etel1cXHcqKD89XFxzKlxceykvaSxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH1cbn0pO1xuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnZnNoYXJwJywgJ3N0cmluZycsIHtcblx0J2Fubm90YXRpb24nOiB7XG5cdFx0cGF0dGVybjogL1xcWzwuKz8+XFxdLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXlxcWzx8PlxcXSQvLFxuXHRcdFx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eXFx3KyR8KF58O1xccyopW0EtWl1cXHcqKD89XFwoKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQnYW5ub3RhdGlvbi1jb250ZW50Jzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuZnNoYXJwXG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQnY2hhcic6IHtcblx0XHRwYXR0ZXJuOiAvJyg/OlteXFxcXCddfFxcXFwoPzoufFxcZHszfXx4W2EtZkEtRlxcZF17Mn18dVthLWZBLUZcXGRdezR9fFVbYS1mQS1GXFxkXXs4fSkpJ0I/Lyxcblx0XHRncmVlZHk6IHRydWVcblx0fVxufSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgY29tbWVudF9pbnNpZGUgPSB7XG5cdFx0J2Z1bmN0aW9uJzogL1xcYig/OkJVR1M/fEZJWCg/Ok1FUz8pP3xOT1RFUz98VE9ET1M/fFhYK3xIQUNLUz98V0FSTig/OklORyk/fFxcP3syLH18IXsyLH0pXFxiL1xuXHR9O1xuXHR2YXIgc3RyaW5nX2luc2lkZSA9IHtcblx0XHQnbnVtYmVyJzogL1xcXFxbXlxccyddfCVcXHcvXG5cdH07XG5cblx0dmFyIGZhY3RvciA9IHtcblx0XHQnY29tbWVudCc6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gISBzaW5nbGUtbGluZSBleGNsYW1hdGlvbiBwb2ludCBjb21tZW50cyB3aXRoIHdoaXRlc3BhY2UgYWZ0ZXIvYXJvdW5kIHRoZSAhXG5cdFx0XHRcdHBhdHRlcm46IC8oXnxcXHMpKD86ISAuKnwhJCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IGNvbW1lbnRfaW5zaWRlXG5cdFx0XHR9LFxuXG5cdFx0XHQvKiBmcm9tIGJhc2lzL211bHRpbGluZTogKi9cblx0XHRcdHtcblx0XHRcdFx0Ly8gLyogY29tbWVudCAqLywgLyogY29tbWVudCovXG5cdFx0XHRcdHBhdHRlcm46IC8oXnxcXHMpXFwvXFwqXFxzW1xcc1xcU10qP1xcKlxcLyg/PVxcc3wkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBjb21tZW50X2luc2lkZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gIVtbIGNvbW1lbnQgXV0gLCAhWz09PVsgY29tbWVudF09PT1dXG5cdFx0XHRcdHBhdHRlcm46IC8oXnxcXHMpIVxcWyg9ezAsNn0pXFxbXFxzW1xcc1xcU10qP1xcXVxcMlxcXSg/PVxcc3wkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBjb21tZW50X2luc2lkZVxuXHRcdFx0fVxuXHRcdF0sXG5cblx0XHQnbnVtYmVyJzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyBiYXNpYyBiYXNlIDEwIGludGVnZXJzIDksIC05XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxcXHMpWystXT9cXGQrKD89XFxzfCQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gYmFzZSBwcmVmaXggaW50ZWdlcnMgMGIwMTAgMG83MCAweGFkIDBkMTAgMFhBRCAtMHhhOVxuXHRcdFx0XHRwYXR0ZXJuOiAvKF58XFxzKVsrLV0/MCg/OmJbMDFdK3xvWzAtN10rfGRcXGQrfHhbXFxkQS1GXSspKD89XFxzfCQpL2ksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGZyYWN0aW9uYWwgcmF0aW9zIDEvNSAtMS81IGFuZCB0aGUgbGl0ZXJhbCBmbG9hdCBhcHByb3hpbWF0aW9ucyAxLzUuIC0xLzUuXG5cdFx0XHRcdHBhdHRlcm46IC8oXnxcXHMpWystXT9cXGQrXFwvXFxkK1xcLj8oPz1cXHN8JCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBwb3NpdGl2ZSBtaXhlZCBudW1iZXJzIDIzKzEvNSArMjMrMS81XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxcXHMpXFwrP1xcZCtcXCtcXGQrXFwvXFxkKyg/PVxcc3wkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIG5lZ2F0aXZlIG1peGVkIG51bWJlcnMgLTIzLTEvNVxuXHRcdFx0XHRwYXR0ZXJuOiAvKF58XFxzKS1cXGQrLVxcZCtcXC9cXGQrKD89XFxzfCQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gYmFzaWMgZGVjaW1hbCBmbG9hdHMgLTAuMDEgMC4gLjAgLjEgLS4xIC0xLiAtMTIuMTMgKzEyLjEzXG5cdFx0XHRcdC8vIGFuZCBzY2llbnRpZmljIG5vdGF0aW9uIHdpdGggYmFzZSAxMCBleHBvbmVudHMgM2U0IDNlLTQgLjNlLTRcblx0XHRcdFx0cGF0dGVybjogLyhefFxccylbKy1dPyg/OlxcZCpcXC5cXGQrfFxcZCtcXC5cXGQqfFxcZCspKD86ZVsrLV0/XFxkKyk/KD89XFxzfCQpL2ksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIE5BTiBsaXRlcmFsIHN5bnRheCBOQU46IDgwMDAwZGVhZGJlZWYsIE5BTjogYVxuXHRcdFx0XHRwYXR0ZXJuOiAvKF58XFxzKU5BTjpcXHMrW1xcZGEtZkEtRl0rKD89XFxzfCQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Lypcblx0XHRcdFx0XHRiYXNlIHByZWZpeCBmbG9hdHMgMHgxLjBwMyAoOC4wKSAwYjEuMDEwcDIgKDUuMCkgMHgxLnAxIDBiMS4xMTExMTExMXAxMTExMS4uLlxuXHRcdFx0XHRcdFwiVGhlIG5vcm1hbGl6ZWQgaGV4IGZvcm0gXHUwMEIxMHgxLk1NTU1NTU1NTU1NTU1bcFBdXHUwMEIxRUVFRSBhbGxvd3MgYW55IGZsb2F0aW5nLXBvaW50IG51bWJlciB0byBiZSBzcGVjaWZpZWQgcHJlY2lzZWx5LlxuXHRcdFx0XHRcdFRoZSB2YWx1ZXMgb2YgTU1NTU1NTU1NTU1NTSBhbmQgRUVFRSBtYXAgZGlyZWN0bHkgdG8gdGhlIG1hbnRpc3NhIGFuZCBleHBvbmVudCBmaWVsZHMgb2YgdGhlIGJpbmFyeSBJRUVFIDc1NCByZXByZXNlbnRhdGlvbi5cIlxuXHRcdFx0XHRcdDxodHRwczovL2RvY3MuZmFjdG9yY29kZS5vcmcvY29udGVudC9hcnRpY2xlLXN5bnRheC1mbG9hdHMuaHRtbD5cblx0XHRcdFx0Ki9cblx0XHRcdFx0cGF0dGVybjogLyhefFxccylbKy1dPzAoPzpiMVxcLlswMV0qfG8xXFwuWzAtN10qfGQxXFwuXFxkKnx4MVxcLltcXGRBLUZdKilwXFxkKyg/PVxcc3wkKS9pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblxuXHRcdC8vIFIvIHJlZ2V4cD9cXC9cXFxcL1xuXHRcdCdyZWdleHAnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58XFxzKVJcXC9cXHMoPzpcXFxcXFxTfFteXFxcXC9dKSpcXC8oPzpbaWRtc3JdKnxbaWRtc3JdKy1baWRtc3JdKykoPz1cXHN8JCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnbnVtYmVyJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQndmFyaWFibGUnOiAvXFxcXFxcUy8sXG5cdFx0XHRcdCdrZXl3b3JkJzogL1srPypcXFtcXF1eJCgpe30ufF0vLFxuXHRcdFx0XHQnb3BlcmF0b3InOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhcXC8pW2lkbXNyXSsoPzotW2lkbXNyXSspPy8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdCdib29sZWFuJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFxccylbdGZdKD89XFxzfCQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXG5cdFx0Ly8gU0JVRlwiIGFzZFwiLCBVUkxcIiA6Ly8uLi5cIiwgUFwiIC9ldGMvXCJcblx0XHQnY3VzdG9tLXN0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxcXHMpW0EtWjAtOVxcLV0rXCJcXHMoPzpcXFxcXFxTfFteXCJcXFxcXSkqXCIvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnbnVtYmVyJzogL1xcXFxcXFN8JVxcd3xcXC8vXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdCdtdWx0aWxpbmUtc3RyaW5nJzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyBTVFJJTkc6IG5hbWUgXFxuIGNvbnRlbnQgXFxuIDsgLT4gQ09OU1RBTlQ6IG5hbWUgXCJjb250ZW50XCIgKHN5bWJvbClcblx0XHRcdFx0cGF0dGVybjogLyhefFxccylTVFJJTkc6XFxzK1xcUysoPzpcXG58XFxyXFxuKS4qKD86XFxufFxcclxcbilcXHMqOyg/PVxcc3wkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnbnVtYmVyJzogc3RyaW5nX2luc2lkZS5udW1iZXIsXG5cdFx0XHRcdFx0Ly8gdHJhaWxpbmcgc2VtaWNvbG9uIG9uIGl0cyBvd24gbGluZVxuXHRcdFx0XHRcdCdzZW1pY29sb24tb3Itc2V0bG9jYWwnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKFtcXHJcXG5dWyBcXHRdKik7KD89XFxzfCQpLyxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gSEVSRURPQzogbWFya2VyIFxcbiBjb250ZW50IFxcbiBtYXJrZXIgOyAtPiBcImNvbnRlbnRcIiAoaW1tZWRpYXRlKVxuXHRcdFx0XHRwYXR0ZXJuOiAvKF58XFxzKUhFUkVET0M6XFxzK1xcUysoPzpcXG58XFxyXFxuKS4qKD86XFxufFxcclxcbilcXHMqXFxTKyg/PVxcc3wkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHRcdFx0XHRpbnNpZGU6IHN0cmluZ19pbnNpZGVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFtbIHN0cmluZyBdXSwgWz09WyBzdHJpbmddPT1dXG5cdFx0XHRcdHBhdHRlcm46IC8oXnxcXHMpXFxbKD17MCw2fSlcXFtcXHNbXFxzXFxTXSo/XFxdXFwyXFxdKD89XFxzfCQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ3N0cmluZycsXG5cdFx0XHRcdGluc2lkZTogc3RyaW5nX2luc2lkZVxuXHRcdFx0fVxuXHRcdF0sXG5cblx0XHQnc3BlY2lhbC11c2luZyc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxcXHMpVVNJTkc6KD86XFxzXFxTKykqKD89XFxzKzsoPzpcXHN8JCkpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQvLyB0aGlzIGlzIGVzc2VudGlhbGx5IGEgcmVnZXggZm9yIHZvY2FiIG5hbWVzLCB3aGljaCBpIGRvbid0IHdhbnQgdG8gc3BlY2lmeVxuXHRcdFx0XHQvLyBidXQgdGhlIFVTSU5HOiBnZXRzIHBpY2tlZCB1cCBhcyBhIHZvY2FiIG5hbWVcblx0XHRcdFx0J3N0cmluZyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKFxccylbXjpcXHNdKy8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8qIHRoaXMgZGVzY3JpcHRpb24gb2Ygc3RhY2sgZWZmZWN0IGxpdGVyYWwgc3ludGF4IGlzIG5vdCBjb21wbGV0ZSBhbmQgbm90IGFzIHNwZWNpZmljIGFzIHRoZW9yZXRpY2FsbHkgcG9zc2libGVcblx0XHRcdHRyeWluZyB0byBkbyBiZXR0ZXIgaXMgbW9yZSB3b3JrIGFuZCByZWdleC1jb21wdXRhdGlvbi10aW1lIHRoYW4gaXQncyB3b3J0aCB0aG91Z2guXG5cdFx0XHQtIHdlJ2QgbGlrZSB0byBoYXZlIHRoZSBcImRlbGltaXRlclwiIHBhcnRzIG9mIHRoZSBzdGFjayBlZmZlY3QgWyAoLCAtLSwgYW5kICkgXSBiZSBhIGRpZmZlcmVudCAobGVzcy1pbXBvcnRhbnQgb3IgY29tbWVudC1saWtlKSBjb2xvdXIgdG8gdGhlIHN0YWNrIGVmZmVjdCBjb250ZW50c1xuXHRcdFx0LSB3ZSdkIGxpa2UgaWYgbmVzdGVkIHN0YWNrIGVmZmVjdHMgd2VyZSB0cmVhdGVkIGFzIHN1Y2ggcmF0aGVyIHRoYW4ganVzdCBhcHBlYXJpbmcgZmxhdCAod2l0aCBgaW5zaWRlYClcblx0XHRcdC0gd2UnZCBsaWtlIGlmIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUgbmFtZSBjb252ZW50aW9ucyB3ZXJlIHJlY29nbmlzZWQgc3BlY2lmaWNhbGx5OlxuXHRcdFx0XHRzcGVjaWFsIHJvdyB2YXJpYWJsZXMgPSAuLmEgYi4uXG5cdFx0XHRcdHR5cGUgYW5kIHN0YWNrIGVmZmVjdCBhbm5vdGF0aW9ucyBlbmQgd2l0aCBhIGNvbG9uID0gKCBxdW90OiAoIGE6ICggLS0gKSAtLSBiICkgLS0geCApLCAoIHg6IG51bWJlciAtLSApXG5cdFx0XHRcdHdvcmQgdGhyb3dzIHVuY29uZGl0aW9uYWwgZXJyb3IgPSAqXG5cdFx0XHRcdGFueSBvdGhlciB3b3JkLWxpa2UgdmFyaWFibGUgbmFtZSA9IGEgPyBxJyBldGNcblxuXHRcdFx0aHR0cHM6Ly9kb2NzLmZhY3RvcmNvZGUub3JnL2NvbnRlbnQvYXJ0aWNsZS1lZmZlY3RzLmh0bWxcblxuXHRcdFx0dGhlc2UgYXJlIHByZXR0eSBjb21wbGljYXRlZCB0byBoaWdobGlnaHQgcHJvcGVybHkgd2l0aG91dCBhIHJlYWwgcGFyc2VyLCBhbmQgdGhlcmVmb3JlIG91dCBvZiBzY29wZVxuXHRcdFx0dGhlIG9sZCBwYXR0ZXJuLCB3aGljaCBtYXkgYmUgbGF0ZXIgdXNlZnVsLCB3YXM6IChefFxccykoPzpjYWxsfGV4ZWN1dGV8ZXZhbCk/XFwoKD86XFxzK1teXCJcXHJcXG5cXHQgXVxcUyopKj9cXHMrLS0oPzpcXHMrW15cIlxcblxcdCBdXFxTKikqP1xccytcXCkoPz1cXHN8JClcblx0XHQqL1xuXG5cdFx0Ly8gY3VycmVudCBzb2x1dGlvbiBpcyBub3QgZ3JlYXRcblx0XHQnc3RhY2stZWZmZWN0LWRlbGltaXRlcic6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gb3BlbmluZyBwYXJlbnRoZXNpc1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58XFxzKSg/OmNhbGx8ZXZhbHxleGVjdXRlKT9cXCgoPz1cXHMpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIG1pZGRsZSAtLVxuXHRcdFx0XHRwYXR0ZXJuOiAvKFxccyktLSg/PVxccykvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gY2xvc2luZyBwYXJlbnRoZXNpc1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxccylcXCkoPz1cXHN8JCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdFx0fVxuXHRcdF0sXG5cblx0XHQnY29tYmluYXRvcnMnOiB7XG5cdFx0XHRwYXR0ZXJuOiBudWxsLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9LFxuXG5cdFx0J2tlcm5lbC1idWlsdGluJzoge1xuXHRcdFx0cGF0dGVybjogbnVsbCxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHRcdH0sXG5cblx0XHQnc2VxdWVuY2VzLWJ1aWx0aW4nOiB7XG5cdFx0XHRwYXR0ZXJuOiBudWxsLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdFx0fSxcblxuXHRcdCdtYXRoLWJ1aWx0aW4nOiB7XG5cdFx0XHRwYXR0ZXJuOiBudWxsLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdFx0fSxcblxuXHRcdCdjb25zdHJ1Y3Rvci13b3JkJzoge1xuXHRcdFx0Ly8gPGFycmF5PiBidXQgbm90IDw9PlxuXHRcdFx0cGF0dGVybjogLyhefFxccyk8KD8hPSs+fC0rPilcXFMrPig/PVxcc3wkKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH0sXG5cblx0XHQnb3RoZXItYnVpbHRpbi1zeW50YXgnOiB7XG5cdFx0XHRwYXR0ZXJuOiBudWxsLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0fSxcblxuXHRcdC8qXG5cdFx0XHRmdWxsIGxpc3Qgb2Ygc3VwcG9ydGVkIHdvcmQgbmFtaW5nIGNvbnZlbnRpb25zOiAodGhlIGNvbnZlbnRpb24gYXBwZWFycyBvdXRzaWRlIG9mIHRoZSBbYnJhY2tldHNdKVxuXHRcdFx0XHRzZXQtW3hdXG5cdFx0XHRcdGNoYW5nZS1beF1cblx0XHRcdFx0d2l0aC1beF1cblx0XHRcdFx0bmV3LVt4XVxuXHRcdFx0XHQ+W3N0cmluZ11cblx0XHRcdFx0W2Jhc2VdPlxuXHRcdFx0XHRbc3RyaW5nXT5bbnVtYmVyXVxuXHRcdFx0XHQrW3N5bWJvbF0rXG5cdFx0XHRcdFtib29sZWFuLXdvcmRdP1xuXHRcdFx0XHQ/W29mXVxuXHRcdFx0XHRbc2xvdC1yZWFkZXJdPj5cblx0XHRcdFx0Pj5bc2xvdC1zZXR0ZXJdXG5cdFx0XHRcdFtzbG90LXdyaXRlcl08PFxuXHRcdFx0XHQoW2ltcGxlbWVudGF0aW9uLWRldGFpbF0pXG5cdFx0XHRcdFttdXRhdGVyXSFcblx0XHRcdFx0W3ZhcmlhbnRdKlxuXHRcdFx0XHRbcHJldHR5cHJpbnRdLlxuXHRcdFx0XHQkW2hlbHAtbWFya3VwXVxuXG5cdFx0XHQ8Y29uc3RydWN0b3JzPiwgU1lOVEFYOiwgZXRjIGFyZSBzdXBwb3J0ZWQgYnkgdGhlaXIgb3duIHBhdHRlcm5zLlxuXG5cdFx0XHRgd2l0aGAgYW5kIGBuZXdgIGZyb20gYGtlcm5lbGAgYXJlIHRoZWlyIG93biBidWlsdGlucy5cblxuXHRcdFx0c2VlIDxodHRwczovL2RvY3MuZmFjdG9yY29kZS5vcmcvY29udGVudC9hcnRpY2xlLWNvbnZlbnRpb25zLmh0bWw+XG5cdFx0Ki9cblx0XHQnY29udmVudGlvbmFsbHktbmFtZWQtd29yZCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxcXHMpKD8hXCIpKD86KD86Y2hhbmdlfG5ld3xzZXR8d2l0aCktXFxTK3xcXCRcXFMrfD5bXj5cXHNdK3xbXjo+XFxzXSs+fFtePlxcc10rPltePlxcc10rfFxcK1teK1xcc10rXFwrfFteP1xcc10rXFw/fFxcP1teP1xcc10rfFtePlxcc10rPj58Pj5bXj5cXHNdK3xbXjxcXHNdKzw8fFxcKFteKClcXHNdK1xcKXxbXiFcXHNdKyF8W14qXFxzXVxcUypcXCp8W14uXFxzXVxcUypcXC4pKD89XFxzfCQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fSxcblxuXHRcdCdjb2xvbi1zeW50YXgnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58XFxzKSg/OltBLVowLTlcXC1dKyM/KT86ezEsMn1cXHMrKD86O1xcUyt8KD8hOylcXFMrKSg/PVxcc3wkKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9LFxuXG5cdFx0J3NlbWljb2xvbi1vci1zZXRsb2NhbCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxzKSg/Ojt8Oj4pKD89XFxzfCQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH0sXG5cblx0XHQvLyBkbyBub3QgaGlnaGxpZ2h0IGxlYWRpbmcgfSBvciB0cmFpbGluZyBYeyBhdCB0aGUgYmVnaW4vZW5kIG9mIHRoZSBmaWxlIGFzIGl0J3MgaW52YWxpZCBzeW50YXhcblx0XHQnY3VybHktYnJhY2UtbGl0ZXJhbC1kZWxpbWl0ZXInOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vIG9wZW5pbmdcblx0XHRcdFx0cGF0dGVybjogLyhefFxccylbYS16XSpcXHsoPz1cXHMpL2ksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBjbG9zaW5nXG5cdFx0XHRcdHBhdHRlcm46IC8oXFxzKVxcfSg/PVxcc3wkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0XHR9LFxuXG5cdFx0XSxcblxuXHRcdC8vIGRvIG5vdCBoaWdobGlnaHQgbGVhZGluZyBdIG9yIHRyYWlsaW5nIFsgYXQgdGhlIGJlZ2luL2VuZCBvZiB0aGUgZmlsZSBhcyBpdCdzIGludmFsaWQgc3ludGF4XG5cdFx0J3F1b3RhdGlvbi1kZWxpbWl0ZXInOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vIG9wZW5pbmdcblx0XHRcdFx0cGF0dGVybjogLyhefFxccylcXFsoPz1cXHMpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGNsb3Npbmdcblx0XHRcdFx0cGF0dGVybjogLyhcXHMpXFxdKD89XFxzfCQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHRcdH0sXG5cdFx0XSxcblxuXHRcdCdub3JtYWwtd29yZCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxcXHMpW15cIlxcc11cXFMqKD89XFxzfCQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXG5cdFx0Lypcblx0XHRcdGJhc2ljIGZpcnN0LWNsYXNzIHN0cmluZyBcImFcIlxuXHRcdFx0XHR3aXRoIGVzY2FwZWQgZG91YmxlLXF1b3RlIFwiYVxcXCJcIlxuXHRcdFx0XHRlc2NhcGVkIGJhY2tzbGFzaCBcIlxcXFxcIlxuXHRcdFx0XHRhbmQgZ2VuZXJhbCBlc2NhcGVzIHNpbmNlIEZhY3RvciBoYXMgc28gbWFueSBcIlxcTlwiXG5cblx0XHRcdHN5bnRheCB0aGF0IHdvcmtzIGluIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gdGhhdCBpc24ndCBmdWxseVxuXHRcdFx0c3VwcG9ydGVkIGJlY2F1c2UgaXQncyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6XG5cdFx0XHRcdFwic3RyaW5nIDFcIlwic3RyaW5nIDJcIiAtPiAyIHN0cmluZ3MgKHdvcmtzIGFueXdheSlcblx0XHRcdFx0XCJzdHJpbmdcIjUgLT4gc3RyaW5nLCA1XG5cdFx0XHRcdFwic3RyaW5nXCJbIF0gLT4gc3RyaW5nLCBxdW90YXRpb25cblx0XHRcdFx0eyBcImFcIn0gLT4gYXJyYXk8c3RyaW5nPlxuXG5cdFx0XHR0aGUgcmVzdCBvZiB0aG9zZSBleGFtcGxlcyBhbGwgcHJvcGVybHkgcmVjb2duaXNlIHRoZSBzdHJpbmcsIGJ1dCBub3Rcblx0XHRcdFx0dGhlIG90aGVyIG9iamVjdCAobnVtYmVyLCBxdW90YXRpb24sIGV0Yylcblx0XHRcdHRoaXMgaXMgZmluZSBmb3IgYSByZWdleC1vbmx5IGltcGxlbWVudGF0aW9uLlxuXHRcdCovXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9cIig/OlxcXFxcXFN8W15cIlxcXFxdKSpcIi8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHN0cmluZ19pbnNpZGVcblx0XHR9XG5cdH07XG5cblx0dmFyIGVzY2FwZSA9IGZ1bmN0aW9uIChzdHIpIHtcblx0XHRyZXR1cm4gKHN0ciArICcnKS5yZXBsYWNlKC8oWy4/KitcXF4kXFxbXFxdXFxcXCgpe318XFwtXSkvZywgJ1xcXFwkMScpO1xuXHR9O1xuXG5cdHZhciBhcnJUb1dvcmRzUmVnRXhwID0gZnVuY3Rpb24gKGFycikge1xuXHRcdHJldHVybiBuZXcgUmVnRXhwKFxuXHRcdFx0JyhefFxcXFxzKSg/OicgKyBhcnIubWFwKGVzY2FwZSkuam9pbignfCcpICsgJykoPz1cXFxcc3wkKSdcblx0XHQpO1xuXHR9O1xuXG5cdHZhciBidWlsdGlucyA9IHtcblx0XHQna2VybmVsLWJ1aWx0aW4nOiBbXG5cdFx0XHQnb3InLCAnMm5pcGQnLCAnNGRyb3AnLCAndHVjaycsICd3cmFwcGVyJywgJ25pcCcsICd3cmFwcGVyPycsICdjYWxsc3RhY2s+YXJyYXknLCAnZGllJywgJ2R1cGQnLCAnY2FsbHN0YWNrJywgJ2NhbGxzdGFjaz8nLCAnM2R1cCcsICdoYXNoY29kZScsICdwaWNrJywgJzRuaXAnLCAnYnVpbGQnLCAnPmJvb2xlYW4nLCAnbmlwZCcsICdjbG9uZScsICc1bmlwJywgJ2VxPycsICc/JywgJz0nLCAnc3dhcGQnLCAnMm92ZXInLCAnY2xlYXInLCAnMmR1cCcsICdnZXQtcmV0YWluc3RhY2snLCAnbm90JywgJ3R1cGxlPycsICdkdXAnLCAnM25pcGQnLCAnY2FsbCcsICctcm90ZCcsICdvYmplY3QnLCAnZHJvcCcsICdhc3NlcnQ9JywgJ2Fzc2VydD8nLCAnLXJvdCcsICdleGVjdXRlJywgJ2JvYScsICdnZXQtY2FsbHN0YWNrJywgJ2N1cnJpZWQ/JywgJzNkcm9wJywgJ3BpY2tkJywgJ292ZXJkJywgJ292ZXInLCAncm9sbCcsICczbmlwJywgJ3N3YXAnLCAnYW5kJywgJzJuaXAnLCAncm90ZCcsICd0aHJvdycsICcoY2xvbmUpJywgJ2hhc2hjb2RlKicsICdzcGluJywgJ3JlYWNoJywgJzRkdXAnLCAnZXF1YWw/JywgJ2dldC1kYXRhc3RhY2snLCAnYXNzZXJ0JywgJzJkcm9wJywgJzx3cmFwcGVyPicsICdib29sZWFuPycsICdpZGVudGl0eS1oYXNoY29kZScsICdpZGVudGl0eS10dXBsZT8nLCAnbnVsbCcsICdjb21wb3NlZD8nLCAnbmV3JywgJzVkcm9wJywgJ3JvdCcsICctcm9sbCcsICd4b3InLCAnaWRlbnRpdHktdHVwbGUnLCAnYm9vbGVhbidcblx0XHRdLFxuXHRcdCdvdGhlci1idWlsdGluLXN5bnRheCc6IFtcblx0XHRcdC8vIHN5bnRheFxuXHRcdFx0Jz09PT09PT0nLCAncmVjdXJzaXZlJywgJ2ZsdXNoYWJsZScsICc+PicsICc8PDw8PDwnLCAnTVxcXFwnLCAnQicsICdQUklWQVRFPicsICdcXFxcJywgJz09PT09PScsICdmaW5hbCcsICdpbmxpbmUnLCAnZGVsaW1pdGVyJywgJ2RlcHJlY2F0ZWQnLCAnPFBSSVZBVEUnLCAnPj4+Pj4+JywgJzw8PDw8PDwnLCAncGFyc2UtY29tcGxleCcsICdtYWxmb3JtZWQtY29tcGxleCcsICdyZWFkLW9ubHknLCAnPj4+Pj4+PicsICdjYWxsLW5leHQtbWV0aG9kJywgJzw8JywgJ2ZvbGRhYmxlJyxcblx0XHRcdC8vIGxpdGVyYWxzXG5cdFx0XHQnJCcsICckWycsICckeydcblx0XHRdLFxuXHRcdCdzZXF1ZW5jZXMtYnVpbHRpbic6IFtcblx0XHRcdCdtZW1iZXItZXE/JywgJ21pc21hdGNoJywgJ2FwcGVuZCcsICdhc3NlcnQtc2VxdWVuY2U9JywgJ2xvbmdlcicsICdyZXBldGl0aW9uJywgJ2Nsb25lLWxpa2UnLCAnM3NlcXVlbmNlJywgJ2Fzc2VydC1zZXF1ZW5jZT8nLCAnbGFzdC1pbmRleC1mcm9tJywgJ3JldmVyc2VkJywgJ2luZGV4LWZyb20nLCAnY3V0KicsICdwYWQtdGFpbCcsICdqb2luLWFzJywgJ3JlbW92ZS1lcSEnLCAnY29uY2F0LWFzJywgJ2J1dC1sYXN0JywgJ3NuaXAnLCAnbnRocycsICdudGgnLCAnc2VxdWVuY2UnLCAnbG9uZ2VzdCcsICdzbGljZT8nLCAnPHNsaWNlPicsICdyZW1vdmUtbnRoJywgJ3RhaWwtc2xpY2UnLCAnZW1wdHk/JywgJ3RhaWwqJywgJ21lbWJlcj8nLCAndmlydHVhbC1zZXF1ZW5jZT8nLCAnc2V0LWxlbmd0aCcsICdkcm9wLXByZWZpeCcsICdpb3RhJywgJ3VuY2xpcCcsICdib3VuZHMtZXJyb3I/JywgJ3VuY2xpcC1sYXN0LXNsaWNlJywgJ25vbi1uZWdhdGl2ZS1pbnRlZ2VyLWV4cGVjdGVkJywgJ25vbi1uZWdhdGl2ZS1pbnRlZ2VyLWV4cGVjdGVkPycsICdtaWRwb2ludEAnLCAnbG9uZ2VyPycsICc/c2V0LW50aCcsICc/Zmlyc3QnLCAncmVzdC1zbGljZScsICdwcmVwZW5kLWFzJywgJ3ByZXBlbmQnLCAnZm91cnRoJywgJ3NpZnQnLCAnc3Vic2VxLXN0YXJ0JywgJ25ldy1zZXF1ZW5jZScsICc/bGFzdCcsICdsaWtlJywgJ2ZpcnN0NCcsICcxc2VxdWVuY2UnLCAncmV2ZXJzZScsICdzbGljZScsICd2aXJ0dWFsQCcsICdyZXBldGl0aW9uPycsICdzZXQtbGFzdCcsICdpbmRleCcsICc0c2VxdWVuY2UnLCAnbWF4LWxlbmd0aCcsICdzZXQtc2Vjb25kJywgJ2ltbXV0YWJsZS1zZXF1ZW5jZScsICdmaXJzdDInLCAnZmlyc3QzJywgJ3N1cHJlbXVtJywgJ3VuY2xpcC1zbGljZScsICdzdWZmaXghJywgJ2luc2VydC1udGgnLCAndGFpbCcsICczYXBwZW5kJywgJ3Nob3J0JywgJ3N1ZmZpeCcsICdjb25jYXQnLCAnZmxpcCcsICdpbW11dGFibGU/JywgJ3JldmVyc2UhJywgJzJzZXF1ZW5jZScsICdzdW0nLCAnZGVsZXRlLWFsbCcsICdpbmRpY2VzJywgJ3NuaXAtc2xpY2UnLCAnPGlvdGE+JywgJ2NoZWNrLXNsaWNlJywgJ3NlcXVlbmNlPycsICdoZWFkJywgJ2FwcGVuZC1hcycsICdoYWx2ZXMnLCAnc2VxdWVuY2U9JywgJ2NvbGxhcHNlLXNsaWNlJywgJz9zZWNvbmQnLCAnc2xpY2UtZXJyb3I/JywgJ3Byb2R1Y3QnLCAnYm91bmRzLWNoZWNrPycsICdib3VuZHMtY2hlY2snLCAnaW1tdXRhYmxlJywgJ3ZpcnR1YWwtZXhlbXBsYXInLCAnaGFydmVzdCcsICdyZW1vdmUnLCAncGFkLWhlYWQnLCAnbGFzdCcsICdzZXQtZm91cnRoJywgJ2NhcnRlc2lhbi1wcm9kdWN0JywgJ3JlbW92ZS1lcScsICdzaG9ydGVuJywgJ3Nob3J0ZXInLCAncmV2ZXJzZWQ/JywgJ3Nob3J0ZXI/JywgJ3Nob3J0ZXN0JywgJ2hlYWQtc2xpY2UnLCAncG9wKicsICd0YWlsLXNsaWNlKicsICdidXQtbGFzdC1zbGljZScsICdpb3RhPycsICdhcHBlbmQhJywgJ2N1dC1zbGljZScsICduZXctcmVzaXphYmxlJywgJ2hlYWQtc2xpY2UqJywgJ3NlcXVlbmNlLWhhc2hjb2RlJywgJ3BvcCcsICdzZXQtbnRoJywgJz9udGgnLCAnc2Vjb25kJywgJ2pvaW4nLCAnaW1tdXRhYmxlLXNlcXVlbmNlPycsICc8cmV2ZXJzZWQ+JywgJzNhcHBlbmQtYXMnLCAndmlydHVhbC1zZXF1ZW5jZScsICdzdWJzZXE/JywgJ3JlbW92ZS1udGghJywgJ2xlbmd0aCcsICdsYXN0LWluZGV4JywgJ2xlbmd0aGVuJywgJ2Fzc2VydC1zZXF1ZW5jZScsICdjb3B5JywgJ21vdmUnLCAndGhpcmQnLCAnZmlyc3QnLCAndGFpbD8nLCAnc2V0LWZpcnN0JywgJ3ByZWZpeCcsICdib3VuZHMtZXJyb3InLCAnPHJlcGV0aXRpb24+JywgJ2V4Y2hhbmdlJywgJ3N1cnJvdW5kJywgJ2N1dCcsICdtaW4tbGVuZ3RoJywgJ3NldC10aGlyZCcsICdwdXNoLWFsbCcsICdoZWFkPycsICdzdWJzZXEtc3RhcnQtZnJvbScsICdkZWxldGUtc2xpY2UnLCAncmVzdCcsICdzdW0tbGVuZ3RocycsICdoZWFkKicsICdpbmZpbXVtJywgJ3JlbW92ZSEnLCAnZ2x1ZScsICdzbGljZS1lcnJvcicsICdzdWJzZXEnLCAncHVzaCcsICdyZXBsYWNlLXNsaWNlJywgJ3N1YnNlcS1hcycsICd1bmNsaXAtbGFzdCdcblx0XHRdLFxuXHRcdCdtYXRoLWJ1aWx0aW4nOiBbXG5cdFx0XHQnbnVtYmVyPScsICduZXh0LXBvd2VyLW9mLTInLCAnPzErJywgJ2ZwLXNwZWNpYWw/JywgJ2ltYWdpbmFyeS1wYXJ0JywgJ2Zsb2F0PmJpdHMnLCAnbnVtYmVyPycsICdmcC1pbmZpbml0eT8nLCAnYmlnbnVtPycsICdmcC1zbmFuPycsICdkZW5vbWluYXRvcicsICdnY2QnLCAnKicsICcrJywgJ2ZwLWJpdHdpc2U9JywgJy0nLCAndT49JywgJy8nLCAnPj0nLCAnYml0YW5kJywgJ3Bvd2VyLW9mLTI/JywgJ2xvZzItZXhwZWN0cy1wb3NpdGl2ZScsICduZWc/JywgJzwnLCAnbG9nMicsICc+JywgJ2ludGVnZXI/JywgJ251bWJlcicsICdiaXRzPmRvdWJsZScsICcyLycsICd6ZXJvPycsICdiaXRzPmZsb2F0JywgJ2Zsb2F0PycsICdzaGlmdCcsICdyYXRpbz8nLCAncmVjdD4nLCAnZXZlbj8nLCAncmF0aW8nLCAnZnAtc2lnbicsICdiaXRub3QnLCAnPmZpeG51bScsICdjb21wbGV4PycsICcvaScsICdpbnRlZ2VyPmZpeG51bScsICcvZicsICdzZ24nLCAnPmJpZ251bScsICduZXh0LWZsb2F0JywgJ3U8JywgJ3U+JywgJ21vZCcsICdyZWNpcCcsICdyYXRpb25hbCcsICc+ZmxvYXQnLCAnMl4nLCAnaW50ZWdlcicsICdmaXhudW0/JywgJ25lZycsICdmaXhudW0nLCAnc3EnLCAnYmlnbnVtJywgJz5yZWN0JywgJ2JpdD8nLCAnZnAtcW5hbj8nLCAnc2ltcGxlLWdjZCcsICdjb21wbGV4JywgJzxmcC1uYW4+JywgJ3JlYWwnLCAnPmZyYWN0aW9uJywgJ2RvdWJsZT5iaXRzJywgJ2JpdG9yJywgJ3JlbScsICdmcC1uYW4tcGF5bG9hZCcsICdyZWFsLXBhcnQnLCAnbG9nMi1leHBlY3RzLXBvc2l0aXZlPycsICdwcmV2LWZsb2F0JywgJ2FsaWduJywgJ3Vub3JkZXJlZD8nLCAnZmxvYXQnLCAnZnAtbmFuPycsICdhYnMnLCAnYml0eG9yJywgJ2ludGVnZXI+Zml4bnVtLXN0cmljdCcsICd1PD0nLCAnb2RkPycsICc8PScsICcvbW9kJywgJz5pbnRlZ2VyJywgJ3JlYWw/JywgJ3JhdGlvbmFsPycsICdudW1lcmF0b3InXG5cdFx0XVxuXHRcdC8vIHRoYXQncyBhbGwgZm9yIG5vd1xuXHR9O1xuXG5cdE9iamVjdC5rZXlzKGJ1aWx0aW5zKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG5cdFx0ZmFjdG9yW2tdLnBhdHRlcm4gPSBhcnJUb1dvcmRzUmVnRXhwKGJ1aWx0aW5zW2tdKTtcblx0fSk7XG5cblx0dmFyIGNvbWJpbmF0b3JzID0gW1xuXHRcdC8vIGtlcm5lbFxuXHRcdCcyYmknLCAnd2hpbGUnLCAnMnRyaScsICdiaSonLCAnNGRpcCcsICdib3RoPycsICdzYW1lPycsICd0cmlAJywgJ2N1cnJ5JywgJ3ByZXBvc2UnLCAnM2JpJywgJz9pZicsICd0cmkqJywgJzJrZWVwJywgJzNrZWVwJywgJ2N1cnJpZWQnLCAnMmtlZXBkJywgJ3doZW4nLCAnMmJpKicsICcydHJpKicsICc0a2VlcCcsICdiaUAnLCAna2VlcGRkJywgJ2RvJywgJ3VubGVzcyonLCAndHJpLWN1cnJ5JywgJ2lmKicsICdsb29wJywgJ2JpLWN1cnJ5KicsICd3aGVuKicsICcyYmlAJywgJzJ0cmlAJywgJ3dpdGgnLCAnMndpdGgnLCAnZWl0aGVyPycsICdiaScsICd1bnRpbCcsICczZGlwJywgJzNjdXJyeScsICd0cmktY3VycnkqJywgJ3RyaS1jdXJyeUAnLCAnYmktY3VycnknLCAna2VlcGQnLCAnY29tcG9zZScsICcyZGlwJywgJ2lmJywgJzN0cmknLCAndW5sZXNzJywgJ3R1cGxlJywgJ2tlZXAnLCAnMmN1cnJ5JywgJ3RyaScsICdtb3N0JywgJ3doaWxlKicsICdkaXAnLCAnY29tcG9zZWQnLCAnYmktY3VycnlAJyxcblx0XHQvLyBzZXF1ZW5jZXNcblx0XHQnZmluZC1sYXN0LWZyb20nLCAndHJpbS1oZWFkLXNsaWNlJywgJ21hcC1hcycsICdlYWNoLWZyb20nLCAnbm9uZT8nLCAndHJpbS10YWlsJywgJ3BhcnRpdGlvbicsICdpZi1lbXB0eScsICdhY2N1bXVsYXRlKicsICdyZWplY3QhJywgJ2ZpbmQtZnJvbScsICdhY2N1bXVsYXRlLWFzJywgJ2NvbGxlY3Rvci1mb3ItYXMnLCAncmVqZWN0JywgJ21hcCcsICdtYXAtc3VtJywgJ2FjY3VtdWxhdGUhJywgJzJlYWNoLWZyb20nLCAnZm9sbG93JywgJ3N1cHJlbXVtLWJ5JywgJ21hcCEnLCAndW5sZXNzLWVtcHR5JywgJ2NvbGxlY3RvcicsICdwYWRkaW5nJywgJ3JlZHVjZS1pbmRleCcsICdyZXBsaWNhdGUtYXMnLCAnaW5maW11bS1ieScsICd0cmltLXRhaWwtc2xpY2UnLCAnY291bnQnLCAnZmluZC1pbmRleCcsICdmaWx0ZXInLCAnYWNjdW11bGF0ZSohJywgJ3JlamVjdC1hcycsICdtYXAtaW50ZWdlcnMnLCAnbWFwLWZpbmQnLCAncmVkdWNlJywgJ3NlbGVjdG9yJywgJ2ludGVybGVhdmUnLCAnMm1hcCcsICdmaWx0ZXItYXMnLCAnYmluYXJ5LXJlZHVjZScsICdtYXAtaW5kZXgtYXMnLCAnZmluZCcsICdwcm9kdWNlJywgJ2ZpbHRlciEnLCAncmVwbGljYXRlJywgJ2NhcnRlc2lhbi1tYXAnLCAnY2FydGVzaWFuLWVhY2gnLCAnZmluZC1pbmRleC1mcm9tJywgJ21hcC1maW5kLWxhc3QnLCAnM21hcC1hcycsICczbWFwJywgJ2ZpbmQtbGFzdCcsICdzZWxlY3Rvci1hcycsICcybWFwLWFzJywgJzJtYXAtcmVkdWNlJywgJ2FjY3VtdWxhdGUnLCAnZWFjaCcsICdlYWNoLWluZGV4JywgJ2FjY3VtdWxhdGUqLWFzJywgJ3doZW4tZW1wdHknLCAnYWxsPycsICdjb2xsZWN0b3ItYXMnLCAncHVzaC1laXRoZXInLCAnbmV3LWxpa2UnLCAnY29sbGVjdG9yLWZvcicsICcyc2VsZWN0b3InLCAncHVzaC1pZicsICcyYWxsPycsICdtYXAtcmVkdWNlJywgJzNlYWNoJywgJ2FueT8nLCAndHJpbS1zbGljZScsICcycmVkdWNlJywgJ2NoYW5nZS1udGgnLCAncHJvZHVjZS1hcycsICcyZWFjaCcsICd0cmltJywgJ3RyaW0taGVhZCcsICdjYXJ0ZXNpYW4tZmluZCcsICdtYXAtaW5kZXgnLFxuXHRcdC8vIG1hdGhcblx0XHQnaWYtemVybycsICdlYWNoLWludGVnZXInLCAndW5sZXNzLXplcm8nLCAnKGZpbmQtaW50ZWdlciknLCAnd2hlbi16ZXJvJywgJ2ZpbmQtbGFzdC1pbnRlZ2VyJywgJyhhbGwtaW50ZWdlcnM/KScsICd0aW1lcycsICcoZWFjaC1pbnRlZ2VyKScsICdmaW5kLWludGVnZXInLCAnYWxsLWludGVnZXJzPycsXG5cdFx0Ly8gbWF0aC5jb21iaW5hdG9yc1xuXHRcdCd1bmxlc3MtbmVnYXRpdmUnLCAnaWYtcG9zaXRpdmUnLCAnd2hlbi1wb3NpdGl2ZScsICd3aGVuLW5lZ2F0aXZlJywgJ3VubGVzcy1wb3NpdGl2ZScsICdpZi1uZWdhdGl2ZScsXG5cdFx0Ly8gY29tYmluYXRvcnNcblx0XHQnY2FzZScsICcyY2xlYXZlJywgJ2NvbmQ+cXVvdCcsICdjYXNlPnF1b3QnLCAnM2NsZWF2ZScsICd3cm9uZy12YWx1ZXMnLCAndG8tZml4ZWQtcG9pbnQnLCAnYWxpc3Q+cXVvdCcsICdjb25kJywgJ2NsZWF2ZScsICdjYWxsLWVmZmVjdCcsICdyZWN1cnNpdmUtaGFzaGNvZGUnLCAnc3ByZWFkJywgJ2RlZXAtc3ByZWFkPnF1b3QnLFxuXHRcdC8vIGNvbWJpbmF0b3JzLnNob3J0LWNpcmN1aXRcblx0XHQnMnx8JywgJzB8fCcsICdufHwnLCAnMCYmJywgJzImJicsICczfHwnLCAnMXx8JywgJzEmJicsICduJiYnLCAnMyYmJyxcblx0XHQvLyBjb21iaW5hdG9ycy5zbWFydFxuXHRcdCdzbWFydC11bmxlc3MqJywgJ2tlZXAtaW5wdXRzJywgJ3JlZHVjZS1vdXRwdXRzJywgJ3NtYXJ0LXdoZW4qJywgJ2NsZWF2ZT5hcnJheScsICdzbWFydC13aXRoJywgJ3NtYXJ0LWFwcGx5JywgJ3NtYXJ0LWlmJywgJ2lucHV0cy9vdXRwdXRzJywgJ291dHB1dD5zZXF1ZW5jZS1uJywgJ21hcC1vdXRwdXRzJywgJ21hcC1yZWR1Y2Utb3V0cHV0cycsICdkcm9wcGluZycsICdvdXRwdXQ+YXJyYXknLCAnc21hcnQtbWFwLXJlZHVjZScsICdzbWFydC0ybWFwLXJlZHVjZScsICdvdXRwdXQ+YXJyYXktbicsICdudWxsYXJ5JywgJ2lucHV0PHNlcXVlbmNlJywgJ2FwcGVuZC1vdXRwdXRzJywgJ2Ryb3AtaW5wdXRzJywgJ2lucHV0cycsICdzbWFydC0ycmVkdWNlJywgJ2Ryb3Atb3V0cHV0cycsICdzbWFydC1yZWR1Y2UnLCAncHJlc2VydmluZycsICdzbWFydC13aGVuJywgJ291dHB1dHMnLCAnYXBwZW5kLW91dHB1dHMtYXMnLCAnc21hcnQtdW5sZXNzJywgJ3NtYXJ0LWlmKicsICdzdW0tb3V0cHV0cycsICdpbnB1dDxzZXF1ZW5jZS11bnNhZmUnLCAnb3V0cHV0PnNlcXVlbmNlJyxcblx0XHQvLyB0YWZuXG5cdF07XG5cblx0ZmFjdG9yLmNvbWJpbmF0b3JzLnBhdHRlcm4gPSBhcnJUb1dvcmRzUmVnRXhwKGNvbWJpbmF0b3JzKTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuZmFjdG9yID0gZmFjdG9yO1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0LyoqXG5cdCAqIEJhc2VkIG9uIHRoZSBtYW51YWwgYnkgV291dGVyIHZhbiBPb3J0bWVyc3Nlbi5cblx0ICpcblx0ICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL1ByaXNtSlMvcHJpc20vaXNzdWVzLzI4MDEjaXNzdWUtODI5NzE3NTA0fVxuXHQgKi9cblx0UHJpc20ubGFuZ3VhZ2VzWydmYWxzZSddID0ge1xuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogL1xce1tefV0qXFx9L1xuXHRcdH0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9cIlteXCJdKlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2NoYXJhY3Rlci1jb2RlJzoge1xuXHRcdFx0cGF0dGVybjogLycoPzpbXlxccl18XFxyXFxuPykvLFxuXHRcdFx0YWxpYXM6ICdudW1iZXInXG5cdFx0fSxcblx0XHQnYXNzZW1ibGVyLWNvZGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxkK2AvLFxuXHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdFx0fSxcblx0XHQnbnVtYmVyJzogL1xcZCsvLFxuXHRcdCdvcGVyYXRvcic6IC9bLSEjJCUmJyorLC4vOjs9Pj9AXFxcXF5fYHx+XHUwMERGXHUwMEY4XS8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1xcW3xcXF0vLFxuXHRcdCd2YXJpYWJsZSc6IC9bYS16XS8sXG5cdFx0J25vbi1zdGFuZGFyZCc6IHtcblx0XHRcdHBhdHRlcm46IC9bKCk8QkRPXHUwMEFFXS8sXG5cdFx0XHRhbGlhczogJ2JvbGQnXG5cdFx0fVxuXHR9O1xufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXNbJ2ZpcmVzdG9yZS1zZWN1cml0eS1ydWxlcyddID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdCdjb21tZW50JzogL1xcL1xcLy4qLyxcblx0J2tleXdvcmQnOiAvXFxiKD86YWxsb3d8ZnVuY3Rpb258aWZ8bWF0Y2h8bnVsbHxyZXR1cm58cnVsZXNfdmVyc2lvbnxzZXJ2aWNlKVxcYi8sXG5cdCdvcGVyYXRvcic6IC8mJnxcXHxcXHx8Wzw+IT1dPT98Wy0rKi8lXXxcXGIoPzppbnxpcylcXGIvLFxufSk7XG5cbmRlbGV0ZSBQcmlzbS5sYW5ndWFnZXNbJ2ZpcmVzdG9yZS1zZWN1cml0eS1ydWxlcyddWydjbGFzcy1uYW1lJ107XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2ZpcmVzdG9yZS1zZWN1cml0eS1ydWxlcycsICdrZXl3b3JkJywge1xuXHQncGF0aCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W1xccygpLF0pKD86XFwvKD86W1xcd1xceEEwLVxcdUZGRkZdK3xcXHtbXFx3XFx4QTAtXFx1RkZGRl0rKD86PVxcKlxcKik/XFx9fFxcJFxcKFtcXHdcXHhBMC1cXHVGRkZGLl0rXFwpKSkrLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCd2YXJpYWJsZSc6IHtcblx0XHRcdFx0cGF0dGVybjogL1xce1tcXHdcXHhBMC1cXHVGRkZGXSsoPzo9XFwqXFwqKT9cXH18XFwkXFwoW1xcd1xceEEwLVxcdUZGRkYuXStcXCkvLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnb3BlcmF0b3InOiAvPS8sXG5cdFx0XHRcdFx0J2tleXdvcmQnOiAvXFwqXFwqLyxcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWy4kKCl7fV0vXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXFwvL1xuXHRcdH1cblx0fSxcblx0J21ldGhvZCc6IHtcblx0XHQvLyB0byBtYWtlIHRoZSBwYXR0ZXJuIHNob3J0ZXIsIHRoZSBhY3R1YWwgbWV0aG9kIG5hbWVzIGFyZSBvbWl0dGVkXG5cdFx0cGF0dGVybjogLyhcXGJhbGxvd1xccyspW2Etel0rKD86XFxzKixcXHMqW2Etel0rKSooPz1cXHMqWzo7XSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdidWlsdGluJyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC8sL1xuXHRcdH1cblx0fSxcbn0pO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdFByaXNtLmxhbmd1YWdlcy5mbG93ID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnamF2YXNjcmlwdCcsIHt9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdmbG93JywgJ2tleXdvcmQnLCB7XG5cdFx0J3R5cGUnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXGIoPzpbQmJdb29sZWFufEZ1bmN0aW9ufFtObl11bWJlcnxbU3NddHJpbmd8W1NzXXltYm9sfGFueXxtaXhlZHxudWxsfHZvaWQpXFxiLyxcblx0XHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHRcdFx0fVxuXHRcdF1cblx0fSk7XG5cdFByaXNtLmxhbmd1YWdlcy5mbG93WydmdW5jdGlvbi12YXJpYWJsZSddLnBhdHRlcm4gPSAvKD8hXFxzKVtfJGEtelxceEEwLVxcdUZGRkZdKD86KD8hXFxzKVskXFx3XFx4QTAtXFx1RkZGRl0pKig/PVxccyo9XFxzKig/OmZ1bmN0aW9uXFxifCg/OlxcKFteKCldKlxcKSg/Olxccyo6XFxzKlxcdyspP3woPyFcXHMpW18kYS16XFx4QTAtXFx1RkZGRl0oPzooPyFcXHMpWyRcXHdcXHhBMC1cXHVGRkZGXSkqKVxccyo9PikpL2k7XG5cdGRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMuZmxvd1sncGFyYW1ldGVyJ107XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnZmxvdycsICdvcGVyYXRvcicsIHtcblx0XHQnZmxvdy1wdW5jdHVhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC9cXHtcXHx8XFx8XFx9Lyxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fVxuXHR9KTtcblxuXHRpZiAoIUFycmF5LmlzQXJyYXkoUHJpc20ubGFuZ3VhZ2VzLmZsb3cua2V5d29yZCkpIHtcblx0XHRQcmlzbS5sYW5ndWFnZXMuZmxvdy5rZXl3b3JkID0gW1ByaXNtLmxhbmd1YWdlcy5mbG93LmtleXdvcmRdO1xuXHR9XG5cdFByaXNtLmxhbmd1YWdlcy5mbG93LmtleXdvcmQudW5zaGlmdChcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W14kXVxcYikoPzpDbGFzc3xkZWNsYXJlfG9wYXF1ZXx0eXBlKVxcYig/IVxcJCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteJF1cXEIpXFwkKD86RGlmZnxFbnVtfEV4YWN0fEtleXN8T2JqTWFwfFByb3BlcnR5VHlwZXxSZWNvcmR8U2hhcGV8U3VidHlwZXxTdXBlcnR5cGV8YXdhaXQpXFxiKD8hXFwkKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHQpO1xufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuZm9ydHJhbiA9IHtcblx0J3F1b3RlZC1udW1iZXInOiB7XG5cdFx0cGF0dGVybjogL1tCT1pdKFsnXCJdKVtBLUYwLTldK1xcMS9pLFxuXHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oPzpcXGJcXHcrXyk/KFsnXCJdKSg/OlxcMVxcMXwmKD86XFxyXFxuP3xcXG4pKD86WyBcXHRdKiEuKig/Olxcclxcbj98XFxuKXwoPyFbIFxcdF0qISkpfCg/IVxcMSkuKSooPzpcXDF8JikvLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oJig/Olxcclxcbj98XFxuKVxccyopIS4qLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyEuKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdib29sZWFuJzogL1xcLig/OkZBTFNFfFRSVUUpXFwuKD86X1xcdyspPy9pLFxuXHQnbnVtYmVyJzogLyg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzpbRURdWystXT9cXGQrKT8oPzpfXFx3Kyk/L2ksXG5cdCdrZXl3b3JkJzogW1xuXHRcdC8vIFR5cGVzXG5cdFx0L1xcYig/OkNIQVJBQ1RFUnxDT01QTEVYfERPVUJMRSA/UFJFQ0lTSU9OfElOVEVHRVJ8TE9HSUNBTHxSRUFMKVxcYi9pLFxuXHRcdC8vIEVORCBzdGF0ZW1lbnRzXG5cdFx0L1xcYig/OkVORCA/KT8oPzpCTE9DSyA/REFUQXxET3xGSUxFfEZPUkFMTHxGVU5DVElPTnxJRnxJTlRFUkZBQ0V8TU9EVUxFKD8hIFBST0NFRFVSRSl8UFJPR1JBTXxTRUxFQ1R8U1VCUk9VVElORXxUWVBFfFdIRVJFKVxcYi9pLFxuXHRcdC8vIFN0YXRlbWVudHNcblx0XHQvXFxiKD86QUxMT0NBVEFCTEV8QUxMT0NBVEV8QkFDS1NQQUNFfENBTEx8Q0FTRXxDTE9TRXxDT01NT058Q09OVEFJTlN8Q09OVElOVUV8Q1lDTEV8REFUQXxERUFMTE9DQVRFfERJTUVOU0lPTnxET3xFTkR8RVFVSVZBTEVOQ0V8RVhJVHxFWFRFUk5BTHxGT1JNQVR8R08gP1RPfElNUExJQ0lUKD86IE5PTkUpP3xJTlFVSVJFfElOVEVOVHxJTlRSSU5TSUN8TU9EVUxFIFBST0NFRFVSRXxOQU1FTElTVHxOVUxMSUZZfE9QRU58T1BUSU9OQUx8UEFSQU1FVEVSfFBPSU5URVJ8UFJJTlR8UFJJVkFURXxQVUJMSUN8UkVBRHxSRVRVUk58UkVXSU5EfFNBVkV8U0VMRUNUfFNUT1B8VEFSR0VUfFdISUxFfFdSSVRFKVxcYi9pLFxuXHRcdC8vIE90aGVyc1xuXHRcdC9cXGIoPzpBU1NJR05NRU5UfERFRkFVTFR8RUxFTUVOVEFMfEVMU0V8RUxTRUlGfEVMU0VXSEVSRXxFTlRSWXxJTnxJTkNMVURFfElOT1VUfEtJTkR8TlVMTHxPTkxZfE9QRVJBVE9SfE9VVHxQVVJFfFJFQ1VSU0lWRXxSRVNVTFR8U0VRVUVOQ0V8U1RBVHxUSEVOfFVTRSlcXGIvaVxuXHRdLFxuXHQnb3BlcmF0b3InOiBbXG5cdFx0L1xcKlxcKnxcXC9cXC98PT58Wz1cXC9dPXxbPD5dPT98Ojp8WytcXC0qPSVdfFxcLltBLVpdK1xcLi9pLFxuXHRcdHtcblx0XHRcdC8vIFVzZSBsb29rYmVoaW5kIHRvIHByZXZlbnQgY29uZnVzaW9uIHdpdGggKC8gLylcblx0XHRcdHBhdHRlcm46IC8oXnwoPyFcXCgpLilcXC8oPyFcXCkpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdwdW5jdHVhdGlvbic6IC9cXChcXC98XFwvXFwpfFsoKSw7OiZdL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdC8vIGh0dHBzOi8vZnJlZW1hcmtlci5hcGFjaGUub3JnL2RvY3MvZGd1aV90ZW1wbGF0ZV9leHAuaHRtbFxuXG5cdC8vIEZUTCBleHByZXNzaW9uIHdpdGggNCBsZXZlbHMgb2YgbmVzdGluZyBzdXBwb3J0ZWRcblx0dmFyIEZUTF9FWFBSID0gL1tePCgpXCInXXxcXCgoPzo8ZXhwcj4pKlxcKXw8KD8hIy0tKXw8Iy0tKD86W14tXXwtKD8hLT4pKSotLT58XCIoPzpbXlxcXFxcIl18XFxcXC4pKlwifCcoPzpbXlxcXFwnXXxcXFxcLikqJy8uc291cmNlO1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IDI7IGkrKykge1xuXHRcdEZUTF9FWFBSID0gRlRMX0VYUFIucmVwbGFjZSgvPGV4cHI+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIEZUTF9FWFBSOyB9KTtcblx0fVxuXHRGVExfRVhQUiA9IEZUTF9FWFBSLnJlcGxhY2UoLzxleHByPi9nLCAvW15cXHNcXFNdLy5zb3VyY2UpO1xuXG5cdHZhciBmdGwgPSB7XG5cdFx0J2NvbW1lbnQnOiAvPCMtLVtcXHNcXFNdKj8tLT4vLFxuXHRcdCdzdHJpbmcnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vIHJhdyBzdHJpbmdcblx0XHRcdFx0cGF0dGVybjogL1xcYnIoXCJ8JykoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqXFwxLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhcInwnKSg/Oig/IVxcMXxcXCRcXHspW15cXFxcXXxcXFxcLnxcXCRcXHsoPzooPyFcXH0pKD86PGV4cHI+KSkqXFx9KSpcXDEvLnNvdXJjZS5yZXBsYWNlKC88ZXhwcj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gRlRMX0VYUFI7IH0pKSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKCg/Ol58W15cXFxcXSkoPzpcXFxcXFxcXCkqKVxcJFxceyg/Oig/IVxcfSkoPzo8ZXhwcj4pKSpcXH0vLnNvdXJjZS5yZXBsYWNlKC88ZXhwcj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gRlRMX0VYUFI7IH0pKSxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0J2ludGVycG9sYXRpb24tcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0XHRcdFx0cGF0dGVybjogL15cXCRcXHt8XFx9JC8sXG5cdFx0XHRcdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0cmVzdDogbnVsbFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2tleXdvcmQnOiAvXFxiKD86YXMpXFxiLyxcblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdFx0J2J1aWx0aW4tZnVuY3Rpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W14/XSlcXD9cXHMqKVxcdysvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fSxcblx0XHQnZnVuY3Rpb24nOiAvXFxiXFx3Kyg/PVxccypcXCgpLyxcblx0XHQnbnVtYmVyJzogL1xcYlxcZCsoPzpcXC5cXGQrKT9cXGIvLFxuXHRcdCdvcGVyYXRvcic6IC9cXC5cXC5bPCohXT98LT58LS18XFwrXFwrfCYmfFxcfFxcfHxcXD97MSwyfXxbLSsqLyUhPTw+XT0/fFxcYig/Omd0fGd0ZXxsdHxsdGUpXFxiLyxcblx0XHQncHVuY3R1YXRpb24nOiAvWyw7LjooKVtcXF17fV0vXG5cdH07XG5cblx0ZnRsLnN0cmluZ1sxXS5pbnNpZGUuaW50ZXJwb2xhdGlvbi5pbnNpZGUucmVzdCA9IGZ0bDtcblxuXHRQcmlzbS5sYW5ndWFnZXMuZnRsID0ge1xuXHRcdCdmdGwtY29tbWVudCc6IHtcblx0XHRcdC8vIHRoZSBwYXR0ZXJuIGlzIHNob3J0ZW5lZCB0byBiZSBtb3JlIGVmZmljaWVudFxuXHRcdFx0cGF0dGVybjogL148Iy0tW1xcc1xcU10qLyxcblx0XHRcdGFsaWFzOiAnY29tbWVudCdcblx0XHR9LFxuXHRcdCdmdGwtZGlyZWN0aXZlJzoge1xuXHRcdFx0cGF0dGVybjogL148W1xcc1xcU10rPiQvLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdkaXJlY3RpdmUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhePFxcLz8pWyNAXVthLXpdXFx3Ki9pLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXjxcXC8/fFxcLz8+JC8sXG5cdFx0XHRcdCdjb250ZW50Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9cXHMqXFxTW1xcc1xcU10qLyxcblx0XHRcdFx0XHRhbGlhczogJ2Z0bCcsXG5cdFx0XHRcdFx0aW5zaWRlOiBmdGxcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2Z0bC1pbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogL15cXCRcXHtbXFxzXFxTXSpcXH0kLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlxcJFxce3xcXH0kLyxcblx0XHRcdFx0J2NvbnRlbnQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1xccypcXFNbXFxzXFxTXSovLFxuXHRcdFx0XHRcdGFsaWFzOiAnZnRsJyxcblx0XHRcdFx0XHRpbnNpZGU6IGZ0bFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYmVmb3JlLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvbm8tdXNlbGVzcy1sYXp5XG5cdFx0dmFyIHBhdHRlcm4gPSBSZWdFeHAoLzwjLS1bXFxzXFxTXSo/LS0+fDxcXC8/WyNAXVthLXpBLVpdKD86PGV4cHI+KSo/PnxcXCRcXHsoPzo8ZXhwcj4pKj9cXH0vLnNvdXJjZS5yZXBsYWNlKC88ZXhwcj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gRlRMX0VYUFI7IH0pLCAnZ2knKTtcblx0XHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10uYnVpbGRQbGFjZWhvbGRlcnMoZW52LCAnZnRsJywgcGF0dGVybik7XG5cdH0pO1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYWZ0ZXItdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLnRva2VuaXplUGxhY2Vob2xkZXJzKGVudiwgJ2Z0bCcpO1xuXHR9KTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuZ2FtZW1ha2VybGFuZ3VhZ2UgPSBQcmlzbS5sYW5ndWFnZXMuZ21sID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdCdrZXl3b3JkJzogL1xcYig/OmJyZWFrfGNhc2V8Y29udGludWV8ZGVmYXVsdHxkb3xlbHNlfGVudW18ZXhpdHxmb3J8Z2xvYmFsdmFyfGlmfHJlcGVhdHxyZXR1cm58c3dpdGNofHVudGlsfHZhcnx3aGlsZSlcXGIvLFxuXHQnbnVtYmVyJzogLyg/OlxcYjB4W1xcZGEtZl0rfCg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzplWystXT9cXGQrKT8pW3VsZl17MCw0fS9pLFxuXHQnb3BlcmF0b3InOiAvLS18XFwrXFwrfFstKyUvPV09P3whPXxcXCpcXCo/PT98PFs8PT5dP3w+Wz0+XT98JiY/fFxcXlxcXj98XFx8XFx8P3x+fFxcYig/OmFuZHxhdHxub3R8b3J8d2l0aHx4b3IpXFxiLyxcblx0J2NvbnN0YW50JzogL1xcYig/OkdNX2J1aWxkX2RhdGV8R01fdmVyc2lvbnxhY3Rpb25fKD86Y29udGludWV8cmVzdGFydHxyZXZlcnNlfHN0b3ApfGFsbHxnYW1lc3BlZWRfKD86ZnBzfG1pY3Jvc2Vjb25kcyl8Z2xvYmFsfGxvY2FsfG5vb25lfG90aGVyfHBpfHBvaW50ZXJfKD86aW52YWxpZHxudWxsKXxzZWxmfHRpbWV6b25lXyg/OmxvY2FsfHV0Yyl8dW5kZWZpbmVkfGV2Xyg/OmNyZWF0ZXxkZXN0cm95fHN0ZXB8YWxhcm18a2V5Ym9hcmR8bW91c2V8Y29sbGlzaW9ufG90aGVyfGRyYXd8ZHJhd18oPzpiZWdpbnxlbmR8cG9zdHxwcmUpfGtleXByZXNzfGtleXJlbGVhc2V8dHJpZ2dlcnwoPzpsZWZ0fG1pZGRsZXxub3xyaWdodClfYnV0dG9ufCg/OmxlZnR8bWlkZGxlfHJpZ2h0KV9wcmVzc3woPzpsZWZ0fG1pZGRsZXxyaWdodClfcmVsZWFzZXxtb3VzZV8oPzplbnRlcnxsZWF2ZXx3aGVlbF9kb3dufHdoZWVsX3VwKXxnbG9iYWxfKD86bGVmdHxtaWRkbGV8cmlnaHQpX2J1dHRvbnxnbG9iYWxfKD86bGVmdHxtaWRkbGV8cmlnaHQpX3ByZXNzfGdsb2JhbF8oPzpsZWZ0fG1pZGRsZXxyaWdodClfcmVsZWFzZXxqb3lzdGljayg/OjF8MilfKD86YnV0dG9uMXxidXR0b24yfGJ1dHRvbjN8YnV0dG9uNHxidXR0b241fGJ1dHRvbjZ8YnV0dG9uN3xidXR0b244fGRvd258bGVmdHxyaWdodHx1cCl8b3V0c2lkZXxib3VuZGFyeXxnYW1lX3N0YXJ0fGdhbWVfZW5kfHJvb21fc3RhcnR8cm9vbV9lbmR8bm9fbW9yZV9saXZlc3xhbmltYXRpb25fZW5kfGVuZF9vZl9wYXRofG5vX21vcmVfaGVhbHRofHVzZXJcXGR8Z3VpfGd1aV9iZWdpbnxndWlfZW5kfHN0ZXBfKD86YmVnaW58ZW5kfG5vcm1hbCkpfHZrXyg/OmFsdHxhbnlrZXl8YmFja3NwYWNlfGNvbnRyb2x8ZGVsZXRlfGRvd258ZW5kfGVudGVyfGVzY2FwZXxob21lfGluc2VydHxsZWZ0fG5va2V5fHBhZ2Vkb3dufHBhZ2V1cHxwYXVzZXxwcmludHNjcmVlbnxyZXR1cm58cmlnaHR8c2hpZnR8c3BhY2V8dGFifHVwfGZcXGR8bnVtcGFkXFxkfGFkZHxkZWNpbWFsfGRpdmlkZXxsYWx0fGxjb250cm9sfGxzaGlmdHxtdWx0aXBseXxyYWx0fHJjb250cm9sfHJzaGlmdHxzdWJ0cmFjdCl8YWNoaWV2ZW1lbnRfKD86ZmlsdGVyXyg/OmFsbF9wbGF5ZXJzfGZhdm9yaXRlc19vbmx5fGZyaWVuZHNfb25seSl8ZnJpZW5kc19pbmZvfGluZm98bGVhZGVyYm9hcmRfaW5mb3xvdXJfaW5mb3xwaWNfbG9hZGVkfHNob3dfKD86YWNoaWV2ZW1lbnR8YmFua3xmcmllbmRfcGlja2VyfGxlYWRlcmJvYXJkfHByb2ZpbGV8cHVyY2hhc2VfcHJvbXB0fHVpKXx0eXBlX2NoYWxsZW5nZXx0eXBlX3Njb3JlX2NoYWxsZW5nZSl8YXNzZXRfKD86Zm9udHxvYmplY3R8cGF0aHxyb29tfHNjcmlwdHxzaGFkZXJ8c291bmR8c3ByaXRlfHRpbGVzfHRpbWVsaW5lfHVua25vd24pfGF1ZGlvXyg/OjNkfGZhbGxvZmZfKD86ZXhwb25lbnRfZGlzdGFuY2V8ZXhwb25lbnRfZGlzdGFuY2VfY2xhbXBlZHxpbnZlcnNlX2Rpc3RhbmNlfGludmVyc2VfZGlzdGFuY2VfY2xhbXBlZHxsaW5lYXJfZGlzdGFuY2V8bGluZWFyX2Rpc3RhbmNlX2NsYW1wZWR8bm9uZSl8bW9ub3xuZXdfc3lzdGVtfG9sZF9zeXN0ZW18c3RlcmVvKXxibV8oPzphZGR8Y29tcGxleHxkZXN0X2FscGhhfGRlc3RfY29sb3J8ZGVzdF9jb2xvdXJ8aW52X2Rlc3RfYWxwaGF8aW52X2Rlc3RfY29sb3J8aW52X2Rlc3RfY29sb3VyfGludl9zcmNfYWxwaGF8aW52X3NyY19jb2xvcnxpbnZfc3JjX2NvbG91cnxtYXh8bm9ybWFsfG9uZXxzcmNfYWxwaGF8c3JjX2FscGhhX3NhdHxzcmNfY29sb3J8c3JjX2NvbG91cnxzdWJ0cmFjdHx6ZXJvKXxicm93c2VyXyg/OmNocm9tZXxmaXJlZm94fGllfGllX21vYmlsZXxub3RfYV9icm93c2VyfG9wZXJhfHNhZmFyaXxzYWZhcmlfbW9iaWxlfHRpemVufHVua25vd258d2luZG93c19zdG9yZSl8YnVmZmVyXyg/OmJvb2x8ZjE2fGYzMnxmNjR8ZmFzdHxmaXhlZHxnZW5lcmFsZXJyb3J8Z3Jvd3xpbnZhbGlkdHlwZXxuZXR3b3JrfG91dG9mYm91bmRzfG91dG9mc3BhY2V8czE2fHMzMnxzOHxzZWVrX2VuZHxzZWVrX3JlbGF0aXZlfHNlZWtfc3RhcnR8c3RyaW5nfHRleHR8dTE2fHUzMnx1NjR8dTh8dmJ1ZmZlcnx3cmFwKXxjXyg/OmFxdWF8YmxhY2t8Ymx1ZXxka2dyYXl8ZnVjaHNpYXxncmF5fGdyZWVufGxpbWV8bHRncmF5fG1hcm9vbnxuYXZ5fG9saXZlfG9yYW5nZXxwdXJwbGV8cmVkfHNpbHZlcnx0ZWFsfHdoaXRlfHllbGxvdyl8Y21wZnVuY18oPzphbHdheXN8ZXF1YWx8Z3JlYXRlcnxncmVhdGVyZXF1YWx8bGVzc3xsZXNzZXF1YWx8bmV2ZXJ8bm90ZXF1YWwpfGNyXyg/OmFwcHN0YXJ0fGFycm93fGJlYW18Y3Jvc3N8ZGVmYXVsdHxkcmFnfGhhbmRwb2ludHxob3VyZ2xhc3N8bm9uZXxzaXplX2FsbHxzaXplX25lc3d8c2l6ZV9uc3xzaXplX253c2V8c2l6ZV93ZXx1cGFycm93KXxjdWxsXyg/OmNsb2Nrd2lzZXxjb3VudGVyY2xvY2t3aXNlfG5vY3VsbGluZyl8ZGV2aWNlXyg/OmVtdWxhdG9yfHRhYmxldCl8ZGV2aWNlX2lvc18oPzppcGFkfGlwYWRfcmV0aW5hfGlwaG9uZXxpcGhvbmU1fGlwaG9uZTZ8aXBob25lNnBsdXN8aXBob25lX3JldGluYXx1bmtub3duKXxkaXNwbGF5Xyg/OmxhbmRzY2FwZXxsYW5kc2NhcGVfZmxpcHBlZHxwb3J0cmFpdHxwb3J0cmFpdF9mbGlwcGVkKXxkbGxfKD86Y2RlY2x8Y2RlbHxzdGRjYWxsKXxkc190eXBlXyg/OmdyaWR8bGlzdHxtYXB8cHJpb3JpdHl8cXVldWV8c3RhY2spfGVmXyg/OmNsb3VkfGVsbGlwc2V8ZXhwbG9zaW9ufGZpcmV3b3JrfGZsYXJlfHJhaW58cmluZ3xzbW9rZXxzbW9rZXVwfHNub3d8c3Bhcmt8c3Rhcil8ZmFfKD86YXJjaGl2ZXxib3R0b218Y2VudGVyfGRpcmVjdG9yeXxoaWRkZW58bGVmdHxtaWRkbGV8cmVhZG9ubHl8cmlnaHR8c3lzZmlsZXx0b3B8dm9sdW1laWQpfGZiX2xvZ2luXyg/OmRlZmF1bHR8ZmFsbGJhY2tfdG9fd2Vidmlld3xmb3JjaW5nX3NhZmFyaXxmb3JjaW5nX3dlYnZpZXd8bm9fZmFsbGJhY2tfdG9fd2Vidmlld3x1c2Vfc3lzdGVtX2FjY291bnQpfGlhcF8oPzphdmFpbGFibGV8Y2FuY2VsZWR8ZXZfY29uc3VtZXxldl9wcm9kdWN0fGV2X3B1cmNoYXNlfGV2X3Jlc3RvcmV8ZXZfc3RvcmVsb2FkfGZhaWxlZHxwdXJjaGFzZWR8cmVmdW5kZWR8c3RhdHVzX2F2YWlsYWJsZXxzdGF0dXNfbG9hZGluZ3xzdGF0dXNfcHJvY2Vzc2luZ3xzdGF0dXNfcmVzdG9yaW5nfHN0YXR1c191bmF2YWlsYWJsZXxzdGF0dXNfdW5pbml0aWFsaXNlZHxzdG9yZWxvYWRfZmFpbGVkfHN0b3JlbG9hZF9va3x1bmF2YWlsYWJsZSl8bGVhZGVyYm9hcmRfdHlwZV8oPzpudW1iZXJ8dGltZV9taW5zX3NlY3MpfGxpZ2h0dHlwZV8oPzpkaXJ8cG9pbnQpfG1hdHJpeF8oPzpwcm9qZWN0aW9ufHZpZXd8d29ybGQpfG1iXyg/OmFueXxsZWZ0fG1pZGRsZXxub25lfHJpZ2h0KXxuZXR3b3JrXyg/OmNvbmZpZ18oPzpjb25uZWN0X3RpbWVvdXR8ZGlzYWJsZV9yZWxpYWJsZV91ZHB8ZW5hYmxlX3JlbGlhYmxlX3VkcHx1c2Vfbm9uX2Jsb2NraW5nX3NvY2tldCl8c29ja2V0Xyg/OmJsdWV0b290aHx0Y3B8dWRwKXx0eXBlXyg/OmNvbm5lY3R8ZGF0YXxkaXNjb25uZWN0fG5vbl9ibG9ja2luZ19jb25uZWN0KSl8b2ZfY2hhbGxlbmdlXyg/Omxvc2V8dGllfHdpbil8b3NfKD86YW5kcm9pZHxpb3N8bGludXh8bWFjb3N4fHBzM3xwczR8cHN2aXRhfHVua25vd258dXdwfHdpbjMyfHdpbjhuYXRpdmV8d2luZG93c3x3aW5waG9uZXx4Ym94b25lKXxwaHlfZGVidWdfcmVuZGVyXyg/OmFhYmJ8Y29sbGlzaW9uX3BhaXJzfGNvbXN8Y29yZV9zaGFwZXN8am9pbnRzfG9iYnxzaGFwZXMpfHBoeV9qb2ludF8oPzphbmNob3JfMV94fGFuY2hvcl8xX3l8YW5jaG9yXzJfeHxhbmNob3JfMl95fGFuZ2xlfGFuZ2xlX2xpbWl0c3xkYW1waW5nX3JhdGlvfGZyZXF1ZW5jeXxsZW5ndGhfMXxsZW5ndGhfMnxsb3dlcl9hbmdsZV9saW1pdHxtYXhfZm9yY2V8bWF4X2xlbmd0aHxtYXhfbW90b3JfZm9yY2V8bWF4X21vdG9yX3RvcnF1ZXxtYXhfdG9ycXVlfG1vdG9yX2ZvcmNlfG1vdG9yX3NwZWVkfG1vdG9yX3RvcnF1ZXxyZWFjdGlvbl9mb3JjZV94fHJlYWN0aW9uX2ZvcmNlX3l8cmVhY3Rpb25fdG9ycXVlfHNwZWVkfHRyYW5zbGF0aW9ufHVwcGVyX2FuZ2xlX2xpbWl0KXxwaHlfcGFydGljbGVfZGF0YV9mbGFnXyg/OmNhdGVnb3J5fGNvbG9yfGNvbG91cnxwb3NpdGlvbnx0eXBlZmxhZ3N8dmVsb2NpdHkpfHBoeV9wYXJ0aWNsZV9mbGFnXyg/OmNvbG9ybWl4aW5nfGNvbG91cm1peGluZ3xlbGFzdGljfHBvd2RlcnxzcHJpbmd8dGVuc2lsZXx2aXNjb3VzfHdhbGx8d2F0ZXJ8em9tYmllKXxwaHlfcGFydGljbGVfZ3JvdXBfZmxhZ18oPzpyaWdpZHxzb2xpZCl8cHJfKD86bGluZWxpc3R8bGluZXN0cmlwfHBvaW50bGlzdHx0cmlhbmdsZWZhbnx0cmlhbmdsZWxpc3R8dHJpYW5nbGVzdHJpcCl8cHNfKD86ZGlzdHJ8c2hhcGUpXyg/OmRpYW1vbmR8ZWxsaXBzZXxnYXVzc2lhbnxpbnZnYXVzc2lhbnxsaW5lfGxpbmVhcnxyZWN0YW5nbGUpfHB0X3NoYXBlXyg/OmNpcmNsZXxjbG91ZHxkaXNrfGV4cGxvc2lvbnxmbGFyZXxsaW5lfHBpeGVsfHJpbmd8c21va2V8c25vd3xzcGFya3xzcGhlcmV8c3F1YXJlfHN0YXIpfHR5Xyg/OnJlYWx8c3RyaW5nKXxncF8oPzpmYWNlXFxkfGF4aXNsaHxheGlzbHZ8YXhpc3JofGF4aXNydnxwYWRkfHBhZGx8cGFkcnxwYWR1fHNlbGVjdHxzaG91bGRlcmx8c2hvdWxkZXJsYnxzaG91bGRlcnJ8c2hvdWxkZXJyYnxzdGFydHxzdGlja2x8c3RpY2tyKXxsYl9kaXNwXyg/Om5vbmV8bnVtZXJpY3x0aW1lX21zfHRpbWVfc2VjKXxsYl9zb3J0Xyg/OmFzY2VuZGluZ3xkZXNjZW5kaW5nfG5vbmUpfG92Xyg/OmFjaGlldmVtZW50c3xjb21tdW5pdHl8ZnJpZW5kc3xnYW1lZ3JvdXB8cGxheWVyc3xzZXR0aW5ncyl8dWdjXyg/OmZpbGV0eXBlXyg/OmNvbW11bml0eXxtaWNyb3RyYW5zKXxsaXN0Xyg/OkZhdm9yaXRlZHxGb2xsb3dlZHxQdWJsaXNoZWR8U3Vic2NyaWJlZHxVc2VkT3JQbGF5ZWR8Vm90ZWREb3dufFZvdGVkT258Vm90ZWRVcHxXaWxsVm90ZUxhdGVyKXxtYXRjaF8oPzpBbGxHdWlkZXN8QXJ0d29ya3xDb2xsZWN0aW9uc3xDb250cm9sbGVyQmluZGluZ3N8SW50ZWdyYXRlZEd1aWRlc3xJdGVtc3xJdGVtc19NdHh8SXRlbXNfUmVhZHlUb1VzZXxTY3JlZW5zaG90c3xVc2FibGVJbkdhbWV8VmlkZW9zfFdlYkd1aWRlcyl8cXVlcnlfKD86QWNjZXB0ZWRGb3JHYW1lUmFua2VkQnlBY2NlcHRhbmNlRGF0ZXxDcmVhdGVkQnlGcmllbmRzUmFua2VkQnlQdWJsaWNhdGlvbkRhdGV8RmF2b3JpdGVkQnlGcmllbmRzUmFua2VkQnlQdWJsaWNhdGlvbkRhdGV8Tm90WWV0UmF0ZWQpfHF1ZXJ5X1JhbmtlZEJ5KD86TnVtVGltZXNSZXBvcnRlZHxQdWJsaWNhdGlvbkRhdGV8VGV4dFNlYXJjaHxUb3RhbFZvdGVzQXNjfFRyZW5kfFZvdGV8Vm90ZXNVcCl8cmVzdWx0X3N1Y2Nlc3N8c29ydG9yZGVyX0NyZWF0aW9uT3JkZXIoPzpBc2N8RGVzYyl8c29ydG9yZGVyXyg/OkZvck1vZGVyYXRpb258TGFzdFVwZGF0ZWREZXNjfFN1YnNjcmlwdGlvbkRhdGVEZXNjfFRpdGxlQXNjfFZvdGVTY29yZURlc2MpfHZpc2liaWxpdHlfKD86ZnJpZW5kc19vbmx5fHByaXZhdGV8cHVibGljKSl8dmVydGV4X3VzYWdlXyg/OmJpbm9ybWFsfGJsZW5kaW5kaWNlc3xibGVuZHdlaWdodHxjb2xvcnxjb2xvdXJ8ZGVwdGh8Zm9nfG5vcm1hbHxwb3NpdGlvbnxwc2l6ZXxzYW1wbGV8dGFuZ2VudHx0ZXhjb29yZHx0ZXh0Y29vcmQpfHZlcnRleF90eXBlXyg/OmZsb2F0XFxkfGNvbG9yfGNvbG91cnx1Ynl0ZTQpfGlucHV0X3R5cGV8bGF5ZXJlbGVtZW50dHlwZV8oPzpiYWNrZ3JvdW5kfGluc3RhbmNlfG9sZHRpbGVtYXB8cGFydGljbGVzeXN0ZW18c3ByaXRlfHRpbGV8dGlsZW1hcHx1bmRlZmluZWQpfHNlXyg/OmNob3J1c3xjb21wcmVzc29yfGVjaG98ZXF1YWxpemVyfGZsYW5nZXJ8Z2FyZ2xlfG5vbmV8cmV2ZXJiKXx0ZXh0X3R5cGV8dGlsZV8oPzpmbGlwfGluZGV4X21hc2t8bWlycm9yfHJvdGF0ZSl8KD86b2JqfHJtfHNjcnxzcHIpXFx3KylcXGIvLFxuXHQndmFyaWFibGUnOiAvXFxiKD86YWxhcm18YXBwbGljYXRpb25fc3VyZmFjZXxhc3luY19sb2FkfGJhY2tncm91bmRfKD86YWxwaGF8YmxlbmR8Y29sb3J8Y29sb3VyfGZvcmVncm91bmR8aGVpZ2h0fGhzcGVlZHxodGlsZWR8aW5kZXh8c2hvd2NvbG9yfHNob3djb2xvdXJ8dmlzaWJsZXx2c3BlZWR8dnRpbGVkfHdpZHRofHh8eHNjYWxlfHl8eXNjYWxlKXxiYm94Xyg/OmJvdHRvbXxsZWZ0fHJpZ2h0fHRvcCl8YnJvd3Nlcl8oPzpoZWlnaHR8d2lkdGgpfGNhcHRpb25fKD86aGVhbHRofGxpdmVzfHNjb3JlKXxjdXJyZW50Xyg/OmRheXxob3VyfG1pbnV0ZXxtb250aHxzZWNvbmR8dGltZXx3ZWVrZGF5fHllYXIpfGN1cnNvcl9zcHJpdGV8ZGVidWdfbW9kZXxkZWx0YV90aW1lfGRpcmVjdGlvbnxkaXNwbGF5X2FhfGVycm9yXyg/Omxhc3R8b2NjdXJyZWQpfGV2ZW50Xyg/OmFjdGlvbnxudW1iZXJ8b2JqZWN0fHR5cGUpfGZwc3xmcHNfcmVhbHxmcmljdGlvbnxnYW1lXyg/OmRpc3BsYXl8cHJvamVjdHxzYXZlKV8oPzppZHxuYW1lKXxnYW1lbWFrZXJfKD86cHJvfHJlZ2lzdGVyZWR8dmVyc2lvbil8Z3Jhdml0eXxncmF2aXR5X2RpcmVjdGlvbnwoPzpofHYpc3BlZWR8aGVhbHRofGlhcF9kYXRhfGlkfGltYWdlXyg/OmFscGhhfGFuZ2xlfGJsZW5kfGRlcHRofGluZGV4fG51bWJlcnxzcGVlZHx4c2NhbGV8eXNjYWxlKXxpbnN0YW5jZV8oPzpjb3VudHxpZCl8a2V5Ym9hcmRfKD86a2V5fGxhc3RjaGFyfGxhc3RrZXl8c3RyaW5nKXxsYXllcnxsaXZlc3xtYXNrX2luZGV4fG1vdXNlXyg/OmJ1dHRvbnxsYXN0YnV0dG9ufHh8eSl8b2JqZWN0X2luZGV4fG9zXyg/OmJyb3dzZXJ8ZGV2aWNlfHR5cGV8dmVyc2lvbil8cGF0aF8oPzplbmRhY3Rpb258aW5kZXh8b3JpZW50YXRpb258cG9zaXRpb258cG9zaXRpb25wcmV2aW91c3xzY2FsZXxzcGVlZCl8cGVyc2lzdGVudHxwaHlfKD86cm90YXRpb258KD86Y29sX25vcm1hbHxjb2xsaXNpb258Y29tfGxpbmVhcl92ZWxvY2l0eXxwb3NpdGlvbnxzcGVlZClfKD86eHx5KXxhbmd1bGFyXyg/OmRhbXBpbmd8dmVsb2NpdHkpfHBvc2l0aW9uXyg/Onh8eSlwcmV2aW91c3xzcGVlZHxsaW5lYXJfZGFtcGluZ3xidWxsZXR8Zml4ZWRfcm90YXRpb258YWN0aXZlfG1hc3N8aW5lcnRpYXxkeW5hbWljfGtpbmVtYXRpY3xzbGVlcGluZ3xjb2xsaXNpb25fcG9pbnRzKXxwb2ludGVyXyg/OmludmFsaWR8bnVsbCl8cm9vbXxyb29tXyg/OmNhcHRpb258Zmlyc3R8aGVpZ2h0fGxhc3R8cGVyc2lzdGVudHxzcGVlZHx3aWR0aCl8c2NvcmV8c2VjdXJlX21vZGV8c2hvd18oPzpoZWFsdGh8bGl2ZXN8c2NvcmUpfHNvbGlkfHNwZWVkfHNwcml0ZV8oPzpoZWlnaHR8aW5kZXh8d2lkdGh8eG9mZnNldHx5b2Zmc2V0KXx0ZW1wX2RpcmVjdG9yeXx0aW1lbGluZV8oPzppbmRleHxsb29wfHBvc2l0aW9ufHJ1bm5pbmd8c3BlZWQpfHRyYW5zaXRpb25fKD86Y29sb3J8a2luZHxzdGVwcyl8dW5kZWZpbmVkfHZpZXdfKD86YW5nbGV8Y3VycmVudHxlbmFibGVkfCg/Omh8dikoPzpib3JkZXJ8c3BlZWQpfCg/Omh8d3x4fHkpcG9ydHwoPzpofHd8eHx5KXZpZXd8b2JqZWN0fHN1cmZhY2VfaWR8dmlzaWJsZSl8dmlzaWJsZXx3ZWJnbF9lbmFibGVkfHdvcmtpbmdfZGlyZWN0b3J5fCg/Onh8eSkoPzpwcmV2aW91c3xzdGFydCl8eHx5fGFyZ3VtZW50KD86X3JlbGl0aXZlfF9jb3VudHxcXGQpfGFyZ3VtZW50fGdsb2JhbHxsb2NhbHxvdGhlcnxzZWxmKVxcYi9cbn0pO1xuXG4vLyBodHRwczovL3d3dy5nYXAtc3lzdGVtLm9yZy9NYW51YWxzL2RvYy9yZWYvY2hhcDQuaHRtbFxuLy8gaHR0cHM6Ly93d3cuZ2FwLXN5c3RlbS5vcmcvTWFudWFscy9kb2MvcmVmL2NoYXAyNy5odG1sXG5cblByaXNtLmxhbmd1YWdlcy5nYXAgPSB7XG5cdCdzaGVsbCc6IHtcblx0XHRwYXR0ZXJuOiAvXmdhcD5bXFxzXFxTXSo/KD89XmdhcD58JCg/IVtcXHNcXFNdKSkvbSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnZ2FwJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXihnYXA+KS4rKD86KD86XFxyKD86XFxufCg/IVxcbikpfFxcbik+LiopKi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdH0sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXmdhcD4vXG5cdFx0fVxuXHR9LFxuXG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8jLiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFwnXCJdKSg/OicoPzpbXlxcclxcblxcXFwnXXxcXFxcLil7MSwxMH0nfFwiKD86W15cXHJcXG5cXFxcXCJdfFxcXFwuKSpcIig/IVwiKXxcIlwiXCJbXFxzXFxTXSo/XCJcIlwiKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnY29udGludWF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFtcXHJcXG5dKT4vLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQna2V5d29yZCc6IC9cXGIoPzpBc3NlcnR8SW5mb3xJc0JvdW5kfFFVSVR8VHJ5TmV4dE1ldGhvZHxVbmJpbmR8YW5kfGF0b21pY3xicmVha3xjb250aW51ZXxkb3xlbGlmfGVsc2V8ZW5kfGZpfGZvcnxmdW5jdGlvbnxpZnxpbnxsb2NhbHxtb2R8bm90fG9kfG9yfHF1aXR8cmVhZG9ubHl8cmVhZHdyaXRlfHJlY3xyZXBlYXR8cmV0dXJufHRoZW58dW50aWx8d2hpbGUpXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXG5cdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89XFxzKlxcKCkvaSxcblxuXHQnbnVtYmVyJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcdy5dfFxcLlxcLikoPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKD86W2VFXVsrLV0/XFxkKyk/KD86X1thLXpdPyk/KD89JHxbXlxcdy5dfFxcLlxcLikvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblxuXHQnY29udGludWF0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oW1xcclxcbl0pPi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHR9LFxuXHQnb3BlcmF0b3InOiAvLT58Wy0rKi9efj0hXXw8PnxbPD5dPT98Oj18XFwuXFwuLyxcblx0J3B1bmN0dWF0aW9uJzogL1soKVtcXF17fSw7LjpdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmdhcC5zaGVsbC5pbnNpZGUuZ2FwLmluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy5nYXA7XG5cblByaXNtLmxhbmd1YWdlcy5nY29kZSA9IHtcblx0J2NvbW1lbnQnOiAvOy4qfFxcQlxcKC4qP1xcKVxcQi8sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86XCJcInxbXlwiXSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGJbR01dXFxkKyg/OlxcLlxcZCspP1xcYi8sXG5cdCdwcm9wZXJ0eSc6IC9cXGJbQS1aXS8sXG5cdCdjaGVja3N1bSc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcKilcXGQrLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHR9LFxuXHQvLyBUMDowOjBcblx0J3B1bmN0dWF0aW9uJzogL1s6Kl0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuZ2RzY3JpcHQgPSB7XG5cdCdjb21tZW50JzogLyMuKi8sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL0A/KD86KFwifCcpKD86KD8hXFwxKVteXFxuXFxcXF18XFxcXFtcXHNcXFNdKSpcXDEoPyFcInwnKXxcIlwiXCIoPzpbXlxcXFxdfFxcXFxbXFxzXFxTXSkqP1wiXCJcIikvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY2xhc3MtbmFtZSc6IHtcblx0XHQvLyBjbGFzc19uYW1lIEZvbywgZXh0ZW5kcyBCYXIsIGNsYXNzIElubmVyQ2xhc3Ncblx0XHQvLyBleHBvcnQoaW50KSB2YXIgYmF6LCBleHBvcnQoaW50LCAwKSB2YXIgaVxuXHRcdC8vIGFzIE5vZGVcblx0XHQvLyBjb25zdCBGT086IGludCA9IDksIHZhciBiYXI6IGJvb2wgPSB0cnVlXG5cdFx0Ly8gZnVuYyBhZGQocmVmZXJlbmNlOiBJdGVtLCBhbW91bnQ6IGludCkgLT4gSXRlbTpcblx0XHRwYXR0ZXJuOiAvKF4oPzpjbGFzc3xjbGFzc19uYW1lfGV4dGVuZHMpWyBcXHRdK3xeZXhwb3J0XFwoWyBcXHRdKnxcXGJhc1sgXFx0XSt8KD86XFxiKD86Y29uc3R8dmFyKVsgXFx0XXxbLChdKVsgXFx0XSpcXHcrWyBcXHRdKjpbIFxcdF0qfC0+WyBcXHRdKilbYS16QS1aX11cXHcqL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzphbmR8YXN8YXNzZXJ0fGJyZWFrfGJyZWFrcG9pbnR8Y2xhc3N8Y2xhc3NfbmFtZXxjb25zdHxjb250aW51ZXxlbGlmfGVsc2V8ZW51bXxleHBvcnR8ZXh0ZW5kc3xmb3J8ZnVuY3xpZnxpbnxpc3xtYXN0ZXJ8bWFzdGVyc3luY3xtYXRjaHxub3R8bnVsbHxvbnJlYWR5fG9yfHBhc3N8cHJlbG9hZHxwdXBwZXR8cHVwcGV0c3luY3xyZW1vdGV8cmVtb3Rlc3luY3xyZXR1cm58c2VsZnxzZXRnZXR8c2lnbmFsfHN0YXRpY3x0b29sfHZhcnx3aGlsZXx5aWVsZClcXGIvLFxuXHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVsgXFx0XSpcXCgpL2ksXG5cdCd2YXJpYWJsZSc6IC9cXCRcXHcrLyxcblx0J251bWJlcic6IFtcblx0XHQvXFxiMGJbMDFfXStcXGJ8XFxiMHhbXFxkYS1mQS1GX10rXFxifCg/OlxcYlxcZFtcXGRfXSooPzpcXC5bXFxkX10qKT98XFxCXFwuW1xcZF9dKykoPzplWystXT9bXFxkX10rKT9cXGIvLFxuXHRcdC9cXGIoPzpJTkZ8TkFOfFBJfFRBVSlcXGIvXG5cdF0sXG5cdCdjb25zdGFudCc6IC9cXGJbQS1aXVtBLVpfXFxkXSpcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdCdvcGVyYXRvcic6IC8tPnw6PXwmJnxcXHxcXHx8PDx8Pj58Wy0rKi8lJnwhPD49XT0/fFt+Xl0vLFxuXHQncHVuY3R1YXRpb24nOiAvWy46LDsoKVtcXF17fV0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuZ2VkY29tID0ge1xuXHQnbGluZS12YWx1ZSc6IHtcblx0XHQvLyBQcmVjZWRlZCBieSBsZXZlbCwgb3B0aW9uYWwgcG9pbnRlciwgYW5kIHRhZ1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSpcXGQrICsoPzpAXFx3W1xcdyFcIiQlJicoKSorLFxcLS4vOjs8PT4/W1xcXFxcXF1eYHt8fX5cXHg4MC1cXHhmZSAjXSpAICspP1xcdysgKS4rL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwb2ludGVyJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXkBcXHdbXFx3IVwiJCUmJygpKissXFwtLi86Ozw9Pj9bXFxcXFxcXV5ge3x9flxceDgwLVxceGZlICNdKkAkLyxcblx0XHRcdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdCdyZWNvcmQnOiB7XG5cdFx0Ly8gUHJlY2VkZWQgYnkgbGV2ZWwgYW5kIG9wdGlvbmFsIHBvaW50ZXJcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qXFxkKyArKD86QFxcd1tcXHchXCIkJSYnKCkqKyxcXC0uLzo7PD0+P1tcXFxcXFxdXmB7fH1+XFx4ODAtXFx4ZmUgI10qQCArKT8pXFx3Ky9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICd0YWcnXG5cdH0sXG5cdCdsZXZlbCc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKVxcZCsvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHR9LFxuXHQncG9pbnRlcic6IHtcblx0XHRwYXR0ZXJuOiAvQFxcd1tcXHchXCIkJSYnKCkqKyxcXC0uLzo7PD0+P1tcXFxcXFxdXmB7fH1+XFx4ODAtXFx4ZmUgI10qQC8sXG5cdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0fVxufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmdldHRleHQgPSB7XG5cdCdjb21tZW50JzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8jIC4qLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAndHJhbnNsYXRvci1jb21tZW50J1xuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyNcXC4uKi8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ2V4dHJhY3RlZC1jb21tZW50J1xuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyM6LiovLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdyZWZlcmVuY2UtY29tbWVudCdcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8jLC4qLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnZmxhZy1jb21tZW50J1xuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyNcXHwuKi8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ3ByZXZpb3VzbHktdW50cmFuc2xhdGVkLWNvbW1lbnQnXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvIy4qLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdF0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pXCIoPzpbXlwiXFxcXF18XFxcXC4pKlwiLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC9ebXNnKD86Y3R4dHxpZHxpZF9wbHVyYWx8c3RyKVxcYi9tLFxuXHQnbnVtYmVyJzogL1xcYlxcZCtcXGIvLFxuXHQncHVuY3R1YXRpb24nOiAvW1xcW1xcXV0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMucG8gPSBQcmlzbS5sYW5ndWFnZXMuZ2V0dGV4dDtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciB0YWJsZVJvdyA9IC8oPzpcXHI/XFxufFxccilbIFxcdF0qXFx8LitcXHwoPzooPyFcXHwpLikqLy5zb3VyY2U7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmdoZXJraW4gPSB7XG5cdFx0J3B5c3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogLyhcIlwiXCJ8JycnKVtcXHNcXFNdKz9cXDEvLFxuXHRcdFx0YWxpYXM6ICdzdHJpbmcnXG5cdFx0fSxcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopIy4qL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQndGFnJzoge1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKilAXFxTKi9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2ZlYXR1cmUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxyP1xcbnxcXHIpWyBcXHRdKikoPzpBYmlsaXR5fEFob3kgbWF0ZXkhfEFyd2VkZHxBc3Bla3R8QmVzaWdoZWlkIEJlaG9lZnRlfEJ1c2luZXNzIE5lZWR8Q2FyYWN0ZXJpc3RpY2F8Q2FyYWN0ZXJcdTAwRURzdGljYXxFZ2Vuc2thYnxFZ2Vuc2thcHxFaWdpbmxlaWtpfEZlYXR1cmV8Rlx1MDEyQlx1MDEwRGF8Rml0dXJ8Rm9uY3Rpb25uYWxpdFx1MDBFOXxGb25rc3lvbmFsaXRlfEZ1bmNpb25hbGlkYWRlfEZ1bmNpb25hbGl0YXR8RnVuY3Rpb25hbGl0YXRlfEZ1bmNcdTAxNjNpb25hbGl0YXRlfEZ1bmNcdTAyMUJpb25hbGl0YXRlfEZ1bmN0aW9uYWxpdGVpdHxGdW5nc2l8RnVua2NpYXxGdW5rY2lqYXxGdW5rY2lvbmFsaXRcdTAxMDF0ZXxGdW5rY2lvbmFsbm9zdHxGdW5rY2phfEZ1bmtzaWV8RnVua3Rpb25hbGl0XHUwMEU0dHxGdW5rdGlvbmFsaXRcdTAwRTlpdHxGdW56aW9uYWxpdFx1MDBFMHxId2FldHxId1x1MDBFNnR8SmVsbGVtelx1MDE1MXxLYXJha3RlcmlzdGlrfExhc3Rub3N0fE1ha3xNb2d1Y25vc3R8bGFIfE1vZ3VcdTAxMDdub3N0fE1vem5vc3RpfE1vXHUwMTdFbm9zdGl8T0ggSEFJfE9tYWR1c3xPbWluYWlzdXVzfE9zb2JpbmF8XHUwMEQ2emVsbGlrfFBvdHJ6ZWJhIGJpem5lc293YXxwZXJib2dofHBvUWJvZ2ggbWFsamEnfFBvXHUwMTdFYWRhdmVrfFBvXHUwMTdFaWFkYXZrYXxQcmV0dHkgbXVjaHxRYXB8UXUnbWVIICd1dHxTYXZ5Ylx1MDExN3xUXHUwMEVEbmggblx1MDEwM25nfFRyYWp0b3xWZXJtb1x1MDBFQnxWbGFzdG5vc1x1MDE2NXxXXHUwMTQyYVx1MDE1QmNpd29cdTAxNUJcdTAxMDd8Wm5hXHUwMTBEaWxub3N0fFx1MDM5NFx1MDNDNVx1MDNCRFx1MDNCMVx1MDNDNFx1MDNDQ1x1MDNDNFx1MDNCN1x1MDNDNFx1MDNCMXxcdTAzOUJcdTAzQjVcdTAzQjlcdTAzQzRcdTAzQkZcdTAzQzVcdTAzQzFcdTAzQjNcdTAzQUZcdTAzQjF8XHUwNDFDXHUwNDNFXHUwNDMzXHUwNDQzXHUwNDVCXHUwNDNEXHUwNDNFXHUwNDQxXHUwNDQyfFx1MDQxQ1x1MDRFOVx1MDQzQ1x1MDQzQVx1MDQzOFx1MDQzRFx1MDQzQlx1MDQzNVx1MDQzQXxcdTA0MUVcdTA0NDFcdTA0M0VcdTA0MzFcdTA0MzhcdTA0M0RcdTA0MzB8XHUwNDIxXHUwNDMyXHUwNDNFXHUwNDM5XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDNFfFx1MDRBRVx1MDQzN1x1MDQzNVx1MDQzRFx1MDQ0N1x1MDREOVx1MDQzQlx1MDQzNVx1MDQzQVx1MDQzQlx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzQXxcdTA0MjRcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDZcdTA0MzhcdTA0M0VcdTA0M0RcdTA0MzBcdTA0M0J8XHUwNDI0XHUwNDQzXHUwNDNEXHUwNDNBXHUwNDQ2XHUwNDM4XHUwNDNFXHUwNDNEXHUwNDMwXHUwNDNCXHUwNDNEXHUwNDNFXHUwNDQxXHUwNDQyfFx1MDQyNFx1MDQ0M1x1MDQzRFx1MDQzQVx1MDQ0Nlx1MDQzOFx1MDQ0RnxcdTA0MjRcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDZcdTA0NTZcdTA0M0VcdTA0M0RcdTA0MzBcdTA0M0J8XHUwNUVBXHUwNURCXHUwNUQ1XHUwNUUwXHUwNUQ0fFx1MDYyRVx1MDYyN1x1MDYzNVx1MDY0QVx1MDYyOXxcdTA2MkVcdTA2MzVcdTA2NDhcdTA2MzVcdTA2Q0NcdTA2MkF8XHUwNjM1XHUwNjQ0XHUwNjI3XHUwNjJEXHUwNkNDXHUwNjJBfFx1MDZBOVx1MDYyN1x1MDYzMVx1MDY0OFx1MDYyOFx1MDYyN1x1MDYzMSBcdTA2QTlcdTA2Q0MgXHUwNjM2XHUwNjMxXHUwNjQ4XHUwNjMxXHUwNjJBfFx1MDY0OFx1MDY1MFx1MDZDQ1x1MDY5OFx1MDZBRlx1MDZDQ3xcdTA5MzBcdTA5NDJcdTA5MkEgXHUwOTMyXHUwOTQ3XHUwOTE2fFx1MEExNlx1MEEzRVx1MEEzOFx1MEE0MFx1MEEwNVx1MEEyNHxcdTBBMjhcdTBBMTVcdTBBMzYgXHUwQTI4XHUwQTQxXHUwQTM5XHUwQTNFXHUwQTMwfFx1MEEyRVx1MEE0MVx1MEEzOVx1MEEzRVx1MEEwMlx1MEEyNlx1MEEzMFx1MEEzRXxcdTBDMTdcdTBDNDFcdTBDMjNcdTBDMkVcdTBDNDF8XHUwQ0I5XHUwQ0M2XHUwQzlBXHUwQ0NEXHUwQzlBXHUwQ0IzfFx1MEUwNFx1MEUyN1x1MEUzMlx1MEUyMVx1MEUxNVx1MEU0OVx1MEUyRFx1MEUwN1x1MEUwMVx1MEUzMlx1MEUyM1x1MEUxN1x1MEUzMlx1MEUwN1x1MEUxOFx1MEUzOFx1MEUyM1x1MEUwMVx1MEUzNFx1MEUwOHxcdTBFMDRcdTBFMjdcdTBFMzJcdTBFMjFcdTBFMkFcdTBFMzJcdTBFMjFcdTBFMzJcdTBFMjNcdTBFMTZ8XHUwRTQyXHUwRTA0XHUwRTIzXHUwRTA3XHUwRTJCXHUwRTI1XHUwRTMxXHUwRTAxfFx1QUUzMFx1QjJBNXxcdTMwRDVcdTMwQTNcdTMwRkNcdTMwQzFcdTMwRTN8XHU1MjlGXHU4MEZEfFx1NkE1Rlx1ODBGRCk6KD86W146XFxyXFxuXSsoPzpcXHI/XFxufFxccnwkKSkqLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2ltcG9ydGFudCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKDopW15cXHJcXG5dKy8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQna2V5d29yZCc6IC9bXjpcXHJcXG5dKzovXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnc2NlbmFyaW8nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKSg/OkFic3RyYWN0IFNjZW5hcmlvfEFic3RyYWt0IFNjZW5hcmlvfEFjaHRlcmdyb25kfEFlcnxcdTAwQzZyfEFndGVyZ3JvbmR8QWxsIHknYWxsfEFudGVjZWRlbnRlc3xBbnRlY2VkZW50c3xBdGJ1clx1MDBGMGFyXHUwMEUxc3xBdGJ1clx1MDBGMGFyXHUwMEUxc2lyfEF3d3csIGxvb2sgbWF0ZXxCNHxCYWNrZ3JvdW5kfEJhZ2dydW5kfEJha2dydW5kfEJha2dydW5ufEJha2dydW5udXJ8QmVpc3BpZWxlfEJlaXNwaWxsZXJ8Qlx1MUVEMWkgY1x1MUVBM25ofENlZm5kaXJ8Q2VuYXJpb3xDZW5cdTAwRTFyaW98Q2VuYXJpbyBkZSBGdW5kb3xDZW5cdTAwRTFyaW8gZGUgRnVuZG98Q2VuYXJpb3N8Q2VuXHUwMEUxcmlvc3xDb250ZXN0b3xDb250ZXh0fENvbnRleHRlfENvbnRleHRvfENvbnRvfENvbnRvaHxDb250b25lfERcdTAwRTZtaXxEYXNhcnxEZWFkIG1lbiB0ZWxsIG5vIHRhbGVzfERlbGluZWFjYW8gZG8gQ2VuYXJpb3xEZWxpbmVhXHUwMEU3XHUwMEUzbyBkbyBDZW5cdTAwRTFyaW98RGlzIGlzIHdoYXQgd2VudCBkb3dufERcdTFFRUYgbGlcdTFFQzd1fER5YWdyYW0gU2VuYXJ5b3xEeWFncmFtIHNlbmFyeW98RWd6YW5wfEVqZW1wbG9zfEVrc2VtcGxlcnxFa3plbXBsb2p8RW5naHJlaWZmdGlhdXxFc2Jvem8gZG8gZXNjZW5hcmlvfEVzY2VuYXJpfEVzY2VuYXJpb3xFc2VtcGl8RXNxdWVtYSBkZSBsJ2VzY2VuYXJpfEVzcXVlbWEgZGVsIGVzY2VuYXJpb3xFc3F1ZW1hIGRvIENlbmFyaW98RXNxdWVtYSBkbyBDZW5cdTAwRTFyaW98RVhBTVBMWnxFeGFtcGxlc3xFeGVtcGVsfEV4ZW1wbGV8RXhlbXBsZXN8RXhlbXBsb3N8Rmlyc3Qgb2ZmfEZvbm98Rm9yZ2F0XHUwMEYza1x1MDBGNm55dnxGb3JnYXRcdTAwRjNrXHUwMEY2bnl2IHZcdTAwRTF6bGF0fEZ1bmRvfEdlXHUwMEU3bWlcdTAxNUZ8R3J1bmRsYWdlfEhhbm5lcmdyb25kfGdoYW50b0h8SFx1MDBFMXR0XHUwMEU5cnxIZWF2ZSB0b3xJc3RvcmlrfEp1aHR1bWlkfEtlYWRhYW58S2h1bmcga1x1MUVDQmNoIGJcdTFFQTNufEtodW5nIHRcdTAwRUNuaCBodVx1MUVEMW5nfEtcdTFFQ0JjaCBiXHUxRUEzbnxLb25jZXB0fEtvbnNlcCBza2VuYXJpb3xLb250XHUwMEU4a3N8S29udGVrc3R8S29udGVrc3Rhc3xLb250ZWtzdHN8S29udGV4dHxLb250dXJvIGRlIGxhIHNjZW5hcm98TGF0YXIgQmVsYWthbmd8bHV0IGNob3ZuYXRsaHxsdXR8bHV0bWV5fExcdTAwRkRzaW5nIEF0YnVyXHUwMEYwYXJcdTAwRTFzYXJ8TFx1MDBGRHNpbmcgRFx1MDBFNm1hfE1JU0hVTiBTUlNMWXxNSVNIVU58TWVuZ2dhcmlza2FuIFNlbmFyaW98bW8nfE5cdTAwRTFcdTAxMERydCBTY2VuXHUwMEUxcmF8Tlx1MDBFMVx1MDEwRHJ0IFNjXHUwMEU5blx1MDBFMVx1MDE1OWV8Tlx1MDBFMVx1MDEwRHJ0IFNjZW5cdTAwRTFydXxPcmlzIHNjZW5hcmlqYXxcdTAwRDZybmVrbGVyfE9zbm92YXxPc25vdmEgU2Nlblx1MDBFMXJhfE9zbm92YSBzY1x1MDBFOW5cdTAwRTFcdTAxNTllfE9zbnV0ZWt8T3phZGplfFBhcmF1Z3N8UGF2eXpkXHUwMTdFaWFpfFBcdTAwRTlsZFx1MDBFMWt8UGllbVx1MDExM3JpfFBsYW4gZHUgc2NcdTAwRTluYXJpb3xQbGFuIGR1IFNjXHUwMEU5bmFyaW98UGxhbiBTZW5hcnlvfFBsYW4gc2VuYXJ5b3xQbGFuZyB2dW0gU3plbmFyaW98UG96YWRcdTAwRUR8UG96YWRpZXxQb3phZGluYXxQclx1MDBFRGtsYWR5fFBcdTAxNTlcdTAwRURrbGFkeXxQcmltZXJ8UHJpbWVyaXxQcmltamVyaXxQcnp5a1x1MDE0MmFkeXxSYWFtc3RzZW5hYXJpdW18UmVja29uIGl0J3MgbGlrZXxSZXJlZm9uc3xTY2VuXHUwMEUxcnxTY1x1MDBFOW5cdTAwRTFcdTAxNTl8U2NlbmFyaWV8U2NlbmFyaWp8U2NlbmFyaWphaXxTY2VuYXJpamF1cyBcdTAxNjFhYmxvbmFzfFNjZW5hcmlqaXxTY2VuXHUwMTAxcmlqc3xTY2VuXHUwMTAxcmlqcyBwXHUwMTEzYyBwYXJhdWdhfFNjZW5hcmlqdXN8U2NlbmFyaW98U2NcdTAwRTluYXJpb3xTY2VuYXJpbyBBbWxpbmVsbG9sfFNjZW5hcmlvIE91dGxpbmV8U2NlbmFyaW8gVGVtcGxhdGV8U2NlbmFyaW9tYWx8U2NlbmFyaW9tYWxsfFNjZW5hcmlvc3xTY2VuYXJpdXxTY2VuYXJpdXN6fFNjZW5hcm98U2NoZW1hIGRlbGxvIHNjZW5hcmlvfFNlIFx1MDBGMGV8U2UgdGhlfFNlIFx1MDBGRWV8U2VuYXJpb3xTZW5hcnlvIERlc2tyaXBzeW9ufFNlbmFyeW8gZGVza3JpcHN5b258U2VuYXJ5b3xTZW5hcnlvIHRhc2xhXHUwMTFGXHUwMTMxfFNoaXZlciBtZSB0aW1iZXJzfFNpdHVcdTAxMDFjaWphfFNpdHVhaXxTaXR1YXNpZSBVaXRlZW5zZXR0aW5nfFNpdHVhc2llfFNrZW5hcmlvIGtvbnNlcHxTa2VuYXJpb3xTa2ljYXxTdHJ1Y3R1cmEgc2NlbmFyaXV8U3RydWN0dXJcdTAxMDMgc2NlbmFyaXV8U3RydWt0dXJhIHNjZW5hcmlqYXxTdHNlbmFhcml1bXxTd2EgaHdhZXIgc3dhfFN3YXxTd2EgaHdcdTAwRTZyIHN3YXxTemFibG9uIHNjZW5hcml1c3phfFN6ZW5hcmlvfFN6ZW5hcmlvZ3J1bmRyaXNzfFRhcGF1a3NldHxUYXBhdXN8VGFwYXVzYWloaW98VGF1c3R8VGF1c3RhfFRlbXBsYXRlIEtlYWRhYW58VGVtcGxhdGUgU2VuYXJpb3xUZW1wbGF0ZSBTaXR1YWl8VGhlIHRoaW5nIG9mIGl0IGlzfFRcdTAwRUNuaCBodVx1MUVEMW5nfFZhcmlhbnRhaXxWb29yYmVlbGRlfFZvb3JiZWVsZGVufFdoYXJyaW1lYW4gaXN8WW8taG8taG98WW91J2xsIHdhbm5hfFphXHUwMTQyb1x1MDE3Q2VuaWF8XHUwM0EwXHUwM0IxXHUwM0MxXHUwM0IxXHUwM0I0XHUwM0I1XHUwM0FGXHUwM0IzXHUwM0JDXHUwM0IxXHUwM0M0XHUwM0IxfFx1MDNBMFx1MDNCNVx1MDNDMVx1MDNCOVx1MDNCM1x1MDNDMVx1MDNCMVx1MDNDNlx1MDNBRSBcdTAzQTNcdTAzQjVcdTAzQkRcdTAzQjFcdTAzQzFcdTAzQUZcdTAzQkZcdTAzQzV8XHUwM0EzXHUwM0I1XHUwM0JEXHUwM0FDXHUwM0MxXHUwM0I5XHUwM0IxfFx1MDNBM1x1MDNCNVx1MDNCRFx1MDNBQ1x1MDNDMVx1MDNCOVx1MDNCRnxcdTAzQTVcdTAzQzBcdTAzQ0NcdTAzQjJcdTAzQjFcdTAzQjhcdTAzQzFcdTAzQkZ8XHUwNDFBXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDQ4fFx1MDQxQVx1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0MnxcdTA0MUFcdTA0M0VcdTA0M0RcdTA0NDZcdTA0MzVcdTA0M0ZcdTA0NDJ8XHUwNDFDXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNCXHUwNDNCXHUwNDMwXHUwNDQwfFx1MDQxQ1x1MDQzOFx1MDQ0MVx1MDQzRVx1MDQzQlx1MDQzQlx1MDQzMFx1MDQ0MHxcdTA0MUVcdTA0NDFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0MzB8XHUwNDFGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQzXHUwNDNDXHUwNDNFXHUwNDMyXHUwNDMwfFx1MDQxRlx1MDQzRVx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzOFx1MDQzRFx1MDQzMHxcdTA0MUZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzhcdTA0NEZ8XHUwNDFGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDRCXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDRGfFx1MDQxRlx1MDQ0MFx1MDQzOFx1MDQzQVx1MDQzQlx1MDQzMFx1MDQzNFx1MDQzOHxcdTA0MUZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0NDB8XHUwNDFGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDQwXHUwNDM4fFx1MDQxRlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQ0MFx1MDQ0QnxcdTA0MjBcdTA0MzBcdTA0M0NcdTA0M0FcdTA0MzAgXHUwNDNEXHUwNDMwIFx1MDQ0MVx1MDQ0Nlx1MDQzNVx1MDQzRFx1MDQzMFx1MDQ0MFx1MDQzOFx1MDQzOXxcdTA0MjFcdTA0M0FcdTA0MzhcdTA0NDZcdTA0MzB8XHUwNDIxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNBXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDMwIFx1MDQ0MVx1MDQ0Nlx1MDQzNVx1MDQzRFx1MDQzMFx1MDQ0MFx1MDQzOFx1MDQ1OFx1MDQzMHxcdTA0MjFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M0FcdTA0NDJcdTA0NDNcdTA0NDBcdTA0MzAgXHUwNDQxXHUwNDQ2XHUwNDM1XHUwNDNEXHUwNDMwXHUwNDQwXHUwNDM4XHUwNDRGfFx1MDQyMVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzQVx1MDQ0Mlx1MDQ0M1x1MDQ0MFx1MDQzMCBcdTA0NDFcdTA0NDZcdTA0MzVcdTA0M0RcdTA0MzBcdTA0NDBcdTA0NTZcdTA0NEV8XHUwNDIxXHUwNDQ2XHUwNDM1XHUwNDNEXHUwNDMwXHUwNDQwXHUwNDM4XHUwNDM5fFx1MDQyMVx1MDQ0Nlx1MDQzNVx1MDQzRFx1MDQzMFx1MDQ0MFx1MDQzOFx1MDQzOSBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M0FcdTA0NDJcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDFcdTA0Mzh8XHUwNDIxXHUwNDQ2XHUwNDM1XHUwNDNEXHUwNDMwXHUwNDQwXHUwNDM4XHUwNDM5XHUwNDNEXHUwNDRCXHUwNEEzIFx1MDQ0Mlx1MDRFOVx1MDQzN1x1MDQzNVx1MDQzQlx1MDQzNVx1MDQ0OFx1MDQzNXxcdTA0MjFcdTA0NDZcdTA0MzVcdTA0M0RcdTA0MzBcdTA0NDBcdTA0MzhcdTA0NThcdTA0Mzh8XHUwNDIxXHUwNDQ2XHUwNDM1XHUwNDNEXHUwNDMwXHUwNDQwXHUwNDM4XHUwNDNFfFx1MDQyMVx1MDQ0Nlx1MDQzNVx1MDQzRFx1MDQzMFx1MDQ0MFx1MDQ1Nlx1MDQzOXxcdTA0MjJcdTA0MzBcdTA0NDBcdTA0MzhcdTA0NDV8XHUwNEFFXHUwNDQwXHUwNDNEXHUwNEQ5XHUwNDNBXHUwNDNCXHUwNEQ5XHUwNDQwfFx1MDVEM1x1MDVENVx1MDVEMlx1MDVERVx1MDVEMFx1MDVENVx1MDVFQXxcdTA1RThcdTA1RTdcdTA1RTJ8XHUwNUVBXHUwNUQxXHUwNUUwXHUwNUQ5XHUwNUVBIFx1MDVFQVx1MDVFOFx1MDVEN1x1MDVEOVx1MDVFOXxcdTA1RUFcdTA1RThcdTA1RDdcdTA1RDlcdTA1RTl8XHUwNjI3XHUwNjQ0XHUwNjJFXHUwNjQ0XHUwNjQxXHUwNjRBXHUwNjI5fFx1MDYyN1x1MDY0NFx1MDZBRlx1MDY0OFx1MDZDQyBcdTA2MzNcdTA2NDZcdTA2MjdcdTA2MzFcdTA2Q0NcdTA2NDh8XHUwNjI3XHUwNjQ1XHUwNjJCXHUwNjQ0XHUwNjI5fFx1MDY3RVx1MDYzMyBcdTA2NDVcdTA2NDZcdTA2MzhcdTA2MzF8XHUwNjMyXHUwNjQ1XHUwNkNDXHUwNjQ2XHUwNjQ3fFx1MDYzM1x1MDY0Nlx1MDYyN1x1MDYzMVx1MDZDQ1x1MDY0OHxcdTA2MzNcdTA2NEFcdTA2NDZcdTA2MjdcdTA2MzFcdTA2NEFcdTA2NDh8XHUwNjMzXHUwNjRBXHUwNjQ2XHUwNjI3XHUwNjMxXHUwNjRBXHUwNjQ4IFx1MDY0NVx1MDYyRVx1MDYzN1x1MDYzN3xcdTA2NDVcdTA2MkJcdTA2MjdcdTA2NDRcdTA2Q0NcdTA2QkF8XHUwNjQ1XHUwNjQ2XHUwNjM4XHUwNjMxIFx1MDY0Nlx1MDYyN1x1MDY0NVx1MDZEMiBcdTA2QTlcdTA2MjcgXHUwNjJFXHUwNjI3XHUwNkE5XHUwNkMxfFx1MDY0NVx1MDY0Nlx1MDYzOFx1MDYzMVx1MDY0Nlx1MDYyN1x1MDY0NVx1MDZDMXxcdTA2NDZcdTA2NDVcdTA2NDhcdTA2NDZcdTA2NDcgXHUwNjQ3XHUwNjI3fFx1MDkwOVx1MDkyNlx1MDkzRVx1MDkzOVx1MDkzMFx1MDkyM3xcdTA5MkFcdTA5MzBcdTA5M0ZcdTA5MjZcdTA5NDNcdTA5MzZcdTA5NERcdTA5MkZ8XHUwOTJBXHUwOTMwXHUwOTNGXHUwOTI2XHUwOTQzXHUwOTM2XHUwOTREXHUwOTJGIFx1MDkzMFx1MDk0Mlx1MDkyQVx1MDkzMFx1MDk0N1x1MDkxNlx1MDkzRXxcdTA5MkFcdTA5NDNcdTA5MzdcdTA5NERcdTA5MjBcdTA5MkRcdTA5NDJcdTA5MkVcdTA5M0Z8XHUwQTA5XHUwQTI2XHUwQTNFXHUwQTM5XHUwQTMwXHUwQTI4XHUwQTNFXHUwQTAyfFx1MEEyQVx1MEExRlx1MEExNVx1MEEyNVx1MEEzRXxcdTBBMkFcdTBBMUZcdTBBMTVcdTBBMjVcdTBBM0UgXHUwQTIyXHUwQTNFXHUwQTAyXHUwQTFBXHUwQTNFfFx1MEEyQVx1MEExRlx1MEExNVx1MEEyNVx1MEEzRSBcdTBBMzBcdTBBNDJcdTBBMkEgXHUwQTMwXHUwQTQ3XHUwQTE2XHUwQTNFfFx1MEEyQVx1MEEzRlx1MEExQlx1MEE0Qlx1MEExNVx1MEE1Q3xcdTBDMDlcdTBDMjZcdTBDM0VcdTBDMzlcdTBDMzBcdTBDMjNcdTBDMzJcdTBDNDF8XHUwQzE1XHUwQzI1XHUwQzI4XHUwQzAyfFx1MEMyOFx1MEM0N1x1MEMyQVx1MEMyNVx1MEM0RFx1MEMyRlx1MEMwMnxcdTBDMzhcdTBDMjhcdTBDNERcdTBDMjhcdTBDM0ZcdTBDMzVcdTBDNDdcdTBDMzZcdTBDMDJ8XHUwQzg5XHUwQ0E2XHUwQ0JFXHUwQ0I5XHUwQ0IwXHUwQ0EzXHUwQ0M2XHUwQzk3XHUwQ0IzXHUwQ0MxfFx1MEM5NVx1MENBNVx1MENCRVx1MENCOFx1MENCRVx1MENCMFx1MENCRVx1MEM4Mlx1MENCNnxcdTBDQjVcdTBDQkZcdTBDQjVcdTBDQjBcdTBDQTNcdTBDQzZ8XHUwQ0I5XHUwQ0JGXHUwQ0E4XHUwQ0NEXHUwQ0E4XHUwQ0M2XHUwQ0IyXHUwQ0M2fFx1MEU0Mlx1MEUwNFx1MEUyM1x1MEUwN1x1MEUyQVx1MEUyM1x1MEU0OVx1MEUzMlx1MEUwN1x1MEUwMlx1MEUyRFx1MEUwN1x1MEU0MFx1MEUyQlx1MEUxNVx1MEUzOFx1MEUwMVx1MEUzMlx1MEUyM1x1MEUxM1x1MEU0Q3xcdTBFMEFcdTBFMzhcdTBFMTRcdTBFMDJcdTBFMkRcdTBFMDdcdTBFMTVcdTBFMzFcdTBFMjdcdTBFMkRcdTBFMjJcdTBFNDhcdTBFMzJcdTBFMDd8XHUwRTBBXHUwRTM4XHUwRTE0XHUwRTAyXHUwRTJEXHUwRTA3XHUwRTQwXHUwRTJCXHUwRTE1XHUwRTM4XHUwRTAxXHUwRTMyXHUwRTIzXHUwRTEzXHUwRTRDfFx1MEU0MVx1MEUxOVx1MEUyN1x1MEUwNFx1MEUzNFx1MEUxNHxcdTBFMkFcdTBFMjNcdTBFMzhcdTBFMUJcdTBFNDBcdTBFMkJcdTBFMTVcdTBFMzhcdTBFMDFcdTBFMzJcdTBFMjNcdTBFMTNcdTBFNEN8XHUwRTQwXHUwRTJCXHUwRTE1XHUwRTM4XHUwRTAxXHUwRTMyXHUwRTIzXHUwRTEzXHUwRTRDfFx1QkMzMFx1QUNCRHxcdUMyRENcdUIwOThcdUI5QUNcdUM2MjR8XHVDMkRDXHVCMDk4XHVCOUFDXHVDNjI0IFx1QUMxQ1x1QzY5NHxcdUM2MDh8XHUzMEI1XHUzMEYzXHUzMEQ3XHUzMEVCfFx1MzBCN1x1MzBDQVx1MzBFQVx1MzBBQXxcdTMwQjdcdTMwQ0FcdTMwRUFcdTMwQUFcdTMwQTJcdTMwQTZcdTMwQzhcdTMwRTlcdTMwQTRcdTMwRjN8XHUzMEI3XHUzMENBXHUzMEVBXHUzMEFBXHUzMEM2XHUzMEYzXHUzMEQ3XHUzMEVDfFx1MzBCN1x1MzBDQVx1MzBFQVx1MzBBQVx1MzBDNlx1MzBGM1x1MzBEN1x1MzBFQ1x1MzBGQ1x1MzBDOHxcdTMwQzZcdTMwRjNcdTMwRDdcdTMwRUN8XHU0RjhCfFx1NEY4Qlx1NUI1MHxcdTUyNjdcdTY3MkN8XHU1MjY3XHU2NzJDXHU1OTI3XHU3RUIyfFx1NTI4N1x1NjcyQ3xcdTUyODdcdTY3MkNcdTU5MjdcdTdEQjF8XHU1NzNBXHU2NjZGfFx1NTczQVx1NjY2Rlx1NTkyN1x1N0VCMnxcdTU4MzRcdTY2NkZ8XHU1ODM0XHU2NjZGXHU1OTI3XHU3REIxfFx1ODBDQ1x1NjY2Rik6W146XFxyXFxuXSovbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2ltcG9ydGFudCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKDopW15cXHJcXG5dKi8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQna2V5d29yZCc6IC9bXjpcXHJcXG5dKzovXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQndGFibGUtYm9keSc6IHtcblx0XHRcdC8vIExvb2stYmVoaW5kIGlzIHVzZWQgdG8gc2tpcCB0aGUgdGFibGUgaGVhZCwgd2hpY2ggaGFzIHRoZSBzYW1lIGZvcm1hdCBhcyBhbnkgdGFibGUgcm93XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJygnICsgdGFibGVSb3cgKyAnKSg/OicgKyB0YWJsZVJvdyArICcpKycpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnb3V0bGluZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvPFtePl0rPi8sXG5cdFx0XHRcdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0XHRcdFx0fSxcblx0XHRcdFx0J3RkJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9cXHMqW15cXHN8XVtefF0qLyxcblx0XHRcdFx0XHRhbGlhczogJ3N0cmluZydcblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcfC9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCd0YWJsZS1oZWFkJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKHRhYmxlUm93KSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQndGgnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1xccypbXlxcc3xdW158XSovLFxuXHRcdFx0XHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXHwvXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnYXRydWxlJzoge1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKykoPzonYXwnYWNofCdlanw3fGF8QSB0YWtcdTAwRTl8QSB0YWt0aWVcdTAxN0V8QSB0aWVcdTAxN0V8QSB6XHUwMEUxcm92ZVx1MDE0OHxBYmVyfEFjfEFkb3R0fEFra29yfEFrfEFsZXNob3Jlc3xBbGV8QWxpfEFsbG9yYXxBbG9yc3xBbHN8QW1hfEFtZW5ueWliZW58QW1pa29yfEFtcGFrfGFufEFOfEFuYW5naW5nfEFuZCB5J2FsbHxBbmR8QW5nZW5vbW1lbnxBbnJoZWdlZGlnIGF8QW58QXBhYmlsYXxBdFx1MDBFOHN8QXRlc2F8QXR1bmNpfEF2YXN0IXxBeWV8QXxhd2VyfEJhZ2l8QmFuanVyfEJldHxCaVx1MUVCRnR8QmxpbWV5IXxCdWh8QnV0IGF0IHRoZSBlbmQgb2YgdGhlIGRheSBJIHJlY2tvbnxCdXQgeSdhbGx8QnV0fEJVVHxDYWx8Q1x1MDBFMm5kfENhbmR8Q2FuZG98Q2V8Q3VhbmRvfFx1MDEwQ2V8XHUwMEQwYSBcdTAwRjBlfFx1MDBEMGF8RGFkYXN8RGFkYXxEYWRvc3xEYWRvfERhSCBnaHUnIGJlamx1J3xkYW5ufERhbm58RGFub3xEYW58RGFyfERhdCBmaWluZHxEYXRhfERhdGUgZmlpbmR8RGF0ZXxEYXRpIGZpaW5kfERhdGl8RGFcdTAxNjNpIGZpaW5kfERhXHUwMjFCaSBmaWluZHxERU58RGF0b3xEZXxEZW4geW91c2UgZ290dGF8RGVuZ2FufERpYmVyaXxEaXllbGltIGtpfERvbmFkYXxEb25hdHxEb25pdGFcdTAxMzVvfERvfER1bnxEdW90YXxcdTAwRDB1cmh8RWVsZGFkZXN8RWZ8RVx1MDExRmVyIGtpfEVudGFvfEVudFx1MDBFM298RW50XHUwMEYzbnxFfEVufEVudG9uY2VzfEVwaXxcdTAwQzlzfEV0YW50IGRvbm5cdTAwRTllfEV0YW50IGRvbm5cdTAwRTl8RXR8XHUwMEM5dGFudCBkb25uXHUwMEU5ZXN8XHUwMEM5dGFudCBkb25uXHUwMEU5ZXxcdTAwQzl0YW50IGRvbm5cdTAwRTl8RXRhbnQgZG9ublx1MDBFOWVzfEV0YW50IGRvbm5cdTAwRTlzfFx1MDBDOXRhbnQgZG9ublx1MDBFOXN8RmFrYXR8R2FuZ3dheSF8R2R5fEdlZ2ViZW4gc2VpZW58R2VnZWJlbiBzZWl8R2VnZXZlbnxHZWdld2V8Z2h1JyBub2JsdSd8R2l0dHxHaXZlbiB5J2FsbHxHaXZlbnxHaXZldHxHaXZ1bnxIYXxDaG98SSBDQU4gSEFafElufElyfEl0J3MganVzdCB1bmJlbGlldmFibGV8SXxKYXxKZVx1MDE1QmxpfEplXHUwMTdDZWxpfEthZHxLYWRhfEthZGFyfEthaXxLYWp8S2R5XHUwMTdFfEtlXHUwMTBGfEtlbXVkaWFufEtldGlrYXxLaGl8S2llZHl8S298S3VpZHxLdWl8S3VufExhbnxsYXRsaHxMZSBzYSBhfExldCBnbyBhbmQgaGF1bHxMZXxMXHUwMEU4IHNhIGF8TFx1MDBFOHxMb2dvfExvcnNxdSc8fExvcnNxdWV8bVx1MDBFNHxNYWFyfE1haXN8TWFqXHUwMTA1Y3xNYXxNYWpkfE1ha2F8TWFuYXdhfE1hc3xNZW58TWVuYXdhfE11dHRhfE5hbGlrYXxOYWxpa2FuaW5nfE5hbmdpbmd8Tlx1MDBFNXJ8Tlx1MDBFNHJ8TmF0b3xOaFx1MDFCMG5nfE5paW58Tmp1a3xPIHphbWFufE9jaHxPZ3xPbGV0ZXRhYW58T25kfE9uZGF8T3JhenxQYWt8UGVyb3xQZXJcdTAwRjJ8UG9kYW5vfFBva2lhXHUwMTNFfFBva3VkfFBvdGVtfFBvdG9tfFByaXZ6ZXRvfFByeWR8UXVhbnxRdWFuZHxRdWFuZG98cWFTREknfFNcdTAwRTV8U2VkfFNlfFNpaXN8U2lwb3plIGtlfFNpcG96ZSBLZXxTaXBvemV8U2l8XHUwMTVFaXxcdTAyMThpfFNvaXR8U3RlbHxUYWRhfFRhZHxUYWtyYXR8VGFrfFRhcGl8VGVyfFRldGFwaXxUaGEgdGhlfFRoYXxUaGVuIHknYWxsfFRoZW58VGhcdTAwRUN8VGh1cmh8VG9kYXxUb28gcmlnaHR8VW58VW5kfHVnZWhvbGx8Vlx1MDBFMHx2YWp8VmVuZGFyfFZlfHdhbm58V2FubmVlcnxXRU58V2VubnxXaGVuIHknYWxsfFdoZW58V3RlZHl8V3VufFkna25vd3xZZWFoIG5haHxZbmF8WW91c2Uga25vdyBsaWtlIHdoZW58WW91c2Uga25vdyB3aGVuIHlvdXNlIGdvdHxZfFphIHByZWRwb2tsYWR1fFphIHBcdTAxNTllZHBva2xhZHV8WmFkYW58WmFkYW5pfFphZGFub3xaYWRhdGV8WmFkYXRvfFpha1x1MDE0MmFkYWpcdTAxMDVjfFphcmFkaXxaYXRhdGl8XHUwMERFYSBcdTAwRkVlfFx1MDBERWF8XHUwMERFXHUwMEUxfFx1MDBERWVnYXJ8XHUwMERFdXJofFx1MDM5MVx1MDNCQlx1MDNCQlx1MDNBQ3xcdTAzOTRcdTAzQjVcdTAzQjRcdTAzQkZcdTAzQkNcdTAzQURcdTAzQkRcdTAzQkZcdTAzQzV8XHUwMzlBXHUwM0IxXHUwM0I5fFx1MDM4Q1x1MDNDNFx1MDNCMVx1MDNCRHxcdTAzQTRcdTAzQ0NcdTAzQzRcdTAzQjV8XHUwNDEwIFx1MDQ0Mlx1MDQzMFx1MDQzQVx1MDQzRVx1MDQzNnxcdTA0MTBcdTA0MzNcdTA0MzBcdTA0NDB8XHUwNDEwXHUwNDNCXHUwNDM1fFx1MDQxMFx1MDQzQlx1MDQzOHxcdTA0MTBcdTA0M0NcdTA0M0NcdTA0M0V8XHUwNDEwfFx1MDREOFx1MDQzM1x1MDREOVx1MDQ0MHxcdTA0RDhcdTA0MzlcdTA0NDJcdTA0MzhcdTA0M0F8XHUwNEQ4XHUwNDNDXHUwNDNDXHUwNDMwfFx1MDQxMVx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzQXxcdTA0MTJcdTA0MzB8XHUwNDEyXHUwNEQ5fFx1MDQxNFx1MDQzMFx1MDQzNFx1MDQzNVx1MDQzRFx1MDQzRXxcdTA0MTRcdTA0MzBcdTA0M0RcdTA0M0V8XHUwNDE0XHUwNDNFXHUwNDNGXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNDfFx1MDQxNVx1MDQ0MVx1MDQzQlx1MDQzOHxcdTA0MTdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDJcdTA0MzV8XHUwNDE3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQyXHUwNDM4fFx1MDQxN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQzRXxcdTA0MTh8XHUwNDA2fFx1MDQxQSBcdTA0NDJcdTA0M0VcdTA0M0NcdTA0NDMgXHUwNDM2XHUwNDM1fFx1MDQxQVx1MDQzMFx1MDQzNFx1MDQzMHxcdTA0MUFcdTA0MzBcdTA0MzR8XHUwNDFBXHUwNDNFXHUwNDMzXHUwNDMwXHUwNDQyXHUwNDNFfFx1MDQxQVx1MDQzRVx1MDQzM1x1MDQzNFx1MDQzMHxcdTA0MUFcdTA0M0VcdTA0M0JcdTA0Mzh8XHUwNDFCXHUwNEQ5XHUwNDNBXHUwNDM4XHUwNDNEfFx1MDQxQlx1MDQzNVx1MDQzQVx1MDQzOFx1MDQzRHxcdTA0MURcdTA0RDlcdTA0NDJcdTA0MzhcdTA0OTdcdTA0RDlcdTA0MzRcdTA0RDl8XHUwNDFEXHUwNDM1XHUwNDQ1XHUwNDMwXHUwNDM5fFx1MDQxRFx1MDQzRXxcdTA0MUVcdTA0M0RcdTA0MzRcdTA0MzB8XHUwNDFGXHUwNDQwXHUwNDM4XHUwNDNGXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNDXHUwNDNFLCBcdTA0NDlcdTA0M0V8XHUwNDFGXHUwNDQwXHUwNDM4XHUwNDNGXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNDXHUwNDNFfFx1MDQxRlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQ0Q3xcdTA0MjJcdTA0MzBcdTA0M0FcdTA0MzZcdTA0MzV8XHUwNDIyXHUwNDMwfFx1MDQyMlx1MDQzRVx1MDQzM1x1MDQzNFx1MDQzMHxcdTA0MjJcdTA0M0VcdTA0MzRcdTA0NTZ8XHUwNDIyXHUwNDNFfFx1MDQyM1x1MDQzRFx1MDQzNFx1MDQzMHxcdTA0QkFcdTA0RDlcdTA0M0N8XHUwNDJGXHUwNDNBXHUwNDQ5XHUwNDNFfFx1MDVEMFx1MDVEMVx1MDVEQ3xcdTA1RDBcdTA1RDZcdTA1RDl8XHUwNUQwXHUwNUQ2fFx1MDVEMVx1MDVENFx1MDVEOVx1MDVFMFx1MDVFQVx1MDVERnxcdTA1RDVcdTA1RDJcdTA1RER8XHUwNURCXHUwNUQwXHUwNUU5XHUwNUU4fFx1MDYyMlx1MDY0Nlx1MDZBRlx1MDYyN1x1MDY0N3xcdTA2MjdcdTA2MzBcdTA2MjdcdTA2NEJ8XHUwNjI3XHUwNkFGXHUwNjMxfFx1MDYyN1x1MDY0NVx1MDYyN3xcdTA2MjdcdTA2NDhcdTA2MzF8XHUwNjI4XHUwNjI3IFx1MDY0MVx1MDYzMVx1MDYzNnxcdTA2MjhcdTA2MjdcdTA2NDRcdTA2NDFcdTA2MzFcdTA2MzZ8XHUwNjI4XHUwNjQxXHUwNjMxXHUwNjM2fFx1MDY3RVx1MDZCRVx1MDYzMXxcdTA2MkFcdTA2Mjh8XHUwNjJCXHUwNjQ1fFx1MDYyQ1x1MDYyOHxcdTA2MzlcdTA2NDZcdTA2MkZcdTA2NDVcdTA2Mjd8XHUwNjQxXHUwNjMxXHUwNjM2IFx1MDZBOVx1MDZDQ1x1MDYyN3xcdTA2NDRcdTA2NDNcdTA2NDZ8XHUwNjQ0XHUwNkNDXHUwNkE5XHUwNjQ2fFx1MDY0NVx1MDYyQVx1MDY0OXxcdTA2NDdcdTA2NDZcdTA2QUZcdTA2MjdcdTA2NDVcdTA2Q0N8XHUwNjQ4fFx1MDkwNVx1MDkxN1x1MDkzMHxcdTA5MTRcdTA5MzB8XHUwOTE1XHUwOTI2XHUwOTNFfFx1MDkxNVx1MDkzRlx1MDkyOFx1MDk0RFx1MDkyNFx1MDk0MXxcdTA5MUFcdTA5NDJcdTA5MDJcdTA5MTVcdTA5M0Z8XHUwOTFDXHUwOTJDfFx1MDkyNFx1MDkyNVx1MDkzRXxcdTA5MjRcdTA5MjZcdTA5M0V8XHUwOTI0XHUwOTJDfFx1MDkyQVx1MDkzMFx1MDkyOFx1MDk0RFx1MDkyNFx1MDk0MXxcdTA5MkFcdTA5MzB8XHUwOTJGXHUwOTI2XHUwOTNGfFx1MEEwNVx1MEEyNFx1MEE0N3xcdTBBMUNcdTBBMjZcdTBBNEJcdTBBMDJ8XHUwQTFDXHUwQTNGXHUwQTM1XHUwQTQ3XHUwQTAyIFx1MEExNVx1MEEzRnxcdTBBMUNcdTBBNDdcdTBBMTVcdTBBMzB8XHUwQTI0XHUwQTI2fFx1MEEyQVx1MEEzMHxcdTBDMDVcdTBDMkFcdTBDNERcdTBDMkFcdTBDNDFcdTBDMjFcdTBDNDF8XHUwQzA4IFx1MEMyQVx1MEMzMFx1MEMzRlx1MEMzOFx1MEM0RFx1MEMyNVx1MEMzRlx1MEMyNFx1MEMzRlx1MEMzMlx1MEM0QnxcdTBDMTVcdTBDM0VcdTBDMjhcdTBDM0Z8XHUwQzFBXHUwQzQ2XHUwQzJBXHUwQzREXHUwQzJBXHUwQzJDXHUwQzIxXHUwQzNGXHUwQzI4XHUwQzI2XHUwQzNGfFx1MEMyRVx1MEMzMFx1MEMzRlx1MEMyRlx1MEM0MXxcdTBDODZcdTBDQTZcdTBDQjBcdTBDQzZ8XHUwQ0E4XHUwQzgyXHUwQ0E0XHUwQ0IwfFx1MENBOFx1MENCRlx1MENENVx1MENBMVx1MENCRlx1MENBNnxcdTBDQUVcdTBDQTRcdTBDQ0RcdTBDQTRcdTBDQzF8XHUwQ0I4XHUwQ0NEXHUwQ0E1XHUwQ0JGXHUwQ0E0XHUwQ0JGXHUwQ0FGXHUwQ0E4XHUwQ0NEXHUwQ0E4XHUwQ0MxfFx1MEUwMVx1MEUzM1x1MEUyQlx1MEUxOVx1MEUxNFx1MEU0M1x1MEUyQlx1MEU0OXxcdTBFMTRcdTBFMzFcdTBFMDdcdTBFMTlcdTBFMzFcdTBFNDlcdTBFMTl8XHUwRTQxXHUwRTE1XHUwRTQ4fFx1MEU0MFx1MEUyMVx1MEUzN1x1MEU0OFx1MEUyRHxcdTBFNDFcdTBFMjVcdTBFMzB8XHVBREY4XHVCN0VDXHVCQTc0PHxcdUFERjhcdUI5QUNcdUFDRTA8fFx1QjJFODx8XHVCOUNDXHVDNTdEPHxcdUI5Q0NcdUM3N0M8fFx1QkEzQ1x1QzgwMDx8XHVDODcwXHVBQzc0PHxcdUQ1NThcdUM5QzBcdUI5Q0M8fFx1MzA0Qlx1MzA2NDx8XHUzMDU3XHUzMDRCXHUzMDU3PHxcdTMwNUZcdTMwNjBcdTMwNTc8fFx1MzA2QVx1MzA4OVx1MzA3MDx8XHUzMDgyXHUzMDU3PHxcdTRFMjZcdTRFMTQ8fFx1NEY0Nlx1MzA1Nzx8XHU0RjQ2XHU2NjJGPHxcdTUwNDdcdTU5ODI8fFx1NTA0N1x1NUI5QTx8XHU1MDQ3XHU4QTJEPHxcdTUwNDdcdThCQkU8fFx1NTI0RFx1NjNEMDx8XHU1NDBDXHU2NUY2PHxcdTU0MENcdTY2NDI8fFx1NUU3Nlx1NEUxNDx8XHU1RjUzPHxcdTc1NzY8fFx1ODAwQ1x1NEUxNDx8XHU5MEEzXHU0RTQ4PHxcdTkwQTNcdTlFQkM8KSg/PVsgXFx0XSkvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcLnxbXlwiXFxcXFxcclxcbl0pKlwifCcoPzpcXFxcLnxbXidcXFxcXFxyXFxuXSkqJy8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J291dGxpbmUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLzxbXj5dKz4vLFxuXHRcdFx0XHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdvdXRsaW5lJzoge1xuXHRcdFx0cGF0dGVybjogLzxbXj5dKz4vLFxuXHRcdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0XHR9XG5cdH07XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmdpdCA9IHtcblx0Lypcblx0ICogQSBzaW1wbGUgb25lIGxpbmUgY29tbWVudCBsaWtlIGluIGEgZ2l0IHN0YXR1cyBjb21tYW5kXG5cdCAqIEZvciBpbnN0YW5jZTpcblx0ICogJCBnaXQgc3RhdHVzXG5cdCAqICMgT24gYnJhbmNoIGluZmluaXRlLXNjcm9sbFxuXHQgKiAjIFlvdXIgYnJhbmNoIGFuZCAnb3JpZ2luL3NoYXJlZEJyYW5jaGVzL2Zyb250ZW5kVGVhbS9pbmZpbml0ZS1zY3JvbGwnIGhhdmUgZGl2ZXJnZWQsXG5cdCAqICMgYW5kIGhhdmUgMSBhbmQgMiBkaWZmZXJlbnQgY29tbWl0cyBlYWNoLCByZXNwZWN0aXZlbHkuXG5cdCAqIG5vdGhpbmcgdG8gY29tbWl0ICh3b3JraW5nIGRpcmVjdG9yeSBjbGVhbilcblx0ICovXG5cdCdjb21tZW50JzogL14jLiovbSxcblxuXHQvKlxuXHQgKiBSZWdleHAgdG8gbWF0Y2ggdGhlIGNoYW5nZWQgbGluZXMgaW4gYSBnaXQgZGlmZiBvdXRwdXQuIENoZWNrIHRoZSBleGFtcGxlIGJlbG93LlxuXHQgKi9cblx0J2RlbGV0ZWQnOiAvXlstXHUyMDEzXS4qL20sXG5cdCdpbnNlcnRlZCc6IC9eXFwrLiovbSxcblxuXHQvKlxuXHQgKiBhIHN0cmluZyAoZG91YmxlIGFuZCBzaW1wbGUgcXVvdGUpXG5cdCAqL1xuXHQnc3RyaW5nJzogLyhcInwnKSg/OlxcXFwufCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXG5cdC8qXG5cdCAqIGEgZ2l0IGNvbW1hbmQuIEl0IHN0YXJ0cyB3aXRoIGEgcmFuZG9tIHByb21wdCBmaW5pc2hpbmcgYnkgYSAkLCB0aGVuIFwiZ2l0XCIgdGhlbiBzb21lIG90aGVyIHBhcmFtZXRlcnNcblx0ICogRm9yIGluc3RhbmNlOlxuXHQgKiAkIGdpdCBhZGQgZmlsZS50eHRcblx0ICovXG5cdCdjb21tYW5kJzoge1xuXHRcdHBhdHRlcm46IC9eLipcXCQgZ2l0IC4qJC9tLFxuXHRcdGluc2lkZToge1xuXHRcdFx0Lypcblx0XHRcdCAqIEEgZ2l0IGNvbW1hbmQgY2FuIGNvbnRhaW4gYSBwYXJhbWV0ZXIgc3RhcnRpbmcgYnkgYSBzaW5nbGUgb3IgYSBkb3VibGUgZGFzaCBmb2xsb3dlZCBieSBhIHN0cmluZ1xuXHRcdFx0ICogRm9yIGluc3RhbmNlOlxuXHRcdFx0ICogJCBnaXQgZGlmZiAtLWNhY2hlZFxuXHRcdFx0ICogJCBnaXQgbG9nIC1wXG5cdFx0XHQgKi9cblx0XHRcdCdwYXJhbWV0ZXInOiAvXFxzLS0/XFx3Ky9cblx0XHR9XG5cdH0sXG5cblx0Lypcblx0ICogQ29vcmRpbmF0ZXMgZGlzcGxheWVkIGluIGEgZ2l0IGRpZmYgY29tbWFuZFxuXHQgKiBGb3IgaW5zdGFuY2U6XG5cdCAqICQgZ2l0IGRpZmZcblx0ICogZGlmZiAtLWdpdCBmaWxlLnR4dCBmaWxlLnR4dFxuXHQgKiBpbmRleCA2MjE0OTUzLi4xZDU0YTUyIDEwMDY0NFxuXHQgKiAtLS0gZmlsZS50eHRcblx0ICogKysrIGZpbGUudHh0XG5cdCAqIEBAIC0xICsxLDIgQEBcblx0ICogLUhlcmUncyBteSB0ZXR4IGZpbGVcblx0ICogK0hlcmUncyBteSB0ZXh0IGZpbGVcblx0ICogK0FuZCB0aGlzIGlzIHRoZSBzZWNvbmQgbGluZVxuXHQgKi9cblx0J2Nvb3JkJzogL15AQC4qQEAkL20sXG5cblx0Lypcblx0ICogTWF0Y2ggYSBcImNvbW1pdCBbU0hBMV1cIiBsaW5lIGluIGEgZ2l0IGxvZyBvdXRwdXQuXG5cdCAqIEZvciBpbnN0YW5jZTpcblx0ICogJCBnaXQgbG9nXG5cdCAqIGNvbW1pdCBhMTFhMTRlZjdlMjZmMmNhNjJkNGIzNWVhYzQ1NWNlNjM2ZDBkYzA5XG5cdCAqIEF1dGhvcjogbGdpcmF1ZGVsXG5cdCAqIERhdGU6ICAgTW9uIEZlYiAxNyAxMToxODozNCAyMDE0ICswMTAwXG5cdCAqXG5cdCAqICAgICBBZGQgb2YgYSBuZXcgbGluZVxuXHQgKi9cblx0J2NvbW1pdC1zaGExJzogL15jb21taXQgXFx3ezQwfSQvbVxufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmdsc2wgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjJywge1xuXHQna2V5d29yZCc6IC9cXGIoPzphY3RpdmV8YXNtfGF0b21pY191aW50fGF0dHJpYnV0ZXxbaWJkdV0/dmVjWzIzNF18Ym9vbHxicmVha3xidWZmZXJ8Y2FzZXxjYXN0fGNlbnRyb2lkfGNsYXNzfGNvaGVyZW50fGNvbW1vbnxjb25zdHxjb250aW51ZXxkP21hdFsyMzRdKD86eFsyMzRdKT98ZGVmYXVsdHxkaXNjYXJkfGRvfGRvdWJsZXxlbHNlfGVudW18ZXh0ZXJufGV4dGVybmFsfGZhbHNlfGZpbHRlcnxmaXhlZHxmbGF0fGZsb2F0fGZvcnxmdmVjWzIzNF18Z290b3xoYWxmfGhpZ2hwfGh2ZWNbMjM0XXxbaXVdP3NhbXBsZXIyRE1TKD86QXJyYXkpP3xbaXVdP3NhbXBsZXIyRFJlY3R8W2l1XT9zYW1wbGVyQnVmZmVyfFtpdV0/c2FtcGxlckN1YmV8W2l1XT9zYW1wbGVyQ3ViZUFycmF5fFtpdV0/c2FtcGxlclsxMjNdRHxbaXVdP3NhbXBsZXJbMTJdREFycmF5fFtpdV0/aW1hZ2UyRE1TKD86QXJyYXkpP3xbaXVdP2ltYWdlMkRSZWN0fFtpdV0/aW1hZ2VCdWZmZXJ8W2l1XT9pbWFnZUN1YmV8W2l1XT9pbWFnZUN1YmVBcnJheXxbaXVdP2ltYWdlWzEyM11EfFtpdV0/aW1hZ2VbMTJdREFycmF5fGlmfGlufGlubGluZXxpbm91dHxpbnB1dHxpbnR8aW50ZXJmYWNlfGludmFyaWFudHxsYXlvdXR8bG9uZ3xsb3dwfG1lZGl1bXB8bmFtZXNwYWNlfG5vaW5saW5lfG5vcGVyc3BlY3RpdmV8b3V0fG91dHB1dHxwYXJ0aXRpb258cGF0Y2h8cHJlY2lzZXxwcmVjaXNpb258cHVibGljfHJlYWRvbmx5fHJlc291cmNlfHJlc3RyaWN0fHJldHVybnxzYW1wbGV8c2FtcGxlclsxMl1EQXJyYXlTaGFkb3d8c2FtcGxlclsxMl1EU2hhZG93fHNhbXBsZXIyRFJlY3RTaGFkb3d8c2FtcGxlcjNEUmVjdHxzYW1wbGVyQ3ViZUFycmF5U2hhZG93fHNhbXBsZXJDdWJlU2hhZG93fHNoYXJlZHxzaG9ydHxzaXplb2Z8c21vb3RofHN0YXRpY3xzdHJ1Y3R8c3Vicm91dGluZXxzdXBlcnB8c3dpdGNofHRlbXBsYXRlfHRoaXN8dHJ1ZXx0eXBlZGVmfHVpbnR8dW5pZm9ybXx1bmlvbnx1bnNpZ25lZHx1c2luZ3x2YXJ5aW5nfHZvaWR8dm9sYXRpbGV8d2hpbGV8d3JpdGVvbmx5KVxcYi9cbn0pO1xuXG4vLyBodHRwczovL2duLmdvb2dsZXNvdXJjZS5jb20vZ24vKy9yZWZzL2hlYWRzL21haW4vZG9jcy9yZWZlcmVuY2UubWQjZ3JhbW1hclxuXG5QcmlzbS5sYW5ndWFnZXMuZ24gPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8jLiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nLWxpdGVyYWwnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXFwiXSlcIig/OlteXFxyXFxuXCJcXFxcXXxcXFxcLikqXCIvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbXlxcXFxdKSg/OlxcXFx7Mn0pKilcXCQoPzpcXHtbXFxzXFxTXSo/XFx9fFthLXpBLVpfXVxcdyp8MHhbYS1mQS1GMC05XXsyfSkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnbnVtYmVyJzogL15cXCQweFtcXHNcXFNdezJ9JC8sXG5cdFx0XHRcdFx0J3ZhcmlhYmxlJzogL15cXCRcXHcrJC8sXG5cdFx0XHRcdFx0J2ludGVycG9sYXRpb24tcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcJFxce3xcXH0kLyxcblx0XHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdH1cblx0fSxcblxuXHQna2V5d29yZCc6IC9cXGIoPzplbHNlfGlmKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0J2J1aWx0aW4tZnVuY3Rpb24nOiB7XG5cdFx0Ly8gYSBmZXcgZnVuY3Rpb25zIGdldCBzcGVjaWFsIGhpZ2hsaWdodGluZyB0byBpbXByb3ZlIHJlYWRhYmlsaXR5XG5cdFx0cGF0dGVybjogL1xcYig/OmFzc2VydHxkZWZpbmVkfGZvcmVhY2h8aW1wb3J0fHBvb2x8cHJpbnR8dGVtcGxhdGV8dG9vbHx0b29sY2hhaW4pKD89XFxzKlxcKCkvaSxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89XFxzKlxcKCkvaSxcblx0J2NvbnN0YW50JzogL1xcYig/OmN1cnJlbnRfY3B1fGN1cnJlbnRfb3N8Y3VycmVudF90b29sY2hhaW58ZGVmYXVsdF90b29sY2hhaW58aG9zdF9jcHV8aG9zdF9vc3xyb290X2J1aWxkX2Rpcnxyb290X2dlbl9kaXJ8cm9vdF9vdXRfZGlyfHRhcmdldF9jcHV8dGFyZ2V0X2dlbl9kaXJ8dGFyZ2V0X29zfHRhcmdldF9vdXRfZGlyKVxcYi8sXG5cblx0J251bWJlcic6IC8tP1xcYlxcZCtcXGIvLFxuXG5cdCdvcGVyYXRvcic6IC9bLSshPTw+XT0/fCYmfFxcfFxcfC8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKCl7fVtcXF0sLl0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuZ25bJ3N0cmluZy1saXRlcmFsJ10uaW5zaWRlWydpbnRlcnBvbGF0aW9uJ10uaW5zaWRlWydleHByZXNzaW9uJ10uaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLmduO1xuXG5QcmlzbS5sYW5ndWFnZXMuZ25pID0gUHJpc20ubGFuZ3VhZ2VzLmduO1xuXG5QcmlzbS5sYW5ndWFnZXNbJ2xpbmtlci1zY3JpcHQnXSA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyhefFxccylcXC9cXCpbXFxzXFxTXSo/KD86JHxcXCpcXC8pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnaWRlbnRpZmllcic6IHtcblx0XHRwYXR0ZXJuOiAvXCJbXlwiXFxyXFxuXSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J2xvY2F0aW9uLWNvdW50ZXInOiB7XG5cdFx0cGF0dGVybjogL1xcQlxcLlxcQi8sXG5cdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdH0sXG5cblx0J3NlY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFx3Kl0pXFwuXFx3K1xcYi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdmdW5jdGlvbic6IC9cXGJbQS1aXVtBLVpfXSooPz1cXHMqXFwoKS8sXG5cblx0J251bWJlcic6IC9cXGIoPzowW3hYXVthLWZBLUYwLTldK3xcXGQrKVtLTV0/XFxiLyxcblxuXHQnb3BlcmF0b3InOiAvPj49P3w8PD0/fC0+fFxcK1xcK3wtLXwmJnxcXHxcXHx8Ojp8Wz86fl18Wy0rKi8lJnxeIT08Pl09Py8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKCl7fSw7XS9cbn07XG5cblByaXNtLmxhbmd1YWdlc1snbGQnXSA9IFByaXNtLmxhbmd1YWdlc1snbGlua2VyLXNjcmlwdCddO1xuXG5QcmlzbS5sYW5ndWFnZXMuZ28gPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcIig/OlxcXFwufFteXCJcXFxcXFxyXFxuXSkqXCJ8YFteYF0qYC8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86YnJlYWt8Y2FzZXxjaGFufGNvbnN0fGNvbnRpbnVlfGRlZmF1bHR8ZGVmZXJ8ZWxzZXxmYWxsdGhyb3VnaHxmb3J8ZnVuY3xnbyg/OnRvKT98aWZ8aW1wb3J0fGludGVyZmFjZXxtYXB8cGFja2FnZXxyYW5nZXxyZXR1cm58c2VsZWN0fHN0cnVjdHxzd2l0Y2h8dHlwZXx2YXIpXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86X3xmYWxzZXxpb3RhfG5pbHx0cnVlKVxcYi8sXG5cdCdudW1iZXInOiBbXG5cdFx0Ly8gYmluYXJ5IGFuZCBvY3RhbCBpbnRlZ2Vyc1xuXHRcdC9cXGIwKD86YlswMV9dK3xvWzAtN19dKylpP1xcYi9pLFxuXHRcdC8vIGhleGFkZWNpbWFsIGludGVnZXJzIGFuZCBmbG9hdHNcblx0XHQvXFxiMHgoPzpbYS1mXFxkX10rKD86XFwuW2EtZlxcZF9dKik/fFxcLlthLWZcXGRfXSspKD86cFsrLV0/XFxkKyg/Ol9cXGQrKSopP2k/KD8hXFx3KS9pLFxuXHRcdC8vIGRlY2ltYWwgaW50ZWdlcnMgYW5kIGZsb2F0c1xuXHRcdC8oPzpcXGJcXGRbXFxkX10qKD86XFwuW1xcZF9dKik/fFxcQlxcLlxcZFtcXGRfXSopKD86ZVsrLV0/W1xcZF9dKyk/aT8oPyFcXHcpL2lcblx0XSxcblx0J29wZXJhdG9yJzogL1sqXFwvJV4hPV09P3xcXCtbPStdP3wtWz0tXT98XFx8Wz18XT98Jig/Oj18JnxcXF49Pyk/fD4oPzo+PT98PSk/fDwoPzo8PT98PXwtKT98Oj18XFwuXFwuXFwuLyxcblx0J2J1aWx0aW4nOiAvXFxiKD86YXBwZW5kfGJvb2x8Ynl0ZXxjYXB8Y2xvc2V8Y29tcGxleHxjb21wbGV4KD86NjR8MTI4KXxjb3B5fGRlbGV0ZXxlcnJvcnxmbG9hdCg/OjMyfDY0KXx1P2ludCg/Ojh8MTZ8MzJ8NjQpP3xpbWFnfGxlbnxtYWtlfG5ld3xwYW5pY3xwcmludCg/OmxuKT98cmVhbHxyZWNvdmVyfHJ1bmV8c3RyaW5nfHVpbnRwdHIpXFxiL1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2dvJywgJ3N0cmluZycsIHtcblx0J2NoYXInOiB7XG5cdFx0cGF0dGVybjogLycoPzpcXFxcLnxbXidcXFxcXFxyXFxuXSl7MCwxMH0nLyxcblx0XHRncmVlZHk6IHRydWVcblx0fVxufSk7XG5cbmRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMuZ29bJ2NsYXNzLW5hbWUnXTtcblxuLy8gaHR0cHM6Ly9nby5kZXYvcmVmL21vZCNnby1tb2QtZmlsZS1tb2R1bGVcblxuUHJpc20ubGFuZ3VhZ2VzWydnby1tb2QnXSA9IFByaXNtLmxhbmd1YWdlc1snZ28tbW9kdWxlJ10gPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXC9cXC8uKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCd2ZXJzaW9uJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXFxzKClbXFxdLF0pdlxcZCtcXC5cXGQrXFwuXFxkKyg/OlsrLV1bLSsuXFx3XSopPyg/IVteXFxzKClbXFxdLF0pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHR9LFxuXHQnZ28tdmVyc2lvbic6IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxzKWdvXFxzKylcXGQrKD86XFwuXFxkKyl7MSwyfS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ251bWJlcidcblx0fSxcblx0J2tleXdvcmQnOiB7XG5cdFx0cGF0dGVybjogL14oWyBcXHRdKikoPzpleGNsdWRlfGdvfG1vZHVsZXxyZXBsYWNlfHJlcXVpcmV8cmV0cmFjdClcXGIvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdvcGVyYXRvcic6IC89Pi8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKClbXFxdLF0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdHZhciBpbnRlcnBvbGF0aW9uID0ge1xuXHRcdHBhdHRlcm46IC8oKD86XnxbXlxcXFwkXSkoPzpcXFxcezJ9KSopXFwkKD86XFx3K3xcXHtbXnt9XSpcXH0pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2ludGVycG9sYXRpb24tcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eXFwkXFx7P3xcXH0kLyxcblx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbicsXG5cdFx0XHR9LFxuXHRcdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRpbnNpZGU6IG51bGwsXG5cdFx0XHR9LFxuXHRcdH0sXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmdyYWRsZSA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvJycnKD86W15cXFxcXXxcXFxcW1xcc1xcU10pKj8nJyd8Jyg/OlxcXFwufFteXFxcXCdcXHJcXG5dKSonLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHR9LFxuXHRcdCdrZXl3b3JkJzpcblx0XHRcdC9cXGIoPzphcHBseXxkZWZ8ZGVwZW5kZW5jaWVzfGVsc2V8aWZ8aW1wbGVtZW50YXRpb258aW1wb3J0fHBsdWdpbnxwbHVnaW5zfHByb2plY3R8cmVwb3NpdG9yaWVzfHJlcG9zaXRvcnl8c291cmNlU2V0c3x0YXNrc3x2YWwpXFxiLyxcblx0XHQnbnVtYmVyJzogL1xcYig/OjBiWzAxX10rfDB4W1xcZGEtZl9dKyg/OlxcLltcXGRhLWZfcFxcLV0rKT98W1xcZF9dKyg/OlxcLltcXGRfXSspPyg/OmVbKy1dP1xcZCspPylbZ2xpZGZdP1xcYi9pLFxuXHRcdCdvcGVyYXRvcic6IHtcblx0XHRcdHBhdHRlcm46XG5cdFx0XHRcdC8oXnxbXi5dKSg/On58PT0/fj98XFw/Wy46XT98XFwqKD86Wy49XXxcXCo9Pyk/fFxcLltAJl18XFwuXFwuPHxcXC5cXC4oPyFcXC4pfC1bLT0+XT98XFwrWys9XT98IT0/fDwoPzo8PT98PT4/KT98Pig/Oj4+Pz0/fD0pP3wmWyY9XT98XFx8W3w9XT98XFwvPT98XFxePT98JT0/KS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdH0sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1xcLit8W3t9W1xcXTsoKSw6JF0vLFxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdncmFkbGUnLCAnc3RyaW5nJywge1xuXHRcdCdzaGViYW5nJzoge1xuXHRcdFx0cGF0dGVybjogLyMhLisvLFxuXHRcdFx0YWxpYXM6ICdjb21tZW50Jyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHR9LFxuXHRcdCdpbnRlcnBvbGF0aW9uLXN0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46XG5cdFx0XHRcdC9cIlwiXCIoPzpbXlxcXFxdfFxcXFxbXFxzXFxTXSkqP1wiXCJcInwoW1wiL10pKD86XFxcXC58KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMXxcXCRcXC8oPzpbXi8kXXxcXCQoPzpbLyRdfCg/IVsvJF0pKXxcXC8oPyFcXCQpKSpcXC9cXCQvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzogaW50ZXJwb2xhdGlvbixcblx0XHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvLFxuXHRcdFx0fSxcblx0XHR9LFxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdncmFkbGUnLCAncHVuY3R1YXRpb24nLCB7XG5cdFx0J3Nwb2NrLWJsb2NrJzogL1xcYig/OmFuZHxjbGVhbnVwfGV4cGVjdHxnaXZlbnxzZXR1cHx0aGVufHdoZW58d2hlcmUpOi8sXG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2dyYWRsZScsICdmdW5jdGlvbicsIHtcblx0XHQnYW5ub3RhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXi5dKUBcXHcrLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJyxcblx0XHR9LFxuXHR9KTtcblxuXHRpbnRlcnBvbGF0aW9uLmluc2lkZS5leHByZXNzaW9uLmluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy5ncmFkbGU7XG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5ncmFwaHFsID0ge1xuXHQnY29tbWVudCc6IC8jLiovLFxuXHQnZGVzY3JpcHRpb24nOiB7XG5cdFx0cGF0dGVybjogLyg/OlwiXCJcIig/OlteXCJdfCg/IVwiXCJcIilcIikqXCJcIlwifFwiKD86XFxcXC58W15cXFxcXCJcXHJcXG5dKSpcIikoPz1cXHMqW2Etel9dKS9pLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ3N0cmluZycsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnbGFuZ3VhZ2UtbWFya2Rvd24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oXlwiKD86XCJcIik/KSg/IVxcMSlbXFxzXFxTXSsoPz1cXDEkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLm1hcmtkb3duXG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIlwiXCIoPzpbXlwiXXwoPyFcIlwiXCIpXCIpKlwiXCJcInxcIig/OlxcXFwufFteXFxcXFwiXFxyXFxuXSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnbnVtYmVyJzogLyg/OlxcQi18XFxiKVxcZCsoPzpcXC5cXGQrKT8oPzplWystXT9cXGQrKT9cXGIvaSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQndmFyaWFibGUnOiAvXFwkW2Etel9dXFx3Ki9pLFxuXHQnZGlyZWN0aXZlJzoge1xuXHRcdHBhdHRlcm46IC9AW2Etel9dXFx3Ki9pLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdH0sXG5cdCdhdHRyLW5hbWUnOiB7XG5cdFx0cGF0dGVybjogL1xcYlthLXpfXVxcdyooPz1cXHMqKD86XFwoKD86W14oKVwiXXxcIig/OlxcXFwufFteXFxcXFwiXFxyXFxuXSkqXCIpKlxcKSk/OikvaSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2F0b20taW5wdXQnOiB7XG5cdFx0cGF0dGVybjogL1xcYltBLVpdXFx3KklucHV0XFxiLyxcblx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdH0sXG5cdCdzY2FsYXInOiAvXFxiKD86Qm9vbGVhbnxGbG9hdHxJRHxJbnR8U3RyaW5nKVxcYi8sXG5cdCdjb25zdGFudCc6IC9cXGJbQS1aXVtBLVpfXFxkXSpcXGIvLFxuXHQnY2xhc3MtbmFtZSc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYig/OmVudW18aW1wbGVtZW50c3xpbnRlcmZhY2V8b258c2NhbGFyfHR5cGV8dW5pb24pXFxzK3wmXFxzKnw6XFxzKnxcXFspW0EtWl9dXFx3Ki8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnZnJhZ21lbnQnOiB7XG5cdFx0cGF0dGVybjogLyhcXGJmcmFnbWVudFxccyt8XFwuezN9XFxzKig/IW9uXFxiKSlbYS16QS1aX11cXHcqLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdH0sXG5cdCdkZWZpbml0aW9uLW11dGF0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oXFxibXV0YXRpb25cXHMrKVthLXpBLVpfXVxcdyovLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0fSxcblx0J2RlZmluaXRpb24tcXVlcnknOiB7XG5cdFx0cGF0dGVybjogLyhcXGJxdWVyeVxccyspW2EtekEtWl9dXFx3Ki8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzpkaXJlY3RpdmV8ZW51bXxleHRlbmR8ZnJhZ21lbnR8aW1wbGVtZW50c3xpbnB1dHxpbnRlcmZhY2V8bXV0YXRpb258b258cXVlcnl8cmVwZWF0YWJsZXxzY2FsYXJ8c2NoZW1hfHN1YnNjcmlwdGlvbnx0eXBlfHVuaW9uKVxcYi8sXG5cdCdvcGVyYXRvcic6IC9bIT18Jl18XFwuezN9Lyxcblx0J3Byb3BlcnR5LXF1ZXJ5JzogL1xcdysoPz1cXHMqXFwoKS8sXG5cdCdvYmplY3QnOiAvXFx3Kyg/PVxccypcXHspLyxcblx0J3B1bmN0dWF0aW9uJzogL1shKCl7fVxcW1xcXTo9LF0vLFxuXHQncHJvcGVydHknOiAvXFx3Ky9cbn07XG5cblByaXNtLmhvb2tzLmFkZCgnYWZ0ZXItdG9rZW5pemUnLCBmdW5jdGlvbiBhZnRlclRva2VuaXplR3JhcGhxbChlbnYpIHtcblx0aWYgKGVudi5sYW5ndWFnZSAhPT0gJ2dyYXBocWwnKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0LyoqXG5cdCAqIGdldCB0aGUgZ3JhcGhxbCB0b2tlbiBzdHJlYW0gdGhhdCB3ZSB3YW50IHRvIGN1c3RvbWl6ZVxuXHQgKlxuXHQgKiBAdHlwZWRlZiB7SW5zdGFuY2VUeXBlPGltcG9ydChcIi4vcHJpc20tY29yZVwiKVtcIlRva2VuXCJdPn0gVG9rZW5cblx0ICogQHR5cGUge1Rva2VuW119XG5cdCAqL1xuXHR2YXIgdmFsaWRUb2tlbnMgPSBlbnYudG9rZW5zLmZpbHRlcihmdW5jdGlvbiAodG9rZW4pIHtcblx0XHRyZXR1cm4gdHlwZW9mIHRva2VuICE9PSAnc3RyaW5nJyAmJiB0b2tlbi50eXBlICE9PSAnY29tbWVudCcgJiYgdG9rZW4udHlwZSAhPT0gJ3NjYWxhcic7XG5cdH0pO1xuXG5cdHZhciBjdXJyZW50SW5kZXggPSAwO1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHRva2VuIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGluZGV4IGhhcyB0aGUgZ2l2ZW4gdHlwZS5cblx0ICpcblx0ICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuXHQgKiBAcmV0dXJucyB7VG9rZW4gfCB1bmRlZmluZWR9XG5cdCAqL1xuXHRmdW5jdGlvbiBnZXRUb2tlbihvZmZzZXQpIHtcblx0XHRyZXR1cm4gdmFsaWRUb2tlbnNbY3VycmVudEluZGV4ICsgb2Zmc2V0XTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHRva2VuIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGluZGV4IGhhcyB0aGUgZ2l2ZW4gdHlwZS5cblx0ICpcblx0ICogQHBhcmFtIHtyZWFkb25seSBzdHJpbmdbXX0gdHlwZXNcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF1cblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqL1xuXHRmdW5jdGlvbiBpc1Rva2VuVHlwZSh0eXBlcywgb2Zmc2V0KSB7XG5cdFx0b2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIHRva2VuID0gZ2V0VG9rZW4oaSArIG9mZnNldCk7XG5cdFx0XHRpZiAoIXRva2VuIHx8IHRva2VuLnR5cGUgIT09IHR5cGVzW2ldKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGNsb3NpbmcgYnJhY2tldCB0byBhbiBvcGVuaW5nIGJyYWNrZXQuXG5cdCAqXG5cdCAqIEl0IGlzIGFzc3VtZWQgdGhhdCBgdG9rZW5bY3VycmVudEluZGV4IC0gMV1gIGlzIGFuIG9wZW5pbmcgYnJhY2tldC5cblx0ICpcblx0ICogSWYgbm8gY2xvc2luZyBicmFja2V0IGNvdWxkIGJlIGZvdW5kLCBgLTFgIHdpbGwgYmUgcmV0dXJuZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7UmVnRXhwfSBvcGVuXG5cdCAqIEBwYXJhbSB7UmVnRXhwfSBjbG9zZVxuXHQgKiBAcmV0dXJucyB7bnVtYmVyfVxuXHQgKi9cblx0ZnVuY3Rpb24gZmluZENsb3NpbmdCcmFja2V0KG9wZW4sIGNsb3NlKSB7XG5cdFx0dmFyIHN0YWNrSGVpZ2h0ID0gMTtcblxuXHRcdGZvciAodmFyIGkgPSBjdXJyZW50SW5kZXg7IGkgPCB2YWxpZFRva2Vucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIHRva2VuID0gdmFsaWRUb2tlbnNbaV07XG5cdFx0XHR2YXIgY29udGVudCA9IHRva2VuLmNvbnRlbnQ7XG5cblx0XHRcdGlmICh0b2tlbi50eXBlID09PSAncHVuY3R1YXRpb24nICYmIHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRpZiAob3Blbi50ZXN0KGNvbnRlbnQpKSB7XG5cdFx0XHRcdFx0c3RhY2tIZWlnaHQrKztcblx0XHRcdFx0fSBlbHNlIGlmIChjbG9zZS50ZXN0KGNvbnRlbnQpKSB7XG5cdFx0XHRcdFx0c3RhY2tIZWlnaHQtLTtcblxuXHRcdFx0XHRcdGlmIChzdGFja0hlaWdodCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIC0xO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYW4gYWxpYXMgdG8gdGhlIGdpdmVuIHRva2VuLlxuXHQgKlxuXHQgKiBAcGFyYW0ge1Rva2VufSB0b2tlblxuXHQgKiBAcGFyYW0ge3N0cmluZ30gYWxpYXNcblx0ICogQHJldHVybnMge3ZvaWR9XG5cdCAqL1xuXHRmdW5jdGlvbiBhZGRBbGlhcyh0b2tlbiwgYWxpYXMpIHtcblx0XHR2YXIgYWxpYXNlcyA9IHRva2VuLmFsaWFzO1xuXHRcdGlmICghYWxpYXNlcykge1xuXHRcdFx0dG9rZW4uYWxpYXMgPSBhbGlhc2VzID0gW107XG5cdFx0fSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShhbGlhc2VzKSkge1xuXHRcdFx0dG9rZW4uYWxpYXMgPSBhbGlhc2VzID0gW2FsaWFzZXNdO1xuXHRcdH1cblx0XHRhbGlhc2VzLnB1c2goYWxpYXMpO1xuXHR9XG5cblx0Zm9yICg7IGN1cnJlbnRJbmRleCA8IHZhbGlkVG9rZW5zLmxlbmd0aDspIHtcblx0XHR2YXIgc3RhcnRUb2tlbiA9IHZhbGlkVG9rZW5zW2N1cnJlbnRJbmRleCsrXTtcblxuXHRcdC8vIGFkZCBzcGVjaWFsIGFsaWFzZXMgZm9yIG11dGF0aW9uIHRva2Vuc1xuXHRcdGlmIChzdGFydFRva2VuLnR5cGUgPT09ICdrZXl3b3JkJyAmJiBzdGFydFRva2VuLmNvbnRlbnQgPT09ICdtdXRhdGlvbicpIHtcblx0XHRcdC8vIGFueSBhcnJheSBvZiB0aGUgbmFtZXMgb2YgYWxsIGlucHV0IHZhcmlhYmxlcyAoaWYgYW55KVxuXHRcdFx0dmFyIGlucHV0VmFyaWFibGVzID0gW107XG5cblx0XHRcdGlmIChpc1Rva2VuVHlwZShbJ2RlZmluaXRpb24tbXV0YXRpb24nLCAncHVuY3R1YXRpb24nXSkgJiYgZ2V0VG9rZW4oMSkuY29udGVudCA9PT0gJygnKSB7XG5cdFx0XHRcdC8vIGRlZmluaXRpb25cblxuXHRcdFx0XHRjdXJyZW50SW5kZXggKz0gMjsgLy8gc2tpcCAnZGVmaW5pdGlvbi1tdXRhdGlvbicgYW5kICdwdW5jdHVhdGlvbidcblxuXHRcdFx0XHR2YXIgZGVmaW5pdGlvbkVuZCA9IGZpbmRDbG9zaW5nQnJhY2tldCgvXlxcKCQvLCAvXlxcKSQvKTtcblx0XHRcdFx0aWYgKGRlZmluaXRpb25FbmQgPT09IC0xKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBmaW5kIGFsbCBpbnB1dCB2YXJpYWJsZXNcblx0XHRcdFx0Zm9yICg7IGN1cnJlbnRJbmRleCA8IGRlZmluaXRpb25FbmQ7IGN1cnJlbnRJbmRleCsrKSB7XG5cdFx0XHRcdFx0dmFyIHQgPSBnZXRUb2tlbigwKTtcblx0XHRcdFx0XHRpZiAodC50eXBlID09PSAndmFyaWFibGUnKSB7XG5cdFx0XHRcdFx0XHRhZGRBbGlhcyh0LCAndmFyaWFibGUtaW5wdXQnKTtcblx0XHRcdFx0XHRcdGlucHV0VmFyaWFibGVzLnB1c2godC5jb250ZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjdXJyZW50SW5kZXggPSBkZWZpbml0aW9uRW5kICsgMTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGlzVG9rZW5UeXBlKFsncHVuY3R1YXRpb24nLCAncHJvcGVydHktcXVlcnknXSkgJiYgZ2V0VG9rZW4oMCkuY29udGVudCA9PT0gJ3snKSB7XG5cdFx0XHRcdGN1cnJlbnRJbmRleCsrOyAvLyBza2lwIG9wZW5pbmcgYnJhY2tldFxuXG5cdFx0XHRcdGFkZEFsaWFzKGdldFRva2VuKDApLCAncHJvcGVydHktbXV0YXRpb24nKTtcblxuXHRcdFx0XHRpZiAoaW5wdXRWYXJpYWJsZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHZhciBtdXRhdGlvbkVuZCA9IGZpbmRDbG9zaW5nQnJhY2tldCgvXlxceyQvLCAvXlxcfSQvKTtcblx0XHRcdFx0XHRpZiAobXV0YXRpb25FbmQgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBnaXZlIHJlZmVyZW5jZXMgdG8gaW5wdXQgdmFyaWFibGVzIGEgc3BlY2lhbCBhbGlhc1xuXHRcdFx0XHRcdGZvciAodmFyIGkgPSBjdXJyZW50SW5kZXg7IGkgPCBtdXRhdGlvbkVuZDsgaSsrKSB7XG5cdFx0XHRcdFx0XHR2YXIgdmFyVG9rZW4gPSB2YWxpZFRva2Vuc1tpXTtcblx0XHRcdFx0XHRcdGlmICh2YXJUb2tlbi50eXBlID09PSAndmFyaWFibGUnICYmIGlucHV0VmFyaWFibGVzLmluZGV4T2YodmFyVG9rZW4uY29udGVudCkgPj0gMCkge1xuXHRcdFx0XHRcdFx0XHRhZGRBbGlhcyh2YXJUb2tlbiwgJ3ZhcmlhYmxlLWlucHV0Jyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59KTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBpbnRlcnBvbGF0aW9uID0ge1xuXHRcdHBhdHRlcm46IC8oKD86XnxbXlxcXFwkXSkoPzpcXFxcezJ9KSopXFwkKD86XFx3K3xcXHtbXnt9XSpcXH0pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2ludGVycG9sYXRpb24tcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eXFwkXFx7P3xcXH0kLyxcblx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdH0sXG5cdFx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmdyb292eSA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHQvLyBodHRwczovL2dyb292eS1sYW5nLm9yZy9zeW50YXguaHRtbCNfZG9sbGFyX3NsYXNoeV9zdHJpbmdcblx0XHRcdHBhdHRlcm46IC8nJycoPzpbXlxcXFxdfFxcXFxbXFxzXFxTXSkqPycnJ3wnKD86XFxcXC58W15cXFxcJ1xcclxcbl0pKicvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQna2V5d29yZCc6IC9cXGIoPzphYnN0cmFjdHxhc3xhc3NlcnR8Ym9vbGVhbnxicmVha3xieXRlfGNhc2V8Y2F0Y2h8Y2hhcnxjbGFzc3xjb25zdHxjb250aW51ZXxkZWZ8ZGVmYXVsdHxkb3xkb3VibGV8ZWxzZXxlbnVtfGV4dGVuZHN8ZmluYWx8ZmluYWxseXxmbG9hdHxmb3J8Z290b3xpZnxpbXBsZW1lbnRzfGltcG9ydHxpbnxpbnN0YW5jZW9mfGludHxpbnRlcmZhY2V8bG9uZ3xuYXRpdmV8bmV3fHBhY2thZ2V8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJldHVybnxzaG9ydHxzdGF0aWN8c3RyaWN0ZnB8c3VwZXJ8c3dpdGNofHN5bmNocm9uaXplZHx0aGlzfHRocm93fHRocm93c3x0cmFpdHx0cmFuc2llbnR8dHJ5fHZvaWR8dm9sYXRpbGV8d2hpbGUpXFxiLyxcblx0XHQnbnVtYmVyJzogL1xcYig/OjBiWzAxX10rfDB4W1xcZGEtZl9dKyg/OlxcLltcXGRhLWZfcFxcLV0rKT98W1xcZF9dKyg/OlxcLltcXGRfXSspPyg/OmVbKy1dP1xcZCspPylbZ2xpZGZdP1xcYi9pLFxuXHRcdCdvcGVyYXRvcic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXi5dKSg/On58PT0/fj98XFw/Wy46XT98XFwqKD86Wy49XXxcXCo9Pyk/fFxcLltAJl18XFwuXFwuPHxcXC5cXC4oPyFcXC4pfC1bLT0+XT98XFwrWys9XT98IT0/fDwoPzo8PT98PT4/KT98Pig/Oj4+Pz0/fD0pP3wmWyY9XT98XFx8W3w9XT98XFwvPT98XFxePT98JT0/KS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQncHVuY3R1YXRpb24nOiAvXFwuK3xbe31bXFxdOygpLDokXS9cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnZ3Jvb3Z5JywgJ3N0cmluZycsIHtcblx0XHQnc2hlYmFuZyc6IHtcblx0XHRcdHBhdHRlcm46IC8jIS4rLyxcblx0XHRcdGFsaWFzOiAnY29tbWVudCcsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdpbnRlcnBvbGF0aW9uLXN0cmluZyc6IHtcblx0XHRcdC8vIFRPRE86IFNsYXNoIHN0cmluZ3MgKGUuZy4gL2Zvby8pIGNhbiBjb250YWluIGxpbmUgYnJlYWtzIGJ1dCB0aGlzIHdpbGwgY2F1c2UgYSBsb3Qgb2YgdHJvdWJsZSB3aXRoXG5cdFx0XHQvLyBzaW1wbGUgZGl2aXNpb24gKHNlZSBKUyByZWdleCksIHNvIGZpbmQgYSBmaXggbWF5YmU/XG5cdFx0XHRwYXR0ZXJuOiAvXCJcIlwiKD86W15cXFxcXXxcXFxcW1xcc1xcU10pKj9cIlwiXCJ8KFtcIi9dKSg/OlxcXFwufCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDF8XFwkXFwvKD86W14vJF18XFwkKD86Wy8kXXwoPyFbLyRdKSl8XFwvKD8hXFwkKSkqXFwvXFwkLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IGludGVycG9sYXRpb24sXG5cdFx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnZ3Jvb3Z5JywgJ3B1bmN0dWF0aW9uJywge1xuXHRcdCdzcG9jay1ibG9jayc6IC9cXGIoPzphbmR8Y2xlYW51cHxleHBlY3R8Z2l2ZW58c2V0dXB8dGhlbnx3aGVufHdoZXJlKTovXG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2dyb292eScsICdmdW5jdGlvbicsIHtcblx0XHQnYW5ub3RhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXi5dKUBcXHcrLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH1cblx0fSk7XG5cblx0aW50ZXJwb2xhdGlvbi5pbnNpZGUuZXhwcmVzc2lvbi5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMuZ3Jvb3Z5O1xuXG59KFByaXNtKSk7XG5cbi8qIFRPRE9cblx0SGFuZGxlIG11bHRpbGluZSBjb2RlIGFmdGVyIHRhZ1xuXHQgICAgJWZvbz0gc29tZSB8XG5cdFx0XHRtdWx0aWxpbmUgfFxuXHRcdFx0Y29kZSB8XG4qL1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmhhbWwgPSB7XG5cdFx0Ly8gTXVsdGlsaW5lIHN0dWZmIHNob3VsZCBhcHBlYXIgYmVmb3JlIHRoZSByZXN0XG5cblx0XHQnbXVsdGlsaW5lLWNvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxyP1xcbnxcXHIpKFtcXHQgXSopKSg/OlxcL3wtIykuKig/Oig/Olxccj9cXG58XFxyKVxcMltcXHQgXS4rKSovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnY29tbWVudCdcblx0XHR9LFxuXG5cdFx0J211bHRpbGluZS1jb2RlJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxyP1xcbnxcXHIpKFtcXHQgXSopKD86W34tXXxbJiFdPz0pKS4qLFtcXHQgXSooPzooPzpcXHI/XFxufFxccilcXDJbXFx0IF0uKixbXFx0IF0qKSooPzooPzpcXHI/XFxufFxccilcXDJbXFx0IF0uKykvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5ydWJ5XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxyP1xcbnxcXHIpKFtcXHQgXSopKD86W34tXXxbJiFdPz0pKS4qXFx8W1xcdCBdKig/Oig/Olxccj9cXG58XFxyKVxcMltcXHQgXS4qXFx8W1xcdCBdKikqLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMucnVieVxuXHRcdFx0fVxuXHRcdF0sXG5cblx0XHQvLyBTZWUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBmb3Iga25vd24gZmlsdGVyc1xuXHRcdCdmaWx0ZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxyP1xcbnxcXHIpKFtcXHQgXSopKTpbXFx3LV0rKD86KD86XFxyP1xcbnxcXHIpKD86XFwyW1xcdCBdLit8XFxzKj8oPz1cXHI/XFxufFxccikpKSsvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZmlsdGVyLW5hbWUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL146W1xcdy1dKy8sXG5cdFx0XHRcdFx0YWxpYXM6ICdzeW1ib2wnXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0J21hcmt1cCc6IHtcblx0XHRcdHBhdHRlcm46IC8oKD86XnxcXHI/XFxufFxccilbXFx0IF0qKTwuKy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMubWFya3VwXG5cdFx0fSxcblx0XHQnZG9jdHlwZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oKD86XnxcXHI/XFxufFxccilbXFx0IF0qKSEhISg/OiAuKyk/Lyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCd0YWcnOiB7XG5cdFx0XHQvLyBBbGxvd3MgZm9yIG9uZSBuZXN0ZWQgZ3JvdXAgb2YgYnJhY2VzXG5cdFx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxyP1xcbnxcXHIpW1xcdCBdKilbJS4jXVtcXHdcXC0jLl0qW1xcd1xcLV0oPzpcXChbXildK1xcKXxcXHsoPzpcXHtbXn1dK1xcfXxbXnt9XSkrXFx9fFxcW1teXFxdXStcXF0pKltcXC88Pl0qLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2F0dHJpYnV0ZXMnOiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8gTG9va2JlaGluZCB0cmllcyB0byBwcmV2ZW50IGludGVycG9sYXRpb25zIGZyb20gYnJlYWtpbmcgaXQgYWxsXG5cdFx0XHRcdFx0XHQvLyBBbGxvd3MgZm9yIG9uZSBuZXN0ZWQgZ3JvdXAgb2YgYnJhY2VzXG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKF58W14jXSlcXHsoPzpcXHtbXn1dK1xcfXxbXnt9XSkrXFx9Lyxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5ydWJ5XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXFwoW14pXStcXCkvLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdCdhdHRyLXZhbHVlJzoge1xuXHRcdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8oPVxccyopKD86XCIoPzpcXFxcLnxbXlxcXFxcIlxcclxcbl0pKlwifFteKVxcc10rKS8sXG5cdFx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHQnYXR0ci1uYW1lJzogL1tcXHc6LV0rKD89XFxzKiE/PXxcXHMqWywpXSkvLFxuXHRcdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWz0oKSxdL1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1xcW1teXFxdXStcXF0vLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMucnVieVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1s8Pl0vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnY29kZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oKD86XnxcXHI/XFxufFxccilbXFx0IF0qKD86W34tXXxbJiFdPz0pKS4rLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5ydWJ5XG5cdFx0fSxcblx0XHQvLyBJbnRlcnBvbGF0aW9ucyBpbiBwbGFpbiB0ZXh0XG5cdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvI1xce1tefV0rXFx9Lyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eI1xce3xcXH0kLyxcblx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQncnVieSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5ydWJ5XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdwdW5jdHVhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oKD86XnxcXHI/XFxufFxccilbXFx0IF0qKVt+PVxcLSYhXSsvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0fTtcblxuXHR2YXIgZmlsdGVyX3BhdHRlcm4gPSAnKCg/Ol58XFxcXHI/XFxcXG58XFxcXHIpKFtcXFxcdCBdKikpOnt7ZmlsdGVyX25hbWV9fSg/Oig/OlxcXFxyP1xcXFxufFxcXFxyKSg/OlxcXFwyW1xcXFx0IF0uK3xcXFxccyo/KD89XFxcXHI/XFxcXG58XFxcXHIpKSkrJztcblxuXHQvLyBOb24gZXhoYXVzdGl2ZSBsaXN0IG9mIGF2YWlsYWJsZSBmaWx0ZXJzIGFuZCBhc3NvY2lhdGVkIGxhbmd1YWdlc1xuXHR2YXIgZmlsdGVycyA9IFtcblx0XHQnY3NzJyxcblx0XHR7IGZpbHRlcjogJ2NvZmZlZScsIGxhbmd1YWdlOiAnY29mZmVlc2NyaXB0JyB9LFxuXHRcdCdlcmInLFxuXHRcdCdqYXZhc2NyaXB0Jyxcblx0XHQnbGVzcycsXG5cdFx0J21hcmtkb3duJyxcblx0XHQncnVieScsXG5cdFx0J3Njc3MnLFxuXHRcdCd0ZXh0aWxlJ1xuXHRdO1xuXHR2YXIgYWxsX2ZpbHRlcnMgPSB7fTtcblx0Zm9yICh2YXIgaSA9IDAsIGwgPSBmaWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdHZhciBmaWx0ZXIgPSBmaWx0ZXJzW2ldO1xuXHRcdGZpbHRlciA9IHR5cGVvZiBmaWx0ZXIgPT09ICdzdHJpbmcnID8geyBmaWx0ZXI6IGZpbHRlciwgbGFuZ3VhZ2U6IGZpbHRlciB9IDogZmlsdGVyO1xuXHRcdGlmIChQcmlzbS5sYW5ndWFnZXNbZmlsdGVyLmxhbmd1YWdlXSkge1xuXHRcdFx0YWxsX2ZpbHRlcnNbJ2ZpbHRlci0nICsgZmlsdGVyLmZpbHRlcl0gPSB7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cChmaWx0ZXJfcGF0dGVybi5yZXBsYWNlKCd7e2ZpbHRlcl9uYW1lfX0nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBmaWx0ZXIuZmlsdGVyOyB9KSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdmaWx0ZXItbmFtZSc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9eOltcXHctXSsvLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdzeW1ib2wnXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQndGV4dCc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRcdFx0YWxpYXM6IFtmaWx0ZXIubGFuZ3VhZ2UsICdsYW5ndWFnZS0nICsgZmlsdGVyLmxhbmd1YWdlXSxcblx0XHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzW2ZpbHRlci5sYW5ndWFnZV1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnaGFtbCcsICdmaWx0ZXInLCBhbGxfZmlsdGVycyk7XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdFByaXNtLmxhbmd1YWdlcy5oYW5kbGViYXJzID0ge1xuXHRcdCdjb21tZW50JzogL1xce1xceyFbXFxzXFxTXSo/XFx9XFx9Lyxcblx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0cGF0dGVybjogL15cXHtcXHtcXHs/fFxcfVxcfVxcfT8kLyxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblx0XHQnc3RyaW5nJzogLyhbXCInXSkoPzpcXFxcLnwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0XHQnbnVtYmVyJzogL1xcYjB4W1xcZEEtRmEtZl0rXFxifCg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzpbRWVdWystXT9cXGQrKT8vLFxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0XHQnYmxvY2snOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXihcXHMqKD86flxccyopPylbI1xcL11cXFMrPyg/PVxccyooPzp+XFxzKik/JHxcXHMpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fSxcblx0XHQnYnJhY2tldHMnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxbW15cXF1dK1xcXS8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0cHVuY3R1YXRpb246IC9cXFt8XFxdLyxcblx0XHRcdFx0dmFyaWFibGU6IC9bXFxzXFxTXSsvXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQncHVuY3R1YXRpb24nOiAvWyFcIiMlJic6KCkqKywuXFwvOzw9PkBcXFtcXFxcXFxdXmB7fH1+XS8sXG5cdFx0J3ZhcmlhYmxlJzogL1teIVwiIyUmJygpKissXFwvOzw9PkBcXFtcXFxcXFxdXmB7fH1+XFxzXSsvXG5cdH07XG5cblx0UHJpc20uaG9va3MuYWRkKCdiZWZvcmUtdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0dmFyIGhhbmRsZWJhcnNQYXR0ZXJuID0gL1xce1xce1xce1tcXHNcXFNdKz9cXH1cXH1cXH18XFx7XFx7W1xcc1xcU10rP1xcfVxcfS9nO1xuXHRcdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS5idWlsZFBsYWNlaG9sZGVycyhlbnYsICdoYW5kbGViYXJzJywgaGFuZGxlYmFyc1BhdHRlcm4pO1xuXHR9KTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2FmdGVyLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS50b2tlbml6ZVBsYWNlaG9sZGVycyhlbnYsICdoYW5kbGViYXJzJyk7XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5oYnMgPSBQcmlzbS5sYW5ndWFnZXMuaGFuZGxlYmFycztcblx0UHJpc20ubGFuZ3VhZ2VzLm11c3RhY2hlID0gUHJpc20ubGFuZ3VhZ2VzLmhhbmRsZWJhcnM7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmhhc2tlbGwgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXi0hIyQlKis9PyZAfH4uOjw+XlxcXFxcXC9dKSg/Oi0tKD86KD89LilbXi0hIyQlKis9PyZAfH4uOjw+XlxcXFxcXC9dLip8JCl8XFx7LVtcXHNcXFNdKj8tXFx9KS9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2NoYXInOiB7XG5cdFx0cGF0dGVybjogLycoPzpbXlxcXFwnXXxcXFxcKD86W2FiZm5ydHZcXFxcXCInJl18XFxeW0EtWkBbXFxdXl9dfEFDS3xCRUx8QlN8Q0FOfENSfERDMXxEQzJ8REMzfERDNHxERUx8RExFfEVNfEVOUXxFT1R8RVNDfEVUQnxFVFh8RkZ8RlN8R1N8SFR8TEZ8TkFLfE5VTHxSU3xTSXxTT3xTT0h8U1B8U1RYfFNVQnxTWU58VVN8VlR8XFxkK3xvWzAtN10rfHhbMC05YS1mQS1GXSspKScvLFxuXHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlteXFxcXFwiXXxcXFxcKD86XFxTfFxccytcXFxcKSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzpjYXNlfGNsYXNzfGRhdGF8ZGVyaXZpbmd8ZG98ZWxzZXxpZnxpbnxpbmZpeGx8aW5maXhyfGluc3RhbmNlfGxldHxtb2R1bGV8bmV3dHlwZXxvZnxwcmltaXRpdmV8dGhlbnx0eXBlfHdoZXJlKVxcYi8sXG5cdCdpbXBvcnQtc3RhdGVtZW50Jzoge1xuXHRcdC8vIFRoZSBpbXBvcnRlZCBvciBoaWRkZW4gbmFtZXMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGlzIGltcG9ydFxuXHRcdC8vIHN0YXRlbWVudC4gVGhpcyBpcyBiZWNhdXNlIHdlIHdhbnQgdG8gaGlnaGxpZ2h0IHRob3NlIGV4YWN0bHkgbGlrZVxuXHRcdC8vIHdlIGRvIGZvciB0aGUgbmFtZXMgaW4gdGhlIHByb2dyYW0uXG5cdFx0cGF0dGVybjogLyheW1xcdCBdKilpbXBvcnRcXHMrKD86cXVhbGlmaWVkXFxzKyk/KD86W0EtWl1bXFx3J10qKSg/OlxcLltBLVpdW1xcdyddKikqKD86XFxzK2FzXFxzKyg/OltBLVpdW1xcdyddKikoPzpcXC5bQS1aXVtcXHcnXSopKik/KD86XFxzK2hpZGluZ1xcYik/L20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdrZXl3b3JkJzogL1xcYig/OmFzfGhpZGluZ3xpbXBvcnR8cXVhbGlmaWVkKVxcYi8sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdH1cblx0fSxcblx0Ly8gVGhlc2UgYXJlIGJ1aWx0aW4gdmFyaWFibGVzIG9ubHkuIENvbnN0cnVjdG9ycyBhcmUgaGlnaGxpZ2h0ZWQgbGF0ZXIgYXMgYSBjb25zdGFudC5cblx0J2J1aWx0aW4nOiAvXFxiKD86YWJzfGFjb3N8YWNvc2h8YWxsfGFuZHxhbnl8YXBwZW5kRmlsZXxhcHByb3hSYXRpb25hbHxhc1R5cGVPZnxhc2lufGFzaW5ofGF0YW58YXRhbjJ8YXRhbmh8YmFzaWNJT1J1bnxicmVha3xjYXRjaHxjZWlsaW5nfGNocnxjb21wYXJlfGNvbmNhdHxjb25jYXRNYXB8Y29uc3R8Y29zfGNvc2h8Y3Vycnl8Y3ljbGV8ZGVjb2RlRmxvYXR8ZGVub21pbmF0b3J8ZGlnaXRUb0ludHxkaXZ8ZGl2TW9kfGRyb3B8ZHJvcFdoaWxlfGVpdGhlcnxlbGVtfGVuY29kZUZsb2F0fGVudW1Gcm9tfGVudW1Gcm9tVGhlbnxlbnVtRnJvbVRoZW5Ub3xlbnVtRnJvbVRvfGVycm9yfGV2ZW58ZXhwfGV4cG9uZW50fGZhaWx8ZmlsdGVyfGZsaXB8ZmxvYXREaWdpdHN8ZmxvYXRSYWRpeHxmbG9hdFJhbmdlfGZsb29yfGZtYXB8Zm9sZGx8Zm9sZGwxfGZvbGRyfGZvbGRyMXxmcm9tRG91YmxlfGZyb21FbnVtfGZyb21JbnR8ZnJvbUludGVnZXJ8ZnJvbUludGVncmFsfGZyb21SYXRpb25hbHxmc3R8Z2NkfGdldENoYXJ8Z2V0Q29udGVudHN8Z2V0TGluZXxncm91cHxoZWFkfGlkfGluUmFuZ2V8aW5kZXh8aW5pdHxpbnRUb0RpZ2l0fGludGVyYWN0fGlvRXJyb3J8aXNBbHBoYXxpc0FscGhhTnVtfGlzQXNjaWl8aXNDb250cm9sfGlzRGVub3JtYWxpemVkfGlzRGlnaXR8aXNIZXhEaWdpdHxpc0lFRUV8aXNJbmZpbml0ZXxpc0xvd2VyfGlzTmFOfGlzTmVnYXRpdmVaZXJvfGlzT2N0RGlnaXR8aXNQcmludHxpc1NwYWNlfGlzVXBwZXJ8aXRlcmF0ZXxsYXN0fGxjbXxsZW5ndGh8bGV4fGxleERpZ2l0c3xsZXhMaXRDaGFyfGxpbmVzfGxvZ3xsb2dCYXNlfGxvb2t1cHxtYXB8bWFwTXxtYXBNX3xtYXh8bWF4Qm91bmR8bWF4aW11bXxtYXliZXxtaW58bWluQm91bmR8bWluaW11bXxtb2R8bmVnYXRlfG5vdHxub3RFbGVtfG51bGx8bnVtZXJhdG9yfG9kZHxvcnxvcmR8b3RoZXJ3aXNlfHBhY2t8cGl8cHJlZHxwcmltRXhpdFdpdGh8cHJpbnR8cHJvZHVjdHxwcm9wZXJGcmFjdGlvbnxwdXRDaGFyfHB1dFN0cnxwdXRTdHJMbnxxdW90fHF1b3RSZW18cmFuZ2V8cmFuZ2VTaXplfHJlYWR8cmVhZERlY3xyZWFkRmlsZXxyZWFkRmxvYXR8cmVhZEhleHxyZWFkSU98cmVhZEludHxyZWFkTGlzdHxyZWFkTGl0Q2hhcnxyZWFkTG58cmVhZE9jdHxyZWFkUGFyZW58cmVhZFNpZ25lZHxyZWFkc3xyZWFkc1ByZWN8cmVhbFRvRnJhY3xyZWNpcHxyZW18cmVwZWF0fHJlcGxpY2F0ZXxyZXR1cm58cmV2ZXJzZXxyb3VuZHxzY2FsZUZsb2F0fHNjYW5sfHNjYW5sMXxzY2FucnxzY2FucjF8c2VxfHNlcXVlbmNlfHNlcXVlbmNlX3xzaG93fHNob3dDaGFyfHNob3dJbnR8c2hvd0xpc3R8c2hvd0xpdENoYXJ8c2hvd1BhcmVufHNob3dTaWduZWR8c2hvd1N0cmluZ3xzaG93c3xzaG93c1ByZWN8c2lnbmlmaWNhbmR8c2lnbnVtfHNpbnxzaW5ofHNuZHxzb3J0fHNwYW58c3BsaXRBdHxzcXJ0fHN1YnRyYWN0fHN1Y2N8c3VtfHRhaWx8dGFrZXx0YWtlV2hpbGV8dGFufHRhbmh8dGhyZWFkVG9JT1Jlc3VsdHx0b0VudW18dG9JbnR8dG9JbnRlZ2VyfHRvTG93ZXJ8dG9SYXRpb25hbHx0b1VwcGVyfHRydW5jYXRlfHVuY3Vycnl8dW5kZWZpbmVkfHVubGluZXN8dW50aWx8dW53b3Jkc3x1bnppcHx1bnppcDN8dXNlckVycm9yfHdvcmRzfHdyaXRlRmlsZXx6aXB8emlwM3x6aXBXaXRofHppcFdpdGgzKVxcYi8sXG5cdC8vIGRlY2ltYWwgaW50ZWdlcnMgYW5kIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgfCBvY3RhbCBpbnRlZ2VycyB8IGhleGFkZWNpbWFsIGludGVnZXJzXG5cdCdudW1iZXInOiAvXFxiKD86XFxkKyg/OlxcLlxcZCspPyg/OmVbKy1dP1xcZCspP3wwb1swLTddK3wweFswLTlhLWZdKylcXGIvaSxcblx0J29wZXJhdG9yJzogW1xuXHRcdHtcblx0XHRcdC8vIGluZml4IG9wZXJhdG9yXG5cdFx0XHRwYXR0ZXJuOiAvYCg/OltBLVpdW1xcdyddKlxcLikqW19hLXpdW1xcdyddKmAvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHQvLyBmdW5jdGlvbiBjb21wb3NpdGlvblxuXHRcdFx0cGF0dGVybjogLyhcXHMpXFwuKD89XFxzKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQvLyBNb3N0IG9mIHRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugb2YgdGhlIG1lYW5pbmcgb2YgYSBzaW5nbGUgJy4nLlxuXHRcdC8vIElmIGl0IHN0YW5kcyBhbG9uZSBmcmVlbHksIGl0IGlzIHRoZSBmdW5jdGlvbiBjb21wb3NpdGlvbi5cblx0XHQvLyBJdCBtYXkgYWxzbyBiZSBhIHNlcGFyYXRvciBiZXR3ZWVuIGEgbW9kdWxlIG5hbWUgYW5kIGFuIGlkZW50aWZpZXIgPT4gbm9cblx0XHQvLyBvcGVyYXRvci4gSWYgaXQgY29tZXMgdG9nZXRoZXIgd2l0aCBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMgaXQgaXMgYW5cblx0XHQvLyBvcGVyYXRvciB0b28uXG5cdFx0Ly9cblx0XHQvLyBUaGlzIHJlZ2V4IG1lYW5zOiAvWy0hIyQlKis9PyZAfH4uOjw+XlxcXFxcXC9dKy8gd2l0aG91dCAvXFwuLy5cblx0XHQvWy0hIyQlKis9PyZAfH46PD5eXFxcXFxcL11bLSEjJCUqKz0/JkB8fi46PD5eXFxcXFxcL10qfFxcLlstISMkJSorPT8mQHx+Ljo8Pl5cXFxcXFwvXSsvLFxuXHRdLFxuXHQvLyBJbiBIYXNrZWxsLCBuZWFybHkgZXZlcnl0aGluZyBpcyBhIHZhcmlhYmxlLCBkbyBub3QgaGlnaGxpZ2h0IHRoZXNlLlxuXHQnaHZhcmlhYmxlJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzpbQS1aXVtcXHcnXSpcXC4pKltfYS16XVtcXHcnXSovLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHR9XG5cdH0sXG5cdCdjb25zdGFudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86W0EtWl1bXFx3J10qXFwuKSpbQS1aXVtcXHcnXSovLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHR9XG5cdH0sXG5cdCdwdW5jdHVhdGlvbic6IC9be31bXFxdOygpLC46XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5ocyA9IFByaXNtLmxhbmd1YWdlcy5oYXNrZWxsO1xuXG5QcmlzbS5sYW5ndWFnZXMuaGF4ZSA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHQnc3RyaW5nJzoge1xuXHRcdC8vIFN0cmluZ3MgY2FuIGJlIG11bHRpLWxpbmVcblx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXFxcXF18XFxcXFtcXHNcXFNdKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjbGFzcy1uYW1lJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXFxiKD86YWJzdHJhY3R8Y2xhc3N8ZW51bXxleHRlbmRzfGltcGxlbWVudHN8aW50ZXJmYWNlfG5ld3x0eXBlZGVmKVxccyspW0EtWl9dXFx3Ki8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdH0sXG5cdFx0Ly8gYmFzZWQgb24gbmFtaW5nIGNvbnZlbnRpb25cblx0XHQvXFxiW0EtWl1cXHcqL1xuXHRdLFxuXHQvLyBUaGUgZmluYWwgbG9vay1haGVhZCBwcmV2ZW50cyBoaWdobGlnaHRpbmcgb2Yga2V5d29yZHMgaWYgZXhwcmVzc2lvbnMgc3VjaCBhcyBcImhheGUubWFjcm8uRXhwclwiXG5cdCdrZXl3b3JkJzogL1xcYnRoaXNcXGJ8XFxiKD86YWJzdHJhY3R8YXN8YnJlYWt8Y2FzZXxjYXN0fGNhdGNofGNsYXNzfGNvbnRpbnVlfGRlZmF1bHR8ZG98ZHluYW1pY3xlbHNlfGVudW18ZXh0ZW5kc3xleHRlcm58ZmluYWx8Zm9yfGZyb218ZnVuY3Rpb258aWZ8aW1wbGVtZW50c3xpbXBvcnR8aW58aW5saW5lfGludGVyZmFjZXxtYWNyb3xuZXd8bnVsbHxvcGVyYXRvcnxvdmVybG9hZHxvdmVycmlkZXxwYWNrYWdlfHByaXZhdGV8cHVibGljfHJldHVybnxzdGF0aWN8c3VwZXJ8c3dpdGNofHRocm93fHRvfHRyeXx0eXBlZGVmfHVudHlwZWR8dXNpbmd8dmFyfHdoaWxlKSg/IVxcLilcXGIvLFxuXHQnZnVuY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogL1xcYlthLXpfXVxcdyooPz1cXHMqKD86PFtePD5dKj5cXHMqKT9cXCgpL2ksXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdvcGVyYXRvcic6IC9cXC57M318XFwrXFwrfC0tfCYmfFxcfFxcfHwtPnw9PnwoPzo8PD98PnsxLDN9fFstKyovJSE9JnxeXSk9P3xbPzp+XS9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdoYXhlJywgJ3N0cmluZycsIHtcblx0J3N0cmluZy1pbnRlcnBvbGF0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8nKD86W14nXFxcXF18XFxcXFtcXHNcXFNdKSonLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pXFwkKD86XFx3K3xcXHtbXnt9XStcXH0pLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2ludGVycG9sYXRpb24tcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcJFxcez98XFx9JC8sXG5cdFx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmhheGVcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0fVxuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnaGF4ZScsICdjbGFzcy1uYW1lJywge1xuXHQncmVnZXgnOiB7XG5cdFx0cGF0dGVybjogL35cXC8oPzpbXlxcL1xcXFxcXHJcXG5dfFxcXFwuKStcXC9bYS16XSovLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdyZWdleC1mbGFncyc6IC9cXGJbYS16XSskLyxcblx0XHRcdCdyZWdleC1zb3VyY2UnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eKH5cXC8pW1xcc1xcU10rKD89XFwvJCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ2xhbmd1YWdlLXJlZ2V4Jyxcblx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMucmVnZXhcblx0XHRcdH0sXG5cdFx0XHQncmVnZXgtZGVsaW1pdGVyJzogL15+XFwvfFxcLyQvLFxuXHRcdH1cblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2hheGUnLCAna2V5d29yZCcsIHtcblx0J3ByZXByb2Nlc3Nvcic6IHtcblx0XHRwYXR0ZXJuOiAvIyg/OmVsc2V8ZWxzZWlmfGVuZHxpZilcXGIuKi8sXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblx0J21ldGFkYXRhJzoge1xuXHRcdHBhdHRlcm46IC9AOj9bXFx3Ll0rLyxcblx0XHRhbGlhczogJ3N5bWJvbCdcblx0fSxcblx0J3JlaWZpY2F0aW9uJzoge1xuXHRcdHBhdHRlcm46IC9cXCQoPzpcXHcrfCg/PVxceykpLyxcblx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5oY2wgPSB7XG5cdCdjb21tZW50JzogLyg/OlxcL1xcL3wjKS4qfFxcL1xcKltcXHNcXFNdKj8oPzpcXCpcXC98JCkvLFxuXHQnaGVyZWRvYyc6IHtcblx0XHRwYXR0ZXJuOiAvPDwtPyhcXHcrXFxiKVtcXHNcXFNdKj9eWyBcXHRdKlxcMS9tLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ3N0cmluZydcblx0fSxcblx0J2tleXdvcmQnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyg/OmRhdGF8cmVzb3VyY2UpXFxzKyg/OlwiKD86XFxcXFtcXHNcXFNdfFteXFxcXFwiXSkqXCIpKD89XFxzK1wiW1xcdy1dK1wiXFxzK1xceykvaSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQndHlwZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKHJlc291cmNlfGRhdGF8XFxzKykoPzpcIig/OlxcXFxbXFxzXFxTXXxbXlxcXFxcIl0pKlwiKS9pLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyg/OmJhY2tlbmR8bW9kdWxlfG91dHB1dHxwcm92aWRlcnxwcm92aXNpb25lcnx2YXJpYWJsZSlcXHMrKD86W1xcdy1dK3xcIig/OlxcXFxbXFxzXFxTXXxbXlxcXFxcIl0pKlwiKVxccysoPz1cXHspL2ksXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3R5cGUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhiYWNrZW5kfG1vZHVsZXxvdXRwdXR8cHJvdmlkZXJ8cHJvdmlzaW9uZXJ8dmFyaWFibGUpXFxzKyg/OltcXHctXSt8XCIoPzpcXFxcW1xcc1xcU118W15cXFxcXCJdKSpcIilcXHMrL2ksXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvW1xcdy1dKyg/PVxccytcXHspL1xuXHRdLFxuXHQncHJvcGVydHknOiBbXG5cdFx0L1stXFx3XFwuXSsoPz1cXHMqPSg/IT0pKS8sXG5cdFx0L1wiKD86XFxcXFtcXHNcXFNdfFteXFxcXFwiXSkrXCIoPz1cXHMqWzo9XSkvLFxuXHRdLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlteXFxcXCRcIl18XFxcXFtcXHNcXFNdfFxcJCg/Oig/PVwiKXxcXCQrKD8hXFwkKXxbXlwiJHtdKXxcXCRcXHsoPzpbXnt9XCJdfFwiKD86W15cXFxcXCJdfFxcXFxbXFxzXFxTXSkqXCIpKlxcfSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W14kXSlcXCRcXHsoPzpbXnt9XCJdfFwiKD86W15cXFxcXCJdfFxcXFxbXFxzXFxTXSkqXCIpKlxcfS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCd0eXBlJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogLyhcXGIoPzpjb3VudHxkYXRhfGxvY2FsfG1vZHVsZXxwYXRofHNlbGZ8dGVycmFmb3JtfHZhcilcXGJcXC4pW1xcd1xcKl0rL2ksXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdrZXl3b3JkJzogL1xcYig/OmNvdW50fGRhdGF8bG9jYWx8bW9kdWxlfHBhdGh8c2VsZnx0ZXJyYWZvcm18dmFyKVxcYi9pLFxuXHRcdFx0XHRcdCdmdW5jdGlvbic6IC9cXHcrKD89XFwoKS8sXG5cdFx0XHRcdFx0J3N0cmluZyc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9cIig/OlxcXFxbXFxzXFxTXXxbXlxcXFxcIl0pKlwiLyxcblx0XHRcdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdudW1iZXInOiAvXFxiMHhbXFxkYS1mXStcXGJ8XFxiXFxkKyg/OlxcLlxcZCopPyg/OmVbKy1dP1xcZCspPy9pLFxuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bIVxcJCMlJicoKSorLC5cXC87PD0+QFxcW1xcXFxcXF1eYHt8fX4/Ol0vLFxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdH1cblx0fSxcblx0J251bWJlcic6IC9cXGIweFtcXGRhLWZdK1xcYnxcXGJcXGQrKD86XFwuXFxkKik/KD86ZVsrLV0/XFxkKyk/L2ksXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiL2ksXG5cdCdwdW5jdHVhdGlvbic6IC9bPVxcW1xcXXt9XS8sXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuaGxzbCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2MnLCB7XG5cblx0Ly8gUmVnYXJkaW5nIGtleXdvcmRzIGFuZCBjbGFzcyBuYW1lczpcblx0Ly8gVGhlIGxpc3Qgb2YgYWxsIGtleXdvcmRzIHdhcyBzcGxpdCBpbnRvICdrZXl3b3JkJyBhbmQgJ2NsYXNzLW5hbWUnIHRva2VucyBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgYXJlIGNhcGl0YWxpemVkLlxuXHQvLyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy93aW5kb3dzL3dpbjMyL2RpcmVjdDNkaGxzbC9keC1ncmFwaGljcy1obHNsLWFwcGVuZGl4LWtleXdvcmRzXG5cdC8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3dpbmRvd3Mvd2luMzIvZGlyZWN0M2RobHNsL2R4LWdyYXBoaWNzLWhsc2wtYXBwZW5kaXgtcmVzZXJ2ZWQtd29yZHNcblx0J2NsYXNzLW5hbWUnOiBbXG5cdFx0UHJpc20ubGFuZ3VhZ2VzLmNbJ2NsYXNzLW5hbWUnXSxcblx0XHQvXFxiKD86QXBwZW5kU3RydWN0dXJlZEJ1ZmZlcnxCbGVuZFN0YXRlfEJ1ZmZlcnxCeXRlQWRkcmVzc0J1ZmZlcnxDb21waWxlU2hhZGVyfENvbXB1dGVTaGFkZXJ8Q29uc3VtZVN0cnVjdHVyZWRCdWZmZXJ8RGVwdGhTdGVuY2lsU3RhdGV8RGVwdGhTdGVuY2lsVmlld3xEb21haW5TaGFkZXJ8R2VvbWV0cnlTaGFkZXJ8SHVsbHNoYWRlcnxJbnB1dFBhdGNofExpbmVTdHJlYW18T3V0cHV0UGF0Y2h8UGl4ZWxTaGFkZXJ8UG9pbnRTdHJlYW18UldCdWZmZXJ8UldCeXRlQWRkcmVzc0J1ZmZlcnxSV1N0cnVjdHVyZWRCdWZmZXJ8UldUZXh0dXJlKD86MUR8MURBcnJheXwyRHwyREFycmF5fDNEKXxSYXN0ZXJpemVyU3RhdGV8UmVuZGVyVGFyZ2V0Vmlld3xTYW1wbGVyQ29tcGFyaXNvblN0YXRlfFNhbXBsZXJTdGF0ZXxTdHJ1Y3R1cmVkQnVmZmVyfFRleHR1cmUoPzoxRHwxREFycmF5fDJEfDJEQXJyYXl8MkRNU3wyRE1TQXJyYXl8M0R8Q3ViZXxDdWJlQXJyYXkpfFRyaWFuZ2xlU3RyZWFtfFZlcnRleFNoYWRlcilcXGIvXG5cdF0sXG5cdCdrZXl3b3JkJzogW1xuXHRcdC8vIEhMU0wga2V5d29yZFxuXHRcdC9cXGIoPzphc218YXNtX2ZyYWdtZW50fGF1dG98YnJlYWt8Y2FzZXxjYXRjaHxjYnVmZmVyfGNlbnRyb2lkfGNoYXJ8Y2xhc3N8Y29sdW1uX21ham9yfGNvbXBpbGV8Y29tcGlsZV9mcmFnbWVudHxjb25zdHxjb25zdF9jYXN0fGNvbnRpbnVlfGRlZmF1bHR8ZGVsZXRlfGRpc2NhcmR8ZG98ZHluYW1pY19jYXN0fGVsc2V8ZW51bXxleHBsaWNpdHxleHBvcnR8ZXh0ZXJufGZvcnxmcmllbmR8Znhncm91cHxnb3RvfGdyb3Vwc2hhcmVkfGlmfGlufGlubGluZXxpbm91dHxpbnRlcmZhY2V8bGluZXxsaW5lYWRqfGxpbmVhcnxsb25nfG1hdHJpeHxtdXRhYmxlfG5hbWVzcGFjZXxuZXd8bm9pbnRlcnBvbGF0aW9ufG5vcGVyc3BlY3RpdmV8b3BlcmF0b3J8b3V0fHBhY2tvZmZzZXR8cGFzc3xwaXhlbGZyYWdtZW50fHBvaW50fHByZWNpc2V8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlZ2lzdGVyfHJlaW50ZXJwcmV0X2Nhc3R8cmV0dXJufHJvd19tYWpvcnxzYW1wbGV8c2FtcGxlcnxzaGFyZWR8c2hvcnR8c2lnbmVkfHNpemVvZnxzbm9ybXxzdGF0ZWJsb2NrfHN0YXRlYmxvY2tfc3RhdGV8c3RhdGljfHN0YXRpY19jYXN0fHN0cmluZ3xzdHJ1Y3R8c3dpdGNofHRidWZmZXJ8dGVjaG5pcXVlfHRlY2huaXF1ZTEwfHRlY2huaXF1ZTExfHRlbXBsYXRlfHRleHR1cmV8dGhpc3x0aHJvd3x0cmlhbmdsZXx0cmlhbmdsZWFkanx0cnl8dHlwZWRlZnx0eXBlbmFtZXx1bmlmb3JtfHVuaW9ufHVub3JtfHVuc2lnbmVkfHVzaW5nfHZlY3Rvcnx2ZXJ0ZXhmcmFnbWVudHx2aXJ0dWFsfHZvaWR8dm9sYXRpbGV8d2hpbGUpXFxiLyxcblx0XHQvLyBzY2FsYXIsIHZlY3RvciwgYW5kIG1hdHJpeCB0eXBlc1xuXHRcdC9cXGIoPzpib29sfGRvdWJsZXxkd29yZHxmbG9hdHxoYWxmfGludHxtaW4oPzoxMGZsb2F0fDEyaW50fDE2KD86ZmxvYXR8aW50fHVpbnQpKXx1aW50KSg/OlsxLTRdKD86eFsxLTRdKT8pP1xcYi9cblx0XSxcblx0Ly8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG93cy93aW4zMi9kaXJlY3QzZGhsc2wvZHgtZ3JhcGhpY3MtaGxzbC1hcHBlbmRpeC1ncmFtbWFyI2Zsb2F0aW5nLXBvaW50LW51bWJlcnNcblx0J251bWJlcic6IC8oPzooPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86W2VFXVsrLV0/XFxkKyk/fFxcYjB4W1xcZGEtZkEtRl0rKVtmRmhIbEx1VV0/XFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmhvb24gPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC86Oi4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCJbXlwiXSpcInwnW14nXSonLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NvbnN0YW50JzogLyUoPzpcXC5bbnldfFtcXHctXSspLyxcblx0J2NsYXNzLW5hbWUnOiAvQCg/OlthLXowLTktXSpbYS16MC05XSk/fFxcKi9pLFxuXHQnZnVuY3Rpb24nOiAvKD86XFwrWy0rXSB7Mn0pPyg/OlthLXpdKD86W2EtejAtOS1dKlthLXowLTldKT8pLyxcblx0J2tleXdvcmQnOiAvXFwuW1xcXlxcK1xcKj1cXD9dfCFbPjw6XFwuPVxcPyFdfD1bPnw6LFxcLlxcLVxcXjwrOy9+XFwqXFw/XXxcXD9bPnw6XFwuXFwtXFxePFxcKyZ+PUAhXXxcXHxbXFwkXyU6XFwuXFwtXFxeflxcKj1AXFw/XXxcXCtbfFxcJFxcK1xcKl18OltfXFwtXFxeXFwrflxcKl18JVtfOlxcLlxcLVxcXlxcK35cXCo9XXxcXF5bfDpcXC5cXC1cXCsmflxcKj1cXD9dfFxcJFt8XyU6PD5cXC1cXF4mfkA9XFw/XXw7Wzo8XFwrO1xcL35cXCo9XXx+Wz58XFwkXyU8XFwrXFwvJj1cXD8hXXwtLXw9PS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcblx0ICogQHJldHVybnMge1JlZ0V4cH1cblx0ICovXG5cdGZ1bmN0aW9uIGhlYWRlclZhbHVlT2YobmFtZSkge1xuXHRcdHJldHVybiBSZWdFeHAoJyheKD86JyArIG5hbWUgKyAnKTpbIFxcdF0qKD8hWyBcXHRdKSlbXl0rJywgJ2knKTtcblx0fVxuXG5cdFByaXNtLmxhbmd1YWdlcy5odHRwID0ge1xuXHRcdCdyZXF1ZXN0LWxpbmUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXig/OkNPTk5FQ1R8REVMRVRFfEdFVHxIRUFEfE9QVElPTlN8UEFUQ0h8UE9TVHxQUkl8UFVUfFNFQVJDSHxUUkFDRSlcXHMoPzpodHRwcz86XFwvXFwvfFxcLylcXFMqXFxzSFRUUFxcL1tcXGQuXSsvbSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQvLyBIVFRQIE1ldGhvZFxuXHRcdFx0XHQnbWV0aG9kJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eW0EtWl0rXFxiLyxcblx0XHRcdFx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBSZXF1ZXN0IFRhcmdldCBlLmcuIGh0dHA6Ly9leGFtcGxlLmNvbSwgL3BhdGgvdG8vZmlsZVxuXHRcdFx0XHQncmVxdWVzdC10YXJnZXQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14oXFxzKSg/Omh0dHBzPzpcXC9cXC98XFwvKVxcUyooPz1cXHMpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAndXJsJyxcblx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy51cmlcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gSFRUUCBWZXJzaW9uXG5cdFx0XHRcdCdodHRwLXZlcnNpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14oXFxzKUhUVFBcXC9bXFxkLl0rLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAncHJvcGVydHknXG5cdFx0XHRcdH0sXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQncmVzcG9uc2Utc3RhdHVzJzoge1xuXHRcdFx0cGF0dGVybjogL15IVFRQXFwvW1xcZC5dKyBcXGQrIC4rL20sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0Ly8gSFRUUCBWZXJzaW9uXG5cdFx0XHRcdCdodHRwLXZlcnNpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15IVFRQXFwvW1xcZC5dKy8sXG5cdFx0XHRcdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gU3RhdHVzIENvZGVcblx0XHRcdFx0J3N0YXR1cy1jb2RlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eKFxccylcXGQrKD89XFxzKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ251bWJlcidcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gUmVhc29uIFBocmFzZVxuXHRcdFx0XHQncmVhc29uLXBocmFzZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXihcXHMpLisvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdzdHJpbmcnXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdoZWFkZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXltcXHctXSs6LisoPzooPzpcXHJcXG4/fFxcbilbIFxcdF0uKykqL20sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2hlYWRlci12YWx1ZSc6IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiBoZWFkZXJWYWx1ZU9mKC9Db250ZW50LVNlY3VyaXR5LVBvbGljeS8uc291cmNlKSxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRhbGlhczogWydjc3AnLCAnbGFuZ3VhZ2VzLWNzcCddLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuY3NwXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiBoZWFkZXJWYWx1ZU9mKC9QdWJsaWMtS2V5LVBpbnMoPzotUmVwb3J0LU9ubHkpPy8uc291cmNlKSxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRhbGlhczogWydocGtwJywgJ2xhbmd1YWdlcy1ocGtwJ10sXG5cdFx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5ocGtwXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiBoZWFkZXJWYWx1ZU9mKC9TdHJpY3QtVHJhbnNwb3J0LVNlY3VyaXR5Ly5zb3VyY2UpLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGFsaWFzOiBbJ2hzdHMnLCAnbGFuZ3VhZ2VzLWhzdHMnXSxcblx0XHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmhzdHNcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IGhlYWRlclZhbHVlT2YoL1teOl0rLy5zb3VyY2UpLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XSxcblx0XHRcdFx0J2hlYWRlci1uYW1lJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eW146XSsvLFxuXHRcdFx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL146L1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHQvLyBDcmVhdGUgYSBtYXBwaW5nIG9mIENvbnRlbnQtVHlwZSBoZWFkZXJzIHRvIGxhbmd1YWdlIGRlZmluaXRpb25zXG5cdHZhciBsYW5ncyA9IFByaXNtLmxhbmd1YWdlcztcblx0dmFyIGh0dHBMYW5ndWFnZXMgPSB7XG5cdFx0J2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnOiBsYW5ncy5qYXZhc2NyaXB0LFxuXHRcdCdhcHBsaWNhdGlvbi9qc29uJzogbGFuZ3MuanNvbiB8fCBsYW5ncy5qYXZhc2NyaXB0LFxuXHRcdCdhcHBsaWNhdGlvbi94bWwnOiBsYW5ncy54bWwsXG5cdFx0J3RleHQveG1sJzogbGFuZ3MueG1sLFxuXHRcdCd0ZXh0L2h0bWwnOiBsYW5ncy5odG1sLFxuXHRcdCd0ZXh0L2Nzcyc6IGxhbmdzLmNzcyxcblx0XHQndGV4dC9wbGFpbic6IGxhbmdzLnBsYWluXG5cdH07XG5cblx0Ly8gRGVjbGFyZSB3aGljaCB0eXBlcyBjYW4gYWxzbyBiZSBzdWZmaXhlc1xuXHR2YXIgc3VmZml4VHlwZXMgPSB7XG5cdFx0J2FwcGxpY2F0aW9uL2pzb24nOiB0cnVlLFxuXHRcdCdhcHBsaWNhdGlvbi94bWwnOiB0cnVlXG5cdH07XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBwYXR0ZXJuIGZvciB0aGUgZ2l2ZW4gY29udGVudCB0eXBlIHdoaWNoIG1hdGNoZXMgaXQgYW5kIGFueSB0eXBlIHdoaWNoIGhhcyBpdCBhcyBhIHN1ZmZpeC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRUeXBlXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdCAqL1xuXHRmdW5jdGlvbiBnZXRTdWZmaXhQYXR0ZXJuKGNvbnRlbnRUeXBlKSB7XG5cdFx0dmFyIHN1ZmZpeCA9IGNvbnRlbnRUeXBlLnJlcGxhY2UoL15bYS16XStcXC8vLCAnJyk7XG5cdFx0dmFyIHN1ZmZpeFBhdHRlcm4gPSAnXFxcXHcrLyg/OltcXFxcdy4tXStcXFxcKykrJyArIHN1ZmZpeCArICcoPyFbK1xcXFx3Li1dKSc7XG5cdFx0cmV0dXJuICcoPzonICsgY29udGVudFR5cGUgKyAnfCcgKyBzdWZmaXhQYXR0ZXJuICsgJyknO1xuXHR9XG5cblx0Ly8gSW5zZXJ0IGVhY2ggY29udGVudCB0eXBlIHBhcnNlciB0aGF0IGhhcyBpdHMgYXNzb2NpYXRlZCBsYW5ndWFnZVxuXHQvLyBjdXJyZW50bHkgbG9hZGVkLlxuXHR2YXIgb3B0aW9ucztcblx0Zm9yICh2YXIgY29udGVudFR5cGUgaW4gaHR0cExhbmd1YWdlcykge1xuXHRcdGlmIChodHRwTGFuZ3VhZ2VzW2NvbnRlbnRUeXBlXSkge1xuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0XHRcdHZhciBwYXR0ZXJuID0gc3VmZml4VHlwZXNbY29udGVudFR5cGVdID8gZ2V0U3VmZml4UGF0dGVybihjb250ZW50VHlwZSkgOiBjb250ZW50VHlwZTtcblx0XHRcdG9wdGlvbnNbY29udGVudFR5cGUucmVwbGFjZSgvXFwvL2csICctJyldID0ge1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHRcdFx0JygnICsgL2NvbnRlbnQtdHlwZTpcXHMqLy5zb3VyY2UgKyBwYXR0ZXJuICsgLyg/Oig/Olxcclxcbj98XFxuKVtcXHctXS4qKSooPzpcXHIoPzpcXG58KD8hXFxuKSl8XFxuKS8uc291cmNlICsgJyknICtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgbGl0dGxlIGludGVyZXN0aW5nOlxuXHRcdFx0XHRcdC8vIFRoZSBIVFRQIGZvcm1hdCBzcGVjIHJlcXVpcmVkIDEgZW1wdHkgbGluZSBiZWZvcmUgdGhlIGJvZHkgdG8gbWFrZSBldmVyeXRoaW5nIHVuYW1iaWd1b3VzLlxuXHRcdFx0XHRcdC8vIEhvd2V2ZXIsIHdoZW4gd3JpdGluZyBjb2RlIGJ5IGhhbmQgKGUuZy4gdG8gZGlzcGxheSBvbiBhIHdlYnNpdGUpIHBlb3BsZSBjYW4gZm9yZ2V0IGFib3V0IHRoaXMsXG5cdFx0XHRcdFx0Ly8gc28gd2Ugd2FudCB0byBiZSBsaWJlcmFsIGhlcmUuIFdlIHdpbGwgYWxsb3cgdGhlIGVtcHR5IGxpbmUgdG8gYmUgb21pdHRlZCBpZiB0aGUgZmlyc3QgbGluZSBvZlxuXHRcdFx0XHRcdC8vIHRoZSBib2R5IGRvZXMgbm90IHN0YXJ0IHdpdGggYSBbXFx3LV0gY2hhcmFjdGVyIChhcyBoZWFkZXJzIGRvKS5cblx0XHRcdFx0XHQvW14gXFx0XFx3LV1bXFxzXFxTXSovLnNvdXJjZSxcblx0XHRcdFx0XHQnaSdcblx0XHRcdFx0KSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBodHRwTGFuZ3VhZ2VzW2NvbnRlbnRUeXBlXVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblx0aWYgKG9wdGlvbnMpIHtcblx0XHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdodHRwJywgJ2hlYWRlcicsIG9wdGlvbnMpO1xuXHR9XG5cbn0oUHJpc20pKTtcblxuLyoqXG4gKiBPcmlnaW5hbCBieSBTY290dCBIZWxtZS5cbiAqXG4gKiBSZWZlcmVuY2U6IGh0dHBzOi8vc2NvdHRoZWxtZS5jby51ay9ocGtwLWNoZWF0LXNoZWV0L1xuICovXG5cblByaXNtLmxhbmd1YWdlcy5ocGtwID0ge1xuXHQnZGlyZWN0aXZlJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzppbmNsdWRlU3ViRG9tYWluc3xtYXgtYWdlfHBpbi1zaGEyNTZ8cHJlbG9hZHxyZXBvcnQtdG98cmVwb3J0LXVyaXxzdHJpY3QpKD89W1xcczs9XXwkKS9pLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cdCdvcGVyYXRvcic6IC89Lyxcblx0J3B1bmN0dWF0aW9uJzogLzsvXG59O1xuXG4vKipcbiAqIE9yaWdpbmFsIGJ5IFNjb3R0IEhlbG1lLlxuICpcbiAqIFJlZmVyZW5jZTogaHR0cHM6Ly9zY290dGhlbG1lLmNvLnVrL2hzdHMtY2hlYXQtc2hlZXQvXG4gKi9cblxuUHJpc20ubGFuZ3VhZ2VzLmhzdHMgPSB7XG5cdCdkaXJlY3RpdmUnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OmluY2x1ZGVTdWJEb21haW5zfG1heC1hZ2V8cHJlbG9hZCkoPz1bXFxzOz1dfCQpL2ksXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblx0J29wZXJhdG9yJzogLz0vLFxuXHQncHVuY3R1YXRpb24nOiAvOy9cbn07XG5cbi8vIGFjY29yZGluZyB0byB0aGUgb2ZmaWNhbCByZWZlcmVuY2UgKEVOKVxuLy8gaHR0cHM6Ly9pY2hpZ29qYW0ubmV0L0ljaGlnb0phbS1lbi5odG1sXG5QcmlzbS5sYW5ndWFnZXMuaWNoaWdvamFtID0ge1xuXHQnY29tbWVudCc6IC8oPzpcXEInfFJFTSkoPzpbXlxcblxccl0qKS9pLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlwiXCJ8WyEjJCUmJygpKixcXC86Ozw9Pj9eXFx3ICtcXC0uXSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnbnVtYmVyJzogL1xcQiNbMC05QS1GXSt8XFxCYFswMV0rfCg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzpFWystXT9cXGQrKT8vaSxcblx0J2tleXdvcmQnOiAvXFxiKD86QkVFUHxCUFN8Q0FTRXxDTEVBUnxDTEt8Q0xPfENMUHxDTFN8Q0xUfENMVnxDT05UfENPUFl8RUxTRXxFTkR8RklMRXxGSUxFU3xGT1J8R09TVUJ8R09UT3xHU0J8SUZ8SU5QVVR8S0JEfExFRHxMRVR8TElTVHxMT0FEfExPQ0FURXxMUlVOfE5FV3xORVhUfE9VVHxQTEFZfFBPS0V8UFJJTlR8UFdNfFJFTXxSRU5VTXxSRVNFVHxSRVRVUk58UklHSFR8UlROfFJVTnxTQVZFfFNDUk9MTHxTTEVFUHxTUk5EfFNURVB8U1RPUHxTVUJ8VEVNUE98VEhFTnxUT3xVQVJUfFZJREVPfFdBSVQpKD86XFwkfFxcYikvaSxcblx0J2Z1bmN0aW9uJzogL1xcYig/OkFCU3xBTkF8QVNDfEJJTnxCVE58REVDfEVORHxGUkVFfEhFTFB8SEVYfEkyQ1J8STJDV3xJTnxJTktFWXxMRU58TElORXxQRUVLfFJORHxTQ1J8U09VTkR8U1RSfFRJQ0t8VVNSfFZFUnxWUEVFS3xaRVIpKD86XFwkfFxcYikvaSxcblx0J2xhYmVsJzogLyg/OlxcQkBcXFMrKS8sXG5cdCdvcGVyYXRvcic6IC88Wz0+XT98Pj0/fFxcfFxcfHwmJnxbK1xcLSpcXC89fCZefiFdfFxcYig/OkFORHxOT1R8T1IpXFxiL2ksXG5cdCdwdW5jdHVhdGlvbic6IC9bXFxbLDs6KClcXF1dL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmljb24gPSB7XG5cdCdjb21tZW50JzogLyMuKi8sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhbXCInXSkoPzooPyFcXDEpW15cXFxcXFxyXFxuX118XFxcXC58Xyg/IVxcMSkoPzpcXHJcXG58W1xcc1xcU10pKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnbnVtYmVyJzogL1xcYig/OlxcZCtyW2EtelxcZF0rfFxcZCsoPzpcXC5cXGQrKT8oPzplWystXT9cXGQrKT8pXFxifFxcLlxcZCtcXGIvaSxcblx0J2J1aWx0aW4ta2V5d29yZCc6IHtcblx0XHRwYXR0ZXJuOiAvJig/OmFsbG9jYXRlZHxhc2NpaXxjbG9ja3xjb2xsZWN0aW9uc3xjc2V0fGN1cnJlbnR8ZGF0ZXxkYXRlbGluZXxkaWdpdHN8ZHVtcHxlfGVycm9yKD86bnVtYmVyfHRleHR8dmFsdWUpP3xlcnJvdXR8ZmFpbHxmZWF0dXJlc3xmaWxlfGhvc3R8aW5wdXR8bGNhc2V8bGV0dGVyc3xsZXZlbHxsaW5lfG1haW58bnVsbHxvdXRwdXR8cGhpfHBpfHBvc3xwcm9nbmFtZXxyYW5kb218cmVnaW9uc3xzb3VyY2V8c3RvcmFnZXxzdWJqZWN0fHRpbWV8dHJhY2V8dWNhc2V8dmVyc2lvbilcXGIvLFxuXHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdH0sXG5cdCdkaXJlY3RpdmUnOiB7XG5cdFx0cGF0dGVybjogL1xcJFxcdysvLFxuXHRcdGFsaWFzOiAnYnVpbHRpbidcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86YnJlYWt8Ynl8Y2FzZXxjcmVhdGV8ZGVmYXVsdHxkb3xlbHNlfGVuZHxldmVyeXxmYWlsfGdsb2JhbHxpZnxpbml0aWFsfGludm9jYWJsZXxsaW5rfGxvY2FsfG5leHR8bm90fG9mfHByb2NlZHVyZXxyZWNvcmR8cmVwZWF0fHJldHVybnxzdGF0aWN8c3VzcGVuZHx0aGVufHRvfHVudGlsfHdoaWxlKVxcYi8sXG5cdCdmdW5jdGlvbic6IC9cXGIoPyFcXGQpXFx3Kyg/PVxccypbKHtdfFxccyohXFxzKlxcWykvLFxuXHQnb3BlcmF0b3InOiAvWystXTooPyE9KXwoPzpbXFwvP0BeJSZdfFxcK1xcKz98LS0/fD09Pz0/fH49PT89P3xcXCpcXCo/fFxcfFxcfFxcfD98PCg/Oi0+P3w8Pz0/KXw+Pj89PykoPzo6PSk/fDooPzo9Oj8pP3xbIS5cXFxcfH5dLyxcblx0J3B1bmN0dWF0aW9uJzogL1tcXFtcXF0oKXt9LDtdL1xufTtcblxuLy8gaHR0cHM6Ly91bmljb2RlLW9yZy5naXRodWIuaW8vaWN1L3VzZXJndWlkZS9mb3JtYXRfcGFyc2UvbWVzc2FnZXMvXG4vLyBodHRwczovL3VuaWNvZGUtb3JnLmdpdGh1Yi5pby9pY3UtZG9jcy9hcGlkb2MvcmVsZWFzZWQvaWN1NGovY29tL2libS9pY3UvdGV4dC9NZXNzYWdlRm9ybWF0Lmh0bWxcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsZXZlbFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKi9cblx0ZnVuY3Rpb24gbmVzdGVkKHNvdXJjZSwgbGV2ZWwpIHtcblx0XHRpZiAobGV2ZWwgPD0gMCkge1xuXHRcdFx0cmV0dXJuIC9bXS8uc291cmNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gc291cmNlLnJlcGxhY2UoLzxTRUxGPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXN0ZWQoc291cmNlLCBsZXZlbCAtIDEpOyB9KTtcblx0XHR9XG5cdH1cblxuXHR2YXIgc3RyaW5nUGF0dGVybiA9IC8nW3t9Oj0sXSg/OlteJ118JycpKicoPyEnKS87XG5cblx0dmFyIGVzY2FwZSA9IHtcblx0XHRwYXR0ZXJuOiAvJycvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHR9O1xuXHR2YXIgc3RyaW5nID0ge1xuXHRcdHBhdHRlcm46IHN0cmluZ1BhdHRlcm4sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2VzY2FwZSc6IGVzY2FwZVxuXHRcdH1cblx0fTtcblxuXHR2YXIgYXJndW1lbnRTb3VyY2UgPSBuZXN0ZWQoXG5cdFx0L1xceyg/Oltee30nXXwnKD8hW3t9LCddKXwnJ3w8U1RSPnw8U0VMRj4pKlxcfS8uc291cmNlXG5cdFx0XHQucmVwbGFjZSgvPFNUUj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gc3RyaW5nUGF0dGVybi5zb3VyY2U7IH0pLFxuXHRcdDhcblx0KTtcblxuXHR2YXIgbmVzdGVkTWVzc2FnZSA9IHtcblx0XHRwYXR0ZXJuOiBSZWdFeHAoYXJndW1lbnRTb3VyY2UpLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J21lc3NhZ2UnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eKFxceylbXFxzXFxTXSsoPz1cXH0kKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdH0sXG5cdFx0XHQnbWVzc2FnZS1kZWxpbWl0ZXInOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8uLyxcblx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzWydpY3UtbWVzc2FnZS1mb3JtYXQnXSA9IHtcblx0XHQnYXJndW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoYXJndW1lbnRTb3VyY2UpLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdjb250ZW50Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eKFxceylbXFxzXFxTXSsoPz1cXH0kKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdhcmd1bWVudC1uYW1lJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXihcXHMqKVtee306PSxcXHNdKy8sXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQnY2hvaWNlLXN0eWxlJzoge1xuXHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3VuaWNvZGUtb3JnLmdpdGh1Yi5pby9pY3UtZG9jcy9hcGlkb2MvcmVsZWFzZWQvaWN1NGMvY2xhc3NpY3VfMV8xQ2hvaWNlRm9ybWF0Lmh0bWwjZGV0YWlsc1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXihcXHMqLFxccypjaG9pY2VcXHMqLFxccyopXFxTKD86W1xcc1xcU10qXFxTKT8vLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFx8Lyxcblx0XHRcdFx0XHRcdFx0XHQncmFuZ2UnOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXihcXHMqKVsrLV0/KD86XFxkKyg/OlxcLlxcZCopP3xcXHUyMjFlKVxccypbPCNcXHUyMjY0XS8sXG5cdFx0XHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCdvcGVyYXRvcic6IC9bPCNcXHUyMjY0XS8sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCdudW1iZXInOiAvXFxTKy9cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdHJlc3Q6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQncGx1cmFsLXN0eWxlJzoge1xuXHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3VuaWNvZGUtb3JnLmdpdGh1Yi5pby9pY3UtZG9jcy9hcGlkb2MvcmVsZWFzZWQvaWN1NGovY29tL2libS9pY3UvdGV4dC9QbHVyYWxGb3JtYXQuaHRtbCM6fjp0ZXh0PVBhdHRlcm5zJTIwYW5kJTIwVGhlaXIlMjBJbnRlcnByZXRhdGlvblxuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXihcXHMqLFxccyooPzpwbHVyYWx8c2VsZWN0b3JkaW5hbClcXHMqLFxccyopXFxTKD86W1xcc1xcU10qXFxTKT8vLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0XHQnb2Zmc2V0JzogL15vZmZzZXQ6XFxzKlxcZCsvLFxuXHRcdFx0XHRcdFx0XHRcdCduZXN0ZWQtbWVzc2FnZSc6IG5lc3RlZE1lc3NhZ2UsXG5cdFx0XHRcdFx0XHRcdFx0J3NlbGVjdG9yJzoge1xuXHRcdFx0XHRcdFx0XHRcdFx0cGF0dGVybjogLz1cXGQrfFtee306PSxcXHNdKy8sXG5cdFx0XHRcdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0J2tleXdvcmQnOiAvXig/OmZld3xtYW55fG9uZXxvdGhlcnx0d298emVybykkL1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdzZWxlY3Qtc3R5bGUnOiB7XG5cdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vdW5pY29kZS1vcmcuZ2l0aHViLmlvL2ljdS1kb2NzL2FwaWRvYy9yZWxlYXNlZC9pY3U0ai9jb20vaWJtL2ljdS90ZXh0L1NlbGVjdEZvcm1hdC5odG1sIzp+OnRleHQ9UGF0dGVybnMlMjBhbmQlMjBUaGVpciUyMEludGVycHJldGF0aW9uXG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9eKFxccyosXFxzKnNlbGVjdFxccyosXFxzKilcXFMoPzpbXFxzXFxTXSpcXFMpPy8sXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHRcdCduZXN0ZWQtbWVzc2FnZSc6IG5lc3RlZE1lc3NhZ2UsXG5cdFx0XHRcdFx0XHRcdFx0J3NlbGVjdG9yJzoge1xuXHRcdFx0XHRcdFx0XHRcdFx0cGF0dGVybjogL1tee306PSxcXHNdKy8sXG5cdFx0XHRcdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0J2tleXdvcmQnOiAvXm90aGVyJC9cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQna2V5d29yZCc6IC9cXGIoPzpjaG9pY2V8cGx1cmFsfHNlbGVjdHxzZWxlY3RvcmRpbmFsKVxcYi8sXG5cdFx0XHRcdFx0XHQnYXJnLXR5cGUnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9cXGIoPzpkYXRlfGR1cmF0aW9ufG51bWJlcnxvcmRpbmFsfHNwZWxsb3V0fHRpbWUpXFxiLyxcblx0XHRcdFx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdhcmctc2tlbGV0b24nOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8oLFxccyopOjpbXnt9Oj0sXFxzXSsvLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J2FyZy1zdHlsZSc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogLygsXFxzKikoPzpjdXJyZW5jeXxmdWxsfGludGVnZXJ8bG9uZ3xtZWRpdW18cGVyY2VudHxzaG9ydCkoPz1cXHMqJCkvLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J2FyZy1zdHlsZS10ZXh0Jzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyheXFxzKixcXHMqKD89XFxTKSkvLnNvdXJjZSArIG5lc3RlZCgvKD86W157fSddfCdbXiddKid8XFx7KD86PFNFTEY+KT9cXH0pKy8uc291cmNlLCA4KSArICckJyksXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC8sL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J2FyZ3VtZW50LWRlbGltaXRlcic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvLi8sXG5cdFx0XHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2VzY2FwZSc6IGVzY2FwZSxcblx0XHQnc3RyaW5nJzogc3RyaW5nXG5cdH07XG5cblx0bmVzdGVkTWVzc2FnZS5pbnNpZGUubWVzc2FnZS5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXNbJ2ljdS1tZXNzYWdlLWZvcm1hdCddO1xuXHRQcmlzbS5sYW5ndWFnZXNbJ2ljdS1tZXNzYWdlLWZvcm1hdCddLmFyZ3VtZW50Lmluc2lkZS5jb250ZW50Lmluc2lkZVsnY2hvaWNlLXN0eWxlJ10uaW5zaWRlLnJlc3QgPSBQcmlzbS5sYW5ndWFnZXNbJ2ljdS1tZXNzYWdlLWZvcm1hdCddO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5pZHJpcyA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2hhc2tlbGwnLCB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oPzooPzotLXxcXHxcXHxcXHwpLiokfFxcey1bXFxzXFxTXSo/LVxcfSkvbSxcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86VHlwZXxjYXNlfGNsYXNzfGNvZGF0YXxjb25zdHJ1Y3Rvcnxjb3JlY29yZHxkYXRhfGRvfGRzbHxlbHNlfGV4cG9ydHxpZnxpbXBsZW1lbnRhdGlvbnxpbXBsaWNpdHxpbXBvcnR8aW1wb3NzaWJsZXxpbnxpbmZpeHxpbmZpeGx8aW5maXhyfGluc3RhbmNlfGludGVyZmFjZXxsZXR8bW9kdWxlfG11dHVhbHxuYW1lc3BhY2V8b2Z8cGFyYW1ldGVyc3xwYXJ0aWFsfHBvc3R1bGF0ZXxwcml2YXRlfHByb29mfHB1YmxpY3xxdW90ZUdvYWx8cmVjb3JkfHJld3JpdGV8c3ludGF4fHRoZW58dG90YWx8dXNpbmd8d2hlcmV8d2l0aClcXGIvLFxuXHQnYnVpbHRpbic6IHVuZGVmaW5lZFxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2lkcmlzJywgJ2tleXdvcmQnLCB7XG5cdCdpbXBvcnQtc3RhdGVtZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXlxccyppbXBvcnRcXHMrKSg/OltBLVpdW1xcdyddKikoPzpcXC5bQS1aXVtcXHcnXSopKi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdH1cblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pZHIgPSBQcmlzbS5sYW5ndWFnZXMuaWRyaXM7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0UHJpc20ubGFuZ3VhZ2VzLmlnbm9yZSA9IHtcblx0XHQvLyBodHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0aWdub3JlXG5cdFx0J2NvbW1lbnQnOiAvXiMuKi9tLFxuXHRcdCdlbnRyeSc6IHtcblx0XHRcdHBhdHRlcm46IC9cXFMoPzouKig/Oig/OlxcXFwgKXxcXFMpKT8vLFxuXHRcdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdvcGVyYXRvcic6IC9eIXxcXCpcXCo/fFxcPy8sXG5cdFx0XHRcdCdyZWdleCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcXFtbXlxcW1xcXV0qXFxdLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC8vXG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5naXRpZ25vcmUgPSBQcmlzbS5sYW5ndWFnZXMuaWdub3JlO1xuXHRQcmlzbS5sYW5ndWFnZXMuaGdpZ25vcmUgPSBQcmlzbS5sYW5ndWFnZXMuaWdub3JlO1xuXHRQcmlzbS5sYW5ndWFnZXMubnBtaWdub3JlID0gUHJpc20ubGFuZ3VhZ2VzLmlnbm9yZTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5mb3JtNyA9IHtcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCJbXlwiXSpcIi8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnc3Vic3RpdHV0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxbW15cXFtcXF1dK1xcXS8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxbfFxcXS8sXG5cdFx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBTZWUgcmVzdCBiZWxvd1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxbW15cXFtcXF1dK1xcXS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCd0aXRsZSc6IHtcblx0XHRwYXR0ZXJuOiAvXlsgXFx0XSooPzpib29rfGNoYXB0ZXJ8cGFydCg/ISBvZil8c2VjdGlvbnx0YWJsZXx2b2x1bWUpXFxiLisvaW0sXG5cdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdH0sXG5cdCdudW1iZXInOiB7XG5cdFx0cGF0dGVybjogLyhefFteLV0pKD86XFxiXFxkKyg/OlxcLlxcZCspPyg/OlxcXlxcZCspPyg/Oig/IVxcZClcXHcrKT98XFxiKD86ZWlnaHR8ZWxldmVufGZpdmV8Zm91cnxuaW5lfG9uZXxzZXZlbnxzaXh8dGVufHRocmVlfHR3ZWx2ZXx0d28pKVxcYig/IS0pL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQndmVyYic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W14tXSlcXGIoPzphbnN3ZXJpbmd8YXBwbHlpbmcgdG98YXJlfGFza2luZ3xhdHRhY2tpbmd8YmUoPzppbmcpP3xidXJuaW5nfGJ1eWluZ3xjYWxsZWR8Y2Fycmllc3xjYXJyeSg/ISBvdXQpfGNhcnJ5aW5nfGNsaW1iaW5nfGNsb3Npbmd8Y29uY2VhbCg/OmluZ3xzKT98Y29uc3VsdGluZ3xjb250YWluKD86aW5nfHMpP3xjdXR0aW5nfGRyaW5raW5nfGRyb3BwaW5nfGVhdGluZ3xlbmNsb3MoPzplcz98aW5nKXxlbnRlcmluZ3xleGFtaW5pbmd8ZXhpdGluZ3xnZXR0aW5nfGdpdmluZ3xnb2luZ3xoYSg/OnN8dmV8dmluZyl8aG9sZCg/OmluZ3xzKT98aW1wbCg/Omllc3x5KXxpbmNvcnBvcmF0KD86ZXM/fGluZyl8aW5zZXJ0aW5nfGlzfGp1bXBpbmd8a2lzc2luZ3xsaXN0ZW5pbmd8bG9ja2luZ3xsb29raW5nfG1lYW4oPzppbmd8cyk/fG9wZW5pbmd8cHJvdmlkKD86ZXM/fGluZyl8cHVsbGluZ3xwdXNoaW5nfHB1dHRpbmd8cmVsYXQoPzplcz98aW5nKXxyZW1vdmluZ3xzZWFyY2hpbmd8c2VlKD86aW5nfHMpP3xzZXR0aW5nfHNob3dpbmd8c2luZ2luZ3xzbGVlcGluZ3xzbWVsbGluZ3xzcXVlZXppbmd8c3VwcG9ydCg/OmluZ3xzKT98c3dlYXJpbmd8c3dpdGNoaW5nfHRha2luZ3x0YXN0aW5nfHRlbGxpbmd8dGhpbmtpbmd8dGhyb3dpbmd8dG91Y2hpbmd8dHVybmluZ3x0eWluZ3x1bmxvY2soPzppbmd8cyk/fHZhcig/Omllc3x5fHlpbmcpfHdhaXRpbmd8d2FraW5nfHdhdmluZ3x3ZWFyKD86aW5nfHMpPylcXGIoPyEtKS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0fSxcblx0J2tleXdvcmQnOiB7XG5cdFx0cGF0dGVybjogLyhefFteLV0pXFxiKD86YWZ0ZXJ8YmVmb3JlfGNhcnJ5IG91dHxjaGVja3xjb250aW51ZSB0aGUgYWN0aW9ufGRlZmluaXRpb24oPz0gKjopfGRvIG5vdGhpbmd8ZWxzZXxlbmQgKD86aWZ8dGhlIHN0b3J5fHVubGVzcyl8ZXZlcnkgdHVybnxpZnxpbmNsdWRlfGluc3RlYWQoPzogb2YpP3xsZXR8bW92ZXxub3xub3d8b3RoZXJ3aXNlfHJlcGVhdHxyZXBvcnR8cmVzdW1lIHRoZSBzdG9yeXxydWxlIGZvcnxydW5uaW5nIHRocm91Z2h8c2F5KD86aW5nKT98c3RvcCB0aGUgYWN0aW9ufHRlc3R8dHJ5KD86aW5nKT98dW5kZXJzdGFuZHx1bmxlc3N8dXNlfHdoZW58d2hpbGV8eWVzKVxcYig/IS0pL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQncHJvcGVydHknOiB7XG5cdFx0cGF0dGVybjogLyhefFteLV0pXFxiKD86YWRqYWNlbnQoPyEgdG8pfGNhcnJpZWR8Y2xvc2VkfGNvbmNlYWxlZHxjb250YWluZWR8ZGFya3xkZXNjcmliZWR8ZWRpYmxlfGVtcHR5fGVuY2xvc2VkfGVudGVyYWJsZXxldmVufGZlbWFsZXxmaXhlZCBpbiBwbGFjZXxmdWxsfGhhbmRsZWR8aGVsZHxpbXByb3Blci1uYW1lZHxpbmNvcnBvcmF0ZWR8aW5lZGlibGV8aW52aXNpYmxlfGxpZ2h0ZWR8bGl0fGxvY2soPzphYmxlfGVkKXxtYWxlfG1hcmtlZCBmb3IgbGlzdGluZ3xtZW50aW9uZWR8bmVnYXRpdmV8bmV1dGVyfG5vbi0oPzplbXB0eXxmdWxsfHJlY3VycmluZyl8b2RkfG9wYXF1ZXxvcGVuKD86YWJsZSk/fHBsdXJhbC1uYW1lZHxwb3J0YWJsZXxwb3NpdGl2ZXxwcml2YXRlbHktbmFtZWR8cHJvcGVyLW5hbWVkfHByb3ZpZGVkfHB1YmxpY2FsbHktbmFtZWR8cHVzaGFibGUgYmV0d2VlbiByb29tc3xyZWN1cnJpbmd8cmVsYXRlZHxydWJiaW5nfHNjZW5lcnl8c2VlbnxzaW5ndWxhci1uYW1lZHxzdXBwb3J0ZWR8c3dpbmdpbmd8c3dpdGNoKD86YWJsZXxlZCg/OiBvZmZ8IG9uKT8pfHRvdWNoKD86YWJsZXxlZCl8dHJhbnNwYXJlbnR8dW5jb25jZWFsZWR8dW5kZXNjcmliZWR8dW5saXR8dW5sb2NrZWR8dW5tYXJrZWQgZm9yIGxpc3Rpbmd8dW5tZW50aW9uZWR8dW5vcGVuYWJsZXx1bnRvdWNoYWJsZXx1bnZpc2l0ZWR8dmFyaWFibGV8dmlzaWJsZXx2aXNpdGVkfHdlYXJhYmxlfHdvcm4pXFxiKD8hLSkvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHR9LFxuXHQncG9zaXRpb24nOiB7XG5cdFx0cGF0dGVybjogLyhefFteLV0pXFxiKD86YWJvdmV8YWRqYWNlbnQgdG98YmFjayBzaWRlIG9mfGJlbG93fGJldHdlZW58ZG93bnxlYXN0fGV2ZXJ5d2hlcmV8ZnJvbnQgc2lkZXxoZXJlfGlufGluc2lkZSg/OiBmcm9tKT98bm9ydGgoPzplYXN0fHdlc3QpP3xub3doZXJlfG9uKD86IHRvcCBvZik/fG90aGVyIHNpZGV8b3V0c2lkZSg/OiBmcm9tKT98cGFydHM/IG9mfHJlZ2lvbmFsbHkgaW58c291dGgoPzplYXN0fHdlc3QpP3x0aHJvdWdofHVwfHdlc3R8d2l0aGluKVxcYig/IS0pL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCd0eXBlJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXi1dKVxcYig/OmFjdGlvbnM/fGFjdGl2aXQoPzppZXN8eSl8YWN0b3JzP3xhbmltYWxzP3xiYWNrZHJvcHM/fGNvbnRhaW5lcnM/fGRldmljZXM/fGRpcmVjdGlvbnM/fGRvb3JzP3xob2xkZXJzP3xraW5kcz98bGlzdHM/fG1bYWVdbnxub2JvZHl8bm90aGluZ3xub3Vucz98bnVtYmVycz98b2JqZWN0cz98cGVvcGxlfHBlcnNvbnM/fHBsYXllcig/OidzIGhvbGRhbGwpP3xyZWdpb25zP3xyZWxhdGlvbnM/fHJvb21zP3xydWxlKD86Ym9vayk/cz98c2NlbmVzP3xzb21lb25lfHNvbWV0aGluZ3xzdXBwb3J0ZXJzP3x0YWJsZXM/fHRleHRzP3x0aGluZ3M/fHRpbWV8dmVoaWNsZXM/fHdvbVthZV1uKVxcYig/IS0pL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHR9LFxuXHQncHVuY3R1YXRpb24nOiAvWy4sOjsoKXt9XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5pbmZvcm03WydzdHJpbmcnXS5pbnNpZGVbJ3N1YnN0aXR1dGlvbiddLmluc2lkZS5yZXN0ID0gUHJpc20ubGFuZ3VhZ2VzLmluZm9ybTc7XG4vLyBXZSBkb24ndCB3YW50IHRoZSByZW1haW5pbmcgdGV4dCBpbiB0aGUgc3Vic3RpdHV0aW9uIHRvIGJlIGhpZ2hsaWdodGVkIGFzIHRoZSBzdHJpbmcuXG5QcmlzbS5sYW5ndWFnZXMuaW5mb3JtN1snc3RyaW5nJ10uaW5zaWRlWydzdWJzdGl0dXRpb24nXS5pbnNpZGUucmVzdC50ZXh0ID0ge1xuXHRwYXR0ZXJuOiAvXFxTKD86XFxzKlxcUykqLyxcblx0YWxpYXM6ICdjb21tZW50J1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluaSA9IHtcblxuXHQvKipcblx0ICogVGhlIGNvbXBvbmVudCBtaW1pY3MgdGhlIGJlaGF2aW9yIG9mIHRoZSBXaW4zMiBBUEkgcGFyc2VyLlxuXHQgKlxuXHQgKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vUHJpc21KUy9wcmlzbS9pc3N1ZXMvMjc3NSNpc3N1ZWNvbW1lbnQtNzg3NDc3NzIzfVxuXHQgKi9cblxuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bIFxcZlxcdFxcdl0qKVsjO11bXlxcblxccl0qL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnc2VjdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKF5bIFxcZlxcdFxcdl0qKVxcW1teXFxuXFxyXFxdXSpcXF0/L20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdzZWN0aW9uLW5hbWUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oXlxcW1sgXFxmXFx0XFx2XSopW14gXFxmXFx0XFx2XFxdXSsoPzpbIFxcZlxcdFxcdl0rW14gXFxmXFx0XFx2XFxdXSspKi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnc2VsZWN0b3InXG5cdFx0XHR9LFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcW3xcXF0vXG5cdFx0fVxuXHR9LFxuXHQna2V5Jzoge1xuXHRcdHBhdHRlcm46IC8oXlsgXFxmXFx0XFx2XSopW14gXFxmXFxuXFxyXFx0XFx2PV0rKD86WyBcXGZcXHRcXHZdK1teIFxcZlxcblxcclxcdFxcdj1dKykqKD89WyBcXGZcXHRcXHZdKj0pL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2F0dHItbmFtZSdcblx0fSxcblx0J3ZhbHVlJzoge1xuXHRcdHBhdHRlcm46IC8oPVsgXFxmXFx0XFx2XSopW14gXFxmXFxuXFxyXFx0XFx2XSsoPzpbIFxcZlxcdFxcdl0rW14gXFxmXFxuXFxyXFx0XFx2XSspKi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2F0dHItdmFsdWUnLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2lubmVyLXZhbHVlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXihcInwnKS4rKD89XFwxJCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQncHVuY3R1YXRpb24nOiAvPS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5pbyA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pKD86XFwvXFwqW1xcc1xcU10qPyg/OlxcKlxcL3wkKXxcXC9cXC8uKnwjLiopLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQndHJpcGxlLXF1b3RlZC1zdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiXCJcIig/OlxcXFxbXFxzXFxTXXwoPyFcIlwiXCIpW15cXFxcXSkqXCJcIlwiLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdzdHJpbmcnXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86XFxcXC58W15cXFxcXFxyXFxuXCJdKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFjdGl2YXRlfGFjdGl2ZUNvcm9Db3VudHxhc1N0cmluZ3xibG9ja3xicmVha3xjYWxsfGNhdGNofGNsb25lfGNvbGxlY3RHYXJiYWdlfGNvbXBpbGVTdHJpbmd8Y29udGludWV8ZG98ZG9GaWxlfGRvTWVzc2FnZXxkb1N0cmluZ3xlbHNlfGVsc2VpZnxleGl0fGZvcnxmb3JlYWNofGZvcndhcmR8Z2V0RW52aXJvbm1lbnRWYXJpYWJsZXxnZXRTbG90fGhhc1Nsb3R8aWZ8aWZGYWxzZXxpZk5pbHxpZk5pbEV2YWx8aWZUcnVlfGlzQWN0aXZlfGlzTmlsfGlzUmVzdW1hYmxlfGxpc3R8bWVzc2FnZXxtZXRob2R8cGFyZW50fHBhc3N8cGF1c2V8cGVyZm9ybXxwZXJmb3JtV2l0aEFyZ0xpc3R8cHJpbnR8cHJpbnRsbnxwcm90b3xyYWlzZXxyYWlzZVJlc3VtYWJsZXxyZW1vdmVTbG90fHJlc2VuZHxyZXN1bWV8c2NoZWR1bGVyU2xlZXBTZWNvbmRzfHNlbGZ8c2VuZGVyfHNldFNjaGVkdWxlclNsZWVwU2Vjb25kc3xzZXRTbG90fHNoYWxsb3dDb3B5fHNsb3ROYW1lc3xzdXBlcnxzeXN0ZW18dGhlbnx0aGlzQmxvY2t8dGhpc0NvbnRleHR8dHJ5fHR5cGV8dW5pcXVlSWR8dXBkYXRlU2xvdHx3YWl0fHdoaWxlfHdyaXRlfHlpZWxkKVxcYi8sXG5cdCdidWlsdGluJzogL1xcYig/OkFycmF5fEF1ZGlvRGV2aWNlfEF1ZGlvTWl4ZXJ8QmlnTnVtfEJsb2NrfEJveHxCdWZmZXJ8Q0Z1bmN0aW9ufENHSXxDb2xvcnxDdXJzZXN8REJNfEROU1Jlc29sdmVyfERPQ29ubmVjdGlvbnxET1Byb3h5fERPU2VydmVyfERhdGV8RGlyZWN0b3J5fER1cmF0aW9ufER5bkxpYnxFcnJvcnxFeGNlcHRpb258RkZUfEZpbGV8Rm5tYXRjaHxGb250fEZ1dHVyZXxHTHxHTEV8R0xTY2lzc29yfEdMVXxHTFVDeWxpbmRlcnxHTFVRdWFkcmljfEdMVVNwaGVyZXxHTFVUfEhvc3R8SW1hZ2V8SW1wb3J0ZXJ8TGlua0xpc3R8TGlzdHxMb2JieXxMb2NhbHN8TUQ1fE1QM0RlY29kZXJ8TVAzRW5jb2RlcnxNYXB8TWVzc2FnZXxNb3ZpZXxOb3RpZmljYXRpb258TnVtYmVyfE9iamVjdHxPcGVuR0x8UG9pbnR8UHJvdG9zfFJhbmRvbXxSZWdleHxTR01MfFNHTUxFbGVtZW50fFNHTUxQYXJzZXJ8U1FMaXRlfFNlcXVlbmNlfFNlcnZlcnxTaG93TWVzc2FnZXxTbGVlcHlDYXR8U2xlZXB5Q2F0Q3Vyc29yfFNvY2tldHxTb2NrZXRNYW5hZ2VyfFNvdW5kfFNvdXB8U3RvcmV8U3RyaW5nfFRyZWV8VURQU2VuZGVyfFVQRFJlY2VpdmVyfFVSTHxVc2VyfFdhcm5pbmd8V2Vha0xpbmspXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8bmlsfHRydWUpXFxiLyxcblx0J251bWJlcic6IC9cXGIweFtcXGRhLWZdK1xcYnwoPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86ZS0/XFxkKyk/L2ksXG5cdCdvcGVyYXRvcic6IC9bPSEqLyUrXFwtXiZ8XT18Pj4/PT98PDw/PT98Oj86Pz18XFwrXFwrP3wtLT98XFwqXFwqP3xcXC9cXC8/fCV8XFx8XFx8P3wmJj98XFxiKD86YW5kfG5vdHxvcnxyZXR1cm4pXFxifEBAP3xcXD9cXD8/fFxcLlxcLi8sXG5cdCdwdW5jdHVhdGlvbic6IC9be31bXFxdOygpLC46XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5qID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiTkJcXC4uKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLycoPzonJ3xbXidcXHJcXG5dKSonLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86KD86Q1J8TEZ8YWR2ZXJifGNvbmp1bmN0aW9ufGRlZnxkZWZpbmV8ZHlhZHxtb25hZHxub3VufHZlcmIpXFxifCg/OmFzc2VydHxicmVha3xjYXNlfGNhdGNoW2R0XT98Y29udGludWV8ZG98ZWxzZXxlbHNlaWZ8ZW5kfGZjYXNlfGZvcnxmb3JfXFx3K3xnb3RvX1xcdyt8aWZ8bGFiZWxfXFx3K3xyZXR1cm58c2VsZWN0fHRocm93fHRyeXx3aGlsZXx3aGlsc3QpXFwuKS8sXG5cdCd2ZXJiJzoge1xuXHRcdC8vIE5lZ2F0aXZlIGxvb2stYWhlYWQgcHJldmVudHMgYmFkIGhpZ2hsaWdodGluZ1xuXHRcdC8vIG9mIF46IDsuID0uID06ICEuICE6XG5cdFx0cGF0dGVybjogLyg/IVxcXjp8O1xcLnxbPSFdWy46XSkoPzpcXHsoPzpcXC58Ojo/KT98cCg/OlxcLlxcLj98Oil8Wz0hXFxdXXxbPD4rKlxcLSUkfCwjXVsuOl0/fFs/Xl1cXC4/fFs7XFxbXTo/fFt+fVwiaV1bLjpdfFtBQ2VFSWpMb3JdXFwufCg/OltfXFwvXFxcXHFzdXhdfF8/XFxkKTopLyxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdudW1iZXInOiAvXFxiXz8oPzooPyFcXGQ6KVxcZCsoPzpcXC5cXGQrKT8oPzooPzphZHxhcnxbZWpweF0pXz9cXGQrKD86XFwuXFxkKyk/KSooPzpiXz9bXFxkYS16XSsoPzpcXC5bXFxkYS16XSspPyk/fF9cXGIoPyFcXC4pKS8sXG5cdCdhZHZlcmInOiB7XG5cdFx0cGF0dGVybjogL1t+fV18W1xcL1xcXFxdXFwuP3xbYmZNXVxcLnx0Wy46XS8sXG5cdFx0YWxpYXM6ICdidWlsdGluJ1xuXHR9LFxuXHQnb3BlcmF0b3InOiAvWz1hXVsuOl18X1xcLi8sXG5cdCdjb25qdW5jdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvJig/OlxcLjo/fDopP3xbLjpAXVsuOl0/fFshRF1bLjpdfFs7ZEhUXVxcLnxgOj98W1xcXkxTXTp8XCIvLFxuXHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdH0sXG5cdCdwdW5jdHVhdGlvbic6IC9bKCldL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBrZXl3b3JkcyA9IC9cXGIoPzphYnN0cmFjdHxhc3NlcnR8Ym9vbGVhbnxicmVha3xieXRlfGNhc2V8Y2F0Y2h8Y2hhcnxjbGFzc3xjb25zdHxjb250aW51ZXxkZWZhdWx0fGRvfGRvdWJsZXxlbHNlfGVudW18ZXhwb3J0c3xleHRlbmRzfGZpbmFsfGZpbmFsbHl8ZmxvYXR8Zm9yfGdvdG98aWZ8aW1wbGVtZW50c3xpbXBvcnR8aW5zdGFuY2VvZnxpbnR8aW50ZXJmYWNlfGxvbmd8bW9kdWxlfG5hdGl2ZXxuZXd8bm9uLXNlYWxlZHxudWxsfG9wZW58b3BlbnN8cGFja2FnZXxwZXJtaXRzfHByaXZhdGV8cHJvdGVjdGVkfHByb3ZpZGVzfHB1YmxpY3xyZWNvcmQoPyFcXHMqWygpe31bXFxdPD49JX4uOiw7PytcXC0qLyZ8Xl0pfHJlcXVpcmVzfHJldHVybnxzZWFsZWR8c2hvcnR8c3RhdGljfHN0cmljdGZwfHN1cGVyfHN3aXRjaHxzeW5jaHJvbml6ZWR8dGhpc3x0aHJvd3x0aHJvd3N8dG98dHJhbnNpZW50fHRyYW5zaXRpdmV8dHJ5fHVzZXN8dmFyfHZvaWR8dm9sYXRpbGV8d2hpbGV8d2l0aHx5aWVsZClcXGIvO1xuXG5cdC8vIGZ1bGwgcGFja2FnZSAob3B0aW9uYWwpICsgcGFyZW50IGNsYXNzZXMgKG9wdGlvbmFsKVxuXHR2YXIgY2xhc3NOYW1lUHJlZml4ID0gLyg/OlthLXpdXFx3KlxccypcXC5cXHMqKSooPzpbQS1aXVxcdypcXHMqXFwuXFxzKikqLy5zb3VyY2U7XG5cblx0Ly8gYmFzZWQgb24gdGhlIGphdmEgbmFtaW5nIGNvbnZlbnRpb25zXG5cdHZhciBjbGFzc05hbWUgPSB7XG5cdFx0cGF0dGVybjogUmVnRXhwKC8oXnxbXlxcdy5dKS8uc291cmNlICsgY2xhc3NOYW1lUHJlZml4ICsgL1tBLVpdKD86W1xcZF9BLVpdKlthLXpdXFx3Kik/XFxiLy5zb3VyY2UpLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnbmFtZXNwYWNlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXlthLXpdXFx3Kig/OlxccypcXC5cXHMqW2Etel1cXHcqKSooPzpcXHMqXFwuKT8vLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHR9XG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmphdmEgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pXCIoPzpcXFxcLnxbXlwiXFxcXFxcclxcbl0pKlwiLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdjbGFzcy1uYW1lJzogW1xuXHRcdFx0Y2xhc3NOYW1lLFxuXHRcdFx0e1xuXHRcdFx0XHQvLyB2YXJpYWJsZXMsIHBhcmFtZXRlcnMsIGFuZCBjb25zdHJ1Y3RvciByZWZlcmVuY2VzXG5cdFx0XHRcdC8vIHRoaXMgdG8gc3VwcG9ydCBjbGFzcyBuYW1lcyAob3IgZ2VuZXJpYyBwYXJhbWV0ZXJzKSB3aGljaCBkbyBub3QgY29udGFpbiBhIGxvd2VyIGNhc2UgbGV0dGVyIChhbHNvIHdvcmtzIGZvciBtZXRob2RzKVxuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhefFteXFx3Ll0pLy5zb3VyY2UgKyBjbGFzc05hbWVQcmVmaXggKyAvW0EtWl1cXHcqKD89XFxzK1xcdytcXHMqWzssPSgpXXxcXHMqKD86XFxbW1xccyxdKlxcXVxccyopPzo6XFxzKm5ld1xcYikvLnNvdXJjZSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogY2xhc3NOYW1lLmluc2lkZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gY2xhc3MgbmFtZXMgYmFzZWQgb24ga2V5d29yZFxuXHRcdFx0XHQvLyB0aGlzIHRvIHN1cHBvcnQgY2xhc3MgbmFtZXMgKG9yIGdlbmVyaWMgcGFyYW1ldGVycykgd2hpY2ggZG8gbm90IGNvbnRhaW4gYSBsb3dlciBjYXNlIGxldHRlciAoYWxzbyB3b3JrcyBmb3IgbWV0aG9kcylcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXFxiKD86Y2xhc3N8ZW51bXxleHRlbmRzfGltcGxlbWVudHN8aW5zdGFuY2VvZnxpbnRlcmZhY2V8bmV3fHJlY29yZHx0aHJvd3MpXFxzKykvLnNvdXJjZSArIGNsYXNzTmFtZVByZWZpeCArIC9bQS1aXVxcdypcXGIvLnNvdXJjZSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogY2xhc3NOYW1lLmluc2lkZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2tleXdvcmQnOiBrZXl3b3Jkcyxcblx0XHQnZnVuY3Rpb24nOiBbXG5cdFx0XHRQcmlzbS5sYW5ndWFnZXMuY2xpa2UuZnVuY3Rpb24sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oOjpcXHMqKVthLXpfXVxcdyovLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnbnVtYmVyJzogL1xcYjBiWzAxXVswMV9dKkw/XFxifFxcYjB4KD86XFwuW1xcZGEtZl9wKy1dK3xbXFxkYS1mX10rKD86XFwuW1xcZGEtZl9wKy1dKyk/KVxcYnwoPzpcXGJcXGRbXFxkX10qKD86XFwuW1xcZF9dKik/fFxcQlxcLlxcZFtcXGRfXSopKD86ZVsrLV0/XFxkW1xcZF9dKik/W2RmbF0/L2ksXG5cdFx0J29wZXJhdG9yJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteLl0pKD86PDw9P3w+Pj4/PT98LT58LS18XFwrXFwrfCYmfFxcfFxcfHw6OnxbPzp+XXxbLSsqLyUmfF4hPTw+XT0/KS9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnamF2YScsICdzdHJpbmcnLCB7XG5cdFx0J3RyaXBsZS1xdW90ZWQtc3RyaW5nJzoge1xuXHRcdFx0Ly8gaHR0cDovL29wZW5qZGsuamF2YS5uZXQvamVwcy8zNTUjRGVzY3JpcHRpb25cblx0XHRcdHBhdHRlcm46IC9cIlwiXCJbIFxcdF0qW1xcclxcbl0oPzooPzpcInxcIlwiKT8oPzpcXFxcLnxbXlwiXFxcXF0pKSpcIlwiXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdzdHJpbmcnXG5cdFx0fSxcblx0XHQnY2hhcic6IHtcblx0XHRcdHBhdHRlcm46IC8nKD86XFxcXC58W14nXFxcXFxcclxcbl0pezEsNn0nLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnamF2YScsICdjbGFzcy1uYW1lJywge1xuXHRcdCdhbm5vdGF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteLl0pQFxcdysoPzpcXHMqXFwuXFxzKlxcdyspKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXHRcdCdnZW5lcmljcyc6IHtcblx0XHRcdHBhdHRlcm46IC88KD86W1xcd1xccywuP118Jig/ISYpfDwoPzpbXFx3XFxzLC4/XXwmKD8hJil8PCg/OltcXHdcXHMsLj9dfCYoPyEmKXw8KD86W1xcd1xccywuP118Jig/ISYpKSo+KSo+KSo+KSo+Lyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnY2xhc3MtbmFtZSc6IGNsYXNzTmFtZSxcblx0XHRcdFx0J2tleXdvcmQnOiBrZXl3b3Jkcyxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1s8PigpLC46XS8sXG5cdFx0XHRcdCdvcGVyYXRvcic6IC9bPyZ8XS9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdpbXBvcnQnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKFxcYmltcG9ydFxccyspLy5zb3VyY2UgKyBjbGFzc05hbWVQcmVmaXggKyAvKD86W0EtWl1cXHcqfFxcKikoPz1cXHMqOykvLnNvdXJjZSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCduYW1lc3BhY2UnOiBjbGFzc05hbWUuaW5zaWRlLm5hbWVzcGFjZSxcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuLyxcblx0XHRcdFx0XHQnb3BlcmF0b3InOiAvXFwqLyxcblx0XHRcdFx0XHQnY2xhc3MtbmFtZSc6IC9cXHcrL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhcXGJpbXBvcnRcXHMrc3RhdGljXFxzKykvLnNvdXJjZSArIGNsYXNzTmFtZVByZWZpeCArIC8oPzpcXHcrfFxcKikoPz1cXHMqOykvLnNvdXJjZSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnc3RhdGljJyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J25hbWVzcGFjZSc6IGNsYXNzTmFtZS5pbnNpZGUubmFtZXNwYWNlLFxuXHRcdFx0XHRcdCdzdGF0aWMnOiAvXFxiXFx3KyQvLFxuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vLFxuXHRcdFx0XHRcdCdvcGVyYXRvcic6IC9cXCovLFxuXHRcdFx0XHRcdCdjbGFzcy1uYW1lJzogL1xcdysvXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXHRcdCduYW1lc3BhY2UnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHRcdC8oXFxiKD86ZXhwb3J0c3xpbXBvcnQoPzpcXHMrc3RhdGljKT98bW9kdWxlfG9wZW58b3BlbnN8cGFja2FnZXxwcm92aWRlc3xyZXF1aXJlc3x0b3x0cmFuc2l0aXZlfHVzZXN8d2l0aClcXHMrKSg/ITxrZXl3b3JkPilbYS16XVxcdyooPzpcXC5bYS16XVxcdyopKlxcLj8vXG5cdFx0XHRcdFx0LnNvdXJjZS5yZXBsYWNlKC88a2V5d29yZD4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4ga2V5d29yZHMuc291cmNlOyB9KSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vLFxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59KFByaXNtKSk7XG5cbi8qKlxuICogT3JpZ2luYWwgYnkgQWFyb24gSGFydW46IGh0dHA6Ly9hYWhhY3JlYXRpdmUuY29tLzIwMTIvMDcvMzEvcGhwLXN5bnRheC1oaWdobGlnaHRpbmctcHJpc20vXG4gKiBNb2RpZmllZCBieSBNaWxlcyBKb2huc29uOiBodHRwOi8vbWlsZXNqLm1lXG4gKiBSZXdyaXR0ZW4gYnkgVG9tIFBhdmVsZWNcbiAqXG4gKiBTdXBwb3J0cyBQSFAgNS4zIC0gOC4wXG4gKi9cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0dmFyIGNvbW1lbnQgPSAvXFwvXFwqW1xcc1xcU10qP1xcKlxcL3xcXC9cXC8uKnwjKD8hXFxbKS4qLztcblx0dmFyIGNvbnN0YW50ID0gW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi9pLFxuXHRcdFx0YWxpYXM6ICdib29sZWFuJ1xuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyg6OlxccyopXFxiW2Etel9dXFx3KlxcYig/IVxccypcXCgpL2ksXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhcXGIoPzpjYXNlfGNvbnN0KVxccyspXFxiW2Etel9dXFx3Kig/PVxccypbOz1dKS9pLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHR9LFxuXHRcdC9cXGIoPzpudWxsKVxcYi9pLFxuXHRcdC9cXGJbQS1aX11bQS1aMC05X10qXFxiKD8hXFxzKlxcKCkvLFxuXHRdO1xuXHR2YXIgbnVtYmVyID0gL1xcYjBiWzAxXSsoPzpfWzAxXSspKlxcYnxcXGIwb1swLTddKyg/Ol9bMC03XSspKlxcYnxcXGIweFtcXGRhLWZdKyg/Ol9bXFxkYS1mXSspKlxcYnwoPzpcXGJcXGQrKD86X1xcZCspKlxcLj8oPzpcXGQrKD86X1xcZCspKik/fFxcQlxcLlxcZCspKD86ZVsrLV0/XFxkKyk/L2k7XG5cdHZhciBvcGVyYXRvciA9IC88Pz0+fFxcP1xcPz0/fFxcLnszfXxcXD8/LT58WyE9XT0/PT98Ojp8XFwqXFwqPT98LS18XFwrXFwrfCYmfFxcfFxcfHw8PHw+PnxbP35dfFsvXnwlKiY8Pi4rLV09Py87XG5cdHZhciBwdW5jdHVhdGlvbiA9IC9be31cXFtcXF0oKSw6O10vO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5waHAgPSB7XG5cdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdHBhdHRlcm46IC9cXD8+JHxePFxcPyg/OnBocCg/PVxccyl8PSk/L2ksXG5cdFx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0XHR9LFxuXHRcdCdjb21tZW50JzogY29tbWVudCxcblx0XHQndmFyaWFibGUnOiAvXFwkKyg/OlxcdytcXGJ8KD89XFx7KSkvLFxuXHRcdCdwYWNrYWdlJzoge1xuXHRcdFx0cGF0dGVybjogLyhuYW1lc3BhY2VcXHMrfHVzZVxccysoPzpmdW5jdGlvblxccyspPykoPzpcXFxcP1xcYlthLXpfXVxcdyopK1xcYig/IVxcXFwpL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXFxcL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2NsYXNzLW5hbWUtZGVmaW5pdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxiKD86Y2xhc3N8ZW51bXxpbnRlcmZhY2V8dHJhaXQpXFxzKylcXGJbYS16X11cXHcqKD8hXFxcXClcXGIvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdFx0fSxcblx0XHQnZnVuY3Rpb24tZGVmaW5pdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxiZnVuY3Rpb25cXHMrKVthLXpfXVxcdyooPz1cXHMqXFwoKS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fSxcblx0XHQna2V5d29yZCc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXChcXHMqKVxcYig/OmFycmF5fGJvb2x8Ym9vbGVhbnxmbG9hdHxpbnR8aW50ZWdlcnxvYmplY3R8c3RyaW5nKVxcYig/PVxccypcXCkpL2ksXG5cdFx0XHRcdGFsaWFzOiAndHlwZS1jYXN0aW5nJyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFsoLD9dXFxzKilcXGIoPzphcnJheSg/IVxccypcXCgpfGJvb2x8Y2FsbGFibGV8KD86ZmFsc2V8bnVsbCkoPz1cXHMqXFx8KXxmbG9hdHxpbnR8aXRlcmFibGV8bWl4ZWR8b2JqZWN0fHNlbGZ8c3RhdGljfHN0cmluZylcXGIoPz1cXHMqXFwkKS9pLFxuXHRcdFx0XHRhbGlhczogJ3R5cGUtaGludCcsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXClcXHMqOlxccyooPzpcXD9cXHMqKT8pXFxiKD86YXJyYXkoPyFcXHMqXFwoKXxib29sfGNhbGxhYmxlfCg/OmZhbHNlfG51bGwpKD89XFxzKlxcfCl8ZmxvYXR8aW50fGl0ZXJhYmxlfG1peGVkfG5ldmVyfG9iamVjdHxzZWxmfHN0YXRpY3xzdHJpbmd8dm9pZClcXGIvaSxcblx0XHRcdFx0YWxpYXM6ICdyZXR1cm4tdHlwZScsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcYig/OmFycmF5KD8hXFxzKlxcKCl8Ym9vbHxmbG9hdHxpbnR8aXRlcmFibGV8bWl4ZWR8b2JqZWN0fHN0cmluZ3x2b2lkKVxcYi9pLFxuXHRcdFx0XHRhbGlhczogJ3R5cGUtZGVjbGFyYXRpb24nLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFx8XFxzKikoPzpmYWxzZXxudWxsKVxcYnxcXGIoPzpmYWxzZXxudWxsKSg/PVxccypcXHwpL2ksXG5cdFx0XHRcdGFsaWFzOiAndHlwZS1kZWNsYXJhdGlvbicsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcYig/OnBhcmVudHxzZWxmfHN0YXRpYykoPz1cXHMqOjopL2ksXG5cdFx0XHRcdGFsaWFzOiAnc3RhdGljLWNvbnRleHQnLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIHlpZWxkIGZyb21cblx0XHRcdFx0cGF0dGVybjogLyhcXGJ5aWVsZFxccyspZnJvbVxcYi9pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0Ly8gYGNsYXNzYCBpcyBhbHdheXMgYSBrZXl3b3JkIHVubGlrZSBvdGhlciBrZXl3b3Jkc1xuXHRcdFx0L1xcYmNsYXNzXFxiL2ksXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGh0dHBzOi8vd3d3LnBocC5uZXQvbWFudWFsL2VuL3Jlc2VydmVkLmtleXdvcmRzLnBocFxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyBrZXl3b3JkcyBjYW5ub3QgYmUgcHJlY2VkZWQgYnkgXCItPlwiXG5cdFx0XHRcdC8vIHRoZSBjb21wbGV4IGxvb2tiZWhpbmQgbWVhbnMgYCg/PCEoPzotPnw6OilcXHMqKWBcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFteXFxzPjpdfCg/Ol58W14tXSk+fCg/Ol58W146XSk6KVxccyopXFxiKD86YWJzdHJhY3R8YW5kfGFycmF5fGFzfGJyZWFrfGNhbGxhYmxlfGNhc2V8Y2F0Y2h8Y2xvbmV8Y29uc3R8Y29udGludWV8ZGVjbGFyZXxkZWZhdWx0fGRpZXxkb3xlY2hvfGVsc2V8ZWxzZWlmfGVtcHR5fGVuZGRlY2xhcmV8ZW5kZm9yfGVuZGZvcmVhY2h8ZW5kaWZ8ZW5kc3dpdGNofGVuZHdoaWxlfGVudW18ZXZhbHxleGl0fGV4dGVuZHN8ZmluYWx8ZmluYWxseXxmbnxmb3J8Zm9yZWFjaHxmdW5jdGlvbnxnbG9iYWx8Z290b3xpZnxpbXBsZW1lbnRzfGluY2x1ZGV8aW5jbHVkZV9vbmNlfGluc3RhbmNlb2Z8aW5zdGVhZG9mfGludGVyZmFjZXxpc3NldHxsaXN0fG1hdGNofG5hbWVzcGFjZXxuZXZlcnxuZXd8b3J8cGFyZW50fHByaW50fHByaXZhdGV8cHJvdGVjdGVkfHB1YmxpY3xyZWFkb25seXxyZXF1aXJlfHJlcXVpcmVfb25jZXxyZXR1cm58c2VsZnxzdGF0aWN8c3dpdGNofHRocm93fHRyYWl0fHRyeXx1bnNldHx1c2V8dmFyfHdoaWxlfHhvcnx5aWVsZHxfX2hhbHRfY29tcGlsZXIpXFxiL2ksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdhcmd1bWVudC1uYW1lJzoge1xuXHRcdFx0cGF0dGVybjogLyhbKCxdXFxzKilcXGJbYS16X11cXHcqKD89XFxzKjooPyE6KSkvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdjbGFzcy1uYW1lJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcYig/OmV4dGVuZHN8aW1wbGVtZW50c3xpbnN0YW5jZW9mfG5ldyg/IVxccytzZWxmfFxccytzdGF0aWMpKVxccyt8XFxiY2F0Y2hcXHMqXFwoKVxcYlthLXpfXVxcdyooPyFcXFxcKVxcYi9pLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFx8XFxzKilcXGJbYS16X11cXHcqKD8hXFxcXClcXGIvaSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxiW2Etel9dXFx3Kig/IVxcXFwpXFxiKD89XFxzKlxcfCkvaSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcfFxccyopKD86XFxcXD9cXGJbYS16X11cXHcqKStcXGIvaSxcblx0XHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lLWZ1bGx5LXF1YWxpZmllZCcsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcXFwvXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oPzpcXFxcP1xcYlthLXpfXVxcdyopK1xcYig/PVxccypcXHwpL2ksXG5cdFx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZS1mdWxseS1xdWFsaWZpZWQnLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXFxcL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcYig/OmV4dGVuZHN8aW1wbGVtZW50c3xpbnN0YW5jZW9mfG5ldyg/IVxccytzZWxmXFxifFxccytzdGF0aWNcXGIpKVxccyt8XFxiY2F0Y2hcXHMqXFwoKSg/OlxcXFw/XFxiW2Etel9dXFx3KikrXFxiKD8hXFxcXCkvaSxcblx0XHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lLWZ1bGx5LXF1YWxpZmllZCcsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcXFwvXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXGJbYS16X11cXHcqKD89XFxzKlxcJCkvaSxcblx0XHRcdFx0YWxpYXM6ICd0eXBlLWRlY2xhcmF0aW9uJyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKD86XFxcXD9cXGJbYS16X11cXHcqKSsoPz1cXHMqXFwkKS9pLFxuXHRcdFx0XHRhbGlhczogWydjbGFzcy1uYW1lLWZ1bGx5LXF1YWxpZmllZCcsICd0eXBlLWRlY2xhcmF0aW9uJ10sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcXFwvXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXGJbYS16X11cXHcqKD89XFxzKjo6KS9pLFxuXHRcdFx0XHRhbGlhczogJ3N0YXRpYy1jb250ZXh0Jyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKD86XFxcXD9cXGJbYS16X11cXHcqKSsoPz1cXHMqOjopL2ksXG5cdFx0XHRcdGFsaWFzOiBbJ2NsYXNzLW5hbWUtZnVsbHktcXVhbGlmaWVkJywgJ3N0YXRpYy1jb250ZXh0J10sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcXFwvXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oWygsP11cXHMqKVthLXpfXVxcdyooPz1cXHMqXFwkKS9pLFxuXHRcdFx0XHRhbGlhczogJ3R5cGUtaGludCcsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhbKCw/XVxccyopKD86XFxcXD9cXGJbYS16X11cXHcqKSsoPz1cXHMqXFwkKS9pLFxuXHRcdFx0XHRhbGlhczogWydjbGFzcy1uYW1lLWZ1bGx5LXF1YWxpZmllZCcsICd0eXBlLWhpbnQnXSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFxcXC9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXClcXHMqOlxccyooPzpcXD9cXHMqKT8pXFxiW2Etel9dXFx3Kig/IVxcXFwpXFxiL2ksXG5cdFx0XHRcdGFsaWFzOiAncmV0dXJuLXR5cGUnLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFwpXFxzKjpcXHMqKD86XFw/XFxzKik/KSg/OlxcXFw/XFxiW2Etel9dXFx3KikrXFxiKD8hXFxcXCkvaSxcblx0XHRcdFx0YWxpYXM6IFsnY2xhc3MtbmFtZS1mdWxseS1xdWFsaWZpZWQnLCAncmV0dXJuLXR5cGUnXSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFxcXC9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2NvbnN0YW50JzogY29uc3RhbnQsXG5cdFx0J2Z1bmN0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXFxcd10pXFxcXD9bYS16X10oPzpbXFx3XFxcXF0qXFx3KT8oPz1cXHMqXFwoKS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFxcXC9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdwcm9wZXJ0eSc6IHtcblx0XHRcdHBhdHRlcm46IC8oLT5cXHMqKVxcdysvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J251bWJlcic6IG51bWJlcixcblx0XHQnb3BlcmF0b3InOiBvcGVyYXRvcixcblx0XHQncHVuY3R1YXRpb24nOiBwdW5jdHVhdGlvblxuXHR9O1xuXG5cdHZhciBzdHJpbmdfaW50ZXJwb2xhdGlvbiA9IHtcblx0XHRwYXR0ZXJuOiAvXFx7XFwkKD86XFx7KD86XFx7W157fV0rXFx9fFtee31dKylcXH18W157fV0pK1xcfXwoXnxbXlxcXFx7XSlcXCQrKD86XFx3Kyg/OlxcW1teXFxyXFxuXFxbXFxdXStcXF18LT5cXHcrKT8pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnBocFxuXHR9O1xuXG5cdHZhciBzdHJpbmcgPSBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLzw8PCcoW14nXSspJ1tcXHJcXG5dKD86LipbXFxyXFxuXSkqP1xcMTsvLFxuXHRcdFx0YWxpYXM6ICdub3dkb2Mtc3RyaW5nJyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9ePDw8J1teJ10rJ3xbYS16X11cXHcqOyQvaSxcblx0XHRcdFx0XHRhbGlhczogJ3N5bWJvbCcsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXjw8PCc/fFsnO10kL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLzw8PCg/OlwiKFteXCJdKylcIltcXHJcXG5dKD86LipbXFxyXFxuXSkqP1xcMTt8KFthLXpfXVxcdyopW1xcclxcbl0oPzouKltcXHJcXG5dKSo/XFwyOykvaSxcblx0XHRcdGFsaWFzOiAnaGVyZWRvYy1zdHJpbmcnLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL148PDwoPzpcIlteXCJdK1wifFthLXpfXVxcdyopfFthLXpfXVxcdyo7JC9pLFxuXHRcdFx0XHRcdGFsaWFzOiAnc3ltYm9sJyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9ePDw8XCI/fFtcIjtdJC9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzogc3RyaW5nX2ludGVycG9sYXRpb25cblx0XHRcdH1cblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9gKD86XFxcXFtcXHNcXFNdfFteXFxcXGBdKSpgLyxcblx0XHRcdGFsaWFzOiAnYmFja3RpY2stcXVvdGVkLXN0cmluZycsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8nKD86XFxcXFtcXHNcXFNdfFteXFxcXCddKSonLyxcblx0XHRcdGFsaWFzOiAnc2luZ2xlLXF1b3RlZC1zdHJpbmcnLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcW1xcc1xcU118W15cXFxcXCJdKSpcIi8sXG5cdFx0XHRhbGlhczogJ2RvdWJsZS1xdW90ZWQtc3RyaW5nJyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IHN0cmluZ19pbnRlcnBvbGF0aW9uXG5cdFx0XHR9XG5cdFx0fVxuXHRdO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3BocCcsICd2YXJpYWJsZScsIHtcblx0XHQnc3RyaW5nJzogc3RyaW5nLFxuXHRcdCdhdHRyaWJ1dGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvI1xcWyg/OlteXCInXFwvI118XFwvKD8hWyovXSl8XFwvXFwvLiokfCMoPyFcXFspLiokfFxcL1xcKig/OlteKl18XFwqKD8hXFwvKSkqXFwqXFwvfFwiKD86XFxcXFtcXHNcXFNdfFteXFxcXFwiXSkqXCJ8Jyg/OlxcXFxbXFxzXFxTXXxbXlxcXFwnXSkqJykrXFxdKD89XFxzKlthLXokI10pL2ltLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdhdHRyaWJ1dGUtY29udGVudCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXigjXFxbKVtcXHNcXFNdKyg/PVxcXSQpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdC8vIGluc2lkZSBjYW4gYXBwZWFyIHN1YnNldCBvZiBwaHBcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdjb21tZW50JzogY29tbWVudCxcblx0XHRcdFx0XHRcdCdzdHJpbmcnOiBzdHJpbmcsXG5cdFx0XHRcdFx0XHQnYXR0cmlidXRlLWNsYXNzLW5hbWUnOiBbXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKFteOl18XilcXGJbYS16X11cXHcqKD8hXFxcXClcXGIvaSxcblx0XHRcdFx0XHRcdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnLFxuXHRcdFx0XHRcdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKFteOl18XikoPzpcXFxcP1xcYlthLXpfXVxcdyopKy9pLFxuXHRcdFx0XHRcdFx0XHRcdGFsaWFzOiBbXG5cdFx0XHRcdFx0XHRcdFx0XHQnY2xhc3MtbmFtZScsXG5cdFx0XHRcdFx0XHRcdFx0XHQnY2xhc3MtbmFtZS1mdWxseS1xdWFsaWZpZWQnXG5cdFx0XHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXFxcL1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdCdjb25zdGFudCc6IGNvbnN0YW50LFxuXHRcdFx0XHRcdFx0J251bWJlcic6IG51bWJlcixcblx0XHRcdFx0XHRcdCdvcGVyYXRvcic6IG9wZXJhdG9yLFxuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogcHVuY3R1YXRpb25cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14jXFxbfFxcXSQvLFxuXHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHR9KTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2JlZm9yZS10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRpZiAoIS88XFw/Ly50ZXN0KGVudi5jb2RlKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBwaHBQYXR0ZXJuID0gLzxcXD8oPzpbXlwiJy8jXXxcXC8oPyFbKi9dKXwoXCJ8JykoPzpcXFxcW1xcc1xcU118KD8hXFwxKVteXFxcXF0pKlxcMXwoPzpcXC9cXC98Iyg/IVxcWykpKD86W14/XFxuXFxyXXxcXD8oPyE+KSkqKD89JHxcXD8+fFtcXHJcXG5dKXwjXFxbfFxcL1xcKig/OlteKl18XFwqKD8hXFwvKSkqKD86XFwqXFwvfCQpKSo/KD86XFw/PnwkKS9nO1xuXHRcdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS5idWlsZFBsYWNlaG9sZGVycyhlbnYsICdwaHAnLCBwaHBQYXR0ZXJuKTtcblx0fSk7XG5cblx0UHJpc20uaG9va3MuYWRkKCdhZnRlci10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10udG9rZW5pemVQbGFjZWhvbGRlcnMoZW52LCAncGhwJyk7XG5cdH0pO1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgamF2YURvY0xpa2UgPSBQcmlzbS5sYW5ndWFnZXMuamF2YWRvY2xpa2UgPSB7XG5cdFx0J3BhcmFtZXRlcic6IHtcblx0XHRcdHBhdHRlcm46IC8oXltcXHQgXSooPzpcXC97M318XFwqfFxcL1xcKlxcKilcXHMqQCg/OmFyZ3xhcmd1bWVudHN8cGFyYW0pXFxzKylcXHcrL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQna2V5d29yZCc6IHtcblx0XHRcdC8vIGtleXdvcmRzIGFyZSB0aGUgZmlyc3Qgd29yZCBpbiBhIGxpbmUgcHJlY2VkZWQgYmUgYW4gYEBgIG9yIHN1cnJvdW5kZWQgYnkgY3VybHkgYnJhY2VzLlxuXHRcdFx0Ly8gQHdvcmQsIHtAd29yZH1cblx0XHRcdHBhdHRlcm46IC8oXltcXHQgXSooPzpcXC97M318XFwqfFxcL1xcKlxcKilcXHMqfFxceylAW2Etel1bYS16QS1aLV0rXFxiL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQncHVuY3R1YXRpb24nOiAvW3t9XS9cblx0fTtcblxuXG5cdC8qKlxuXHQgKiBBZGRzIGRvYyBjb21tZW50IHN1cHBvcnQgdG8gdGhlIGdpdmVuIGxhbmd1YWdlIGFuZCBjYWxscyBhIGdpdmVuIGNhbGxiYWNrIG9uIGVhY2ggZG9jIGNvbW1lbnQgcGF0dGVybi5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IGxhbmcgdGhlIGxhbmd1YWdlIGFkZCBkb2MgY29tbWVudCBzdXBwb3J0IHRvLlxuXHQgKiBAcGFyYW0geyhwYXR0ZXJuOiB7aW5zaWRlOiB7cmVzdDogdW5kZWZpbmVkfX0pID0+IHZvaWR9IGNhbGxiYWNrIHRoZSBmdW5jdGlvbiBjYWxsZWQgd2l0aCBlYWNoIGRvYyBjb21tZW50IHBhdHRlcm4gYXMgYXJndW1lbnQuXG5cdCAqL1xuXHRmdW5jdGlvbiBkb2NDb21tZW50U3VwcG9ydChsYW5nLCBjYWxsYmFjaykge1xuXHRcdHZhciB0b2tlbk5hbWUgPSAnZG9jLWNvbW1lbnQnO1xuXG5cdFx0dmFyIGdyYW1tYXIgPSBQcmlzbS5sYW5ndWFnZXNbbGFuZ107XG5cdFx0aWYgKCFncmFtbWFyKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHZhciB0b2tlbiA9IGdyYW1tYXJbdG9rZW5OYW1lXTtcblxuXHRcdGlmICghdG9rZW4pIHtcblx0XHRcdC8vIGFkZCBkb2MgY29tbWVudDogLyoqICovXG5cdFx0XHR2YXIgZGVmaW5pdGlvbiA9IHt9O1xuXHRcdFx0ZGVmaW5pdGlvblt0b2tlbk5hbWVdID0ge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcXC9cXCpcXCpbXi9dW1xcc1xcU10qPyg/OlxcKlxcL3wkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnY29tbWVudCdcblx0XHRcdH07XG5cblx0XHRcdGdyYW1tYXIgPSBQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKGxhbmcsICdjb21tZW50JywgZGVmaW5pdGlvbik7XG5cdFx0XHR0b2tlbiA9IGdyYW1tYXJbdG9rZW5OYW1lXTtcblx0XHR9XG5cblx0XHRpZiAodG9rZW4gaW5zdGFuY2VvZiBSZWdFeHApIHsgLy8gY29udmVydCByZWdleCB0byBvYmplY3Rcblx0XHRcdHRva2VuID0gZ3JhbW1hclt0b2tlbk5hbWVdID0geyBwYXR0ZXJuOiB0b2tlbiB9O1xuXHRcdH1cblxuXHRcdGlmIChBcnJheS5pc0FycmF5KHRva2VuKSkge1xuXHRcdFx0Zm9yICh2YXIgaSA9IDAsIGwgPSB0b2tlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdFx0aWYgKHRva2VuW2ldIGluc3RhbmNlb2YgUmVnRXhwKSB7XG5cdFx0XHRcdFx0dG9rZW5baV0gPSB7IHBhdHRlcm46IHRva2VuW2ldIH07XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2FsbGJhY2sodG9rZW5baV0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjYWxsYmFjayh0b2tlbik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgZG9jLWNvbW1lbnQgc3VwcG9ydCB0byB0aGUgZ2l2ZW4gbGFuZ3VhZ2VzIGZvciB0aGUgZ2l2ZW4gZG9jdW1lbnRhdGlvbiBsYW5ndWFnZS5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmdbXXxzdHJpbmd9IGxhbmd1YWdlc1xuXHQgKiBAcGFyYW0ge09iamVjdH0gZG9jTGFuZ3VhZ2Vcblx0ICovXG5cdGZ1bmN0aW9uIGFkZFN1cHBvcnQobGFuZ3VhZ2VzLCBkb2NMYW5ndWFnZSkge1xuXHRcdGlmICh0eXBlb2YgbGFuZ3VhZ2VzID09PSAnc3RyaW5nJykge1xuXHRcdFx0bGFuZ3VhZ2VzID0gW2xhbmd1YWdlc107XG5cdFx0fVxuXG5cdFx0bGFuZ3VhZ2VzLmZvckVhY2goZnVuY3Rpb24gKGxhbmcpIHtcblx0XHRcdGRvY0NvbW1lbnRTdXBwb3J0KGxhbmcsIGZ1bmN0aW9uIChwYXR0ZXJuKSB7XG5cdFx0XHRcdGlmICghcGF0dGVybi5pbnNpZGUpIHtcblx0XHRcdFx0XHRwYXR0ZXJuLmluc2lkZSA9IHt9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHBhdHRlcm4uaW5zaWRlLnJlc3QgPSBkb2NMYW5ndWFnZTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGphdmFEb2NMaWtlLCAnYWRkU3VwcG9ydCcsIHsgdmFsdWU6IGFkZFN1cHBvcnQgfSk7XG5cblx0amF2YURvY0xpa2UuYWRkU3VwcG9ydChbJ2phdmEnLCAnamF2YXNjcmlwdCcsICdwaHAnXSwgamF2YURvY0xpa2UpO1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgY29kZUxpbmVQYXR0ZXJuID0gLyheKD86W1xcdCBdKig/OlxcKlxccyopKikpW14qXFxzXS4qJC9tO1xuXG5cdHZhciBtZW1iZXJSZWZlcmVuY2UgPSAvI1xccypcXHcrKD86XFxzKlxcKFteKCldKlxcKSk/Ly5zb3VyY2U7XG5cdHZhciByZWZlcmVuY2UgPSAvKD86XFxiW2EtekEtWl1cXHcrXFxzKlxcLlxccyopKlxcYltBLVpdXFx3Kig/Olxccyo8bWVtPik/fDxtZW0+Ly5zb3VyY2UucmVwbGFjZSgvPG1lbT4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVtYmVyUmVmZXJlbmNlOyB9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuamF2YWRvYyA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2phdmFkb2NsaWtlJywge30pO1xuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdqYXZhZG9jJywgJ2tleXdvcmQnLCB7XG5cdFx0J3JlZmVyZW5jZSc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKEAoPzpleGNlcHRpb258bGlua3xsaW5rcGxhaW58c2VlfHRocm93c3x2YWx1ZSlcXHMrKD86XFwqXFxzKik/KS8uc291cmNlICsgJyg/OicgKyByZWZlcmVuY2UgKyAnKScpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZnVuY3Rpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLygjXFxzKilcXHcrKD89XFxzKlxcKCkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0J2ZpZWxkJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oI1xccyopXFx3Ky8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnbmFtZXNwYWNlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9cXGIoPzpbYS16XVxcdypcXHMqXFwuXFxzKikrLyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnY2xhc3MtbmFtZSc6IC9cXGJbQS1aXVxcdyovLFxuXHRcdFx0XHQna2V5d29yZCc6IFByaXNtLmxhbmd1YWdlcy5qYXZhLmtleXdvcmQsXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bIygpW1xcXSwuXS9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdjbGFzcy1uYW1lJzoge1xuXHRcdFx0Ly8gQHBhcmFtIDxUPiB0aGUgZmlyc3QgZ2VuZXJpYyB0eXBlIHBhcmFtZXRlclxuXHRcdFx0cGF0dGVybjogLyhAcGFyYW1cXHMrKTxbQS1aXVxcdyo+Lyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1suPD5dL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2NvZGUtc2VjdGlvbic6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXHtAY29kZVxccysoPyFcXHMpKSg/OlteXFxze31dfFxccysoPyFbXFxzfV0pfFxceyg/Oltee31dfFxceyg/Oltee31dfFxceyg/Oltee31dfFxce1tee31dKlxcfSkqXFx9KSpcXH0pKlxcfSkrKD89XFxzKlxcfSkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnY29kZSc6IHtcblx0XHRcdFx0XHRcdC8vIHRoZXJlIGNhbid0IGJlIGFueSBIVE1MIGluc2lkZSBvZiB7QGNvZGV9IHRhZ3Ncblx0XHRcdFx0XHRcdHBhdHRlcm46IGNvZGVMaW5lUGF0dGVybixcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5qYXZhLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1qYXZhJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyg8KGNvZGV8cHJlfHR0KT4oPyE8Y29kZT4pXFxzKilcXFMoPzpcXFN8XFxzK1xcUykqPyg/PVxccyo8XFwvXFwyPikvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnbGluZSc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IGNvZGVMaW5lUGF0dGVybixcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0Ly8gaGlnaGxpZ2h0IEhUTUwgdGFncyBhbmQgZW50aXRpZXNcblx0XHRcdFx0XHRcdFx0J3RhZyc6IFByaXNtLmxhbmd1YWdlcy5tYXJrdXAudGFnLFxuXHRcdFx0XHRcdFx0XHQnZW50aXR5JzogUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cC5lbnRpdHksXG5cdFx0XHRcdFx0XHRcdCdjb2RlJzoge1xuXHRcdFx0XHRcdFx0XHRcdC8vIGV2ZXJ5dGhpbmcgZWxzZSBpcyBKYXZhIGNvZGVcblx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvLisvLFxuXHRcdFx0XHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmphdmEsXG5cdFx0XHRcdFx0XHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1qYXZhJ1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQndGFnJzogUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cC50YWcsXG5cdFx0J2VudGl0eSc6IFByaXNtLmxhbmd1YWdlcy5tYXJrdXAuZW50aXR5LFxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuamF2YWRvY2xpa2UuYWRkU3VwcG9ydCgnamF2YScsIFByaXNtLmxhbmd1YWdlcy5qYXZhZG9jKTtcbn0oUHJpc20pKTtcblxuLy8gU3BlY2lmaWNhdGlvbjpcbi8vIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2VuL2phdmEvamF2YXNlLzEzL2RvY3MvYXBpL2phdmEuYmFzZS9qYXZhL2xhbmcvVGhyb3dhYmxlLmh0bWwjcHJpbnRTdGFja1RyYWNlKClcblxuUHJpc20ubGFuZ3VhZ2VzLmphdmFzdGFja3RyYWNlID0ge1xuXG5cdC8vIGphdmEuc3FsLlNRTEV4Y2VwdGlvbjogVmlvbGF0aW9uIG9mIHVuaXF1ZSBjb25zdHJhaW50IE1ZX0VOVElUWV9VS18xOiBkdXBsaWNhdGUgdmFsdWUocykgZm9yIGNvbHVtbihzKSBNWV9DT0xVTU4gaW4gc3RhdGVtZW50IFsuLi5dXG5cdC8vIENhdXNlZCBieTogamF2YS5zcWwuU1FMRXhjZXB0aW9uOiBWaW9sYXRpb24gb2YgdW5pcXVlIGNvbnN0cmFpbnQgTVlfRU5USVRZX1VLXzE6IGR1cGxpY2F0ZSB2YWx1ZShzKSBmb3IgY29sdW1uKHMpIE1ZX0NPTFVNTiBpbiBzdGF0ZW1lbnQgWy4uLl1cblx0Ly8gQ2F1c2VkIGJ5OiBjb20uZXhhbXBsZS5teXByb2plY3QuTXlQcm9qZWN0U2VydmxldEV4Y2VwdGlvblxuXHQvLyBDYXVzZWQgYnk6IE1pZExldmVsRXhjZXB0aW9uOiBMb3dMZXZlbEV4Y2VwdGlvblxuXHQvLyBTdXBwcmVzc2VkOiBSZXNvdXJjZSRDbG9zZUZhaWxFeGNlcHRpb246IFJlc291cmNlIElEID0gMFxuXHQnc3VtbWFyeSc6IHtcblx0XHRwYXR0ZXJuOiAvXihbXFx0IF0qKSg/Oig/OkNhdXNlZCBieTp8U3VwcHJlc3NlZDp8RXhjZXB0aW9uIGluIHRocmVhZCBcIlteXCJdKlwiKVtcXHQgXSspP1tcXHckLl0rKD86Oi4qKT8kL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdrZXl3b3JkJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXihbXFx0IF0qKSg/Oig/OkNhdXNlZCBieXxTdXBwcmVzc2VkKSg/PTopfEV4Y2VwdGlvbiBpbiB0aHJlYWQpL20sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cblx0XHRcdC8vIHRoZSBjdXJyZW50IHRocmVhZCBpZiB0aGUgc3VtbWFyeSBzdGFydHMgd2l0aCAnRXhjZXB0aW9uIGluIHRocmVhZCdcblx0XHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eKFxccyopXCJbXlwiXSpcIi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQnZXhjZXB0aW9ucyc6IHtcblx0XHRcdFx0cGF0dGVybjogL14oOj9cXHMqKVtcXHckLl0rKD89OnwkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdjbGFzcy1uYW1lJzogL1tcXHckXSskLyxcblx0XHRcdFx0XHQnbmFtZXNwYWNlJzogL1xcYlthLXpdXFx3KlxcYi8sXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdtZXNzYWdlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKDpcXHMqKVxcUy4qLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdzdHJpbmcnXG5cdFx0XHR9LFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogLzovXG5cdFx0fVxuXHR9LFxuXG5cdC8vIGF0IG9yZy5tb3J0YmF5LmpldHR5LnNlcnZsZXQuU2VydmxldEhhbmRsZXIkQ2FjaGVkQ2hhaW4uZG9GaWx0ZXIoU2VydmxldEhhbmRsZXIuamF2YToxMTY2KVxuXHQvLyBhdCBvcmcuaHNxbGRiLmpkYmMuVXRpbC50aHJvd0Vycm9yKFVua25vd24gU291cmNlKSBoZXJlIGNvdWxkIGJlIHNvbWUgbm90ZXNcblx0Ly8gYXQgamF2YS5iYXNlL2phdmEubGFuZy5DbGFzcy5mb3JOYW1lMChOYXRpdmUgTWV0aG9kKVxuXHQvLyBhdCBVdGlsLjxpbml0PihVbmtub3duIFNvdXJjZSlcblx0Ly8gYXQgY29tLmZvby5sb2FkZXIvZm9vQDkuMC9jb20uZm9vLk1haW4ucnVuKE1haW4uamF2YToxMDEpXG5cdC8vIGF0IGNvbS5mb28ubG9hZGVyLy9jb20uZm9vLmJhci5BcHAucnVuKEFwcC5qYXZhOjEyKVxuXHQvLyBhdCBhY21lQDIuMS9vcmcuYWNtZS5MaWIudGVzdChMaWIuamF2YTo4MClcblx0Ly8gYXQgTXlDbGFzcy5tYXNoKE15Q2xhc3MuamF2YTo5KVxuXHQvL1xuXHQvLyBNb3JlIGluZm9ybWF0aW9uOlxuXHQvLyBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMy9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS9sYW5nL1N0YWNrVHJhY2VFbGVtZW50Lmh0bWwjdG9TdHJpbmcoKVxuXHQvL1xuXHQvLyBBIHZhbGlkIEphdmEgbW9kdWxlIG5hbWUgaXMgZGVmaW5lZCBhczpcblx0Ly8gICBcIkEgbW9kdWxlIG5hbWUgY29uc2lzdHMgb2Ygb25lIG9yIG1vcmUgSmF2YSBpZGVudGlmaWVycyAoXHUwMEE3My44KSBzZXBhcmF0ZWQgYnkgXCIuXCIgdG9rZW5zLlwiXG5cdC8vIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9qbHMvc2U5L2h0bWwvamxzLTYuaHRtbCNqbHMtTW9kdWxlTmFtZVxuXHQvL1xuXHQvLyBBIEphdmEgbW9kdWxlIHZlcnNpb24gaXMgZGVmaW5lZCBieSB0aGlzIGNsYXNzOlxuXHQvLyBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOS9kb2NzL2FwaS9qYXZhL2xhbmcvbW9kdWxlL01vZHVsZURlc2NyaXB0b3IuVmVyc2lvbi5odG1sXG5cdC8vIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBgcGFyc2VgIG1ldGhvZCBpbiBKREsxMzpcblx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL21hdGNkYWMvamRrL2Jsb2IvMjMwNWRmNzFkMWI3NzEwMjY2YWUwOTU2ZDczOTI3YTIyNTEzMmMwZi9zcmMvamF2YS5iYXNlL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL21vZHVsZS9Nb2R1bGVEZXNjcmlwdG9yLmphdmEjTDExMDhcblx0Ly8gSG93ZXZlciwgdG8ga2VlcCB0aGlzIHNpbXBsZSwgYSB2ZXJzaW9uIHdpbGwgYmUgbWF0Y2hlZCBieSB0aGUgcGF0dGVybiAvQFtcXHckListXSovLlxuXHQnc3RhY2stZnJhbWUnOiB7XG5cdFx0cGF0dGVybjogL14oW1xcdCBdKilhdCAoPzpbXFx3JC4vXXxAW1xcdyQuKy1dKlxcLykrKD86PGluaXQ+KT9cXChbXigpXSpcXCkvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2tleXdvcmQnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eKFxccyopYXQoPz0gKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQnc291cmNlJzogW1xuXHRcdFx0XHQvLyAoTWFpbi5qYXZhOjE1KVxuXHRcdFx0XHQvLyAoTWFpbi5zY2FsYToxNSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXFwoKVxcdytcXC5cXHcrOlxcZCsoPz1cXCkpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J2ZpbGUnOiAvXlxcdytcXC5cXHcrLyxcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC86Lyxcblx0XHRcdFx0XHRcdCdsaW5lLW51bWJlcic6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogL1xcYlxcZCtcXGIvLFxuXHRcdFx0XHRcdFx0XHRhbGlhczogJ251bWJlcidcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIChVbmtub3duIFNvdXJjZSlcblx0XHRcdFx0Ly8gKE5hdGl2ZSBNZXRob2QpXG5cdFx0XHRcdC8vICguLi5zb21ldGhpbmcuLi4pXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKFxcKClbXigpXSooPz1cXCkpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J2tleXdvcmQnOiAvXig/Ok5hdGl2ZSBNZXRob2R8VW5rbm93biBTb3VyY2UpJC9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdF0sXG5cdFx0XHQnY2xhc3MtbmFtZSc6IC9bXFx3JF0rKD89XFwuKD86PGluaXQ+fFtcXHckXSspXFwoKS8sXG5cdFx0XHQnZnVuY3Rpb24nOiAvKD86PGluaXQ+fFtcXHckXSspKD89XFwoKS8sXG5cdFx0XHQnY2xhc3MtbG9hZGVyJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxccylbYS16XVxcdyooPzpcXC5bYS16XVxcdyopKig/PVxcL1tcXHdAJC5dKlxcLykvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ25hbWVzcGFjZScsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnbW9kdWxlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFtcXHMvXSlbYS16XVxcdyooPzpcXC5bYS16XVxcdyopKig/OkBbXFx3JC4rLV0qKT8oPz1cXC8pLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3ZlcnNpb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKEApW1xcc1xcU10rLyxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRhbGlhczogJ251bWJlcidcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bQC5dL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J25hbWVzcGFjZSc6IHtcblx0XHRcdFx0cGF0dGVybjogLyg/OlxcYlthLXpdXFx3KlxcLikrLyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9bKCkvLl0vXG5cdFx0fVxuXHR9LFxuXG5cdC8vIC4uLiAzMiBtb3JlXG5cdC8vIC4uLiAzMiBjb21tb24gZnJhbWVzIG9taXR0ZWRcblx0J21vcmUnOiB7XG5cdFx0cGF0dGVybjogL14oW1xcdCBdKilcXC57M30gXFxkKyBbYS16XSsoPzogW2Etel0rKSovbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLnszfS8sXG5cdFx0XHQnbnVtYmVyJzogL1xcZCsvLFxuXHRcdFx0J2tleXdvcmQnOiAvXFxiW2Etel0rKD86IFthLXpdKykqXFxiL1xuXHRcdH1cblx0fVxuXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuamV4bCA9IHtcblx0J3N0cmluZyc6IC8oW1wiJ10pKD86XFxcXFtcXHNcXFNdfCg/IVxcMSlbXlxcXFxdKSpcXDEvLFxuXHQndHJhbnNmb3JtJzoge1xuXHRcdHBhdHRlcm46IC8oXFx8XFxzKilbYS16QS1aXHUwNDMwLVx1MDQ0Rlx1MDQxMC1cdTA0MkZfXFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMEZGJF1bXFx3XHUwNDMwLVx1MDQ0Rlx1MDQxMC1cdTA0MkZcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAwRkYkXSovLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2Z1bmN0aW9uJzogL1thLXpBLVpcdTA0MzAtXHUwNDRGXHUwNDEwLVx1MDQyRl9cXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAwRkYkXVtcXHdcdTA0MzAtXHUwNDRGXHUwNDEwLVx1MDQyRlxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDBGRiRdKlxccyooPz1cXCgpLyxcblx0J251bWJlcic6IC9cXGJcXGQrKD86XFwuXFxkKyk/XFxifFxcQlxcLlxcZCtcXGIvLFxuXHQnb3BlcmF0b3InOiAvWzw+IV09P3wtfFxcK3wmJnw9PXxcXHxcXHw/fFxcL1xcLz98Wz86Kl4lXS8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0J2tleXdvcmQnOiAvXFxiaW5cXGIvLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXSgpLC5dLyxcbn07XG5cblByaXNtLmxhbmd1YWdlcy5qb2xpZSA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVwiKD86XFxcXFtcXHNcXFNdfFteXCJcXFxcXSkqXCIvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjbGFzcy1uYW1lJzoge1xuXHRcdHBhdHRlcm46IC8oKD86XFxiKD86YXN8Y291cmllcnxlbWJlZHxpbnxpbnB1dFBvcnR8b3V0cHV0UG9ydHxzZXJ2aWNlKVxcYnxAKVsgXFx0XSopXFx3Ky8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzphc3xjSHxjb21wfGNvbmN1cnJlbnR8Y29uc3RhbnRzfGNvdXJpZXJ8Y3NldHxjc2V0c3xkZWZhdWx0fGRlZmluZXxlbHNlfGVtYmVkfGVtYmVkZGVkfGV4ZWN1dGlvbnxleGl0fGV4dGVuZGVyfGZvcnxmb3JlYWNofGZvcndhcmR8ZnJvbXxnbG9iYWx8aWZ8aW1wb3J0fGlufGluY2x1ZGV8aW5pdHxpbnB1dFBvcnR8aW5zdGFsbHxpbnN0YW5jZW9mfGludGVyZmFjZXxpc19kZWZpbmVkfGxpbmtJbnxsaW5rT3V0fG1haW58bmV3fG51bGxQcm9jZXNzfG91dHB1dFBvcnR8b3Zlcnxwcml2YXRlfHByb3ZpZGV8cHVibGljfHNjb3BlfHNlcXVlbnRpYWx8c2VydmljZXxzaW5nbGV8c3Bhd258c3luY2hyb25pemVkfHRoaXN8dGhyb3d8dGhyb3dzfHR5cGV8dW5kZWZ8dW50aWx8d2hpbGV8d2l0aClcXGIvLFxuXHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVsgXFx0XSpbQChdKS9pLFxuXHQnbnVtYmVyJzogLyg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzplWystXT9cXGQrKT9sPy9pLFxuXHQnb3BlcmF0b3InOiAvLVstPT5dP3xcXCtbKz1dP3w8Wzw9XT98Wz49KiFdPT98JiZ8XFx8XFx8fFs/XFwvJV5AfF0vLFxuXHQncHVuY3R1YXRpb24nOiAvWygpW1xcXXt9LDsuOl0vLFxuXHQnYnVpbHRpbic6IC9cXGIoPzpCeXRlfGFueXxib29sfGNoYXJ8ZG91YmxlfGVudW18ZmxvYXR8aW50fGxlbmd0aHxsb25nfHJhbmdlc3xyZWdleHxzdHJpbmd8dW5kZWZpbmVkfHZvaWQpXFxiL1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2pvbGllJywgJ2tleXdvcmQnLCB7XG5cdCdhZ2dyZWdhdGVzJzoge1xuXHRcdHBhdHRlcm46IC8oXFxiQWdncmVnYXRlc1xccyo6XFxzKikoPzpcXHcrKD86XFxzK3dpdGhcXHMrXFx3Kyk/XFxzKixcXHMqKSpcXHcrKD86XFxzK3dpdGhcXHMrXFx3Kyk/Lyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2tleXdvcmQnOiAvXFxid2l0aFxcYi8sXG5cdFx0XHQnY2xhc3MtbmFtZSc6IC9cXHcrLyxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC8sL1xuXHRcdH1cblx0fSxcblx0J3JlZGlyZWN0cyc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYlJlZGlyZWN0c1xccyo6XFxzKikoPzpcXHcrXFxzKj0+XFxzKlxcdytcXHMqLFxccyopKig/OlxcdytcXHMqPT5cXHMqXFx3KykvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvLC8sXG5cdFx0XHQnY2xhc3MtbmFtZSc6IC9cXHcrLyxcblx0XHRcdCdvcGVyYXRvcic6IC89Pi9cblx0XHR9XG5cdH0sXG5cdCdwcm9wZXJ0eSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86QWdncmVnYXRlc3xbSWldbnRlcmZhY2VzfEphdmF8SmF2YXNjcmlwdHxKb2xpZXxbTGxdb2NhdGlvbnxPbmVXYXl8W1BwXXJvdG9jb2x8UmVkaXJlY3RzfFJlcXVlc3RSZXNwb25zZSlcXGIoPz1bIFxcdF0qOikvXG5cdH1cbn0pO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGludGVycG9sYXRpb24gPSAvXFxcXFxcKCg/OlteKCldfFxcKFteKCldKlxcKSkqXFwpLy5zb3VyY2U7XG5cdHZhciBzdHJpbmcgPSBSZWdFeHAoLyhefFteXFxcXF0pXCIoPzpbXlwiXFxyXFxuXFxcXF18XFxcXFteXFxyXFxuKF18X18pKlwiLy5zb3VyY2UucmVwbGFjZSgvX18vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gaW50ZXJwb2xhdGlvbjsgfSkpO1xuXHR2YXIgc3RyaW5nSW50ZXJwb2xhdGlvbiA9IHtcblx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKCg/Ol58W15cXFxcXSkoPzpcXFxcezJ9KSopLy5zb3VyY2UgKyBpbnRlcnBvbGF0aW9uKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2NvbnRlbnQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14oXFxcXFxcKClbXFxzXFxTXSsoPz1cXCkkKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFxcXFxcKHxcXCkkL1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHR2YXIganEgPSBQcmlzbS5sYW5ndWFnZXMuanEgPSB7XG5cdFx0J2NvbW1lbnQnOiAvIy4qLyxcblx0XHQncHJvcGVydHknOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoc3RyaW5nLnNvdXJjZSArIC8oPz1cXHMqOig/ITopKS8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHN0cmluZ0ludGVycG9sYXRpb25cblx0XHR9LFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiBzdHJpbmcsXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBzdHJpbmdJbnRlcnBvbGF0aW9uXG5cdFx0fSxcblxuXHRcdCdmdW5jdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxiZGVmXFxzKylbYS16X11cXHcrL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblxuXHRcdCd2YXJpYWJsZSc6IC9cXEJcXCRcXHcrLyxcblx0XHQncHJvcGVydHktbGl0ZXJhbCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGJbYS16X11cXHcqKD89XFxzKjooPyE6KSkvaSxcblx0XHRcdGFsaWFzOiAncHJvcGVydHknXG5cdFx0fSxcblx0XHQna2V5d29yZCc6IC9cXGIoPzphc3xicmVha3xjYXRjaHxkZWZ8ZWxpZnxlbHNlfGVuZHxmb3JlYWNofGlmfGltcG9ydHxpbmNsdWRlfGxhYmVsfG1vZHVsZXxtb2R1bGVtZXRhfG51bGx8cmVkdWNlfHRoZW58dHJ5fHdoaWxlKVxcYi8sXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHRcdCdudW1iZXInOiAvKD86XFxiXFxkK1xcLnxcXEJcXC4pP1xcYlxcZCsoPzpbZUVdWystXT9cXGQrKT9cXGIvLFxuXG5cdFx0J29wZXJhdG9yJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFx8PT8vLFxuXHRcdFx0XHRhbGlhczogJ3BpcGUnXG5cdFx0XHR9LFxuXHRcdFx0L1xcLlxcLnxbIT08Pl0/PXxcXD9cXC9cXC98XFwvXFwvPT98Wy0rKi8lXT0/fFs8Pj9dfFxcYig/OmFuZHxub3R8b3IpXFxiL1xuXHRcdF0sXG5cdFx0J2Mtc3R5bGUtZnVuY3Rpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiW2Etel9dXFx3Kig/PVxccypcXCgpL2ksXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH0sXG5cdFx0J3B1bmN0dWF0aW9uJzogLzo6fFsoKVxcW1xcXXt9LDo7XXxcXC4oPz1cXHMqW1xcW1xcdyRdKS8sXG5cdFx0J2RvdCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXC4vLFxuXHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdFx0fVxuXHR9O1xuXG5cdHN0cmluZ0ludGVycG9sYXRpb24uaW50ZXJwb2xhdGlvbi5pbnNpZGUuY29udGVudC5pbnNpZGUgPSBqcTtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnR5cGVzY3JpcHQgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdqYXZhc2NyaXB0Jywge1xuXHRcdCdjbGFzcy1uYW1lJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXGIoPzpjbGFzc3xleHRlbmRzfGltcGxlbWVudHN8aW5zdGFuY2VvZnxpbnRlcmZhY2V8bmV3fHR5cGUpXFxzKykoPyFrZXlvZlxcYikoPyFcXHMpW18kYS16QS1aXFx4QTAtXFx1RkZGRl0oPzooPyFcXHMpWyRcXHdcXHhBMC1cXHVGRkZGXSkqKD86XFxzKjwoPzpbXjw+XXw8KD86W148Pl18PFtePD5dKj4pKj4pKj4pPy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdH0sXG5cdFx0J2J1aWx0aW4nOiAvXFxiKD86QXJyYXl8RnVuY3Rpb258UHJvbWlzZXxhbnl8Ym9vbGVhbnxjb25zb2xlfG5ldmVyfG51bWJlcnxzdHJpbmd8c3ltYm9sfHVua25vd24pXFxiLyxcblx0fSk7XG5cblx0Ly8gVGhlIGtleXdvcmRzIFR5cGVTY3JpcHQgYWRkcyB0byBKYXZhU2NyaXB0XG5cdFByaXNtLmxhbmd1YWdlcy50eXBlc2NyaXB0LmtleXdvcmQucHVzaChcblx0XHQvXFxiKD86YWJzdHJhY3R8ZGVjbGFyZXxpc3xrZXlvZnxyZWFkb25seXxyZXF1aXJlKVxcYi8sXG5cdFx0Ly8ga2V5d29yZHMgdGhhdCBoYXZlIHRvIGJlIGZvbGxvd2VkIGJ5IGFuIGlkZW50aWZpZXJcblx0XHQvXFxiKD86YXNzZXJ0c3xpbmZlcnxpbnRlcmZhY2V8bW9kdWxlfG5hbWVzcGFjZXx0eXBlKVxcYig/PVxccyooPzpbe18kYS16QS1aXFx4QTAtXFx1RkZGRl18JCkpLyxcblx0XHQvLyBUaGlzIGlzIGZvciBgaW1wb3J0IHR5cGUgKiwge31gXG5cdFx0L1xcYnR5cGVcXGIoPz1cXHMqKD86W1xceypdfCQpKS9cblx0KTtcblxuXHQvLyBkb2Vzbid0IHdvcmsgd2l0aCBUUyBiZWNhdXNlIFRTIGlzIHRvbyBjb21wbGV4XG5cdGRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMudHlwZXNjcmlwdFsncGFyYW1ldGVyJ107XG5cdGRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMudHlwZXNjcmlwdFsnbGl0ZXJhbC1wcm9wZXJ0eSddO1xuXG5cdC8vIGEgdmVyc2lvbiBvZiB0eXBlc2NyaXB0IHNwZWNpZmljYWxseSBmb3IgaGlnaGxpZ2h0aW5nIHR5cGVzXG5cdHZhciB0eXBlSW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgndHlwZXNjcmlwdCcsIHt9KTtcblx0ZGVsZXRlIHR5cGVJbnNpZGVbJ2NsYXNzLW5hbWUnXTtcblxuXHRQcmlzbS5sYW5ndWFnZXMudHlwZXNjcmlwdFsnY2xhc3MtbmFtZSddLmluc2lkZSA9IHR5cGVJbnNpZGU7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgndHlwZXNjcmlwdCcsICdmdW5jdGlvbicsIHtcblx0XHQnZGVjb3JhdG9yJzoge1xuXHRcdFx0cGF0dGVybjogL0BbJFxcd1xceEEwLVxcdUZGRkZdKy8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2F0Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eQC8sXG5cdFx0XHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHRcdFx0fSxcblx0XHRcdFx0J2Z1bmN0aW9uJzogL15bXFxzXFxTXSsvXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnZ2VuZXJpYy1mdW5jdGlvbic6IHtcblx0XHRcdC8vIGUuZy4gZm9vPFQgZXh0ZW5kcyBcImJhclwiIHwgXCJiYXpcIj4oIC4uLlxuXHRcdFx0cGF0dGVybjogLyM/KD8hXFxzKVtfJGEtekEtWlxceEEwLVxcdUZGRkZdKD86KD8hXFxzKVskXFx3XFx4QTAtXFx1RkZGRl0pKlxccyo8KD86W148Pl18PCg/OltePD5dfDxbXjw+XSo+KSo+KSo+KD89XFxzKlxcKCkvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdmdW5jdGlvbic6IC9eIz8oPyFcXHMpW18kYS16QS1aXFx4QTAtXFx1RkZGRl0oPzooPyFcXHMpWyRcXHdcXHhBMC1cXHVGRkZGXSkqLyxcblx0XHRcdFx0J2dlbmVyaWMnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLzxbXFxzXFxTXSsvLCAvLyBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCA8XG5cdFx0XHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJyxcblx0XHRcdFx0XHRpbnNpZGU6IHR5cGVJbnNpZGVcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnRzID0gUHJpc20ubGFuZ3VhZ2VzLnR5cGVzY3JpcHQ7XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBqYXZhc2NyaXB0ID0gUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHQ7XG5cblx0dmFyIHR5cGUgPSAvXFx7KD86W157fV18XFx7KD86W157fV18XFx7W157fV0qXFx9KSpcXH0pK1xcfS8uc291cmNlO1xuXHR2YXIgcGFyYW1ldGVyUHJlZml4ID0gJyhAKD86YXJnfGFyZ3VtZW50fHBhcmFtfHByb3BlcnR5KVxcXFxzKyg/OicgKyB0eXBlICsgJ1xcXFxzKyk/KSc7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmpzZG9jID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnamF2YWRvY2xpa2UnLCB7XG5cdFx0J3BhcmFtZXRlcic6IHtcblx0XHRcdC8vIEBwYXJhbSB7c3RyaW5nfSBmb28gLSBmb28gYmFyXG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAocGFyYW1ldGVyUHJlZml4ICsgLyg/Oig/IVxccylbJFxcd1xceEEwLVxcdUZGRkYuXSkrKD89XFxzfCQpLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnanNkb2MnLCAna2V5d29yZCcsIHtcblx0XHQnb3B0aW9uYWwtcGFyYW1ldGVyJzoge1xuXHRcdFx0Ly8gQHBhcmFtIHtzdHJpbmd9IFtiYXouZm9vPVwiYmFyXCJdIGZvbyBiYXJcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChwYXJhbWV0ZXJQcmVmaXggKyAvXFxbKD86KD8hXFxzKVskXFx3XFx4QTAtXFx1RkZGRi5dKSsoPzo9W15bXFxdXSspP1xcXSg/PVxcc3wkKS8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3BhcmFtZXRlcic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5cXFspWyRcXHdcXHhBMC1cXHVGRkZGXFwuXSsvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J2NvZGUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyg9KVtcXHNcXFNdKig/PVxcXSQpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZTogamF2YXNjcmlwdCxcblx0XHRcdFx0XHRhbGlhczogJ2xhbmd1YWdlLWphdmFzY3JpcHQnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bPVtcXF1dL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2NsYXNzLW5hbWUnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKEAoPzphdWdtZW50c3xjbGFzc3xleHRlbmRzfGludGVyZmFjZXxtZW1iZXJvZiE/fHRlbXBsYXRlfHRoaXN8dHlwZWRlZilcXHMrKD86PFRZUEU+XFxzKyk/KVtBLVpdXFx3Kig/OlxcLltBLVpdXFx3KikqLy5zb3VyY2UucmVwbGFjZSgvPFRZUEU+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHR5cGU7IH0pKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKCcoQFthLXpdK1xcXFxzKyknICsgdHlwZSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdzdHJpbmcnOiBqYXZhc2NyaXB0LnN0cmluZyxcblx0XHRcdFx0XHQnbnVtYmVyJzogamF2YXNjcmlwdC5udW1iZXIsXG5cdFx0XHRcdFx0J2Jvb2xlYW4nOiBqYXZhc2NyaXB0LmJvb2xlYW4sXG5cdFx0XHRcdFx0J2tleXdvcmQnOiBQcmlzbS5sYW5ndWFnZXMudHlwZXNjcmlwdC5rZXl3b3JkLFxuXHRcdFx0XHRcdCdvcGVyYXRvcic6IC89PnxcXC5cXC5cXC58WyZ8PzoqXS8sXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1suLDs9PD57fSgpW1xcXV0vXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXHRcdCdleGFtcGxlJzoge1xuXHRcdFx0cGF0dGVybjogLyhAZXhhbXBsZVxccysoPyFcXHMpKSg/OlteQFxcc118XFxzKyg/IVxccykpKz8oPz1cXHMqKD86XFwqXFxzKik/KD86QFxcd3xcXCpcXC8pKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdjb2RlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eKFtcXHQgXSooPzpcXCpcXHMqKT8pXFxTLiokL20sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IGphdmFzY3JpcHQsXG5cdFx0XHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1qYXZhc2NyaXB0J1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuamF2YWRvY2xpa2UuYWRkU3VwcG9ydCgnamF2YXNjcmlwdCcsIFByaXNtLmxhbmd1YWdlcy5qc2RvYyk7XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2phdmFzY3JpcHQnLCAnZnVuY3Rpb24tdmFyaWFibGUnLCB7XG5cdFx0J21ldGhvZC12YXJpYWJsZSc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnKFxcXFwuXFxcXHMqKScgKyBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFsnZnVuY3Rpb24tdmFyaWFibGUnXS5wYXR0ZXJuLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6IFsnZnVuY3Rpb24tdmFyaWFibGUnLCAnbWV0aG9kJywgJ2Z1bmN0aW9uJywgJ3Byb3BlcnR5LWFjY2VzcyddXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdqYXZhc2NyaXB0JywgJ2Z1bmN0aW9uJywge1xuXHRcdCdtZXRob2QnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJyhcXFxcLlxcXFxzKiknICsgUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRbJ2Z1bmN0aW9uJ10uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogWydmdW5jdGlvbicsICdwcm9wZXJ0eS1hY2Nlc3MnXVxuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnamF2YXNjcmlwdCcsICdjb25zdGFudCcsIHtcblx0XHQna25vd24tY2xhc3MtbmFtZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gc3RhbmRhcmQgYnVpbHQtaW5zXG5cdFx0XHRcdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzXG5cdFx0XHRcdHBhdHRlcm46IC9cXGIoPzooPzpGbG9hdCg/OjMyfDY0KXwoPzpJbnR8VWludCkoPzo4fDE2fDMyKXxVaW50OENsYW1wZWQpP0FycmF5fEFycmF5QnVmZmVyfEJpZ0ludHxCb29sZWFufERhdGFWaWV3fERhdGV8RXJyb3J8RnVuY3Rpb258SW50bHxKU09OfCg/OldlYWspPyg/Ok1hcHxTZXQpfE1hdGh8TnVtYmVyfE9iamVjdHxQcm9taXNlfFByb3h5fFJlZmxlY3R8UmVnRXhwfFN0cmluZ3xTeW1ib2x8V2ViQXNzZW1ibHkpXFxiLyxcblx0XHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gZXJyb3JzXG5cdFx0XHRcdHBhdHRlcm46IC9cXGIoPzpbQS1aXVxcdyopRXJyb3JcXGIvLFxuXHRcdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdFx0XHR9XG5cdFx0XVxuXHR9KTtcblxuXHQvKipcblx0ICogUmVwbGFjZXMgdGhlIGA8SUQ+YCBwbGFjZWhvbGRlciBpbiB0aGUgZ2l2ZW4gcGF0dGVybiB3aXRoIGEgcGF0dGVybiBmb3IgZ2VuZXJhbCBKUyBpZGVudGlmaWVycy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2ZsYWdzXVxuXHQgKiBAcmV0dXJucyB7UmVnRXhwfVxuXHQgKi9cblx0ZnVuY3Rpb24gd2l0aElkKHNvdXJjZSwgZmxhZ3MpIHtcblx0XHRyZXR1cm4gUmVnRXhwKFxuXHRcdFx0c291cmNlLnJlcGxhY2UoLzxJRD4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gLyg/IVxccylbXyRhLXpBLVpcXHhBMC1cXHVGRkZGXSg/Oig/IVxccylbJFxcd1xceEEwLVxcdUZGRkZdKSovLnNvdXJjZTsgfSksXG5cdFx0XHRmbGFncyk7XG5cdH1cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnamF2YXNjcmlwdCcsICdrZXl3b3JkJywge1xuXHRcdCdpbXBvcnRzJzoge1xuXHRcdFx0Ly8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pbXBvcnRzXG5cdFx0XHRwYXR0ZXJuOiB3aXRoSWQoLyhcXGJpbXBvcnRcXGJcXHMqKSg/OjxJRD4oPzpcXHMqLFxccyooPzpcXCpcXHMqYXNcXHMrPElEPnxcXHtbXnt9XSpcXH0pKT98XFwqXFxzKmFzXFxzKzxJRD58XFx7W157fV0qXFx9KSg/PVxccypcXGJmcm9tXFxiKS8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0XG5cdFx0fSxcblx0XHQnZXhwb3J0cyc6IHtcblx0XHRcdC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZXhwb3J0c1xuXHRcdFx0cGF0dGVybjogd2l0aElkKC8oXFxiZXhwb3J0XFxiXFxzKikoPzpcXCooPzpcXHMqYXNcXHMrPElEPik/KD89XFxzKlxcYmZyb21cXGIpfFxce1tee31dKlxcfSkvLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFxuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRbJ2tleXdvcmQnXS51bnNoaWZ0KFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzphc3xkZWZhdWx0fGV4cG9ydHxmcm9tfGltcG9ydClcXGIvLFxuXHRcdFx0YWxpYXM6ICdtb2R1bGUnXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86YXdhaXR8YnJlYWt8Y2F0Y2h8Y29udGludWV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxpZnxyZXR1cm58c3dpdGNofHRocm93fHRyeXx3aGlsZXx5aWVsZClcXGIvLFxuXHRcdFx0YWxpYXM6ICdjb250cm9sLWZsb3cnXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFxibnVsbFxcYi8sXG5cdFx0XHRhbGlhczogWydudWxsJywgJ25pbCddXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFxidW5kZWZpbmVkXFxiLyxcblx0XHRcdGFsaWFzOiAnbmlsJ1xuXHRcdH1cblx0KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdqYXZhc2NyaXB0JywgJ29wZXJhdG9yJywge1xuXHRcdCdzcHJlYWQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwuezN9Lyxcblx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0fSxcblx0XHQnYXJyb3cnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvPT4vLFxuXHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2phdmFzY3JpcHQnLCAncHVuY3R1YXRpb24nLCB7XG5cdFx0J3Byb3BlcnR5LWFjY2Vzcyc6IHtcblx0XHRcdHBhdHRlcm46IHdpdGhJZCgvKFxcLlxccyopIz88SUQ+Ly5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J21heWJlLWNsYXNzLW5hbWUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W14kXFx3XFx4QTAtXFx1RkZGRl0pW0EtWl1bJFxcd1xceEEwLVxcdUZGRkZdKy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnZG9tJzoge1xuXHRcdFx0Ly8gdGhpcyBjb250YWlucyBvbmx5IGEgZmV3IGNvbW1vbmx5IHVzZWQgRE9NIHZhcmlhYmxlc1xuXHRcdFx0cGF0dGVybjogL1xcYig/OmRvY3VtZW50fCg/OmxvY2FsfHNlc3Npb24pU3RvcmFnZXxsb2NhdGlvbnxuYXZpZ2F0b3J8cGVyZm9ybWFuY2V8d2luZG93KVxcYi8sXG5cdFx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHRcdH0sXG5cdFx0J2NvbnNvbGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiY29uc29sZSg/PVxccypcXC4pLyxcblx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0XHR9XG5cdH0pO1xuXG5cblx0Ly8gYWRkICdtYXliZS1jbGFzcy1uYW1lJyB0byB0b2tlbnMgd2hpY2ggbWlnaHQgYmUgYSBjbGFzcyBuYW1lXG5cdHZhciBtYXliZUNsYXNzTmFtZVRva2VucyA9IFsnZnVuY3Rpb24nLCAnZnVuY3Rpb24tdmFyaWFibGUnLCAnbWV0aG9kJywgJ21ldGhvZC12YXJpYWJsZScsICdwcm9wZXJ0eS1hY2Nlc3MnXTtcblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IG1heWJlQ2xhc3NOYW1lVG9rZW5zLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIHRva2VuID0gbWF5YmVDbGFzc05hbWVUb2tlbnNbaV07XG5cdFx0dmFyIHZhbHVlID0gUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRbdG9rZW5dO1xuXG5cdFx0Ly8gY29udmVydCByZWdleCB0byBvYmplY3Rcblx0XHRpZiAoUHJpc20udXRpbC50eXBlKHZhbHVlKSA9PT0gJ1JlZ0V4cCcpIHtcblx0XHRcdHZhbHVlID0gUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRbdG9rZW5dID0ge1xuXHRcdFx0XHRwYXR0ZXJuOiB2YWx1ZVxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyBrZWVwIGluIG1pbmQgdGhhdCB3ZSBkb24ndCBzdXBwb3J0IGFycmF5c1xuXG5cdFx0dmFyIGluc2lkZSA9IHZhbHVlLmluc2lkZSB8fCB7fTtcblx0XHR2YWx1ZS5pbnNpZGUgPSBpbnNpZGU7XG5cblx0XHRpbnNpZGVbJ21heWJlLWNsYXNzLW5hbWUnXSA9IC9eW0EtWl1bXFxzXFxTXSovO1xuXHR9XG5cbn0oUHJpc20pKTtcblxuLy8gaHR0cHM6Ly93d3cuanNvbi5vcmcvanNvbi1lbi5odG1sXG5QcmlzbS5sYW5ndWFnZXMuanNvbiA9IHtcblx0J3Byb3BlcnR5Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVwiKD86XFxcXC58W15cXFxcXCJcXHJcXG5dKSpcIig/PVxccyo6KS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcIig/OlxcXFwufFteXFxcXFwiXFxyXFxuXSkqXCIoPyFcXHMqOikvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXC9cXC8uKnxcXC9cXCpbXFxzXFxTXSo/KD86XFwqXFwvfCQpLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J251bWJlcic6IC8tP1xcYlxcZCsoPzpcXC5cXGQrKT8oPzplWystXT9cXGQrKT9cXGIvaSxcblx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF0sXS8sXG5cdCdvcGVyYXRvcic6IC86Lyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQnbnVsbCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxibnVsbFxcYi8sXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9XG59O1xuXG5QcmlzbS5sYW5ndWFnZXMud2VibWFuaWZlc3QgPSBQcmlzbS5sYW5ndWFnZXMuanNvbjtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBzdHJpbmcgPSAvKFwifCcpKD86XFxcXCg/Olxcclxcbj98XFxufC4pfCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5qc29uNSA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2pzb24nLCB7XG5cdFx0J3Byb3BlcnR5JzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoc3RyaW5nLnNvdXJjZSArICcoPz1cXFxccyo6KScpLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oPyFcXHMpW18kYS16QS1aXFx4QTAtXFx1RkZGRl0oPzooPyFcXHMpWyRcXHdcXHhBMC1cXHVGRkZGXSkqKD89XFxzKjopLyxcblx0XHRcdFx0YWxpYXM6ICd1bnF1b3RlZCdcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiBzdHJpbmcsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdudW1iZXInOiAvWystXT9cXGIoPzpOYU58SW5maW5pdHl8MHhbYS1mQS1GXFxkXSspXFxifFsrLV0/KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OltlRV1bKy1dP1xcZCtcXGIpPy9cblx0fSk7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmpzb25wID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnanNvbicsIHtcblx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF0oKTssLl0vXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnanNvbnAnLCAncHVuY3R1YXRpb24nLCB7XG5cdCdmdW5jdGlvbic6IC8oPyFcXHMpW18kYS16QS1aXFx4QTAtXFx1RkZGRl0oPzooPyFcXHMpWyRcXHdcXHhBMC1cXHVGRkZGXSkqKD89XFxzKlxcKCkvXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmpzc3RhY2t0cmFjZSA9IHtcblx0J2Vycm9yLW1lc3NhZ2UnOiB7XG5cdFx0cGF0dGVybjogL15cXFMuKi9tLFxuXHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHR9LFxuXG5cdCdzdGFjay1mcmFtZSc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0rKWF0WyBcXHRdLiovbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J25vdC1teS1jb2RlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXmF0WyBcXHRdKyg/IVxccykoPzpub2RlXFwuanN8PHVua25vd24+fC4qKD86bm9kZV9tb2R1bGVzfFxcKDxhbm9ueW1vdXM+XFwpfFxcKDx1bmtub3duPnw8YW5vbnltb3VzPiR8XFwoaW50ZXJuYWxcXC98XFwobm9kZVxcLmpzKSkuKi9tLFxuXHRcdFx0XHRhbGlhczogJ2NvbW1lbnQnXG5cdFx0XHR9LFxuXG5cdFx0XHQnZmlsZW5hbWUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFxiYXRcXHMrKD8hXFxzKXxcXCgpKD86W2EtekEtWl06KT9bXigpOl0rKD89OikvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ3VybCdcblx0XHRcdH0sXG5cblx0XHRcdCdmdW5jdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogLyhcXGJhdFxccysoPzpuZXdcXHMrKT8pKD8hXFxzKVtfJGEtekEtWlxceEEwLVxcdUZGRkY8XVsuJFxcd1xceEEwLVxcdUZGRkY8Pl0qLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1soKV0vLFxuXG5cdFx0XHQna2V5d29yZCc6IC9cXGIoPzphdHxuZXcpXFxiLyxcblxuXHRcdFx0J2FsaWFzJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxbKD86YXNcXHMrKT8oPyFcXHMpW18kYS16QS1aXFx4QTAtXFx1RkZGRl1bJFxcd1xceEEwLVxcdUZGRkZdKlxcXS8sXG5cdFx0XHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdFx0XHR9LFxuXG5cdFx0XHQnbGluZS1udW1iZXInOiB7XG5cdFx0XHRcdHBhdHRlcm46IC86XFxkKyg/OjpcXGQrKT9cXGIvLFxuXHRcdFx0XHRhbGlhczogJ251bWJlcicsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC86L1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0fVxuXHR9XG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIHRlbXBsYXRlU3RyaW5nID0gUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRbJ3RlbXBsYXRlLXN0cmluZyddO1xuXG5cdC8vIHNlZSB0aGUgcGF0dGVybiBpbiBwcmlzbS1qYXZhc2NyaXB0LmpzXG5cdHZhciB0ZW1wbGF0ZUxpdGVyYWxQYXR0ZXJuID0gdGVtcGxhdGVTdHJpbmcucGF0dGVybi5zb3VyY2U7XG5cdHZhciBpbnRlcnBvbGF0aW9uT2JqZWN0ID0gdGVtcGxhdGVTdHJpbmcuaW5zaWRlWydpbnRlcnBvbGF0aW9uJ107XG5cdHZhciBpbnRlcnBvbGF0aW9uUHVuY3R1YXRpb25PYmplY3QgPSBpbnRlcnBvbGF0aW9uT2JqZWN0Lmluc2lkZVsnaW50ZXJwb2xhdGlvbi1wdW5jdHVhdGlvbiddO1xuXHR2YXIgaW50ZXJwb2xhdGlvblBhdHRlcm4gPSBpbnRlcnBvbGF0aW9uT2JqZWN0LnBhdHRlcm4uc291cmNlO1xuXG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgcGF0dGVybiB0byBtYXRjaCBhIHRlbXBsYXRlIHN0cmluZyB3aXRoIGEgc3BlY2lhbCB0YWcuXG5cdCAqXG5cdCAqIFRoaXMgd2lsbCByZXR1cm4gYHVuZGVmaW5lZGAgaWYgdGhlcmUgaXMgbm8gZ3JhbW1hciB3aXRoIHRoZSBnaXZlbiBsYW5ndWFnZSBpZC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlIFRoZSBsYW5ndWFnZSBpZCBvZiB0aGUgZW1iZWRkZWQgbGFuZ3VhZ2UuIEUuZy4gYG1hcmtkb3duYC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgcmVnZXggcGF0dGVybiB0byBtYXRjaCB0aGUgdGFnLlxuXHQgKiBAcmV0dXJucyB7b2JqZWN0IHwgdW5kZWZpbmVkfVxuXHQgKiBAZXhhbXBsZVxuXHQgKiBjcmVhdGVUZW1wbGF0ZSgnY3NzJywgL1xcYmNzcy8uc291cmNlKTtcblx0ICovXG5cdGZ1bmN0aW9uIGNyZWF0ZVRlbXBsYXRlKGxhbmd1YWdlLCB0YWcpIHtcblx0XHRpZiAoIVByaXNtLmxhbmd1YWdlc1tsYW5ndWFnZV0pIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnKCg/OicgKyB0YWcgKyAnKVxcXFxzKiknICsgdGVtcGxhdGVMaXRlcmFsUGF0dGVybiksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCd0ZW1wbGF0ZS1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXmB8YCQvLFxuXHRcdFx0XHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnZW1iZWRkZWQtY29kZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0XHRhbGlhczogbGFuZ3VhZ2Vcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXG5cdFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0Wyd0ZW1wbGF0ZS1zdHJpbmcnXSA9IFtcblx0XHQvLyBzdHlsZWQtanN4OlxuXHRcdC8vICAgY3NzYGEgeyBjb2xvcjogIzI1RjsgfWBcblx0XHQvLyBzdHlsZWQtY29tcG9uZW50czpcblx0XHQvLyAgIHN0eWxlZC5oMWBjb2xvcjogcmVkO2Bcblx0XHRjcmVhdGVUZW1wbGF0ZSgnY3NzJywgL1xcYig/OnN0eWxlZCg/OlxcKFteKV0qXFwpKT8oPzpcXHMqXFwuXFxzKlxcdysoPzpcXChbXildKlxcKSkqKSp8Y3NzKD86XFxzKlxcLlxccyooPzpnbG9iYWx8cmVzb2x2ZSkpP3xjcmVhdGVHbG9iYWxTdHlsZXxrZXlmcmFtZXMpLy5zb3VyY2UpLFxuXG5cdFx0Ly8gaHRtbGA8cD48L3A+YFxuXHRcdC8vIGRpdi5pbm5lckhUTUwgPSBgPHA+PC9wPmBcblx0XHRjcmVhdGVUZW1wbGF0ZSgnaHRtbCcsIC9cXGJodG1sfFxcLlxccyooPzppbm5lcnxvdXRlcilIVE1MXFxzKlxcKz89Ly5zb3VyY2UpLFxuXG5cdFx0Ly8gc3ZnYDxwYXRoIGZpbGw9XCIjZmZmXCIgZD1cIk01NS4zNyAuLi5cIi8+YFxuXHRcdGNyZWF0ZVRlbXBsYXRlKCdzdmcnLCAvXFxic3ZnLy5zb3VyY2UpLFxuXG5cdFx0Ly8gbWRgIyBoMWAsIG1hcmtkb3duYCMjIGgyYFxuXHRcdGNyZWF0ZVRlbXBsYXRlKCdtYXJrZG93bicsIC9cXGIoPzptYXJrZG93bnxtZCkvLnNvdXJjZSksXG5cblx0XHQvLyBncWxgLi4uYCwgZ3JhcGhxbGAuLi5gLCBncmFwaHFsLmV4cGVyaW1lbnRhbGAuLi5gXG5cdFx0Y3JlYXRlVGVtcGxhdGUoJ2dyYXBocWwnLCAvXFxiKD86Z3FsfGdyYXBocWwoPzpcXHMqXFwuXFxzKmV4cGVyaW1lbnRhbCk/KS8uc291cmNlKSxcblxuXHRcdC8vIHNxbGAuLi5gXG5cdFx0Y3JlYXRlVGVtcGxhdGUoJ3NxbCcsIC9cXGJzcWwvLnNvdXJjZSksXG5cblx0XHQvLyB2YW5pbGxhIHRlbXBsYXRlIHN0cmluZ1xuXHRcdHRlbXBsYXRlU3RyaW5nXG5cdF0uZmlsdGVyKEJvb2xlYW4pO1xuXG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBzcGVjaWZpYyBwbGFjZWhvbGRlciBsaXRlcmFsIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudGVyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZVxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKi9cblx0ZnVuY3Rpb24gZ2V0UGxhY2Vob2xkZXIoY291bnRlciwgbGFuZ3VhZ2UpIHtcblx0XHRyZXR1cm4gJ19fXycgKyBsYW5ndWFnZS50b1VwcGVyQ2FzZSgpICsgJ18nICsgY291bnRlciArICdfX18nO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHRva2VucyBvZiBgUHJpc20udG9rZW5pemVgIGJ1dCBhbHNvIHJ1bnMgdGhlIGBiZWZvcmUtdG9rZW5pemVgIGFuZCBgYWZ0ZXItdG9rZW5pemVgIGhvb2tzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY29kZVxuXHQgKiBAcGFyYW0ge2FueX0gZ3JhbW1hclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2Vcblx0ICogQHJldHVybnMgeyhzdHJpbmd8VG9rZW4pW119XG5cdCAqL1xuXHRmdW5jdGlvbiB0b2tlbml6ZVdpdGhIb29rcyhjb2RlLCBncmFtbWFyLCBsYW5ndWFnZSkge1xuXHRcdHZhciBlbnYgPSB7XG5cdFx0XHRjb2RlOiBjb2RlLFxuXHRcdFx0Z3JhbW1hcjogZ3JhbW1hcixcblx0XHRcdGxhbmd1YWdlOiBsYW5ndWFnZVxuXHRcdH07XG5cdFx0UHJpc20uaG9va3MucnVuKCdiZWZvcmUtdG9rZW5pemUnLCBlbnYpO1xuXHRcdGVudi50b2tlbnMgPSBQcmlzbS50b2tlbml6ZShlbnYuY29kZSwgZW52LmdyYW1tYXIpO1xuXHRcdFByaXNtLmhvb2tzLnJ1bignYWZ0ZXItdG9rZW5pemUnLCBlbnYpO1xuXHRcdHJldHVybiBlbnYudG9rZW5zO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHRva2VuIG9mIHRoZSBnaXZlbiBKYXZhU2NyaXB0IGludGVycG9sYXRpb24gZXhwcmVzc2lvbi5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gVGhlIGNvZGUgb2YgdGhlIGV4cHJlc3Npb24uIEUuZy4gYFwiJHs0Mn1cImBcblx0ICogQHJldHVybnMge1Rva2VufVxuXHQgKi9cblx0ZnVuY3Rpb24gdG9rZW5pemVJbnRlcnBvbGF0aW9uRXhwcmVzc2lvbihleHByZXNzaW9uKSB7XG5cdFx0dmFyIHRlbXBHcmFtbWFyID0ge307XG5cdFx0dGVtcEdyYW1tYXJbJ2ludGVycG9sYXRpb24tcHVuY3R1YXRpb24nXSA9IGludGVycG9sYXRpb25QdW5jdHVhdGlvbk9iamVjdDtcblxuXHRcdC8qKiBAdHlwZSB7QXJyYXl9ICovXG5cdFx0dmFyIHRva2VucyA9IFByaXNtLnRva2VuaXplKGV4cHJlc3Npb24sIHRlbXBHcmFtbWFyKTtcblx0XHRpZiAodG9rZW5zLmxlbmd0aCA9PT0gMykge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgdG9rZW4gYXJyYXkgd2lsbCBsb29rIGxpa2UgdGhpc1xuXHRcdFx0ICogW1xuXHRcdFx0ICogICAgIFtcImludGVycG9sYXRpb24tcHVuY3R1YXRpb25cIiwgXCIke1wiXVxuXHRcdFx0ICogICAgIFwiLi4uXCIgLy8gSmF2YVNjcmlwdCBleHByZXNzaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uXG5cdFx0XHQgKiAgICAgW1wiaW50ZXJwb2xhdGlvbi1wdW5jdHVhdGlvblwiLCBcIn1cIl1cblx0XHRcdCAqIF1cblx0XHRcdCAqL1xuXG5cdFx0XHR2YXIgYXJncyA9IFsxLCAxXTtcblx0XHRcdGFyZ3MucHVzaC5hcHBseShhcmdzLCB0b2tlbml6ZVdpdGhIb29rcyh0b2tlbnNbMV0sIFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0LCAnamF2YXNjcmlwdCcpKTtcblxuXHRcdFx0dG9rZW5zLnNwbGljZS5hcHBseSh0b2tlbnMsIGFyZ3MpO1xuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgUHJpc20uVG9rZW4oJ2ludGVycG9sYXRpb24nLCB0b2tlbnMsIGludGVycG9sYXRpb25PYmplY3QuYWxpYXMsIGV4cHJlc3Npb24pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRva2VuaXplcyB0aGUgZ2l2ZW4gY29kZSB3aXRoIHN1cHBvcnQgZm9yIEphdmFTY3JpcHQgaW50ZXJwb2xhdGlvbiBleHByZXNzaW9ucyBtaXhlZCBpbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBoYXMgMyBwaGFzZXM6XG5cdCAqXG5cdCAqIDEuIFJlcGxhY2UgYWxsIEphdmFTY3JpcHQgaW50ZXJwb2xhdGlvbiBleHByZXNzaW9uIHdpdGggYSBwbGFjZWhvbGRlci5cblx0ICogICAgVGhlIHBsYWNlaG9sZGVyIHdpbGwgaGF2ZSB0aGUgc3ludGF4IG9mIGEgaWRlbnRpZnkgb2YgdGhlIHRhcmdldCBsYW5ndWFnZS5cblx0ICogMi4gVG9rZW5pemUgdGhlIGNvZGUgd2l0aCBwbGFjZWhvbGRlcnMuXG5cdCAqIDMuIFRva2VuaXplIHRoZSBpbnRlcnBvbGF0aW9uIGV4cHJlc3Npb25zIGFuZCByZS1pbnNlcnQgdGhlbSBpbnRvIHRoZSB0b2tlbml6ZSBjb2RlLlxuXHQgKiAgICBUaGUgaW5zZXJ0aW9uIG9ubHkgd29ya3MgaWYgYSBwbGFjZWhvbGRlciBoYXNuJ3QgYmVlbiBcInJpcHBlZCBhcGFydFwiIG1lYW5pbmcgdGhhdCB0aGUgcGxhY2Vob2xkZXIgaGFzIGJlZW5cblx0ICogICAgdG9rZW5pemVkIGFzIHR3byB0b2tlbnMgYnkgdGhlIGdyYW1tYXIgb2YgdGhlIGVtYmVkZGVkIGxhbmd1YWdlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY29kZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gZ3JhbW1hclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2Vcblx0ICogQHJldHVybnMge1Rva2VufVxuXHQgKi9cblx0ZnVuY3Rpb24gdG9rZW5pemVFbWJlZGRlZChjb2RlLCBncmFtbWFyLCBsYW5ndWFnZSkge1xuXHRcdC8vIDEuIEZpcnN0IGZpbHRlciBvdXQgYWxsIGludGVycG9sYXRpb25zXG5cblx0XHQvLyBiZWNhdXNlIHRoZXkgbWlnaHQgYmUgZXNjYXBlZCwgd2UgbmVlZCBhIGxvb2tiZWhpbmQsIHNvIHdlIHVzZSBQcmlzbVxuXHRcdC8qKiBAdHlwZSB7KFRva2VufHN0cmluZylbXX0gKi9cblx0XHR2YXIgX3Rva2VucyA9IFByaXNtLnRva2VuaXplKGNvZGUsIHtcblx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoaW50ZXJwb2xhdGlvblBhdHRlcm4pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyByZXBsYWNlIGFsbCBpbnRlcnBvbGF0aW9ucyB3aXRoIGEgcGxhY2Vob2xkZXIgd2hpY2ggaXMgbm90IGluIHRoZSBjb2RlIGFscmVhZHlcblx0XHR2YXIgcGxhY2Vob2xkZXJDb3VudGVyID0gMDtcblx0XHQvKiogQHR5cGUge09iamVjdDxzdHJpbmcsIHN0cmluZz59ICovXG5cdFx0dmFyIHBsYWNlaG9sZGVyTWFwID0ge307XG5cdFx0dmFyIGVtYmVkZGVkQ29kZSA9IF90b2tlbnMubWFwKGZ1bmN0aW9uICh0b2tlbikge1xuXHRcdFx0aWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0cmV0dXJuIHRva2VuO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIGludGVycG9sYXRpb25FeHByZXNzaW9uID0gdG9rZW4uY29udGVudDtcblxuXHRcdFx0XHR2YXIgcGxhY2Vob2xkZXI7XG5cdFx0XHRcdHdoaWxlIChjb2RlLmluZGV4T2YocGxhY2Vob2xkZXIgPSBnZXRQbGFjZWhvbGRlcihwbGFjZWhvbGRlckNvdW50ZXIrKywgbGFuZ3VhZ2UpKSAhPT0gLTEpIHsgLyogbm9vcCAqLyB9XG5cdFx0XHRcdHBsYWNlaG9sZGVyTWFwW3BsYWNlaG9sZGVyXSA9IGludGVycG9sYXRpb25FeHByZXNzaW9uO1xuXHRcdFx0XHRyZXR1cm4gcGxhY2Vob2xkZXI7XG5cdFx0XHR9XG5cdFx0fSkuam9pbignJyk7XG5cblxuXHRcdC8vIDIuIFRva2VuaXplIHRoZSBlbWJlZGRlZCBjb2RlXG5cblx0XHR2YXIgZW1iZWRkZWRUb2tlbnMgPSB0b2tlbml6ZVdpdGhIb29rcyhlbWJlZGRlZENvZGUsIGdyYW1tYXIsIGxhbmd1YWdlKTtcblxuXG5cdFx0Ly8gMy4gUmUtaW5zZXJ0IHRoZSBpbnRlcnBvbGF0aW9uXG5cblx0XHR2YXIgcGxhY2Vob2xkZXJzID0gT2JqZWN0LmtleXMocGxhY2Vob2xkZXJNYXApO1xuXHRcdHBsYWNlaG9sZGVyQ291bnRlciA9IDA7XG5cblx0XHQvKipcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7KFRva2VufHN0cmluZylbXX0gdG9rZW5zXG5cdFx0ICogQHJldHVybnMge3ZvaWR9XG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gd2Fsa1Rva2Vucyh0b2tlbnMpIHtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChwbGFjZWhvbGRlckNvdW50ZXIgPj0gcGxhY2Vob2xkZXJzLmxlbmd0aCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciB0b2tlbiA9IHRva2Vuc1tpXTtcblxuXHRcdFx0XHRpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdG9rZW4uY29udGVudCA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0XHR2YXIgcGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcnNbcGxhY2Vob2xkZXJDb3VudGVyXTtcblx0XHRcdFx0XHR2YXIgcyA9IHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycgPyB0b2tlbiA6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAodG9rZW4uY29udGVudCk7XG5cblx0XHRcdFx0XHR2YXIgaW5kZXggPSBzLmluZGV4T2YocGxhY2Vob2xkZXIpO1xuXHRcdFx0XHRcdGlmIChpbmRleCAhPT0gLTEpIHtcblx0XHRcdFx0XHRcdCsrcGxhY2Vob2xkZXJDb3VudGVyO1xuXG5cdFx0XHRcdFx0XHR2YXIgYmVmb3JlID0gcy5zdWJzdHJpbmcoMCwgaW5kZXgpO1xuXHRcdFx0XHRcdFx0dmFyIG1pZGRsZSA9IHRva2VuaXplSW50ZXJwb2xhdGlvbkV4cHJlc3Npb24ocGxhY2Vob2xkZXJNYXBbcGxhY2Vob2xkZXJdKTtcblx0XHRcdFx0XHRcdHZhciBhZnRlciA9IHMuc3Vic3RyaW5nKGluZGV4ICsgcGxhY2Vob2xkZXIubGVuZ3RoKTtcblxuXHRcdFx0XHRcdFx0dmFyIHJlcGxhY2VtZW50ID0gW107XG5cdFx0XHRcdFx0XHRpZiAoYmVmb3JlKSB7XG5cdFx0XHRcdFx0XHRcdHJlcGxhY2VtZW50LnB1c2goYmVmb3JlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJlcGxhY2VtZW50LnB1c2gobWlkZGxlKTtcblx0XHRcdFx0XHRcdGlmIChhZnRlcikge1xuXHRcdFx0XHRcdFx0XHR2YXIgYWZ0ZXJUb2tlbnMgPSBbYWZ0ZXJdO1xuXHRcdFx0XHRcdFx0XHR3YWxrVG9rZW5zKGFmdGVyVG9rZW5zKTtcblx0XHRcdFx0XHRcdFx0cmVwbGFjZW1lbnQucHVzaC5hcHBseShyZXBsYWNlbWVudCwgYWZ0ZXJUb2tlbnMpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRcdFx0XHR0b2tlbnMuc3BsaWNlLmFwcGx5KHRva2VucywgW2ksIDFdLmNvbmNhdChyZXBsYWNlbWVudCkpO1xuXHRcdFx0XHRcdFx0XHRpICs9IHJlcGxhY2VtZW50Lmxlbmd0aCAtIDE7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR0b2tlbi5jb250ZW50ID0gcmVwbGFjZW1lbnQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHZhciBjb250ZW50ID0gdG9rZW4uY29udGVudDtcblx0XHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShjb250ZW50KSkge1xuXHRcdFx0XHRcdFx0d2Fsa1Rva2Vucyhjb250ZW50KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0d2Fsa1Rva2VucyhbY29udGVudF0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHR3YWxrVG9rZW5zKGVtYmVkZGVkVG9rZW5zKTtcblxuXHRcdHJldHVybiBuZXcgUHJpc20uVG9rZW4obGFuZ3VhZ2UsIGVtYmVkZGVkVG9rZW5zLCAnbGFuZ3VhZ2UtJyArIGxhbmd1YWdlLCBjb2RlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbGFuZ3VhZ2VzIGZvciB3aGljaCBKUyB0ZW1wbGF0aW5nIHdpbGwgaGFuZGxlIHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFscy5cblx0ICpcblx0ICogSlMgdGVtcGxhdGluZyBpc24ndCBhY3RpdmUgZm9yIG9ubHkgSmF2YVNjcmlwdCBidXQgYWxzbyByZWxhdGVkIGxhbmd1YWdlcyBsaWtlIFR5cGVTY3JpcHQsIEpTWCwgYW5kIFRTWC5cblx0ICovXG5cdHZhciBzdXBwb3J0ZWRMYW5ndWFnZXMgPSB7XG5cdFx0J2phdmFzY3JpcHQnOiB0cnVlLFxuXHRcdCdqcyc6IHRydWUsXG5cdFx0J3R5cGVzY3JpcHQnOiB0cnVlLFxuXHRcdCd0cyc6IHRydWUsXG5cdFx0J2pzeCc6IHRydWUsXG5cdFx0J3RzeCc6IHRydWUsXG5cdH07XG5cdFByaXNtLmhvb2tzLmFkZCgnYWZ0ZXItdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0aWYgKCEoZW52Lmxhbmd1YWdlIGluIHN1cHBvcnRlZExhbmd1YWdlcykpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBGaW5kcyBhbmQgdG9rZW5pemVzIGFsbCB0ZW1wbGF0ZSBzdHJpbmdzIHdpdGggYW4gZW1iZWRkZWQgbGFuZ3VhZ2VzLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHsoVG9rZW4gfCBzdHJpbmcpW119IHRva2Vuc1xuXHRcdCAqIEByZXR1cm5zIHt2b2lkfVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGZpbmRUZW1wbGF0ZVN0cmluZ3ModG9rZW5zKSB7XG5cdFx0XHRmb3IgKHZhciBpID0gMCwgbCA9IHRva2Vucy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdFx0dmFyIHRva2VuID0gdG9rZW5zW2ldO1xuXG5cdFx0XHRcdGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgY29udGVudCA9IHRva2VuLmNvbnRlbnQ7XG5cdFx0XHRcdGlmICghQXJyYXkuaXNBcnJheShjb250ZW50KSkge1xuXHRcdFx0XHRcdGlmICh0eXBlb2YgY29udGVudCAhPT0gJ3N0cmluZycpIHtcblx0XHRcdFx0XHRcdGZpbmRUZW1wbGF0ZVN0cmluZ3MoW2NvbnRlbnRdKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodG9rZW4udHlwZSA9PT0gJ3RlbXBsYXRlLXN0cmluZycpIHtcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBBIEphdmFTY3JpcHQgdGVtcGxhdGUtc3RyaW5nIHRva2VuIHdpbGwgbG9vayBsaWtlIHRoaXM6XG5cdFx0XHRcdFx0ICpcblx0XHRcdFx0XHQgKiBbXCJ0ZW1wbGF0ZS1zdHJpbmdcIiwgW1xuXHRcdFx0XHRcdCAqICAgICBbXCJ0ZW1wbGF0ZS1wdW5jdHVhdGlvblwiLCBcImBcIl0sXG5cdFx0XHRcdFx0ICogICAgIChcblx0XHRcdFx0XHQgKiAgICAgICAgIEFuIGFycmF5IG9mIFwic3RyaW5nXCIgYW5kIFwiaW50ZXJwb2xhdGlvblwiIHRva2Vucy4gVGhpcyBpcyB0aGUgc2ltcGxlIHN0cmluZyBjYXNlLlxuXHRcdFx0XHRcdCAqICAgICAgICAgb3Jcblx0XHRcdFx0XHQgKiAgICAgICAgIFtcImVtYmVkZGVkLWNvZGVcIiwgXCIuLi5cIl0gVGhpcyBpcyB0aGUgdG9rZW4gY29udGFpbmluZyB0aGUgZW1iZWRkZWQgY29kZS5cblx0XHRcdFx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBhbHNvIGhhcyBhbiBhbGlhcyB3aGljaCBpcyB0aGUgbGFuZ3VhZ2Ugb2YgdGhlIGVtYmVkZGVkIGNvZGUuXG5cdFx0XHRcdFx0ICogICAgICksXG5cdFx0XHRcdFx0ICogICAgIFtcInRlbXBsYXRlLXB1bmN0dWF0aW9uXCIsIFwiYFwiXVxuXHRcdFx0XHRcdCAqIF1dXG5cdFx0XHRcdFx0ICovXG5cblx0XHRcdFx0XHR2YXIgZW1iZWRkZWQgPSBjb250ZW50WzFdO1xuXHRcdFx0XHRcdGlmIChjb250ZW50Lmxlbmd0aCA9PT0gMyAmJiB0eXBlb2YgZW1iZWRkZWQgIT09ICdzdHJpbmcnICYmIGVtYmVkZGVkLnR5cGUgPT09ICdlbWJlZGRlZC1jb2RlJykge1xuXHRcdFx0XHRcdFx0Ly8gZ2V0IHN0cmluZyBjb250ZW50XG5cdFx0XHRcdFx0XHR2YXIgY29kZSA9IHN0cmluZ0NvbnRlbnQoZW1iZWRkZWQpO1xuXG5cdFx0XHRcdFx0XHR2YXIgYWxpYXMgPSBlbWJlZGRlZC5hbGlhcztcblx0XHRcdFx0XHRcdHZhciBsYW5ndWFnZSA9IEFycmF5LmlzQXJyYXkoYWxpYXMpID8gYWxpYXNbMF0gOiBhbGlhcztcblxuXHRcdFx0XHRcdFx0dmFyIGdyYW1tYXIgPSBQcmlzbS5sYW5ndWFnZXNbbGFuZ3VhZ2VdO1xuXHRcdFx0XHRcdFx0aWYgKCFncmFtbWFyKSB7XG5cdFx0XHRcdFx0XHRcdC8vIHRoZSBlbWJlZGRlZCBsYW5ndWFnZSBpc24ndCByZWdpc3RlcmVkLlxuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y29udGVudFsxXSA9IHRva2VuaXplRW1iZWRkZWQoY29kZSwgZ3JhbW1hciwgbGFuZ3VhZ2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRmaW5kVGVtcGxhdGVTdHJpbmdzKGNvbnRlbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZmluZFRlbXBsYXRlU3RyaW5ncyhlbnYudG9rZW5zKTtcblx0fSk7XG5cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgc3RyaW5nIGNvbnRlbnQgb2YgYSB0b2tlbiBvciB0b2tlbiBzdHJlYW0uXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nIHwgVG9rZW4gfCAoc3RyaW5nIHwgVG9rZW4pW119IHZhbHVlXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdCAqL1xuXHRmdW5jdGlvbiBzdHJpbmdDb250ZW50KHZhbHVlKSB7XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWUubWFwKHN0cmluZ0NvbnRlbnQpLmpvaW4oJycpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gc3RyaW5nQ29udGVudCh2YWx1ZS5jb250ZW50KTtcblx0XHR9XG5cdH1cblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuanVsaWEgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdC8vIHN1cHBvcnQgb25lIGxldmVsIG9mIG5lc3RlZCBjb21tZW50c1xuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9KdWxpYUxhbmcvanVsaWEvcHVsbC82MTI4XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pKD86Iz0oPzpbXiM9XXw9KD8hIyl8Iyg/IT0pfCM9KD86W14jPV18PSg/ISMpfCMoPyE9KSkqPSMpKj0jfCMuKikvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J3JlZ2V4Jzoge1xuXHRcdC8vIGh0dHBzOi8vZG9jcy5qdWxpYWxhbmcub3JnL2VuL3YxL21hbnVhbC9zdHJpbmdzLyNSZWd1bGFyLUV4cHJlc3Npb25zLTFcblx0XHRwYXR0ZXJuOiAvclwiKD86XFxcXC58W15cIlxcXFxcXHJcXG5dKSpcIltpbXN4XXswLDR9Lyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHQvLyBodHRwczovL2RvY3MuanVsaWFsYW5nLm9yZy9lbi92MS9tYW51YWwvc3RyaW5ncy8jU3RyaW5nLUJhc2ljcy0xXG5cdFx0Ly8gaHR0cHM6Ly9kb2NzLmp1bGlhbGFuZy5vcmcvZW4vdjEvbWFudWFsL3N0cmluZ3MvI25vbi1zdGFuZGFyZC1zdHJpbmctbGl0ZXJhbHMtMVxuXHRcdC8vIGh0dHBzOi8vZG9jcy5qdWxpYWxhbmcub3JnL2VuL3YxL21hbnVhbC9ydW5uaW5nLWV4dGVybmFsLXByb2dyYW1zLyNSdW5uaW5nLUV4dGVybmFsLVByb2dyYW1zLTFcblx0XHRwYXR0ZXJuOiAvXCJcIlwiW1xcc1xcU10rP1wiXCJcInwoPzpcXGJcXHcrKT9cIig/OlxcXFwufFteXCJcXFxcXFxyXFxuXSkqXCJ8YCg/OlteXFxcXGBcXHJcXG5dfFxcXFwuKSpgLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NoYXInOiB7XG5cdFx0Ly8gaHR0cHM6Ly9kb2NzLmp1bGlhbGFuZy5vcmcvZW4vdjEvbWFudWFsL3N0cmluZ3MvI21hbi1jaGFyYWN0ZXJzLTFcblx0XHRwYXR0ZXJuOiAvKF58W15cXHcnXSknKD86XFxcXFteXFxyXFxuXVteJ1xcclxcbl0qfFteXFxcXFxcclxcbl0pJy8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86YWJzdHJhY3R8YmFyZW1vZHVsZXxiZWdpbnxiaXRzdHlwZXxicmVha3xjYXRjaHxjY2FsbHxjb25zdHxjb250aW51ZXxkb3xlbHNlfGVsc2VpZnxlbmR8ZXhwb3J0fGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufGdsb2JhbHxpZnxpbW11dGFibGV8aW1wb3J0fGltcG9ydGFsbHxpbnxsZXR8bG9jYWx8bWFjcm98bW9kdWxlfHByaW50fHByaW50bG58cXVvdGV8cmV0dXJufHN0cnVjdHx0cnl8dHlwZXx0eXBlYWxpYXN8dXNpbmd8d2hpbGUpXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQnbnVtYmVyJzogLyg/OlxcYig/PVxcZCl8XFxCKD89XFwuKSkoPzowW2JveF0pPyg/OltcXGRhLWZdKyg/Ol9bXFxkYS1mXSspKig/OlxcLig/OlxcZCsoPzpfXFxkKykqKT8pP3xcXC5cXGQrKD86X1xcZCspKikoPzpbZWZwXVsrLV0/XFxkKyg/Ol9cXGQrKSopP2o/L2ksXG5cdC8vIGh0dHBzOi8vZG9jcy5qdWxpYWxhbmcub3JnL2VuL3YxL21hbnVhbC9tYXRoZW1hdGljYWwtb3BlcmF0aW9ucy9cblx0Ly8gaHR0cHM6Ly9kb2NzLmp1bGlhbGFuZy5vcmcvZW4vdjEvbWFudWFsL21hdGhlbWF0aWNhbC1vcGVyYXRpb25zLyNPcGVyYXRvci1QcmVjZWRlbmNlLWFuZC1Bc3NvY2lhdGl2aXR5LTFcblx0J29wZXJhdG9yJzogLyYmfFxcfFxcfHxbLSsqXiVcdTAwRjdcdTIyQkImJFxcXFxdPT98XFwvW1xcLz1dP3whPT89P3xcXHxbPT5dP3w8KD86PD0/fFs9OnxdKT98Pig/Oj18Pj4/PT8pP3w9PT89P3xbflx1MjI2MFx1MjI2NFx1MjI2NSdcdTIyMUFcdTIyMUJdLyxcblx0J3B1bmN0dWF0aW9uJzogLzo6P3xbe31bXFxdKCk7LC4/XS8sXG5cdC8vIGh0dHBzOi8vZG9jcy5qdWxpYWxhbmcub3JnL2VuL3YxL2Jhc2UvbnVtYmVycy8jQmFzZS5pbVxuXHQnY29uc3RhbnQnOiAvXFxiKD86KD86SW5mfE5hTikoPzoxNnwzMnw2NCk/fGltfHBpKVxcYnxbXHUwM0MwXHUyMTJGXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5rZWVwYWxpdmVkID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvWyMhXS4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkoPzpcIig/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfFteXCJcXFxcXFxyXFxuXSkqXCJ8Jyg/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfFteJ1xcXFxcXHJcXG5dKSonKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQvLyBzdXBwb3J0IElQdjQsIElQdjYsIHN1Ym5ldCBtYXNrXG5cdCdpcCc6IHtcblx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHQvXFxiKD86KD86KD86W1xcZGEtZl17MSw0fTopezd9W1xcZGEtZl17MSw0fXwoPzpbXFxkYS1mXXsxLDR9Oil7Nn06W1xcZGEtZl17MSw0fXwoPzpbXFxkYS1mXXsxLDR9Oil7NX06KD86W1xcZGEtZl17MSw0fTopP1tcXGRhLWZdezEsNH18KD86W1xcZGEtZl17MSw0fTopezR9Oig/OltcXGRhLWZdezEsNH06KXswLDJ9W1xcZGEtZl17MSw0fXwoPzpbXFxkYS1mXXsxLDR9Oil7M306KD86W1xcZGEtZl17MSw0fTopezAsM31bXFxkYS1mXXsxLDR9fCg/OltcXGRhLWZdezEsNH06KXsyfTooPzpbXFxkYS1mXXsxLDR9Oil7MCw0fVtcXGRhLWZdezEsNH18KD86W1xcZGEtZl17MSw0fTopezZ9PGlwdjQ+fCg/OltcXGRhLWZdezEsNH06KXswLDV9OjxpcHY0Pnw6Oig/OltcXGRhLWZdezEsNH06KXswLDV9PGlwdjQ+fFtcXGRhLWZdezEsNH06Oig/OltcXGRhLWZdezEsNH06KXswLDV9W1xcZGEtZl17MSw0fXw6Oig/OltcXGRhLWZdezEsNH06KXswLDZ9W1xcZGEtZl17MSw0fXwoPzpbXFxkYS1mXXsxLDR9Oil7MSw3fTopKD86XFwvXFxkezEsM30pP3w8aXB2ND4oPzpcXC9cXGR7MSwyfSk/KVxcYi8uc291cmNlXG5cdFx0XHRcdC5yZXBsYWNlKC88aXB2ND4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gLyg/Oig/Oig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV1cXGR8XFxkKVxcLil7M30oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldXFxkfFxcZCkpLy5zb3VyY2U7IH0pLFxuXHRcdFx0J2knXG5cdFx0KSxcblx0XHRhbGlhczogJ251bWJlcidcblx0fSxcblxuXHQvLyBzdXBwb3J0ICpuaXggLyBXaW5kb3dzLCBkaXJlY3RvcnkgLyBmaWxlXG5cdCdwYXRoJzoge1xuXHRcdHBhdHRlcm46IC8oXFxzKVxcLyg/OlteXFwvXFxzXStcXC8pKlteXFwvXFxzXSp8XFxiW2EtekEtWl06XFxcXCg/OlteXFxcXFxcc10rXFxcXCkqW15cXFxcXFxzXSovLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHR9LFxuXHQndmFyaWFibGUnOiAvXFwkXFx7P1xcdytcXH0/Lyxcblx0J2VtYWlsJzoge1xuXHRcdHBhdHRlcm46IC9bXFx3LV0rQFtcXHctXSsoPzpcXC5bXFx3LV17MiwzfSl7MSwyfS8sXG5cdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHR9LFxuXHQnY29uZGl0aW9uYWwtY29uZmlndXJhdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvQFxcXj9bXFx3LV0rLyxcblx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHR9LFxuXHQnb3BlcmF0b3InOiAvPS8sXG5cblx0J3Byb3BlcnR5JzogL1xcYig/OkJGRF9DSEVDS3xETlNfQ0hFQ0t8RklMRV9DSEVDS3xIVFRQX0dFVHxNSVNDX0NIRUNLfE5BTUV8UElOR19DSEVDS3xTQ1JJUFRTfFNNVFBfQ0hFQ0t8U1NMfFNTTF9HRVR8VENQX0NIRUNLfFVEUF9DSEVDS3xhY2NlcHR8YWR2ZXJ0X2ludHxhbHBoYXxhdXRoX3Bhc3N8YXV0aF90eXBlfGF1dGhlbnRpY2F0aW9ufGJmZF9jcHVfYWZmaW5pdHl8YmZkX2luc3RhbmNlfGJmZF9ub19zd2FwfGJmZF9wcmlvcml0eXxiZmRfcHJvY2Vzc19uYW1lfGJmZF9ybGltaXRfcnR0aW1lfGJmZF9ydF9wcmlvcml0eXxiaW5kX2lmfGJpbmRfcG9ydHxiaW5kdG98Y2F8Y2VydGlmaWNhdGV8Y2hlY2tfdW5pY2FzdF9zcmN8Y2hlY2tlcnxjaGVja2VyX2NwdV9hZmZpbml0eXxjaGVja2VyX2xvZ19hbGxfZmFpbHVyZXN8Y2hlY2tlcl9ub19zd2FwfGNoZWNrZXJfcHJpb3JpdHl8Y2hlY2tlcl9ybGltaXRfcnR0aW1lfGNoZWNrZXJfcnRfcHJpb3JpdHl8Y2hpbGRfd2FpdF90aW1lfGNvbm5lY3RfaXB8Y29ubmVjdF9wb3J0fGNvbm5lY3RfdGltZW91dHxkYnVzX3NlcnZpY2VfbmFtZXxkZWJ1Z3xkZWZhdWx0X2ludGVyZmFjZXxkZWxheXxkZWxheV9iZWZvcmVfcmV0cnl8ZGVsYXlfbG9vcHxkaWdlc3R8ZG9udF90cmFja19wcmltYXJ5fGR5bmFtaWN8ZHluYW1pY19pbnRlcmZhY2VzfGVuYWJsZV8oPzpkYnVzfHNjcmlwdF9zZWN1cml0eXxzbml8c25tcF9jaGVja2VyfHNubXBfcmZjfHNubXBfcmZjdjJ8c25tcF9yZmN2M3xzbm1wX3ZycnB8dHJhcHMpfGVuZHxmYWxsfGZhc3RfcmVjb3Zlcnl8ZmlsZXxmbGFnLVsxMjNdfGZvcmtfZGVsYXl8ZnVsbF9jb21tYW5kfGZ3bWFya3xnYXJwX2dyb3VwfGdhcnBfaW50ZXJ2YWx8Z2FycF9sb3dlcl9wcmlvX2RlbGF5fGdhcnBfbG93ZXJfcHJpb19yZXBlYXR8Z2FycF9tYXN0ZXJfZGVsYXl8Z2FycF9tYXN0ZXJfcmVmcmVzaHxnYXJwX21hc3Rlcl9yZWZyZXNoX3JlcGVhdHxnYXJwX21hc3Rlcl9yZXBlYXR8Z2xvYmFsX2RlZnN8Z2xvYmFsX3RyYWNraW5nfGduYV9pbnRlcnZhbHxncm91cHxoYV9zdXNwZW5kfGhhc2hlZHxoZWxvX25hbWV8aGlnaGVyX3ByaW9fc2VuZF9hZHZlcnR8aG9wbGltaXR8aHR0cF9wcm90b2NvbHxoeXN0ZXJlc2lzfGlkbGVfdHh8aW5jbHVkZXxpbmhpYml0X29uX2ZhaWx1cmV8aW5pdF9mYWlsfGluaXRfZmlsZXxpbnN0YW5jZXxpbnRlcmZhY2V8aW50ZXJmYWNlc3xpbnRlcnZhbHxpcF9mYW1pbHl8aXB2c19wcm9jZXNzX25hbWV8a2VlcGFsaXZlZC5jb25mfGtlcm5lbF9yeF9idWZfc2l6ZXxrZXl8bGlua2JlYXRfaW50ZXJmYWNlc3xsaW5rYmVhdF91c2VfcG9sbGluZ3xsb2dfYWxsX2ZhaWx1cmVzfGxvZ191bmtub3duX3ZyaWRzfGxvd2VyX3ByaW9fbm9fYWR2ZXJ0fGx0aHJlc2hvbGR8bHZzX2ZsdXNofGx2c19mbHVzaF9vbnN0b3B8bHZzX21ldGhvZHxsdnNfbmV0bGlua19jbWRfcmN2X2J1ZnN8bHZzX25ldGxpbmtfY21kX3Jjdl9idWZzX2ZvcmNlfGx2c19uZXRsaW5rX21vbml0b3JfcmN2X2J1ZnN8bHZzX25ldGxpbmtfbW9uaXRvcl9yY3ZfYnVmc19mb3JjZXxsdnNfbm90aWZ5X2ZpZm98bHZzX25vdGlmeV9maWZvX3NjcmlwdHxsdnNfc2NoZWR8bHZzX3N5bmNfZGFlbW9ufG1heF9hdXRvX3ByaW9yaXR5fG1heF9ob3BzfG1jYXN0X3NyY19pcHxtaC1mYWxsYmFja3xtaC1wb3J0fG1pbl9hdXRvX3ByaW9yaXR5X2RlbGF5fG1pbl9yeHxtaW5fdHh8bWlzY19keW5hbWljfG1pc2NfcGF0aHxtaXNjX3RpbWVvdXR8bXVsdGlwbGllcnxuYW1lfG5hbWVzcGFjZV93aXRoX2lwc2V0c3xuYXRpdmVfaXB2NnxuZWlnaGJvcl9pcHxuZXRfbmFtZXNwYWNlfG5ldF9uYW1lc3BhY2VfaXB2c3xuZnRhYmxlc3xuZnRhYmxlc19jb3VudGVyc3xuZnRhYmxlc19pZmluZGV4fG5mdGFibGVzX3ByaW9yaXR5fG5vX2FjY2VwdHxub19jaGVja2VyX2VtYWlsc3xub19lbWFpbF9mYXVsdHN8bm9wcmVlbXB0fG5vdGlmaWNhdGlvbl9lbWFpbHxub3RpZmljYXRpb25fZW1haWxfZnJvbXxub3RpZnl8bm90aWZ5X2JhY2t1cHxub3RpZnlfZGVsZXRlZHxub3RpZnlfZG93bnxub3RpZnlfZmF1bHR8bm90aWZ5X2ZpZm98bm90aWZ5X2ZpZm9fc2NyaXB0fG5vdGlmeV9tYXN0ZXJ8bm90aWZ5X21hc3Rlcl9yeF9sb3dlcl9wcml8bm90aWZ5X3ByaW9yaXR5X2NoYW5nZXN8bm90aWZ5X3N0b3B8bm90aWZ5X3VwfG9sZF91bmljYXN0X2NoZWNrc3VtfG9tZWdhfG9wc3xwYXJhbV9tYXRjaHxwYXNzaXZlfHBhc3N3b3JkfHBhdGh8cGVyc2lzdGVuY2VfZW5naW5lfHBlcnNpc3RlbmNlX2dyYW51bGFyaXR5fHBlcnNpc3RlbmNlX3RpbWVvdXR8cHJlZW1wdHxwcmVlbXB0X2RlbGF5fHByaW9yaXR5fHByb2Nlc3N8cHJvY2Vzc19tb25pdG9yX3Jjdl9idWZzfHByb2Nlc3NfbW9uaXRvcl9yY3ZfYnVmc19mb3JjZXxwcm9jZXNzX25hbWV8cHJvY2Vzc19uYW1lc3xwcm9tb3RlX3NlY29uZGFyaWVzfHByb3RvY29sfHByb3h5X2FycHxwcm94eV9hcnBfcHZsYW58cXVvcnVtfHF1b3J1bV9kb3dufHF1b3J1bV9tYXh8cXVvcnVtX3VwfHJhbmRvbV9zZWVkfHJlYWxfc2VydmVyfHJlZ2V4fHJlZ2V4X21heF9vZmZzZXR8cmVnZXhfbWluX29mZnNldHxyZWdleF9ub19tYXRjaHxyZWdleF9vcHRpb25zfHJlZ2V4X3N0YWNrfHJlbG9hZF9yZXBlYXR8cmVsb2FkX3RpbWVfZmlsZXxyZXF1aXJlX3JlcGx5fHJldHJ5fHJpc2V8cm91dGVyX2lkfHJzX2luaXRfbm90aWZpZXN8c2NyaXB0fHNjcmlwdF91c2VyfHNoLWZhbGxiYWNrfHNoLXBvcnR8c2h1dGRvd25fc2NyaXB0fHNodXRkb3duX3NjcmlwdF90aW1lb3V0fHNraXBfY2hlY2tfYWR2X2FkZHJ8c210cF9hbGVydHxzbXRwX2FsZXJ0X2NoZWNrZXJ8c210cF9hbGVydF92cnJwfHNtdHBfY29ubmVjdF90aW1lb3V0fHNtdHBfaGVsb19uYW1lfHNtdHBfc2VydmVyfHNubXBfc29ja2V0fHNvcnJ5X3NlcnZlcnxzb3JyeV9zZXJ2ZXJfaW5oaWJpdHxzb3JyeV9zZXJ2ZXJfbHZzX21ldGhvZHxzb3VyY2VfaXB8c3RhcnR8c3RhcnR1cF9zY3JpcHR8c3RhcnR1cF9zY3JpcHRfdGltZW91dHxzdGF0ZXxzdGF0aWNfaXBhZGRyZXNzfHN0YXRpY19yb3V0ZXN8c3RhdGljX3J1bGVzfHN0YXR1c19jb2RlfHN0ZXB8c3RyaWN0X21vZGV8c3luY19ncm91cF90cmFja2luZ193ZWlnaHR8dGVybWluYXRlX2RlbGF5fHRpbWVvdXR8dHJhY2tfYmZkfHRyYWNrX2ZpbGV8dHJhY2tfZ3JvdXB8dHJhY2tfaW50ZXJmYWNlfHRyYWNrX3Byb2Nlc3N8dHJhY2tfc2NyaXB0fHRyYWNrX3NyY19pcHx0dGx8dHlwZXx1bWFza3x1bmljYXN0X3BlZXJ8dW5pY2FzdF9zcmNfaXB8dW5pY2FzdF90dGx8dXJsfHVzZV9pcHZsYW58dXNlX3BpZF9kaXJ8dXNlX3ZtYWN8dXNlcnx1dGhyZXNob2xkfHZhbFsxMjNdfHZlcnNpb258dmlydHVhbF9pcGFkZHJlc3N8dmlydHVhbF9pcGFkZHJlc3NfZXhjbHVkZWR8dmlydHVhbF9yb3V0ZXJfaWR8dmlydHVhbF9yb3V0ZXN8dmlydHVhbF9ydWxlc3x2aXJ0dWFsX3NlcnZlcnx2aXJ0dWFsX3NlcnZlcl9ncm91cHx2aXJ0dWFsaG9zdHx2bWFjX3htaXRfYmFzZXx2cnJwfHZycnBfKD86Y2hlY2tfdW5pY2FzdF9zcmN8Y3B1X2FmZmluaXR5fGdhcnBfaW50ZXJ2YWx8Z2FycF9sb3dlcl9wcmlvX2RlbGF5fGdhcnBfbG93ZXJfcHJpb19yZXBlYXR8Z2FycF9tYXN0ZXJfZGVsYXl8Z2FycF9tYXN0ZXJfcmVmcmVzaHxnYXJwX21hc3Rlcl9yZWZyZXNoX3JlcGVhdHxnYXJwX21hc3Rlcl9yZXBlYXR8Z25hX2ludGVydmFsfGhpZ2hlcl9wcmlvX3NlbmRfYWR2ZXJ0fGluc3RhbmNlfGlwc2V0c3xpcHRhYmxlc3xsb3dlcl9wcmlvX25vX2FkdmVydHxtY2FzdF9ncm91cDR8bWNhc3RfZ3JvdXA2fG1pbl9nYXJwfG5ldGxpbmtfY21kX3Jjdl9idWZzfG5ldGxpbmtfY21kX3Jjdl9idWZzX2ZvcmNlfG5ldGxpbmtfbW9uaXRvcl9yY3ZfYnVmc3xuZXRsaW5rX21vbml0b3JfcmN2X2J1ZnNfZm9yY2V8bm9fc3dhcHxub3RpZnlfZmlmb3xub3RpZnlfZmlmb19zY3JpcHR8bm90aWZ5X3ByaW9yaXR5X2NoYW5nZXN8cHJpb3JpdHl8cHJvY2Vzc19uYW1lfHJsaW1pdF9ydHRpbWV8cnRfcHJpb3JpdHl8cnhfYnVmc19tdWx0aXBsaWVyfHJ4X2J1ZnNfcG9saWN5fHNjcmlwdHxza2lwX2NoZWNrX2Fkdl9hZGRyfHN0YXJ0dXBfZGVsYXl8c3RyaWN0fHN5bmNfZ3JvdXB8dHJhY2tfcHJvY2Vzc3x2ZXJzaW9uKXx3YXJtdXB8d2VpZ2h0KVxcYi8sXG5cblx0J2NvbnN0YW50JzogL1xcYig/OkF8QUFBQXxBSHxCQUNLVVB8Q05BTUV8RFJ8TUFTVEVSfE1YfE5BVHxOU3xQQVNTfFNDVFB8U09BfFRDUHxUVU58VFhUfFVEUHxkaHxmb3xsYmxjfGxibGNyfGxjfG1ofG5xfG92ZnxycnxzZWR8c2h8d2xjfHdycilcXGIvLFxuXG5cdCdudW1iZXInOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFx3Li1dKS0/XFxkKyg/OlxcLlxcZCspPy8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfG5vfG9mZnxvbnx0cnVlfHllcylcXGIvLFxuXG5cdCdwdW5jdHVhdGlvbic6IC9bXFx7XFx9XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5rZXltYW4gPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXGJjIC4qL2ksXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiW15cIlxcclxcbl0qXCJ8J1teJ1xcclxcbl0qJy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCd2aXJ0dWFsLWtleSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxbXFxzKig/Oig/OkFMVHxDQVBTfENUUkx8TEFMVHxMQ1RSTHxOQ0FQU3xSQUxUfFJDVFJMfFNISUZUKVxccyspKig/OltUS1VdX1tcXHc/XSt8W0EtRV1cXGRcXGQ/fFwiW15cIlxcclxcbl0qXCJ8J1teJ1xcclxcbl0qJylcXHMqXFxdL2ksXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nIC8vIGFsaWFzIGZvciBzdHlsZXNcblx0fSxcblxuXHQvLyBodHRwczovL2hlbHAua2V5bWFuLmNvbS9kZXZlbG9wZXIvbGFuZ3VhZ2UvZ3VpZGUvaGVhZGVyc1xuXHQnaGVhZGVyLWtleXdvcmQnOiB7XG5cdFx0cGF0dGVybjogLyZcXHcrLyxcblx0XHRhbGlhczogJ2JvbGQnIC8vIGFsaWFzIGZvciBzdHlsZXNcblx0fSxcblx0J2hlYWRlci1zdGF0ZW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OmJpdG1hcHxiaXRtYXBzfGNhcHMgYWx3YXlzIG9mZnxjYXBzIG9uIG9ubHl8Y29weXJpZ2h0fGhvdGtleXxsYW5ndWFnZXxsYXlvdXR8bWVzc2FnZXxuYW1lfHNoaWZ0IGZyZWVzIGNhcHN8dmVyc2lvbilcXGIvaSxcblx0XHRhbGlhczogJ2JvbGQnIC8vIGFsaWFzIGZvciBzdHlsZXNcblx0fSxcblxuXHQncnVsZS1rZXl3b3JkJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzphbnl8YmFzZWxheW91dHxiZWVwfGNhbGx8Y29udGV4dHxkZWFka2V5fGRrfGlmfGluZGV4fGxheWVyfG5vdGFueXxudWx8b3V0c3xwbGF0Zm9ybXxyZXNldHxyZXR1cm58c2F2ZXxzZXR8c3RvcmV8dXNlKVxcYi9pLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J3N0cnVjdHVyYWwta2V5d29yZCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86YW5zaXxiZWdpbnxncm91cHxtYXRjaHxuZXdjb250ZXh0fG5vbWF0Y2h8cG9zdGtleXN0cm9rZXxyZWFkb25seXx1bmljb2RlfHVzaW5nIGtleXMpXFxiL2ksXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXG5cdCdjb21waWxlLXRhcmdldCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwkKD86a2V5bWFufGtleW1hbm9ubHl8a2V5bWFud2VifGttZmx8d2VhdmVyKTovaSxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXG5cdC8vIFUrIyMjIywgeCMjIywgZCMjIyBjaGFyYWN0ZXJzIGFuZCBudW1iZXJzXG5cdCdudW1iZXInOiAvXFxiKD86VVxcK1tcXGRBLUZdK3xkXFxkK3x4W1xcZGEtZl0rfFxcZCspXFxiL2ksXG5cdCdvcGVyYXRvcic6IC9bKz5cXFxcJF18XFwuXFwuLyxcblx0J3B1bmN0dWF0aW9uJzogL1soKT0sXS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0UHJpc20ubGFuZ3VhZ2VzLmtvdGxpbiA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHRcdCdrZXl3b3JkJzoge1xuXHRcdFx0Ly8gVGhlIGxvb2tiZWhpbmQgcHJldmVudHMgd3JvbmcgaGlnaGxpZ2h0aW5nIG9mIGUuZy4ga290bGluLnByb3BlcnRpZXMuZ2V0XG5cdFx0XHRwYXR0ZXJuOiAvKF58W14uXSlcXGIoPzphYnN0cmFjdHxhY3R1YWx8YW5ub3RhdGlvbnxhc3xicmVha3xieXxjYXRjaHxjbGFzc3xjb21wYW5pb258Y29uc3R8Y29uc3RydWN0b3J8Y29udGludWV8Y3Jvc3NpbmxpbmV8ZGF0YXxkb3xkeW5hbWljfGVsc2V8ZW51bXxleHBlY3R8ZXh0ZXJuYWx8ZmluYWx8ZmluYWxseXxmb3J8ZnVufGdldHxpZnxpbXBvcnR8aW58aW5maXh8aW5pdHxpbmxpbmV8aW5uZXJ8aW50ZXJmYWNlfGludGVybmFsfGlzfGxhdGVpbml0fG5vaW5saW5lfG51bGx8b2JqZWN0fG9wZW58b3BlcmF0b3J8b3V0fG92ZXJyaWRlfHBhY2thZ2V8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlaWZpZWR8cmV0dXJufHNlYWxlZHxzZXR8c3VwZXJ8c3VzcGVuZHx0YWlscmVjfHRoaXN8dGhyb3d8dG98dHJ5fHR5cGVhbGlhc3x2YWx8dmFyfHZhcmFyZ3x3aGVufHdoZXJlfHdoaWxlKVxcYi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnZnVuY3Rpb24nOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oPzpgW15cXHJcXG5gXStgfFxcYlxcdyspKD89XFxzKlxcKCkvLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFwuKSg/OmBbXlxcclxcbmBdK2B8XFx3KykoPz1cXHMqXFx7KS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J251bWJlcic6IC9cXGIoPzowW3hYXVtcXGRhLWZBLUZdKyg/Ol9bXFxkYS1mQS1GXSspKnwwW2JCXVswMV0rKD86X1swMV0rKSp8XFxkKyg/Ol9cXGQrKSooPzpcXC5cXGQrKD86X1xcZCspKik/KD86W2VFXVsrLV0/XFxkKyg/Ol9cXGQrKSopP1tmRkxdPylcXGIvLFxuXHRcdCdvcGVyYXRvcic6IC9cXCtbKz1dP3wtWy09Pl0/fD09Pz0/fCEoPzohfD09Pyk/fFtcXC8qJTw+XT0/fFs/Ol06P3xcXC5cXC58JiZ8XFx8XFx8fFxcYig/OmFuZHxpbnZ8b3J8c2hsfHNocnx1c2hyfHhvcilcXGIvXG5cdH0pO1xuXG5cdGRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMua290bGluWydjbGFzcy1uYW1lJ107XG5cblx0dmFyIGludGVycG9sYXRpb25JbnNpZGUgPSB7XG5cdFx0J2ludGVycG9sYXRpb24tcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXlxcJFxcez98XFx9JC8sXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmtvdGxpblxuXHRcdH1cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdrb3RsaW4nLCAnc3RyaW5nJywge1xuXHRcdC8vIGh0dHBzOi8va290bGlubGFuZy5vcmcvc3BlYy9leHByZXNzaW9ucy5odG1sI3N0cmluZy1pbnRlcnBvbGF0aW9uLWV4cHJlc3Npb25zXG5cdFx0J3N0cmluZy1saXRlcmFsJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXCJcIlwiKD86W14kXXxcXCQoPzooPyFcXHspfFxce1tee31dKlxcfSkpKj9cIlwiXCIvLFxuXHRcdFx0XHRhbGlhczogJ211bHRpbGluZScsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1xcJCg/OlthLXpfXVxcdyp8XFx7W157fV0qXFx9KS9pLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiBpbnRlcnBvbGF0aW9uSW5zaWRlXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1wiKD86W15cIlxcXFxcXHJcXG4kXXxcXFxcLnxcXCQoPzooPyFcXHspfFxce1tee31dKlxcfSkpKlwiLyxcblx0XHRcdFx0YWxpYXM6ICdzaW5nbGVsaW5lJyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W15cXFxcXSkoPzpcXFxcezJ9KSopXFwkKD86W2Etel9dXFx3KnxcXHtbXnt9XSpcXH0pL2ksXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiBpbnRlcnBvbGF0aW9uSW5zaWRlXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2NoYXInOiB7XG5cdFx0XHQvLyBodHRwczovL2tvdGxpbmxhbmcub3JnL3NwZWMvZXhwcmVzc2lvbnMuaHRtbCNjaGFyYWN0ZXItbGl0ZXJhbHNcblx0XHRcdHBhdHRlcm46IC8nKD86W14nXFxcXFxcclxcbl18XFxcXCg/Oi58dVthLWZBLUYwLTldezAsNH0pKScvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHR9KTtcblxuXHRkZWxldGUgUHJpc20ubGFuZ3VhZ2VzLmtvdGxpblsnc3RyaW5nJ107XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgna290bGluJywgJ2tleXdvcmQnLCB7XG5cdFx0J2Fubm90YXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxCQCg/Olxcdys6KT8oPzpbQS1aXVxcdyp8XFxbW15cXF1dK1xcXSkvLFxuXHRcdFx0YWxpYXM6ICdidWlsdGluJ1xuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgna290bGluJywgJ2Z1bmN0aW9uJywge1xuXHRcdCdsYWJlbCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGJcXHcrQHxAXFx3K1xcYi8sXG5cdFx0XHRhbGlhczogJ3N5bWJvbCdcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5rdCA9IFByaXNtLmxhbmd1YWdlcy5rb3RsaW47XG5cdFByaXNtLmxhbmd1YWdlcy5rdHMgPSBQcmlzbS5sYW5ndWFnZXMua290bGluO1xufShQcmlzbSkpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSByZWdleHAvbm8tZHVwZS1jaGFyYWN0ZXJzLWNoYXJhY3Rlci1jbGFzcyAqL1xuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdC8qKlxuXHQgKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IGFsbG93ZWQgaW4gaWRlbnRpZmllcnMuXG5cdCAqXG5cdCAqIEB0eXBlIHtzdHJpbmd9XG5cdCAqL1xuXHR2YXIgbm9uSWQgPSAvXFxzXFx4MDAtXFx4MWZcXHgyMi1cXHgyZlxceDNhLVxceDNmXFx4NWItXFx4NWVcXHg2MFxceDdiLVxceDdlLy5zb3VyY2U7XG5cblx0LyoqXG5cdCAqIFN1cnJvdW5kIGEgcmVndWxhciBleHByZXNzaW9uIGZvciBJRHMgd2l0aCBwYXR0ZXJucyBmb3Igbm9uLUlEIHNlcXVlbmNlcy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm4gQSByZWd1bGFyIGV4cHJlc3Npb24gZm9yIGlkZW50aWZpZXJzLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2ZsYWdzXSBUaGUgcmVndWxhciBleHByZXNzaW9uIGZsYWdzLlxuXHQgKiBAcmV0dXJucyB7UmVnRXhwfSBBIHdyYXBwZWQgcmVndWxhciBleHByZXNzaW9uIGZvciBpZGVudGlmaWVycy5cblx0ICovXG5cdGZ1bmN0aW9uIHdyYXBJZChwYXR0ZXJuLCBmbGFncykge1xuXHRcdHJldHVybiBSZWdFeHAocGF0dGVybi5yZXBsYWNlKC88bm9uSWQ+L2csIG5vbklkKSwgZmxhZ3MpO1xuXHR9XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmt1bWlyID0ge1xuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogL1xcfC4qL1xuXHRcdH0sXG5cblx0XHQncHJvbG9nJzoge1xuXHRcdFx0cGF0dGVybjogLyMuKi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9cIlteXFxuXFxyXCJdKlwifCdbXlxcblxcciddKicvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblxuXHRcdCdib29sZWFuJzoge1xuXHRcdFx0cGF0dGVybjogd3JhcElkKC8oXnxbPG5vbklkPl0pKD86XHUwNDM0XHUwNDMwfFx1MDQzRFx1MDQzNVx1MDQ0MikoPz1bPG5vbklkPl18JCkvLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblxuXHRcdCdvcGVyYXRvci13b3JkJzoge1xuXHRcdFx0cGF0dGVybjogd3JhcElkKC8oXnxbPG5vbklkPl0pKD86XHUwNDM4fFx1MDQzOFx1MDQzQlx1MDQzOHxcdTA0M0RcdTA0MzUpKD89Wzxub25JZD5dfCQpLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9LFxuXG5cdFx0J3N5c3RlbS12YXJpYWJsZSc6IHtcblx0XHRcdHBhdHRlcm46IHdyYXBJZCgvKF58Wzxub25JZD5dKVx1MDQzN1x1MDQzRFx1MDQzMFx1MDQ0Nyg/PVs8bm9uSWQ+XXwkKS8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fSxcblxuXHRcdCd0eXBlJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiB3cmFwSWQoLyhefFs8bm9uSWQ+XSkoPzpcdTA0MzJcdTA0MzVcdTA0NDl8XHUwNDNCXHUwNDM4XHUwNDQyfFx1MDQzQlx1MDQzRVx1MDQzM3xcdTA0NDFcdTA0MzhcdTA0M0N8XHUwNDQ2XHUwNDM1XHUwNDNCKSg/OlxceDIwKlx1MDQ0Mlx1MDQzMFx1MDQzMSk/KD89Wzxub25JZD5dfCQpLy5zb3VyY2UpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ2J1aWx0aW4nXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiB3cmFwSWQoLyhefFs8bm9uSWQ+XSkoPzpcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0J8XHUwNDQxXHUwNDNBXHUwNDMwXHUwNDNEXHUwNDNBXHUwNDNFXHUwNDM0fFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQnxcdTA0NDZcdTA0MzJcdTA0MzVcdTA0NDIpKD89Wzxub25JZD5dfCQpLy5zb3VyY2UpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0XHRcdH1cblx0XHRdLFxuXG5cdFx0LyoqXG5cdFx0ICogU2hvdWxkIGJlIHBlcmZvcm1lZCBhZnRlciBzZWFyY2hpbmcgZm9yIHR5cGUgbmFtZXMgYmVjYXVzZSBvZiBcIlx1MDQ0Mlx1MDQzMFx1MDQzMVwiLlxuXHRcdCAqIFwiXHUwNDQyXHUwNDMwXHUwNDMxXCIgaXMgYSByZXNlcnZlZCB3b3JkLCBidXQgbmV2ZXIgdXNlZCB3aXRob3V0IGEgcHJlY2VkaW5nIHR5cGUgbmFtZS5cblx0XHQgKiBcIlx1MDQxRFx1MDQxMFx1MDQxN1x1MDQxRFx1MDQxMFx1MDQyN1x1MDQxOFx1MDQyMlx1MDQyQ1wiLCBcIlx1MDQyNFx1MDQzMlx1MDQzMlx1MDQzRVx1MDQzNFwiLCBhbmQgXCJcdTA0MjRcdTA0MzJcdTA0NEJcdTA0MzJcdTA0M0VcdTA0MzRcIiBhcmUgbm90IHJlc2VydmVkIHdvcmRzLlxuXHRcdCAqL1xuXHRcdCdrZXl3b3JkJzoge1xuXHRcdFx0cGF0dGVybjogd3JhcElkKC8oXnxbPG5vbklkPl0pKD86XHUwNDMwXHUwNDNCXHUwNDMzfFx1MDQzMFx1MDQ0MFx1MDQzMyg/OlxceDIwKlx1MDQ0MFx1MDQzNVx1MDQzNyk/fFx1MDQzMlx1MDQzMlx1MDQzRVx1MDQzNHxcdTA0MTJcdTA0MUFcdTA0MUJcdTA0MkVcdTA0MjdcdTA0MThcdTA0MjJcdTA0MkN8XHUwNDMyXHUwNDQxW1x1MDQzNVx1MDQ1MV18XHUwNDMyXHUwNDRCXHUwNDMxXHUwNDNFXHUwNDQwfFx1MDQzMlx1MDQ0Qlx1MDQzMlx1MDQzRVx1MDQzNHxcdTA0MzJcdTA0NEJcdTA0NDVcdTA0M0VcdTA0MzR8XHUwNDM0XHUwNDMwXHUwNDNEXHUwNDNFfFx1MDQzNFx1MDQzQlx1MDQ0RnxcdTA0MzRcdTA0M0V8XHUwNDM0XHUwNDQxfFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOHxcdTA0MzhcdTA0M0RcdTA0MzBcdTA0NDdcdTA0MzV8XHUwNDM4XHUwNDQxXHUwNDNGfFx1MDQzOFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0Q3xcdTA0M0FcdTA0M0VcdTA0M0QoPzooPzpcXHgyMCt8XylcdTA0MzhcdTA0NDFcdTA0M0YpP3xcdTA0M0FcdTA0NDYoPzooPzpcXHgyMCt8XylcdTA0M0ZcdTA0NDBcdTA0MzgpP3xcdTA0M0RcdTA0MzBcdTA0MzRcdTA0M0V8XHUwNDNEXHUwNDMwXHUwNDQ3fFx1MDQzRFx1MDQ0MXxcdTA0M0RcdTA0NDZ8XHUwNDNFXHUwNDQyfFx1MDQzRlx1MDQzMFx1MDQ0M1x1MDQzN1x1MDQzMHxcdTA0M0ZcdTA0M0VcdTA0M0FcdTA0MzB8XHUwNDNGXHUwNDQwXHUwNDM4fFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzMD98XHUwNDQwXHUwNDM1XHUwNDM3fFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzRnxcdTA0NDJcdTA0MzBcdTA0MzF8XHUwNDQyXHUwNDNFfFx1MDQ0M1x1MDQ0Mlx1MDQzMnxcdTA0NDhcdTA0MzBcdTA0MzMpKD89Wzxub25JZD5dfCQpLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cblx0XHQvKiogU2hvdWxkIGJlIHBlcmZvcm1lZCBhZnRlciBzZWFyY2hpbmcgZm9yIHJlc2VydmVkIHdvcmRzLiAqL1xuXHRcdCduYW1lJzoge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9uby1zdXBlci1saW5lYXItYmFja3RyYWNraW5nXG5cdFx0XHRwYXR0ZXJuOiB3cmFwSWQoLyhefFs8bm9uSWQ+XSlbXlxcZDxub25JZD5dW148bm9uSWQ+XSooPzpcXHgyMCtbXjxub25JZD5dKykqKD89Wzxub25JZD5dfCQpLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cblx0XHQvKiogU2hvdWxkIGJlIHBlcmZvcm1lZCBhZnRlciBzZWFyY2hpbmcgZm9yIG5hbWVzLiAqL1xuXHRcdCdudW1iZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiB3cmFwSWQoLyhefFs8bm9uSWQ+XSkoPzpcXEJcXCRbXFxkYS1mXStcXGJ8KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OmVbKy1dP1xcZCspPykoPz1bPG5vbklkPl18JCkvLnNvdXJjZSwgJ2knKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXG5cdFx0LyoqIFNob3VsZCBiZSBwZXJmb3JtZWQgYWZ0ZXIgc2VhcmNoaW5nIGZvciB3b3Jkcy4gKi9cblx0XHQncHVuY3R1YXRpb24nOiAvOj18WygpLDo7XFxbXFxdXS8sXG5cblx0XHQvKipcblx0XHQgKiBTaG91bGQgYmUgcGVyZm9ybWVkIGFmdGVyIHNlYXJjaGluZyBmb3Jcblx0XHQgKiAtIG51bWVyaWMgY29uc3RhbnRzIChiZWNhdXNlIG9mIFwiK1wiIGFuZCBcIi1cIik7XG5cdFx0ICogLSBwdW5jdHVhdGlvbiBtYXJrcyAoYmVjYXVzZSBvZiBcIjo9XCIgYW5kIFwiPVwiKS5cblx0XHQgKi9cblx0XHQnb3BlcmF0b3ItY2hhcic6IHtcblx0XHRcdHBhdHRlcm46IC9cXCpcXCo/fDxbPT5dP3w+PT98Wy0rLz1dLyxcblx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0fVxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5rdW0gPSBQcmlzbS5sYW5ndWFnZXMua3VtaXI7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmt1c3RvID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwvXFwvLiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9gYGBbXFxzXFxTXSo/YGBgfFtoSF0/KD86XCIoPzpbXlxcclxcblxcXFxcIl18XFxcXC4pKlwifCcoPzpbXlxcclxcblxcXFwnXXxcXFxcLikqJ3xAKD86XCJbXlxcclxcblwiXSpcInwnW15cXHJcXG4nXSonKSkvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCd2ZXJiJzoge1xuXHRcdHBhdHRlcm46IC8oXFx8XFxzKilbYS16XVtcXHctXSovaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblxuXHQnY29tbWFuZCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwuW2Etel1bYS16XFxkLV0qXFxiLyxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cblx0J2NsYXNzLW5hbWUnOiAvXFxiKD86Ym9vbHxkYXRldGltZXxkZWNpbWFsfGR5bmFtaWN8Z3VpZHxpbnR8bG9uZ3xyZWFsfHN0cmluZ3x0aW1lc3BhbilcXGIvLFxuXHQna2V5d29yZCc6IC9cXGIoPzphY2Nlc3N8YWxpYXN8YW5kfGFudGl8YXN8YXNjfGF1dG98YmV0d2VlbnxieXwoPzpjb250YWluc3woPzplbmRzfHN0YXJ0cyl3aXRofGhhcyg/OnBlcmZpeHxzdWZmaXgpPykoPzpfY3MpP3xkYXRhYmFzZXxkZWNsYXJlfGRlc2N8ZXh0ZXJuYWx8ZnJvbXxmdWxsb3V0ZXJ8aGFzX2FsbHxpbnxpbmdlc3Rpb258aW5saW5lfGlubmVyfGlubmVydW5pcXVlfGludG98KD86bGVmdHxyaWdodCkoPzphbnRpKD86c2VtaSk/fGlubmVyfG91dGVyfHNlbWkpP3xsZXR8bGlrZXxsb2NhbHxub3R8b2Z8b258b3J8cGF0dGVybnxwcmludHxxdWVyeV9wYXJhbWV0ZXJzfHJhbmdlfHJlc3RyaWN0fHNjaGVtYXxzZXR8c3RlcHx0YWJsZXx0YWJsZXN8dG98dmlld3x3aGVyZXx3aXRofG1hdGNoZXNcXHMrcmVnZXh8bnVsbHNcXHMrKD86Zmlyc3R8bGFzdCkpKD8hW1xcdy1dKS8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfG51bGx8dHJ1ZSlcXGIvLFxuXG5cdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89XFxzKlxcKCkvLFxuXG5cdCdkYXRldGltZSc6IFtcblx0XHR7XG5cdFx0XHQvLyBSRkMgODIyICsgUkZDIDg1MFxuXHRcdFx0cGF0dGVybjogL1xcYig/Oig/OkZyaXxGcmlkYXl8TW9ufE1vbmRheXxTYXR8U2F0dXJkYXl8U3VufFN1bmRheXxUaHV8VGh1cnNkYXl8VHVlfFR1ZXNkYXl8V2VkfFdlZG5lc2RheSlcXHMqLFxccyopP1xcZHsxLDJ9KD86XFxzK3wtKSg/OkFwcnxBdWd8RGVjfEZlYnxKYW58SnVsfEp1bnxNYXJ8TWF5fE5vdnxPY3R8U2VwKSg/Olxccyt8LSlcXGR7Mn1cXHMrXFxkezJ9OlxcZHsyfSg/OjpcXGR7Mn0pPyg/OlxccyooPzpcXGIoPzpbQS1aXXwoPzpbRUNNVF1bRFNdfEdNfFUpVCl8WystXVxcZHs0fSkpP1xcYi8sXG5cdFx0XHRhbGlhczogJ251bWJlcidcblx0XHR9LFxuXHRcdHtcblx0XHRcdC8vIElTTyA4NjAxXG5cdFx0XHRwYXR0ZXJuOiAvWystXT9cXGIoPzpcXGR7NH0tXFxkezJ9LVxcZHsyfSg/OlsgVF1cXGR7Mn06XFxkezJ9KD86OlxcZHsyfSg/OlxcLlxcZCspPyk/KT98XFxkezJ9OlxcZHsyfSg/OjpcXGR7Mn0oPzpcXC5cXGQrKT8pPylaPy8sXG5cdFx0XHRhbGlhczogJ251bWJlcidcblx0XHR9XG5cdF0sXG5cdCdudW1iZXInOiAvXFxiKD86MHhbMC05QS1GYS1mXSt8XFxkKyg/OlxcLlxcZCspPyg/OltFZV1bKy1dP1xcZCspPykoPzooPzptaW58c2VjfFttblx1MDBCNV1zfFtkaG1zXXxtaWNyb3NlY29uZHx0aWNrKVxcYik/fFsrLV0/XFxiaW5mXFxiLyxcblxuXHQnb3BlcmF0b3InOiAvPT58WyE9XX58WyE9PD5dPT98Wy0rKi8lfF18XFwuXFwuLyxcblx0J3B1bmN0dWF0aW9uJzogL1soKVxcW1xcXXt9LDsuOl0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdHZhciBmdW5jUGF0dGVybiA9IC9cXFxcKD86W15hLXooKVtcXF1dfFthLXoqXSspL2k7XG5cdHZhciBpbnNpZGVFcXUgPSB7XG5cdFx0J2VxdWF0aW9uLWNvbW1hbmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiBmdW5jUGF0dGVybixcblx0XHRcdGFsaWFzOiAncmVnZXgnXG5cdFx0fVxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5sYXRleCA9IHtcblx0XHQnY29tbWVudCc6IC8lLiovLFxuXHRcdC8vIHRoZSB2ZXJiYXRpbSBlbnZpcm9ubWVudCBwcmludHMgd2hpdGVzcGFjZSB0byB0aGUgZG9jdW1lbnRcblx0XHQnY2RhdGEnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcXFxiZWdpblxceygoPzpsc3RsaXN0aW5nfHZlcmJhdGltKVxcKj8pXFx9KVtcXHNcXFNdKj8oPz1cXFxcZW5kXFx7XFwyXFx9KS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQvKlxuXHRcdCAqIGVxdWF0aW9ucyBjYW4gYmUgYmV0d2VlbiAkJCAkJCBvciAkICQgb3IgXFwoIFxcKSBvciBcXFsgXFxdXG5cdFx0ICogKGFsbCBhcmUgbXVsdGlsaW5lKVxuXHRcdCAqL1xuXHRcdCdlcXVhdGlvbic6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcJFxcJCg/OlxcXFxbXFxzXFxTXXxbXlxcXFwkXSkrXFwkXFwkfFxcJCg/OlxcXFxbXFxzXFxTXXxbXlxcXFwkXSkrXFwkfFxcXFxcXChbXFxzXFxTXSo/XFxcXFxcKXxcXFxcXFxbW1xcc1xcU10qP1xcXFxcXF0vLFxuXHRcdFx0XHRpbnNpZGU6IGluc2lkZUVxdSxcblx0XHRcdFx0YWxpYXM6ICdzdHJpbmcnXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcXFxiZWdpblxceygoPzphbGlnbnxlcW5hcnJheXxlcXVhdGlvbnxnYXRoZXJ8bWF0aHxtdWx0bGluZSlcXCo/KVxcfSlbXFxzXFxTXSo/KD89XFxcXGVuZFxce1xcMlxcfSkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IGluc2lkZUVxdSxcblx0XHRcdFx0YWxpYXM6ICdzdHJpbmcnXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQvKlxuXHRcdCAqIGFyZ3VtZW50cyB3aGljaCBhcmUga2V5d29yZHMgb3IgcmVmZXJlbmNlcyBhcmUgaGlnaGxpZ2h0ZWRcblx0XHQgKiBhcyBrZXl3b3Jkc1xuXHRcdCAqL1xuXHRcdCdrZXl3b3JkJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXFxcKD86YmVnaW58Y2l0ZXxkb2N1bWVudGNsYXNzfGVuZHxsYWJlbHxyZWZ8dXNlcGFja2FnZSkoPzpcXFtbXlxcXV0rXFxdKT9cXHspW159XSsoPz1cXH0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCd1cmwnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcXFx1cmxcXHspW159XSsoPz1cXH0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdC8qXG5cdFx0ICogc2VjdGlvbiBvciBjaGFwdGVyIGhlYWRsaW5lcyBhcmUgaGlnaGxpZ2h0ZWQgYXMgYm9sZCBzbyB0aGF0XG5cdFx0ICogdGhleSBzdGFuZCBvdXQgbW9yZVxuXHRcdCAqL1xuXHRcdCdoZWFkbGluZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxcXCg/OmNoYXB0ZXJ8ZnJhbWV0aXRsZXxwYXJhZ3JhcGh8cGFydHxzZWN0aW9ufHN1YnBhcmFncmFwaHxzdWJzZWN0aW9ufHN1YnN1YnBhcmFncmFwaHxzdWJzdWJzZWN0aW9ufHN1YnN1YnN1YnBhcmFncmFwaClcXCo/KD86XFxbW15cXF1dK1xcXSk/XFx7KVtefV0rKD89XFx9KS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHRcdH0sXG5cdFx0J2Z1bmN0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogZnVuY1BhdHRlcm4sXG5cdFx0XHRhbGlhczogJ3NlbGVjdG9yJ1xuXHRcdH0sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1tbXFxde30mXS9cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMudGV4ID0gUHJpc20ubGFuZ3VhZ2VzLmxhdGV4O1xuXHRQcmlzbS5sYW5ndWFnZXMuY29udGV4dCA9IFByaXNtLmxhbmd1YWdlcy5sYXRleDtcbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHRQcmlzbS5sYW5ndWFnZXMubGF0dGUgPSB7XG5cdFx0J2NvbW1lbnQnOiAvXlxce1xcKltcXHNcXFNdKi8sXG5cdFx0J2xhdHRlLXRhZyc6IHtcblx0XHRcdC8vIGh0dHBzOi8vbGF0dGUubmV0dGUub3JnL2VuL3RhZ3Ncblx0XHRcdHBhdHRlcm46IC8oXlxceyg/OlxcLyg/PVthLXpdKSk/KSg/Ols9X118W2Etel1cXHcqXFxiKD8hXFwoKSkvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0XHR9LFxuXHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXlxce1xcLz98XFx9JC8sXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cdFx0J3BocCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXFMoPzpbXFxzXFxTXSpcXFMpPy8sXG5cdFx0XHRhbGlhczogJ2xhbmd1YWdlLXBocCcsXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5waHBcblx0XHR9XG5cdH07XG5cblx0dmFyIG1hcmt1cExhdHRlID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnbWFya3VwJywge30pO1xuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdpbnNpZGUnLCAnYXR0ci12YWx1ZScsIHtcblx0XHQnbi1hdHRyJzoge1xuXHRcdFx0cGF0dGVybjogL246W1xcdy1dKyg/Olxccyo9XFxzKig/OlwiW15cIl0qXCJ8J1teJ10qJ3xbXlxccydcIj49XSspKT8vLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdhdHRyLW5hbWUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15bXlxccz1dKy8sXG5cdFx0XHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdhdHRyLXZhbHVlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC89W1xcc1xcU10rLyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IFtcblx0XHRcdFx0XHRcdFx0L149Lyxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9eKFxccyopW1wiJ118W1wiJ10kLyxcblx0XHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHQncGhwJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxTKD86W1xcc1xcU10qXFxTKT8vLFxuXHRcdFx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5waHBcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHR9XG5cdFx0fSxcblx0fSwgbWFya3VwTGF0dGUudGFnKTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2JlZm9yZS10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRpZiAoZW52Lmxhbmd1YWdlICE9PSAnbGF0dGUnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHZhciBsYXR0ZVBhdHRlcm4gPSAvXFx7XFwqW1xcc1xcU10qP1xcKlxcfXxcXHtbXidcIlxcc3t9Kl0oPzpbXlwiJy97fV18XFwvKD8hWyovXSl8KFwifCcpKD86XFxcXFtcXHNcXFNdfCg/IVxcMSlbXlxcXFxdKSpcXDF8XFwvXFwqKD86W14qXXxcXCooPyFcXC8pKSpcXCpcXC8pKlxcfS9nO1xuXHRcdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS5idWlsZFBsYWNlaG9sZGVycyhlbnYsICdsYXR0ZScsIGxhdHRlUGF0dGVybik7XG5cdFx0ZW52LmdyYW1tYXIgPSBtYXJrdXBMYXR0ZTtcblx0fSk7XG5cblx0UHJpc20uaG9va3MuYWRkKCdhZnRlci10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10udG9rZW5pemVQbGFjZWhvbGRlcnMoZW52LCAnbGF0dGUnKTtcblx0fSk7XG5cbn0oUHJpc20pKTtcblxuLyogRklYTUUgOlxuIDpleHRlbmQoKSBpcyBub3QgaGFuZGxlZCBzcGVjaWZpY2FsbHkgOiBpdHMgaGlnaGxpZ2h0aW5nIGlzIGJ1Z2d5LlxuIE1peGluIHVzYWdlIG11c3QgYmUgaW5zaWRlIGEgcnVsZXNldCB0byBiZSBoaWdobGlnaHRlZC5cbiBBdC1ydWxlcyAoZS5nLiBpbXBvcnQpIGNvbnRhaW5pbmcgaW50ZXJwb2xhdGlvbnMgYXJlIGJ1Z2d5LlxuIERldGFjaGVkIHJ1bGVzZXRzIGFyZSBoaWdobGlnaHRlZCBhcyBhdC1ydWxlcy5cbiBBIGNvbW1lbnQgYmVmb3JlIGEgbWl4aW4gdXNhZ2UgcHJldmVudHMgdGhlIGxhdHRlciB0byBiZSBwcm9wZXJseSBoaWdobGlnaHRlZC5cbiAqL1xuXG5QcmlzbS5sYW5ndWFnZXMubGVzcyA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NzcycsIHtcblx0J2NvbW1lbnQnOiBbXG5cdFx0L1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vLFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVxcL1xcLy4qLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdhdHJ1bGUnOiB7XG5cdFx0cGF0dGVybjogL0BbXFx3LV0oPzpcXCgoPzpbXigpe31dfFxcKFteKCl7fV0qXFwpKSpcXCl8W14oKXt9O1xcc118XFxzKyg/IVxccykpKj8oPz1cXHMqXFx7KS8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvWzooKV0vXG5cdFx0fVxuXHR9LFxuXHQvLyBzZWxlY3RvcnMgYW5kIG1peGlucyBhcmUgY29uc2lkZXJlZCB0aGUgc2FtZVxuXHQnc2VsZWN0b3InOiB7XG5cdFx0cGF0dGVybjogLyg/OkBcXHtbXFx3LV0rXFx9fFtee307XFxzQF0pKD86QFxce1tcXHctXStcXH18XFwoKD86W14oKXt9XXxcXChbXigpe31dKlxcKSkqXFwpfFteKCl7fTtAXFxzXXxcXHMrKD8hXFxzKSkqPyg/PVxccypcXHspLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdC8vIG1peGluIHBhcmFtZXRlcnNcblx0XHRcdCd2YXJpYWJsZSc6IC9AK1tcXHctXSsvXG5cdFx0fVxuXHR9LFxuXG5cdCdwcm9wZXJ0eSc6IC8oPzpAXFx7W1xcdy1dK1xcfXxbXFx3LV0pKyg/OlxcK18/KT8oPz1cXHMqOikvLFxuXHQnb3BlcmF0b3InOiAvWytcXC0qXFwvXS9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdsZXNzJywgJ3Byb3BlcnR5Jywge1xuXHQndmFyaWFibGUnOiBbXG5cdFx0Ly8gVmFyaWFibGUgZGVjbGFyYXRpb24gKHRoZSBjb2xvbiBtdXN0IGJlIGNvbnN1bWVkISlcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvQFtcXHctXStcXHMqOi8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLzovXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIFZhcmlhYmxlIHVzYWdlXG5cdFx0L0BAP1tcXHctXSsvXG5cdF0sXG5cdCdtaXhpbi11c2FnZSc6IHtcblx0XHRwYXR0ZXJuOiAvKFt7O11cXHMqKVsuI10oPyFcXGQpW1xcdy1dLio/KD89Wyg7XSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0fVxufSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0UHJpc20ubGFuZ3VhZ2VzLnNjaGVtZSA9IHtcblx0XHQvLyB0aGlzIHN1cHBvcnRzIFwibm9ybWFsXCIgc2luZ2xlLWxpbmUgY29tbWVudHM6XG5cdFx0Ly8gICA7IGNvbW1lbnRcblx0XHQvLyBhbmQgKHBvdGVudGlhbGx5IG5lc3RlZCkgbXVsdGlsaW5lIGNvbW1lbnRzOlxuXHRcdC8vICAgI3wgY29tbWVudCAjfCBuZXN0ZWQgfCMgc3RpbGwgY29tbWVudCB8I1xuXHRcdC8vIChvbmx5IDEgbGV2ZWwgb2YgbmVzdGluZyBpcyBzdXBwb3J0ZWQpXG5cdFx0J2NvbW1lbnQnOiAvOy4qfCM7XFxzKig/OlxcKCg/OlteKCldfFxcKFteKCldKlxcKSkqXFwpfFxcWyg/OlteXFxbXFxdXXxcXFtbXlxcW1xcXV0qXFxdKSpcXF0pfCNcXHwoPzpbXiN8XXwjKD8hXFx8KXxcXHwoPyEjKXwjXFx8KD86W14jfF18Iyg/IVxcfCl8XFx8KD8hIykpKlxcfCMpKlxcfCMvLFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXFxcXF18XFxcXC4pKlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J3N5bWJvbCc6IHtcblx0XHRcdHBhdHRlcm46IC8nW14oKVxcW1xcXSMnXFxzXSsvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnY2hhcic6IHtcblx0XHRcdHBhdHRlcm46IC8jXFxcXCg/Olt1eF1bYS1mQS1GXFxkXStcXGJ8Wy1hLXpBLVpdK1xcYnxbXFx1RDgwMC1cXHVEQkZGXVtcXHVEQzAwLVxcdURGRkZdfFxcUykvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnbGFtYmRhLXBhcmFtZXRlcic6IFtcblx0XHRcdC8vIGh0dHBzOi8vd3d3LmNzLmNtdS5lZHUvR3JvdXBzL0FJL2h0bWwvcjRycy9yNHJzXzYuaHRtbCNTRUMzMFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W14nYCNdKVsoXFxbXWxhbWJkYVxccyspKD86W158KClcXFtcXF0nXFxzXSt8XFx8KD86W15cXFxcfF18XFxcXC4pKlxcfCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W14nYCNdKVsoXFxbXWxhbWJkYVxccytbKFxcW10pW14oKVxcW1xcXSddKy8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdrZXl3b3JkJzoge1xuXHRcdFx0cGF0dGVybjogLygoPzpefFteJ2AjXSlbKFxcW10pKD86YmVnaW58Y2FzZSg/Oi1sYW1iZGEpP3xjb25kKD86LWV4cGFuZCk/fGRlZmluZSg/Oi1saWJyYXJ5fC1tYWNyb3wtcmVjb3JkLXR5cGV8LXN5bnRheHwtdmFsdWVzKT98ZGVmbWFjcm98ZGVsYXkoPzotZm9yY2UpP3xkb3xlbHNlfGV4Y2VwdHxleHBvcnR8Z3VhcmR8aWZ8aW1wb3J0fGluY2x1ZGUoPzotY2l8LWxpYnJhcnktZGVjbGFyYXRpb25zKT98bGFtYmRhfGxldCg/OnJlYyk/KD86LXN5bnRheHwtdmFsdWVzfFxcKik/fGxldFxcKi12YWx1ZXN8b25seXxwYXJhbWV0ZXJpemV8cHJlZml4fCg/OnF1YXNpLT8pP3F1b3RlfHJlbmFtZXxzZXQhfHN5bnRheC0oPzpjYXNlfHJ1bGVzKXx1bmxlc3N8dW5xdW90ZSg/Oi1zcGxpY2luZyk/fHdoZW4pKD89WygpXFxbXFxdXFxzXXwkKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnYnVpbHRpbic6IHtcblx0XHRcdC8vIGFsbCBmdW5jdGlvbnMgb2YgdGhlIGJhc2UgbGlicmFyeSBvZiBSN1JTIHBsdXMgc29tZSBvZiBidWlsdC1pbnMgb2YgUjVSc1xuXHRcdFx0cGF0dGVybjogLygoPzpefFteJ2AjXSlbKFxcW10pKD86YWJzfGFuZHxhcHBlbmR8YXBwbHl8YXNzb2N8YXNzW3F2XXxiaW5hcnktcG9ydFxcP3xib29sZWFuPT9cXD98Ynl0ZXZlY3Rvcig/Oi1hcHBlbmR8LWNvcHl8LWNvcHkhfC1sZW5ndGh8LXU4LXJlZnwtdTgtc2V0IXxcXD8pP3xjYWFyfGNhZHJ8Y2FsbC13aXRoLSg/OmN1cnJlbnQtY29udGludWF0aW9ufHBvcnR8dmFsdWVzKXxjYWxsXFwvY2N8Y2FyfGNkYXJ8Y2RkcnxjZHJ8Y2VpbGluZ3xjaGFyKD86LT5pbnRlZ2VyfC1yZWFkeVxcP3xcXD98PFxcP3w8PVxcP3w9XFw/fD5cXD98Pj1cXD8pfGNsb3NlLSg/OmlucHV0LXBvcnR8b3V0cHV0LXBvcnR8cG9ydCl8Y29tcGxleFxcP3xjb25zfGN1cnJlbnQtKD86ZXJyb3J8aW5wdXR8b3V0cHV0KS1wb3J0fGRlbm9taW5hdG9yfGR5bmFtaWMtd2luZHxlb2Ytb2JqZWN0XFw/P3xlcVxcP3xlcXVhbFxcP3xlcXZcXD98ZXJyb3J8ZXJyb3Itb2JqZWN0KD86LWlycml0YW50c3wtbWVzc2FnZXxcXD8pfGV2YWx8ZXZlblxcP3xleGFjdCg/Oi1pbnRlZ2VyLXNxcnR8LWludGVnZXJcXD98XFw/KT98ZXhwdHxmZWF0dXJlc3xmaWxlLWVycm9yXFw/fGZsb29yKD86LXF1b3RpZW50fC1yZW1haW5kZXJ8XFwvKT98Zmx1c2gtb3V0cHV0LXBvcnR8Zm9yLWVhY2h8Z2NkfGdldC1vdXRwdXQtKD86Ynl0ZXZlY3RvcnxzdHJpbmcpfGluZXhhY3RcXD8/fGlucHV0LXBvcnQoPzotb3BlblxcP3xcXD8pfGludGVnZXIoPzotPmNoYXJ8XFw/KXxsY218bGVuZ3RofGxpc3QoPzotPnN0cmluZ3wtPnZlY3RvcnwtY29weXwtcmVmfC1zZXQhfC10YWlsfFxcPyk/fG1ha2UtKD86Ynl0ZXZlY3RvcnxsaXN0fHBhcmFtZXRlcnxzdHJpbmd8dmVjdG9yKXxtYXB8bWF4fG1lbWJlcnxtZW1xfG1lbXZ8bWlufG1vZHVsb3xuZWdhdGl2ZVxcP3xuZXdsaW5lfG5vdHxudWxsXFw/fG51bWJlcig/Oi0+c3RyaW5nfFxcPyl8bnVtZXJhdG9yfG9kZFxcP3xvcGVuLSg/OmlucHV0fG91dHB1dCktKD86Ynl0ZXZlY3RvcnxzdHJpbmcpfG9yfG91dHB1dC1wb3J0KD86LW9wZW5cXD98XFw/KXxwYWlyXFw/fHBlZWstY2hhcnxwZWVrLXU4fHBvcnRcXD98cG9zaXRpdmVcXD98cHJvY2VkdXJlXFw/fHF1b3RpZW50fHJhaXNlfHJhaXNlLWNvbnRpbnVhYmxlfHJhdGlvbmFsXFw/fHJhdGlvbmFsaXplfHJlYWQtKD86Ynl0ZXZlY3RvcnxieXRldmVjdG9yIXxjaGFyfGVycm9yXFw/fGxpbmV8c3RyaW5nfHU4KXxyZWFsXFw/fHJlbWFpbmRlcnxyZXZlcnNlfHJvdW5kfHNldC1jW2FkXXIhfHNxdWFyZXxzdHJpbmcoPzotPmxpc3R8LT5udW1iZXJ8LT5zeW1ib2x8LT51dGY4fC0+dmVjdG9yfC1hcHBlbmR8LWNvcHl8LWNvcHkhfC1maWxsIXwtZm9yLWVhY2h8LWxlbmd0aHwtbWFwfC1yZWZ8LXNldCF8XFw/fDxcXD98PD1cXD98PVxcP3w+XFw/fD49XFw/KT98c3Vic3RyaW5nfHN5bWJvbCg/Oi0+c3RyaW5nfFxcP3w9XFw/KXxzeW50YXgtZXJyb3J8dGV4dHVhbC1wb3J0XFw/fHRydW5jYXRlKD86LXF1b3RpZW50fC1yZW1haW5kZXJ8XFwvKT98dTgtcmVhZHlcXD98dXRmOC0+c3RyaW5nfHZhbHVlc3x2ZWN0b3IoPzotPmxpc3R8LT5zdHJpbmd8LWFwcGVuZHwtY29weXwtY29weSF8LWZpbGwhfC1mb3ItZWFjaHwtbGVuZ3RofC1tYXB8LXJlZnwtc2V0IXxcXD8pP3x3aXRoLWV4Y2VwdGlvbi1oYW5kbGVyfHdyaXRlLSg/OmJ5dGV2ZWN0b3J8Y2hhcnxzdHJpbmd8dTgpfHplcm9cXD8pKD89WygpXFxbXFxdXFxzXXwkKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnb3BlcmF0b3InOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W14nYCNdKVsoXFxbXSkoPzpbLSsqJS9dfFs8Pl09P3w9Pj8pKD89WygpXFxbXFxdXFxzXXwkKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnbnVtYmVyJzoge1xuXHRcdFx0Ly8gVGhlIG51bWJlciBwYXR0ZXJuIGZyb20gW3RoZSBSN1JTIHNwZWNdKGh0dHBzOi8vc21hbGwucjdycy5vcmcvYXR0YWNobWVudC9yN3JzLnBkZikuXG5cdFx0XHQvL1xuXHRcdFx0Ly8gPG51bWJlcj4gICAgICA6PSA8bnVtIDI+fDxudW0gOD58PG51bSAxMD58PG51bSAxNj5cblx0XHRcdC8vIDxudW0gUj4gICAgICAgOj0gPHByZWZpeCBSPjxjb21wbGV4IFI+XG5cdFx0XHQvLyA8Y29tcGxleCBSPiAgIDo9IDxyZWFsIFI+KD86QDxyZWFsIFI+fDxpbWFnaW5hcnkgUj4pP3w8aW1hZ2luYXJ5IFI+XG5cdFx0XHQvLyA8aW1hZ2luYXJ5IFI+IDo9IFsrLV0oPzo8dXJlYWwgUj58KD86aW5mfG5hbilcXC4wKT9pXG5cdFx0XHQvLyA8cmVhbCBSPiAgICAgIDo9IFsrLV0/PHVyZWFsIFI+fFsrLV0oPzppbmZ8bmFuKVxcLjBcblx0XHRcdC8vIDx1cmVhbCBSPiAgICAgOj0gPHVpbnQgUj4oPzpcXC88dWludCBSPik/XG5cdFx0XHQvLyAgICAgICAgICAgICAgICB8IDxkZWNpbWFsIFI+XG5cdFx0XHQvL1xuXHRcdFx0Ly8gPGRlY2ltYWwgMTA+ICA6PSAoPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKD86ZVsrLV0/XFxkKyk/XG5cdFx0XHQvLyA8dWludCBSPiAgICAgIDo9IDxkaWdpdCBSPitcblx0XHRcdC8vIDxwcmVmaXggUj4gICAgOj0gPHJhZGl4IFI+KD86I1tlaV0pP3woPzojW2VpXSk/PHJhZGl4IFI+XG5cdFx0XHQvLyA8cmFkaXggMj4gICAgIDo9ICNiXG5cdFx0XHQvLyA8cmFkaXggOD4gICAgIDo9ICNvXG5cdFx0XHQvLyA8cmFkaXggMTA+ICAgIDo9ICg/OiNkKT9cblx0XHRcdC8vIDxyYWRpeCAxNj4gICAgOj0gI3hcblx0XHRcdC8vIDxkaWdpdCAyPiAgICAgOj0gWzAxXVxuXHRcdFx0Ly8gPGRpZ2l0IDg+ICAgICA6PSBbMC03XVxuXHRcdFx0Ly8gPGRpZ2l0IDEwPiAgICA6PSBcXGRcblx0XHRcdC8vIDxkaWdpdCAxNj4gICAgOj0gWzAtOWEtZl1cblx0XHRcdC8vXG5cdFx0XHQvLyBUaGUgcHJvYmxlbSB3aXRoIHRoaXMgZ3JhbW1hciBpcyB0aGF0IHRoZSByZXN1bHRpbmcgcmVnZXggaXMgd2F5IHRvIGNvbXBsZXgsIHNvIHdlIHNpbXBsaWZ5IGJ5IGdyb3VwaW5nIGFsbFxuXHRcdFx0Ly8gbm9uLWRlY2ltYWwgYmFzZXMgdG9nZXRoZXIuIFRoaXMgcmVzdWx0cyBpbiBhIGRlY2ltYWwgKGRlYykgYW5kIGNvbWJpbmVkIGJpbmFyeSwgb2N0YWwsIGFuZCBoZXhhZGVjaW1hbCAoYm94KVxuXHRcdFx0Ly8gcGF0dGVybjpcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChTb3J0ZWRCTkYoe1xuXHRcdFx0XHQnPHVyZWFsIGRlYz4nOiAvXFxkKyg/OlxcL1xcZCspfCg/OlxcZCsoPzpcXC5cXGQqKT98XFwuXFxkKykoPzpbZXNmZGxdWystXT9cXGQrKT8vLnNvdXJjZSxcblx0XHRcdFx0JzxyZWFsIGRlYz4nOiAvWystXT88dXJlYWwgZGVjPnxbKy1dKD86aW5mfG5hbilcXC4wLy5zb3VyY2UsXG5cdFx0XHRcdCc8aW1hZ2luYXJ5IGRlYz4nOiAvWystXSg/Ojx1cmVhbCBkZWM+fCg/OmluZnxuYW4pXFwuMCk/aS8uc291cmNlLFxuXHRcdFx0XHQnPGNvbXBsZXggZGVjPic6IC88cmVhbCBkZWM+KD86QDxyZWFsIGRlYz58PGltYWdpbmFyeSBkZWM+KT98PGltYWdpbmFyeSBkZWM+Ly5zb3VyY2UsXG5cdFx0XHRcdCc8bnVtIGRlYz4nOiAvKD86I2QoPzojW2VpXSk/fCNbZWldKD86I2QpPyk/PGNvbXBsZXggZGVjPi8uc291cmNlLFxuXG5cdFx0XHRcdCc8dXJlYWwgYm94Pic6IC9bMC05YS1mXSsoPzpcXC9bMC05YS1mXSspPy8uc291cmNlLFxuXHRcdFx0XHQnPHJlYWwgYm94Pic6IC9bKy1dPzx1cmVhbCBib3g+fFsrLV0oPzppbmZ8bmFuKVxcLjAvLnNvdXJjZSxcblx0XHRcdFx0JzxpbWFnaW5hcnkgYm94Pic6IC9bKy1dKD86PHVyZWFsIGJveD58KD86aW5mfG5hbilcXC4wKT9pLy5zb3VyY2UsXG5cdFx0XHRcdCc8Y29tcGxleCBib3g+JzogLzxyZWFsIGJveD4oPzpAPHJlYWwgYm94Pnw8aW1hZ2luYXJ5IGJveD4pP3w8aW1hZ2luYXJ5IGJveD4vLnNvdXJjZSxcblx0XHRcdFx0JzxudW0gYm94Pic6IC8jW2JveF0oPzojW2VpXSk/fCg/OiNbZWldKT8jW2JveF08Y29tcGxleCBib3g+Ly5zb3VyY2UsXG5cblx0XHRcdFx0JzxudW1iZXI+JzogLyhefFsoKVxcW1xcXVxcc10pKD86PG51bSBkZWM+fDxudW0gYm94PikoPz1bKClcXFtcXF1cXHNdfCQpLy5zb3VyY2UsXG5cdFx0XHR9KSwgJ2knKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdib29sZWFuJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFsoKVxcW1xcXVxcc10pIyg/OltmdF18ZmFsc2V8dHJ1ZSkoPz1bKClcXFtcXF1cXHNdfCQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdmdW5jdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oKD86XnxbXidgI10pWyhcXFtdKSg/OltefCgpXFxbXFxdJ1xcc10rfFxcfCg/OlteXFxcXHxdfFxcXFwuKSpcXHwpKD89WygpXFxbXFxdXFxzXXwkKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnaWRlbnRpZmllcic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbKClcXFtcXF1cXHNdKVxcfCg/OlteXFxcXHxdfFxcXFwuKSpcXHwoPz1bKClcXFtcXF1cXHNdfCQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bKClcXFtcXF0nXS9cblx0fTtcblxuXHQvKipcblx0ICogR2l2ZW4gYSB0b3BvbG9naWNhbGx5IHNvcnRlZCBCTkYgZ3JhbW1hciwgdGhpcyB3aWxsIHJldHVybiB0aGUgUmVnRXhwIHNvdXJjZSBvZiBsYXN0IHJ1bGUgb2YgdGhlIGdyYW1tYXIuXG5cdCAqXG5cdCAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gZ3JhbW1hclxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKi9cblx0ZnVuY3Rpb24gU29ydGVkQk5GKGdyYW1tYXIpIHtcblx0XHRmb3IgKHZhciBrZXkgaW4gZ3JhbW1hcikge1xuXHRcdFx0Z3JhbW1hcltrZXldID0gZ3JhbW1hcltrZXldLnJlcGxhY2UoLzxbXFx3XFxzXSs+L2csIGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdFx0cmV0dXJuICcoPzonICsgZ3JhbW1hcltrZXldLnRyaW0oKSArICcpJztcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyByZXR1cm4gdGhlIGxhc3QgaXRlbVxuXHRcdHJldHVybiBncmFtbWFyW2tleV07XG5cdH1cblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIHNjaGVtZUV4cHJlc3Npb24gPSAvXFwoKD86W14oKTtcIiNcXFxcXXxcXFxcW1xcc1xcU118Oy4qKD8hLil8XCIoPzpbXlwiXFxcXF18XFxcXC4pKlwifCMoPzpcXHsoPzooPyEjXFx9KVtcXHNcXFNdKSojXFx9fFtee10pfDxleHByPikqXFwpLy5zb3VyY2U7XG5cdC8vIGFsbG93IGZvciB1cCB0byBwb3coMiwgcmVjdXJzaXZlbmVzc0xvZzIpIG1hbnkgbGV2ZWxzIG9mIHJlY3Vyc2l2ZSBicmFjZSBleHByZXNzaW9uc1xuXHQvLyBGb3Igc29tZSByZWFzb24sIHRoaXMgY2FuJ3QgYmUgNFxuXHR2YXIgcmVjdXJzaXZlbmVzc0xvZzIgPSA1O1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IHJlY3Vyc2l2ZW5lc3NMb2cyOyBpKyspIHtcblx0XHRzY2hlbWVFeHByZXNzaW9uID0gc2NoZW1lRXhwcmVzc2lvbi5yZXBsYWNlKC88ZXhwcj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gc2NoZW1lRXhwcmVzc2lvbjsgfSk7XG5cdH1cblx0c2NoZW1lRXhwcmVzc2lvbiA9IHNjaGVtZUV4cHJlc3Npb24ucmVwbGFjZSgvPGV4cHI+L2csIC9bXlxcc1xcU10vLnNvdXJjZSk7XG5cblxuXHR2YXIgbGlseXBvbmQgPSBQcmlzbS5sYW5ndWFnZXMubGlseXBvbmQgPSB7XG5cdFx0J2NvbW1lbnQnOiAvJSg/Oig/IVxceykuKnxcXHtbXFxzXFxTXSo/JVxcfSkvLFxuXHRcdCdlbWJlZGRlZC1zY2hlbWUnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhefFs9XFxzXSkjKD86XCIoPzpbXlwiXFxcXF18XFxcXC4pKlwifFteXFxzKClcIl0qKD86W15cXHMoKV18PGV4cHI+KSkvLnNvdXJjZS5yZXBsYWNlKC88ZXhwcj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gc2NoZW1lRXhwcmVzc2lvbjsgfSksICdtJyksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdzY2hlbWUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14oIylbXFxzXFxTXSskLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2Utc2NoZW1lJyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdlbWJlZGRlZC1saWx5cG9uZCc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyNcXHtbXFxzXFxTXSo/I1xcfS8sXG5cdFx0XHRcdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL14jXFx7fCNcXH0kLyxcblx0XHRcdFx0XHRcdFx0XHQnbGlseXBvbmQnOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0XHRcdFx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtbGlseXBvbmQnLFxuXHRcdFx0XHRcdFx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHJlc3Q6IFByaXNtLmxhbmd1YWdlcy5zY2hlbWVcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC8jL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9cIig/OlteXCJcXFxcXXxcXFxcLikqXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnY2xhc3MtbmFtZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxcXG5ld1xccyspW1xcdy1dKy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQna2V5d29yZCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXFxcW2Etel1bLVxcd10qL2ksXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXFxcL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J29wZXJhdG9yJzogL1s9fF18PDx8Pj4vLFxuXHRcdCdwdW5jdHVhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbYS16XFxkXSkoPzonK3wsK3xbX15dPy1bX15dPyg/OlstK14hPi5fXXwoPz1cXGQpKXxbX15dXFwuP3xbLiFdKXxbe30oKVtcXF08Pl5+XXxcXFxcWygpW1xcXTw+XFxcXCFdfC0tfF9fLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdudW1iZXInOiAvXFxiXFxkKyg/OlxcL1xcZCspP1xcYi9cblx0fTtcblxuXHRsaWx5cG9uZFsnZW1iZWRkZWQtc2NoZW1lJ10uaW5zaWRlWydzY2hlbWUnXS5pbnNpZGVbJ2VtYmVkZGVkLWxpbHlwb25kJ10uaW5zaWRlWydsaWx5cG9uZCddLmluc2lkZSA9IGxpbHlwb25kO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5seSA9IGxpbHlwb25kO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5saXF1aWQgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXlxceyVcXHMqY29tbWVudFxccyolXFx9KVtcXHNcXFNdKyg/PVxceyVcXHMqZW5kY29tbWVudFxccyolXFx9JCkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2RlbGltaXRlcic6IHtcblx0XHRwYXR0ZXJuOiAvXlxceyg/Olxce1xce3xbJVxce10pLT98LT8oPzpcXH1cXH18WyVcXH1dKVxcfSQvLFxuXHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiW15cIl0qXCJ8J1teJ10qJy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFzfGFzc2lnbnxicmVha3woPzplbmQpPyg/OmNhcHR1cmV8Y2FzZXxjb21tZW50fGZvcnxmb3JtfGlmfHBhZ2luYXRlfHJhd3xzdHlsZXx0YWJsZXJvd3x1bmxlc3MpfGNvbnRpbnVlfGN5Y2xlfGRlY3JlbWVudHxlY2hvfGVsc2V8ZWxzaWZ8aW58aW5jbHVkZXxpbmNyZW1lbnR8bGltaXR8bGlxdWlkfG9mZnNldHxyYW5nZXxyZW5kZXJ8cmV2ZXJzZWR8c2VjdGlvbnx3aGVufHdpdGgpXFxiLyxcblx0J29iamVjdCc6IC9cXGIoPzphZGRyZXNzfGFsbF9jb3VudHJ5X29wdGlvbl90YWdzfGFydGljbGV8YmxvY2t8YmxvZ3xjYXJ0fGNoZWNrb3V0fGNvbGxlY3Rpb258Y29sb3J8Y291bnRyeXxjb3VudHJ5X29wdGlvbl90YWdzfGN1cnJlbmN5fGN1cnJlbnRfcGFnZXxjdXJyZW50X3RhZ3N8Y3VzdG9tZXJ8Y3VzdG9tZXJfYWRkcmVzc3xkYXRlfGRpc2NvdW50X2FsbG9jYXRpb258ZGlzY291bnRfYXBwbGljYXRpb258ZXh0ZXJuYWxfdmlkZW98ZmlsdGVyfGZpbHRlcl92YWx1ZXxmb250fGZvcmxvb3B8ZnVsZmlsbG1lbnR8Z2VuZXJpY19maWxlfGdpZnRfY2FyZHxncm91cHxoYW5kbGV8aW1hZ2V8bGluZV9pdGVtfGxpbmt8bGlua2xpc3R8bG9jYWxpemF0aW9ufGxvY2F0aW9ufG1lYXN1cmVtZW50fG1lZGlhfG1ldGFmaWVsZHxtb2RlbHxtb2RlbF9zb3VyY2V8b3JkZXJ8cGFnZXxwYWdlX2Rlc2NyaXB0aW9ufHBhZ2VfaW1hZ2V8cGFnZV90aXRsZXxwYXJ0fHBvbGljeXxwcm9kdWN0fHByb2R1Y3Rfb3B0aW9ufHJlY29tbWVuZGF0aW9uc3xyZXF1ZXN0fHJvYm90c3xyb3V0ZXN8cnVsZXxzY3JpcHR8c2VhcmNofHNlbGxpbmdfcGxhbnxzZWxsaW5nX3BsYW5fYWxsb2NhdGlvbnxzZWxsaW5nX3BsYW5fZ3JvdXB8c2hpcHBpbmdfbWV0aG9kfHNob3B8c2hvcF9sb2NhbGV8c2l0ZW1hcHxzdG9yZV9hdmFpbGFiaWxpdHl8dGF4X2xpbmV8dGVtcGxhdGV8dGhlbWV8dHJhbnNhY3Rpb258dW5pdF9wcmljZV9tZWFzdXJlbWVudHx1c2VyX2FnZW50fHZhcmlhbnR8dmlkZW98dmlkZW9fc291cmNlKVxcYi8sXG5cdCdmdW5jdGlvbic6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcfFxccyopXFx3Ky8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdmaWx0ZXInXG5cdFx0fSxcblx0XHR7XG5cdFx0XHQvLyBhcnJheSBmdW5jdGlvbnNcblx0XHRcdHBhdHRlcm46IC8oXFwuXFxzKikoPzpmaXJzdHxsYXN0fHNpemUpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfG5pbHx0cnVlKVxcYi8sXG5cdCdyYW5nZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFwuXFwuLyxcblx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHR9LFxuXHQvLyBodHRwczovL2dpdGh1Yi5jb20vU2hvcGlmeS9saXF1aWQvYmxvYi82OThmNWUwZDk2NzQyM2UwMTNmNjE2OWQ5MTExYmQ5NjliZDc4MzM3L2xpYi9saXF1aWQvbGV4ZXIucmIjTDIxXG5cdCdudW1iZXInOiAvXFxiXFxkKyg/OlxcLlxcZCspP1xcYi8sXG5cdCdvcGVyYXRvcic6IC9bIT1dPXw8PnxbPD5dPT98W3w/Oj0tXXxcXGIoPzphbmR8Y29udGFpbnMoPz1cXHMpfG9yKVxcYi8sXG5cdCdwdW5jdHVhdGlvbic6IC9bLixcXFtcXF0oKV0vLFxuXHQnZW1wdHknOiB7XG5cdFx0cGF0dGVybjogL1xcYmVtcHR5XFxiLyxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG59O1xuXG5QcmlzbS5ob29rcy5hZGQoJ2JlZm9yZS10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0dmFyIGxpcXVpZFBhdHRlcm4gPSAvXFx7JVxccypjb21tZW50XFxzKiVcXH1bXFxzXFxTXSo/XFx7JVxccyplbmRjb21tZW50XFxzKiVcXH18XFx7KD86JVtcXHNcXFNdKj8lfFxce1xce1tcXHNcXFNdKj9cXH1cXH18XFx7W1xcc1xcU10qP1xcfSlcXH0vZztcblx0dmFyIGluc2lkZVJhdyA9IGZhbHNlO1xuXG5cdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS5idWlsZFBsYWNlaG9sZGVycyhlbnYsICdsaXF1aWQnLCBsaXF1aWRQYXR0ZXJuLCBmdW5jdGlvbiAobWF0Y2gpIHtcblx0XHR2YXIgdGFnTWF0Y2ggPSAvXlxceyUtP1xccyooXFx3KykvLmV4ZWMobWF0Y2gpO1xuXHRcdGlmICh0YWdNYXRjaCkge1xuXHRcdFx0dmFyIHRhZyA9IHRhZ01hdGNoWzFdO1xuXHRcdFx0aWYgKHRhZyA9PT0gJ3JhdycgJiYgIWluc2lkZVJhdykge1xuXHRcdFx0XHRpbnNpZGVSYXcgPSB0cnVlO1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH0gZWxzZSBpZiAodGFnID09PSAnZW5kcmF3Jykge1xuXHRcdFx0XHRpbnNpZGVSYXcgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuICFpbnNpZGVSYXc7XG5cdH0pO1xufSk7XG5cblByaXNtLmhvb2tzLmFkZCgnYWZ0ZXItdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS50b2tlbml6ZVBsYWNlaG9sZGVycyhlbnYsICdsaXF1aWQnKTtcbn0pO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdC8qKlxuXHQgKiBGdW5jdGlvbnMgdG8gY29uc3RydWN0IHJlZ3VsYXIgZXhwcmVzc2lvbnNcblx0ICogZS5nLiAoaW50ZXJhY3RpdmUgLi4uIG9yIChpbnRlcmFjdGl2ZSlcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcblx0ICogQHJldHVybnMge1JlZ0V4cH1cblx0ICovXG5cdGZ1bmN0aW9uIHNpbXBsZV9mb3JtKG5hbWUpIHtcblx0XHRyZXR1cm4gUmVnRXhwKC8oXFwoKS8uc291cmNlICsgJyg/OicgKyBuYW1lICsgJyknICsgLyg/PVtcXHNcXCldKS8uc291cmNlKTtcblx0fVxuXHQvKipcblx0ICogYm9vbGVhbnMgYW5kIG51bWJlcnNcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm5cblx0ICogQHJldHVybnMge1JlZ0V4cH1cblx0ICovXG5cdGZ1bmN0aW9uIHByaW1pdGl2ZShwYXR0ZXJuKSB7XG5cdFx0cmV0dXJuIFJlZ0V4cCgvKFtcXHMoW10pLy5zb3VyY2UgKyAnKD86JyArIHBhdHRlcm4gKyAnKScgKyAvKD89W1xccyldKS8uc291cmNlKTtcblx0fVxuXG5cdC8vIFBhdHRlcm5zIGluIHJlZ3VsYXIgZXhwcmVzc2lvbnNcblxuXHQvLyBTeW1ib2wgbmFtZS4gU2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZW1hY3MvbWFudWFsL2h0bWxfbm9kZS9lbGlzcC9TeW1ib2wtVHlwZS5odG1sXG5cdC8vICYgYW5kIDogYXJlIGV4Y2x1ZGVkIGFzIHRoZXkgYXJlIHVzdWFsbHkgdXNlZCBmb3Igc3BlY2lhbCBwdXJwb3Nlc1xuXHR2YXIgc3ltYm9sID0gLyg/IVxcZClbLSsqL34hQCQlXj08Pnt9XFx3XSsvLnNvdXJjZTtcblx0Ly8gc3ltYm9sIHN0YXJ0aW5nIHdpdGggJiB1c2VkIGluIGZ1bmN0aW9uIGFyZ3VtZW50c1xuXHR2YXIgbWFya2VyID0gJyYnICsgc3ltYm9sO1xuXHQvLyBPcGVuIHBhcmVudGhlc2lzIGZvciBsb29rLWJlaGluZFxuXHR2YXIgcGFyID0gJyhcXFxcKCknO1xuXHR2YXIgZW5kcGFyID0gJyg/PVxcXFwpKSc7XG5cdC8vIEVuZCB0aGUgcGF0dGVybiB3aXRoIGxvb2stYWhlYWQgc3BhY2Vcblx0dmFyIHNwYWNlID0gJyg/PVxcXFxzKSc7XG5cdHZhciBuZXN0ZWRQYXIgPSAvKD86W14oKV18XFwoKD86W14oKV18XFwoKD86W14oKV18XFwoKD86W14oKV18XFwoKD86W14oKV18XFwoW14oKV0qXFwpKSpcXCkpKlxcKSkqXFwpKSpcXCkpKi8uc291cmNlO1xuXG5cdHZhciBsYW5ndWFnZSA9IHtcblx0XHQvLyBUaHJlZSBvciBmb3VyIHNlbWljb2xvbnMgYXJlIGNvbnNpZGVyZWQgYSBoZWFkaW5nLlxuXHRcdC8vIFNlZSBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2VtYWNzL21hbnVhbC9odG1sX25vZGUvZWxpc3AvQ29tbWVudC1UaXBzLmh0bWxcblx0XHRoZWFkaW5nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvOzs7LiovLFxuXHRcdFx0YWxpYXM6IFsnY29tbWVudCcsICd0aXRsZSddXG5cdFx0fSxcblx0XHRjb21tZW50OiAvOy4qLyxcblx0XHRzdHJpbmc6IHtcblx0XHRcdHBhdHRlcm46IC9cIig/OlteXCJcXFxcXXxcXFxcLikqXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdGFyZ3VtZW50OiAvWy1BLVpdKyg/PVsuLFxcc10pLyxcblx0XHRcdFx0c3ltYm9sOiBSZWdFeHAoJ2AnICsgc3ltYm9sICsgXCInXCIpXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQncXVvdGVkLXN5bWJvbCc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChcIiM/J1wiICsgc3ltYm9sKSxcblx0XHRcdGFsaWFzOiBbJ3ZhcmlhYmxlJywgJ3N5bWJvbCddXG5cdFx0fSxcblx0XHQnbGlzcC1wcm9wZXJ0eSc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnOicgKyBzeW1ib2wpLFxuXHRcdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0XHR9LFxuXHRcdHNwbGljZToge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKCcsQD8nICsgc3ltYm9sKSxcblx0XHRcdGFsaWFzOiBbJ3N5bWJvbCcsICd2YXJpYWJsZSddXG5cdFx0fSxcblx0XHRrZXl3b3JkOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdFx0XHRwYXIgK1xuXHRcdFx0XHRcdFx0Jyg/OmFuZHwoPzpjbC0pP2xldGZ8Y2wtbG9vcHxjb25kfGNvbnN8ZXJyb3J8aWZ8KD86bGV4aWNhbC0pP2xldFxcXFwqP3xtZXNzYWdlfG5vdHxudWxsfG9yfHByb3ZpZGV8cmVxdWlyZXxzZXRxfHVubGVzc3x1c2UtcGFja2FnZXx3aGVufHdoaWxlKScgK1xuXHRcdFx0XHRcdFx0c3BhY2Vcblx0XHRcdFx0KSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0XHRcdHBhciArICcoPzphcHBlbmR8Ynl8Y29sbGVjdHxjb25jYXR8ZG98ZmluYWxseXxmb3J8aW58cmV0dXJuKScgKyBzcGFjZVxuXHRcdFx0XHQpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdF0sXG5cdFx0ZGVjbGFyZToge1xuXHRcdFx0cGF0dGVybjogc2ltcGxlX2Zvcm0oL2RlY2xhcmUvLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH0sXG5cdFx0aW50ZXJhY3RpdmU6IHtcblx0XHRcdHBhdHRlcm46IHNpbXBsZV9mb3JtKC9pbnRlcmFjdGl2ZS8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fSxcblx0XHRib29sZWFuOiB7XG5cdFx0XHRwYXR0ZXJuOiBwcmltaXRpdmUoL25pbHx0Ly5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0bnVtYmVyOiB7XG5cdFx0XHRwYXR0ZXJuOiBwcmltaXRpdmUoL1stK10/XFxkKyg/OlxcLlxcZCopPy8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdGRlZnZhcjoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKHBhciArICdkZWYoPzpjb25zdHxjdXN0b218Z3JvdXB8dmFyKVxcXFxzKycgKyBzeW1ib2wpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRrZXl3b3JkOiAvXmRlZlthLXpdKy8sXG5cdFx0XHRcdHZhcmlhYmxlOiBSZWdFeHAoc3ltYm9sKVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0ZGVmdW46IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChwYXIgKyAvKD86Y2wtKT8oPzpkZWZtYWNyb3xkZWZ1blxcKj8pXFxzKy8uc291cmNlICsgc3ltYm9sICsgL1xccytcXCgvLnNvdXJjZSArIG5lc3RlZFBhciArIC9cXCkvLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdGtleXdvcmQ6IC9eKD86Y2wtKT9kZWZcXFMrLyxcblx0XHRcdFx0Ly8gU2VlIGJlbG93LCB0aGlzIHByb3BlcnR5IG5lZWRzIHRvIGJlIGRlZmluZWQgbGF0ZXIgc28gdGhhdCBpdCBjYW5cblx0XHRcdFx0Ly8gcmVmZXJlbmNlIHRoZSBsYW5ndWFnZSBvYmplY3QuXG5cdFx0XHRcdGFyZ3VtZW50czogbnVsbCxcblx0XHRcdFx0ZnVuY3Rpb246IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJyheXFxcXHMpJyArIHN5bWJvbCksXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRwdW5jdHVhdGlvbjogL1soKV0vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHRsYW1iZGE6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChwYXIgKyAnbGFtYmRhXFxcXHMrXFxcXChcXFxccyooPzomPycgKyBzeW1ib2wgKyAnKD86XFxcXHMrJj8nICsgc3ltYm9sICsgJykqXFxcXHMqKT9cXFxcKScpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRrZXl3b3JkOiAvXmxhbWJkYS8sXG5cdFx0XHRcdC8vIFNlZSBiZWxvdywgdGhpcyBwcm9wZXJ0eSBuZWVkcyB0byBiZSBkZWZpbmVkIGxhdGVyIHNvIHRoYXQgaXQgY2FuXG5cdFx0XHRcdC8vIHJlZmVyZW5jZSB0aGUgbGFuZ3VhZ2Ugb2JqZWN0LlxuXHRcdFx0XHRhcmd1bWVudHM6IG51bGwsXG5cdFx0XHRcdHB1bmN0dWF0aW9uOiAvWygpXS9cblx0XHRcdH1cblx0XHR9LFxuXHRcdGNhcjoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKHBhciArIHN5bWJvbCksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHRwdW5jdHVhdGlvbjogW1xuXHRcdFx0Ly8gb3BlbiBwYXJlbiwgYnJhY2tldHMsIGFuZCBjbG9zZSBwYXJlblxuXHRcdFx0Lyg/OlsnYCxdP1xcKHxbKVxcW1xcXV0pLyxcblx0XHRcdC8vIGNvbnNcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXHMpXFwuKD89XFxzKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XVxuXHR9O1xuXG5cdHZhciBhcmcgPSB7XG5cdFx0J2xpc3AtbWFya2VyJzogUmVnRXhwKG1hcmtlciksXG5cdFx0J3ZhcmZvcm0nOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoL1xcKC8uc291cmNlICsgc3ltYm9sICsgL1xccysoPz1cXFMpLy5zb3VyY2UgKyBuZXN0ZWRQYXIgKyAvXFwpLy5zb3VyY2UpLFxuXHRcdFx0aW5zaWRlOiBsYW5ndWFnZVxuXHRcdH0sXG5cdFx0J2FyZ3VtZW50Jzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXnxbXFxzKF0pLy5zb3VyY2UgKyBzeW1ib2wpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdFx0fSxcblx0XHRyZXN0OiBsYW5ndWFnZVxuXHR9O1xuXG5cdHZhciBmb3JtcyA9ICdcXFxcUysoPzpcXFxccytcXFxcUyspKic7XG5cblx0dmFyIGFyZ2xpc3QgPSB7XG5cdFx0cGF0dGVybjogUmVnRXhwKHBhciArIG5lc3RlZFBhciArIGVuZHBhciksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdyZXN0LXZhcnMnOiB7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnJig/OmJvZHl8cmVzdClcXFxccysnICsgZm9ybXMpLFxuXHRcdFx0XHRpbnNpZGU6IGFyZ1xuXHRcdFx0fSxcblx0XHRcdCdvdGhlci1tYXJrZXItdmFycyc6IHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKCcmKD86YXV4fG9wdGlvbmFsKVxcXFxzKycgKyBmb3JtcyksXG5cdFx0XHRcdGluc2lkZTogYXJnXG5cdFx0XHR9LFxuXHRcdFx0a2V5czoge1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJyZrZXlcXFxccysnICsgZm9ybXMgKyAnKD86XFxcXHMrJmFsbG93LW90aGVyLWtleXMpPycpLFxuXHRcdFx0XHRpbnNpZGU6IGFyZ1xuXHRcdFx0fSxcblx0XHRcdGFyZ3VtZW50OiB7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cChzeW1ib2wpLFxuXHRcdFx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHRcdFx0fSxcblx0XHRcdHB1bmN0dWF0aW9uOiAvWygpXS9cblx0XHR9XG5cdH07XG5cblx0bGFuZ3VhZ2VbJ2xhbWJkYSddLmluc2lkZS5hcmd1bWVudHMgPSBhcmdsaXN0O1xuXHRsYW5ndWFnZVsnZGVmdW4nXS5pbnNpZGUuYXJndW1lbnRzID0gUHJpc20udXRpbC5jbG9uZShhcmdsaXN0KTtcblx0bGFuZ3VhZ2VbJ2RlZnVuJ10uaW5zaWRlLmFyZ3VtZW50cy5pbnNpZGUuc3VibGlzdCA9IGFyZ2xpc3Q7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmxpc3AgPSBsYW5ndWFnZTtcblx0UHJpc20ubGFuZ3VhZ2VzLmVsaXNwID0gbGFuZ3VhZ2U7XG5cdFByaXNtLmxhbmd1YWdlcy5lbWFjcyA9IGxhbmd1YWdlO1xuXHRQcmlzbS5sYW5ndWFnZXNbJ2VtYWNzLWxpc3AnXSA9IGxhbmd1YWdlO1xufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMubGl2ZXNjcmlwdCA9IHtcblx0J2NvbW1lbnQnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pXFwvXFwqW1xcc1xcU10qP1xcKlxcLy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkjLiovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J2ludGVycG9sYXRlZC1zdHJpbmcnOiB7XG5cdFx0LyogTG9vay1iZWhpbmQgYW5kIGxvb2stYWhlYWQgcHJldmVudHMgd3JvbmcgYmVoYXZpb3Igb2YgdGhlIGdyZWVkeSBwYXR0ZXJuXG5cdFx0KiBmb3JjaW5nIGl0IHRvIG1hdGNoIFwiXCJcIi1xdW90ZWQgc3RyaW5nIHdoZW4gaXQgd291bGQgb3RoZXJ3aXNlIG1hdGNoIFwiLXF1b3RlZCBmaXJzdC4gKi9cblx0XHRwYXR0ZXJuOiAvKF58W15cIl0pKFwiXCJcInxcIikoPzpcXFxcW1xcc1xcU118KD8hXFwyKVteXFxcXF0pKlxcMig/IVwiKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQndmFyaWFibGUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSNbYS16X10oPzotP1thLXpdfFtcXGRfXSkqL20sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pI1xce1tefV0rXFx9L20sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL14jXFx7fFxcfSQvLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gU2VlIHJlc3QgYmVsb3dcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdH1cblx0fSxcblx0J3N0cmluZyc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKCcnJ3wnKSg/OlxcXFxbXFxzXFxTXXwoPyFcXDEpW15cXFxcXSkqXFwxLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLzxcXFtbXFxzXFxTXSo/XFxdPi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdC9cXFxcW15cXHMsO1xcXSl9XSsvXG5cdF0sXG5cdCdyZWdleCc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFwvXFwvKD86XFxbW15cXHJcXG5cXF1dKlxcXXxcXFxcLnwoPyFcXC9cXC8pW15cXFxcXFxbXSkrXFwvXFwvW2dpbXl1XXswLDV9Lyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnY29tbWVudCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkjLiovLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcLyg/OlxcW1teXFxyXFxuXFxdXSpcXF18XFxcXC58W14vXFxcXFxcclxcblxcW10pK1xcL1tnaW15dV17MCw1fS8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdrZXl3b3JkJzoge1xuXHRcdHBhdHRlcm46IC8oXnwoPyEtKS4pXFxiKD86YnJlYWt8Y2FzZXxjYXRjaHxjbGFzc3xjb25zdHxjb250aW51ZXxkZWZhdWx0fGRvfGVsc2V8ZXh0ZW5kc3xmYWxsdGhyb3VnaHxmaW5hbGx5fGZvcig/OiBldmVyKT98ZnVuY3Rpb258aWZ8aW1wbGVtZW50c3xpdHxsZXR8bG9vcHxuZXd8bnVsbHxvdGhlcndpc2V8b3dufHJldHVybnxzdXBlcnxzd2l0Y2h8dGhhdHx0aGVufHRoaXN8dGhyb3d8dHJ5fHVubGVzc3x1bnRpbHx2YXJ8dm9pZHx3aGVufHdoaWxlfHlpZWxkKSg/IS0pXFxiL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZC1vcGVyYXRvcic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W14tXSlcXGIoPzooPzpkZWxldGV8cmVxdWlyZXx0eXBlb2YpIXwoPzphbmR8Ynl8ZGVsZXRlfGV4cG9ydHxmcm9tfGltcG9ydCg/OiBhbGwpP3xpbnxpbnN0YW5jZW9mfGlzKD86IG5vdHxudCk/fG5vdHxvZnxvcnx0aWx8dG98dHlwZW9mfHdpdGh8eG9yKSg/IS0pXFxiKS9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0fSxcblx0J2Jvb2xlYW4nOiB7XG5cdFx0cGF0dGVybjogLyhefFteLV0pXFxiKD86ZmFsc2V8bm98b2ZmfG9ufHRydWV8eWVzKSg/IS0pXFxiL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnYXJndW1lbnQnOiB7XG5cdFx0Ly8gRG9uJ3QgbWF0Y2ggLiYuIG5vciAmJlxuXHRcdHBhdHRlcm46IC8oXnwoPyFcXC4mXFwuKVteJl0pJig/ISYpXFxkKi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0fSxcblx0J251bWJlcic6IC9cXGIoPzpcXGQrfltcXGRhLXpdK3xcXGRbXFxkX10qKD86XFwuXFxkW1xcZF9dKik/KD86W2Etel1cXHcqKT8pL2ksXG5cdCdpZGVudGlmaWVyJzogL1thLXpfXSg/Oi0/W2Etel18W1xcZF9dKSovaSxcblx0J29wZXJhdG9yJzogW1xuXHRcdC8vIFNwYWNlZCAuXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyggKVxcLig/PSApLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdC8vIEZ1bGwgbGlzdCwgaW4gb3JkZXI6XG5cdFx0Ly8gLj0gLn4gLi4gLi4uXG5cdFx0Ly8gLiYuIC5eLiAuPDwuIC4+Pi4gLj4+Pi5cblx0XHQvLyA6PSA6OiA6Oj1cblx0XHQvLyAmJlxuXHRcdC8vIHx8IHw+XG5cdFx0Ly8gPCA8PCA8PDwgPDw8PFxuXHRcdC8vIDwtIDwtLSA8LSEgPC0tIVxuXHRcdC8vIDx+IDx+fiA8fiEgPH5+IVxuXHRcdC8vIDx8IDw9IDw/XG5cdFx0Ly8gPiA+PiA+PSA+P1xuXHRcdC8vIC0gLS0gLT4gLS0+XG5cdFx0Ly8gKyArK1xuXHRcdC8vIEAgQEBcblx0XHQvLyAlICUlXG5cdFx0Ly8gKiAqKlxuXHRcdC8vICEgIT0gIX49XG5cdFx0Ly8gIX4+ICF+fj5cblx0XHQvLyAhLT4gIS0tPlxuXHRcdC8vIH4gfj4gfn4+IH49XG5cdFx0Ly8gPSA9PVxuXHRcdC8vIF4gXl5cblx0XHQvLyAvID9cblx0XHQvXFwuKD86Wz1+XXxcXC5cXC4/KXxcXC4oPzpbJnxeXXw8PHw+Pj4/KVxcLnw6KD86PXw6PT8pfCYmfFxcfFt8Pl18PCg/Ojw8Pzw/fC0tPyE/fH5+PyE/fFt8PT9dKT98Pls+PT9dP3wtKD86LT4/fD4pP3xcXCtcXCs/fEBAP3wlJT98XFwqXFwqP3whKD86fj89fC0tPz58fj9+Pik/fH4oPzp+Pz58PSk/fD09P3xcXF5cXF4/fFtcXC8/XS9cblx0XSxcblx0J3B1bmN0dWF0aW9uJzogL1soKXt9XFxbXFxdfC4sOjtgXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5saXZlc2NyaXB0WydpbnRlcnBvbGF0ZWQtc3RyaW5nJ10uaW5zaWRlWydpbnRlcnBvbGF0aW9uJ10uaW5zaWRlLnJlc3QgPSBQcmlzbS5sYW5ndWFnZXMubGl2ZXNjcmlwdDtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHRQcmlzbS5sYW5ndWFnZXMubGx2bSA9IHtcblx0XHQnY29tbWVudCc6IC87LiovLFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXCJbXlwiXSpcIi8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0fSxcblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdFx0J3ZhcmlhYmxlJzogL1slQCEjXSg/Oig/IVxcZCkoPzpbLSQuXFx3XXxcXFxcW2EtZlxcZF17Mn0pK3xcXGQrKS9pLFxuXHRcdCdsYWJlbCc6IC8oPyFcXGQpKD86Wy0kLlxcd118XFxcXFthLWZcXGRdezJ9KSs6L2ksXG5cdFx0J3R5cGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86ZG91YmxlfGZsb2F0fGZwMTI4fGhhbGZ8aVsxLTldXFxkKnxsYWJlbHxtZXRhZGF0YXxwcGNfZnAxMjh8dG9rZW58dm9pZHx4ODZfZnA4MHx4ODZfbW14KVxcYi8sXG5cdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnLFxuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiAvXFxiW2Etel9dW2Etel8wLTldKlxcYi8sXG5cdFx0J251bWJlcic6IC9bKy1dP1xcYlxcZCsoPzpcXC5cXGQrKT8oPzpbZUVdWystXT9cXGQrKT9cXGJ8XFxiMHhbXFxkQS1GYS1mXStcXGJ8XFxiMHhLW1xcZEEtRmEtZl17MjB9XFxifFxcYjB4W01MXVtcXGRBLUZhLWZdezMyfVxcYnxcXGIweEhbXFxkQS1GYS1mXXs0fVxcYi8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF07KCksLiEqPTw+XS8sXG5cdH07XG59KFByaXNtKSk7XG5cbi8vIFRoaXMgaXMgYSBsYW5ndWFnZSBkZWZpbml0aW9uIGZvciBnZW5lcmljIGxvZyBmaWxlcy5cbi8vIFNpbmNlIHRoZXJlIGlzIG5vIG9uZSBsb2cgZm9ybWF0LCB0aGlzIGxhbmd1YWdlIGRlZmluaXRpb24gaGFzIHRvIHN1cHBvcnQgYWxsIGZvcm1hdHMgdG8gc29tZSBkZWdyZWUuXG4vL1xuLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL01UREw5L3ZpbS1sb2ctaGlnaGxpZ2h0aW5nXG5cblByaXNtLmxhbmd1YWdlcy5sb2cgPSB7XG5cdCdzdHJpbmcnOiB7XG5cdFx0Ly8gU2luZ2xlLXF1b3RlZCBzdHJpbmdzIG11c3Qgbm90IGJlIGNvbmZ1c2VkIHdpdGggcGxhaW4gdGV4dC4gRS5nLiBDYW4ndCBpc24ndCBTdXNhbidzIENocmlzJyB0b3lcblx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXFxcXFxcclxcbl18XFxcXC4pKlwifCcoPyFbc3RdIHwgXFx3KSg/OlteJ1xcXFxcXHJcXG5dfFxcXFwuKSonLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdH0sXG5cblx0J2V4Y2VwdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXHcuXSlbYS16XVtcXHcuXSooPzpFcnJvcnxFeGNlcHRpb24pOi4qKD86KD86XFxyXFxuP3xcXG4pWyBcXHRdKig/OmF0WyBcXHRdLit8XFwuezN9Lip8Q2F1c2VkIGJ5Oi4qKSkrKD86KD86XFxyXFxuP3xcXG4pWyBcXHRdKlxcLlxcLlxcLiAuKik/Lyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogWydqYXZhc3RhY2t0cmFjZScsICdsYW5ndWFnZS1qYXZhc3RhY2t0cmFjZSddLFxuXHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzWydqYXZhc3RhY2t0cmFjZSddIHx8IHtcblx0XHRcdCdrZXl3b3JkJzogL1xcYmF0XFxiLyxcblx0XHRcdCdmdW5jdGlvbic6IC9bYS16X11bXFx3JF0qKD89XFwoKS8sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvWy46KCldL1xuXHRcdH1cblx0fSxcblxuXHQnbGV2ZWwnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcYig/OkFMRVJUfENSSVR8Q1JJVElDQUx8RU1FUkd8RU1FUkdFTkNZfEVSUnxFUlJPUnxGQUlMVVJFfEZBVEFMfFNFVkVSRSlcXGIvLFxuXHRcdFx0YWxpYXM6IFsnZXJyb3InLCAnaW1wb3J0YW50J11cblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzpXQVJOfFdBUk5JTkd8V1JOKVxcYi8sXG5cdFx0XHRhbGlhczogWyd3YXJuaW5nJywgJ2ltcG9ydGFudCddXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86RElTUExBWXxJTkZ8SU5GT3xOT1RJQ0V8U1RBVFVTKVxcYi8sXG5cdFx0XHRhbGlhczogWydpbmZvJywgJ2tleXdvcmQnXVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcYig/OkRCR3xERUJVR3xGSU5FKVxcYi8sXG5cdFx0XHRhbGlhczogWydkZWJ1ZycsICdrZXl3b3JkJ11cblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzpGSU5FUnxGSU5FU1R8VFJBQ0V8VFJDfFZFUkJPU0V8VlJCKVxcYi8sXG5cdFx0XHRhbGlhczogWyd0cmFjZScsICdjb21tZW50J11cblx0XHR9XG5cdF0sXG5cblx0J3Byb3BlcnR5Jzoge1xuXHRcdHBhdHRlcm46IC8oKD86XnxbXFxdfF0pWyBcXHRdKilbYS16X10oPzpbXFx3LV18XFxiXFwvXFxiKSooPzpbLiBdXFwoP1xcdyg/OltcXHctXXxcXGJcXC9cXGIpKlxcKT8pKjooPz1cXHMpL2ltLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblxuXHQnc2VwYXJhdG9yJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXi0rXSktezMsfXw9ezMsfXxcXCp7Myx9fC0gLSAvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnY29tbWVudCdcblx0fSxcblxuXHQndXJsJzogL1xcYig/OmZpbGV8ZnRwfGh0dHBzPyk6XFwvXFwvW15cXHN8LDsnXCJdKlteXFxzfCw7J1wiPi5dLyxcblx0J2VtYWlsJzoge1xuXHRcdHBhdHRlcm46IC8oXnxcXHMpWy1cXHcrLl0rQFthLXpdW2EtejAtOS1dKig/OlxcLlthLXpdW2EtejAtOS1dKikrKD89XFxzKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3VybCdcblx0fSxcblxuXHQnaXAtYWRkcmVzcyc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86XFxkezEsM30oPzpcXC5cXGR7MSwzfSl7M30pXFxiLyxcblx0XHRhbGlhczogJ2NvbnN0YW50J1xuXHR9LFxuXHQnbWFjLWFkZHJlc3MnOiB7XG5cdFx0cGF0dGVybjogL1xcYlthLWYwLTldezJ9KD86OlthLWYwLTldezJ9KXs1fVxcYi9pLFxuXHRcdGFsaWFzOiAnY29uc3RhbnQnXG5cdH0sXG5cdCdkb21haW4nOiB7XG5cdFx0cGF0dGVybjogLyhefFxccylbYS16XVthLXowLTktXSooPzpcXC5bYS16XVthLXowLTktXSopKlxcLlthLXpdW2EtejAtOS1dKyg/PVxccykvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdjb25zdGFudCdcblx0fSxcblxuXHQndXVpZCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9XFxiL2ksXG5cdFx0YWxpYXM6ICdjb25zdGFudCdcblx0fSxcblx0J2hhc2gnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OlthLWYwLTldezMyfSl7MSwyfVxcYi9pLFxuXHRcdGFsaWFzOiAnY29uc3RhbnQnXG5cdH0sXG5cblx0J2ZpbGUtcGF0aCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiW2Etel06W1xcXFwvXVteXFxzfCw7Oigpe31cXFtcXF1cIiddK3woXnxbXFxzOlxcW1xcXSg+fF0pXFwuezAsMn1cXC9cXHdbXlxcc3wsOzooKXt9XFxbXFxdXCInXSovaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ3N0cmluZydcblx0fSxcblxuXHQnZGF0ZSc6IHtcblx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHQvXFxiXFxkezR9Wy0vXVxcZHsyfVstL11cXGR7Mn0oPzpUKD89XFxkezEsMn06KXwoPz1cXHNcXGR7MSwyfTopKS8uc291cmNlICtcblx0XHRcdCd8JyArXG5cdFx0XHQvXFxiXFxkezEsNH1bLS8gXSg/OlxcZHsxLDJ9fEFwcnxBdWd8RGVjfEZlYnxKYW58SnVsfEp1bnxNYXJ8TWF5fE5vdnxPY3R8U2VwKVstLyBdXFxkezIsNH1UP1xcYi8uc291cmNlICtcblx0XHRcdCd8JyArXG5cdFx0XHQvXFxiKD86KD86RnJpfE1vbnxTYXR8U3VufFRodXxUdWV8V2VkKSg/Olxcc3sxLDJ9KD86QXByfEF1Z3xEZWN8RmVifEphbnxKdWx8SnVufE1hcnxNYXl8Tm92fE9jdHxTZXApKT98QXByfEF1Z3xEZWN8RmVifEphbnxKdWx8SnVufE1hcnxNYXl8Tm92fE9jdHxTZXApXFxzezEsMn1cXGR7MSwyfVxcYi8uc291cmNlLFxuXHRcdFx0J2knXG5cdFx0KSxcblx0XHRhbGlhczogJ251bWJlcidcblx0fSxcblx0J3RpbWUnOiB7XG5cdFx0cGF0dGVybjogL1xcYlxcZHsxLDJ9OlxcZHsxLDJ9OlxcZHsxLDJ9KD86Wy4sOl1cXGQrKT8oPzpcXHM/WystXVxcZHsyfTo/XFxkezJ9fFopP1xcYi8sXG5cdFx0YWxpYXM6ICdudW1iZXInXG5cdH0sXG5cblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8bnVsbHx0cnVlKVxcYi9pLFxuXHQnbnVtYmVyJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXi5cXHddKSg/OjB4W2EtZjAtOV0rfDBvWzAtN10rfDBiWzAxXSt8dj9cXGRbXFxkYS1mXSooPzpcXC5cXGQrKSooPzplWystXT9cXGQrKT9bYS16XXswLDN9XFxiKVxcYig/IVxcLlxcdykvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cblx0J29wZXJhdG9yJzogL1s7Oj88PT5+L0AhJCUmK1xcLXxeKCl7fSojXS8sXG5cdCdwdW5jdHVhdGlvbic6IC9bXFxbXFxdLixdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmxvbGNvZGUgPSB7XG5cdCdjb21tZW50JzogW1xuXHRcdC9cXGJPQlRXXFxzW1xcc1xcU10qP1xcc1RMRFJcXGIvLFxuXHRcdC9cXGJCVFcuKy9cblx0XSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzo6LnxbXlwiOl0pKlwiLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCd2YXJpYWJsZSc6IC86XFx7W159XStcXH0vLFxuXHRcdFx0J3N5bWJvbCc6IFtcblx0XHRcdFx0LzpcXChbYS1mXFxkXStcXCkvaSxcblx0XHRcdFx0LzpcXFtbXlxcXV0rXFxdLyxcblx0XHRcdFx0LzpbKT5vXCI6XS9cblx0XHRcdF1cblx0XHR9LFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnbnVtYmVyJzogLyg/OlxcQi0pPyg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykvLFxuXHQnc3ltYm9sJzoge1xuXHRcdHBhdHRlcm46IC8oXnxcXHMpKD86QSApPyg/OkJVS0tJVHxOT09CfE5VTUJBUnxOVU1CUnxUUk9PRnxZQVJOKSg/PVxcc3wsfCQpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2tleXdvcmQnOiAvQSg/PVxccykvXG5cdFx0fVxuXHR9LFxuXHQnbGFiZWwnOiB7XG5cdFx0cGF0dGVybjogLygoPzpefFxccykoPzpJTSBJTiBZUnxJTSBPVVRUQSBZUikgKVthLXpBLVpdXFx3Ki8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3N0cmluZydcblx0fSxcblx0J2Z1bmN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oKD86XnxcXHMpKD86SE9XIElaIEl8SSBJWnxJWikgKVthLXpBLVpdXFx3Ki8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58XFxzKSg/OkFOfEZPVU5EIFlSfEdJTU1FSHxHVEZPfEhBSXxIQVMgQXxIT1cgSVogSXxJIEhBUyBBfEkgSVp8SUYgVSBTQVkgU098SU0gSU4gWVJ8SU0gT1VUVEEgWVJ8SVMgTk9XKD86IEEpP3xJVFooPzogQSk/fElafEtUSFh8S1RIWEJZRXxMSUVLKD86IEEpP3xNQUVLfE1FQkJFfE1LQVl8TkVSRklOfE5PIFdBSXxPIEhBSSBJTXxPIFJMWVxcP3xPSUN8T01HfE9NR1dURnxSfFNNT09TSHxTUlN8VElMfFVQUElOfFZJU0lCTEV8V0lMRXxXVEZcXD98WUEgUkxZfFlSKSg/PVxcc3wsfCQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdC8nWig/PVxcc3wsfCQpL1xuXHRdLFxuXHQnYm9vbGVhbic6IHtcblx0XHRwYXR0ZXJuOiAvKF58XFxzKSg/OkZBSUx8V0lOKSg/PVxcc3wsfCQpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCd2YXJpYWJsZSc6IHtcblx0XHRwYXR0ZXJuOiAvKF58XFxzKUlUKD89XFxzfCx8JCkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J29wZXJhdG9yJzoge1xuXHRcdHBhdHRlcm46IC8oXnxcXHMpKD86Tk9UfEJPVEggU0FFTXxESUZGUklOVHwoPzpBTEx8QU5ZfEJJR0dSfEJPVEh8RElGRnxFSVRIRVJ8TU9EfFBST0RVS1R8UVVPU0hVTlR8U01BTExSfFNVTXxXT04pIE9GKSg/PVxcc3wsfCQpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdwdW5jdHVhdGlvbic6IC9cXC57M318XHUyMDI2fCx8IS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5tYWdtYSA9IHtcblx0J291dHB1dCc6IHtcblx0XHRwYXR0ZXJuOiAvXig+LiooPzpcXHIoPzpcXG58KD8hXFxuKSl8XFxuKSkoPyE+KSg/Oi4rfCg/Olxccig/OlxcbnwoPyFcXG4pKXxcXG4pKD8hPikuKikoPzooPzpcXHIoPzpcXG58KD8hXFxuKSl8XFxuKSg/IT4pLiopKi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcL1xcLy4qfFxcL1xcKltcXHNcXFNdKj9cXCpcXC8vLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxcIl0pXCIoPzpbXlxcclxcblxcXFxcIl18XFxcXC4pKlwiLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdC8vIGh0dHA6Ly9tYWdtYS5tYXRocy51c3lkLmVkdS5hdS9tYWdtYS9oYW5kYm9vay90ZXh0LzgyXG5cdCdrZXl3b3JkJzogL1xcYig/Ol98YWRqfGFuZHxhc3NlcnR8YXNzZXJ0Mnxhc3NlcnQzfGFzc2lnbmVkfGJyZWFrfGJ5fGNhc2V8Y2F0fGNhdGNofGNsZWFyfGNtcGVxfGNtcG5lfGNvbnRpbnVlfGRlY2xhcmV8ZGVmYXVsdHxkZWxldGV8ZGlmZnxkaXZ8ZG98ZWxpZnxlbHNlfGVuZHxlcXxlcnJvcnxldmFsfGV4aXN0c3xleGl0fGZvcnxmb3JhbGx8Zm9yd2FyZHxmcHJpbnRmfGZyZWV6ZXxmdW5jdGlvbnxnZXxndHxpZnxpbG9hZHxpbXBvcnR8aW58aW50cmluc2ljfGlzfGpvaW58bGV8bG9hZHxsb2NhbHxsdHxtZWV0fG1vZHxuZXxub3R8bm90YWRqfG5vdGlufG5vdHN1YnNldHxvcnxwcmludHxwcmludGZ8cHJvY2VkdXJlfHF1aXR8cmFuZG9tfHJlYWR8cmVhZGl8cmVwZWF0fHJlcXVpcmV8cmVxdWlyZWdlfHJlcXVpcmVyYW5nZXxyZXN0b3JlfHJldHVybnxzYXZlfHNkaWZmfHNlbGVjdHxzdWJzZXR8dGhlbnx0aW1lfHRvfHRyeXx1bnRpbHx2cHJpbnR8dnByaW50Znx2dGltZXx3aGVufHdoZXJlfHdoaWxlfHhvcilcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cblx0J2dlbmVyYXRvcic6IHtcblx0XHRwYXR0ZXJuOiAvXFxiW2Etel9dXFx3Kig/PVxccyo8KS9pLFxuXHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0fSxcblx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1cXHMqXFwoKS9pLFxuXG5cdCdudW1iZXInOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFx3Ll18XFwuXFwuKSg/OlxcZCsoPzpcXC5cXGQqKT98XFwuXFxkKykoPzpbZUVdWystXT9cXGQrKT8oPzpfW2Etel0/KT8oPz0kfFteXFx3Ll18XFwuXFwuKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXG5cdCdvcGVyYXRvcic6IC8tPnxbLSsqL15+IXwjPV18Oj18XFwuXFwuLyxcblx0J3B1bmN0dWF0aW9uJzogL1soKVtcXF17fTw+LDsuOl0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMubWFrZWZpbGUgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSMoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXxbXlxcXFxcXHJcXG5dKSovLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFtcIiddKSg/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCdidWlsdGluLXRhcmdldCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwuW0EtWl1bXjojPVxcc10rKD89XFxzKjooPyE9KSkvLFxuXHRcdGFsaWFzOiAnYnVpbHRpbidcblx0fSxcblxuXHQndGFyZ2V0Jzoge1xuXHRcdHBhdHRlcm46IC9eKD86W146PVxcc118WyBcXHRdKyg/IVtcXHM6XSkpKyg/PVxccyo6KD8hPSkpL20sXG5cdFx0YWxpYXM6ICdzeW1ib2wnLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3ZhcmlhYmxlJzogL1xcJCsoPzooPyFcXCQpW14oKXt9OiM9XFxzXSt8KD89Wyh7XSkpL1xuXHRcdH1cblx0fSxcblx0J3ZhcmlhYmxlJzogL1xcJCsoPzooPyFcXCQpW14oKXt9OiM9XFxzXSt8XFwoW0AqJTxeKz9dW0RGXVxcKXwoPz1bKHtdKSkvLFxuXG5cdC8vIERpcmVjdGl2ZXNcblx0J2tleXdvcmQnOiAvLWluY2x1ZGVcXGJ8XFxiKD86ZGVmaW5lfGVsc2V8ZW5kZWZ8ZW5kaWZ8ZXhwb3J0fGlmbj9kZWZ8aWZuP2VxfGluY2x1ZGV8b3ZlcnJpZGV8cHJpdmF0ZXxzaW5jbHVkZXx1bmRlZmluZXx1bmV4cG9ydHx2cGF0aClcXGIvLFxuXG5cdCdmdW5jdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKFxcKCkoPzphYnNwYXRofGFkZHN1ZmZpeHxhbmR8YmFzZW5hbWV8Y2FsbHxkaXJ8ZXJyb3J8ZXZhbHxmaWxlfGZpbHRlcig/Oi1vdXQpP3xmaW5kc3RyaW5nfGZpcnN0d29yZHxmbGF2b3J8Zm9yZWFjaHxndWlsZXxpZnxpbmZvfGpvaW58bGFzdHdvcmR8bG9hZHxub3RkaXJ8b3J8b3JpZ2lufHBhdHN1YnN0fHJlYWxwYXRofHNoZWxsfHNvcnR8c3RyaXB8c3Vic3R8c3VmZml4fHZhbHVlfHdhcm5pbmd8d2lsZGNhcmR8d29yZCg/Omxpc3R8cyk/KSg/PVsgXFx0XSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J29wZXJhdG9yJzogLyg/Ojo6fFs/OishXSk/PXxbfEBdLyxcblx0J3B1bmN0dWF0aW9uJzogL1s6Oygpe31dL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdC8vIEFsbG93IG9ubHkgb25lIGxpbmUgYnJlYWtcblx0dmFyIGlubmVyID0gLyg/OlxcXFwufFteXFxcXFxcblxccl18KD86XFxufFxcclxcbj8pKD8hW1xcclxcbl0pKS8uc291cmNlO1xuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIGJvbGQgb3IgaXRhbGljIHBhdHRlcm4uXG5cdCAqXG5cdCAqIFRoaXMgYWxzbyBhZGRzIGEgbG9va2JlaGluZCBncm91cCB0byB0aGUgZ2l2ZW4gcGF0dGVybiB0byBlbnN1cmUgdGhhdCB0aGUgcGF0dGVybiBpcyBub3QgYmFja3NsYXNoLWVzY2FwZWQuXG5cdCAqXG5cdCAqIF9Ob3RlOl8gS2VlcCBpbiBtaW5kIHRoYXQgdGhpcyBhZGRzIGEgY2FwdHVyaW5nIGdyb3VwLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVyblxuXHQgKiBAcmV0dXJucyB7UmVnRXhwfVxuXHQgKi9cblx0ZnVuY3Rpb24gY3JlYXRlSW5saW5lKHBhdHRlcm4pIHtcblx0XHRwYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlKC88aW5uZXI+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGlubmVyOyB9KTtcblx0XHRyZXR1cm4gUmVnRXhwKC8oKD86XnxbXlxcXFxdKSg/OlxcXFx7Mn0pKikvLnNvdXJjZSArICcoPzonICsgcGF0dGVybiArICcpJyk7XG5cdH1cblxuXG5cdHZhciB0YWJsZUNlbGwgPSAvKD86XFxcXC58YGAoPzpbXmBcXHJcXG5dfGAoPyFgKSkrYGB8YFteYFxcclxcbl0rYHxbXlxcXFx8XFxyXFxuYF0pKy8uc291cmNlO1xuXHR2YXIgdGFibGVSb3cgPSAvXFx8P19fKD86XFx8X18pK1xcfD8oPzooPzpcXG58XFxyXFxuPyl8KD8hW1xcc1xcU10pKS8uc291cmNlLnJlcGxhY2UoL19fL2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRhYmxlQ2VsbDsgfSk7XG5cdHZhciB0YWJsZUxpbmUgPSAvXFx8P1sgXFx0XSo6Py17Myx9Oj9bIFxcdF0qKD86XFx8WyBcXHRdKjo/LXszLH06P1sgXFx0XSopK1xcfD8oPzpcXG58XFxyXFxuPykvLnNvdXJjZTtcblxuXG5cdFByaXNtLmxhbmd1YWdlcy5tYXJrZG93biA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ21hcmt1cCcsIHt9KTtcblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnbWFya2Rvd24nLCAncHJvbG9nJywge1xuXHRcdCdmcm9udC1tYXR0ZXItYmxvY2snOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF4oPzpcXHMqW1xcclxcbl0pPyktLS0oPyEuKVtcXHNcXFNdKj9bXFxyXFxuXS0tLSg/IS4pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL14tLS18LS0tJC8sXG5cdFx0XHRcdCdmcm9udC1tYXR0ZXInOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1xcUysoPzpcXHMrXFxTKykqLyxcblx0XHRcdFx0XHRhbGlhczogWyd5YW1sJywgJ2xhbmd1YWdlLXlhbWwnXSxcblx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy55YW1sXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdibG9ja3F1b3RlJzoge1xuXHRcdFx0Ly8gPiAuLi5cblx0XHRcdHBhdHRlcm46IC9ePig/OltcXHQgXSo+KSovbSxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblx0XHQndGFibGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJ14nICsgdGFibGVSb3cgKyB0YWJsZUxpbmUgKyAnKD86JyArIHRhYmxlUm93ICsgJykqJywgJ20nKSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQndGFibGUtZGF0YS1yb3dzJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnXignICsgdGFibGVSb3cgKyB0YWJsZUxpbmUgKyAnKSg/OicgKyB0YWJsZVJvdyArICcpKiQnKSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3RhYmxlLWRhdGEnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCh0YWJsZUNlbGwpLFxuXHRcdFx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5tYXJrZG93blxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXHwvXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQndGFibGUtbGluZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJ14oJyArIHRhYmxlUm93ICsgJyknICsgdGFibGVMaW5lICsgJyQnKSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcfHw6Py17Myx9Oj8vXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQndGFibGUtaGVhZGVyLXJvdyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJ14nICsgdGFibGVSb3cgKyAnJCcpLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3RhYmxlLWhlYWRlcic6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogUmVnRXhwKHRhYmxlQ2VsbCksXG5cdFx0XHRcdFx0XHRcdGFsaWFzOiAnaW1wb3J0YW50Jyxcblx0XHRcdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMubWFya2Rvd25cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFx8L1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2NvZGUnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFByZWZpeGVkIGJ5IDQgc3BhY2VzIG9yIDEgdGFiIGFuZCBwcmVjZWRlZCBieSBhbiBlbXB0eSBsaW5lXG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxcXG4pWyBcXHRdKlxcbnwoPzpefFxcclxcbj8pWyBcXHRdKlxcclxcbj8pKD86IHs0fXxcXHQpLisoPzooPzpcXG58XFxyXFxuPykoPzogezR9fFxcdCkuKykqLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gYGBgb3B0aW9uYWwgbGFuZ3VhZ2Vcblx0XHRcdFx0Ly8gY29kZSBibG9ja1xuXHRcdFx0XHQvLyBgYGBcblx0XHRcdFx0cGF0dGVybjogL15gYGBbXFxzXFxTXSo/XmBgYCQvbSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnY29kZS1ibG9jayc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9eKGBgYC4qKD86XFxufFxcclxcbj8pKVtcXHNcXFNdKz8oPz0oPzpcXG58XFxyXFxuPyleYGBgJCkvbSxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdjb2RlLWxhbmd1YWdlJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL14oYGBgKS4rLyxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9gYGAvXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXHRcdCd0aXRsZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gdGl0bGUgMVxuXHRcdFx0XHQvLyA9PT09PT09XG5cblx0XHRcdFx0Ly8gdGl0bGUgMlxuXHRcdFx0XHQvLyAtLS0tLS0tXG5cdFx0XHRcdHBhdHRlcm46IC9cXFMuKig/OlxcbnxcXHJcXG4/KSg/Oj09K3wtLSspKD89WyBcXHRdKiQpL20sXG5cdFx0XHRcdGFsaWFzOiAnaW1wb3J0YW50Jyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0cHVuY3R1YXRpb246IC89PSskfC0tKyQvXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vICMgdGl0bGUgMVxuXHRcdFx0XHQvLyAjIyMjIyMgdGl0bGUgNlxuXHRcdFx0XHRwYXR0ZXJuOiAvKF5cXHMqKSMuKy9tLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ2ltcG9ydGFudCcsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdHB1bmN0dWF0aW9uOiAvXiMrfCMrJC9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2hyJzoge1xuXHRcdFx0Ly8gKioqXG5cdFx0XHQvLyAtLS1cblx0XHRcdC8vICogKiAqXG5cdFx0XHQvLyAtLS0tLS0tLS0tLVxuXHRcdFx0cGF0dGVybjogLyheXFxzKikoWyotXSkoPzpbXFx0IF0qXFwyKXsyLH0oPz1cXHMqJCkvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cdFx0J2xpc3QnOiB7XG5cdFx0XHQvLyAqIGl0ZW1cblx0XHRcdC8vICsgaXRlbVxuXHRcdFx0Ly8gLSBpdGVtXG5cdFx0XHQvLyAxLiBpdGVtXG5cdFx0XHRwYXR0ZXJuOiAvKF5cXHMqKSg/OlsqKy1dfFxcZCtcXC4pKD89W1xcdCBdLikvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cdFx0J3VybC1yZWZlcmVuY2UnOiB7XG5cdFx0XHQvLyBbaWRdOiBodHRwOi8vZXhhbXBsZS5jb20gXCJPcHRpb25hbCB0aXRsZVwiXG5cdFx0XHQvLyBbaWRdOiBodHRwOi8vZXhhbXBsZS5jb20gJ09wdGlvbmFsIHRpdGxlJ1xuXHRcdFx0Ly8gW2lkXTogaHR0cDovL2V4YW1wbGUuY29tIChPcHRpb25hbCB0aXRsZSlcblx0XHRcdC8vIFtpZF06IDxodHRwOi8vZXhhbXBsZS5jb20+IFwiT3B0aW9uYWwgdGl0bGVcIlxuXHRcdFx0cGF0dGVybjogLyE/XFxbW15cXF1dK1xcXTpbXFx0IF0rKD86XFxTK3w8KD86XFxcXC58W14+XFxcXF0pKz4pKD86W1xcdCBdKyg/OlwiKD86XFxcXC58W15cIlxcXFxdKSpcInwnKD86XFxcXC58W14nXFxcXF0pKid8XFwoKD86XFxcXC58W14pXFxcXF0pKlxcKSkpPy8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3ZhcmlhYmxlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eKCE/XFxbKVteXFxdXSsvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0J3N0cmluZyc6IC8oPzpcIig/OlxcXFwufFteXCJcXFxcXSkqXCJ8Jyg/OlxcXFwufFteJ1xcXFxdKSonfFxcKCg/OlxcXFwufFteKVxcXFxdKSpcXCkpJC8sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eW1xcW1xcXSE6XXxbPD5dL1xuXHRcdFx0fSxcblx0XHRcdGFsaWFzOiAndXJsJ1xuXHRcdH0sXG5cdFx0J2JvbGQnOiB7XG5cdFx0XHQvLyAqKnN0cm9uZyoqXG5cdFx0XHQvLyBfX3N0cm9uZ19fXG5cblx0XHRcdC8vIGFsbG93IG9uZSBuZXN0ZWQgaW5zdGFuY2Ugb2YgaXRhbGljIHRleHQgdXNpbmcgdGhlIHNhbWUgZGVsaW1pdGVyXG5cdFx0XHRwYXR0ZXJuOiBjcmVhdGVJbmxpbmUoL1xcYl9fKD86KD8hXyk8aW5uZXI+fF8oPzooPyFfKTxpbm5lcj4pK18pK19fXFxifFxcKlxcKig/Oig/IVxcKik8aW5uZXI+fFxcKig/Oig/IVxcKik8aW5uZXI+KStcXCopK1xcKlxcKi8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2NvbnRlbnQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyheLi4pW1xcc1xcU10rKD89Li4kKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IHt9IC8vIHNlZSBiZWxvd1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwqXFwqfF9fL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2l0YWxpYyc6IHtcblx0XHRcdC8vICplbSpcblx0XHRcdC8vIF9lbV9cblxuXHRcdFx0Ly8gYWxsb3cgb25lIG5lc3RlZCBpbnN0YW5jZSBvZiBib2xkIHRleHQgdXNpbmcgdGhlIHNhbWUgZGVsaW1pdGVyXG5cdFx0XHRwYXR0ZXJuOiBjcmVhdGVJbmxpbmUoL1xcYl8oPzooPyFfKTxpbm5lcj58X18oPzooPyFfKTxpbm5lcj4pK19fKStfXFxifFxcKig/Oig/IVxcKik8aW5uZXI+fFxcKlxcKig/Oig/IVxcKik8aW5uZXI+KStcXCpcXCopK1xcKi8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2NvbnRlbnQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyheLilbXFxzXFxTXSsoPz0uJCkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiB7fSAvLyBzZWUgYmVsb3dcblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1sqX10vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnc3RyaWtlJzoge1xuXHRcdFx0Ly8gfn5zdHJpa2UgdGhyb3VnaH5+XG5cdFx0XHQvLyB+c3RyaWtlflxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9zdHJpY3Rcblx0XHRcdHBhdHRlcm46IGNyZWF0ZUlubGluZSgvKH5+PykoPzooPyF+KTxpbm5lcj4pK1xcMi8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2NvbnRlbnQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhefn4/KVtcXHNcXFNdKyg/PVxcMSQpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZToge30gLy8gc2VlIGJlbG93XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9+fj8vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnY29kZS1zbmlwcGV0Jzoge1xuXHRcdFx0Ly8gYGNvZGVgXG5cdFx0XHQvLyBgYGNvZGVgYFxuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXGBdKSg/OmBgW15gXFxyXFxuXSsoPzpgW15gXFxyXFxuXSspKmBgKD8hYCl8YFteYFxcclxcbl0rYCg/IWApKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6IFsnY29kZScsICdrZXl3b3JkJ11cblx0XHR9LFxuXHRcdCd1cmwnOiB7XG5cdFx0XHQvLyBbZXhhbXBsZV0oaHR0cDovL2V4YW1wbGUuY29tIFwiT3B0aW9uYWwgdGl0bGVcIilcblx0XHRcdC8vIFtleGFtcGxlXVtpZF1cblx0XHRcdC8vIFtleGFtcGxlXSBbaWRdXG5cdFx0XHRwYXR0ZXJuOiBjcmVhdGVJbmxpbmUoLyE/XFxbKD86KD8hXFxdKTxpbm5lcj4pK1xcXSg/OlxcKFteXFxzKV0rKD86W1xcdCBdK1wiKD86XFxcXC58W15cIlxcXFxdKSpcIik/XFwpfFsgXFx0XT9cXFsoPzooPyFcXF0pPGlubmVyPikrXFxdKS8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J29wZXJhdG9yJzogL14hLyxcblx0XHRcdFx0J2NvbnRlbnQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyheXFxbKVteXFxdXSsoPz1cXF0pLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZToge30gLy8gc2VlIGJlbG93XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCd2YXJpYWJsZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5cXF1bIFxcdF0/XFxbKVteXFxdXSsoPz1cXF0kKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQndXJsJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXlxcXVxcKClbXlxccyldKy8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnc3RyaW5nJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSspXCIoPzpcXFxcLnxbXlwiXFxcXF0pKlwiKD89XFwpJCkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0Wyd1cmwnLCAnYm9sZCcsICdpdGFsaWMnLCAnc3RyaWtlJ10uZm9yRWFjaChmdW5jdGlvbiAodG9rZW4pIHtcblx0XHRbJ3VybCcsICdib2xkJywgJ2l0YWxpYycsICdzdHJpa2UnLCAnY29kZS1zbmlwcGV0J10uZm9yRWFjaChmdW5jdGlvbiAoaW5zaWRlKSB7XG5cdFx0XHRpZiAodG9rZW4gIT09IGluc2lkZSkge1xuXHRcdFx0XHRQcmlzbS5sYW5ndWFnZXMubWFya2Rvd25bdG9rZW5dLmluc2lkZS5jb250ZW50Lmluc2lkZVtpbnNpZGVdID0gUHJpc20ubGFuZ3VhZ2VzLm1hcmtkb3duW2luc2lkZV07XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0pO1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYWZ0ZXItdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0aWYgKGVudi5sYW5ndWFnZSAhPT0gJ21hcmtkb3duJyAmJiBlbnYubGFuZ3VhZ2UgIT09ICdtZCcpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiB3YWxrVG9rZW5zKHRva2Vucykge1xuXHRcdFx0aWYgKCF0b2tlbnMgfHwgdHlwZW9mIHRva2VucyA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKHZhciBpID0gMCwgbCA9IHRva2Vucy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdFx0dmFyIHRva2VuID0gdG9rZW5zW2ldO1xuXG5cdFx0XHRcdGlmICh0b2tlbi50eXBlICE9PSAnY29kZScpIHtcblx0XHRcdFx0XHR3YWxrVG9rZW5zKHRva2VuLmNvbnRlbnQpO1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Lypcblx0XHRcdFx0ICogQWRkIHRoZSBjb3JyZWN0IGBsYW5ndWFnZS14eHh4YCBjbGFzcyB0byB0aGlzIGNvZGUgYmxvY2suIEtlZXAgaW4gbWluZCB0aGF0IHRoZSBgY29kZS1sYW5ndWFnZWAgdG9rZW5cblx0XHRcdFx0ICogaXMgb3B0aW9uYWwuIEJ1dCB0aGUgZ3JhbW1hciBpcyBkZWZpbmVkIHNvIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgY2FzZSB3ZSBoYXZlIHRvIGhhbmRsZTpcblx0XHRcdFx0ICpcblx0XHRcdFx0ICogdG9rZW4uY29udGVudCA9IFtcblx0XHRcdFx0ICogICAgIDxzcGFuIGNsYXNzPVwicHVuY3R1YXRpb25cIj5gYGA8L3NwYW4+LFxuXHRcdFx0XHQgKiAgICAgPHNwYW4gY2xhc3M9XCJjb2RlLWxhbmd1YWdlXCI+eHh4eDwvc3Bhbj4sXG5cdFx0XHRcdCAqICAgICAnXFxuJywgLy8gZXhhY3RseSBvbmUgbmV3IGxpbmVzIChcXHIgb3IgXFxuIG9yIFxcclxcbilcblx0XHRcdFx0ICogICAgIDxzcGFuIGNsYXNzPVwiY29kZS1ibG9ja1wiPi4uLjwvc3Bhbj4sXG5cdFx0XHRcdCAqICAgICAnXFxuJywgLy8gZXhhY3RseSBvbmUgbmV3IGxpbmVzIGFnYWluXG5cdFx0XHRcdCAqICAgICA8c3BhbiBjbGFzcz1cInB1bmN0dWF0aW9uXCI+YGBgPC9zcGFuPlxuXHRcdFx0XHQgKiBdO1xuXHRcdFx0XHQgKi9cblxuXHRcdFx0XHR2YXIgY29kZUxhbmcgPSB0b2tlbi5jb250ZW50WzFdO1xuXHRcdFx0XHR2YXIgY29kZUJsb2NrID0gdG9rZW4uY29udGVudFszXTtcblxuXHRcdFx0XHRpZiAoY29kZUxhbmcgJiYgY29kZUJsb2NrICYmXG5cdFx0XHRcdFx0Y29kZUxhbmcudHlwZSA9PT0gJ2NvZGUtbGFuZ3VhZ2UnICYmIGNvZGVCbG9jay50eXBlID09PSAnY29kZS1ibG9jaycgJiZcblx0XHRcdFx0XHR0eXBlb2YgY29kZUxhbmcuY29udGVudCA9PT0gJ3N0cmluZycpIHtcblxuXHRcdFx0XHRcdC8vIHRoaXMgbWlnaHQgYmUgYSBsYW5ndWFnZSB0aGF0IFByaXNtIGRvZXMgbm90IHN1cHBvcnRcblxuXHRcdFx0XHRcdC8vIGRvIHNvbWUgcmVwbGFjZW1lbnRzIHRvIHN1cHBvcnQgQysrLCBDIywgYW5kIEYjXG5cdFx0XHRcdFx0dmFyIGxhbmcgPSBjb2RlTGFuZy5jb250ZW50LnJlcGxhY2UoL1xcYiMvZywgJ3NoYXJwJykucmVwbGFjZSgvXFxiXFwrXFwrL2csICdwcCcpO1xuXHRcdFx0XHRcdC8vIG9ubHkgdXNlIHRoZSBmaXJzdCB3b3JkXG5cdFx0XHRcdFx0bGFuZyA9ICgvW2Etel1bXFx3LV0qL2kuZXhlYyhsYW5nKSB8fCBbJyddKVswXS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdHZhciBhbGlhcyA9ICdsYW5ndWFnZS0nICsgbGFuZztcblxuXHRcdFx0XHRcdC8vIGFkZCBhbGlhc1xuXHRcdFx0XHRcdGlmICghY29kZUJsb2NrLmFsaWFzKSB7XG5cdFx0XHRcdFx0XHRjb2RlQmxvY2suYWxpYXMgPSBbYWxpYXNdO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIGNvZGVCbG9jay5hbGlhcyA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0XHRcdGNvZGVCbG9jay5hbGlhcyA9IFtjb2RlQmxvY2suYWxpYXMsIGFsaWFzXTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29kZUJsb2NrLmFsaWFzLnB1c2goYWxpYXMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHdhbGtUb2tlbnMoZW52LnRva2Vucyk7XG5cdH0pO1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnd3JhcCcsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRpZiAoZW52LnR5cGUgIT09ICdjb2RlLWJsb2NrJykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBjb2RlTGFuZyA9ICcnO1xuXHRcdGZvciAodmFyIGkgPSAwLCBsID0gZW52LmNsYXNzZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHR2YXIgY2xzID0gZW52LmNsYXNzZXNbaV07XG5cdFx0XHR2YXIgbWF0Y2ggPSAvbGFuZ3VhZ2UtKC4rKS8uZXhlYyhjbHMpO1xuXHRcdFx0aWYgKG1hdGNoKSB7XG5cdFx0XHRcdGNvZGVMYW5nID0gbWF0Y2hbMV07XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHZhciBncmFtbWFyID0gUHJpc20ubGFuZ3VhZ2VzW2NvZGVMYW5nXTtcblxuXHRcdGlmICghZ3JhbW1hcikge1xuXHRcdFx0aWYgKGNvZGVMYW5nICYmIGNvZGVMYW5nICE9PSAnbm9uZScgJiYgUHJpc20ucGx1Z2lucy5hdXRvbG9hZGVyKSB7XG5cdFx0XHRcdHZhciBpZCA9ICdtZC0nICsgbmV3IERhdGUoKS52YWx1ZU9mKCkgKyAnLScgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxZTE2KTtcblx0XHRcdFx0ZW52LmF0dHJpYnV0ZXNbJ2lkJ10gPSBpZDtcblxuXHRcdFx0XHRQcmlzbS5wbHVnaW5zLmF1dG9sb2FkZXIubG9hZExhbmd1YWdlcyhjb2RlTGFuZywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHZhciBlbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG5cdFx0XHRcdFx0aWYgKGVsZSkge1xuXHRcdFx0XHRcdFx0ZWxlLmlubmVySFRNTCA9IFByaXNtLmhpZ2hsaWdodChlbGUudGV4dENvbnRlbnQsIFByaXNtLmxhbmd1YWdlc1tjb2RlTGFuZ10sIGNvZGVMYW5nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbnYuY29udGVudCA9IFByaXNtLmhpZ2hsaWdodCh0ZXh0Q29udGVudChlbnYuY29udGVudCksIGdyYW1tYXIsIGNvZGVMYW5nKTtcblx0XHR9XG5cdH0pO1xuXG5cdHZhciB0YWdQYXR0ZXJuID0gUmVnRXhwKFByaXNtLmxhbmd1YWdlcy5tYXJrdXAudGFnLnBhdHRlcm4uc291cmNlLCAnZ2knKTtcblxuXHQvKipcblx0ICogQSBsaXN0IG9mIGtub3duIGVudGl0eSBuYW1lcy5cblx0ICpcblx0ICogVGhpcyB3aWxsIGFsd2F5cyBiZSBpbmNvbXBsZXRlIHRvIHNhdmUgc3BhY2UuIFRoZSBjdXJyZW50IGxpc3QgaXMgdGhlIG9uZSB1c2VkIGJ5IGxvd2Rhc2gncyB1bmVzY2FwZSBmdW5jdGlvbi5cblx0ICpcblx0ICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi8yZGEwMjRjM2I0Zjk5NDdhNDg1MTc2MzlkZTc1NjA0NTdjZDRlYzZjL3VuZXNjYXBlLmpzI0wyfVxuXHQgKi9cblx0dmFyIEtOT1dOX0VOVElUWV9OQU1FUyA9IHtcblx0XHQnYW1wJzogJyYnLFxuXHRcdCdsdCc6ICc8Jyxcblx0XHQnZ3QnOiAnPicsXG5cdFx0J3F1b3QnOiAnXCInLFxuXHR9O1xuXG5cdC8vIElFIDExIGRvZXNuJ3Qgc3VwcG9ydCBgU3RyaW5nLmZyb21Db2RlUG9pbnRgXG5cdHZhciBmcm9tQ29kZVBvaW50ID0gU3RyaW5nLmZyb21Db2RlUG9pbnQgfHwgU3RyaW5nLmZyb21DaGFyQ29kZTtcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgdGV4dCBjb250ZW50IG9mIGEgZ2l2ZW4gSFRNTCBzb3VyY2UgY29kZSBzdHJpbmcuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBodG1sXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdCAqL1xuXHRmdW5jdGlvbiB0ZXh0Q29udGVudChodG1sKSB7XG5cdFx0Ly8gcmVtb3ZlIGFsbCB0YWdzXG5cdFx0dmFyIHRleHQgPSBodG1sLnJlcGxhY2UodGFnUGF0dGVybiwgJycpO1xuXG5cdFx0Ly8gZGVjb2RlIGtub3duIGVudGl0aWVzXG5cdFx0dGV4dCA9IHRleHQucmVwbGFjZSgvJihcXHd7MSw4fXwjeD9bXFxkYS1mXXsxLDh9KTsvZ2ksIGZ1bmN0aW9uIChtLCBjb2RlKSB7XG5cdFx0XHRjb2RlID0gY29kZS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRpZiAoY29kZVswXSA9PT0gJyMnKSB7XG5cdFx0XHRcdHZhciB2YWx1ZTtcblx0XHRcdFx0aWYgKGNvZGVbMV0gPT09ICd4Jykge1xuXHRcdFx0XHRcdHZhbHVlID0gcGFyc2VJbnQoY29kZS5zbGljZSgyKSwgMTYpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHZhbHVlID0gTnVtYmVyKGNvZGUuc2xpY2UoMSkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGZyb21Db2RlUG9pbnQodmFsdWUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIGtub3duID0gS05PV05fRU5USVRZX05BTUVTW2NvZGVdO1xuXHRcdFx0XHRpZiAoa25vd24pIHtcblx0XHRcdFx0XHRyZXR1cm4ga25vd247XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyB1bmFibGUgdG8gZGVjb2RlXG5cdFx0XHRcdHJldHVybiBtO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHRleHQ7XG5cdH1cblxuXHRQcmlzbS5sYW5ndWFnZXMubWQgPSBQcmlzbS5sYW5ndWFnZXMubWFya2Rvd247XG5cbn0oUHJpc20pKTtcblxuLy8gaHR0cHM6Ly93d3cuc3RhdGEuY29tL21hbnVhbHMvbS5wZGZcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBvcmdUeXBlID0gL1xcYig/Oig/OmNvbHxyb3cpP3ZlY3RvcnxtYXRyaXh8c2NhbGFyKVxcYi8uc291cmNlO1xuXHR2YXIgdHlwZSA9IC9cXGJ2b2lkXFxifDxvcmc+fFxcYig/OmNvbXBsZXh8bnVtZXJpY3xwb2ludGVyKD86XFxzKlxcKFteKCldKlxcKSk/fHJlYWx8c3RyaW5nfCg/OmNsYXNzfHN0cnVjdClcXHMrXFx3K3x0cmFuc21vcnBoaWMpKD86XFxzKjxvcmc+KT8vLnNvdXJjZVxuXHRcdC5yZXBsYWNlKC88b3JnPi9nLCBvcmdUeXBlKTtcblxuXHRQcmlzbS5sYW5ndWFnZXMubWF0YSA9IHtcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXC9cXC8uKnxcXC9cXCooPzpbXiovXXxcXCooPyFcXC8pfFxcLyg/IVxcKil8XFwvXFwqKD86W14qXXxcXCooPyFcXC8pKSpcXCpcXC8pKlxcKlxcLy8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXCJbXlwiXFxyXFxuXSpcInxbXHUyMDE4YCddXCIuKj9cIltcdTIwMTlgJ10vLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblxuXHRcdCdjbGFzcy1uYW1lJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXGIoPzpjbGFzc3xleHRlbmRzfHN0cnVjdClcXHMrKVxcdysoPz1cXHMqKD86XFx7fFxcYmV4dGVuZHNcXGIpKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQndHlwZSc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCh0eXBlKSxcblx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZScsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1soKV0vLFxuXHRcdFx0XHQna2V5d29yZCc6IC9cXGIoPzpjbGFzc3xmdW5jdGlvbnxzdHJ1Y3R8dm9pZClcXGIvXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQna2V5d29yZCc6IC9cXGIoPzpicmVha3xjbGFzc3xjb250aW51ZXxkb3xlbHNlfGVuZHxleHRlbmRzfGV4dGVybmFsfGZpbmFsfGZvcnxmdW5jdGlvbnxnb3RvfGlmfHByYWdtYXxwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8cmV0dXJufHN0YXRpY3xzdHJ1Y3R8dW5zZXR8dW51c2VkfHZlcnNpb258dmlydHVhbHx3aGlsZSlcXGIvLFxuXHRcdCdjb25zdGFudCc6IC9cXGJOVUxMXFxiLyxcblxuXHRcdCdudW1iZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXHcuXSkoPzpcXGQrKD86XFwuXFxkKyk/KD86ZVsrLV0/XFxkKyk/fFxcZFthLWYwLTldKig/OlxcLlthLWYwLTldKyk/eFsrLV0/XFxkKylpPyg/IVtcXHcuXSkvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdtaXNzaW5nJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXFx3Ll0pKD86XFwuW2Etel0/KSg/IVtcXHcuXSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHRcdH0sXG5cblx0XHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVxccypcXCgpL2ksXG5cblx0XHQnb3BlcmF0b3InOiAvXFwuXFwufFxcK1xcK3wtLXwmJnxcXHxcXHx8Oj8oPzpbIT08Pl09fFsrXFwtKi9ePD4mfDpdKXxbIT89XFxcXCNcdTIwMTlgJ10vLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bKClbXFxde30sOy5dL1xuXHR9O1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5tYXRsYWIgPSB7XG5cdCdjb21tZW50JzogW1xuXHRcdC8lXFx7W1xcc1xcU10qP1xcfSUvLFxuXHRcdC8lLisvXG5cdF0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1xcQicoPzonJ3xbXidcXHJcXG5dKSonLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0Ly8gRklYTUUgV2UgY291bGQgaGFuZGxlIGltYWdpbmFyeSBudW1iZXJzIGFzIGEgd2hvbGVcblx0J251bWJlcic6IC8oPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86W2VFXVsrLV0/XFxkKyk/KD86W2lqXSk/fFxcYltpal1cXGIvLFxuXHQna2V5d29yZCc6IC9cXGIoPzpOYU58YnJlYWt8Y2FzZXxjYXRjaHxjb250aW51ZXxlbHNlfGVsc2VpZnxlbmR8Zm9yfGZ1bmN0aW9ufGlmfGluZnxvdGhlcndpc2V8cGFyZm9yfHBhdXNlfHBpfHJldHVybnxzd2l0Y2h8dHJ5fHdoaWxlKVxcYi8sXG5cdCdmdW5jdGlvbic6IC9cXGIoPyFcXGQpXFx3Kyg/PVxccypcXCgpLyxcblx0J29wZXJhdG9yJzogL1xcLj9bKl5cXC9cXFxcJ118WytcXC06QF18Wzw+PX5dPT98JiY/fFxcfFxcfD8vLFxuXHQncHVuY3R1YXRpb24nOiAvXFwuezN9fFsuLDtcXFtcXF0oKXt9IV0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGtleXdvcmRzID0gL1xcYig/OmFib3V0fGFuZHxhbmltYXRlfGFzfGF0fGF0dHJpYnV0ZXN8Ynl8Y2FzZXxjYXRjaHxjb2xsZWN0fGNvbnRpbnVlfGNvb3Jkc3lzfGRvfGVsc2V8ZXhpdHxmbnxmb3J8ZnJvbXxmdW5jdGlvbnxnbG9iYWx8aWZ8aW58bG9jYWx8bWFjcm9zY3JpcHR8bWFwcGVkfG1heHxub3R8b2Z8b2ZmfG9ufG9yfHBhcmFtZXRlcnN8cGVyc2lzdGVudHxwbHVnaW58cmNtZW51fHJldHVybnxyb2xsb3V0fHNldHxzdHJ1Y3R8dGhlbnx0aHJvd3x0b3x0b29sfHRyeXx1bmRvfHV0aWxpdHl8d2hlbnx3aGVyZXx3aGlsZXx3aXRoKVxcYi9pO1xuXG5cblx0UHJpc20ubGFuZ3VhZ2VzLm1heHNjcmlwdCA9IHtcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXC9cXCpbXFxzXFxTXSo/KD86XFwqXFwvfCQpfC0tLiovLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXCJcXFxcQF0pKD86XCIoPzpbXlwiXFxcXF18XFxcXFtcXHNcXFNdKSpcInxAXCJbXlwiXSpcIikvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J3BhdGgnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwkKD86W1xcdy9cXFxcLio/XXwnW14nXSonKSovLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdzdHJpbmcnXG5cdFx0fSxcblxuXHRcdCdmdW5jdGlvbi1jYWxsJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0XHQnKCg/OicgKyAoXG5cdFx0XHRcdFx0Ly8gc3RhcnQgb2YgbGluZVxuXHRcdFx0XHRcdC9eLy5zb3VyY2UgK1xuXHRcdFx0XHRcdCd8JyArXG5cdFx0XHRcdFx0Ly8gb3BlcmF0b3JzIGFuZCBvdGhlciBsYW5ndWFnZSBjb25zdHJ1Y3RzXG5cdFx0XHRcdFx0L1s7PTw+K1xcLSovXih7XFxbXS8uc291cmNlICtcblx0XHRcdFx0XHQnfCcgK1xuXHRcdFx0XHRcdC8vIGtleXdvcmRzIGFzIHBhcnQgb2Ygc3RhdGVtZW50c1xuXHRcdFx0XHRcdC9cXGIoPzphbmR8Ynl8Y2FzZXxjYXRjaHxjb2xsZWN0fGRvfGVsc2V8aWZ8aW58bm90fG9yfHJldHVybnx0aGVufHRvfHRyeXx3aGVyZXx3aGlsZXx3aXRoKVxcYi8uc291cmNlXG5cdFx0XHRcdCkgKyAnKVsgXFx0XSopJyArXG5cblx0XHRcdFx0Jyg/IScgKyBrZXl3b3Jkcy5zb3VyY2UgKyAnKScgKyAvW2Etel9dXFx3KlxcYi8uc291cmNlICtcblxuXHRcdFx0XHQnKD89WyBcXHRdKig/OicgKyAoXG5cdFx0XHRcdFx0Ly8gdmFyaWFibGVcblx0XHRcdFx0XHQnKD8hJyArIGtleXdvcmRzLnNvdXJjZSArICcpJyArIC9bYS16X10vLnNvdXJjZSArXG5cdFx0XHRcdFx0J3wnICtcblx0XHRcdFx0XHQvLyBudW1iZXJcblx0XHRcdFx0XHQvXFxkfC1cXC4/XFxkLy5zb3VyY2UgK1xuXHRcdFx0XHRcdCd8JyArXG5cdFx0XHRcdFx0Ly8gb3RoZXIgZXhwcmVzc2lvbnMgb3IgbGl0ZXJhbHNcblx0XHRcdFx0XHQvWyh7J1wiJEAjP10vLnNvdXJjZVxuXHRcdFx0XHQpICsgJykpJyxcblx0XHRcdFx0J2ltJ1xuXHRcdFx0KSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH0sXG5cblx0XHQnZnVuY3Rpb24tZGVmaW5pdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxiKD86Zm58ZnVuY3Rpb24pXFxzKylcXHcrXFxiL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9LFxuXG5cdFx0J2FyZ3VtZW50Jzoge1xuXHRcdFx0cGF0dGVybjogL1xcYlthLXpfXVxcdyooPz06KS9pLFxuXHRcdFx0YWxpYXM6ICdhdHRyLW5hbWUnXG5cdFx0fSxcblxuXHRcdCdrZXl3b3JkJzoga2V5d29yZHMsXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXG5cdFx0J3RpbWUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXHcuXSkoPzooPzooPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKD86W2VFZERdWystXVxcZCt8W0xQXSk/W21zZnRdKSt8XFxkKzpcXGQrKD86XFwuXFxkKik/KSg/IVtcXHcuOl0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ251bWJlcidcblx0XHR9LFxuXHRcdCdudW1iZXInOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcdy5dKSg/Oig/OlxcZCsoPzpcXC5cXGQqKT98XFwuXFxkKykoPzpbZUVkRF1bKy1dXFxkK3xbTFBdKT98MHhbYS1mQS1GMC05XSspKD8hW1xcdy46XSkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0L1xcYig/OmV8cGkpXFxiL1xuXHRcdF0sXG5cblx0XHQnY29uc3RhbnQnOiAvXFxiKD86ZG9udGNvbGxlY3R8b2t8c2lsZW50VmFsdWV8dW5kZWZpbmVkfHVuc3VwcGxpZWQpXFxiLyxcblx0XHQnY29sb3InOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86YmxhY2t8Ymx1ZXxicm93bnxncmF5fGdyZWVufG9yYW5nZXxyZWR8d2hpdGV8eWVsbG93KVxcYi9pLFxuXHRcdFx0YWxpYXM6ICdjb25zdGFudCdcblx0XHR9LFxuXG5cdFx0J29wZXJhdG9yJzogL1stKyovPD49IV09P3xbJl4/XXwjKD8hXFwoKS8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1soKVxcW1xcXXt9LjosO118Iyg/PVxcKCl8XFxcXCQvbVxuXHR9O1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5tZWwgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXC9cXC8uKnxcXC9cXCpbXFxzXFxTXSo/XFwqXFwvLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NvZGUnOiB7XG5cdFx0cGF0dGVybjogL2AoPzpcXFxcLnxbXlxcXFxgXSkqYC8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnaXRhbGljJyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eYHxgJC8sXG5cdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHR9LFxuXHRcdFx0J3N0YXRlbWVudCc6IHtcblx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86XFxcXC58W15cXFxcXCJcXHJcXG5dKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCd2YXJpYWJsZSc6IC9cXCRcXHcrLyxcblx0J251bWJlcic6IC9cXGIweFtcXGRhLWZBLUZdK1xcYnxcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCsvLFxuXHQnZmxhZyc6IHtcblx0XHRwYXR0ZXJuOiAvLVteXFxkXFxXXVxcdyovLFxuXHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmJyZWFrfGNhc2V8Y29udGludWV8ZGVmYXVsdHxkb3xlbHNlfGZsb2F0fGZvcnxnbG9iYWx8aWZ8aW58aW50fG1hdHJpeHxwcm9jfHJldHVybnxzdHJpbmd8c3dpdGNofHZlY3Rvcnx3aGlsZSlcXGIvLFxuXHQnZnVuY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogLygoPzpefFt7O10pWyBcXHRdKilbYS16X11cXHcqXFxiKD8hXFxzKig/OlxcLig/IVxcLil8W1t7PV0pKXxcXGJbYS16X11cXHcqKD89WyBcXHRdKlxcKCkvaW0sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQndGVuc29yLXB1bmN0dWF0aW9uJzoge1xuXHRcdHBhdHRlcm46IC88PHw+Pi8sXG5cdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0fSxcblx0J29wZXJhdG9yJzogL1xcK1srPV0/fC1bLT1dP3wmJnxcXHxcXHx8Wzw+XT0/fFsqXFwvIT1dPT98WyVeXS8sXG5cdCdwdW5jdHVhdGlvbic6IC9bLiw6Oz9cXFtcXF0oKXt9XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5tZWxbJ2NvZGUnXS5pbnNpZGVbJ3N0YXRlbWVudCddLmluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy5tZWw7XG5cblByaXNtLmxhbmd1YWdlcy5tZXJtYWlkID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvJSUuKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J3N0eWxlJzoge1xuXHRcdHBhdHRlcm46IC9eKFsgXFx0XSooPzpjbGFzc0RlZnxsaW5rU3R5bGV8c3R5bGUpWyBcXHRdK1tcXHckLV0rWyBcXHRdKylcXHcuKlteXFxzO10vbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3Byb3BlcnR5JzogL1xcYlxcd1tcXHctXSooPz1bIFxcdF0qOikvLFxuXHRcdFx0J29wZXJhdG9yJzogLzovLFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogLywvXG5cdFx0fVxuXHR9LFxuXG5cdCdpbnRlci1hcnJvdy1sYWJlbCc6IHtcblx0XHRwYXR0ZXJuOiAvKFtePD5veC49LV0pKD86LVstLl18PT0pKD8hWzw+b3guPS1dKVsgXFx0XSooPzpcIlteXCJcXHJcXG5dKlwifFteXFxzXCIuPS1dKD86W15cXHJcXG4uPS1dKlteXFxzLj0tXSk/KVsgXFx0XSooPzpcXC4rLT4/fC0tK1stPl18PT0rWz0+XSkoPyFbPD5veC49LV0pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdhcnJvdyc6IHtcblx0XHRcdFx0cGF0dGVybjogLyg/OlxcListPj98LS0rWy0+XXw9PStbPT5dKSQvLFxuXHRcdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdFx0fSxcblx0XHRcdCdsYWJlbCc6IHtcblx0XHRcdFx0cGF0dGVybjogL14oW1xcc1xcU117Mn1bIFxcdF0qKVxcUyg/OltcXHNcXFNdKlxcUyk/Lyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0XHRcdH0sXG5cdFx0XHQnYXJyb3ctaGVhZCc6IHtcblx0XHRcdFx0cGF0dGVybjogL15cXFMrLyxcblx0XHRcdFx0YWxpYXM6IFsnYXJyb3cnLCAnb3BlcmF0b3InXVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQnYXJyb3cnOiBbXG5cdFx0Ly8gVGhpcyBtaWdodCBsb29rIGNvbXBsZXggYnV0IGl0IHJlYWxseSBpc24ndC5cblx0XHQvLyBUaGVyZSBhcmUgbWFueSBwb3NzaWJsZSBhcnJvd3MgKHNlZSB0ZXN0cykgYW5kIGl0J3MgaW1wb3NzaWJsZSB0byBmaXQgYWxsIG9mIHRoZW0gaW50byBvbmUgcGF0dGVybi4gVGhlXG5cdFx0Ly8gcHJvYmxlbSBpcyB0aGF0IHdlIG9ubHkgaGF2ZSBvbmUgbG9va2JlaGluZCBwZXIgcGF0dGVybi4gSG93ZXZlciwgd2UgY2Fubm90IGRpc2FsbG93IHRvbyBtYW55IGFycm93XG5cdFx0Ly8gY2hhcmFjdGVycyBpbiB0aGUgb25lIGxvb2tiZWhpbmQgYmVjYXVzZSB0aGF0IHdvdWxkIGNyZWF0ZSB0b28gbWFueSBmYWxzZSBuZWdhdGl2ZXMuIFNvIHdlIGhhdmUgdG8gc3BsaXQgdGhlXG5cdFx0Ly8gYXJyb3dzIGludG8gZGlmZmVyZW50IHBhdHRlcm5zLlxuXHRcdHtcblx0XHRcdC8vIEVSIGRpYWdyYW1cblx0XHRcdHBhdHRlcm46IC8oXnxbXnt9fG8uLV0pW3x9XVt8b10oPzotLXxcXC5cXC4pW3xvXVt8e10oPyFbe318by4tXSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0fSxcblx0XHR7XG5cdFx0XHQvLyBmbG93IGNoYXJ0XG5cdFx0XHQvLyAoPzo9PSt8LS0rfC1cXC4qLSlcblx0XHRcdHBhdHRlcm46IC8oXnxbXjw+b3guPS1dKSg/Ols8b3hdKD86PT0rfC0tK3wtXFwuKi0pWz5veF0/fCg/Oj09K3wtLSt8LVxcLiotKVs+b3hdfD09PSt8LS0tK3wtXFwuKy0pKD8hWzw+b3guPS1dKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHR9LFxuXHRcdHtcblx0XHRcdC8vIHNlcXVlbmNlIGRpYWdyYW1cblx0XHRcdHBhdHRlcm46IC8oXnxbXjw+KCl4LV0pKD86LS0/KD86Pj58W3g+KV0pKD8hWzw+KCl4XSl8KD86PDx8W3g8KF0pLS0/KD8hLSkpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Ly8gY2xhc3MgZGlhZ3JhbVxuXHRcdFx0cGF0dGVybjogLyhefFtePD58Km8uLV0pKD86WypvXS0tfC0tWypvXXw8XFx8Pyg/Oi0tfFxcLlxcLil8KD86LS18XFwuXFwuKVxcfD8+fC0tfFxcLlxcLikoPyFbPD58Km8uLV0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdH0sXG5cdF0sXG5cblx0J2xhYmVsJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXnw8XSlcXHwoPzpbXlxcclxcblwifF18XCJbXlwiXFxyXFxuXSpcIikrXFx8Lyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXG5cdCd0ZXh0Jzoge1xuXHRcdHBhdHRlcm46IC8oPzpbKFxcW3tdK3xcXGI+KSg/OlteXFxyXFxuXCIoKVxcW1xcXXt9XXxcIlteXCJcXHJcXG5dKlwiKSsoPzpbKVxcXX1dK3w+KS8sXG5cdFx0YWxpYXM6ICdzdHJpbmcnXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiW15cIlxcclxcbl0qXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCdhbm5vdGF0aW9uJzoge1xuXHRcdHBhdHRlcm46IC88PCg/OmFic3RyYWN0fGNob2ljZXxlbnVtZXJhdGlvbnxmb3JrfGludGVyZmFjZXxqb2lufHNlcnZpY2UpPj58XFxbXFxbKD86Y2hvaWNlfGZvcmt8am9pbilcXF1cXF0vaSxcblx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0fSxcblxuXHQna2V5d29yZCc6IFtcblx0XHQvLyBUaGlzIGxhbmd1YWdlIGhhcyBib3RoIGNhc2Utc2Vuc2l0aXZlIGFuZCBjYXNlLWluc2Vuc2l0aXZlIGtleXdvcmRzXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKikoPzphY3Rpb258Y2FsbGJhY2t8Y2xhc3N8Y2xhc3NEZWZ8Y2xhc3NEaWFncmFtfGNsaWNrfGRpcmVjdGlvbnxlckRpYWdyYW18Zmxvd2NoYXJ0fGdhbnR0fGdpdEdyYXBofGdyYXBofGpvdXJuZXl8bGlua3xsaW5rU3R5bGV8cGllfHJlcXVpcmVtZW50RGlhZ3JhbXxzZXF1ZW5jZURpYWdyYW18c3RhdGVEaWFncmFtfHN0YXRlRGlhZ3JhbS12MnxzdHlsZXxzdWJncmFwaCkoPyFbXFx3JC1dKS9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKikoPzphY3RpdmF0ZXxhbHR8YW5kfGFzfGF1dG9udW1iZXJ8ZGVhY3RpdmF0ZXxlbHNlfGVuZCg/OlsgXFx0XStub3RlKT98bG9vcHxvcHR8cGFyfHBhcnRpY2lwYW50fHJlY3R8c3RhdGV8bm90ZVsgXFx0XSsoPzpvdmVyfCg/OmxlZnR8cmlnaHQpWyBcXHRdK29mKSkoPyFbXFx3JC1dKS9pbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdF0sXG5cblx0J2VudGl0eSc6IC8jW2EtejAtOV0rOy8sXG5cblx0J29wZXJhdG9yJzoge1xuXHRcdHBhdHRlcm46IC8oXFx3WyBcXHRdKikmKD89WyBcXHRdKlxcdyl8Ojo6fDovLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J3B1bmN0dWF0aW9uJzogL1soKXt9O10vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMubWl6YXIgPSB7XG5cdCdjb21tZW50JzogLzo6LisvLFxuXHQna2V5d29yZCc6IC9AcHJvb2ZcXGJ8XFxiKD86YWNjb3JkaW5nfGFnZ3JlZ2F0ZXxhbGx8YW5kfGFudG9ueW18YXJlfGFzfGFzc29jaWF0aXZpdHl8YXNzdW1lfGFzeW1tZXRyeXxhdHRyfGJlfGJlZ2lufGJlaW5nfGJ5fGNhbmNlbGVkfGNhc2V8Y2FzZXN8Y2x1c3RlcnM/fGNvaGVyZW5jZXxjb21tdXRhdGl2aXR5fGNvbXBhdGliaWxpdHl8Y29ubmVjdGVkbmVzc3xjb25zaWRlcnxjb25zaXN0ZW5jeXxjb25zdHJ1Y3RvcnN8Y29udHJhZGljdGlvbnxjb3JyZWN0bmVzc3xkZWZ8ZGVmZnVuY3xkZWZpbmV8ZGVmaW5pdGlvbnM/fGRlZnByZWR8ZG98ZG9lc3xlbmR8ZW52aXJvbnxlcXVhbHN8ZXh8ZXhhY3RseXxleGlzdGVuY2V8Zm9yfGZyb218ZnVuY3xnaXZlbnxoZW5jZXxoZXJlYnl8aG9sZHN8aWRlbXBvdGVuY2V8aWRlbnRpdHl8aWZmP3xpbXBsaWVzfGludm9sdXRpdmVuZXNzfGlycmVmbGV4aXZpdHl8aXN8aXR8bGV0fG1lYW5zfG1vZGV8bm9ufG5vdHxub3RhdGlvbnM/fG5vd3xvZnxvcnxvdGhlcndpc2V8b3ZlcnxwZXJ8cHJlZHxwcmVmaXh8cHJvamVjdGl2aXR5fHByb29mfHByb3ZpZGVkfHF1YXxyZWNvbnNpZGVyfHJlZGVmaW5lfHJlZHVjZXxyZWR1Y2liaWxpdHl8cmVmbGV4aXZpdHl8cmVnaXN0cmF0aW9ucz98cmVxdWlyZW1lbnRzfHJlc2VydmV8c2NofHNjaGVtZXM/fHNlY3Rpb258c2VsZWN0b3J8c2V0fHNldGhvb2R8c3R8c3RydWN0fHN1Y2h8c3VwcG9zZXxzeW1tZXRyeXxzeW5vbnltfHRha2V8dGhhdHx0aGV8dGhlbnx0aGVvcmVtcz98dGhlc2lzfHRodXN8dG98dHJhbnNpdGl2aXR5fHVuaXF1ZW5lc3N8dm9jYWJ1bGFyKD86aWVzfHkpfHdoZW58d2hlcmV8d2l0aHx3cnQpXFxiLyxcblx0J3BhcmFtZXRlcic6IHtcblx0XHRwYXR0ZXJuOiAvXFwkKD86MTB8XFxkKS8sXG5cdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0fSxcblx0J3ZhcmlhYmxlJzogL1xcYlxcdysoPz06KS8sXG5cdCdudW1iZXInOiAvKD86XFxifC0pXFxkK1xcYi8sXG5cdCdvcGVyYXRvcic6IC9cXC5cXC5cXC58LT58JnxcXC4/PS8sXG5cdCdwdW5jdHVhdGlvbic6IC9cXCgjfCNcXCl8Wyw6O1xcW1xcXSgpe31dL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBvcGVyYXRvcnMgPSBbXG5cdFx0Ly8gcXVlcnkgYW5kIHByb2plY3Rpb25cblx0XHQnJGVxJywgJyRndCcsICckZ3RlJywgJyRpbicsICckbHQnLCAnJGx0ZScsICckbmUnLCAnJG5pbicsICckYW5kJywgJyRub3QnLCAnJG5vcicsICckb3InLFxuXHRcdCckZXhpc3RzJywgJyR0eXBlJywgJyRleHByJywgJyRqc29uU2NoZW1hJywgJyRtb2QnLCAnJHJlZ2V4JywgJyR0ZXh0JywgJyR3aGVyZScsICckZ2VvSW50ZXJzZWN0cycsXG5cdFx0JyRnZW9XaXRoaW4nLCAnJG5lYXInLCAnJG5lYXJTcGhlcmUnLCAnJGFsbCcsICckZWxlbU1hdGNoJywgJyRzaXplJywgJyRiaXRzQWxsQ2xlYXInLCAnJGJpdHNBbGxTZXQnLFxuXHRcdCckYml0c0FueUNsZWFyJywgJyRiaXRzQW55U2V0JywgJyRjb21tZW50JywgJyRlbGVtTWF0Y2gnLCAnJG1ldGEnLCAnJHNsaWNlJyxcblxuXHRcdC8vIHVwZGF0ZVxuXHRcdCckY3VycmVudERhdGUnLCAnJGluYycsICckbWluJywgJyRtYXgnLCAnJG11bCcsICckcmVuYW1lJywgJyRzZXQnLCAnJHNldE9uSW5zZXJ0JywgJyR1bnNldCcsXG5cdFx0JyRhZGRUb1NldCcsICckcG9wJywgJyRwdWxsJywgJyRwdXNoJywgJyRwdWxsQWxsJywgJyRlYWNoJywgJyRwb3NpdGlvbicsICckc2xpY2UnLCAnJHNvcnQnLCAnJGJpdCcsXG5cblx0XHQvLyBhZ2dyZWdhdGlvbiBwaXBlbGluZSBzdGFnZXNcblx0XHQnJGFkZEZpZWxkcycsICckYnVja2V0JywgJyRidWNrZXRBdXRvJywgJyRjb2xsU3RhdHMnLCAnJGNvdW50JywgJyRjdXJyZW50T3AnLCAnJGZhY2V0JywgJyRnZW9OZWFyJyxcblx0XHQnJGdyYXBoTG9va3VwJywgJyRncm91cCcsICckaW5kZXhTdGF0cycsICckbGltaXQnLCAnJGxpc3RMb2NhbFNlc3Npb25zJywgJyRsaXN0U2Vzc2lvbnMnLCAnJGxvb2t1cCcsXG5cdFx0JyRtYXRjaCcsICckbWVyZ2UnLCAnJG91dCcsICckcGxhbkNhY2hlU3RhdHMnLCAnJHByb2plY3QnLCAnJHJlZGFjdCcsICckcmVwbGFjZVJvb3QnLCAnJHJlcGxhY2VXaXRoJyxcblx0XHQnJHNhbXBsZScsICckc2V0JywgJyRza2lwJywgJyRzb3J0JywgJyRzb3J0QnlDb3VudCcsICckdW5pb25XaXRoJywgJyR1bnNldCcsICckdW53aW5kJywgJyRzZXRXaW5kb3dGaWVsZHMnLFxuXG5cdFx0Ly8gYWdncmVnYXRpb24gcGlwZWxpbmUgb3BlcmF0b3JzXG5cdFx0JyRhYnMnLCAnJGFjY3VtdWxhdG9yJywgJyRhY29zJywgJyRhY29zaCcsICckYWRkJywgJyRhZGRUb1NldCcsICckYWxsRWxlbWVudHNUcnVlJywgJyRhbmQnLFxuXHRcdCckYW55RWxlbWVudFRydWUnLCAnJGFycmF5RWxlbUF0JywgJyRhcnJheVRvT2JqZWN0JywgJyRhc2luJywgJyRhc2luaCcsICckYXRhbicsICckYXRhbjInLFxuXHRcdCckYXRhbmgnLCAnJGF2ZycsICckYmluYXJ5U2l6ZScsICckYnNvblNpemUnLCAnJGNlaWwnLCAnJGNtcCcsICckY29uY2F0JywgJyRjb25jYXRBcnJheXMnLCAnJGNvbmQnLFxuXHRcdCckY29udmVydCcsICckY29zJywgJyRkYXRlRnJvbVBhcnRzJywgJyRkYXRlVG9QYXJ0cycsICckZGF0ZUZyb21TdHJpbmcnLCAnJGRhdGVUb1N0cmluZycsICckZGF5T2ZNb250aCcsXG5cdFx0JyRkYXlPZldlZWsnLCAnJGRheU9mWWVhcicsICckZGVncmVlc1RvUmFkaWFucycsICckZGl2aWRlJywgJyRlcScsICckZXhwJywgJyRmaWx0ZXInLCAnJGZpcnN0Jyxcblx0XHQnJGZsb29yJywgJyRmdW5jdGlvbicsICckZ3QnLCAnJGd0ZScsICckaG91cicsICckaWZOdWxsJywgJyRpbicsICckaW5kZXhPZkFycmF5JywgJyRpbmRleE9mQnl0ZXMnLFxuXHRcdCckaW5kZXhPZkNQJywgJyRpc0FycmF5JywgJyRpc051bWJlcicsICckaXNvRGF5T2ZXZWVrJywgJyRpc29XZWVrJywgJyRpc29XZWVrWWVhcicsICckbGFzdCcsXG5cdFx0JyRsYXN0JywgJyRsZXQnLCAnJGxpdGVyYWwnLCAnJGxuJywgJyRsb2cnLCAnJGxvZzEwJywgJyRsdCcsICckbHRlJywgJyRsdHJpbScsICckbWFwJywgJyRtYXgnLFxuXHRcdCckbWVyZ2VPYmplY3RzJywgJyRtZXRhJywgJyRtaW4nLCAnJG1pbGxpc2Vjb25kJywgJyRtaW51dGUnLCAnJG1vZCcsICckbW9udGgnLCAnJG11bHRpcGx5JywgJyRuZScsXG5cdFx0JyRub3QnLCAnJG9iamVjdFRvQXJyYXknLCAnJG9yJywgJyRwb3cnLCAnJHB1c2gnLCAnJHJhZGlhbnNUb0RlZ3JlZXMnLCAnJHJhbmdlJywgJyRyZWR1Y2UnLFxuXHRcdCckcmVnZXhGaW5kJywgJyRyZWdleEZpbmRBbGwnLCAnJHJlZ2V4TWF0Y2gnLCAnJHJlcGxhY2VPbmUnLCAnJHJlcGxhY2VBbGwnLCAnJHJldmVyc2VBcnJheScsICckcm91bmQnLFxuXHRcdCckcnRyaW0nLCAnJHNlY29uZCcsICckc2V0RGlmZmVyZW5jZScsICckc2V0RXF1YWxzJywgJyRzZXRJbnRlcnNlY3Rpb24nLCAnJHNldElzU3Vic2V0JywgJyRzZXRVbmlvbicsXG5cdFx0JyRzaXplJywgJyRzaW4nLCAnJHNsaWNlJywgJyRzcGxpdCcsICckc3FydCcsICckc3RkRGV2UG9wJywgJyRzdGREZXZTYW1wJywgJyRzdHJjYXNlY21wJywgJyRzdHJMZW5CeXRlcycsXG5cdFx0JyRzdHJMZW5DUCcsICckc3Vic3RyJywgJyRzdWJzdHJCeXRlcycsICckc3Vic3RyQ1AnLCAnJHN1YnRyYWN0JywgJyRzdW0nLCAnJHN3aXRjaCcsICckdGFuJyxcblx0XHQnJHRvQm9vbCcsICckdG9EYXRlJywgJyR0b0RlY2ltYWwnLCAnJHRvRG91YmxlJywgJyR0b0ludCcsICckdG9Mb25nJywgJyR0b09iamVjdElkJywgJyR0b1N0cmluZycsXG5cdFx0JyR0b0xvd2VyJywgJyR0b1VwcGVyJywgJyR0cmltJywgJyR0cnVuYycsICckdHlwZScsICckd2VlaycsICckeWVhcicsICckemlwJywgJyRjb3VudCcsICckZGF0ZUFkZCcsXG5cdFx0JyRkYXRlRGlmZicsICckZGF0ZVN1YnRyYWN0JywgJyRkYXRlVHJ1bmMnLCAnJGdldEZpZWxkJywgJyRyYW5kJywgJyRzYW1wbGVSYXRlJywgJyRzZXRGaWVsZCcsICckdW5zZXRGaWVsZCcsXG5cblx0XHQvLyBhZ2dyZWdhdGlvbiBwaXBlbGluZSBxdWVyeSBtb2RpZmllcnNcblx0XHQnJGNvbW1lbnQnLCAnJGV4cGxhaW4nLCAnJGhpbnQnLCAnJG1heCcsICckbWF4VGltZU1TJywgJyRtaW4nLCAnJG9yZGVyYnknLCAnJHF1ZXJ5Jyxcblx0XHQnJHJldHVybktleScsICckc2hvd0Rpc2tMb2MnLCAnJG5hdHVyYWwnLFxuXHRdO1xuXG5cdHZhciBidWlsdGluRnVuY3Rpb25zID0gW1xuXHRcdCdPYmplY3RJZCcsXG5cdFx0J0NvZGUnLFxuXHRcdCdCaW5EYXRhJyxcblx0XHQnREJSZWYnLFxuXHRcdCdUaW1lc3RhbXAnLFxuXHRcdCdOdW1iZXJMb25nJyxcblx0XHQnTnVtYmVyRGVjaW1hbCcsXG5cdFx0J01heEtleScsXG5cdFx0J01pbktleScsXG5cdFx0J1JlZ0V4cCcsXG5cdFx0J0lTT0RhdGUnLFxuXHRcdCdVVUlEJyxcblx0XTtcblxuXHRvcGVyYXRvcnMgPSBvcGVyYXRvcnMubWFwKGZ1bmN0aW9uIChvcGVyYXRvcikge1xuXHRcdHJldHVybiBvcGVyYXRvci5yZXBsYWNlKCckJywgJ1xcXFwkJyk7XG5cdH0pO1xuXG5cdHZhciBvcGVyYXRvcnNTb3VyY2UgPSAnKD86JyArIG9wZXJhdG9ycy5qb2luKCd8JykgKyAnKVxcXFxiJztcblxuXHRQcmlzbS5sYW5ndWFnZXMubW9uZ29kYiA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2phdmFzY3JpcHQnLCB7fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnbW9uZ29kYicsICdzdHJpbmcnLCB7XG5cdFx0J3Byb3BlcnR5Jzoge1xuXHRcdFx0cGF0dGVybjogLyg/OihbXCInXSkoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxfCg/IVxccylbXyRhLXpBLVpcXHhBMC1cXHVGRkZGXSg/Oig/IVxccylbJFxcd1xceEEwLVxcdUZGRkZdKSopKD89XFxzKjopLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQna2V5d29yZCc6IFJlZ0V4cCgnXihbXFwnXCJdKT8nICsgb3BlcmF0b3JzU291cmNlICsgJyg/OlxcXFwxKT8kJylcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5tb25nb2RiLnN0cmluZy5pbnNpZGUgPSB7XG5cdFx0dXJsOiB7XG5cdFx0XHQvLyB1cmwgcGF0dGVyblxuXHRcdFx0cGF0dGVybjogL2h0dHBzPzpcXC9cXC9bLVxcd0A6JS4rfiM9XXsxLDI1Nn1cXC5bYS16MC05KCldezEsNn1cXGJbLVxcdygpQDolKy5+Iz8mLz1dKi9pLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHRlbnRpdHk6IHtcblx0XHRcdC8vIGlwdjRcblx0XHRcdHBhdHRlcm46IC9cXGIoPzooPzpbMDFdP1xcZFxcZD98MlswLTRdXFxkfDI1WzAtNV0pXFwuKXszfSg/OlswMV0/XFxkXFxkP3wyWzAtNF1cXGR8MjVbMC01XSlcXGIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ21vbmdvZGInLCAnY29uc3RhbnQnLCB7XG5cdFx0J2J1aWx0aW4nOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJ1xcXFxiKD86JyArIGJ1aWx0aW5GdW5jdGlvbnMuam9pbignfCcpICsgJylcXFxcYicpLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH1cblx0fSk7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLm1vbmtleSA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL14jUmVtXFxzW1xcc1xcU10qP14jRW5kfCcuKy9pbSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCJbXlwiXFxyXFxuXSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHR9LFxuXHQncHJlcHJvY2Vzc29yJzoge1xuXHRcdHBhdHRlcm46IC8oXlsgXFx0XSopIy4rL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblxuXHQnZnVuY3Rpb24nOiAvXFxiXFx3Kyg/PVxcKCkvLFxuXHQndHlwZS1jaGFyJzoge1xuXHRcdHBhdHRlcm46IC9cXGJbPyUjJF0vLFxuXHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0fSxcblx0J251bWJlcic6IHtcblx0XHRwYXR0ZXJuOiAvKCg/OlxcLlxcLik/KSg/Oig/OlxcYnxcXEItXFwuP3xcXEJcXC4pXFxkKyg/Oig/IVxcLlxcLilcXC5cXGQqKT98XFwkW1xcZGEtZl0rKS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86QWJzdHJhY3R8QXJyYXl8Qm9vbHxDYXNlfENhdGNofENsYXNzfENvbnN0fENvbnRpbnVlfERlZmF1bHR8RWFjaGlufEVsc2V8RWxzZUlmfEVuZHxFbmRJZnxFeGl0fEV4dGVuZHN8RXh0ZXJufEZhbHNlfEZpZWxkfEZpbmFsfEZsb2F0fEZvcnxGb3JldmVyfEZ1bmN0aW9ufEdsb2JhbHxJZnxJbXBsZW1lbnRzfEltcG9ydHxJbmxpbmV8SW50fEludGVyZmFjZXxMb2NhbHxNZXRob2R8TW9kdWxlfE5ld3xOZXh0fE51bGx8T2JqZWN0fFByaXZhdGV8UHJvcGVydHl8UHVibGljfFJlcGVhdHxSZXR1cm58U2VsZWN0fFNlbGZ8U3RlcHxTdHJpY3R8U3RyaW5nfFN1cGVyfFRoZW58VGhyb3d8VG98VHJ1ZXxUcnl8VW50aWx8Vm9pZHxXZW5kfFdoaWxlKVxcYi9pLFxuXHQnb3BlcmF0b3InOiAvXFwuXFwufDxbPT5dP3w+PT98Oj89fCg/OlsrXFwtKlxcLyZ+fF18XFxiKD86TW9kfFNobHxTaHIpXFxiKT0/fFxcYig/OkFuZHxOb3R8T3IpXFxiL2ksXG5cdCdwdW5jdHVhdGlvbic6IC9bLiw6OygpXFxbXFxdXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5tb29uc2NyaXB0ID0ge1xuXHQnY29tbWVudCc6IC8tLS4qLyxcblx0J3N0cmluZyc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvJ1teJ10qJ3xcXFsoPSopXFxbW1xcc1xcU10qP1xcXVxcMVxcXS8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cIlteXCJdKlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvI1xce1tee31dKlxcfS8sXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQnbW9vbnNjcmlwdCc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyheI1xceylbXFxzXFxTXSsoPz1cXH0pLyxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZW93XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J2ludGVycG9sYXRpb24tcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8jXFx7fFxcfS8sXG5cdFx0XHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRdLFxuXHQnY2xhc3MtbmFtZSc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYig/OmNsYXNzfGV4dGVuZHMpWyBcXHRdKylcXHcrLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdC8vIGNsYXNzLWxpa2UgbmFtZXMgc3RhcnQgd2l0aCBhIGNhcGl0YWwgbGV0dGVyXG5cdFx0L1xcYltBLVpdXFx3Ki9cblx0XSxcblx0J2tleXdvcmQnOiAvXFxiKD86Y2xhc3N8Y29udGludWV8ZG98ZWxzZXxlbHNlaWZ8ZXhwb3J0fGV4dGVuZHN8Zm9yfGZyb218aWZ8aW1wb3J0fGlufGxvY2FsfG5pbHxyZXR1cm58c2VsZnxzdXBlcnxzd2l0Y2h8dGhlbnx1bmxlc3N8dXNpbmd8d2hlbnx3aGlsZXx3aXRoKVxcYi8sXG5cdCd2YXJpYWJsZSc6IC9AQD9cXHcqLyxcblx0J3Byb3BlcnR5Jzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPyFcXGQpXFx3Kyg/PTopfCg6KSg/IVxcZClcXHcrLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdmdW5jdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86X0d8X1ZFUlNJT058YXNzZXJ0fGNvbGxlY3RnYXJiYWdlfGNvcm91dGluZVxcLig/OmNyZWF0ZXxyZXN1bWV8cnVubmluZ3xzdGF0dXN8d3JhcHx5aWVsZCl8ZGVidWdcXC4oPzpkZWJ1Z3xnZXRmZW52fGdldGhvb2t8Z2V0aW5mb3xnZXRsb2NhbHxnZXRtZXRhdGFibGV8Z2V0cmVnaXN0cnl8Z2V0dXB2YWx1ZXxzZXRmZW52fHNldGhvb2t8c2V0bG9jYWx8c2V0bWV0YXRhYmxlfHNldHVwdmFsdWV8dHJhY2ViYWNrKXxkb2ZpbGV8ZXJyb3J8Z2V0ZmVudnxnZXRtZXRhdGFibGV8aW9cXC4oPzpjbG9zZXxmbHVzaHxpbnB1dHxsaW5lc3xvcGVufG91dHB1dHxwb3BlbnxyZWFkfHN0ZGVycnxzdGRpbnxzdGRvdXR8dG1wZmlsZXx0eXBlfHdyaXRlKXxpcGFpcnN8bG9hZHxsb2FkZmlsZXxsb2Fkc3RyaW5nfG1hdGhcXC4oPzphYnN8YWNvc3xhc2lufGF0YW58YXRhbjJ8Y2VpbHxjb3N8Y29zaHxkZWd8ZXhwfGZsb29yfGZtb2R8ZnJleHB8bGRleHB8bG9nfGxvZzEwfG1heHxtaW58bW9kZnxwaXxwb3d8cmFkfHJhbmRvbXxyYW5kb21zZWVkfHNpbnxzaW5ofHNxcnR8dGFufHRhbmgpfG1vZHVsZXxuZXh0fG9zXFwuKD86Y2xvY2t8ZGF0ZXxkaWZmdGltZXxleGVjdXRlfGV4aXR8Z2V0ZW52fHJlbW92ZXxyZW5hbWV8c2V0bG9jYWxlfHRpbWV8dG1wbmFtZSl8cGFja2FnZVxcLig/OmNwYXRofGxvYWRlZHxsb2FkbGlifHBhdGh8cHJlbG9hZHxzZWVhbGwpfHBhaXJzfHBjYWxsfHByaW50fHJhd2VxdWFsfHJhd2dldHxyYXdzZXR8cmVxdWlyZXxzZWxlY3R8c2V0ZmVudnxzZXRtZXRhdGFibGV8c3RyaW5nXFwuKD86Ynl0ZXxjaGFyfGR1bXB8ZmluZHxmb3JtYXR8Z21hdGNofGdzdWJ8bGVufGxvd2VyfG1hdGNofHJlcHxyZXZlcnNlfHN1Ynx1cHBlcil8dGFibGVcXC4oPzpjb25jYXR8aW5zZXJ0fG1heG58cmVtb3ZlfHNvcnQpfHRvbnVtYmVyfHRvc3RyaW5nfHR5cGV8dW5wYWNrfHhwY2FsbClcXGIvLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHR9XG5cdH0sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0J251bWJlcic6IC8oPzpcXEJcXC5cXGQrfFxcYlxcZCtcXC5cXGQrfFxcYlxcZCsoPz1bZUVdKSkoPzpbZUVdWy0rXT9cXGQrKT9cXGJ8XFxiKD86MHhbYS1mQS1GXFxkXSt8XFxkKykoPzpVP0xMKT9cXGIvLFxuXHQnb3BlcmF0b3InOiAvXFwuezN9fFstPV0+fH49fCg/OlstKyovJTw+IT1dfFxcLlxcLik9P3xbOiNeXXxcXGIoPzphbmR8b3IpXFxiPT98XFxiKD86bm90KVxcYi8sXG5cdCdwdW5jdHVhdGlvbic6IC9bLiwoKVtcXF17fVxcXFxdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLm1vb25zY3JpcHQuc3RyaW5nWzFdLmluc2lkZS5pbnRlcnBvbGF0aW9uLmluc2lkZS5tb29uc2NyaXB0Lmluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy5tb29uc2NyaXB0O1xuXG5QcmlzbS5sYW5ndWFnZXMubW9vbiA9IFByaXNtLmxhbmd1YWdlcy5tb29uc2NyaXB0O1xuXG4vLyBodHRwczovL2RvY3MuY291Y2hiYXNlLmNvbS9zZXJ2ZXIvY3VycmVudC9uMXFsL24xcWwtbGFuZ3VhZ2UtcmVmZXJlbmNlL2luZGV4Lmh0bWxcblxuUHJpc20ubGFuZ3VhZ2VzLm4xcWwgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXC9cXCpbXFxzXFxTXSo/KD86JHxcXCpcXC8pfC0tLiovLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFtcIiddKSg/OlxcXFxbXFxzXFxTXXwoPyFcXDEpW15cXFxcXXxcXDFcXDEpKlxcMS8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHR9LFxuXHQnaWRlbnRpZmllcic6IHtcblx0XHRwYXR0ZXJuOiAvYCg/OlxcXFxbXFxzXFxTXXxbXlxcXFxgXXxgYCkqYC8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHR9LFxuXHQncGFyYW1ldGVyJzogL1xcJFtcXHcuXSsvLFxuXHQvLyBodHRwczovL2RvY3MuY291Y2hiYXNlLmNvbS9zZXJ2ZXIvY3VycmVudC9uMXFsL24xcWwtbGFuZ3VhZ2UtcmVmZXJlbmNlL3Jlc2VydmVkd29yZHMuaHRtbCNuMXFsLXJlc2VydmVkLXdvcmRzXG5cdCdrZXl3b3JkJzogL1xcYig/OkFEVklTRXxBTEx8QUxURVJ8QU5BTFlaRXxBU3xBU0N8QVR8QkVHSU58QklOQVJZfEJPT0xFQU58QlJFQUt8QlVDS0VUfEJVSUxEfEJZfENBTEx8Q0FTVHxDTFVTVEVSfENPTExBVEV8Q09MTEVDVElPTnxDT01NSVR8Q09NTUlUVEVEfENPTk5FQ1R8Q09OVElOVUV8Q09SUkVMQVRFfENPUlJFTEFURUR8Q09WRVJ8Q1JFQVRFfENVUlJFTlR8REFUQUJBU0V8REFUQVNFVHxEQVRBU1RPUkV8REVDTEFSRXxERUNSRU1FTlR8REVMRVRFfERFUklWRUR8REVTQ3xERVNDUklCRXxESVNUSU5DVHxET3xEUk9QfEVBQ0h8RUxFTUVOVHxFWENFUFR8RVhDTFVERXxFWEVDVVRFfEVYUExBSU58RkVUQ0h8RklMVEVSfEZMQVRURU58RkxVU0h8Rk9MTE9XSU5HfEZPUnxGT1JDRXxGUk9NfEZUU3xGVU5DVElPTnxHT0xBTkd8R1JBTlR8R1JPVVB8R1JPVVBTfEdTSXxIQVNIfEhBVklOR3xJRnxJR05PUkV8SUxJS0V8SU5DTFVERXxJTkNSRU1FTlR8SU5ERVh8SU5GRVJ8SU5MSU5FfElOTkVSfElOU0VSVHxJTlRFUlNFQ1R8SU5UT3xJU3xJU09MQVRJT058SkFWQVNDUklQVHxKT0lOfEtFWXxLRVlTfEtFWVNQQUNFfEtOT1dOfExBTkdVQUdFfExBU1R8TEVGVHxMRVR8TEVUVElOR3xMRVZFTHxMSU1JVHxMU018TUFQfE1BUFBJTkd8TUFUQ0hFRHxNQVRFUklBTElaRUR8TUVSR0V8TUlOVVN8TUlTU0lOR3xOQU1FU1BBQ0V8TkVTVHxOTHxOT3xOVEhfVkFMVUV8TlVMTHxOVUxMU3xOVU1CRVJ8T0JKRUNUfE9GRlNFVHxPTnxPUFRJT058T1BUSU9OU3xPUkRFUnxPVEhFUlN8T1VURVJ8T1ZFUnxQQVJTRXxQQVJUSVRJT058UEFTU1dPUkR8UEFUSHxQT09MfFBSRUNFRElOR3xQUkVQQVJFfFBSSU1BUll8UFJJVkFURXxQUklWSUxFR0V8UFJPQkV8UFJPQ0VEVVJFfFBVQkxJQ3xSQU5HRXxSQVd8UkVBTE18UkVEVUNFfFJFTkFNRXxSRVNQRUNUfFJFVFVSTnxSRVRVUk5JTkd8UkVWT0tFfFJJR0hUfFJPTEV8Uk9MTEJBQ0t8Uk9XfFJPV1N8U0FUSVNGSUVTfFNBVkVQT0lOVHxTQ0hFTUF8U0NPUEV8U0VMRUNUfFNFTEZ8U0VNSXxTRVR8U0hPV3xTT01FfFNUQVJUfFNUQVRJU1RJQ1N8U1RSSU5HfFNZU1RFTXxUSUVTfFRPfFRSQU58VFJBTlNBQ1RJT058VFJJR0dFUnxUUlVOQ0FURXxVTkJPVU5ERUR8VU5ERVJ8VU5JT058VU5JUVVFfFVOS05PV058VU5ORVNUfFVOU0VUfFVQREFURXxVUFNFUlR8VVNFfFVTRVJ8VVNJTkd8VkFMSURBVEV8VkFMVUV8VkFMVUVTfFZJQXxWSUVXfFdIRVJFfFdISUxFfFdJTkRPV3xXSVRIfFdPUkt8WE9SKVxcYi9pLFxuXHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVxccypcXCgpL2ksXG5cdCdib29sZWFuJzogL1xcYig/OkZBTFNFfFRSVUUpXFxiL2ksXG5cdCdudW1iZXInOiAvKD86XFxiXFxkK1xcLnxcXEJcXC4pXFxkK2VbK1xcLV0/XFxkK1xcYnxcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCtcXGIvaSxcblx0J29wZXJhdG9yJzogL1stKypcXC8lXXwhPXw9PT98XFx8XFx8fDxbPj1dP3w+PT98XFxiKD86QU5EfEFOWXxBUlJBWXxCRVRXRUVOfENBU0V8RUxTRXxFTkR8RVZFUll8RVhJU1RTfEZJUlNUfElOfExJS0V8Tk9UfE9SfFRIRU58VkFMVUVEfFdIRU58V0lUSElOKVxcYi9pLFxuXHQncHVuY3R1YXRpb24nOiAvWztbXFxdKCksLnt9Ol0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMubjRqcyA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2phdmFzY3JpcHQnLCB7XG5cdC8vIEtleXdvcmRzIGZyb20gTjRKUyBsYW5ndWFnZSBzcGVjOiBodHRwczovL251bWJlcmZvdXIuZ2l0aHViLmlvL240anMvc3BlYy9ONEpTU3BlYy5odG1sXG5cdCdrZXl3b3JkJzogL1xcYig/OkFycmF5fGFueXxib29sZWFufGJyZWFrfGNhc2V8Y2F0Y2h8Y2xhc3N8Y29uc3R8Y29uc3RydWN0b3J8Y29udGludWV8ZGVidWdnZXJ8ZGVjbGFyZXxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGVudW18ZXhwb3J0fGV4dGVuZHN8ZmFsc2V8ZmluYWxseXxmb3J8ZnJvbXxmdW5jdGlvbnxnZXR8aWZ8aW1wbGVtZW50c3xpbXBvcnR8aW58aW5zdGFuY2VvZnxpbnRlcmZhY2V8bGV0fG1vZHVsZXxuZXd8bnVsbHxudW1iZXJ8cGFja2FnZXxwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8cmV0dXJufHNldHxzdGF0aWN8c3RyaW5nfHN1cGVyfHN3aXRjaHx0aGlzfHRocm93fHRydWV8dHJ5fHR5cGVvZnx2YXJ8dm9pZHx3aGlsZXx3aXRofHlpZWxkKVxcYi9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCduNGpzJywgJ2NvbnN0YW50Jywge1xuXHQvLyBBbm5vdGF0aW9ucyBpbiBONEpTIHNwZWM6IGh0dHBzOi8vbnVtYmVyZm91ci5naXRodWIuaW8vbjRqcy9zcGVjL040SlNTcGVjLmh0bWwjX2Fubm90YXRpb25zXG5cdCdhbm5vdGF0aW9uJzoge1xuXHRcdHBhdHRlcm46IC9AK1xcdysvLFxuXHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMubjRqc2QgPSBQcmlzbS5sYW5ndWFnZXMubjRqcztcblxuUHJpc20ubGFuZ3VhZ2VzWyduYW5kMnRldHJpcy1oZGwnXSA9IHtcblx0J2NvbW1lbnQnOiAvXFwvXFwvLip8XFwvXFwqW1xcc1xcU10qPyg/OlxcKlxcL3wkKS8sXG5cdCdrZXl3b3JkJzogL1xcYig/OkJVSUxUSU58Q0hJUHxDTE9DS0VEfElOfE9VVHxQQVJUUylcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdCdmdW5jdGlvbic6IC9cXGJbQS1aYS16XVtBLVphLXowLTldKig/PVxcKCkvLFxuXHQnbnVtYmVyJzogL1xcYlxcZCtcXGIvLFxuXHQnb3BlcmF0b3InOiAvPXxcXC5cXC4vLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXTsoKSw6XS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgZXhwcmVzc2lvbkRlZiA9IC9cXHtbXlxcclxcblxcW1xcXXt9XSpcXH0vO1xuXG5cdHZhciBwYXJhbXMgPSB7XG5cdFx0J3F1b3RlZC1zdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXFxcXF18XFxcXC4pKlwiLyxcblx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0fSxcblx0XHQnY29tbWFuZC1wYXJhbS1pZCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxzKVxcdys6Lyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHRcdH0sXG5cdFx0J2NvbW1hbmQtcGFyYW0tdmFsdWUnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IGV4cHJlc3Npb25EZWYsXG5cdFx0XHRcdGFsaWFzOiAnc2VsZWN0b3InLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhbXFx0IF0pXFxTKy8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdvcGVyYXRvcicsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxTKD86LipcXFMpPy8sXG5cdFx0XHRcdGFsaWFzOiAnb3BlcmF0b3InLFxuXHRcdFx0fVxuXHRcdF1cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMubmFuaXNjcmlwdCA9IHtcblx0XHQvLyA7IC4uLlxuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogL14oW1xcdCBdKik7LiovbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0fSxcblx0XHQvLyA+IC4uLlxuXHRcdC8vIERlZmluZSBpcyBhIGNvbnRyb2wgbGluZSBzdGFydGluZyB3aXRoICc+JyBmb2xsb3dlZCBieSBhIHdvcmQsIGEgc3BhY2UgYW5kIGEgdGV4dC5cblx0XHQnZGVmaW5lJzoge1xuXHRcdFx0cGF0dGVybjogL14+LisvbSxcblx0XHRcdGFsaWFzOiAndGFnJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQndmFsdWUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhePlxcdytbXFx0IF0rKSg/IVxccylbXnt9XFxyXFxuXSsvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHRcdFx0fSxcblx0XHRcdFx0J2tleSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF4+KVxcdysvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdC8vICMgLi4uXG5cdFx0J2xhYmVsJzoge1xuXHRcdFx0cGF0dGVybjogL14oW1xcdCBdKikjW1xcdCBdKlxcdytbXFx0IF0qJC9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncmVnZXgnXG5cdFx0fSxcblx0XHQnY29tbWFuZCc6IHtcblx0XHRcdHBhdHRlcm46IC9eKFtcXHQgXSopQFxcdysoPz1bXFx0IF18JCkuKi9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdjb21tYW5kLW5hbWUnOiAvXkBcXHcrLyxcblx0XHRcdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogZXhwcmVzc2lvbkRlZixcblx0XHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdzZWxlY3Rvcidcblx0XHRcdFx0fSxcblx0XHRcdFx0J2NvbW1hbmQtcGFyYW1zJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9cXHMqXFxTW1xcc1xcU10qLyxcblx0XHRcdFx0XHRpbnNpZGU6IHBhcmFtc1xuXHRcdFx0XHR9LFxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Ly8gR2VuZXJpYyBpcyBhbnkgbGluZSB0aGF0IGRvZXNuJ3Qgc3RhcnQgd2l0aCBvcGVyYXRvcnM6IDs+I0Bcblx0XHQnZ2VuZXJpYy10ZXh0Jzoge1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKilbXiNAPjtcXHNdLiovbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQvLyBcXHsgLi4uIFxcfSAuLi4gXFxbIC4uLiBcXF0gLi4uIFxcXCJcblx0XHRcdFx0J2VzY2FwZWQtY2hhcic6IC9cXFxcW3t9XFxbXFxdXCJdLyxcblx0XHRcdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogZXhwcmVzc2lvbkRlZixcblx0XHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdzZWxlY3Rvcidcblx0XHRcdFx0fSxcblx0XHRcdFx0J2lubGluZS1jb21tYW5kJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9cXFtbXFx0IF0qXFx3W15cXHJcXG5cXFtcXF1dKlxcXS8sXG5cdFx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J2NvbW1hbmQtcGFyYW1zJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5cXFtbXFx0IF0qXFx3K1xcYilbXFxzXFxTXSsoPz1cXF0kKS8sXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGluc2lkZTogcGFyYW1zXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J2NvbW1hbmQtcGFyYW0tbmFtZSc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogL14oXFxbW1xcdCBdKilcXHcrLyxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0YWxpYXM6ICduYW1lJyxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQnc3RhcnQtc3RvcC1jaGFyJzogL1tcXFtcXF1dLyxcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRQcmlzbS5sYW5ndWFnZXMubmFuaSA9IFByaXNtLmxhbmd1YWdlc1snbmFuaXNjcmlwdCddO1xuXG5cdC8qKiBAdHlwZWRlZiB7SW5zdGFuY2VUeXBlPGltcG9ydChcIi4vcHJpc20tY29yZVwiKVtcIlRva2VuXCJdPn0gVG9rZW4gKi9cblxuXHQvKipcblx0ICogVGhpcyBob29rIGlzIHVzZWQgdG8gdmFsaWRhdGUgZ2VuZXJpYy10ZXh0IHRva2VucyBmb3IgYmFsYW5jZWQgYnJhY2tldHMuXG5cdCAqIE1hcmsgdG9rZW4gYXMgYmFkLWxpbmUgd2hlbiBjb250YWlucyBub3QgYmFsYW5jZWQgYnJhY2tldHM6IHt9LFtdXG5cdCAqL1xuXHRQcmlzbS5ob29rcy5hZGQoJ2FmdGVyLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdC8qKiBAdHlwZSB7KFRva2VuIHwgc3RyaW5nKVtdfSAqL1xuXHRcdHZhciB0b2tlbnMgPSBlbnYudG9rZW5zO1xuXHRcdHRva2Vucy5mb3JFYWNoKGZ1bmN0aW9uICh0b2tlbikge1xuXHRcdFx0aWYgKHR5cGVvZiB0b2tlbiAhPT0gJ3N0cmluZycgJiYgdG9rZW4udHlwZSA9PT0gJ2dlbmVyaWMtdGV4dCcpIHtcblx0XHRcdFx0dmFyIGNvbnRlbnQgPSBnZXRUZXh0Q29udGVudCh0b2tlbik7XG5cdFx0XHRcdGlmICghaXNCcmFja2V0c0JhbGFuY2VkKGNvbnRlbnQpKSB7XG5cdFx0XHRcdFx0dG9rZW4udHlwZSA9ICdiYWQtbGluZSc7XG5cdFx0XHRcdFx0dG9rZW4uY29udGVudCA9IGNvbnRlbnQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdGZ1bmN0aW9uIGlzQnJhY2tldHNCYWxhbmNlZChpbnB1dCkge1xuXHRcdHZhciBicmFja2V0cyA9ICdbXXt9Jztcblx0XHR2YXIgc3RhY2sgPSBbXTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgYnJhY2tldCA9IGlucHV0W2ldO1xuXHRcdFx0dmFyIGJyYWNrZXRzSW5kZXggPSBicmFja2V0cy5pbmRleE9mKGJyYWNrZXQpO1xuXHRcdFx0aWYgKGJyYWNrZXRzSW5kZXggIT09IC0xKSB7XG5cdFx0XHRcdGlmIChicmFja2V0c0luZGV4ICUgMiA9PT0gMCkge1xuXHRcdFx0XHRcdHN0YWNrLnB1c2goYnJhY2tldHNJbmRleCArIDEpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHN0YWNrLnBvcCgpICE9PSBicmFja2V0c0luZGV4KSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBzdGFjay5sZW5ndGggPT09IDA7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmcgfCBUb2tlbiB8IChzdHJpbmcgfCBUb2tlbilbXX0gdG9rZW5cblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdGZ1bmN0aW9uIGdldFRleHRDb250ZW50KHRva2VuKSB7XG5cdFx0aWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHJldHVybiB0b2tlbjtcblx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodG9rZW4pKSB7XG5cdFx0XHRyZXR1cm4gdG9rZW4ubWFwKGdldFRleHRDb250ZW50KS5qb2luKCcnKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGdldFRleHRDb250ZW50KHRva2VuLmNvbnRlbnQpO1xuXHRcdH1cblx0fVxuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5uYXNtID0ge1xuXHQnY29tbWVudCc6IC87LiokL20sXG5cdCdzdHJpbmcnOiAvKFtcIidgXSkoPzpcXFxcLnwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0J2xhYmVsJzoge1xuXHRcdHBhdHRlcm46IC8oXlxccyopW0EtWmEtei5fPyRdW1xcdy4/JEB+I10qOi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0fSxcblx0J2tleXdvcmQnOiBbXG5cdFx0L1xcWz9CSVRTICg/OjE2fDMyfDY0KVxcXT8vLFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXlxccyopc2VjdGlvblxccypbYS16Ll0rOj8vaW0sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQvKD86ZXh0ZXJufGdsb2JhbClbXjtcXHJcXG5dKi9pLFxuXHRcdC8oPzpDUFV8REVGQVVMVHxGTE9BVCkuKiQvbVxuXHRdLFxuXHQncmVnaXN0ZXInOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OnN0XFxkfFt4eXpdbW1cXGRcXGQ/fFtjZHRdclxcZHxyXFxkXFxkP1tid2RdP3xbZXJdP1thYmNkXXh8W2FiY2RdW2hsXXxbZXJdPyg/OmJwfGRpfHNpfHNwKXxbY2RlZmdzXXMpXFxiL2ksXG5cdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0fSxcblx0J251bWJlcic6IC8oPzpcXGJ8KD89XFwkKSkoPzowW2h4XSg/OlxcLltcXGRhLWZdK3xbXFxkYS1mXSsoPzpcXC5bXFxkYS1mXSspPykoPzpwWystXT9cXGQrKT98XFxkW1xcZGEtZl0rW2h4XXxcXCRcXGRbXFxkYS1mXSp8MFtvcV1bMC03XSt8WzAtN10rW29xXXwwW2J5XVswMV0rfFswMV0rW2J5XXwwW2R0XVxcZCt8KD86XFxkKyg/OlxcLlxcZCspP3xcXC5cXGQrKSg/OlxcLj9lWystXT9cXGQrKT9bZHRdPylcXGIvaSxcblx0J29wZXJhdG9yJzogL1tcXFtcXF0qK1xcLVxcLyU8Pj0mfCQhXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5uZW9uID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvIy4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2RhdGV0aW1lJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbW3soPTosXFxzXSlcXGRcXGRcXGRcXGQtXFxkXFxkPy1cXGRcXGQ/KD86KD86W1R0XXwgKylcXGRcXGQ/OlxcZFxcZDpcXGRcXGQoPzpcXC5cXGQqKT8gKig/Olp8Wy0rXVxcZFxcZD8oPzo6P1xcZFxcZCk/KT8pPyg/PSR8W1xcXX0pLFxcc10pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHR9LFxuXHQna2V5Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxbW3soLFxcc10pW14sOj1bXFxde30oKSdcIlxcc10rKD89XFxzKjooPzokfFtcXF19KSxcXHNdKXxcXHMqPSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblx0J251bWJlcic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W1t7KD06LFxcc10pWystXT8oPzoweFtcXGRhLWZBLUZdK3wwb1swLTddK3wwYlswMV0rfCg/OlxcZCsoPzpcXC5cXGQqKT98XFwuP1xcZCspKD86W2VFXVsrLV0/XFxkKyk/KSg/PSR8W1xcXX0pLDo9XFxzXSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2Jvb2xlYW4nOiB7XG5cdFx0cGF0dGVybjogLyhefFtbeyg9OixcXHNdKSg/OmZhbHNlfG5vfHRydWV8eWVzKSg/PSR8W1xcXX0pLDo9XFxzXSkvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdudWxsJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbW3soPTosXFxzXSkoPzpudWxsKSg/PSR8W1xcXX0pLDo9XFxzXSkvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W1t7KD06LFxcc10pKD86KCcnJ3xcIlwiXCIpXFxyP1xcbig/Oig/OlteXFxyXFxuXXxcXHI/XFxuKD8hW1xcdCBdKlxcMikpKlxccj9cXG4pP1tcXHQgXSpcXDJ8J1teJ1xcclxcbl0qJ3xcIig/OlxcXFwufFteXFxcXFwiXFxyXFxuXSkqXCIpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnbGl0ZXJhbCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W1t7KD06LFxcc10pKD86W14jXCInLDo9W1xcXXt9KClcXHNgLV18WzotXVteXCInLD1bXFxde30oKVxcc10pKD86W14sOj1cXF19KShcXHNdfDooPyFbXFxzLFxcXX0pXXwkKXxbIFxcdF0rW14jLDo9XFxdfSkoXFxzXSkqLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0fSxcblx0J3B1bmN0dWF0aW9uJzogL1ssOj1bXFxde30oKS1dLyxcbn07XG5cblByaXNtLmxhbmd1YWdlcy5uZXZvZCA9IHtcblx0J2NvbW1lbnQnOiAvXFwvXFwvLip8KD86XFwvXFwqW1xcc1xcU10qPyg/OlxcKlxcL3wkKSkvLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oPzpcIig/OlwiXCJ8W15cIl0pKlwiKD8hXCIpfCcoPzonJ3xbXiddKSonKD8hJykpIT9cXCo/Lyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnc3RyaW5nLWF0dHJzJzogLyEkfCFcXCokfFxcKiQvLFxuXHRcdH0sXG5cdH0sXG5cdCduYW1lc3BhY2UnOiB7XG5cdFx0cGF0dGVybjogLyhAbmFtZXNwYWNlXFxzKylbYS16QS1aMC05XFwtLl0rKD89XFxzKlxceykvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdH0sXG5cdCdwYXR0ZXJuJzoge1xuXHRcdHBhdHRlcm46IC8oQHBhdHRlcm5cXHMrKT8jP1thLXpBLVowLTlcXC0uXSsoPzpcXHMqXFwoXFxzKig/On5cXHMqKT9bYS16QS1aMC05XFwtLl0rXFxzKig/OixcXHMqKD86flxccyopP1thLXpBLVowLTlcXC0uXSopKlxcKSk/KD89XFxzKj0pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3BhdHRlcm4tbmFtZSc6IHtcblx0XHRcdFx0cGF0dGVybjogL14jP1thLXpBLVowLTlcXC0uXSsvLFxuXHRcdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnLFxuXHRcdFx0fSxcblx0XHRcdCdmaWVsZHMnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9cXCguKlxcKS8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdmaWVsZC1uYW1lJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1thLXpBLVowLTlcXC0uXSsvLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICd2YXJpYWJsZScsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWywoKV0vLFxuXHRcdFx0XHRcdCdvcGVyYXRvcic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9+Lyxcblx0XHRcdFx0XHRcdGFsaWFzOiAnZmllbGQtaGlkZGVuLW1hcmsnLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdH0sXG5cdH0sXG5cdCdzZWFyY2gnOiB7XG5cdFx0cGF0dGVybjogLyhAc2VhcmNoXFxzK3wjKVthLXpBLVowLTlcXC0uXSsoPzpcXC5cXCopPyg/PVxccyo7KS8sXG5cdFx0YWxpYXM6ICdmdW5jdGlvbicsXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0fSxcblx0J2tleXdvcmQnOiAvQCg/OmhhdmluZ3xpbnNpZGV8bmFtZXNwYWNlfG91dHNpZGV8cGF0dGVybnxyZXF1aXJlfHNlYXJjaHx3aGVyZSlcXGIvLFxuXHQnc3RhbmRhcmQtcGF0dGVybic6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86QWxwaGF8QWxwaGFOdW18QW55fEJsYW5rfEVuZHxMaW5lQnJlYWt8TnVtfE51bUFscGhhfFB1bmN0fFNwYWNlfFN0YXJ0fFN5bWJvbHxXb3JkfFdvcmRCcmVhaylcXGIoPzpcXChbYS16QS1aMC05XFwtLixcXHMrXSpcXCkpPy8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnc3RhbmRhcmQtcGF0dGVybi1uYW1lJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXlthLXpBLVowLTlcXC0uXSsvLFxuXHRcdFx0XHRhbGlhczogJ2J1aWx0aW4nLFxuXHRcdFx0fSxcblx0XHRcdCdxdWFudGlmaWVyJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxiXFxkKyg/OlxccypcXCt8XFxzKi1cXHMqXFxkKyk/KD8hXFx3KS8sXG5cdFx0XHRcdGFsaWFzOiAnbnVtYmVyJyxcblx0XHRcdH0sXG5cdFx0XHQnc3RhbmRhcmQtcGF0dGVybi1hdHRyJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvW2EtekEtWjAtOVxcLS5dKy8sXG5cdFx0XHRcdGFsaWFzOiAnYnVpbHRpbicsXG5cdFx0XHR9LFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1ssKCldLyxcblx0XHR9LFxuXHR9LFxuXHQncXVhbnRpZmllcic6IHtcblx0XHRwYXR0ZXJuOiAvXFxiXFxkKyg/OlxccypcXCt8XFxzKi1cXHMqXFxkKyk/KD8hXFx3KS8sXG5cdFx0YWxpYXM6ICdudW1iZXInLFxuXHR9LFxuXHQnb3BlcmF0b3InOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLz0vLFxuXHRcdFx0YWxpYXM6ICdwYXR0ZXJuLWRlZicsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvJi8sXG5cdFx0XHRhbGlhczogJ2Nvbmp1bmN0aW9uJyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9+Lyxcblx0XHRcdGFsaWFzOiAnZXhjZXB0aW9uJyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXD8vLFxuXHRcdFx0YWxpYXM6ICdvcHRpb25hbGl0eScsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvW1tcXF1dLyxcblx0XHRcdGFsaWFzOiAncmVwZXRpdGlvbicsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvW3t9XS8sXG5cdFx0XHRhbGlhczogJ3ZhcmlhdGlvbicsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvWytfXS8sXG5cdFx0XHRhbGlhczogJ3NlcXVlbmNlJyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXC57MiwzfS8sXG5cdFx0XHRhbGlhczogJ3NwYW4nLFxuXHRcdH0sXG5cdF0sXG5cdCdmaWVsZC1jYXB0dXJlJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oW2EtekEtWjAtOVxcLS5dK1xccypcXCgpXFxzKlthLXpBLVowLTlcXC0uXStcXHMqOlxccypbYS16QS1aMC05XFwtLl0rKD86XFxzKixcXHMqW2EtekEtWjAtOVxcLS5dK1xccyo6XFxzKlthLXpBLVowLTlcXC0uXSspKig/PVxccypcXCkpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2ZpZWxkLW5hbWUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1thLXpBLVowLTlcXC0uXSsvLFxuXHRcdFx0XHRcdGFsaWFzOiAndmFyaWFibGUnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnY29sb24nOiAvOi8sXG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1thLXpBLVowLTlcXC0uXStcXHMqOi8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2ZpZWxkLW5hbWUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1thLXpBLVowLTlcXC0uXSsvLFxuXHRcdFx0XHRcdGFsaWFzOiAndmFyaWFibGUnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnY29sb24nOiAvOi8sXG5cdFx0XHR9LFxuXHRcdH0sXG5cdF0sXG5cdCdwdW5jdHVhdGlvbic6IC9bOjssKCldLyxcblx0J25hbWUnOiAvW2EtekEtWjAtOVxcLS5dKy9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgdmFyaWFibGUgPSAvXFwkKD86XFx3W2EtelxcZF0qKD86X1teXFx4MDAtXFx4MUZcXHNcIidcXFxcKCkkXSopP3xcXHtbXn1cXHNcIidcXFxcXStcXH0pL2k7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLm5naW54ID0ge1xuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogLyhefFtcXHN7fTtdKSMuKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnZGlyZWN0aXZlJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFxccylcXHcoPzpbXjt7fVwiJ1xcXFxcXHNdfFxcXFwufFwiKD86W15cIlxcXFxdfFxcXFwuKSpcInwnKD86W14nXFxcXF18XFxcXC4pKid8XFxzKyg/OiMuKig/IS4pfCg/IVsjXFxzXSkpKSo/KD89XFxzKls7e10pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3N0cmluZyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W15cXFxcXSkoPzpcXFxcXFxcXCkqKSg/OlwiKD86W15cIlxcXFxdfFxcXFwuKSpcInwnKD86W14nXFxcXF18XFxcXC4pKicpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdlc2NhcGUnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9cXFxcW1wiJ1xcXFxucnRdLyxcblx0XHRcdFx0XHRcdFx0YWxpYXM6ICdlbnRpdHknXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J3ZhcmlhYmxlJzogdmFyaWFibGVcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdjb21tZW50Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXFxzKSMuKi8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0J2tleXdvcmQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15cXFMrLyxcblx0XHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBvdGhlciBwYXR0ZXJuc1xuXG5cdFx0XHRcdCdib29sZWFuJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXFxzKSg/Om9mZnxvbikoPyFcXFMpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdudW1iZXInOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhcXHMpXFxkK1thLXpdKig/IVxcUykvaSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCd2YXJpYWJsZSc6IHZhcmlhYmxlXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQncHVuY3R1YXRpb24nOiAvW3t9O10vXG5cdH07XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLm5pbSA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyMuKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0Ly8gRG91YmxlLXF1b3RlZCBzdHJpbmdzIGNhbiBiZSBwcmVmaXhlZCBieSBhbiBpZGVudGlmaWVyIChHZW5lcmFsaXplZCByYXcgc3RyaW5nIGxpdGVyYWxzKVxuXHRcdHBhdHRlcm46IC8oPzpcXGIoPyFcXGQpKD86XFx3fFxcXFx4Wzg5YS1mQS1GXVswLTlhLWZBLUZdKSspPyg/OlwiXCJcIltcXHNcXFNdKj9cIlwiXCIoPyFcIil8XCIoPzpcXFxcW1xcc1xcU118XCJcInxbXlwiXFxcXF0pKlwiKS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjaGFyJzoge1xuXHRcdC8vIENoYXJhY3RlciBsaXRlcmFscyBhcmUgaGFuZGxlZCBzcGVjaWZpY2FsbHkgdG8gcHJldmVudCBpc3N1ZXMgd2l0aCBudW1lcmljIHR5cGUgc3VmZml4ZXNcblx0XHRwYXR0ZXJuOiAvJyg/OlxcXFwoPzpcXGQrfHhbXFxkYS1mQS1GXXswLDJ9fC4pfFteJ10pJy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J2Z1bmN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oPzooPyFcXGQpKD86XFx3fFxcXFx4Wzg5YS1mQS1GXVswLTlhLWZBLUZdKSt8YFteYFxcclxcbl0rYClcXCo/KD86XFxbW15cXF1dK1xcXSk/KD89XFxzKlxcKCkvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdvcGVyYXRvcic6IC9cXCokL1xuXHRcdH1cblx0fSxcblx0Ly8gV2UgZG9uJ3Qgd2FudCB0byBoaWdobGlnaHQgb3BlcmF0b3JzIChhbmQgYW55dGhpbmcgcmVhbGx5KSBpbnNpZGUgYmFja3RpY2tzXG5cdCdpZGVudGlmaWVyJzoge1xuXHRcdHBhdHRlcm46IC9gW15gXFxyXFxuXStgLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvYC9cblx0XHR9XG5cdH0sXG5cblx0Ly8gVGhlIG5lZ2F0aXZlIGxvb2sgYWhlYWQgcHJldmVudHMgd3JvbmcgaGlnaGxpZ2h0aW5nIG9mIHRoZSAuLiBvcGVyYXRvclxuXHQnbnVtYmVyJzogL1xcYig/OjBbeFhvT2JCXVtcXGRhLWZBLUZfXSt8XFxkW1xcZF9dKig/Oig/IVxcLlxcLilcXC5bXFxkX10qKT8oPzpbZUVdWystXT9cXGRbXFxkX10qKT8pKD86Jz9baXVmXVxcZCopPy8sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFkZHJ8YXN8YXNtfGF0b21pY3xiaW5kfGJsb2NrfGJyZWFrfGNhc2V8Y2FzdHxjb25jZXB0fGNvbnN0fGNvbnRpbnVlfGNvbnZlcnRlcnxkZWZlcnxkaXNjYXJkfGRpc3RpbmN0fGRvfGVsaWZ8ZWxzZXxlbmR8ZW51bXxleGNlcHR8ZXhwb3J0fGZpbmFsbHl8Zm9yfGZyb218ZnVuY3xnZW5lcmljfGlmfGltcG9ydHxpbmNsdWRlfGludGVyZmFjZXxpdGVyYXRvcnxsZXR8bWFjcm98bWV0aG9kfG1peGlufG5pbHxvYmplY3R8b3V0fHByb2N8cHRyfHJhaXNlfHJlZnxyZXR1cm58c3RhdGljfHRlbXBsYXRlfHRyeXx0dXBsZXx0eXBlfHVzaW5nfHZhcnx3aGVufHdoaWxlfHdpdGh8d2l0aG91dHx5aWVsZClcXGIvLFxuXHQnb3BlcmF0b3InOiB7XG5cdFx0Ly8gTG9vayBiZWhpbmQgYW5kIGxvb2sgYWhlYWQgcHJldmVudCB3cm9uZyBoaWdobGlnaHRpbmcgb2YgcHVuY3R1YXRpb25zIFsuIC5dIHsuIC59ICguIC4pXG5cdFx0Ly8gYnV0IGFsbG93IHRoZSBzbGljZSBvcGVyYXRvciAuLiB0byB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGVtXG5cdFx0Ly8gT25lIGNhbiBkZWZpbmUgaGlzIG93biBvcGVyYXRvcnMgaW4gTmltIHNvIGFsbCBjb21iaW5hdGlvbiBvZiBvcGVyYXRvcnMgbWlnaHQgYmUgYW4gb3BlcmF0b3IuXG5cdFx0cGF0dGVybjogLyhefFsoe1xcW10oPz1cXC5cXC4pfCg/IVsoe1xcW11cXC4pLikoPzooPzpbPStcXC0qXFwvPD5AJH4mJXwhP146XFxcXF18XFwuXFwufFxcLig/IVspfVxcXV0pKSt8XFxiKD86YW5kfGRpdnxpbnxpc3xpc25vdHxtb2R8bm90fG5vdGlufG9mfG9yfHNobHxzaHJ8eG9yKVxcYikvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdwdW5jdHVhdGlvbic6IC9bKHtcXFtdXFwufFxcLlspfVxcXV18W2AoKXt9XFxbXFxdLDpdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLm5peCA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcL1xcKltcXHNcXFNdKj9cXCpcXC98Iy4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXFxcXF18XFxcXFtcXHNcXFNdKSpcInwnJyg/Oig/IScnKVtcXHNcXFNdfCcnKD86J3xcXFxcfFxcJFxceykpKicnLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0Ly8gVGhlIGxvb2tiZWhpbmQgZW5zdXJlcyB0aGUgJHt9IGlzIG5vdCBwcmVjZWRlZCBieSBcXCBvciAnJ1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58KD86XnwoPyEnJykuKVteXFxcXF0pXFwkXFx7KD86W157fV18XFx7W159XSpcXH0pKlxcfS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdCd1cmwnOiBbXG5cdFx0L1xcYig/OlthLXpdezMsN306XFwvXFwvKVtcXHdcXC0rJX5cXC8uOiM9PyZdKy8sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhbXlxcL10pKD86W1xcd1xcLSslfi46Iz0/Jl0qKD8hXFwvXFwvKVtcXHdcXC0rJX5cXC8uOiM9PyZdKT8oPyFcXC9cXC8pXFwvW1xcd1xcLSslflxcLy46Iz0/Jl0qLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdhbnRpcXVvdGF0aW9uJzoge1xuXHRcdHBhdHRlcm46IC9cXCQoPz1cXHspLyxcblx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0fSxcblx0J251bWJlcic6IC9cXGJcXGQrXFxiLyxcblx0J2tleXdvcmQnOiAvXFxiKD86YXNzZXJ0fGJ1aWx0aW5zfGVsc2V8aWZ8aW58aW5oZXJpdHxsZXR8bnVsbHxvcnx0aGVufHdpdGgpXFxiLyxcblx0J2Z1bmN0aW9uJzogL1xcYig/OmFib3J0fGFkZHxhbGx8YW55fGF0dHJOYW1lc3xhdHRyVmFsdWVzfGJhc2VOYW1lT2Z8Y29tcGFyZVZlcnNpb25zfGNvbmNhdExpc3RzfGN1cnJlbnRTeXN0ZW18ZGVlcFNlcXxkZXJpdmF0aW9ufGRpck9mfGRpdnxlbGVtKD86QXQpP3xmZXRjaCg/OlRhcmJhbGx8dXJsKXxmaWx0ZXIoPzpTb3VyY2UpP3xmcm9tSlNPTnxnZW5MaXN0fGdldEF0dHJ8Z2V0RW52fGhhc0F0dHJ8aGFzaFN0cmluZ3xoZWFkfGltcG9ydHxpbnRlcnNlY3RBdHRyc3xpcyg/OkF0dHJzfEJvb2x8RnVuY3Rpb258SW50fExpc3R8TnVsbHxTdHJpbmcpfGxlbmd0aHxsZXNzVGhhbnxsaXN0VG9BdHRyc3xtYXB8bXVsfHBhcnNlRHJ2TmFtZXxwYXRoRXhpc3RzfHJlYWQoPzpEaXJ8RmlsZSl8cmVtb3ZlQXR0cnN8cmVwbGFjZVN0cmluZ3N8c2VxfHNvcnR8c3RyaW5nTGVuZ3RofHN1Yig/OnN0cmluZyk/fHRhaWx8dGhyb3d8dG8oPzpGaWxlfEpTT058UGF0aHxTdHJpbmd8WE1MKXx0cmFjZXx0eXBlT2YpXFxifFxcYmZvbGRsJ1xcQi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0J29wZXJhdG9yJzogL1s9ITw+XT0/fFxcK1xcKz98XFx8XFx8fCYmfFxcL1xcL3wtPj98Wz9AXS8sXG5cdCdwdW5jdHVhdGlvbic6IC9be30oKVtcXF0uLDo7XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5uaXguc3RyaW5nLmluc2lkZS5pbnRlcnBvbGF0aW9uLmluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy5uaXg7XG5cbi8qKlxuICogT3JpZ2luYWwgYnkgSmFuIFQuIFNvdHQgKGh0dHA6Ly9naXRodWIuY29tL2lkbGViZXJnKVxuICpcbiAqIEluY2x1ZGVzIGFsbCBjb21tYW5kcyBhbmQgcGx1Zy1pbnMgc2hpcHBlZCB3aXRoIE5TSVMgMy4wOFxuICovXG5QcmlzbS5sYW5ndWFnZXMubnNpcyA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pKD86XFwvXFwqW1xcc1xcU10qP1xcKlxcL3xbIztdLiopLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXCJ8JykoPzpcXFxcLnwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiB7XG5cdFx0cGF0dGVybjogLyheW1xcdCBdKikoPzpBYm9ydHxBZGQoPzpCcmFuZGluZ0ltYWdlfFNpemUpfEFkdlNwbGFzaHxBbGxvdyg/OlJvb3REaXJJbnN0YWxsfFNraXBGaWxlcyl8QXV0b0Nsb3NlV2luZG93fEJHKD86Rm9udHxHcmFkaWVudHxJbWFnZSl8QmFubmVyfEJyYW5kaW5nVGV4dHxCcmluZ1RvRnJvbnR8Q1JDQ2hlY2t8Q2FsbCg/Okluc3RETEwpP3xDYXB0aW9ufENoYW5nZVVJfENoZWNrQml0bWFwfENsZWFyRXJyb3JzfENvbXBsZXRlZFRleHR8Q29tcG9uZW50VGV4dHxDb3B5RmlsZXN8Q3JlYXRlKD86RGlyZWN0b3J5fEZvbnR8U2hvcnRDdXQpfERlbGV0ZSg/OklOSVNlY3xJTklTdHJ8UmVnS2V5fFJlZ1ZhbHVlKT98RGV0YWlsKD86UHJpbnR8c0J1dHRvblRleHQpfERpYWxlcnxEaXIoPzpUZXh0fFZhcnxWZXJpZnkpfEVuYWJsZVdpbmRvd3xFbnVtKD86UmVnS2V5fFJlZ1ZhbHVlKXxFeGNofEV4ZWMoPzpTaGVsbCg/OldhaXQpP3xXYWl0KT98RXhwYW5kRW52U3RyaW5nc3xGaWxlKD86QnVmU2l6ZXxDbG9zZXxFcnJvclRleHR8T3BlbnxSZWFkfFJlYWRCeXRlfFJlYWRVVEYxNkxFfFJlYWRXb3JkfFNlZWt8V3JpdGV8V3JpdGVCeXRlfFdyaXRlVVRGMTZMRXxXcml0ZVdvcmQpP3xGaW5kKD86Q2xvc2V8Rmlyc3R8TmV4dHxXaW5kb3cpfEZsdXNoSU5JfEdldCg/OkN1ckluc3RUeXBlfEN1cnJlbnRBZGRyZXNzfERMTFZlcnNpb24oPzpMb2NhbCk/fERsZ0l0ZW18RXJyb3JMZXZlbHxGaWxlVGltZSg/OkxvY2FsKT98RnVsbFBhdGhOYW1lfEZ1bmN0aW9uKD86QWRkcmVzc3xFbmQpP3xJbnN0RGlyRXJyb3J8TGFiZWxBZGRyZXNzfFRlbXBGaWxlTmFtZSl8R290b3xIaWRlV2luZG93fEljb258SWYoPzpBYm9ydHxFcnJvcnN8RmlsZUV4aXN0c3xSZWJvb3RGbGFnfFNpbGVudCl8SW5pdFBsdWdpbnNEaXJ8SW5zdFByb2dyZXNzRmxhZ3N8SW5zdCg/OlR5cGUoPzpHZXRUZXh0fFNldFRleHQpPyl8SW5zdGFsbCg/OkJ1dHRvblRleHR8Q29sb3JzfERpcig/OlJlZ0tleSk/KXxJbnQoPzo2NHxQdHIpP0NtcFU/fEludCg/OjY0KT9GbXR8SW50KD86UHRyKT9PcHxJc1dpbmRvd3xMYW5nKD86RExMfFN0cmluZyl8TGljZW5zZSg/OkJrQ29sb3J8RGF0YXxGb3JjZVNlbGVjdGlvbnxMYW5nU3RyaW5nfFRleHQpfExvYWRMYW5ndWFnZUZpbGV8TG9ja1dpbmRvd3xMb2coPzpTZXR8VGV4dCl8TWFuaWZlc3QoPzpEUElBd2FyZXxTdXBwb3J0ZWRPUyl8TWF0aHxNZXNzYWdlQm94fE1pc2NCdXR0b25UZXh0fE5TSVNkbHxOYW1lfE5vcHxPdXRGaWxlfFBFKD86RGxsQ2hhcmFjdGVyaXN0aWNzfFN1YnN5c1Zlcil8UGFnZSg/OkNhbGxiYWNrcyk/fFBvcHxQdXNofFF1aXR8Uk1EaXJ8UmVhZCg/OkVudlN0cnxJTklTdHJ8UmVnRFdPUkR8UmVnU3RyKXxSZWJvb3R8UmVnRExMfFJlbmFtZXxSZXF1ZXN0RXhlY3V0aW9uTGV2ZWx8UmVzZXJ2ZUZpbGV8UmV0dXJufFNlYXJjaFBhdGh8U2VjdGlvbig/OkVuZHxHZXRGbGFnc3xHZXRJbnN0VHlwZXN8R2V0U2l6ZXxHZXRUZXh0fEdyb3VwfElufFNldEZsYWdzfFNldEluc3RUeXBlc3xTZXRTaXplfFNldFRleHQpP3xTZW5kTWVzc2FnZXxTZXQoPzpBdXRvQ2xvc2V8QnJhbmRpbmdJbWFnZXxDb21wcmVzc3xDb21wcmVzc29yKD86RGljdFNpemUpP3xDdGxDb2xvcnN8Q3VySW5zdFR5cGV8RGF0YWJsb2NrT3B0aW1pemV8RGF0ZVNhdmV8RGV0YWlscyg/OlByaW50fFZpZXcpfEVycm9yTGV2ZWx8RXJyb3JzfEZpbGVBdHRyaWJ1dGVzfEZvbnR8T3V0UGF0aHxPdmVyd3JpdGV8UGx1Z2luVW5sb2FkfFJlYm9vdEZsYWd8UmVnVmlld3xTaGVsbFZhckNvbnRleHR8U2lsZW50KXxTaG93KD86SW5zdERldGFpbHN8VW5pbnN0RGV0YWlsc3xXaW5kb3cpfFNpbGVudCg/Okluc3RhbGx8VW5JbnN0YWxsKXxTbGVlcHxTcGFjZVRleHRzfFNwbGFzaHxTdGFydE1lbnV8U3RyKD86Q21wUz98Q3B5fExlbil8U3ViQ2FwdGlvbnxTeXN0ZW18VW5SZWdETEx8VW5pY29kZXxVbmluc3RQYWdlfFVuaW5zdGFsbCg/OkJ1dHRvblRleHR8Q2FwdGlvbnxJY29ufFN1YkNhcHRpb258VGV4dCl8VXNlckluZm98VkkoPzpBZGRWZXJzaW9uS2V5fEZpbGVWZXJzaW9ufFByb2R1Y3RWZXJzaW9uKXxWUGF0Y2h8VmFyfFdpbmRvd0ljb258V3JpdGUoPzpJTklTdHJ8UmVnKD86QmlufERXT1JEfEV4cGFuZFN0cnxNdWx0aVN0cnxOb25lfFN0cil8VW5pbnN0YWxsZXIpfFhQU3R5bGV8bnMoPzpEaWFsb2dzfEV4ZWMpKVxcYi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J3Byb3BlcnR5JzogL1xcYig/OkFSQ0hJVkV8RklMRV8oPzpBVFRSSUJVVEVfQVJDSElWRXxBVFRSSUJVVEVfTk9STUFMfEFUVFJJQlVURV9PRkZMSU5FfEFUVFJJQlVURV9SRUFET05MWXxBVFRSSUJVVEVfU1lTVEVNfEFUVFJJQlVURV9URU1QT1JBUlkpfEhLKD86KD86Q1J8Q1V8TE0pKD86MzJ8NjQpP3xERHxQRHxVKXxIS0VZXyg/OkNMQVNTRVNfUk9PVHxDVVJSRU5UX0NPTkZJR3xDVVJSRU5UX1VTRVJ8RFlOX0RBVEF8TE9DQUxfTUFDSElORXxQRVJGT1JNQU5DRV9EQVRBfFVTRVJTKXxJRCg/OkFCT1JUfENBTkNFTHxJR05PUkV8Tk98T0t8UkVUUll8WUVTKXxNQl8oPzpBQk9SVFJFVFJZSUdOT1JFfERFRkJVVFRPTjF8REVGQlVUVE9OMnxERUZCVVRUT04zfERFRkJVVFRPTjR8SUNPTkVYQ0xBTUFUSU9OfElDT05JTkZPUk1BVElPTnxJQ09OUVVFU1RJT058SUNPTlNUT1B8T0t8T0tDQU5DRUx8UkVUUllDQU5DRUx8UklHSFR8UlRMUkVBRElOR3xTRVRGT1JFR1JPVU5EfFRPUE1PU1R8VVNFUklDT058WUVTTk8pfE5PUk1BTHxPRkZMSU5FfFJFQURPTkxZfFNIQ1RYfFNIRUxMX0NPTlRFWFR8U1lTVEVNfFRFTVBPUkFSWXxhZG1pbnxhbGx8YXV0b3xib3RofGNvbG9yZWR8ZmFsc2V8Zm9yY2V8aGlkZXxoaWdoZXN0fGxhc3R1c2VkfGxlYXZlfGxpc3Rvbmx5fG5vbmV8bm9ybWFsfG5vdHNldHxvZmZ8b258b3BlbnxwcmludHxzaG93fHNpbGVudHxzaWxlbnRsb2d8c21vb3RofHRleHRvbmx5fHRydWV8dXNlcilcXGIvLFxuXHQnY29uc3RhbnQnOiAvXFwkXFx7WyFcXHdcXC46XFxeLV0rXFx9fFxcJFxcKFshXFx3XFwuOlxcXi1dK1xcKS8sXG5cdCd2YXJpYWJsZSc6IC9cXCRcXHdbXFx3XFwuXSovLFxuXHQnbnVtYmVyJzogL1xcYjB4W1xcZEEtRmEtZl0rXFxifCg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzpbRWVdLT9cXGQrKT8vLFxuXHQnb3BlcmF0b3InOiAvLS0/fFxcK1xcKz98PD0/fD49P3w9PT89P3wmJj98XFx8XFx8P3xbPypcXC9+XiVdLyxcblx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF07KCksLjpdLyxcblx0J2ltcG9ydGFudCc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKSEoPzphZGRpbmNsdWRlZGlyfGFkZHBsdWdpbmRpcnxhcHBlbmRmaWxlfGNkfGRlZmluZXxkZWxmaWxlfGVjaG98ZWxzZXxlbmRpZnxlcnJvcnxleGVjdXRlfGZpbmFsaXplfGdldGRsbHZlcnNpb258Z2V0dGxidmVyc2lvbnxpZnxpZmRlZnxpZm1hY3JvZGVmfGlmbWFjcm9uZGVmfGlmbmRlZnxpbmNsdWRlfGluc2VydG1hY3JvfG1hY3JvfG1hY3JvZW5kfG1ha2Vuc2lzfHBhY2toZHJ8cHJhZ21hfHNlYXJjaHBhcnNlfHNlYXJjaHJlcGxhY2V8c3lzdGVtfHRlbXBmaWxlfHVuZGVmfHZlcmJvc2V8d2FybmluZylcXGIvaW0sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9XG59O1xuXG5QcmlzbS5sYW5ndWFnZXMub2JqZWN0aXZlYyA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2MnLCB7XG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL0A/XCIoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXxbXlwiXFxcXFxcclxcbl0pKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86YXNtfGF1dG98YnJlYWt8Y2FzZXxjaGFyfGNvbnN0fGNvbnRpbnVlfGRlZmF1bHR8ZG98ZG91YmxlfGVsc2V8ZW51bXxleHRlcm58ZmxvYXR8Zm9yfGdvdG98aWZ8aW58aW5saW5lfGludHxsb25nfHJlZ2lzdGVyfHJldHVybnxzZWxmfHNob3J0fHNpZ25lZHxzaXplb2Z8c3RhdGljfHN0cnVjdHxzdXBlcnxzd2l0Y2h8dHlwZWRlZnx0eXBlb2Z8dW5pb258dW5zaWduZWR8dm9pZHx2b2xhdGlsZXx3aGlsZSlcXGJ8KD86QGludGVyZmFjZXxAZW5kfEBpbXBsZW1lbnRhdGlvbnxAcHJvdG9jb2x8QGNsYXNzfEBwdWJsaWN8QHByb3RlY3RlZHxAcHJpdmF0ZXxAcHJvcGVydHl8QHRyeXxAY2F0Y2h8QGZpbmFsbHl8QHRocm93fEBzeW50aGVzaXplfEBkeW5hbWljfEBzZWxlY3RvcilcXGIvLFxuXHQnb3BlcmF0b3InOiAvLVstPl0/fFxcK1xcKz98IT0/fDw8Pz0/fD4+Pz0/fD09P3wmJj98XFx8XFx8P3xbfl4lPypcXC9AXS9cbn0pO1xuXG5kZWxldGUgUHJpc20ubGFuZ3VhZ2VzLm9iamVjdGl2ZWNbJ2NsYXNzLW5hbWUnXTtcblxuUHJpc20ubGFuZ3VhZ2VzLm9iamMgPSBQcmlzbS5sYW5ndWFnZXMub2JqZWN0aXZlYztcblxuLy8gaHR0cHM6Ly9vY2FtbC5vcmcvbWFudWFsL2xleC5odG1sXG5cblByaXNtLmxhbmd1YWdlcy5vY2FtbCA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcKFxcKltcXHNcXFNdKj9cXCpcXCkvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY2hhcic6IHtcblx0XHRwYXR0ZXJuOiAvJyg/OlteXFxcXFxcclxcbiddfFxcXFwoPzoufFtveF0/WzAtOWEtZl17MSwzfSkpJy9pLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cIig/OlxcXFwoPzpbXFxzXFxTXXxcXHJcXG4pfFteXFxcXFxcclxcblwiXSkqXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFx7KFthLXpfXSopXFx8W1xcc1xcU10qP1xcfFxcMVxcfS8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdudW1iZXInOiBbXG5cdFx0Ly8gYmluYXJ5IGFuZCBvY3RhbFxuXHRcdC9cXGIoPzowYlswMV1bMDFfXSp8MG9bMC03XVswLTdfXSopXFxiL2ksXG5cdFx0Ly8gaGV4YWRlY2ltYWxcblx0XHQvXFxiMHhbYS1mMC05XVthLWYwLTlfXSooPzpcXC5bYS1mMC05X10qKT8oPzpwWystXT9cXGRbXFxkX10qKT8oPyFcXHcpL2ksXG5cdFx0Ly8gZGVjaW1hbFxuXHRcdC9cXGJcXGRbXFxkX10qKD86XFwuW1xcZF9dKik/KD86ZVsrLV0/XFxkW1xcZF9dKik/KD8hXFx3KS9pLFxuXHRdLFxuXHQnZGlyZWN0aXZlJzoge1xuXHRcdHBhdHRlcm46IC9cXEIjXFx3Ky8sXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblx0J2xhYmVsJzoge1xuXHRcdHBhdHRlcm46IC9cXEJ+XFx3Ky8sXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblx0J3R5cGUtdmFyaWFibGUnOiB7XG5cdFx0cGF0dGVybjogL1xcQidcXHcrLyxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHR9LFxuXHQndmFyaWFudCc6IHtcblx0XHRwYXR0ZXJuOiAvYFxcdysvLFxuXHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHR9LFxuXHQvLyBGb3IgdGhlIGxpc3Qgb2Yga2V5d29yZHMgYW5kIG9wZXJhdG9ycyxcblx0Ly8gc2VlOiBodHRwOi8vY2FtbC5pbnJpYS5mci9wdWIvZG9jcy9tYW51YWwtb2NhbWwvbGV4Lmh0bWwjc2VjODRcblx0J2tleXdvcmQnOiAvXFxiKD86YXN8YXNzZXJ0fGJlZ2lufGNsYXNzfGNvbnN0cmFpbnR8ZG98ZG9uZXxkb3dudG98ZWxzZXxlbmR8ZXhjZXB0aW9ufGV4dGVybmFsfGZvcnxmdW58ZnVuY3Rpb258ZnVuY3RvcnxpZnxpbnxpbmNsdWRlfGluaGVyaXR8aW5pdGlhbGl6ZXJ8bGF6eXxsZXR8bWF0Y2h8bWV0aG9kfG1vZHVsZXxtdXRhYmxlfG5ld3xub25yZWN8b2JqZWN0fG9mfG9wZW58cHJpdmF0ZXxyZWN8c2lnfHN0cnVjdHx0aGVufHRvfHRyeXx0eXBlfHZhbHx2YWx1ZXx2aXJ0dWFsfHdoZW58d2hlcmV8d2hpbGV8d2l0aClcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cblx0J29wZXJhdG9yLWxpa2UtcHVuY3R1YXRpb24nOiB7XG5cdFx0cGF0dGVybjogL1xcW1s8PnxdfFs+fF1cXF18XFx7PHw+XFx9Lyxcblx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHR9LFxuXHQvLyBDdXN0b20gb3BlcmF0b3JzIGFyZSBhbGxvd2VkXG5cdCdvcGVyYXRvcic6IC9cXC5bLn5dfDpbPT5dfFs9PD5AXnwmK1xcLSpcXC8kJSE/fl1bISQlJiorXFwtLlxcLzo8PT4/QF58fl0qfFxcYig/OmFuZHxhc3J8bGFuZHxsb3J8bHNsfGxzcnxseG9yfG1vZHxvcilcXGIvLFxuXHQncHVuY3R1YXRpb24nOiAvOzt8Ojp8Wygpe31cXFtcXF0uLDo7I118XFxiX1xcYi9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0dmFyIGVzY2FwZXMgPSAvXFxcXCg/OltcIidcXFxcYWJlZm5ydHZdfDBbMC03XXsyfXxVW1xcZEEtRmEtZl17Nn18dVtcXGRBLUZhLWZdezR9fHhbXFxkQS1GYS1mXXsyfSkvO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5vZGluID0ge1xuXHRcdC8qKlxuXHRcdCAqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgMSBsZXZlbCBvZiBuZXN0aW5nLlxuXHRcdCAqXG5cdFx0ICogQGF1dGhvciBNaWNoYWVsIFNjaG1pZHRcblx0XHQgKiBAYXV0aG9yIGVkdWtpc3RvXG5cdFx0ICovXG5cdFx0J2NvbW1lbnQnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXC9cXCooPzpbXi8qXXxcXC8oPyFcXCopfFxcKig/IVxcLyl8XFwvXFwqKD86XFwqKD8hXFwvKXxbXipdKSooPzpcXCpcXC98JCkpKig/OlxcKlxcL3wkKS8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyMhW15cXG5cXHJdKi8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcL1xcL1teXFxuXFxyXSovLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXG5cdFx0LyoqXG5cdFx0ICogU2hvdWxkIGJlIGZvdW5kIGJlZm9yZSBzdHJpbmdzIGJlY2F1c2Ugb2YgJ1wiJ1wiLSBhbmQgJ2AnYC1saWtlIHNlcXVlbmNlcy5cblx0XHQgKi9cblx0XHQnY2hhcic6IHtcblx0XHRcdHBhdHRlcm46IC8nKD86XFxcXCg/Oi58WzBVdXhdWzAtOUEtRmEtZl17MSw2fSl8W15cXG5cXHInXFxcXF0pJy8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3N5bWJvbCc6IGVzY2FwZXNcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0J3N0cmluZyc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL2BbXmBdKmAvLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cIig/OlxcXFwufFteXFxuXFxyXCJcXFxcXSkqXCIvLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdzeW1ib2wnOiBlc2NhcGVzXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXG5cdFx0J2RpcmVjdGl2ZSc6IHtcblx0XHRcdHBhdHRlcm46IC8jXFx3Ky8sXG5cdFx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHRcdH0sXG5cblx0XHQnbnVtYmVyJzogL1xcYjAoPzpiWzAxX10rfGRbXFxkX10rfGhfKig/Oig/Oig/OltcXGRBLUZhLWZdXyopezh9KXsxLDJ9fCg/OltcXGRBLUZhLWZdXyopezR9KXxvWzAtN19dK3x4W1xcZEEtRl9hLWZdK3x6W1xcZEFCX2FiXSspXFxifCg/OlxcYlxcZCsoPzpcXC4oPyFcXC4pXFxkKik/fFxcQlxcLlxcZCspKD86W0VlXVsrLV0/XFxkKik/W2lqa10/KD8hXFx3KS8sXG5cblx0XHQnZGlzY2FyZCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGJfXFxiLyxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9LFxuXG5cdFx0J3Byb2NlZHVyZS1kZWZpbml0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYlxcdysoPz1bIFxcdF0qKD86OlxccyopezJ9cHJvY1xcYikvLFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9LFxuXG5cdFx0J2tleXdvcmQnOiAvXFxiKD86YXNtfGF1dG9fY2FzdHxiaXRfc2V0fGJyZWFrfGNhc2V8Y2FzdHxjb250ZXh0fGNvbnRpbnVlfGRlZmVyfGRpc3RpbmN0fGRvfGR5bmFtaWN8ZWxzZXxlbnVtfGZhbGx0aHJvdWdofGZvcnxmb3JlaWdufGlmfGltcG9ydHxpbnxtYXB8bWF0cml4fG5vdF9pbnxvcl9lbHNlfG9yX3JldHVybnxwYWNrYWdlfHByb2N8cmV0dXJufHN0cnVjdHxzd2l0Y2h8dHJhbnNtdXRlfHR5cGVpZHx1bmlvbnx1c2luZ3x3aGVufHdoZXJlKVxcYi8sXG5cblx0XHQvKipcblx0XHQgKiBmYWxzZSwgbmlsLCB0cnVlIGNhbiBiZSB1c2VkIGFzIHByb2NlZHVyZSBuYW1lcy4gXCJfXCIgYW5kIGtleXdvcmRzIGNhbid0LlxuXHRcdCAqL1xuXHRcdCdwcm9jZWR1cmUtbmFtZSc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGJcXHcrKD89WyBcXHRdKlxcKCkvLFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9LFxuXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8bmlsfHRydWUpXFxiLyxcblxuXHRcdCdjb25zdGFudC1wYXJhbWV0ZXItc2lnbic6IHtcblx0XHRcdHBhdHRlcm46IC9cXCQvLFxuXHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdFx0fSxcblxuXHRcdCd1bmRlZmluZWQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvLS0tLyxcblx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0fSxcblxuXHRcdCdhcnJvdyc6IHtcblx0XHRcdHBhdHRlcm46IC8tPi8sXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cblx0XHQnb3BlcmF0b3InOiAvXFwrXFwrfC0tfFxcLlxcLls8PV0/fCg/OiZ+fFstISorLz1+XXxbJSY8PnxdezEsMn0pPT98Wz9eXS8sXG5cblx0XHQncHVuY3R1YXRpb24nOiAvWygpLC46O0BcXFtcXF17fV0vXG5cdH07XG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0LyogT3BlbkNMIGtlcm5lbCBsYW5ndWFnZSAqL1xuXHRQcmlzbS5sYW5ndWFnZXMub3BlbmNsID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnYycsIHtcblx0XHQvLyBFeHRyYWN0ZWQgZnJvbSB0aGUgb2ZmaWNpYWwgc3BlY3MgKDIuMCkgYW5kIGh0dHA6Ly9zdHJlYW1jb21wdXRpbmcuZXUvZG93bmxvYWRzLz9vcGVuY2wubGFuZyAob3BlbmNsLWtleXdvcmRzLCBvcGVuY2wtdHlwZXMpIGFuZCBodHRwOi8vc291cmNlZm9yZ2UubmV0L3RyYWNrZXIvP2Z1bmM9ZGV0YWlsJmFpZD0yOTU3Nzk0Jmdyb3VwX2lkPTk1NzE3JmF0aWQ9NjEyMzg0IChXb3JkczIsIHBhcnRseSBXb3JkczMpXG5cdFx0J2tleXdvcmQnOiAvXFxiKD86KD86X18pPyg/OmNvbnN0YW50fGdsb2JhbHxrZXJuZWx8bG9jYWx8cHJpdmF0ZXxyZWFkX29ubHl8cmVhZF93cml0ZXx3cml0ZV9vbmx5KXxfX2F0dHJpYnV0ZV9ffGF1dG98KD86Ym9vbHx1Pyg/OmNoYXJ8aW50fGxvbmd8c2hvcnQpfGhhbGZ8cXVhZCkoPzoyfDN8NHw4fDE2KT98YnJlYWt8Y2FzZXxjb21wbGV4fGNvbnN0fGNvbnRpbnVlfCg/OmRvdWJsZXxmbG9hdCkoPzoxNig/OngoPzoxfDJ8NHw4fDE2KSk/fDF4KD86MXwyfDR8OHwxNil8Mig/OngoPzoxfDJ8NHw4fDE2KSk/fDN8NCg/OngoPzoxfDJ8NHw4fDE2KSk/fDgoPzp4KD86MXwyfDR8OHwxNikpPyk/fGRlZmF1bHR8ZG98ZWxzZXxlbnVtfGV4dGVybnxmb3J8Z290b3xpZnxpbWFnaW5hcnl8aW5saW5lfHBhY2tlZHxwaXBlfHJlZ2lzdGVyfHJlc3RyaWN0fHJldHVybnxzaWduZWR8c2l6ZW9mfHN0YXRpY3xzdHJ1Y3R8c3dpdGNofHR5cGVkZWZ8dW5pZm9ybXx1bmlvbnx1bnNpZ25lZHx2b2lkfHZvbGF0aWxlfHdoaWxlKVxcYi8sXG5cdFx0Ly8gRXh0cmFjdGVkIGZyb20gaHR0cDovL3N0cmVhbWNvbXB1dGluZy5ldS9kb3dubG9hZHMvP29wZW5jbC5sYW5nIChvcGVuY2wtY29uc3QpXG5cdFx0Ly8gTWF0aCBDb25zdGFudHM6IGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L09wZW5DTC9zZGsvMi4xL2RvY3MvbWFuL3hodG1sL21hdGhDb25zdGFudHMuaHRtbFxuXHRcdC8vIE1hY3JvcyBhbmQgTGltaXRzOiBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9PcGVuQ0wvc2RrLzIuMS9kb2NzL21hbi94aHRtbC9tYWNyb0xpbWl0cy5odG1sXG5cdFx0J251bWJlcic6IC8oPzpcXGIweCg/OltcXGRhLWZdKyg/OlxcLltcXGRhLWZdKik/fFxcLltcXGRhLWZdKykoPzpwWystXT9cXGQrKT98KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OmVbKy1dP1xcZCspPylbZnVobF17MCw0fS9pLFxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0XHQnY29uc3RhbnQtb3BlbmNsLWtlcm5lbCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzpDSEFSXyg/OkJJVHxNQVh8TUlOKXxDTEtfKD86QUREUkVTU18oPzpDTEFNUCg/Ol9UT19FREdFKT98Tk9ORXxSRVBFQVQpfEZJTFRFUl8oPzpMSU5FQVJ8TkVBUkVTVCl8KD86R0xPQkFMfExPQ0FMKV9NRU1fRkVOQ0V8Tk9STUFMSVpFRF9DT09SRFNfKD86RkFMU0V8VFJVRSkpfENMXyg/OkJHUkF8KD86SEFMRl8pP0ZMT0FUfElOVEVOU0lUWXxMVU1JTkFOQ0V8QT9SP0c/Qj9bQXhdP3woPzooPzpVTik/U0lHTkVEfFtVU11OT1JNKV8oPzpJTlQoPzo4fDE2fDMyKSl8VU5PUk1fKD86SU5UXzEwMTAxMHxTSE9SVF8oPzo1NTV8NTY1KSkpfCg/OkRCTHxGTFR8SEFMRilfKD86RElHfEVQU0lMT058KD86TUFYfE1JTikoPzooPzpfMTApP19FWFApP3xNQU5UX0RJRyl8RkxUX1JBRElYfEhVR0VfVkFMRj98KD86SU5UfExPTkd8U0NIQVJ8U0hSVClfKD86TUFYfE1JTil8SU5GSU5JVFl8TUFYRkxPQVR8TV8oPzpbMTJdX1BJfDJfU1FSVFBJfEV8TE4oPzoyfDEwKXxMT0coPzoyfDEwKUU/fFBJKD86X1syNF0pP3xTUVJUKD86MV8yfDIpKSg/Ol9GfF9IKT98TkFOfCg/OlVDSEFSfFVJTlR8VUxPTkd8VVNIUlQpX01BWClcXGIvLFxuXHRcdFx0YWxpYXM6ICdjb25zdGFudCdcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ29wZW5jbCcsICdjbGFzcy1uYW1lJywge1xuXHRcdC8vIGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L09wZW5DTC9zZGsvMi4xL2RvY3MvbWFuL3hodG1sL3NjYWxhckRhdGFUeXBlcy5odG1sXG5cdFx0Ly8gaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvT3BlbkNML3Nkay8yLjEvZG9jcy9tYW4veGh0bWwvb3RoZXJEYXRhVHlwZXMuaHRtbFxuXHRcdCdidWlsdGluLXR5cGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86X2NsXyg/OmNvbW1hbmRfcXVldWV8Y29udGV4dHxkZXZpY2VfaWR8ZXZlbnR8a2VybmVsfG1lbXxwbGF0Zm9ybV9pZHxwcm9ncmFtfHNhbXBsZXIpfGNsXyg/OmltYWdlX2Zvcm1hdHxtZW1fZmVuY2VfZmxhZ3MpfGNsa19ldmVudF90fGV2ZW50X3R8aW1hZ2UoPzoxZF8oPzphcnJheV98YnVmZmVyXyk/dHwyZF8oPzphcnJheV8oPzpkZXB0aF98bXNhYV9kZXB0aF98bXNhYV8pP3xkZXB0aF98bXNhYV9kZXB0aF98bXNhYV8pP3R8M2RfdCl8aW50cHRyX3R8bmRyYW5nZV90fHB0cmRpZmZfdHxxdWV1ZV90fHJlc2VydmVfaWRfdHxzYW1wbGVyX3R8c2l6ZV90fHVpbnRwdHJfdClcXGIvLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH1cblx0fSk7XG5cblx0dmFyIGF0dHJpYnV0ZXMgPSB7XG5cdFx0Ly8gRXh0cmFjdGVkIGZyb20gaHR0cDovL3N0cmVhbWNvbXB1dGluZy5ldS9kb3dubG9hZHMvP29wZW5jbF9ob3N0LmxhbmcgKG9wZW5jbC10eXBlcyBhbmQgb3BlbmNsLWhvc3QpXG5cdFx0J3R5cGUtb3BlbmNsLWhvc3QnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86Y2xfKD86R0xlbnVtfEdMaW50fEdMdWlufGFkZHJlc3NpbmdfbW9kZXxiaXRmaWVsZHxib29sfGJ1ZmZlcl9jcmVhdGVfdHlwZXxidWlsZF9zdGF0dXN8Y2hhbm5lbF8oPzpvcmRlcnx0eXBlKXwoPzp1Pyg/OmNoYXJ8aW50fGxvbmd8c2hvcnQpfGRvdWJsZXxmbG9hdCkoPzoyfDN8NHw4fDE2KT98Y29tbWFuZF8oPzpxdWV1ZSg/Ol9pbmZvfF9wcm9wZXJ0aWVzKT98dHlwZSl8Y29udGV4dCg/Ol9pbmZvfF9wcm9wZXJ0aWVzKT98ZGV2aWNlXyg/OmV4ZWNfY2FwYWJpbGl0aWVzfGZwX2NvbmZpZ3xpZHxpbmZvfGxvY2FsX21lbV90eXBlfG1lbV9jYWNoZV90eXBlfHR5cGUpfCg/OmV2ZW50fHNhbXBsZXIpKD86X2luZm8pP3xmaWx0ZXJfbW9kZXxoYWxmfGltYWdlX2luZm98a2VybmVsKD86X2luZm98X3dvcmtfZ3JvdXBfaW5mbyk/fG1hcF9mbGFnc3xtZW0oPzpfZmxhZ3N8X2luZm98X29iamVjdF90eXBlKT98cGxhdGZvcm1fKD86aWR8aW5mbyl8cHJvZmlsaW5nX2luZm98cHJvZ3JhbSg/Ol9idWlsZF9pbmZvfF9pbmZvKT8pKVxcYi8sXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fSxcblx0XHQnYm9vbGVhbi1vcGVuY2wtaG9zdCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGJDTF8oPzpGQUxTRXxUUlVFKVxcYi8sXG5cdFx0XHRhbGlhczogJ2Jvb2xlYW4nXG5cdFx0fSxcblx0XHQvLyBFeHRyYWN0ZWQgZnJvbSBjbC5oICgyLjApIGFuZCBodHRwOi8vc3RyZWFtY29tcHV0aW5nLmV1L2Rvd25sb2Fkcy8/b3BlbmNsX2hvc3QubGFuZyAob3BlbmNsLWNvbnN0KVxuXHRcdCdjb25zdGFudC1vcGVuY2wtaG9zdCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGJDTF8oPzpBfEFCR1J8QUREUkVTU18oPzpDTEFNUCg/Ol9UT19FREdFKT98TUlSUk9SRURfUkVQRUFUfE5PTkV8UkVQRUFUKXxBUkdCfEJHUkF8QkxPQ0tJTkd8QlVGRkVSX0NSRUFURV9UWVBFX1JFR0lPTnxCVUlMRF8oPzpFUlJPUnxJTl9QUk9HUkVTU3xOT05FfFBST0dSQU1fRkFJTFVSRXxTVUNDRVNTKXxDT01NQU5EXyg/OkFDUVVJUkVfR0xfT0JKRUNUU3xCQVJSSUVSfENPUFlfKD86QlVGRkVSKD86X1JFQ1R8X1RPX0lNQUdFKT98SU1BR0UoPzpfVE9fQlVGRkVSKT8pfEZJTExfKD86QlVGRkVSfElNQUdFKXxNQVAoPzpfQlVGRkVSfF9JTUFHRSl8TUFSS0VSfE1JR1JBVEUoPzpfU1ZNKT9fTUVNX09CSkVDVFN8TkFUSVZFX0tFUk5FTHxORFJBTkdFX0tFUk5FTHxSRUFEXyg/OkJVRkZFUig/Ol9SRUNUKT98SU1BR0UpfFJFTEVBU0VfR0xfT0JKRUNUU3xTVk1fKD86RlJFRXxNQVB8TUVNQ1BZfE1FTUZJTEx8VU5NQVApfFRBU0t8VU5NQVBfTUVNX09CSkVDVHxVU0VSfFdSSVRFXyg/OkJVRkZFUig/Ol9SRUNUKT98SU1BR0UpKXxDT01QSUxFUl9OT1RfQVZBSUxBQkxFfENPTVBJTEVfUFJPR1JBTV9GQUlMVVJFfENPTVBMRVRFfENPTlRFWFRfKD86REVWSUNFU3xJTlRFUk9QX1VTRVJfU1lOQ3xOVU1fREVWSUNFU3xQTEFURk9STXxQUk9QRVJUSUVTfFJFRkVSRU5DRV9DT1VOVCl8REVQVEgoPzpfU1RFTkNJTCk/fERFVklDRV8oPzpBRERSRVNTX0JJVFN8QUZGSU5JVFlfRE9NQUlOXyg/OkxbMS00XV9DQUNIRXxORVhUX1BBUlRJVElPTkFCTEV8TlVNQSl8QVZBSUxBQkxFfEJVSUxUX0lOX0tFUk5FTFN8Q09NUElMRVJfQVZBSUxBQkxFfERPVUJMRV9GUF9DT05GSUd8RU5ESUFOX0xJVFRMRXxFUlJPUl9DT1JSRUNUSU9OX1NVUFBPUlR8RVhFQ1VUSU9OX0NBUEFCSUxJVElFU3xFWFRFTlNJT05TfEdMT0JBTF8oPzpNRU1fKD86Q0FDSEVMSU5FX1NJWkV8Q0FDSEVfU0laRXxDQUNIRV9UWVBFfFNJWkUpfFZBUklBQkxFX1BSRUZFUlJFRF9UT1RBTF9TSVpFKXxIT1NUX1VOSUZJRURfTUVNT1JZfElMX1ZFUlNJT058SU1BR0UoPzoyRF9NQVhfKD86SEVJR0hUfFdJRFRIKXwzRF9NQVhfKD86REVQVEh8SEVJR0hUfFdJRFRIKXxfQkFTRV9BRERSRVNTX0FMSUdOTUVOVHxfTUFYX0FSUkFZX1NJWkV8X01BWF9CVUZGRVJfU0laRXxfUElUQ0hfQUxJR05NRU5UfF9TVVBQT1JUKXxMSU5LRVJfQVZBSUxBQkxFfExPQ0FMX01FTV9TSVpFfExPQ0FMX01FTV9UWVBFfE1BWF8oPzpDTE9DS19GUkVRVUVOQ1l8Q09NUFVURV9VTklUU3xDT05TVEFOVF9BUkdTfENPTlNUQU5UX0JVRkZFUl9TSVpFfEdMT0JBTF9WQVJJQUJMRV9TSVpFfE1FTV9BTExPQ19TSVpFfE5VTV9TVUJfR1JPVVBTfE9OX0RFVklDRV8oPzpFVkVOVFN8UVVFVUVTKXxQQVJBTUVURVJfU0laRXxQSVBFX0FSR1N8UkVBRF9JTUFHRV9BUkdTfFJFQURfV1JJVEVfSU1BR0VfQVJHU3xTQU1QTEVSU3xXT1JLX0dST1VQX1NJWkV8V09SS19JVEVNX0RJTUVOU0lPTlN8V09SS19JVEVNX1NJWkVTfFdSSVRFX0lNQUdFX0FSR1MpfE1FTV9CQVNFX0FERFJfQUxJR058TUlOX0RBVEFfVFlQRV9BTElHTl9TSVpFfE5BTUV8TkFUSVZFX1ZFQ1RPUl9XSURUSF8oPzpDSEFSfERPVUJMRXxGTE9BVHxIQUxGfElOVHxMT05HfFNIT1JUKXxOT1RfKD86QVZBSUxBQkxFfEZPVU5EKXxPUEVOQ0xfQ19WRVJTSU9OfFBBUkVOVF9ERVZJQ0V8UEFSVElUSU9OXyg/OkFGRklOSVRZX0RPTUFJTnxCWV9BRkZJTklUWV9ET01BSU58QllfQ09VTlRTfEJZX0NPVU5UU19MSVNUX0VORHxFUVVBTExZfEZBSUxFRHxNQVhfU1VCX0RFVklDRVN8UFJPUEVSVElFU3xUWVBFKXxQSVBFX01BWF8oPzpBQ1RJVkVfUkVTRVJWQVRJT05TfFBBQ0tFVF9TSVpFKXxQTEFURk9STXxQUkVGRVJSRURfKD86R0xPQkFMX0FUT01JQ19BTElHTk1FTlR8SU5URVJPUF9VU0VSX1NZTkN8TE9DQUxfQVRPTUlDX0FMSUdOTUVOVHxQTEFURk9STV9BVE9NSUNfQUxJR05NRU5UfFZFQ1RPUl9XSURUSF8oPzpDSEFSfERPVUJMRXxGTE9BVHxIQUxGfElOVHxMT05HfFNIT1JUKSl8UFJJTlRGX0JVRkZFUl9TSVpFfFBST0ZJTEV8UFJPRklMSU5HX1RJTUVSX1JFU09MVVRJT058UVVFVUVfKD86T05fKD86REVWSUNFXyg/Ok1BWF9TSVpFfFBSRUZFUlJFRF9TSVpFfFBST1BFUlRJRVMpfEhPU1RfUFJPUEVSVElFUyl8UFJPUEVSVElFUyl8UkVGRVJFTkNFX0NPVU5UfFNJTkdMRV9GUF9DT05GSUd8U1VCX0dST1VQX0lOREVQRU5ERU5UX0ZPUldBUkRfUFJPR1JFU1N8U1ZNXyg/OkFUT01JQ1N8Q0FQQUJJTElUSUVTfENPQVJTRV9HUkFJTl9CVUZGRVJ8RklORV9HUkFJTl9CVUZGRVJ8RklORV9HUkFJTl9TWVNURU0pfFRZUEUoPzpfQUNDRUxFUkFUT1J8X0FMTHxfQ1BVfF9DVVNUT018X0RFRkFVTFR8X0dQVSk/fFZFTkRPUig/Ol9JRCk/fFZFUlNJT04pfERSSVZFUl9WRVJTSU9OfEVWRU5UXyg/OkNPTU1BTkRfKD86RVhFQ1VUSU9OX1NUQVRVU3xRVUVVRXxUWVBFKXxDT05URVhUfFJFRkVSRU5DRV9DT1VOVCl8RVhFQ18oPzpLRVJORUx8TkFUSVZFX0tFUk5FTHxTVEFUVVNfRVJST1JfRk9SX0VWRU5UU19JTl9XQUlUX0xJU1QpfEZJTFRFUl8oPzpMSU5FQVJ8TkVBUkVTVCl8RkxPQVR8RlBfKD86Q09SUkVDVExZX1JPVU5ERURfRElWSURFX1NRUlR8REVOT1JNfEZNQXxJTkZfTkFOfFJPVU5EX1RPX0lORnxST1VORF9UT19ORUFSRVNUfFJPVU5EX1RPX1pFUk98U09GVF9GTE9BVCl8R0xPQkFMfEhBTEZfRkxPQVR8SU1BR0VfKD86QVJSQVlfU0laRXxCVUZGRVJ8REVQVEh8RUxFTUVOVF9TSVpFfEZPUk1BVHxGT1JNQVRfTUlTTUFUQ0h8Rk9STUFUX05PVF9TVVBQT1JURUR8SEVJR0hUfE5VTV9NSVBfTEVWRUxTfE5VTV9TQU1QTEVTfFJPV19QSVRDSHxTTElDRV9QSVRDSHxXSURUSCl8SU5URU5TSVRZfElOVkFMSURfKD86QVJHX0lOREVYfEFSR19TSVpFfEFSR19WQUxVRXxCSU5BUll8QlVGRkVSX1NJWkV8QlVJTERfT1BUSU9OU3xDT01NQU5EX1FVRVVFfENPTVBJTEVSX09QVElPTlN8Q09OVEVYVHxERVZJQ0V8REVWSUNFX1BBUlRJVElPTl9DT1VOVHxERVZJQ0VfUVVFVUV8REVWSUNFX1RZUEV8RVZFTlR8RVZFTlRfV0FJVF9MSVNUfEdMT0JBTF9PRkZTRVR8R0xPQkFMX1dPUktfU0laRXxHTF9PQkpFQ1R8SE9TVF9QVFJ8SU1BR0VfREVTQ1JJUFRPUnxJTUFHRV9GT1JNQVRfREVTQ1JJUFRPUnxJTUFHRV9TSVpFfEtFUk5FTHxLRVJORUxfQVJHU3xLRVJORUxfREVGSU5JVElPTnxLRVJORUxfTkFNRXxMSU5LRVJfT1BUSU9OU3xNRU1fT0JKRUNUfE1JUF9MRVZFTHxPUEVSQVRJT058UElQRV9TSVpFfFBMQVRGT1JNfFBST0dSQU18UFJPR1JBTV9FWEVDVVRBQkxFfFBST1BFUlRZfFFVRVVFX1BST1BFUlRJRVN8U0FNUExFUnxWQUxVRXxXT1JLX0RJTUVOU0lPTnxXT1JLX0dST1VQX1NJWkV8V09SS19JVEVNX1NJWkUpfEtFUk5FTF8oPzpBUkdfKD86QUNDRVNTXyg/Ok5PTkV8UVVBTElGSUVSfFJFQURfT05MWXxSRUFEX1dSSVRFfFdSSVRFX09OTFkpfEFERFJFU1NfKD86Q09OU1RBTlR8R0xPQkFMfExPQ0FMfFBSSVZBVEV8UVVBTElGSUVSKXxJTkZPX05PVF9BVkFJTEFCTEV8TkFNRXxUWVBFXyg/OkNPTlNUfE5BTUV8Tk9ORXxQSVBFfFFVQUxJRklFUnxSRVNUUklDVHxWT0xBVElMRSkpfEFUVFJJQlVURVN8Q09NUElMRV9OVU1fU1VCX0dST1VQU3xDT01QSUxFX1dPUktfR1JPVVBfU0laRXxDT05URVhUfEVYRUNfSU5GT19TVk1fRklORV9HUkFJTl9TWVNURU18RVhFQ19JTkZPX1NWTV9QVFJTfEZVTkNUSU9OX05BTUV8R0xPQkFMX1dPUktfU0laRXxMT0NBTF9NRU1fU0laRXxMT0NBTF9TSVpFX0ZPUl9TVUJfR1JPVVBfQ09VTlR8TUFYX05VTV9TVUJfR1JPVVBTfE1BWF9TVUJfR1JPVVBfU0laRV9GT1JfTkRSQU5HRXxOVU1fQVJHU3xQUkVGRVJSRURfV09SS19HUk9VUF9TSVpFX01VTFRJUExFfFBSSVZBVEVfTUVNX1NJWkV8UFJPR1JBTXxSRUZFUkVOQ0VfQ09VTlR8U1VCX0dST1VQX0NPVU5UX0ZPUl9ORFJBTkdFfFdPUktfR1JPVVBfU0laRSl8TElOS0VSX05PVF9BVkFJTEFCTEV8TElOS19QUk9HUkFNX0ZBSUxVUkV8TE9DQUx8TFVNSU5BTkNFfE1BUF8oPzpGQUlMVVJFfFJFQUR8V1JJVEV8V1JJVEVfSU5WQUxJREFURV9SRUdJT04pfE1FTV8oPzpBTExPQ19IT1NUX1BUUnxBU1NPQ0lBVEVEX01FTU9CSkVDVHxDT05URVhUfENPUFlfSE9TVF9QVFJ8Q09QWV9PVkVSTEFQfEZMQUdTfEhPU1RfTk9fQUNDRVNTfEhPU1RfUFRSfEhPU1RfUkVBRF9PTkxZfEhPU1RfV1JJVEVfT05MWXxLRVJORUxfUkVBRF9BTkRfV1JJVEV8TUFQX0NPVU5UfE9CSkVDVF8oPzpBTExPQ0FUSU9OX0ZBSUxVUkV8QlVGRkVSfElNQUdFMUR8SU1BR0UxRF9BUlJBWXxJTUFHRTFEX0JVRkZFUnxJTUFHRTJEfElNQUdFMkRfQVJSQVl8SU1BR0UzRHxQSVBFKXxPRkZTRVR8UkVBRF9PTkxZfFJFQURfV1JJVEV8UkVGRVJFTkNFX0NPVU5UfFNJWkV8U1ZNX0FUT01JQ1N8U1ZNX0ZJTkVfR1JBSU5fQlVGRkVSfFRZUEV8VVNFU19TVk1fUE9JTlRFUnxVU0VfSE9TVF9QVFJ8V1JJVEVfT05MWSl8TUlHUkFURV9NRU1fT0JKRUNUXyg/OkNPTlRFTlRfVU5ERUZJTkVEfEhPU1QpfE1JU0FMSUdORURfU1VCX0JVRkZFUl9PRkZTRVR8Tk9ORXxOT05fQkxPQ0tJTkd8T1VUX09GXyg/OkhPU1RfTUVNT1JZfFJFU09VUkNFUyl8UElQRV8oPzpNQVhfUEFDS0VUU3xQQUNLRVRfU0laRSl8UExBVEZPUk1fKD86RVhURU5TSU9OU3xIT1NUX1RJTUVSX1JFU09MVVRJT058TkFNRXxQUk9GSUxFfFZFTkRPUnxWRVJTSU9OKXxQUk9GSUxJTkdfKD86Q09NTUFORF8oPzpDT01QTEVURXxFTkR8UVVFVUVEfFNUQVJUfFNVQk1JVCl8SU5GT19OT1RfQVZBSUxBQkxFKXxQUk9HUkFNXyg/OkJJTkFSSUVTfEJJTkFSWV9TSVpFU3xCSU5BUllfVFlQRSg/Ol9DT01QSUxFRF9PQkpFQ1R8X0VYRUNVVEFCTEV8X0xJQlJBUll8X05PTkUpP3xCVUlMRF8oPzpHTE9CQUxfVkFSSUFCTEVfVE9UQUxfU0laRXxMT0d8T1BUSU9OU3xTVEFUVVMpfENPTlRFWFR8REVWSUNFU3xJTHxLRVJORUxfTkFNRVN8TlVNX0RFVklDRVN8TlVNX0tFUk5FTFN8UkVGRVJFTkNFX0NPVU5UfFNPVVJDRSl8UVVFVUVEfFFVRVVFXyg/OkNPTlRFWFR8REVWSUNFfERFVklDRV9ERUZBVUxUfE9OX0RFVklDRXxPTl9ERVZJQ0VfREVGQVVMVHxPVVRfT0ZfT1JERVJfRVhFQ19NT0RFX0VOQUJMRXxQUk9GSUxJTkdfRU5BQkxFfFBST1BFUlRJRVN8UkVGRVJFTkNFX0NPVU5UfFNJWkUpfFJ8UkF8UkVBRF8oPzpPTkxZfFdSSVRFKV9DQUNIRXxSR3xSR0J8UkdCQXxSR0J4fFJHeHxSVU5OSU5HfFJ4fFNBTVBMRVJfKD86QUREUkVTU0lOR19NT0RFfENPTlRFWFR8RklMVEVSX01PREV8TE9EX01BWHxMT0RfTUlOfE1JUF9GSUxURVJfTU9ERXxOT1JNQUxJWkVEX0NPT1JEU3xSRUZFUkVOQ0VfQ09VTlQpfCg/OlVOKT9TSUdORURfSU5UKD86OHwxNnwzMil8U05PUk1fSU5UKD86OHwxNil8U1VCTUlUVEVEfFNVQ0NFU1N8VU5PUk1fSU5UKD86OHwxNnwyNHxfMTAxMDEwfF8xMDEwMTBfMil8VU5PUk1fU0hPUlRfKD86NTU1fDU2NSl8VkVSU0lPTl8oPzoxXzB8MV8xfDFfMnwyXzB8Ml8xKXxzQkdSQXxzUkdCfHNSR0JBfHNSR0J4KVxcYi8sXG5cdFx0XHRhbGlhczogJ2NvbnN0YW50J1xuXHRcdH0sXG5cdFx0Ly8gRXh0cmFjdGVkIGZyb20gY2wuaCAoMi4wKSBhbmQgaHR0cDovL3N0cmVhbWNvbXB1dGluZy5ldS9kb3dubG9hZHMvP29wZW5jbF9ob3N0LmxhbmcgKG9wZW5jbC1ob3N0KVxuXHRcdCdmdW5jdGlvbi1vcGVuY2wtaG9zdCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGJjbCg/OkJ1aWxkUHJvZ3JhbXxDbG9uZUtlcm5lbHxDb21waWxlUHJvZ3JhbXxDcmVhdGUoPzpCdWZmZXJ8Q29tbWFuZFF1ZXVlKD86V2l0aFByb3BlcnRpZXMpP3xDb250ZXh0fENvbnRleHRGcm9tVHlwZXxJbWFnZXxJbWFnZTJEfEltYWdlM0R8S2VybmVsfEtlcm5lbHNJblByb2dyYW18UGlwZXxQcm9ncmFtV2l0aCg/OkJpbmFyeXxCdWlsdEluS2VybmVsc3xJTHxTb3VyY2UpfFNhbXBsZXJ8U2FtcGxlcldpdGhQcm9wZXJ0aWVzfFN1YkJ1ZmZlcnxTdWJEZXZpY2VzfFVzZXJFdmVudCl8RW5xdWV1ZSg/Oig/OkJhcnJpZXJ8TWFya2VyKSg/OldpdGhXYWl0TGlzdCk/fENvcHkoPzpCdWZmZXIoPzpSZWN0fFRvSW1hZ2UpP3xJbWFnZSg/OlRvQnVmZmVyKT8pfCg/OkZpbGx8TWFwKSg/OkJ1ZmZlcnxJbWFnZSl8TWlncmF0ZU1lbU9iamVjdHN8TkRSYW5nZUtlcm5lbHxOYXRpdmVLZXJuZWx8KD86UmVhZHxXcml0ZSkoPzpCdWZmZXIoPzpSZWN0KT98SW1hZ2UpfFNWTSg/OkZyZWV8TWFwfE1lbUZpbGx8TWVtY3B5fE1pZ3JhdGVNZW18VW5tYXApfFRhc2t8VW5tYXBNZW1PYmplY3R8V2FpdEZvckV2ZW50cyl8RmluaXNofEZsdXNofEdldCg/OkNvbW1hbmRRdWV1ZUluZm98Q29udGV4dEluZm98RGV2aWNlKD86QW5kSG9zdFRpbWVyfElEc3xJbmZvKXxFdmVudCg/OlByb2ZpbGluZyk/SW5mb3xFeHRlbnNpb25GdW5jdGlvbkFkZHJlc3MoPzpGb3JQbGF0Zm9ybSk/fEhvc3RUaW1lcnxJbWFnZUluZm98S2VybmVsKD86QXJnSW5mb3xJbmZvfFN1Ykdyb3VwSW5mb3xXb3JrR3JvdXBJbmZvKXxNZW1PYmplY3RJbmZvfFBpcGVJbmZvfFBsYXRmb3JtKD86SURzfEluZm8pfFByb2dyYW0oPzpCdWlsZCk/SW5mb3xTYW1wbGVySW5mb3xTdXBwb3J0ZWRJbWFnZUZvcm1hdHMpfExpbmtQcm9ncmFtfCg/OlJlbGVhc2V8UmV0YWluKSg/OkNvbW1hbmRRdWV1ZXxDb250ZXh0fERldmljZXxFdmVudHxLZXJuZWx8TWVtT2JqZWN0fFByb2dyYW18U2FtcGxlcil8U1ZNKD86QWxsb2N8RnJlZSl8U2V0KD86Q29tbWFuZFF1ZXVlUHJvcGVydHl8RGVmYXVsdERldmljZUNvbW1hbmRRdWV1ZXxFdmVudENhbGxiYWNrfEtlcm5lbHxLZXJuZWwoPzpBcmcoPzpTVk1Qb2ludGVyKT98RXhlY0luZm8pfE1lbU9iamVjdERlc3RydWN0b3JDYWxsYmFja3xVc2VyRXZlbnRTdGF0dXMpfFVubG9hZCg/OlBsYXRmb3JtKT9Db21waWxlcnxXYWl0Rm9yRXZlbnRzKVxcYi8sXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH1cblx0fTtcblxuXHQvKiBPcGVuQ0wgaG9zdCBBUEkgKi9cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnYycsICdrZXl3b3JkJywgYXR0cmlidXRlcyk7XG5cblx0Ly8gQysrIGluY2x1ZGVzIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgT3BlbkNMIEMgaG9zdCBBUEkgcGx1cyB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGNsMi5oXG5cdGlmIChQcmlzbS5sYW5ndWFnZXMuY3BwKSB7XG5cdFx0Ly8gRXh0cmFjdGVkIGZyb20gZG94eWdlbiBjbGFzcyBsaXN0IGh0dHA6Ly9naXRodWIua2hyb25vcy5vcmcvT3BlbkNMLUNMSFBQL2Fubm90YXRlZC5odG1sXG5cdFx0YXR0cmlidXRlc1sndHlwZS1vcGVuY2wtaG9zdC1jcHAnXSA9IHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzpCdWZmZXJ8QnVmZmVyR0x8QnVmZmVyUmVuZGVyR0x8Q29tbWFuZFF1ZXVlfENvbnRleHR8RGV2aWNlfERldmljZUNvbW1hbmRRdWV1ZXxFbnF1ZXVlQXJnc3xFdmVudHxJbWFnZXxJbWFnZTFEfEltYWdlMURBcnJheXxJbWFnZTFEQnVmZmVyfEltYWdlMkR8SW1hZ2UyREFycmF5fEltYWdlMkRHTHxJbWFnZTNEfEltYWdlM0RHTHxJbWFnZUZvcm1hdHxJbWFnZUdMfEtlcm5lbHxLZXJuZWxGdW5jdG9yfExvY2FsU3BhY2VBcmd8TWVtb3J5fE5EUmFuZ2V8UGlwZXxQbGF0Zm9ybXxQcm9ncmFtfFNWTUFsbG9jYXRvcnxTVk1UcmFpdEF0b21pY3xTVk1UcmFpdENvYXJzZXxTVk1UcmFpdEZpbmV8U1ZNVHJhaXRSZWFkT25seXxTVk1UcmFpdFJlYWRXcml0ZXxTVk1UcmFpdFdyaXRlT25seXxTYW1wbGVyfFVzZXJFdmVudClcXGIvLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH07XG5cblx0XHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjcHAnLCAna2V5d29yZCcsIGF0dHJpYnV0ZXMpO1xuXHR9XG59KFByaXNtKSk7XG5cbi8vIGh0dHBzOi8vcWlza2l0LmdpdGh1Yi5pby9vcGVucWFzbS9ncmFtbWFyL2luZGV4Lmh0bWxcblxuUHJpc20ubGFuZ3VhZ2VzLm9wZW5xYXNtID0ge1xuXHQnY29tbWVudCc6IC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvfFxcL1xcLy4qLyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCJbXlwiXFxyXFxuXFx0XSpcInwnW14nXFxyXFxuXFx0XSonLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQna2V5d29yZCc6IC9cXGIoPzpDWHxPUEVOUUFTTXxVfGJhcnJpZXJ8Ym94YXN8Ym94dG98YnJlYWt8Y29uc3R8Y29udGludWV8Y3RybHxkZWZ8ZGVmY2FsfGRlZmNhbGdyYW1tYXJ8ZGVsYXl8ZWxzZXxlbmR8Zm9yfGdhdGV8Z3BoYXNlfGlmfGlufGluY2x1ZGV8aW52fGtlcm5lbHxsZW5ndGhvZnxsZXR8bWVhc3VyZXxwb3d8cmVzZXR8cmV0dXJufHJvdGFyeXxzdHJldGNoaW5mfHdoaWxlKVxcYnwjcHJhZ21hXFxiLyxcblx0J2NsYXNzLW5hbWUnOiAvXFxiKD86YW5nbGV8Yml0fGJvb2x8Y3JlZ3xmaXhlZHxmbG9hdHxpbnR8bGVuZ3RofHFyZWd8cXViaXR8c3RyZXRjaHx1aW50KVxcYi8sXG5cdCdmdW5jdGlvbic6IC9cXGIoPzpjb3N8ZXhwfGxufHBvcGNvdW50fHJvdGx8cm90cnxzaW58c3FydHx0YW4pXFxiKD89XFxzKlxcKCkvLFxuXG5cdCdjb25zdGFudCc6IC9cXGIoPzpldWxlcnxwaXx0YXUpXFxifFx1MDNDMHxcdUQ4MzVcdURGMEZ8XHUyMTA3Lyxcblx0J251bWJlcic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W14uXFx3JF0pKD86XFxkKyg/OlxcLlxcZCopP3xcXC5cXGQrKSg/OmVbKy1dP1xcZCspPyg/OmR0fG5zfHVzfFx1MDBCNXN8bXN8cyk/L2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnb3BlcmF0b3InOiAvLT58Pj49P3w8PD0/fCYmfFxcfFxcfHxcXCtcXCt8LS18WyE9PD4mfH5eK1xcLSovJV09P3xALyxcblx0J3B1bmN0dWF0aW9uJzogL1soKXt9XFxbXFxdOyw6Ll0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMucWFzbSA9IFByaXNtLmxhbmd1YWdlcy5vcGVucWFzbTtcblxuUHJpc20ubGFuZ3VhZ2VzLm96ID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwvXFwqW1xcc1xcU10qP1xcKlxcL3wlLiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlteXCJcXFxcXXxcXFxcW1xcc1xcU10pKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2F0b20nOiB7XG5cdFx0cGF0dGVybjogLycoPzpbXidcXFxcXXxcXFxcW1xcc1xcU10pKicvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ2J1aWx0aW4nXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcJHxcXFtcXF18XFxiKD86X3xhdHxhdHRyfGNhc2V8Y2F0Y2h8Y2hvaWNlfGNsYXNzfGNvbmR8ZGVjbGFyZXxkZWZpbmV8ZGlzfGVsc2UoPzpjYXNlfGlmKT98ZW5kfGV4cG9ydHxmYWlsfGZhbHNlfGZlYXR8ZmluYWxseXxmcm9tfGZ1bnxmdW5jdG9yfGlmfGltcG9ydHxpbnxsb2NhbHxsb2NrfG1ldGh8bmlsfG5vdHxvZnxvcnxwcmVwYXJlfHByb2N8cHJvcHxyYWlzZXxyZXF1aXJlfHNlbGZ8c2tpcHx0aGVufHRocmVhZHx0cnVlfHRyeXx1bml0KVxcYi8sXG5cdCdmdW5jdGlvbic6IFtcblx0XHQvXFxiW2Etel1bQS1aYS16XFxkXSooPz1cXCgpLyxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKFxceylbQS1aXVtBLVphLXpcXGRdKlxcYi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQnbnVtYmVyJzogL1xcYig/OjBbYnhdW1xcZGEtZl0rfFxcZCsoPzpcXC5cXGQqKT8oPzplfj9cXGQrKT8pXFxifCYoPzpbXlxcXFxdfFxcXFwoPzpcXGR7M318LikpL2ksXG5cdCd2YXJpYWJsZSc6IC9gKD86W15gXFxcXF18XFxcXC4pK2AvLFxuXHQnYXR0ci1uYW1lJzogL1xcYlxcdysoPz1bIFxcdF0qOig/IVs6PV0pKS8sXG5cdCdvcGVyYXRvcic6IC86KD86PXw6Oj8pfDxbLTo9XT98PSg/Oj18PD86Pyl8Pj0/Oj98XFxcXD06P3whIT98W3wjK1xcLSpcXC8sfl5AXXxcXGIoPzphbmR0aGVufGRpdnxtb2R8b3JlbHNlKVxcYi8sXG5cdCdwdW5jdHVhdGlvbic6IC9bXFxbXFxdKCl7fS46Oz9dL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnBhcmlncCA9IHtcblx0J2NvbW1lbnQnOiAvXFwvXFwqW1xcc1xcU10qP1xcKlxcL3xcXFxcXFxcXC4qLyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXFxcXFxcclxcbl18XFxcXC4pKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0Ly8gUEFSSS9HUCBkb2VzIG5vdCBjYXJlIGFib3V0IHdoaXRlIHNwYWNlcyBhdCBhbGxcblx0Ly8gc28gbGV0J3MgcHJvY2VzcyB0aGUga2V5d29yZHMgdG8gYnVpbGQgYW4gYXBwcm9wcmlhdGUgcmVnZXhwXG5cdC8vIChlLmcuIFwiYiAqciAqZSAqYSAqa1wiLCBldGMuKVxuXHQna2V5d29yZCc6IChmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIGtleXdvcmRzID0gW1xuXHRcdFx0J2JyZWFrcG9pbnQnLCAnYnJlYWsnLCAnZGJnX2Rvd24nLCAnZGJnX2VycicsICdkYmdfdXAnLCAnZGJnX3gnLFxuXHRcdFx0J2ZvcmNvbXBvc2l0ZScsICdmb3JkaXYnLCAnZm9yZWxsJywgJ2ZvcnBhcnQnLCAnZm9ycHJpbWUnLFxuXHRcdFx0J2ZvcnN0ZXAnLCAnZm9yc3ViZ3JvdXAnLCAnZm9ydmVjJywgJ2ZvcicsICdpZmVycicsICdpZicsXG5cdFx0XHQnbG9jYWwnLCAnbXknLCAnbmV4dCcsICdyZXR1cm4nLCAndW50aWwnLCAnd2hpbGUnXG5cdFx0XTtcblx0XHRrZXl3b3JkcyA9IGtleXdvcmRzLm1hcChmdW5jdGlvbiAoa2V5d29yZCkge1xuXHRcdFx0cmV0dXJuIGtleXdvcmQuc3BsaXQoJycpLmpvaW4oJyAqJyk7XG5cdFx0fSkuam9pbignfCcpO1xuXHRcdHJldHVybiBSZWdFeHAoJ1xcXFxiKD86JyArIGtleXdvcmRzICsgJylcXFxcYicpO1xuXHR9KCkpLFxuXHQnZnVuY3Rpb24nOiAvXFxiXFx3KD86W1xcdyBdKlxcdyk/KD89ICpcXCgpLyxcblx0J251bWJlcic6IHtcblx0XHQvLyBUaGUgbG9va2JlaGluZCBhbmQgdGhlIG5lZ2F0aXZlIGxvb2thaGVhZCBwcmV2ZW50IGZyb20gYnJlYWtpbmcgdGhlIC4uIG9wZXJhdG9yXG5cdFx0cGF0dGVybjogLygoPzpcXC4gKlxcLiAqKT8pKD86XFxiXFxkKD86ICpcXGQpKig/OiAqKD8hXFwuICpcXC4pXFwuKD86ICpcXGQpKik/fFxcLiAqXFxkKD86ICpcXGQpKikoPzogKmUgKig/OlsrLV0gKik/XFxkKD86ICpcXGQpKik/L2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnb3BlcmF0b3InOiAvXFwuICpcXC58WypcXC8hXSg/OiAqPSk/fCUoPzogKj18KD86ICojKT8oPzogKicpKik/fFxcKyg/OiAqWys9XSk/fC0oPzogKlstPT5dKT98PCg/OiAqPnwoPzogKjwpPyg/OiAqPSk/KT98Pig/OiAqPik/KD86ICo9KT98PSg/OiAqPSl7MCwyfXxcXFxcKD86ICpcXC8pPyg/OiAqPSk/fCYoPzogKiYpP3xcXHwgKlxcfHxbJyN+Xl0vLFxuXHQncHVuY3R1YXRpb24nOiAvW1xcW1xcXXt9KCkuLDo7fF0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIHBhcnNlciA9IFByaXNtLmxhbmd1YWdlcy5wYXJzZXIgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdtYXJrdXAnLCB7XG5cdFx0J2tleXdvcmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15eXSkoPzpcXF4oPzpjYXNlfGV2YWx8Zm9yfGlmfHN3aXRjaHx0aHJvdylcXGJ8QCg/OkJBU0V8Q0xBU1N8R0VUKD86X0RFRkFVTFQpP3xPUFRJT05TfFNFVF9ERUZBVUxUfFVTRSlcXGIpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCd2YXJpYWJsZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXl5dKVxcQlxcJCg/Olxcdyt8KD89Wy57XSkpKD86KD86XFwufDo6PylcXHcrKSooPzpcXC58Ojo/KT8vLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwufDorL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2Z1bmN0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXl0pXFxCW0BeXVxcdysoPzooPzpcXC58Ojo/KVxcdyspKig/OlxcLnw6Oj8pPy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdrZXl3b3JkJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXkApKD86R0VUX3xTRVRfKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwufDorL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2VzY2FwZSc6IHtcblx0XHRcdHBhdHRlcm46IC9cXF4oPzpbJF47QCgpXFxbXFxde31cIic6XXwjW2EtZlxcZF0qKS9pLFxuXHRcdFx0YWxpYXM6ICdidWlsdGluJ1xuXHRcdH0sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1tcXFtcXF0oKXt9O10vXG5cdH0pO1xuXG5cdHBhcnNlciA9IFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3BhcnNlcicsICdrZXl3b3JkJywge1xuXHRcdCdwYXJzZXItY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxzKSMuKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdjb21tZW50J1xuXHRcdH0sXG5cdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHQvLyBBbGxvdyBmb3IgMyBsZXZlbHMgb2YgZGVwdGhcblx0XHRcdHBhdHRlcm46IC8oXnxbXl5dKVxcKCg/OlteKCldfFxcKCg/OlteKCldfFxcKCg/OlteKCldKSpcXCkpKlxcKSkqXFwpLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3N0cmluZyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF58W15eXSkoW1wiJ10pKD86KD8hXFwyKVteXl18XFxeW1xcc1xcU10pKlxcMi8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQna2V5d29yZCc6IHBhcnNlci5rZXl3b3JkLFxuXHRcdFx0XHQndmFyaWFibGUnOiBwYXJzZXIudmFyaWFibGUsXG5cdFx0XHRcdCdmdW5jdGlvbic6IHBhcnNlci5mdW5jdGlvbixcblx0XHRcdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHRcdFx0XHQnbnVtYmVyJzogL1xcYig/OjB4W2EtZlxcZF0rfFxcZCsoPzpcXC5cXGQqKT8oPzplWystXT9cXGQrKT8pXFxiL2ksXG5cdFx0XHRcdCdlc2NhcGUnOiBwYXJzZXIuZXNjYXBlLFxuXHRcdFx0XHQnb3BlcmF0b3InOiAvW34rKlxcL1xcXFwlXXwhKD86XFx8XFx8P3w9KT98JiY/fFxcfFxcfD98PT18PFs8PV0/fD5bPj1dP3wtW2ZkXT98XFxiKD86ZGVmfGVxfGdlfGd0fGlufGlzfGxlfGx0fG5lKVxcYi8sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IHBhcnNlci5wdW5jdHVhdGlvblxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnaW5zaWRlJywgJ3B1bmN0dWF0aW9uJywge1xuXHRcdCdleHByZXNzaW9uJzogcGFyc2VyLmV4cHJlc3Npb24sXG5cdFx0J2tleXdvcmQnOiBwYXJzZXIua2V5d29yZCxcblx0XHQndmFyaWFibGUnOiBwYXJzZXIudmFyaWFibGUsXG5cdFx0J2Z1bmN0aW9uJzogcGFyc2VyLmZ1bmN0aW9uLFxuXHRcdCdlc2NhcGUnOiBwYXJzZXIuZXNjYXBlLFxuXHRcdCdwYXJzZXItcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiBwYXJzZXIucHVuY3R1YXRpb24sXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH1cblx0fSwgcGFyc2VyWyd0YWcnXS5pbnNpZGVbJ2F0dHItdmFsdWUnXSk7XG5cbn0oUHJpc20pKTtcblxuLy8gQmFzZWQgb24gRnJlZSBQYXNjYWxcblxuLyogVE9ET1xuXHRTdXBwb3J0IGlubGluZSBhc20gP1xuKi9cblxuUHJpc20ubGFuZ3VhZ2VzLnBhc2NhbCA9IHtcblx0J2RpcmVjdGl2ZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFx7XFwkW1xcc1xcU10qP1xcfS8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiBbJ21hcmNvJywgJ3Byb3BlcnR5J11cblx0fSxcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcKFxcKltcXHNcXFNdKj9cXCpcXCl8XFx7W1xcc1xcU10qP1xcfXxcXC9cXC8uKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyg/OicoPzonJ3xbXidcXHJcXG5dKSonKD8hJyl8I1smJCVdP1thLWZcXGRdKykrfFxcXlthLXpdL2ksXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdhc20nOiB7XG5cdFx0cGF0dGVybjogLyhcXGJhc21cXGIpW1xcc1xcU10rPyg/PVxcYmVuZFxccypbO1tdKS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0fSxcblx0J2tleXdvcmQnOiBbXG5cdFx0e1xuXHRcdFx0Ly8gVHVyYm8gUGFzY2FsXG5cdFx0XHRwYXR0ZXJuOiAvKF58W14mXSlcXGIoPzphYnNvbHV0ZXxhcnJheXxhc218YmVnaW58Y2FzZXxjb25zdHxjb25zdHJ1Y3RvcnxkZXN0cnVjdG9yfGRvfGRvd250b3xlbHNlfGVuZHxmaWxlfGZvcnxmdW5jdGlvbnxnb3RvfGlmfGltcGxlbWVudGF0aW9ufGluaGVyaXRlZHxpbmxpbmV8aW50ZXJmYWNlfGxhYmVsfG5pbHxvYmplY3R8b2Z8b3BlcmF0b3J8cGFja2VkfHByb2NlZHVyZXxwcm9ncmFtfHJlY29yZHxyZWludHJvZHVjZXxyZXBlYXR8c2VsZnxzZXR8c3RyaW5nfHRoZW58dG98dHlwZXx1bml0fHVudGlsfHVzZXN8dmFyfHdoaWxlfHdpdGgpXFxiL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHQvLyBGcmVlIFBhc2NhbFxuXHRcdFx0cGF0dGVybjogLyhefFteJl0pXFxiKD86ZGlzcG9zZXxleGl0fGZhbHNlfG5ld3x0cnVlKVxcYi9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Ly8gT2JqZWN0IFBhc2NhbFxuXHRcdFx0cGF0dGVybjogLyhefFteJl0pXFxiKD86Y2xhc3N8ZGlzcGludGVyZmFjZXxleGNlcHR8ZXhwb3J0c3xmaW5hbGl6YXRpb258ZmluYWxseXxpbml0aWFsaXphdGlvbnxpbmxpbmV8bGlicmFyeXxvbnxvdXR8cGFja2VkfHByb3BlcnR5fHJhaXNlfHJlc291cmNlc3RyaW5nfHRocmVhZHZhcnx0cnkpXFxiL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHQvLyBNb2RpZmllcnNcblx0XHRcdHBhdHRlcm46IC8oXnxbXiZdKVxcYig/OmFic29sdXRlfGFic3RyYWN0fGFsaWFzfGFzc2VtYmxlcnxiaXRwYWNrZWR8YnJlYWt8Y2RlY2x8Y29udGludWV8Y3BwZGVjbHxjdmFyfGRlZmF1bHR8ZGVwcmVjYXRlZHxkeW5hbWljfGVudW1lcmF0b3J8ZXhwZXJpbWVudGFsfGV4cG9ydHxleHRlcm5hbHxmYXJ8ZmFyMTZ8Zm9yd2FyZHxnZW5lcmljfGhlbHBlcnxpbXBsZW1lbnRzfGluZGV4fGludGVycnVwdHxpb2NoZWNrc3xsb2NhbHxtZXNzYWdlfG5hbWV8bmVhcnxub2RlZmF1bHR8bm9yZXR1cm58bm9zdGFja2ZyYW1lfG9sZGZwY2NhbGx8b3RoZXJ3aXNlfG92ZXJsb2FkfG92ZXJyaWRlfHBhc2NhbHxwbGF0Zm9ybXxwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8cHVibGlzaGVkfHJlYWR8cmVnaXN0ZXJ8cmVpbnRyb2R1Y2V8cmVzdWx0fHNhZmVjYWxsfHNhdmVyZWdpc3RlcnN8c29mdGZsb2F0fHNwZWNpYWxpemV8c3RhdGljfHN0ZGNhbGx8c3RvcmVkfHN0cmljdHx1bmFsaWduZWR8dW5pbXBsZW1lbnRlZHx2YXJhcmdzfHZpcnR1YWx8d3JpdGUpXFxiL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQnbnVtYmVyJzogW1xuXHRcdC8vIEhleGFkZWNpbWFsLCBvY3RhbCBhbmQgYmluYXJ5XG5cdFx0Lyg/OlsmJV1cXGQrfFxcJFthLWZcXGRdKykvaSxcblx0XHQvLyBEZWNpbWFsXG5cdFx0L1xcYlxcZCsoPzpcXC5cXGQrKT8oPzplWystXT9cXGQrKT8vaVxuXHRdLFxuXHQnb3BlcmF0b3InOiBbXG5cdFx0L1xcLlxcLnxcXCpcXCp8Oj18PFs8PT5dP3w+Wz49XT98WytcXC0qXFwvXT0/fFtAXj1dLyxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W14mXSlcXGIoPzphbmR8YXN8ZGl2fGV4Y2x1ZGV8aW58aW5jbHVkZXxpc3xtb2R8bm90fG9yfHNobHxzaHJ8eG9yKVxcYi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQncHVuY3R1YXRpb24nOiAvXFwoXFwufFxcLlxcKXxbKClcXFtcXF06OywuXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5wYXNjYWwuYXNtLmluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ3Bhc2NhbCcsIHtcblx0J2FzbSc6IHVuZGVmaW5lZCxcblx0J2tleXdvcmQnOiB1bmRlZmluZWQsXG5cdCdvcGVyYXRvcic6IHVuZGVmaW5lZFxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5vYmplY3RwYXNjYWwgPSBQcmlzbS5sYW5ndWFnZXMucGFzY2FsO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0Ly8gUGFzY2FsaWdvIGlzIGEgbGF5ZXIgMiBzbWFydCBjb250cmFjdCBsYW5ndWFnZSBmb3IgdGhlIHRlem9zIGJsb2NrY2hhaW5cblxuXHR2YXIgYnJhY2VzID0gL1xcKCg/OlteKCldfFxcKCg/OlteKCldfFxcKFteKCldKlxcKSkqXFwpKSpcXCkvLnNvdXJjZTtcblx0dmFyIHR5cGUgPSAvKD86XFxiXFx3Kyg/OjxicmFjZXM+KT98PGJyYWNlcz4pLy5zb3VyY2UucmVwbGFjZSgvPGJyYWNlcz4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gYnJhY2VzOyB9KTtcblxuXHR2YXIgcGFzY2FsaWdvID0gUHJpc20ubGFuZ3VhZ2VzLnBhc2NhbGlnbyA9IHtcblx0XHQnY29tbWVudCc6IC9cXChcXCpbXFxzXFxTXSs/XFwqXFwpfFxcL1xcLy4qLyxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogLyhbXCInYF0pKD86XFxcXFtcXHNcXFNdfCg/IVxcMSlbXlxcXFxdKSpcXDF8XFxeW2Etel0vaSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2NsYXNzLW5hbWUnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKFxcYnR5cGVcXHMrXFx3K1xccytpc1xccyspPHR5cGU+Ly5zb3VyY2UucmVwbGFjZSgvPHR5cGU+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHR5cGU7IH0pLCAnaScpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLzx0eXBlPig/PVxccytpc1xcYikvLnNvdXJjZS5yZXBsYWNlKC88dHlwZT4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gdHlwZTsgfSksICdpJyksXG5cdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKDpcXHMqKTx0eXBlPi8uc291cmNlLnJlcGxhY2UoLzx0eXBlPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0eXBlOyB9KSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdrZXl3b3JkJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteJl0pXFxiKD86YmVnaW58YmxvY2t8Y2FzZXxjb25zdHxlbHNlfGVuZHxmYWlsfGZvcnxmcm9tfGZ1bmN0aW9ufGlmfGlzfG5pbHxvZnxyZW1vdmV8cmV0dXJufHNraXB8dGhlbnx0eXBlfHZhcnx3aGlsZXx3aXRoKVxcYi9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2Jvb2xlYW4nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W14mXSlcXGIoPzpGYWxzZXxUcnVlKVxcYi9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2J1aWx0aW4nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W14mXSlcXGIoPzpib29sfGludHxsaXN0fG1hcHxuYXR8cmVjb3JkfHN0cmluZ3x1bml0KVxcYi9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2Z1bmN0aW9uJzogL1xcYlxcdysoPz1cXHMqXFwoKS8sXG5cdFx0J251bWJlcic6IFtcblx0XHRcdC8vIEhleGFkZWNpbWFsLCBvY3RhbCBhbmQgYmluYXJ5XG5cdFx0XHQvJVswMV0rfCZbMC03XSt8XFwkW2EtZlxcZF0rL2ksXG5cdFx0XHQvLyBEZWNpbWFsXG5cdFx0XHQvXFxiXFxkKyg/OlxcLlxcZCspPyg/OmVbKy1dP1xcZCspPyg/Om10enxuKT8vaVxuXHRcdF0sXG5cdFx0J29wZXJhdG9yJzogLy0+fD1cXC89fFxcLlxcLnxcXCpcXCp8Oj18PFs8PT5dP3w+Wz49XT98WytcXC0qXFwvXT0/fFtAXj18XXxcXGIoPzphbmR8bW9kfG9yKVxcYi8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1xcKFxcLnxcXC5cXCl8WygpXFxbXFxdOjssLnt9XS9cblx0fTtcblxuXHR2YXIgY2xhc3NOYW1lSW5zaWRlID0gWydjb21tZW50JywgJ2tleXdvcmQnLCAnYnVpbHRpbicsICdvcGVyYXRvcicsICdwdW5jdHVhdGlvbiddLnJlZHVjZShmdW5jdGlvbiAoYWNjdW0sIGtleSkge1xuXHRcdGFjY3VtW2tleV0gPSBwYXNjYWxpZ29ba2V5XTtcblx0XHRyZXR1cm4gYWNjdW07XG5cdH0sIHt9KTtcblxuXHRwYXNjYWxpZ29bJ2NsYXNzLW5hbWUnXS5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG5cdFx0cC5pbnNpZGUgPSBjbGFzc05hbWVJbnNpZGU7XG5cdH0pO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5wc2wgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8jLiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlxcXFwufFteXFxcXFwiXSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdzeW1ib2wnOiAvXFxcXFtudHJiQS1aXCJcXFxcXS9cblx0XHR9XG5cdH0sXG5cdCdoZXJlZG9jLXN0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvPDw8KFthLXpBLVpfXVxcdyopW1xcclxcbl0oPzouKltcXHJcXG5dKSo/XFwxXFxiLyxcblx0XHRhbGlhczogJ3N0cmluZycsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/Ol9fbXVsdGl8X19zaW5nbGV8Y2FzZXxkZWZhdWx0fGRvfGVsc2V8ZWxzaWZ8ZXhpdHxleHBvcnR8Zm9yfGZvcmVhY2h8ZnVuY3Rpb258aWZ8bGFzdHxsaW5lfGxvY2FsfG5leHR8cmVxdWlyZXN8cmV0dXJufHN3aXRjaHx1bnRpbHx3aGlsZXx3b3JkKVxcYi8sXG5cdCdjb25zdGFudCc6IC9cXGIoPzpBTEFSTXxDSEFSVF9BRERfR1JBUEh8Q0hBUlRfREVMRVRFX0dSQVBIfENIQVJUX0RFU1RST1l8Q0hBUlRfTE9BRHxDSEFSVF9QUklOVHxFT0Z8T0ZGTElORXxPS3xQU0xfUFJPRl9MT0d8Ul9DSEVDS19IT1JJWnxSX0NIRUNLX1ZFUlR8Ul9DTElDS0VSfFJfQ09MVU1OfFJfRlJBTUV8Ul9JQ09OfFJfTEFCRUx8Ul9MQUJFTF9DRU5URVJ8Ul9MSVNUX01VTFRJUExFfFJfTElTVF9NVUxUSVBMRV9ORHxSX0xJU1RfU0lOR0xFfFJfTElTVF9TSU5HTEVfTkR8Ul9NRU5VfFJfUE9QVVB8Ul9QT1BVUF9TQ1JPTExFRHxSX1JBRElPX0hPUklafFJfUkFESU9fVkVSVHxSX1JPV3xSX1NDQUxFX0hPUklafFJfU0NBTEVfVkVSVHxSX1NFUF9IT1JJWnxSX1NFUF9WRVJUfFJfU1BJTk5FUnxSX1RFWFRfRklFTER8Ul9URVhUX0ZJRUxEX0xBQkVMfFJfVE9HR0xFfFRSSU1fTEVBRElOR3xUUklNX0xFQURJTkdfQU5EX1RSQUlMSU5HfFRSSU1fUkVEVU5EQU5UfFRSSU1fVFJBSUxJTkd8Vk9JRHxXQVJOKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OkZBTFNFfEZhbHNlfE5PfE5vfFRSVUV8VHJ1ZXxZRVN8WWVzfGZhbHNlfG5vfHRydWV8eWVzKVxcYi8sXG5cdCd2YXJpYWJsZSc6IC9cXGIoPzpQc2xEZWJ1Z3xlcnJub3xleGl0X3N0YXR1cylcXGIvLFxuXHQnYnVpbHRpbic6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86UHNsRXhlY3V0ZXxQc2xGdW5jdGlvbkNhbGx8UHNsRnVuY3Rpb25FeGlzdHN8UHNsU2V0T3B0aW9uc3xfc25tcF9kZWJ1Z3xhY29zfGFkZF9kaWFyeXxhbm5vdGF0ZXxhbm5vdGF0ZV9nZXR8YXNjaWlfdG9fZWJjZGljfGFzY3RpbWV8YXNpbnxhdGFufGF0ZXhpdHxiYXRjaF9zZXR8YmxhY2tvdXR8Y2F0fGNlaWx8Y2hhbl9leGlzdHN8Y2hhbmdlX3N0YXRlfGNsb3NlfGNvZGVfY3Z0fGNvbmRfc2lnbmFsfGNvbmRfd2FpdHxjb25zb2xlX3R5cGV8Y29udmVydF9iYXNlfGNvbnZlcnRfZGF0ZXxjb252ZXJ0X2xvY2FsZV9kYXRlfGNvc3xjb3NofGNyZWF0ZXxkYXRlfGRjZ2V0X3RleHR8ZGVzdHJveXxkZXN0cm95X2xvY2t8ZGdldF90ZXh0fGRpZmZlcmVuY2V8ZHVtcF9oaXN0fGViY2RpY190b19hc2NpaXxlbmNyeXB0fGV2ZW50X2FyY2hpdmV8ZXZlbnRfY2F0YWxvZ19nZXR8ZXZlbnRfY2hlY2t8ZXZlbnRfcXVlcnl8ZXZlbnRfcmFuZ2VfbWFuYWdlfGV2ZW50X3JhbmdlX3F1ZXJ5fGV2ZW50X3JlcG9ydHxldmVudF9zY2hlZHVsZXxldmVudF90cmlnZ2VyfGV2ZW50X3RyaWdnZXIyfGV4ZWN1dGV8ZXhpc3RzfGV4cHxmYWJzfGZpbGV8Zmxvb3J8Zm1vZHxmb3Blbnxmc2Vla3xmdGVsbHxmdWxsX2Rpc2NvdmVyeXxnZXR8Z2V0X2NoYW5faW5mb3xnZXRfcmFuZ2VzfGdldF90ZXh0fGdldF92YXJzfGdldGVudnxnZXRob3N0aW5mb3xnZXRwaWR8Z2V0cG5hbWV8Z3JlcHxoaXN0b3J5fGhpc3RvcnlfZ2V0X3JldGVudGlvbnxpbl90cmFuc2l0aW9ufGluZGV4fGludHxpbnRlcm5hbHxpbnRlcnNlY3Rpb258aXNfdmFyfGlzbnVtYmVyfGpvaW58a2lsbHxsZW5ndGh8bGluZXN8bG9ja3xsb2NrX2luZm98bG9nfGxvZzEwfGxvZ2V8bWF0Y2hsaW5lfG1zZ19jaGVja3xtc2dfZ2V0X2Zvcm1hdHxtc2dfZ2V0X3NldmVyaXR5fG1zZ19wcmludGZ8bXNnX3NwcmludGZ8bnRoYXJnfG50aGFyZ2Z8bnRobGluZXxudGhsaW5lZnxudW1fYnl0ZXN8bnVtX2NvbnNvbGVzfHBjb25maWd8cG9wZW58cG9wbGluZXN8cG93fHByaW50fHByaW50Znxwcm9jX2V4aXN0c3xwcm9jZXNzfHJhbmRvbXxyZWFkfHJlYWRsbnxyZWZyZXNoX3BhcmFtZXRlcnN8cmVtb3RlX2NoZWNrfHJlbW90ZV9jbG9zZXxyZW1vdGVfZXZlbnRfcXVlcnl8cmVtb3RlX2V2ZW50X3RyaWdnZXJ8cmVtb3RlX2ZpbGVfc2VuZHxyZW1vdGVfb3BlbnxyZW1vdmV8cmVwbGFjZXxyaW5kZXh8c2VjX2NoZWNrX3ByaXZ8c2VjX3N0b3JlX2dldHxzZWNfc3RvcmVfc2V0fHNldHxzZXRfYWxhcm1fcmFuZ2VzfHNldF9sb2NhbGV8c2hhcmV8c2lufHNpbmh8c2xlZXB8c25tcF9hZ2VudF9jb25maWd8c25tcF9hZ2VudF9zdGFydHxzbm1wX2FnZW50X3N0b3B8c25tcF9jbG9zZXxzbm1wX2NvbmZpZ3xzbm1wX2dldHxzbm1wX2dldF9uZXh0fHNubXBfaF9nZXR8c25tcF9oX2dldF9uZXh0fHNubXBfaF9zZXR8c25tcF9vcGVufHNubXBfc2V0fHNubXBfdHJhcF9pZ25vcmV8c25tcF90cmFwX2xpc3Rlbnxzbm1wX3RyYXBfcmFpc2Vfc3RkX3RyYXB8c25tcF90cmFwX3JlY2VpdmV8c25tcF90cmFwX3JlZ2lzdGVyX2ltfHNubXBfdHJhcF9zZW5kfHNubXBfd2Fsa3xzb3Blbnxzb3J0fHNwbGl0bGluZXxzcHJpbnRmfHNxcnR8c3JhbmRvbXxzdHJfcmVwZWF0fHN0cmNhc2VjbXB8c3Vic2V0fHN1YnN0cnxzeXN0ZW18dGFpbHx0YW58dGFuaHx0ZXh0X2RvbWFpbnx0aW1lfHRtcG5hbXx0b2xvd2VyfHRvdXBwZXJ8dHJhY2VfcHNsX3Byb2Nlc3N8dHJpbXx1bmlvbnx1bmlxdWV8dW5sb2NrfHVuc2V0fHZhX2FyZ3x2YV9zdGFydHx3cml0ZSlcXGIvLFxuXHRcdGFsaWFzOiAnYnVpbHRpbi1mdW5jdGlvbidcblx0fSxcblx0J2ZvcmVhY2gtdmFyaWFibGUnOiB7XG5cdFx0cGF0dGVybjogLyhcXGJmb3JlYWNoXFxzKyg/Oig/OlxcdytcXGJ8XCIoPzpcXFxcLnxbXlxcXFxcIl0pKlwiKVxccyspezAsMn0pW19hLXpBLVpdXFx3Kig/PVxccypcXCgpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnZnVuY3Rpb24nOiAvXFxiW19hLXpdXFx3KlxcYig/PVxccypcXCgpL2ksXG5cdCdudW1iZXInOiAvXFxiKD86MHhbMC05YS1mXSt8XFxkKyg/OlxcLlxcZCspPylcXGIvaSxcblx0J29wZXJhdG9yJzogLy0tfFxcK1xcK3wmJj0/fFxcfFxcfD0/fDw8PT98Pj49P3xbPSFdfnxbLSsqLyUmfF4hPTw+XT0/fFxcLnxbOj9dLyxcblx0J3B1bmN0dWF0aW9uJzogL1soKXt9XFxbXFxdOyxdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnBjYXhpcyA9IHtcblx0J3N0cmluZyc6IC9cIlteXCJdKlwiLyxcblx0J2tleXdvcmQnOiB7XG5cdFx0cGF0dGVybjogLygoPzpefDspXFxzKilbLUEtWlxcZF0rKD86XFxzKlxcW1stXFx3XStcXF0pPyg/OlxccypcXChcIlteXCJdKlwiKD86LFxccypcIlteXCJdKlwiKSpcXCkpPyg/PVxccyo9KS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQna2V5d29yZCc6IC9eWy1BLVpcXGRdKy8sXG5cdFx0XHQnbGFuZ3VhZ2UnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eKFxccyopXFxbWy1cXHddK1xcXS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFxbfFxcXSQvLFxuXHRcdFx0XHRcdCdwcm9wZXJ0eSc6IC9bLVxcd10rL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3N1Yi1rZXknOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eKFxccyopXFxTW1xcc1xcU10qLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3BhcmFtZXRlcic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9cIlteXCJdKlwiLyxcblx0XHRcdFx0XHRcdGFsaWFzOiAncHJvcGVydHknXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlxcKHxcXCkkfCwvXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdCdvcGVyYXRvcic6IC89Lyxcblx0J3RsaXN0Jzoge1xuXHRcdHBhdHRlcm46IC9UTElTVFxccypcXChcXHMqXFx3Kyg/Oig/OlxccyosXFxzKlwiW15cIl0qXCIpK3xcXHMqLFxccypcIlteXCJdKlwiLVwiW15cIl0qXCIpP1xccypcXCkvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdmdW5jdGlvbic6IC9eVExJU1QvLFxuXHRcdFx0J3Byb3BlcnR5Jzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXihcXHMqXFwoXFxzKilcXHcrLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdCdzdHJpbmcnOiAvXCJbXlwiXSpcIi8sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvWygpLF0vLFxuXHRcdFx0J29wZXJhdG9yJzogLy0vXG5cdFx0fVxuXHR9LFxuXHQncHVuY3R1YXRpb24nOiAvWzssXS8sXG5cdCdudW1iZXInOiB7XG5cdFx0cGF0dGVybjogLyhefFxccylcXGQrKD86XFwuXFxkKyk/KD8hXFxTKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnYm9vbGVhbic6IC9OT3xZRVMvLFxufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnB4ID0gUHJpc20ubGFuZ3VhZ2VzLnBjYXhpcztcblxuUHJpc20ubGFuZ3VhZ2VzLnBlb3BsZWNvZGUgPSB7XG5cdCdjb21tZW50JzogUmVnRXhwKFtcblx0XHQvLyBDLXN0eWxlIG11bHRpbGluZSBjb21tZW50c1xuXHRcdC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvLy5zb3VyY2UsXG5cdFx0Ly8gUkVNIGNvbW1lbnRzXG5cdFx0L1xcYlJFTVteO10qOy8uc291cmNlLFxuXHRcdC8vIE5lc3RlZCA8KiAqPiBjb21tZW50c1xuXHRcdC88XFwqKD86W148Kl18XFwqKD8hPil8PCg/IVxcKil8PFxcKig/Oig/IVxcKj4pW1xcc1xcU10pKlxcKj4pKlxcKj4vLnNvdXJjZSxcblx0XHQvLyAvKyArLyBjb21tZW50c1xuXHRcdC9cXC9cXCtbXFxzXFxTXSo/XFwrXFwvLy5zb3VyY2UsXG5cdF0uam9pbignfCcpKSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvJyg/OicnfFteJ1xcclxcbl0pKicoPyEnKXxcIig/OlwiXCJ8W15cIlxcclxcbl0pKlwiKD8hXCIpLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3ZhcmlhYmxlJzogLyVcXHcrLyxcblx0J2Z1bmN0aW9uLWRlZmluaXRpb24nOiB7XG5cdFx0cGF0dGVybjogLygoPzpefFteXFx3LV0pKD86ZnVuY3Rpb258bWV0aG9kKVxccyspXFx3Ky9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0fSxcblx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0cGF0dGVybjogLygoPzpefFteLVxcd10pKD86YXN8Y2F0Y2h8Y2xhc3N8Y29tcG9uZW50fGNyZWF0ZXxleHRlbmRzfGdsb2JhbHxpbXBsZW1lbnRzfGluc3RhbmNlfGxvY2FsfG9mfHByb3BlcnR5fHJldHVybnMpXFxzKylcXHcrKD86OlxcdyspKi9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvOi9cblx0XHR9XG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFic3RyYWN0fGFsaWFzfGFzfGNhdGNofGNsYXNzfGNvbXBvbmVudHxjb25zdGFudHxjcmVhdGV8ZGVjbGFyZXxlbHNlfGVuZC0oPzpjbGFzc3xldmFsdWF0ZXxmb3J8ZnVuY3Rpb258Z2V0fGlmfG1ldGhvZHxzZXR8dHJ5fHdoaWxlKXxldmFsdWF0ZXxleHRlbmRzfGZvcnxmdW5jdGlvbnxnZXR8Z2xvYmFsfGlmfGltcGxlbWVudHN8aW1wb3J0fGluc3RhbmNlfGxpYnJhcnl8bG9jYWx8bWV0aG9kfG51bGx8b2Z8b3V0fHBlb3BsZUNvZGV8cHJpdmF0ZXxwcm9ncmFtfHByb3BlcnR5fHByb3RlY3RlZHxyZWFkb25seXxyZWZ8cmVwZWF0fHJldHVybnM/fHNldHxzdGVwfHRoZW58dGhyb3d8dG98dHJ5fHVudGlsfHZhbHVlfHdoZW4oPzotb3RoZXIpP3x3aGlsZSlcXGIvaSxcblx0J29wZXJhdG9yLWtleXdvcmQnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OmFuZHxub3R8b3IpXFxiL2ksXG5cdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0fSxcblx0J2Z1bmN0aW9uJzogL1tfYS16XVxcdyooPz1cXHMqXFwoKS9pLFxuXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiL2ksXG5cdCdudW1iZXInOiAvXFxiXFxkKyg/OlxcLlxcZCspP1xcYi8sXG5cdCdvcGVyYXRvcic6IC88PnxbPD5dPT98IT18XFwqXFwqfFstKyovfD1AXS8sXG5cdCdwdW5jdHVhdGlvbic6IC9bOi47LCgpW1xcXV0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMucGNvZGUgPSBQcmlzbS5sYW5ndWFnZXMucGVvcGxlY29kZTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBicmFja2V0cyA9IC8oPzpcXCgoPzpbXigpXFxcXF18XFxcXFtcXHNcXFNdKSpcXCl8XFx7KD86W157fVxcXFxdfFxcXFxbXFxzXFxTXSkqXFx9fFxcWyg/OlteW1xcXVxcXFxdfFxcXFxbXFxzXFxTXSkqXFxdfDwoPzpbXjw+XFxcXF18XFxcXFtcXHNcXFNdKSo+KS8uc291cmNlO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5wZXJsID0ge1xuXHRcdCdjb21tZW50JzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyBQT0Rcblx0XHRcdFx0cGF0dGVybjogLyheXFxzKik9XFx3W1xcc1xcU10qPz1jdXQuKi9tLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFwkXSkjLiovLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXHRcdC8vIFRPRE8gQ291bGQgYmUgbmljZSB0byBoYW5kbGUgSGVyZWRvYyB0b28uXG5cdFx0J3N0cmluZyc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0XHRcdC9cXGIoPzpxfHFxfHF3fHF4KSg/IVthLXpBLVowLTldKVxccyovLnNvdXJjZSArXG5cdFx0XHRcdFx0Jyg/OicgK1xuXHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdC8vIHEvLi4uL1xuXHRcdFx0XHRcdFx0LyhbXmEtekEtWjAtOVxcc3soXFxbPF0pKD86KD8hXFwxKVteXFxcXF18XFxcXFtcXHNcXFNdKSpcXDEvLnNvdXJjZSxcblxuXHRcdFx0XHRcdFx0Ly8gcSBhLi4uYVxuXHRcdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9zdHJpY3Rcblx0XHRcdFx0XHRcdC8oW2EtekEtWjAtOV0pKD86KD8hXFwyKVteXFxcXF18XFxcXFtcXHNcXFNdKSpcXDIvLnNvdXJjZSxcblxuXHRcdFx0XHRcdFx0Ly8gcSguLi4pXG5cdFx0XHRcdFx0XHQvLyBxey4uLn1cblx0XHRcdFx0XHRcdC8vIHFbLi4uXVxuXHRcdFx0XHRcdFx0Ly8gcTwuLi4+XG5cdFx0XHRcdFx0XHRicmFja2V0cyxcblx0XHRcdFx0XHRdLmpvaW4oJ3wnKSArXG5cdFx0XHRcdFx0JyknXG5cdFx0XHRcdCksXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblxuXHRcdFx0Ly8gXCIuLi5cIiwgYC4uLmBcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcInxgKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFxbXFxzXFxTXSkqXFwxLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXG5cdFx0XHQvLyAnLi4uJ1xuXHRcdFx0Ly8gRklYTUUgTXVsdGktbGluZSBzaW5nbGUtcXVvdGVkIHN0cmluZ3MgYXJlIG5vdCBzdXBwb3J0ZWQgYXMgdGhleSB3b3VsZCBicmVhayB2YXJpYWJsZXMgY29udGFpbmluZyAnXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8nKD86W14nXFxcXFxcclxcbl18XFxcXC4pKicvLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdyZWdleCc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0XHRcdC9cXGIoPzptfHFyKSg/IVthLXpBLVowLTldKVxccyovLnNvdXJjZSArXG5cdFx0XHRcdFx0Jyg/OicgK1xuXHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdC8vIG0vLi4uL1xuXHRcdFx0XHRcdFx0LyhbXmEtekEtWjAtOVxcc3soXFxbPF0pKD86KD8hXFwxKVteXFxcXF18XFxcXFtcXHNcXFNdKSpcXDEvLnNvdXJjZSxcblxuXHRcdFx0XHRcdFx0Ly8gbSBhLi4uYVxuXHRcdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9zdHJpY3Rcblx0XHRcdFx0XHRcdC8oW2EtekEtWjAtOV0pKD86KD8hXFwyKVteXFxcXF18XFxcXFtcXHNcXFNdKSpcXDIvLnNvdXJjZSxcblxuXHRcdFx0XHRcdFx0Ly8gbSguLi4pXG5cdFx0XHRcdFx0XHQvLyBtey4uLn1cblx0XHRcdFx0XHRcdC8vIG1bLi4uXVxuXHRcdFx0XHRcdFx0Ly8gbTwuLi4+XG5cdFx0XHRcdFx0XHRicmFja2V0cyxcblx0XHRcdFx0XHRdLmpvaW4oJ3wnKSArXG5cdFx0XHRcdFx0JyknICtcblx0XHRcdFx0XHQvW21zaXhwb2R1YWxuZ2NdKi8uc291cmNlXG5cdFx0XHRcdCksXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblxuXHRcdFx0Ly8gVGhlIGxvb2tiZWhpbmRzIHByZXZlbnQgLXMgZnJvbSBicmVha2luZ1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHRcdFx0LyhefFteLV0pXFxiKD86c3x0cnx5KSg/IVthLXpBLVowLTldKVxccyovLnNvdXJjZSArXG5cdFx0XHRcdFx0Jyg/OicgK1xuXHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdC8vIHMvLi4uLy4uLi9cblx0XHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvc3RyaWN0XG5cdFx0XHRcdFx0XHQvKFteYS16QS1aMC05XFxzeyhcXFs8XSkoPzooPyFcXDIpW15cXFxcXXxcXFxcW1xcc1xcU10pKlxcMig/Oig/IVxcMilbXlxcXFxdfFxcXFxbXFxzXFxTXSkqXFwyLy5zb3VyY2UsXG5cblx0XHRcdFx0XHRcdC8vIHMgYS4uLmEuLi5hXG5cdFx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL3N0cmljdFxuXHRcdFx0XHRcdFx0LyhbYS16QS1aMC05XSkoPzooPyFcXDMpW15cXFxcXXxcXFxcW1xcc1xcU10pKlxcMyg/Oig/IVxcMylbXlxcXFxdfFxcXFxbXFxzXFxTXSkqXFwzLy5zb3VyY2UsXG5cblx0XHRcdFx0XHRcdC8vIHMoLi4uKSguLi4pXG5cdFx0XHRcdFx0XHQvLyBzey4uLn17Li4ufVxuXHRcdFx0XHRcdFx0Ly8gc1suLi5dWy4uLl1cblx0XHRcdFx0XHRcdC8vIHM8Li4uPjwuLi4+XG5cdFx0XHRcdFx0XHQvLyBzKC4uLilbLi4uXVxuXHRcdFx0XHRcdFx0YnJhY2tldHMgKyAvXFxzKi8uc291cmNlICsgYnJhY2tldHMsXG5cdFx0XHRcdFx0XS5qb2luKCd8JykgK1xuXHRcdFx0XHRcdCcpJyArXG5cdFx0XHRcdFx0L1ttc2l4cG9kdWFsbmdjZXJdKi8uc291cmNlXG5cdFx0XHRcdCksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblxuXHRcdFx0Ly8gLy4uLi9cblx0XHRcdC8vIFRoZSBsb29rLWFoZWFkIHRyaWVzIHRvIHByZXZlbnQgdHdvIGRpdmlzaW9ucyBvblxuXHRcdFx0Ly8gdGhlIHNhbWUgbGluZSBmcm9tIGJlaW5nIGhpZ2hsaWdodGVkIGFzIHJlZ2V4LlxuXHRcdFx0Ly8gVGhpcyBkb2VzIG5vdCBzdXBwb3J0IG11bHRpLWxpbmUgcmVnZXguXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXC8oPzpbXlxcL1xcXFxcXHJcXG5dfFxcXFwuKSpcXC9bbXNpeHBvZHVhbG5nY10qKD89XFxzKig/OiR8W1xcclxcbiwuO30pJnxcXC0rKn48PiE/Xl18KD86YW5kfGNtcHxlcXxnZXxndHxsZXxsdHxuZXxub3R8b3J8eHx4b3IpXFxiKSkvLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXG5cdFx0Ly8gRklYTUUgTm90IHN1cmUgYWJvdXQgdGhlIGhhbmRsaW5nIG9mIDo6LCAnLCBhbmQgI1xuXHRcdCd2YXJpYWJsZSc6IFtcblx0XHRcdC8vICR7XlBPU1RNQVRDSH1cblx0XHRcdC9bJiokQCVdXFx7XFxeW0EtWl0rXFx9Lyxcblx0XHRcdC8vICReVlxuXHRcdFx0L1smKiRAJV1cXF5bQS1aX10vLFxuXHRcdFx0Ly8gJHsuLi59XG5cdFx0XHQvWyYqJEAlXSM/KD89XFx7KS8sXG5cdFx0XHQvLyAkZm9vXG5cdFx0XHQvWyYqJEAlXSM/KD86KD86OjopKic/KD8hXFxkKVtcXHckXSsoPyFbXFx3JF0pKSsoPzo6OikqLyxcblx0XHRcdC8vICQxXG5cdFx0XHQvWyYqJEAlXVxcZCsvLFxuXHRcdFx0Ly8gJF8sIEBfLCAlIVxuXHRcdFx0Ly8gVGhlIG5lZ2F0aXZlIGxvb2thaGVhZCBwcmV2ZW50cyBmcm9tIGJyZWFraW5nIHRoZSAlPSBvcGVyYXRvclxuXHRcdFx0Lyg/ISU9KVskQCVdWyFcIiMkJSYnKCkqKyxcXC0uXFwvOjs8PT4/QFtcXFxcXFxdXl9ge3x9fl0vXG5cdFx0XSxcblx0XHQnZmlsZWhhbmRsZSc6IHtcblx0XHRcdC8vIDw+LCA8Rk9PPiwgX1xuXHRcdFx0cGF0dGVybjogLzwoPyFbPD1dKVxcUyo/PnxcXGJfXFxiLyxcblx0XHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHRcdH0sXG5cdFx0J3Ytc3RyaW5nJzoge1xuXHRcdFx0Ly8gdjEuMiwgMS4yLjNcblx0XHRcdHBhdHRlcm46IC92XFxkKyg/OlxcLlxcZCspKnxcXGQrKD86XFwuXFxkKyl7Mix9Lyxcblx0XHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHRcdH0sXG5cdFx0J2Z1bmN0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXGJzdWJbIFxcdF0rKVxcdysvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiAvXFxiKD86YW55fGJyZWFrfGNvbnRpbnVlfGRlZmF1bHR8ZGVsZXRlfGRpZXxkb3xlbHNlfGVsc2lmfGV2YWx8Zm9yfGZvcmVhY2h8Z2l2ZW58Z290b3xpZnxsYXN0fGxvY2FsfG15fG5leHR8b3VyfHBhY2thZ2V8cHJpbnR8cmVkb3xyZXF1aXJlfHJldHVybnxzYXl8c3RhdGV8c3VifHN3aXRjaHx1bmRlZnx1bmxlc3N8dW50aWx8dXNlfHdoZW58d2hpbGUpXFxiLyxcblx0XHQnbnVtYmVyJzogL1xcYig/OjB4W1xcZEEtRmEtZl0oPzpfP1tcXGRBLUZhLWZdKSp8MGJbMDFdKD86Xz9bMDFdKSp8KD86KD86XFxkKD86Xz9cXGQpKik/XFwuKT9cXGQoPzpfP1xcZCkqKD86W0VlXVsrLV0/XFxkKyk/KVxcYi8sXG5cdFx0J29wZXJhdG9yJzogLy1bcnd4b1JXWE9lenNmZGxwU2JjdHVna1RCTUFDXVxcYnxcXCtbKz1dP3wtWy09Pl0/fFxcKlxcKj89P3xcXC9cXC8/PT98PVs9fj5dP3x+W349XT98XFx8XFx8Pz0/fCYmPz0/fDwoPzo9Pj98PD0/KT98Pj4/PT98IVt+PV0/fFslXl09P3xcXC4oPzo9fFxcLlxcLj8pP3xbXFxcXD9dfFxcYngoPzo9fFxcYil8XFxiKD86YW5kfGNtcHxlcXxnZXxndHxsZXxsdHxuZXxub3R8b3J8eG9yKVxcYi8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF07KCksOl0vXG5cdH07XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciB0eXBlRXhwcmVzc2lvbiA9IC8oPzpcXGJbYS16QS1aXVxcdyp8W3xcXFxcW1xcXV0pKy8uc291cmNlO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5waHBkb2MgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdqYXZhZG9jbGlrZScsIHtcblx0XHQncGFyYW1ldGVyJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKCcoQCg/Omdsb2JhbHxwYXJhbXxwcm9wZXJ0eSg/Oi1yZWFkfC13cml0ZSk/fHZhcilcXFxccysoPzonICsgdHlwZUV4cHJlc3Npb24gKyAnXFxcXHMrKT8pXFxcXCRcXFxcdysnKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3BocGRvYycsICdrZXl3b3JkJywge1xuXHRcdCdjbGFzcy1uYW1lJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJyhAKD86Z2xvYmFsfHBhY2thZ2V8cGFyYW18cHJvcGVydHkoPzotcmVhZHwtd3JpdGUpP3xyZXR1cm58c3VicGFja2FnZXx0aHJvd3N8dmFyKVxcXFxzKyknICsgdHlwZUV4cHJlc3Npb24pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQna2V5d29yZCc6IC9cXGIoPzphcnJheXxib29sfGJvb2xlYW58Y2FsbGJhY2t8ZG91YmxlfGZhbHNlfGZsb2F0fGludHxpbnRlZ2VyfG1peGVkfG51bGx8b2JqZWN0fHJlc291cmNlfHNlbGZ8c3RyaW5nfHRydWV8dm9pZClcXGIvLFxuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bfFxcXFxbXFxdKCldL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmphdmFkb2NsaWtlLmFkZFN1cHBvcnQoJ3BocCcsIFByaXNtLmxhbmd1YWdlcy5waHBkb2MpO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3BocCcsICd2YXJpYWJsZScsIHtcblx0J3RoaXMnOiB7XG5cdFx0cGF0dGVybjogL1xcJHRoaXNcXGIvLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J2dsb2JhbCc6IC9cXCQoPzpHTE9CQUxTfEhUVFBfUkFXX1BPU1RfREFUQXxfKD86Q09PS0lFfEVOVnxGSUxFU3xHRVR8UE9TVHxSRVFVRVNUfFNFUlZFUnxTRVNTSU9OKXxhcmdjfGFyZ3Z8aHR0cF9yZXNwb25zZV9oZWFkZXJ8cGhwX2Vycm9ybXNnKVxcYi8sXG5cdCdzY29wZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiW1xcd1xcXFxdKzo6Lyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdrZXl3b3JkJzogL1xcYig/OnBhcmVudHxzZWxmfHN0YXRpYylcXGIvLFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogLzo6fFxcXFwvXG5cdFx0fVxuXHR9XG59KTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHR2YXIgdmFyaWFibGUgPSAvXFwkXFx3K3wlW2Etel0rJS87XG5cblx0dmFyIGFycm93QXR0ciA9IC9cXFtbXltcXF1dKlxcXS8uc291cmNlO1xuXHR2YXIgYXJyb3dEaXJlY3Rpb24gPSAvKD86W2RybHVdfGRvfGRvd258bGV8bGVmdHxyaXxyaWdodHx1cCkvLnNvdXJjZTtcblx0dmFyIGFycm93Qm9keSA9ICcoPzotKycgKyBhcnJvd0RpcmVjdGlvbiArICctK3xcXFxcLisnICsgYXJyb3dEaXJlY3Rpb24gKyAnXFxcXC4rfC0rKD86JyArIGFycm93QXR0ciArICctKik/fCcgKyBhcnJvd0F0dHIgKyAnLSt8XFxcXC4rKD86JyArIGFycm93QXR0ciArICdcXFxcLiopP3wnICsgYXJyb3dBdHRyICsgJ1xcXFwuKyknO1xuXHR2YXIgYXJyb3dMZWZ0ID0gLyg/Ojx7MSwyfXxcXC97MSwyfXxcXFxcezEsMn18PFxcfHxbIypeK314b10pLy5zb3VyY2U7XG5cdHZhciBhcnJvd1JpZ2h0ID0gLyg/Oj57MSwyfXxcXC97MSwyfXxcXFxcezEsMn18XFx8PnxbIypeK3t4b10pLy5zb3VyY2U7XG5cdHZhciBhcnJvd1ByZWZpeCA9IC9bWz9dP1tveF0/Ly5zb3VyY2U7XG5cdHZhciBhcnJvd1N1ZmZpeCA9IC9bb3hdP1tcXF0/XT8vLnNvdXJjZTtcblx0dmFyIGFycm93ID1cblx0XHRhcnJvd1ByZWZpeCArXG5cdFx0Jyg/OicgK1xuXHRcdGFycm93Qm9keSArIGFycm93UmlnaHQgK1xuXHRcdCd8JyArXG5cdFx0YXJyb3dMZWZ0ICsgYXJyb3dCb2R5ICsgJyg/OicgKyBhcnJvd1JpZ2h0ICsgJyk/JyArXG5cdFx0JyknICtcblx0XHRhcnJvd1N1ZmZpeDtcblxuXHRQcmlzbS5sYW5ndWFnZXNbJ3BsYW50LXVtbCddID0ge1xuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKikoPzonLip8XFwvJ1tcXHNcXFNdKj8nXFwvKS9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J3ByZXByb2Nlc3Nvcic6IHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopIS4qL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdwcm9wZXJ0eScsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3ZhcmlhYmxlJzogdmFyaWFibGVcblx0XHRcdH1cblx0XHR9LFxuXHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKUAoPzplbmR8c3RhcnQpdW1sXFxiL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXG5cdFx0J2Fycm93Jzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXnxbXi0uPD4/fFxcXFxbXFxdb3hdKS8uc291cmNlICsgYXJyb3cgKyAvKD8hWy0uPD4/fFxcXFxcXF1veF0pLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnb3BlcmF0b3InLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXFxbKVteW1xcXV0rKD89XFxdKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXFsoPz0kfFxcXSl8XlxcXS9cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9cIlteXCJdKlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J3RleHQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcW1sgXFx0XSpbXFxyXFxuXSsoPyFbXFxyXFxuXSkpW15cXF1dKig/PVxcXSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHRcdH0sXG5cblx0XHQna2V5d29yZCc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL14oWyBcXHRdKikoPzphYnN0cmFjdFxccytjbGFzc3xlbmRcXHMrKD86Ym94fGZvcmt8Z3JvdXB8bWVyZ2V8bm90ZXxyZWZ8c3BsaXR8dGl0bGUpfCg/OmZvcmt8c3BsaXQpKD86XFxzK2FnYWluKT98YWN0aXZhdGV8YWN0b3J8YWdlbnR8YWx0fGFubm90YXRpb258YXJ0aWZhY3R8YXV0b2FjdGl2YXRlfGF1dG9udW1iZXJ8YmFja3dhcmR8YmluYXJ5fGJvdW5kYXJ5fGJveHxicmVha3xjYXB0aW9ufGNhcmR8Y2FzZXxjaXJjbGV8Y2xhc3N8Y2xvY2t8Y2xvdWR8Y29sbGVjdGlvbnN8Y29tcG9uZW50fGNvbmNpc2V8Y29udHJvbHxjcmVhdGV8Y3JpdGljYWx8ZGF0YWJhc2V8ZGVhY3RpdmF0ZXxkZXN0cm95fGRldGFjaHxkaWFtb25kfGVsc2V8ZWxzZWlmfGVuZHxlbmRbaHJdbm90ZXxlbmRpZnxlbmRzd2l0Y2h8ZW5kd2hpbGV8ZW50aXR5fGVudW18ZmlsZXxmb2xkZXJ8Zm9vdGVyfGZyYW1lfGdyb3VwfFtocl0/bm90ZXxoZWFkZXJ8aGV4YWdvbnxoaWRlfGlmfGludGVyZmFjZXxsYWJlbHxsZWdlbmR8bG9vcHxtYXB8bmFtZXNwYWNlfG5ldHdvcmt8bmV3cGFnZXxub2RlfG53ZGlhZ3xvYmplY3R8b3B0fHBhY2thZ2V8cGFnZXxwYXJ8cGFydGljaXBhbnR8cGVyc29ufHF1ZXVlfHJlY3RhbmdsZXxyZWZ8cmVtb3ZlfHJlcGVhdHxyZXN0b3JlfHJldHVybnxyb2J1c3R8c2NhbGV8c2V0fHNob3d8c2tpbnBhcmFtfHN0YWNrfHN0YXJ0fHN0YXRlfHN0b3B8c3RvcmFnZXxzd2l0Y2h8dGl0bGV8dG9nZXRoZXJ8dXNlY2FzZXx1c2VjYXNlXFwvfHdoaWxlKSg/PVxcc3wkKS9tLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQvXFxiKD86ZWxzZWlmfGVxdWFsc3xub3R8d2hpbGUpKD89XFxzKlxcKCkvLFxuXHRcdFx0L1xcYig/OmFzfGlzfHRoZW4pXFxiL1xuXHRcdF0sXG5cblx0XHQnZGl2aWRlcic6IHtcblx0XHRcdHBhdHRlcm46IC9ePT0uKz09JC9tLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdFx0fSxcblxuXHRcdCd0aW1lJzoge1xuXHRcdFx0cGF0dGVybjogL0AoPzpcXGQrKD86WzovXVxcZCspezJ9fFsrLV0/XFxkK3w6W2Etel1cXHcqKD86WystXVxcZCspPylcXGIvaSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHRcdH0sXG5cblx0XHQnY29sb3InOiB7XG5cdFx0XHRwYXR0ZXJuOiAvIyg/OlthLXpfXSt8W2EtZkEtRjAtOV0rKVxcYi8sXG5cdFx0XHRhbGlhczogJ3N5bWJvbCdcblx0XHR9LFxuXHRcdCd2YXJpYWJsZSc6IHZhcmlhYmxlLFxuXG5cdFx0J3B1bmN0dWF0aW9uJzogL1s6LDsoKVtcXF17fV18XFwuezN9L1xuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlc1sncGxhbnQtdW1sJ10uYXJyb3cuaW5zaWRlLmV4cHJlc3Npb24uaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzWydwbGFudC11bWwnXTtcblxuXHRQcmlzbS5sYW5ndWFnZXNbJ3BsYW50dW1sJ10gPSBQcmlzbS5sYW5ndWFnZXNbJ3BsYW50LXVtbCddO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5wbHNxbCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ3NxbCcsIHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcL1xcKltcXHNcXFNdKj9cXCpcXC98LS0uKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdC8vIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2VuL2RhdGFiYXNlL29yYWNsZS9vcmFjbGUtZGF0YWJhc2UvMjEvbG5wbHMvcGxzcWwtcmVzZXJ2ZWQtd29yZHMta2V5d29yZHMuaHRtbFxuXHQna2V5d29yZCc6IC9cXGIoPzpBfEFDQ0VTU0lCTEV8QUREfEFHRU5UfEFHR1JFR0FURXxBTEx8QUxURVJ8QU5EfEFOWXxBUlJBWXxBU3xBU0N8QVR8QVRUUklCVVRFfEFVVEhJRHxBVkd8QkVHSU58QkVUV0VFTnxCRklMRV9CQVNFfEJJTkFSWXxCTE9CX0JBU0V8QkxPQ0t8Qk9EWXxCT1RIfEJPVU5EfEJVTEt8Qll8QllURXxDfENBTEx8Q0FMTElOR3xDQVNDQURFfENBU0V8Q0hBUnxDSEFSQUNURVJ8Q0hBUlNFVHxDSEFSU0VURk9STXxDSEFSU0VUSUR8Q0hBUl9CQVNFfENIRUNLfENMT0JfQkFTRXxDTE9ORXxDTE9TRXxDTFVTVEVSfENMVVNURVJTfENPTEFVVEh8Q09MTEVDVHxDT0xVTU5TfENPTU1FTlR8Q09NTUlUfENPTU1JVFRFRHxDT01QSUxFRHxDT01QUkVTU3xDT05ORUNUfENPTlNUQU5UfENPTlNUUlVDVE9SfENPTlRFWFR8Q09OVElOVUV8Q09OVkVSVHxDT1VOVHxDUkFTSHxDUkVBVEV8Q1JFREVOVElBTHxDVVJSRU5UfENVUlNPUnxDVVNUT01EQVRVTXxEQU5HTElOR3xEQVRBfERBVEV8REFURV9CQVNFfERBWXxERUNMQVJFfERFRkFVTFR8REVGSU5FfERFTEVURXxERVNDfERFVEVSTUlOSVNUSUN8RElSRUNUT1JZfERJU1RJTkNUfERPVUJMRXxEUk9QfERVUkFUSU9OfEVMRU1FTlR8RUxTRXxFTFNJRnxFTVBUWXxFTkR8RVNDQVBFfEVYQ0VQVHxFWENFUFRJT058RVhDRVBUSU9OU3xFWENMVVNJVkV8RVhFQ1VURXxFWElTVFN8RVhJVHxFWFRFUk5BTHxGRVRDSHxGSU5BTHxGSVJTVHxGSVhFRHxGTE9BVHxGT1J8Rk9SQUxMfEZPUkNFfEZST018RlVOQ1RJT058R0VORVJBTHxHT1RPfEdSQU5UfEdST1VQfEhBU0h8SEFWSU5HfEhFQVB8SElEREVOfEhPVVJ8SURFTlRJRklFRHxJRnxJTU1FRElBVEV8SU1NVVRBQkxFfElOfElOQ0xVRElOR3xJTkRFWHxJTkRFWEVTfElORElDQVRPUnxJTkRJQ0VTfElORklOSVRFfElOU0VSVHxJTlNUQU5USUFCTEV8SU5UfElOVEVSRkFDRXxJTlRFUlNFQ1R8SU5URVJWQUx8SU5UT3xJTlZBTElEQVRFfElTfElTT0xBVElPTnxKQVZBfExBTkdVQUdFfExBUkdFfExFQURJTkd8TEVOR1RIfExFVkVMfExJQlJBUll8TElLRXxMSUtFMnxMSUtFNHxMSUtFQ3xMSU1JVHxMSU1JVEVEfExPQ0FMfExPQ0t8TE9OR3xMT09QfE1BUHxNQVh8TUFYTEVOfE1FTUJFUnxNRVJHRXxNSU58TUlOVVN8TUlOVVRFfE1PRHxNT0RFfE1PRElGWXxNT05USHxNVUxUSVNFVHxNVVRBQkxFfE5BTUV8TkFOfE5BVElPTkFMfE5BVElWRXxOQ0hBUnxORVd8Tk9DT01QUkVTU3xOT0NPUFl8Tk9UfE5PV0FJVHxOVUxMfE5VTUJFUl9CQVNFfE9CSkVDVHxPQ0lDT0xMfE9DSURBVEV8T0NJREFURVRJTUV8T0NJRFVSQVRJT058T0NJSU5URVJWQUx8T0NJTE9CTE9DQVRPUnxPQ0lOVU1CRVJ8T0NJUkFXfE9DSVJFRnxPQ0lSRUZDVVJTT1J8T0NJUk9XSUR8T0NJU1RSSU5HfE9DSVRZUEV8T0Z8T0xEfE9OfE9OTFl8T1BBUVVFfE9QRU58T1BFUkFUT1J8T1BUSU9OfE9SfE9SQUNMRXxPUkFEQVRBfE9SREVSfE9SR0FOSVpBVElPTnxPUkxBTll8T1JMVkFSWXxPVEhFUlN8T1VUfE9WRVJMQVBTfE9WRVJSSURJTkd8UEFDS0FHRXxQQVJBTExFTF9FTkFCTEV8UEFSQU1FVEVSfFBBUkFNRVRFUlN8UEFSRU5UfFBBUlRJVElPTnxQQVNDQUx8UEVSU0lTVEFCTEV8UElQRXxQSVBFTElORUR8UExVR0dBQkxFfFBPTFlNT1JQSElDfFBSQUdNQXxQUkVDSVNJT058UFJJT1J8UFJJVkFURXxQUk9DRURVUkV8UFVCTElDfFJBSVNFfFJBTkdFfFJBV3xSRUFEfFJFQ09SRHxSRUZ8UkVGRVJFTkNFfFJFTElFU19PTnxSRU18UkVNQUlOREVSfFJFTkFNRXxSRVNPVVJDRXxSRVNVTFR8UkVTVUxUX0NBQ0hFfFJFVFVSTnxSRVRVUk5JTkd8UkVWRVJTRXxSRVZPS0V8Uk9MTEJBQ0t8Uk9XfFNBTVBMRXxTQVZFfFNBVkVQT0lOVHxTQjF8U0IyfFNCNHxTRUNPTkR8U0VHTUVOVHxTRUxFQ1R8U0VMRnxTRVBBUkFURXxTRVFVRU5DRXxTRVJJQUxJWkFCTEV8U0VUfFNIQVJFfFNIT1JUfFNJWkV8U0laRV9UfFNPTUV8U1BBUlNFfFNRTHxTUUxDT0RFfFNRTERBVEF8U1FMTkFNRXxTUUxTVEFURXxTVEFOREFSRHxTVEFSVHxTVEFUSUN8U1REREVWfFNUT1JFRHxTVFJJTkd8U1RSVUNUfFNUWUxFfFNVQk1VTFRJU0VUfFNVQlBBUlRJVElPTnxTVUJTVElUVVRBQkxFfFNVQlRZUEV8U1VNfFNZTk9OWU18VEFCQVVUSHxUQUJMRXxURE98VEhFfFRIRU58VElNRXxUSU1FU1RBTVB8VElNRVpPTkVfQUJCUnxUSU1FWk9ORV9IT1VSfFRJTUVaT05FX01JTlVURXxUSU1FWk9ORV9SRUdJT058VE98VFJBSUxJTkd8VFJBTlNBQ1RJT058VFJBTlNBQ1RJT05BTHxUUlVTVEVEfFRZUEV8VUIxfFVCMnxVQjR8VU5ERVJ8VU5JT058VU5JUVVFfFVOUExVR3xVTlNJR05FRHxVTlRSVVNURUR8VVBEQVRFfFVTRXxVU0lOR3xWQUxJU1R8VkFMVUV8VkFMVUVTfFZBUklBQkxFfFZBUklBTkNFfFZBUlJBWXxWQVJZSU5HfFZJRVd8VklFV1N8Vk9JRHxXSEVOfFdIRVJFfFdISUxFfFdJVEh8V09SS3xXUkFQUEVEfFdSSVRFfFlFQVJ8Wk9ORSlcXGIvaSxcblx0Ly8gaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vZGF0YWJhc2Uvb3JhY2xlL29yYWNsZS1kYXRhYmFzZS8yMS9sbnBscy9wbHNxbC1sYW5ndWFnZS1mdW5kYW1lbnRhbHMuaHRtbCNHVUlELTk2QTQyRjdDLTdBNzEtNEI5MC04MjU1LUNBOUM4QkQ5NzIyRVxuXHQnb3BlcmF0b3InOiAvOj0/fD0+fFs8Pl5+IV09fFxcLlxcLnxcXHxcXHx8XFwqXFwqfFstKyovJTw+PUBdL1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3Bsc3FsJywgJ29wZXJhdG9yJywge1xuXHQnbGFiZWwnOiB7XG5cdFx0cGF0dGVybjogLzw8XFxzKlxcdytcXHMqPj4vLFxuXHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHR9LFxufSk7XG5cbi8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Bvd2VycXVlcnktbS9wb3dlci1xdWVyeS1tLWxhbmd1YWdlLXNwZWNpZmljYXRpb25cblxuUHJpc20ubGFuZ3VhZ2VzLnBvd2VycXVlcnkgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSg/OlxcL1xcKltcXHNcXFNdKj9cXCpcXC98XFwvXFwvLiopLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQncXVvdGVkLWlkZW50aWZpZXInOiB7XG5cdFx0cGF0dGVybjogLyNcIig/OlteXCJcXHJcXG5dfFwiXCIpKlwiKD8hXCIpLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKD86IyEpP1wiKD86W15cIlxcclxcbl18XCJcIikqXCIoPyFcIikvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY29uc3RhbnQnOiBbXG5cdFx0L1xcYkRheVxcLig/OkZyaWRheXxNb25kYXl8U2F0dXJkYXl8U3VuZGF5fFRodXJzZGF5fFR1ZXNkYXl8V2VkbmVzZGF5KVxcYi8sXG5cdFx0L1xcYlRyYWNlTGV2ZWxcXC4oPzpDcml0aWNhbHxFcnJvcnxJbmZvcm1hdGlvbnxWZXJib3NlfFdhcm5pbmcpXFxiLyxcblx0XHQvXFxiT2NjdXJyZW5jZVxcLig/OkFsbHxGaXJzdHxMYXN0KVxcYi8sXG5cdFx0L1xcYk9yZGVyXFwuKD86QXNjZW5kaW5nfERlc2NlbmRpbmcpXFxiLyxcblx0XHQvXFxiUm91bmRpbmdNb2RlXFwuKD86QXdheUZyb21aZXJvfERvd258VG9FdmVufFRvd2FyZFplcm98VXApXFxiLyxcblx0XHQvXFxiTWlzc2luZ0ZpZWxkXFwuKD86RXJyb3J8SWdub3JlfFVzZU51bGwpXFxiLyxcblx0XHQvXFxiUXVvdGVTdHlsZVxcLig/OkNzdnxOb25lKVxcYi8sXG5cdFx0L1xcYkpvaW5LaW5kXFwuKD86RnVsbE91dGVyfElubmVyfExlZnRBbnRpfExlZnRPdXRlcnxSaWdodEFudGl8UmlnaHRPdXRlcilcXGIvLFxuXHRcdC9cXGJHcm91cEtpbmRcXC4oPzpHbG9iYWx8TG9jYWwpXFxiLyxcblx0XHQvXFxiRXh0cmFWYWx1ZXNcXC4oPzpFcnJvcnxJZ25vcmV8TGlzdClcXGIvLFxuXHRcdC9cXGJKb2luQWxnb3JpdGhtXFwuKD86RHluYW1pY3xMZWZ0SGFzaHxMZWZ0SW5kZXh8UGFpcndpc2VIYXNofFJpZ2h0SGFzaHxSaWdodEluZGV4fFNvcnRNZXJnZSlcXGIvLFxuXHRcdC9cXGJKb2luU2lkZVxcLig/OkxlZnR8UmlnaHQpXFxiLyxcblx0XHQvXFxiUHJlY2lzaW9uXFwuKD86RGVjaW1hbHxEb3VibGUpXFxiLyxcblx0XHQvXFxiUmVsYXRpdmVQb3NpdGlvblxcLkZyb20oPzpFbmR8U3RhcnQpXFxiLyxcblx0XHQvXFxiVGV4dEVuY29kaW5nXFwuKD86QXNjaWl8QmlnRW5kaWFuVW5pY29kZXxVbmljb2RlfFV0ZjE2fFV0Zjh8V2luZG93cylcXGIvLFxuXHRcdC9cXGIoPzpBbnl8QmluYXJ5fERhdGV8RGF0ZVRpbWV8RGF0ZVRpbWVab25lfER1cmF0aW9ufEZ1bmN0aW9ufEludDE2fEludDMyfEludDY0fEludDh8TGlzdHxMb2dpY2FsfE5vbmV8TnVtYmVyfFJlY29yZHxUYWJsZXxUZXh0fFRpbWUpXFwuVHlwZVxcYi8sXG5cdFx0L1xcYm51bGxcXGIvXG5cdF0sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0J2tleXdvcmQnOiAvXFxiKD86YW5kfGFzfGVhY2h8ZWxzZXxlcnJvcnxpZnxpbnxpc3xsZXR8bWV0YXxub3R8bnVsbGFibGV8b3B0aW9uYWx8b3J8b3RoZXJ3aXNlfHNlY3Rpb258c2hhcmVkfHRoZW58dHJ5fHR5cGUpXFxifCMoPzpiaW5hcnl8ZGF0ZXxkYXRldGltZXxkYXRldGltZXpvbmV8ZHVyYXRpb258aW5maW5pdHl8bmFufHNlY3Rpb25zfHNoYXJlZHx0YWJsZXx0aW1lKVxcYi8sXG5cdCdmdW5jdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W14jXFx3Ll0pW2Etel9dW1xcdy5dKig/PVxccypcXCgpL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnZGF0YS10eXBlJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzphbnl8YW55bm9ubnVsbHxiaW5hcnl8ZGF0ZXxkYXRldGltZXxkYXRldGltZXpvbmV8ZHVyYXRpb258ZnVuY3Rpb258bGlzdHxsb2dpY2FsfG5vbmV8bnVtYmVyfHJlY29yZHx0YWJsZXx0ZXh0fHRpbWUpXFxiLyxcblx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdH0sXG5cdCdudW1iZXInOiB7XG5cdFx0cGF0dGVybjogL1xcYjB4W1xcZGEtZl0rXFxifCg/OlsrLV0/KD86XFxiXFxkK1xcLik/XFxiXFxkK3xbKy1dXFwuXFxkK3woXnxbXi5dKVxcQlxcLlxcZCspKD86ZVsrLV0/XFxkKyk/XFxiL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnb3BlcmF0b3InOiAvWy0rKlxcLyY/QF5dfDwoPzo9Pj98Pik/fD49P3w9Pj98XFwuXFwuXFwuPy8sXG5cdCdwdW5jdHVhdGlvbic6IC9bLDtcXFtcXF0oKXt9XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5wcSA9IFByaXNtLmxhbmd1YWdlc1sncG93ZXJxdWVyeSddO1xuUHJpc20ubGFuZ3VhZ2VzLm1zY3JpcHQgPSBQcmlzbS5sYW5ndWFnZXNbJ3Bvd2VycXVlcnknXTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBwb3dlcnNoZWxsID0gUHJpc20ubGFuZ3VhZ2VzLnBvd2Vyc2hlbGwgPSB7XG5cdFx0J2NvbW1lbnQnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXmBdKTwjW1xcc1xcU10qPyM+Lyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhefFteYF0pIy4qLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J3N0cmluZyc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1wiKD86YFtcXHNcXFNdfFteYFwiXSkqXCIvLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8nKD86W14nXXwnJykqJy8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0Ly8gTWF0Y2hlcyBuYW1lIHNwYWNlcyBhcyB3ZWxsIGFzIGNhc3RzLCBhdHRyaWJ1dGUgZGVjb3JhdG9ycy4gRm9yY2Ugc3RhcnRpbmcgd2l0aCBsZXR0ZXIgdG8gYXZvaWQgbWF0Y2hpbmcgYXJyYXkgaW5kaWNlc1xuXHRcdC8vIFN1cHBvcnRzIHR3byBsZXZlbHMgb2YgbmVzdGVkIGJyYWNrZXRzIChlLmcuIGBbT3V0cHV0VHlwZShbU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdFtpbnRdXSldYClcblx0XHQnbmFtZXNwYWNlJzogL1xcW1thLXpdKD86XFxbKD86XFxbW15cXF1dKlxcXXxbXlxcW1xcXV0pKlxcXXxbXlxcW1xcXV0pKlxcXS9pLFxuXHRcdCdib29sZWFuJzogL1xcJCg/OmZhbHNlfHRydWUpXFxiL2ksXG5cdFx0J3ZhcmlhYmxlJzogL1xcJFxcdytcXGIvLFxuXHRcdC8vIENtZGxldHMgYW5kIGFsaWFzZXMuIEFsaWFzZXMgc2hvdWxkIGNvbWUgbGFzdCwgb3RoZXJ3aXNlIFwid3JpdGVcIiBnZXRzIHByZWZlcnJlZCBvdmVyIFwid3JpdGUtaG9zdFwiIGZvciBleGFtcGxlXG5cdFx0Ly8gR2V0LUNvbW1hbmQgfCA/eyAkXy5Nb2R1bGVOYW1lIC1tYXRjaCBcIk1pY3Jvc29mdC5Qb3dlclNoZWxsLihVdGlsfENvcmV8TWFuYWdlbWVudClcIiB9XG5cdFx0Ly8gR2V0LUFsaWFzIHwgP3sgJF8uUmVmZXJlbmNlZENvbW1hbmQuTW9kdWxlLk5hbWUgLW1hdGNoIFwiTWljcm9zb2Z0LlBvd2VyU2hlbGwuKFV0aWx8Q29yZXxNYW5hZ2VtZW50KVwiIH1cblx0XHQnZnVuY3Rpb24nOiBbXG5cdFx0XHQvXFxiKD86QWRkfEFwcHJvdmV8QXNzZXJ0fEJhY2t1cHxCbG9ja3xDaGVja3BvaW50fENsZWFyfENsb3NlfENvbXBhcmV8Q29tcGxldGV8Q29tcHJlc3N8Q29uZmlybXxDb25uZWN0fENvbnZlcnR8Q29udmVydEZyb218Q29udmVydFRvfENvcHl8RGVidWd8RGVueXxEaXNhYmxlfERpc2Nvbm5lY3R8RGlzbW91bnR8RWRpdHxFbmFibGV8RW50ZXJ8RXhpdHxFeHBhbmR8RXhwb3J0fEZpbmR8Rm9yRWFjaHxGb3JtYXR8R2V0fEdyYW50fEdyb3VwfEhpZGV8SW1wb3J0fEluaXRpYWxpemV8SW5zdGFsbHxJbnZva2V8Sm9pbnxMaW1pdHxMb2NrfE1lYXN1cmV8TWVyZ2V8TW92ZXxOZXd8T3BlbnxPcHRpbWl6ZXxPdXR8UGluZ3xQb3B8UHJvdGVjdHxQdWJsaXNofFB1c2h8UmVhZHxSZWNlaXZlfFJlZG98UmVnaXN0ZXJ8UmVtb3ZlfFJlbmFtZXxSZXBhaXJ8UmVxdWVzdHxSZXNldHxSZXNpemV8UmVzb2x2ZXxSZXN0YXJ0fFJlc3RvcmV8UmVzdW1lfFJldm9rZXxTYXZlfFNlYXJjaHxTZWxlY3R8U2VuZHxTZXR8U2hvd3xTa2lwfFNvcnR8U3BsaXR8U3RhcnR8U3RlcHxTdG9wfFN1Ym1pdHxTdXNwZW5kfFN3aXRjaHxTeW5jfFRlZXxUZXN0fFRyYWNlfFVuYmxvY2t8VW5kb3xVbmluc3RhbGx8VW5sb2NrfFVucHJvdGVjdHxVbnB1Ymxpc2h8VW5yZWdpc3RlcnxVcGRhdGV8VXNlfFdhaXR8V2F0Y2h8V2hlcmV8V3JpdGUpLVthLXpdK1xcYi9pLFxuXHRcdFx0L1xcYig/OmFjfGNhdHxjaGRpcnxjbGN8Y2xpfGNscHxjbHZ8Y29tcGFyZXxjb3B5fGNwfGNwaXxjcHB8Y3ZwYXxkYnB8ZGVsfGRpZmZ8ZGlyfGVicHxlY2hvfGVwYWx8ZXBjc3Z8ZXBzbnxlcmFzZXxmY3xmbHxmdHxmd3xnYWx8Z2JwfGdjfGdjaXxnY3N8Z2RyfGdpfGdsfGdtfGdwfGdwc3xncm91cHxnc3Z8Z3V8Z3Z8Z3dtaXxpZXh8aWl8aXBhbHxpcGNzdnxpcHNufGlybXxpd21pfGl3cnxraWxsfGxwfGxzfG1lYXN1cmV8bWl8bW91bnR8bW92ZXxtcHxtdnxuYWx8bmRyfG5pfG52fG9ndnxwb3BkfHBzfHB1c2hkfHB3ZHxyYnB8cmR8cmRyfHJlbnxyaXxybXxybWRpcnxybml8cm5wfHJwfHJ2fHJ2cGF8cndtaXxzYWx8c2Fwc3xzYXN2fHNicHxzY3xzZWxlY3R8c2V0fHNoY218c2l8c2x8c2xlZXB8c2xzfHNvcnR8c3B8c3Bwc3xzcHN2fHN0YXJ0fHN2fHN3bWl8dGVlfHRyY218dHlwZXx3cml0ZSlcXGIvaVxuXHRcdF0sXG5cdFx0Ly8gcGVyIGh0dHA6Ly90ZWNobmV0Lm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9oaDg0Nzc0NC5hc3B4XG5cdFx0J2tleXdvcmQnOiAvXFxiKD86QmVnaW58QnJlYWt8Q2F0Y2h8Q2xhc3N8Q29udGludWV8RGF0YXxEZWZpbmV8RG98RHluYW1pY1BhcmFtfEVsc2V8RWxzZUlmfEVuZHxFeGl0fEZpbHRlcnxGaW5hbGx5fEZvcnxGb3JFYWNofEZyb218RnVuY3Rpb258SWZ8SW5saW5lU2NyaXB0fFBhcmFsbGVsfFBhcmFtfFByb2Nlc3N8UmV0dXJufFNlcXVlbmNlfFN3aXRjaHxUaHJvd3xUcmFwfFRyeXxVbnRpbHxVc2luZ3xWYXJ8V2hpbGV8V29ya2Zsb3cpXFxiL2ksXG5cdFx0J29wZXJhdG9yJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFxcVykoPzohfC0oPzpiPyg/OmFuZHx4P29yKXxhc3woPzpOb3QpPyg/OkNvbnRhaW5zfElufExpa2V8TWF0Y2gpfGVxfGdlfGd0fGlzKD86Tm90KT98Sm9pbnxsZXxsdHxuZXxub3R8UmVwbGFjZXxzaFtscl0pXFxifC1bLT1dP3xcXCtbKz1dP3xbKlxcLyVdPT8pL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQncHVuY3R1YXRpb24nOiAvW3x7fVtcXF07KCksLl0vXG5cdH07XG5cblx0Ly8gVmFyaWFibGUgaW50ZXJwb2xhdGlvbiBpbnNpZGUgc3RyaW5ncywgYW5kIG5lc3RlZCBleHByZXNzaW9uc1xuXHRwb3dlcnNoZWxsLnN0cmluZ1swXS5pbnNpZGUgPSB7XG5cdFx0J2Z1bmN0aW9uJzoge1xuXHRcdFx0Ly8gQWxsb3cgZm9yIG9uZSBsZXZlbCBvZiBuZXN0aW5nXG5cdFx0XHRwYXR0ZXJuOiAvKF58W15gXSlcXCRcXCgoPzpcXCRcXChbXlxcclxcbigpXSpcXCl8KD8hXFwkXFwoKVteXFxyXFxuKV0pKlxcKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBwb3dlcnNoZWxsXG5cdFx0fSxcblx0XHQnYm9vbGVhbic6IHBvd2Vyc2hlbGwuYm9vbGVhbixcblx0XHQndmFyaWFibGUnOiBwb3dlcnNoZWxsLnZhcmlhYmxlLFxuXHR9O1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5wcm9jZXNzaW5nID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdCdrZXl3b3JkJzogL1xcYig/OmJyZWFrfGNhc2V8Y2F0Y2h8Y2xhc3N8Y29udGludWV8ZGVmYXVsdHxlbHNlfGV4dGVuZHN8ZmluYWx8Zm9yfGlmfGltcGxlbWVudHN8aW1wb3J0fG5ld3xudWxsfHByaXZhdGV8cHVibGljfHJldHVybnxzdGF0aWN8c3VwZXJ8c3dpdGNofHRoaXN8dHJ5fHZvaWR8d2hpbGUpXFxiLyxcblx0Ly8gU3BhY2VzIGFyZSBhbGxvd2VkIGJldHdlZW4gZnVuY3Rpb24gbmFtZSBhbmQgcGFyZW50aGVzaXNcblx0J2Z1bmN0aW9uJzogL1xcYlxcdysoPz1cXHMqXFwoKS8sXG5cdCdvcGVyYXRvcic6IC88Wzw9XT98Pls+PV0/fCYmP3xcXHxcXHw/fFslP118WyE9K1xcLSpcXC9dPT8vXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgncHJvY2Vzc2luZycsICdudW1iZXInLCB7XG5cdC8vIFNwZWNpYWwgY2FzZTogWE1MIGlzIGEgdHlwZVxuXHQnY29uc3RhbnQnOiAvXFxiKD8hWE1MXFxiKVtBLVpdW0EtWlxcZF9dK1xcYi8sXG5cdCd0eXBlJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzpib29sZWFufGJ5dGV8Y2hhcnxjb2xvcnxkb3VibGV8ZmxvYXR8aW50fFtBLVpdXFx3KilcXGIvLFxuXHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5wcm9sb2cgPSB7XG5cdC8vIFN5bnRheCBkZXBlbmRzIG9uIHRoZSBpbXBsZW1lbnRhdGlvblxuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwvXFwqW1xcc1xcU10qP1xcKlxcL3wlLiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQvLyBEZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uLCBzdHJpbmdzIG1heSBhbGxvdyBlc2NhcGVkIG5ld2xpbmVzIGFuZCBxdW90ZS1lc2NhcGVcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFtcIiddKSg/OlxcMVxcMXxcXFxcKD86XFxyXFxufFtcXHNcXFNdKXwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxKD8hXFwxKS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdidWlsdGluJzogL1xcYig/OmZ4fGZ5fHhmW3h5XT98eWZ4PylcXGIvLFxuXHQvLyBGSVhNRTogU2hvdWxkIHdlIGxpc3QgYWxsIG51bGwtYXJ5IHByZWRpY2F0ZXMgKG5vdCBmb2xsb3dlZCBieSBhIHBhcmVudGhlc2lzKSBsaWtlIGhhbHQsIHRyYWNlLCBldGMuP1xuXHQnZnVuY3Rpb24nOiAvXFxiW2Etel1cXHcqKD86KD89XFwoKXxcXC9cXGQrKS8sXG5cdCdudW1iZXInOiAvXFxiXFxkKyg/OlxcLlxcZCopPy8sXG5cdC8vIEN1c3RvbSBvcGVyYXRvcnMgYXJlIGFsbG93ZWRcblx0J29wZXJhdG9yJzogL1s6XFxcXD0+PFxcLT8qQFxcLzsrXnwhJC5dK3xcXGIoPzppc3xtb2R8bm90fHhvcilcXGIvLFxuXHQncHVuY3R1YXRpb24nOiAvWygpe31cXFtcXF0sXS9cbn07XG5cbi8vIFRoYW5rcyB0bzogaHR0cHM6Ly9naXRodWIuY29tL3Byb21ldGhldXMtY29tbXVuaXR5L21vbmFjby1wcm9tcWwvYmxvYi9tYXN0ZXIvc3JjL3Byb21xbC9wcm9tcWwudHNcbi8vIEFzIHdlbGwgYXM6IGh0dHBzOi8va2F1c2FsLmNvL2Jsb2cvc2xhdGUtcHJpc20tYWRkLW5ldy1zeW50YXgtcHJvbXFsL1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdC8vIFByb21RTCBBZ2dyZWdhdGlvbiBPcGVyYXRvcnNcblx0Ly8gKGh0dHBzOi8vcHJvbWV0aGV1cy5pby9kb2NzL3Byb21ldGhldXMvbGF0ZXN0L3F1ZXJ5aW5nL29wZXJhdG9ycy8jYWdncmVnYXRpb24tb3BlcmF0b3JzKVxuXHR2YXIgYWdncmVnYXRpb25zID0gW1xuXHRcdCdzdW0nLFxuXHRcdCdtaW4nLFxuXHRcdCdtYXgnLFxuXHRcdCdhdmcnLFxuXHRcdCdncm91cCcsXG5cdFx0J3N0ZGRldicsXG5cdFx0J3N0ZHZhcicsXG5cdFx0J2NvdW50Jyxcblx0XHQnY291bnRfdmFsdWVzJyxcblx0XHQnYm90dG9taycsXG5cdFx0J3RvcGsnLFxuXHRcdCdxdWFudGlsZSdcblx0XTtcblxuXHQvLyBQcm9tUUwgdmVjdG9yIG1hdGNoaW5nICsgdGhlIGJ5IGFuZCB3aXRob3V0IGNsYXVzZXNcblx0Ly8gKGh0dHBzOi8vcHJvbWV0aGV1cy5pby9kb2NzL3Byb21ldGhldXMvbGF0ZXN0L3F1ZXJ5aW5nL29wZXJhdG9ycy8jdmVjdG9yLW1hdGNoaW5nKVxuXHR2YXIgdmVjdG9yTWF0Y2hpbmcgPSBbXG5cdFx0J29uJyxcblx0XHQnaWdub3JpbmcnLFxuXHRcdCdncm91cF9yaWdodCcsXG5cdFx0J2dyb3VwX2xlZnQnLFxuXHRcdCdieScsXG5cdFx0J3dpdGhvdXQnLFxuXHRdO1xuXG5cdC8vIFByb21RTCBvZmZzZXQgbW9kaWZpZXJcblx0Ly8gKGh0dHBzOi8vcHJvbWV0aGV1cy5pby9kb2NzL3Byb21ldGhldXMvbGF0ZXN0L3F1ZXJ5aW5nL2Jhc2ljcy8jb2Zmc2V0LW1vZGlmaWVyKVxuXHR2YXIgb2Zmc2V0TW9kaWZpZXIgPSBbJ29mZnNldCddO1xuXG5cdHZhciBrZXl3b3JkcyA9IGFnZ3JlZ2F0aW9ucy5jb25jYXQodmVjdG9yTWF0Y2hpbmcsIG9mZnNldE1vZGlmaWVyKTtcblxuXHRQcmlzbS5sYW5ndWFnZXMucHJvbXFsID0ge1xuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKikjLiovbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCd2ZWN0b3ItbWF0Y2gnOiB7XG5cdFx0XHQvLyBNYXRjaCB0aGUgY29tbWEtc2VwYXJhdGVkIGxhYmVsIGxpc3RzIGluc2lkZSB2ZWN0b3IgbWF0Y2hpbmc6XG5cdFx0XHRwYXR0ZXJuOiBuZXcgUmVnRXhwKCcoKD86JyArIHZlY3Rvck1hdGNoaW5nLmpvaW4oJ3wnKSArICcpXFxcXHMqKVxcXFwoW14pXSpcXFxcKScpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnbGFiZWwta2V5Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9cXGJbXixdK1xcYi8sXG5cdFx0XHRcdFx0YWxpYXM6ICdhdHRyLW5hbWUnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWygpLF0vXG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0J2NvbnRleHQtbGFiZWxzJzoge1xuXHRcdFx0cGF0dGVybjogL1xce1tee31dKlxcfS8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2xhYmVsLWtleSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxiW2Etel9dXFx3Kig/PVxccyooPzo9fCFbPX5dKSkvLFxuXHRcdFx0XHRcdGFsaWFzOiAnYXR0ci1uYW1lJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0J2xhYmVsLXZhbHVlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oW1wiJ2BdKSg/OlxcXFxbXFxzXFxTXXwoPyFcXDEpW15cXFxcXSkqXFwxLyxcblx0XHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdhdHRyLXZhbHVlJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xce3xcXH18PX4/fCFbPX5dfCwvLFxuXHRcdFx0fSxcblx0XHR9LFxuXHRcdCdjb250ZXh0LXJhbmdlJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxbW1xcd1xcczpdK1xcXS8sIC8vIFsxbV1cblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcW3xcXF18Oi8sXG5cdFx0XHRcdFx0J3JhbmdlLWR1cmF0aW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1xcYig/OlxcZCsoPzpbc21oZHd5XXxtcykpK1xcYi9pLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdudW1iZXInLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcYm9mZnNldFxccyspXFx3Ky8sIC8vIG9mZnNldCAxbVxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncmFuZ2UtZHVyYXRpb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxiKD86XFxkKyg/OltzbWhkd3ldfG1zKSkrXFxiL2ksXG5cdFx0XHRcdFx0XHRhbGlhczogJ251bWJlcicsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XSxcblx0XHQna2V5d29yZCc6IG5ldyBSZWdFeHAoJ1xcXFxiKD86JyArIGtleXdvcmRzLmpvaW4oJ3wnKSArICcpXFxcXGInLCAnaScpLFxuXHRcdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89XFxzKlxcKCkvaSxcblx0XHQnbnVtYmVyJzogL1stK10/KD86KD86XFxiXFxkKyg/OlxcLlxcZCspP3xcXEJcXC5cXGQrKSg/OmVbLStdP1xcZCspP1xcYnxcXGIoPzoweFswLTlhLWZdK3xuYW58aW5mKVxcYikvaSxcblx0XHQnb3BlcmF0b3InOiAvW1xcXiovJSstXXw9PXwhPXw8PXw8fD49fD58XFxiKD86YW5kfG9yfHVubGVzcylcXGIvaSxcblx0XHQncHVuY3R1YXRpb24nOiAvW3t9OygpYCwuW1xcXV0vLFxuXHR9O1xufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMucHJvcGVydGllcyA9IHtcblx0J2NvbW1lbnQnOiAvXlsgXFx0XSpbIyFdLiokL20sXG5cdCd2YWx1ZSc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8W15cXFxcXFxzOj1dKSsoPzogKls9Ol0gKig/ISApfCApKSg/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfFteXFxcXFxcclxcbl0pKy9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdhdHRyLXZhbHVlJ1xuXHR9LFxuXHQna2V5Jzoge1xuXHRcdHBhdHRlcm46IC9eWyBcXHRdKig/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfFteXFxcXFxcczo9XSkrKD89ICpbPTpdfCApL20sXG5cdFx0YWxpYXM6ICdhdHRyLW5hbWUnXG5cdH0sXG5cdCdwdW5jdHVhdGlvbic6IC9bPTpdL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBidWlsdGluVHlwZXMgPSAvXFxiKD86Ym9vbHxieXRlc3xkb3VibGV8cz9maXhlZCg/OjMyfDY0KXxmbG9hdHxbc3VdP2ludCg/OjMyfDY0KXxzdHJpbmcpXFxiLztcblxuXHRQcmlzbS5sYW5ndWFnZXMucHJvdG9idWYgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0XHQnY2xhc3MtbmFtZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXGIoPzplbnVtfGV4dGVuZHxtZXNzYWdlfHNlcnZpY2UpXFxzKylbQS1aYS16X11cXHcqKD89XFxzKlxceykvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcYig/OnJwY1xccytcXHcrfHJldHVybnMpXFxzKlxcKFxccyooPzpzdHJlYW1cXHMrKT8pXFwuP1tBLVphLXpfXVxcdyooPzpcXC5bQS1aYS16X11cXHcqKSooPz1cXHMqXFwpKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdrZXl3b3JkJzogL1xcYig/OmVudW18ZXh0ZW5kfGV4dGVuc2lvbnN8aW1wb3J0fG1lc3NhZ2V8b25lb2Z8b3B0aW9ufG9wdGlvbmFsfHBhY2thZ2V8cHVibGljfHJlcGVhdGVkfHJlcXVpcmVkfHJlc2VydmVkfHJldHVybnN8cnBjKD89XFxzK1xcdyl8c2VydmljZXxzdHJlYW18c3ludGF4fHRvKVxcYig/IVxccyo9XFxzKlxcZCkvLFxuXHRcdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89XFxzKlxcKCkvaVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdwcm90b2J1ZicsICdvcGVyYXRvcicsIHtcblx0XHQnbWFwJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYm1hcDxcXHMqW1xcdy5dK1xccyosXFxzKltcXHcuXStcXHMqPig/PVxccytbYS16X11cXHcqXFxzKls9O10pL2ksXG5cdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bPD4uLF0vLFxuXHRcdFx0XHQnYnVpbHRpbic6IGJ1aWx0aW5UeXBlc1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2J1aWx0aW4nOiBidWlsdGluVHlwZXMsXG5cdFx0J3Bvc2l0aW9uYWwtY2xhc3MtbmFtZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oPzpcXGJ8XFxCXFwuKVthLXpfXVxcdyooPzpcXC5bYS16X11cXHcqKSooPz1cXHMrW2Etel9dXFx3KlxccypbPTtdKS9pLFxuXHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2Fubm90YXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcW1xccyopW2Etel9dXFx3Kig/PVxccyo9KS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0fSk7XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHQvLyBUT0RPOlxuXHQvLyAtIEFkZCBDU1MgaGlnaGxpZ2h0aW5nIGluc2lkZSA8c3R5bGU+IHRhZ3Ncblx0Ly8gLSBBZGQgc3VwcG9ydCBmb3IgbXVsdGktbGluZSBjb2RlIGJsb2Nrc1xuXHQvLyAtIEFkZCBzdXBwb3J0IGZvciBpbnRlcnBvbGF0aW9uICN7fSBhbmQgIXt9XG5cdC8vIC0gQWRkIHN1cHBvcnQgZm9yIHRhZyBpbnRlcnBvbGF0aW9uICNbXVxuXHQvLyAtIEFkZCBleHBsaWNpdCBzdXBwb3J0IGZvciBwbGFpbiB0ZXh0IHVzaW5nIHxcblx0Ly8gLSBBZGQgc3VwcG9ydCBmb3IgbWFya3VwIGVtYmVkZGVkIGluIHBsYWluIHRleHRcblxuXHRQcmlzbS5sYW5ndWFnZXMucHVnID0ge1xuXG5cdFx0Ly8gTXVsdGlsaW5lIHN0dWZmIHNob3VsZCBhcHBlYXIgYmVmb3JlIHRoZSByZXN0XG5cblx0XHQvLyBUaGlzIGhhbmRsZXMgYm90aCBzaW5nbGUtbGluZSBhbmQgbXVsdGktbGluZSBjb21tZW50c1xuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogLyheKFtcXHQgXSopKVxcL1xcLy4qKD86KD86XFxyP1xcbnxcXHIpXFwyW1xcdCBdLispKi9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cblx0XHQvLyBBbGwgdGhlIHRhZy1yZWxhdGVkIHBhcnQgaXMgaW4gbG9va2JlaGluZFxuXHRcdC8vIHNvIHRoYXQgaXQgY2FuIGJlIGhpZ2hsaWdodGVkIGJ5IHRoZSBcInRhZ1wiIHBhdHRlcm5cblx0XHQnbXVsdGlsaW5lLXNjcmlwdCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXihbXFx0IF0qKXNjcmlwdFxcYi4qXFwuW1xcdCBdKikoPzooPzpcXHI/XFxufFxccig/IVxcbikpKD86XFwyW1xcdCBdLit8XFxzKj8oPz1cXHI/XFxufFxccikpKSsvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0XG5cdFx0fSxcblxuXHRcdC8vIFNlZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGZvciBrbm93biBmaWx0ZXJzXG5cdFx0J2ZpbHRlcic6IHtcblx0XHRcdHBhdHRlcm46IC8oXihbXFx0IF0qKSk6LisoPzooPzpcXHI/XFxufFxccig/IVxcbikpKD86XFwyW1xcdCBdLit8XFxzKj8oPz1cXHI/XFxufFxccikpKSsvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2ZpbHRlci1uYW1lJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eOltcXHctXSsvLFxuXHRcdFx0XHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCd0ZXh0JzogL1xcU1tcXHNcXFNdKi8sXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdCdtdWx0aWxpbmUtcGxhaW4tdGV4dCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXihbXFx0IF0qKVtcXHdcXC0jLl0rXFwuW1xcdCBdKikoPzooPzpcXHI/XFxufFxccig/IVxcbikpKD86XFwyW1xcdCBdLit8XFxzKj8oPz1cXHI/XFxufFxccikpKSsvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdtYXJrdXAnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKTwuKy9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cFxuXHRcdH0sXG5cdFx0J2RvY3R5cGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxuKVtcXHQgXSopZG9jdHlwZSg/OiAuKyk/Lyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXG5cdFx0Ly8gVGhpcyBoYW5kbGUgYWxsIGNvbmRpdGlvbmFsIGFuZCBsb29wIGtleXdvcmRzXG5cdFx0J2Zsb3ctY29udHJvbCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXltcXHQgXSopKD86Y2FzZXxkZWZhdWx0fGVhY2h8ZWxzZXxpZnx1bmxlc3N8d2hlbnx3aGlsZSlcXGIoPzogLispPy9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZWFjaCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXmVhY2ggLis/IGluXFxiLyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdrZXl3b3JkJzogL1xcYig/OmVhY2h8aW4pXFxiLyxcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC8sL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J2JyYW5jaCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXig/OmNhc2V8ZGVmYXVsdHxlbHNlfGlmfHVubGVzc3x3aGVufHdoaWxlKVxcYi8sXG5cdFx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRyZXN0OiBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKSg/OmFwcGVuZHxibG9ja3xleHRlbmRzfGluY2x1ZGV8cHJlcGVuZClcXGIuKy9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J21peGluJzogW1xuXHRcdFx0Ly8gRGVjbGFyYXRpb25cblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyheW1xcdCBdKiltaXhpbiAuKy9tLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQna2V5d29yZCc6IC9ebWl4aW4vLFxuXHRcdFx0XHRcdCdmdW5jdGlvbic6IC9cXHcrKD89XFxzKlxcKHxcXHMqJCkvLFxuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bKCksLl0vXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQvLyBVc2FnZVxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKVxcKy4rL20sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCduYW1lJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL15cXCtcXHcrLyxcblx0XHRcdFx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRyZXN0OiBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnc2NyaXB0Jzoge1xuXHRcdFx0cGF0dGVybjogLyheW1xcdCBdKnNjcmlwdCg/Oig/OiZbXihdKyk/XFwoW14pXStcXCkpKltcXHQgXSkuKy9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRcblx0XHR9LFxuXG5cdFx0J3BsYWluLXRleHQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKD8hLSlbXFx3XFwtIy5dKltcXHdcXC1dKD86KD86JlteKF0rKT9cXChbXildK1xcKSkqXFwvP1tcXHQgXSkuKy9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J3RhZyc6IHtcblx0XHRcdHBhdHRlcm46IC8oXltcXHQgXSopKD8hLSlbXFx3XFwtIy5dKltcXHdcXC1dKD86KD86JlteKF0rKT9cXChbXildK1xcKSkqXFwvPzo/L20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdhdHRyaWJ1dGVzJzogW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC8mW14oXStcXChbXildK1xcKS8sXG5cdFx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXFwoW14pXStcXCkvLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdCdhdHRyLXZhbHVlJzoge1xuXHRcdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8oPVxccyooPyFcXHMpKSg/Olxce1tefV0qXFx9fFteLClcXHJcXG5dKykvLFxuXHRcdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHQnYXR0ci1uYW1lJzogL1tcXHctXSsoPz1cXHMqIT89fFxccypbLCldKS8sXG5cdFx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bIT0oKSxdKy9cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdF0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC86Lyxcblx0XHRcdFx0J2F0dHItaWQnOiAvI1tcXHdcXC1dKy8sXG5cdFx0XHRcdCdhdHRyLWNsYXNzJzogL1xcLltcXHdcXC1dKy9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdjb2RlJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKD86LXwhPz0pKS4rL20sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bLlxcLSE9fF0rL1xuXHR9O1xuXG5cdHZhciBmaWx0ZXJfcGF0dGVybiA9IC8oXihbXFx0IF0qKSk6PGZpbHRlcl9uYW1lPig/Oig/Olxccj9cXG58XFxyKD8hXFxuKSkoPzpcXDJbXFx0IF0uK3xcXHMqPyg/PVxccj9cXG58XFxyKSkpKy8uc291cmNlO1xuXG5cdC8vIE5vbiBleGhhdXN0aXZlIGxpc3Qgb2YgYXZhaWxhYmxlIGZpbHRlcnMgYW5kIGFzc29jaWF0ZWQgbGFuZ3VhZ2VzXG5cdHZhciBmaWx0ZXJzID0gW1xuXHRcdHsgZmlsdGVyOiAnYXRwbCcsIGxhbmd1YWdlOiAndHdpZycgfSxcblx0XHR7IGZpbHRlcjogJ2NvZmZlZScsIGxhbmd1YWdlOiAnY29mZmVlc2NyaXB0JyB9LFxuXHRcdCdlanMnLFxuXHRcdCdoYW5kbGViYXJzJyxcblx0XHQnbGVzcycsXG5cdFx0J2xpdmVzY3JpcHQnLFxuXHRcdCdtYXJrZG93bicsXG5cdFx0eyBmaWx0ZXI6ICdzYXNzJywgbGFuZ3VhZ2U6ICdzY3NzJyB9LFxuXHRcdCdzdHlsdXMnXG5cdF07XG5cdHZhciBhbGxfZmlsdGVycyA9IHt9O1xuXHRmb3IgKHZhciBpID0gMCwgbCA9IGZpbHRlcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0dmFyIGZpbHRlciA9IGZpbHRlcnNbaV07XG5cdFx0ZmlsdGVyID0gdHlwZW9mIGZpbHRlciA9PT0gJ3N0cmluZycgPyB7IGZpbHRlcjogZmlsdGVyLCBsYW5ndWFnZTogZmlsdGVyIH0gOiBmaWx0ZXI7XG5cdFx0aWYgKFByaXNtLmxhbmd1YWdlc1tmaWx0ZXIubGFuZ3VhZ2VdKSB7XG5cdFx0XHRhbGxfZmlsdGVyc1snZmlsdGVyLScgKyBmaWx0ZXIuZmlsdGVyXSA9IHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKGZpbHRlcl9wYXR0ZXJuLnJlcGxhY2UoJzxmaWx0ZXJfbmFtZT4nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBmaWx0ZXIuZmlsdGVyOyB9KSwgJ20nKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2ZpbHRlci1uYW1lJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL146W1xcdy1dKy8sXG5cdFx0XHRcdFx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3RleHQnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxTW1xcc1xcU10qLyxcblx0XHRcdFx0XHRcdGFsaWFzOiBbZmlsdGVyLmxhbmd1YWdlLCAnbGFuZ3VhZ2UtJyArIGZpbHRlci5sYW5ndWFnZV0sXG5cdFx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlc1tmaWx0ZXIubGFuZ3VhZ2VdXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3B1ZycsICdmaWx0ZXInLCBhbGxfZmlsdGVycyk7XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHRQcmlzbS5sYW5ndWFnZXMucHVwcGV0ID0ge1xuXHRcdCdoZXJlZG9jJzogW1xuXHRcdFx0Ly8gTWF0Y2hlcyB0aGUgY29udGVudCBvZiBhIHF1b3RlZCBoZXJlZG9jIHN0cmluZyAoc3ViamVjdCB0byBpbnRlcnBvbGF0aW9uKVxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKEBcXChcIihbXlwiXFxyXFxuXFwvKTpdKylcIig/OlxcL1tucnRzJHVMXSopP1xcKS4qKD86XFxyP1xcbnxcXHIpKSg/Oi4qKD86XFxyP1xcbnxcXHIoPyFcXG4pKSkqP1sgXFx0XSooPzpcXHxbIFxcdF0qKT8oPzotWyBcXHRdKik/XFwyLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQvLyBNYXRjaGVzIHRoZSBlbmQgdGFnXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLyg/PVxcUykuKlxcUyg/PSAqJCkvXG5cdFx0XHRcdFx0Ly8gU2VlIGludGVycG9sYXRpb24gYmVsb3dcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdC8vIE1hdGNoZXMgdGhlIGNvbnRlbnQgb2YgYW4gdW5xdW90ZWQgaGVyZWRvYyBzdHJpbmcgKG5vIGludGVycG9sYXRpb24pXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oQFxcKChbXlwiXFxyXFxuXFwvKTpdKykoPzpcXC9bbnJ0cyR1TF0qKT9cXCkuKig/Olxccj9cXG58XFxyKSkoPzouKig/Olxccj9cXG58XFxyKD8hXFxuKSkpKj9bIFxcdF0qKD86XFx8WyBcXHRdKik/KD86LVsgXFx0XSopP1xcMi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQvLyBNYXRjaGVzIHRoZSBlbmQgdGFnXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLyg/PVxcUykuKlxcUyg/PSAqJCkvXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQvLyBNYXRjaGVzIHRoZSBzdGFydCB0YWcgb2YgaGVyZWRvYyBzdHJpbmdzXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9AXFwoXCI/KD86W15cIlxcclxcblxcLyk6XSspXCI/KD86XFwvW25ydHMkdUxdKik/XFwpLyxcblx0XHRcdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKFxcKCkuKz8oPz1cXCkpLyxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXHRcdCdtdWx0aWxpbmUtY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVxcL1xcKltcXHNcXFNdKj9cXCpcXC8vLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnY29tbWVudCdcblx0XHR9LFxuXHRcdCdyZWdleCc6IHtcblx0XHRcdC8vIE11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUga2V5d29yZCBcIm5vZGVcIiBvciBhIG5vbi13b3JkIGNoYXJcblx0XHRcdHBhdHRlcm46IC8oKD86XFxibm9kZVxccyt8W349XFwoXFxbXFx7LF1cXHMqfFs9K10+XFxzKnxeXFxzKikpXFwvKD86W15cXC9cXFxcXXxcXFxcW1xcc1xcU10pK1xcLyg/OltpbXhdK1xcYnxcXEIpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0Ly8gRXh0ZW5kZWQgcmVnZXhlcyBtdXN0IGhhdmUgdGhlIHggZmxhZy4gVGhleSBjYW4gY29udGFpbiBzaW5nbGUtbGluZSBjb21tZW50cy5cblx0XHRcdFx0J2V4dGVuZGVkLXJlZ2V4Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eXFwvKD86W15cXC9cXFxcXXxcXFxcW1xcc1xcU10pK1xcL1tpbV0qeFtpbV0qJC8sXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQnY29tbWVudCc6IC8jLiovXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSMuKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdH0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdC8vIEFsbG93IGZvciBvbmUgbmVzdGVkIGxldmVsIG9mIGRvdWJsZSBxdW90ZXMgaW5zaWRlIGludGVycG9sYXRpb25cblx0XHRcdHBhdHRlcm46IC8oW1wiJ10pKD86XFwkXFx7KD86W14nXCJ9XXwoW1wiJ10pKD86KD8hXFwyKVteXFxcXF18XFxcXFtcXHNcXFNdKSpcXDIpK1xcfXxcXCQoPyFcXHspfCg/IVxcMSlbXlxcXFwkXXxcXFxcW1xcc1xcU10pKlxcMS8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2RvdWJsZS1xdW90ZWQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15cIltcXHNcXFNdKlwiJC8sXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQvLyBTZWUgaW50ZXJwb2xhdGlvbiBiZWxvd1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3ZhcmlhYmxlJzoge1xuXHRcdFx0cGF0dGVybjogL1xcJCg/Ojo6KT9cXHcrKD86OjpcXHcrKSovLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC86Oi9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdhdHRyLW5hbWUnOiAvKD86XFxiXFx3K3xcXCopKD89XFxzKj0+KS8sXG5cdFx0J2Z1bmN0aW9uJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcLikoPyFcXGQpXFx3Ky8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQvXFxiKD86Y29udGFpbnxkZWJ1Z3xlcnJ8ZmFpbHxpbmNsdWRlfGluZm98bm90aWNlfHJlYWxpemV8cmVxdWlyZXx0YWd8d2FybmluZylcXGJ8XFxiKD8hXFxkKVxcdysoPz1cXCgpL1xuXHRcdF0sXG5cdFx0J251bWJlcic6IC9cXGIoPzoweFthLWZcXGRdK3xcXGQrKD86XFwuXFxkKyk/KD86ZS0/XFxkKyk/KVxcYi9pLFxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0XHQvLyBJbmNsdWRlcyB3b3JkcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZVxuXHRcdCdrZXl3b3JkJzogL1xcYig/OmFwcGxpY2F0aW9ufGF0dHJ8Y2FzZXxjbGFzc3xjb25zdW1lc3xkZWZhdWx0fGRlZmluZXxlbHNlfGVsc2lmfGZ1bmN0aW9ufGlmfGltcG9ydHxpbmhlcml0c3xub2RlfHByaXZhdGV8cHJvZHVjZXN8dHlwZXx1bmRlZnx1bmxlc3MpXFxiLyxcblx0XHQnZGF0YXR5cGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86QW55fEFycmF5fEJvb2xlYW58Q2FsbGFibGV8Q2F0YWxvZ2VudHJ5fENsYXNzfENvbGxlY3Rpb258RGF0YXxEZWZhdWx0fEVudW18RmxvYXR8SGFzaHxJbnRlZ2VyfE5vdFVuZGVmfE51bWVyaWN8T3B0aW9uYWx8UGF0dGVybnxSZWdleHB8UmVzb3VyY2V8UnVudGltZXxTY2FsYXJ8U3RyaW5nfFN0cnVjdHxUdXBsZXxUeXBlfFVuZGVmfFZhcmlhbnQpXFxiLyxcblx0XHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHRcdH0sXG5cdFx0J29wZXJhdG9yJzogLz1bPX4+XT98IVs9fl0/fDwoPzo8XFx8P3xbPX58LV0pP3w+Wz49XT98LT4/fH4+fFxcfD4/Pj98WypcXC8lKz9dfFxcYig/OmFuZHxpbnxvcilcXGIvLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bXFxbXFxde30oKS4sO118OisvXG5cdH07XG5cblx0dmFyIGludGVycG9sYXRpb24gPSBbXG5cdFx0e1xuXHRcdFx0Ly8gQWxsb3cgZm9yIG9uZSBuZXN0ZWQgbGV2ZWwgb2YgYnJhY2VzIGluc2lkZSBpbnRlcnBvbGF0aW9uXG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcXCRcXHsoPzpbXidcInt9XXxcXHtbXn1dKlxcfXwoW1wiJ10pKD86KD8hXFwyKVteXFxcXF18XFxcXFtcXHNcXFNdKSpcXDIpK1xcfS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdzaG9ydC12YXJpYWJsZSc6IHtcblx0XHRcdFx0XHQvLyBOZWdhdGl2ZSBsb29rLWFoZWFkIHByZXZlbnQgd3JvbmcgaGlnaGxpZ2h0aW5nIG9mIGZ1bmN0aW9uc1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXlxcJFxceykoPyFcXHcrXFwoKSg/Ojo6KT9cXHcrKD86OjpcXHcrKSovLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICd2YXJpYWJsZScsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvOjovXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eXFwkLyxcblx0XHRcdFx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRyZXN0OiBQcmlzbS5sYW5ndWFnZXMucHVwcGV0XG5cdFx0XHR9XG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcXCQoPzo6Oik/XFx3Kyg/Ojo6XFx3KykqLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3ZhcmlhYmxlJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvOjovXG5cdFx0XHR9XG5cdFx0fVxuXHRdO1xuXHRQcmlzbS5sYW5ndWFnZXMucHVwcGV0WydoZXJlZG9jJ11bMF0uaW5zaWRlLmludGVycG9sYXRpb24gPSBpbnRlcnBvbGF0aW9uO1xuXHRQcmlzbS5sYW5ndWFnZXMucHVwcGV0WydzdHJpbmcnXS5pbnNpZGVbJ2RvdWJsZS1xdW90ZWQnXS5pbnNpZGUuaW50ZXJwb2xhdGlvbiA9IGludGVycG9sYXRpb247XG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0Ly8gaHR0cHM6Ly9hZ3JhZWYuZ2l0aHViLmlvL3B1cmUtZG9jcy9wdXJlLmh0bWwjbGV4aWNhbC1tYXR0ZXJzXG5cblx0UHJpc20ubGFuZ3VhZ2VzLnB1cmUgPSB7XG5cdFx0J2NvbW1lbnQnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVxcL1xcKltcXHNcXFNdKj9cXCpcXC8vLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcOl0pXFwvXFwvLiovLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0LyMhLisvXG5cdFx0XSxcblx0XHQnaW5saW5lLWxhbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvJTxbXFxzXFxTXSs/JT4vLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdsYW5nJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXiU8ICopLVxcKi0uKz8tXFwqLS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ2NvbW1lbnQnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14lPC4qfCU+JC8sXG5cdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9cIig/OlxcXFwufFteXCJcXFxcXFxyXFxuXSkqXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnbnVtYmVyJzoge1xuXHRcdFx0Ly8gVGhlIGxvb2stYmVoaW5kIHByZXZlbnRzIHdyb25nIGhpZ2hsaWdodGluZyBvZiB0aGUgLi4gb3BlcmF0b3Jcblx0XHRcdHBhdHRlcm46IC8oKD86XFwuXFwuKT8pKD86XFxiKD86aW5mfG5hbilcXGJ8XFxiMHhbXFxkYS1mXSt8KD86XFxiKD86MGIpP1xcZCsoPzpcXC5cXGQrKT98XFxCXFwuXFxkKykoPzplWystXT9cXGQrKT9MPykvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdrZXl3b3JkJzogL1xcYig/Ok5VTEx8YW5zfGJyZWFrfGJ0fGNhc2V8Y2F0Y2h8Y2R8Y2xlYXJ8Y29uc3R8ZGVmfGRlbHxkdW1wfGVsc2V8ZW5kfGV4aXR8ZXh0ZXJufGZhbHNlfGZvcmNlfGhlbHB8aWZ8aW5maXhbbHJdP3xpbnRlcmZhY2V8bGV0fGxzfG1lbXxuYW1lc3BhY2V8bm9uZml4fG9mfG90aGVyd2lzZXxvdXRmaXh8b3ZlcnJpZGV8cG9zdGZpeHxwcmVmaXh8cHJpdmF0ZXxwdWJsaWN8cHdkfHF1aXR8cnVufHNhdmV8c2hvd3xzdGF0c3x0aGVufHRocm93fHRyYWNlfHRydWV8dHlwZXx1bmRlcnJpZGV8dXNpbmd8d2hlbnx3aXRoKVxcYi8sXG5cdFx0J2Z1bmN0aW9uJzogL1xcYig/OmFic3xhZGRfKD86YWRkcnxjb25zdGRlZnwoPzpmdW5kZWZ8aW50ZXJmYWNlfG1hY2RlZnx0eXBlZGVmKSg/Ol9hdCk/fHZhcmRlZil8YWxsfGFueXxhcHBscD98YXJpdHl8YmlnaW50cD98YmxvYig/Ol9jcmN8X3NpemV8cCk/fGJvb2xwP3xieXRlX2M/c3RyaW5nKD86X3BvaW50ZXIpP3xieXRlXyg/Om1hdHJpeHxwb2ludGVyKXxjYWxsb2N8Y2F0fGNhdG1hcHxjZWlsfGNoYXJbcHNdP3xjaGVja19wdHJ0YWd8Y2hyfGNsZWFyX3NlbnRyeXxjbGVhcnN5bXxjbG9zdXJlcD98Y21hdHJpeHA/fGNvbHM/fGNvbGNhdCg/Om1hcCk/fGNvbG1hcHxjb2xyZXZ8Y29sdmVjdG9yKD86cHxzZXEpP3xjb21wbGV4KD86X2Zsb2F0Xyg/Om1hdHJpeHxwb2ludGVyKXxfbWF0cml4KD86X3ZpZXcpP3xfcG9pbnRlcnxwKT98Y29uanxjb29rZWRwP3xjc3R8Y3N0cmluZyg/Ol8oPzpkdXB8bGlzdHx2ZWN0b3IpKT98Y3VycnkzP3xjeWNsZW4/fGRlbF8oPzpjb25zdGRlZnxmdW5kZWZ8aW50ZXJmYWNlfG1hY2RlZnx0eXBlZGVmfHZhcmRlZil8ZGVsZXRlfGRpYWcoPzptYXQpP3xkaW18ZG1hdHJpeHA/fGRvfGRvdWJsZSg/Ol9tYXRyaXgoPzpfdmlldyk/fF9wb2ludGVyfHApP3xkb3dpdGgzP3xkcm9wfGRyb3B3aGlsZXxldmFsKD86Y21kKT98ZXhhY3RwfGZpbHRlcnxmaXh8Zml4aXR5fGZsaXB8ZmxvYXQoPzpfbWF0cml4fF9wb2ludGVyKXxmbG9vcnxmb2xkW2xyXTE/fGZyYWN8ZnJlZXxmdW5wP3xmdW5jdGlvbnA/fGdjZHxnZXQoPzpfKD86Ynl0ZXxjb25zdGRlZnxkb3VibGV8ZmxvYXR8ZnVuZGVmfGludCg/OjY0KT98aW50ZXJmYWNlKD86X3R5cGVkZWYpP3xsb25nfG1hY2RlZnxwb2ludGVyfHB0cnRhZ3xzZW50cnl8c2hvcnR8c3RyaW5nfHR5cGVkZWZ8dmFyZGVmKSk/fGdsb2JzeW18aGFzaHxoZWFkfGlkfGltfGltYXRyaXhwP3xpbmRleHxpbmV4YWN0cHxpbmZwfGluaXR8aW5zZXJ0fGludCg/Ol9tYXRyaXgoPzpfdmlldyk/fF9wb2ludGVyfHApP3xpbnQ2NF8oPzptYXRyaXh8cG9pbnRlcil8aW50ZWdlcnA/fGl0ZXJhdGVuP3xpdGVyd2hpbGV8am9pbnxrZXlzP3xsYW1iZGFwP3xsYXN0KD86ZXJyKD86cG9zKT8pP3xsY2R8bGlzdFsycF0/fGxpc3RtYXB8bWFrZV9wdHJ0YWd8bWFsbG9jfG1hcHxtYXRjYXR8bWF0cml4cD98bWF4fG1lbWJlcnxtaW58bmFucHxuYXJnc3xubWF0cml4cD98bnVsbHxudW1iZXJwP3xvcmR8cGFjayg/OmVkKT98cG9pbnRlcig/Ol9jYXN0fF90YWd8X3R5cGV8cCk/fHBvd3xwcmVkfHB0cnRhZ3xwdXQoPzpfKD86Ynl0ZXxkb3VibGV8ZmxvYXR8aW50KD86NjQpP3xsb25nfHBvaW50ZXJ8c2hvcnR8c3RyaW5nKSk/fHJhdGlvbmFscD98cmV8cmVhbHA/fHJlYWxsb2N8cmVjb3JkcD98cmVkaW18cmVkdWNlKD86X3dpdGgpP3xyZWZwP3xyZXBlYXRuP3xyZXZlcnNlfHJsaXN0cD98cm91bmR8cm93cz98cm93Y2F0KD86bWFwKT98cm93bWFwfHJvd3Jldnxyb3d2ZWN0b3IoPzpwfHNlcSk/fHNhbWV8c2Nhbltscl0xP3xzZW50cnl8c2dufHNob3J0Xyg/Om1hdHJpeHxwb2ludGVyKXxzbGljZXxzbWF0cml4cD98c29ydHxzcGxpdHxzdHJ8c3RyY2F0fHN0cmVhbXxzdHJpZGV8c3RyaW5nKD86Xyg/OmR1cHxsaXN0fHZlY3Rvcil8cCk/fHN1YmRpYWcoPzptYXQpP3xzdWJtYXR8c3Vic2VxMj98c3Vic3RyfHN1Y2N8c3VwZGlhZyg/Om1hdCk/fHN5bWJvbHA/fHRhaWx8dGFrZXx0YWtld2hpbGV8dGh1bmtwP3x0cmFuc3Bvc2V8dHJ1bmN8dHVwbGVwP3x0eXBlcHx1Ynl0ZXx1aW50KD86NjQpP3x1bG9uZ3x1bmN1cnJ5Mz98dW5yZWZ8dW56aXAzP3x1cGRhdGV8dXNob3J0fHZhbHM/fHZhcnA/fHZlY3Rvcig/OnB8c2VxKT98dm9pZHx6aXAzP3x6aXB3aXRoMz8pXFxiLyxcblx0XHQnc3BlY2lhbCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGJfX1thLXpdK19fXFxiL2ksXG5cdFx0XHRhbGlhczogJ2J1aWx0aW4nXG5cdFx0fSxcblx0XHQvLyBBbnkgY29tYmluYXRpb24gb2Ygb3BlcmF0b3IgY2hhcnMgY2FuIGJlIGFuIG9wZXJhdG9yXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1pc2xlYWRpbmctY2hhcmFjdGVyLWNsYXNzXG5cdFx0J29wZXJhdG9yJzogLyg/OlshXCIjJCUmJyorLFxcLS5cXC86PD0+P0BcXFxcXmB8flxcdTAwYTEtXFx1MDBiZlxcdTAwZDctXFx1MDBmN1xcdTIwZDAtXFx1MmJmZl18XFxiXytcXGIpK3xcXGIoPzphbmR8ZGl2fG1vZHxub3R8b3IpXFxiLyxcblx0XHQvLyBGSVhNRTogSG93IGNhbiB3ZSBwcmV2ZW50IHwgYW5kICwgdG8gYmUgaGlnaGxpZ2h0ZWQgYXMgb3BlcmF0b3Igd2hlbiB0aGV5IGFyZSB1c2VkIGFsb25lP1xuXHRcdCdwdW5jdHVhdGlvbic6IC9bKCl7fVxcW1xcXTssfF0vXG5cdH07XG5cblx0dmFyIGlubGluZUxhbmd1YWdlcyA9IFtcblx0XHQnYycsXG5cdFx0eyBsYW5nOiAnYysrJywgYWxpYXM6ICdjcHAnIH0sXG5cdFx0J2ZvcnRyYW4nXG5cdF07XG5cdHZhciBpbmxpbmVMYW5ndWFnZVJlID0gLyU8ICotXFwqLSAqPGxhbmc+XFxkKiAqLVxcKi1bXFxzXFxTXSs/JT4vLnNvdXJjZTtcblxuXHRpbmxpbmVMYW5ndWFnZXMuZm9yRWFjaChmdW5jdGlvbiAobGFuZykge1xuXHRcdHZhciBhbGlhcyA9IGxhbmc7XG5cdFx0aWYgKHR5cGVvZiBsYW5nICE9PSAnc3RyaW5nJykge1xuXHRcdFx0YWxpYXMgPSBsYW5nLmFsaWFzO1xuXHRcdFx0bGFuZyA9IGxhbmcubGFuZztcblx0XHR9XG5cdFx0aWYgKFByaXNtLmxhbmd1YWdlc1thbGlhc10pIHtcblx0XHRcdHZhciBvID0ge307XG5cdFx0XHRvWydpbmxpbmUtbGFuZy0nICsgYWxpYXNdID0ge1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoaW5saW5lTGFuZ3VhZ2VSZS5yZXBsYWNlKCc8bGFuZz4nLCBsYW5nLnJlcGxhY2UoLyhbLisqP1xcL1xcXFwoKXt9XFxbXFxdXSkvZywgJ1xcXFwkMScpKSwgJ2knKSxcblx0XHRcdFx0aW5zaWRlOiBQcmlzbS51dGlsLmNsb25lKFByaXNtLmxhbmd1YWdlcy5wdXJlWydpbmxpbmUtbGFuZyddLmluc2lkZSlcblx0XHRcdH07XG5cdFx0XHRvWydpbmxpbmUtbGFuZy0nICsgYWxpYXNdLmluc2lkZS5yZXN0ID0gUHJpc20udXRpbC5jbG9uZShQcmlzbS5sYW5ndWFnZXNbYWxpYXNdKTtcblx0XHRcdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3B1cmUnLCAnaW5saW5lLWxhbmcnLCBvKTtcblx0XHR9XG5cdH0pO1xuXG5cdC8vIEMgaXMgdGhlIGRlZmF1bHQgaW5saW5lIGxhbmd1YWdlXG5cdGlmIChQcmlzbS5sYW5ndWFnZXMuYykge1xuXHRcdFByaXNtLmxhbmd1YWdlcy5wdXJlWydpbmxpbmUtbGFuZyddLmluc2lkZS5yZXN0ID0gUHJpc20udXRpbC5jbG9uZShQcmlzbS5sYW5ndWFnZXMuYyk7XG5cdH1cblxufShQcmlzbSkpO1xuXG4vKlxuT3JpZ2luYWwgQ29kZSBieSBCYXMgR3Jvb3RoZWRkZVxuISFNQU5ZIFRIQU5LUyEhIEkgbmV2ZXIgd291bGQgaGF2ZSBtYWRlIHRoaXMsIHJlZ2V4IGFuZCBtZSB3aWxsIG5ldmVyIGJlIGJlc3QgZnJpZW5kcyA7KVxuPT0+IGh0dHBzOi8vY29kZXBlbi5pby9JbWFnaW5lUHJvZ3JhbW1pbmcvZGV0YWlscy9KWXlkQnkvXG5zbGlnaHRseSBjaGFuZ2VkIHRvIHBhc3MgYWxsIHRlc3RzXG4qL1xuXG5cbi8vIFB1cmVCYXNpYyBzdXBwb3J0LCBzdGVhbCBzdHVmZiBmcm9tIGFuc2ktY1xuUHJpc20ubGFuZ3VhZ2VzLnB1cmViYXNpYyA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHQnY29tbWVudCc6IC87LiovLFxuXHQna2V5d29yZCc6IC9cXGIoPzphbGlnbnxhbmR8YXN8YnJlYWt8Y2FsbGRlYnVnZ2VyfGNhc2V8Y29tcGlsZXJjYXNlfGNvbXBpbGVyZGVmYXVsdHxjb21waWxlcmVsc2V8Y29tcGlsZXJlbHNlaWZ8Y29tcGlsZXJlbmRpZnxjb21waWxlcmVuZHNlbGVjdHxjb21waWxlcmVycm9yfGNvbXBpbGVyaWZ8Y29tcGlsZXJzZWxlY3R8Y29udGludWV8ZGF0YXxkYXRhc2VjdGlvbnxkZWJ1Z3xkZWJ1Z2xldmVsfGRlY2xhcmV8ZGVjbGFyZWN8ZGVjbGFyZWNkbGx8ZGVjbGFyZWRsbHxkZWNsYXJlbW9kdWxlfGRlZmF1bHR8ZGVmaW5lfGRpbXxkaXNhYmxlYXNtfGRpc2FibGVkZWJ1Z2dlcnxkaXNhYmxlZXhwbGljaXR8ZWxzZXxlbHNlaWZ8ZW5hYmxlYXNtfGVuYWJsZWRlYnVnZ2VyfGVuYWJsZWV4cGxpY2l0fGVuZHxlbmRkYXRhc2VjdGlvbnxlbmRkZWNsYXJlbW9kdWxlfGVuZGVudW1lcmF0aW9ufGVuZGlmfGVuZGltcG9ydHxlbmRpbnRlcmZhY2V8ZW5kbWFjcm98ZW5kbW9kdWxlfGVuZHByb2NlZHVyZXxlbmRzZWxlY3R8ZW5kc3RydWN0dXJlfGVuZHN0cnVjdHVyZXVuaW9ufGVuZHdpdGh8ZW51bWVyYXRpb258ZXh0ZW5kc3xmYWtlcmV0dXJufGZvcnxmb3JlYWNofGZvcmV2ZXJ8Z2xvYmFsfGdvc3VifGdvdG98aWZ8aW1wb3J0fGltcG9ydGN8aW5jbHVkZWJpbmFyeXxpbmNsdWRlZmlsZXxpbmNsdWRlcGF0aHxpbnRlcmZhY2V8bWFjcm98bW9kdWxlfG5ld2xpc3R8bmV3bWFwfG5leHR8bm90fG9yfHByb2NlZHVyZXxwcm9jZWR1cmVjfHByb2NlZHVyZWNkbGx8cHJvY2VkdXJlZGxsfHByb2NlZHVyZXJldHVybnxwcm90ZWN0ZWR8cHJvdG90eXBlfHByb3RvdHlwZWN8cmVhZHxyZWRpbXxyZXBlYXR8cmVzdG9yZXxyZXR1cm58cnVudGltZXxzZWxlY3R8c2hhcmVkfHN0YXRpY3xzdGVwfHN0cnVjdHVyZXxzdHJ1Y3R1cmV1bmlvbnxzd2FwfHRocmVhZGVkfHRvfHVudGlsfHdlbmR8d2hpbGV8d2l0aHx4aW5jbHVkZWZpbGV8eG9yKVxcYi9pLFxuXHQnZnVuY3Rpb24nOiAvXFxiXFx3Kyg/OlxcLlxcdyspP1xccyooPz1cXCgpLyxcblx0J251bWJlcic6IC8oPzpcXCRbXFxkYS1mXSt8XFxiLT8oPzpcXGQrKD86XFwuXFxkKyk/fFxcLlxcZCspKD86ZVsrLV0/XFxkKyk/KVxcYi9pLFxuXHQnb3BlcmF0b3InOiAvKD86QFxcKj98XFw/fFxcKilcXHcrXFwkP3wtWz4tXT98XFwrXFwrP3whPT98PDw/PT98Pj4/PT98PT0/fCYmP3xcXHw/XFx8fFt+XiU/Ki9AXS9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdwdXJlYmFzaWMnLCAna2V5d29yZCcsIHtcblx0J3RhZyc6IC8jXFx3K1xcJD8vLFxuXHQnYXNtJzoge1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSopIS4qL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3RhZycsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnY29tbWVudCc6IC87LiovLFxuXHRcdFx0J3N0cmluZyc6IHtcblx0XHRcdFx0cGF0dGVybjogLyhbXCInYF0pKD86XFxcXC58KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdC8vIEFub255bW91cyBsYWJlbCByZWZlcmVuY2VzLCBpLmUuOiBqbXAgQGJcblx0XHRcdCdsYWJlbC1yZWZlcmVuY2UtYW5vbnltb3VzJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCFcXHMqalthLXpdK1xccyspQFtmYl0vaSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdmYXNtLWxhYmVsJ1xuXHRcdFx0fSxcblx0XHRcdC8vIE5hbWVkIGxhYmVsIHJlZmVyZW5jZSwgaS5lLjogam5lIGxhYmVsMVxuXHRcdFx0J2xhYmVsLXJlZmVyZW5jZS1hZGRyZXNzZWQnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oIVxccypqW2Etel0rXFxzKylbQS1aLl8/JEBdW1xcdy4/JEB+I10qL2ksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnZmFzbS1sYWJlbCdcblx0XHRcdH0sXG5cdFx0XHQna2V5d29yZCc6IFtcblx0XHRcdFx0L1xcYig/OmV4dGVybnxnbG9iYWwpXFxiW147XFxyXFxuXSovaSxcblx0XHRcdFx0L1xcYig/OkNQVXxERUZBVUxUfEZMT0FUKVxcYi4qL1xuXHRcdFx0XSxcblx0XHRcdCdmdW5jdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogL14oW1xcdCBdKiFcXHMqKVtcXGRhLXpdKyg/PVxcc3wkKS9pbSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdCdmdW5jdGlvbi1pbmxpbmUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oOlxccyopW1xcZGEtel0rKD89XFxzKS9pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdFx0fSxcblx0XHRcdCdsYWJlbCc6IHtcblx0XHRcdFx0cGF0dGVybjogL14oW1xcdCBdKiFcXHMqKVtBLVphLXouXz8kQF1bXFx3Lj8kQH4jXSooPz06KS9tLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ2Zhc20tbGFiZWwnXG5cdFx0XHR9LFxuXHRcdFx0J3JlZ2lzdGVyJzogL1xcYig/OnN0XFxkfFt4eXpdbW1cXGRcXGQ/fFtjZHRdclxcZHxyXFxkXFxkP1tid2RdP3xbZXJdP1thYmNkXXh8W2FiY2RdW2hsXXxbZXJdPyg/OmJwfGRpfHNpfHNwKXxbY2RlZmdzXXN8bW1cXGQrKVxcYi9pLFxuXHRcdFx0J251bWJlcic6IC8oPzpcXGJ8LXwoPz1cXCQpKSg/OjBbaHhdKD86W1xcZGEtZl0qXFwuKT9bXFxkYS1mXSsoPzpwWystXT9cXGQrKT98XFxkW1xcZGEtZl0rW2h4XXxcXCRcXGRbXFxkYS1mXSp8MFtvcV1bMC03XSt8WzAtN10rW29xXXwwW2J5XVswMV0rfFswMV0rW2J5XXwwW2R0XVxcZCt8KD86XFxkKyg/OlxcLlxcZCspP3xcXC5cXGQrKSg/OlxcLj9lWystXT9cXGQrKT9bZHRdPylcXGIvaSxcblx0XHRcdCdvcGVyYXRvcic6IC9bXFxbXFxdKitcXC0vJTw+PSZ8JCEsLjpdL1xuXHRcdH1cblx0fVxufSk7XG5cbmRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMucHVyZWJhc2ljWydjbGFzcy1uYW1lJ107XG5kZWxldGUgUHJpc20ubGFuZ3VhZ2VzLnB1cmViYXNpY1snYm9vbGVhbiddO1xuXG5QcmlzbS5sYW5ndWFnZXMucGJmYXNtID0gUHJpc20ubGFuZ3VhZ2VzWydwdXJlYmFzaWMnXTtcblxuUHJpc20ubGFuZ3VhZ2VzLnB1cmVzY3JpcHQgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdoYXNrZWxsJywge1xuXHQna2V5d29yZCc6IC9cXGIoPzphZG98Y2FzZXxjbGFzc3xkYXRhfGRlcml2ZXxkb3xlbHNlfGZvcmFsbHxpZnxpbnxpbmZpeGx8aW5maXhyfGluc3RhbmNlfGxldHxtb2R1bGV8bmV3dHlwZXxvZnxwcmltaXRpdmV8dGhlbnx0eXBlfHdoZXJlKVxcYnxcdTIyMDAvLFxuXG5cdCdpbXBvcnQtc3RhdGVtZW50Jzoge1xuXHRcdC8vIFRoZSBpbXBvcnRlZCBvciBoaWRkZW4gbmFtZXMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGlzIGltcG9ydFxuXHRcdC8vIHN0YXRlbWVudC4gVGhpcyBpcyBiZWNhdXNlIHdlIHdhbnQgdG8gaGlnaGxpZ2h0IHRob3NlIGV4YWN0bHkgbGlrZVxuXHRcdC8vIHdlIGRvIGZvciB0aGUgbmFtZXMgaW4gdGhlIHByb2dyYW0uXG5cdFx0cGF0dGVybjogLyheW1xcdCBdKilpbXBvcnRcXHMrW0EtWl1bXFx3J10qKD86XFwuW0EtWl1bXFx3J10qKSooPzpcXHMrYXNcXHMrW0EtWl1bXFx3J10qKD86XFwuW0EtWl1bXFx3J10qKSopPyg/OlxccytoaWRpbmdcXGIpPy9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQna2V5d29yZCc6IC9cXGIoPzphc3xoaWRpbmd8aW1wb3J0KVxcYi8sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdH1cblx0fSxcblxuXHQvLyBUaGVzZSBhcmUgYnVpbHRpbiBmdW5jdGlvbnMgb25seS4gQ29uc3RydWN0b3JzIGFyZSBoaWdobGlnaHRlZCBsYXRlciBhcyBhIGNvbnN0YW50LlxuXHQnYnVpbHRpbic6IC9cXGIoPzphYnN1cmR8YWRkfGFwfGFwcGVuZHxhcHBseXxiZXR3ZWVufGJpbmR8Ym90dG9tfGNsYW1wfGNvbXBhcmV8Y29tcGFyaW5nfGNvbXBvc2V8Y29uanxjb25zdHxkZWdyZWV8ZGlzY2FyZHxkaXNqfGRpdnxlcXxmbGFwfGZsaXB8Z2NkfGlkZW50aXR5fGlmTXxqb2lufGxjbXxsaWZ0QTF8bGlmdE0xfG1hcHxtYXh8bWVtcHR5fG1pbnxtb2R8bXVsfG5lZ2F0ZXxub3R8bm90RXF8b25lfG90aGVyd2lzZXxyZWNpcHxzaG93fHN1Ynx0b3B8dW5pdHx1bmxlc3N8dW5sZXNzTXx2b2lkfHdoZW58d2hlbk18emVybylcXGIvLFxuXG5cdCdvcGVyYXRvcic6IFtcblx0XHQvLyBJbmZpeCBvcGVyYXRvcnNcblx0XHRQcmlzbS5sYW5ndWFnZXMuaGFza2VsbC5vcGVyYXRvclswXSxcblx0XHQvLyBBU0NJSSBvcGVyYXRvcnNcblx0XHRQcmlzbS5sYW5ndWFnZXMuaGFza2VsbC5vcGVyYXRvclsyXSxcblx0XHQvLyBBbGwgVVRGMTYgVW5pY29kZSBvcGVyYXRvciBzeW1ib2xzXG5cdFx0Ly8gVGhpcyByZWdleCBpcyBlcXVpdmFsZW50IHRvIC8oPz1bXFx4ODAtXFx1RkZGRl0pW1xccHtnYz1NYXRoX1N5bWJvbH1cXHB7Z2M9Q3VycmVuY3lfU3ltYm9sfVxccHtNb2RpZmllcl9TeW1ib2x9XFxwe090aGVyX1N5bWJvbH1dL3Vcblx0XHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL1ByaXNtSlMvcHJpc20vaXNzdWVzLzMwMDYgZm9yIG1vcmUgZGV0YWlscy5cblx0XHQvW1xceGEyLVxceGE2XFx4YThcXHhhOVxceGFjXFx4YWUtXFx4YjFcXHhiNFxceGI4XFx4ZDdcXHhmN1xcdTAyYzItXFx1MDJjNVxcdTAyZDItXFx1MDJkZlxcdTAyZTUtXFx1MDJlYlxcdTAyZWRcXHUwMmVmLVxcdTAyZmZcXHUwMzc1XFx1MDM4NFxcdTAzODVcXHUwM2Y2XFx1MDQ4MlxcdTA1OGQtXFx1MDU4ZlxcdTA2MDYtXFx1MDYwOFxcdTA2MGJcXHUwNjBlXFx1MDYwZlxcdTA2ZGVcXHUwNmU5XFx1MDZmZFxcdTA2ZmVcXHUwN2Y2XFx1MDdmZVxcdTA3ZmZcXHUwOWYyXFx1MDlmM1xcdTA5ZmFcXHUwOWZiXFx1MGFmMVxcdTBiNzBcXHUwYmYzLVxcdTBiZmFcXHUwYzdmXFx1MGQ0ZlxcdTBkNzlcXHUwZTNmXFx1MGYwMS1cXHUwZjAzXFx1MGYxM1xcdTBmMTUtXFx1MGYxN1xcdTBmMWEtXFx1MGYxZlxcdTBmMzRcXHUwZjM2XFx1MGYzOFxcdTBmYmUtXFx1MGZjNVxcdTBmYzctXFx1MGZjY1xcdTBmY2VcXHUwZmNmXFx1MGZkNS1cXHUwZmQ4XFx1MTA5ZVxcdTEwOWZcXHUxMzkwLVxcdTEzOTlcXHUxNjZkXFx1MTdkYlxcdTE5NDBcXHUxOWRlLVxcdTE5ZmZcXHUxYjYxLVxcdTFiNmFcXHUxYjc0LVxcdTFiN2NcXHUxZmJkXFx1MWZiZi1cXHUxZmMxXFx1MWZjZC1cXHUxZmNmXFx1MWZkZC1cXHUxZmRmXFx1MWZlZC1cXHUxZmVmXFx1MWZmZFxcdTFmZmVcXHUyMDQ0XFx1MjA1MlxcdTIwN2EtXFx1MjA3Y1xcdTIwOGEtXFx1MjA4Y1xcdTIwYTAtXFx1MjBiZlxcdTIxMDBcXHUyMTAxXFx1MjEwMy1cXHUyMTA2XFx1MjEwOFxcdTIxMDlcXHUyMTE0XFx1MjExNi1cXHUyMTE4XFx1MjExZS1cXHUyMTIzXFx1MjEyNVxcdTIxMjdcXHUyMTI5XFx1MjEyZVxcdTIxM2FcXHUyMTNiXFx1MjE0MC1cXHUyMTQ0XFx1MjE0YS1cXHUyMTRkXFx1MjE0ZlxcdTIxOGFcXHUyMThiXFx1MjE5MC1cXHUyMzA3XFx1MjMwYy1cXHUyMzI4XFx1MjMyYi1cXHUyNDI2XFx1MjQ0MC1cXHUyNDRhXFx1MjQ5Yy1cXHUyNGU5XFx1MjUwMC1cXHUyNzY3XFx1Mjc5NC1cXHUyN2M0XFx1MjdjNy1cXHUyN2U1XFx1MjdmMC1cXHUyOTgyXFx1Mjk5OS1cXHUyOWQ3XFx1MjlkYy1cXHUyOWZiXFx1MjlmZS1cXHUyYjczXFx1MmI3Ni1cXHUyYjk1XFx1MmI5Ny1cXHUyYmZmXFx1MmNlNS1cXHUyY2VhXFx1MmU1MFxcdTJlNTFcXHUyZTgwLVxcdTJlOTlcXHUyZTliLVxcdTJlZjNcXHUyZjAwLVxcdTJmZDVcXHUyZmYwLVxcdTJmZmJcXHUzMDA0XFx1MzAxMlxcdTMwMTNcXHUzMDIwXFx1MzAzNlxcdTMwMzdcXHUzMDNlXFx1MzAzZlxcdTMwOWJcXHUzMDljXFx1MzE5MFxcdTMxOTFcXHUzMTk2LVxcdTMxOWZcXHUzMWMwLVxcdTMxZTNcXHUzMjAwLVxcdTMyMWVcXHUzMjJhLVxcdTMyNDdcXHUzMjUwXFx1MzI2MC1cXHUzMjdmXFx1MzI4YS1cXHUzMmIwXFx1MzJjMC1cXHUzM2ZmXFx1NGRjMC1cXHU0ZGZmXFx1YTQ5MC1cXHVhNGM2XFx1YTcwMC1cXHVhNzE2XFx1YTcyMFxcdWE3MjFcXHVhNzg5XFx1YTc4YVxcdWE4MjgtXFx1YTgyYlxcdWE4MzYtXFx1YTgzOVxcdWFhNzctXFx1YWE3OVxcdWFiNWJcXHVhYjZhXFx1YWI2YlxcdWZiMjlcXHVmYmIyLVxcdWZiYzFcXHVmZGZjXFx1ZmRmZFxcdWZlNjJcXHVmZTY0LVxcdWZlNjZcXHVmZTY5XFx1ZmYwNFxcdWZmMGJcXHVmZjFjLVxcdWZmMWVcXHVmZjNlXFx1ZmY0MFxcdWZmNWNcXHVmZjVlXFx1ZmZlMC1cXHVmZmU2XFx1ZmZlOC1cXHVmZmVlXFx1ZmZmY1xcdWZmZmRdL1xuXHRdXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLnB1cnMgPSBQcmlzbS5sYW5ndWFnZXMucHVyZXNjcmlwdDtcblxuUHJpc20ubGFuZ3VhZ2VzLnB5dGhvbiA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pIy4qLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nLWludGVycG9sYXRpb24nOiB7XG5cdFx0cGF0dGVybjogLyg/OmZ8ZnJ8cmYpKD86KFwiXCJcInwnJycpW1xcc1xcU10qP1xcMXwoXCJ8JykoPzpcXFxcLnwoPyFcXDIpW15cXFxcXFxyXFxuXSkqXFwyKS9pLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHQvLyBcIntcIiA8ZXhwcmVzc2lvbj4gPG9wdGlvbmFsIFwiIXNcIiwgXCIhclwiLCBvciBcIiFhXCI+IDxvcHRpb25hbCBcIjpcIiBmb3JtYXQgc3BlY2lmaWVyPiBcIn1cIlxuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W157XSkoPzpcXHtcXHspKilcXHsoPyFcXHspKD86W157fV18XFx7KD8hXFx7KSg/Oltee31dfFxceyg/IVxceykoPzpbXnt9XSkrXFx9KStcXH0pK1xcfS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdmb3JtYXQtc3BlYyc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC8oOilbXjooKXt9XSsoPz1cXH0kKS8sXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQnY29udmVyc2lvbi1vcHRpb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvIVtzcmFdKD89Wzp9XSQpLyxcblx0XHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRyZXN0OiBudWxsXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHR9XG5cdH0sXG5cdCd0cmlwbGUtcXVvdGVkLXN0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKD86W3J1Yl18YnJ8cmIpPyhcIlwiXCJ8JycnKVtcXHNcXFNdKj9cXDEvaSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdzdHJpbmcnXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyg/OltydWJdfGJyfHJiKT8oXCJ8JykoPzpcXFxcLnwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxL2ksXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdmdW5jdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxzKWRlZlsgXFx0XSspW2EtekEtWl9dXFx3Kig/PVxccypcXCgpL2csXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnY2xhc3MtbmFtZSc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYmNsYXNzXFxzKylcXHcrL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnZGVjb3JhdG9yJzoge1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSopQFxcdysoPzpcXC5cXHcrKSovbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiBbJ2Fubm90YXRpb24nLCAncHVuY3R1YXRpb24nXSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0fVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzpfKD89XFxzKjopfGFuZHxhc3xhc3NlcnR8YXN5bmN8YXdhaXR8YnJlYWt8Y2FzZXxjbGFzc3xjb250aW51ZXxkZWZ8ZGVsfGVsaWZ8ZWxzZXxleGNlcHR8ZXhlY3xmaW5hbGx5fGZvcnxmcm9tfGdsb2JhbHxpZnxpbXBvcnR8aW58aXN8bGFtYmRhfG1hdGNofG5vbmxvY2FsfG5vdHxvcnxwYXNzfHByaW50fHJhaXNlfHJldHVybnx0cnl8d2hpbGV8d2l0aHx5aWVsZClcXGIvLFxuXHQnYnVpbHRpbic6IC9cXGIoPzpfX2ltcG9ydF9ffGFic3xhbGx8YW55fGFwcGx5fGFzY2lpfGJhc2VzdHJpbmd8YmlufGJvb2x8YnVmZmVyfGJ5dGVhcnJheXxieXRlc3xjYWxsYWJsZXxjaHJ8Y2xhc3NtZXRob2R8Y21wfGNvZXJjZXxjb21waWxlfGNvbXBsZXh8ZGVsYXR0cnxkaWN0fGRpcnxkaXZtb2R8ZW51bWVyYXRlfGV2YWx8ZXhlY2ZpbGV8ZmlsZXxmaWx0ZXJ8ZmxvYXR8Zm9ybWF0fGZyb3plbnNldHxnZXRhdHRyfGdsb2JhbHN8aGFzYXR0cnxoYXNofGhlbHB8aGV4fGlkfGlucHV0fGludHxpbnRlcm58aXNpbnN0YW5jZXxpc3N1YmNsYXNzfGl0ZXJ8bGVufGxpc3R8bG9jYWxzfGxvbmd8bWFwfG1heHxtZW1vcnl2aWV3fG1pbnxuZXh0fG9iamVjdHxvY3R8b3BlbnxvcmR8cG93fHByb3BlcnR5fHJhbmdlfHJhd19pbnB1dHxyZWR1Y2V8cmVsb2FkfHJlcHJ8cmV2ZXJzZWR8cm91bmR8c2V0fHNldGF0dHJ8c2xpY2V8c29ydGVkfHN0YXRpY21ldGhvZHxzdHJ8c3VtfHN1cGVyfHR1cGxlfHR5cGV8dW5pY2hyfHVuaWNvZGV8dmFyc3x4cmFuZ2V8emlwKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OkZhbHNlfE5vbmV8VHJ1ZSlcXGIvLFxuXHQnbnVtYmVyJzogL1xcYjAoPzpiKD86Xz9bMDFdKSt8byg/Ol8/WzAtN10pK3x4KD86Xz9bYS1mMC05XSkrKVxcYnwoPzpcXGJcXGQrKD86X1xcZCspKig/OlxcLig/OlxcZCsoPzpfXFxkKykqKT8pP3xcXEJcXC5cXGQrKD86X1xcZCspKikoPzplWystXT9cXGQrKD86X1xcZCspKik/aj8oPyFcXHcpL2ksXG5cdCdvcGVyYXRvcic6IC9bLSslPV09P3whPXw6PXxcXCpcXCo/PT98XFwvXFwvPz0/fDxbPD0+XT98Pls9Pl0/fFsmfF5+XS8sXG5cdCdwdW5jdHVhdGlvbic6IC9be31bXFxdOygpLC46XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5weXRob25bJ3N0cmluZy1pbnRlcnBvbGF0aW9uJ10uaW5zaWRlWydpbnRlcnBvbGF0aW9uJ10uaW5zaWRlLnJlc3QgPSBQcmlzbS5sYW5ndWFnZXMucHl0aG9uO1xuXG5QcmlzbS5sYW5ndWFnZXMucHkgPSBQcmlzbS5sYW5ndWFnZXMucHl0aG9uO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0LyoqXG5cdCAqIFJlcGxhY2VzIGFsbCBwbGFjZWhvbGRlcnMgXCI8PG4+PlwiIG9mIGdpdmVuIHBhdHRlcm4gd2l0aCB0aGUgbi10aCByZXBsYWNlbWVudCAoemVybyBiYXNlZCkuXG5cdCAqXG5cdCAqIE5vdGU6IFRoaXMgaXMgYSBzaW1wbGUgdGV4dCBiYXNlZCByZXBsYWNlbWVudC4gQmUgY2FyZWZ1bCB3aGVuIHVzaW5nIGJhY2tyZWZlcmVuY2VzIVxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVybiB0aGUgZ2l2ZW4gcGF0dGVybi5cblx0ICogQHBhcmFtIHtzdHJpbmdbXX0gcmVwbGFjZW1lbnRzIGEgbGlzdCBvZiByZXBsYWNlbWVudCB3aGljaCBjYW4gYmUgaW5zZXJ0ZWQgaW50byB0aGUgZ2l2ZW4gcGF0dGVybi5cblx0ICogQHJldHVybnMge3N0cmluZ30gdGhlIHBhdHRlcm4gd2l0aCBhbGwgcGxhY2Vob2xkZXJzIHJlcGxhY2VkIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyByZXBsYWNlbWVudHMuXG5cdCAqIEBleGFtcGxlIHJlcGxhY2UoL2E8PDA+PmEvLnNvdXJjZSwgWy9iKy8uc291cmNlXSkgPT09IC9hKD86YispYS8uc291cmNlXG5cdCAqL1xuXHRmdW5jdGlvbiByZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VtZW50cykge1xuXHRcdHJldHVybiBwYXR0ZXJuLnJlcGxhY2UoLzw8KFxcZCspPj4vZywgZnVuY3Rpb24gKG0sIGluZGV4KSB7XG5cdFx0XHRyZXR1cm4gJyg/OicgKyByZXBsYWNlbWVudHNbK2luZGV4XSArICcpJztcblx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm5cblx0ICogQHBhcmFtIHtzdHJpbmdbXX0gcmVwbGFjZW1lbnRzXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhZ3NdXG5cdCAqIEByZXR1cm5zIHtSZWdFeHB9XG5cdCAqL1xuXHRmdW5jdGlvbiByZShwYXR0ZXJuLCByZXBsYWNlbWVudHMsIGZsYWdzKSB7XG5cdFx0cmV0dXJuIFJlZ0V4cChyZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VtZW50cyksIGZsYWdzIHx8ICcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmVzdGVkIHBhdHRlcm4gd2hlcmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzdHJpbmcgYDw8c2VsZj4+YCBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgcGF0dGVybiBpdHNlbGYuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXR0ZXJuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkZXB0aExvZzJcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdGZ1bmN0aW9uIG5lc3RlZChwYXR0ZXJuLCBkZXB0aExvZzIpIHtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRlcHRoTG9nMjsgaSsrKSB7XG5cdFx0XHRwYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlKC88PHNlbGY+Pi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiAnKD86JyArIHBhdHRlcm4gKyAnKSc7IH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gcGF0dGVybi5yZXBsYWNlKC88PHNlbGY+Pi9nLCAnW15cXFxcc1xcXFxTXScpO1xuXHR9XG5cblx0Ly8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvcXVhbnR1bS91c2VyLWd1aWRlL2xhbmd1YWdlL3R5cGVzeXN0ZW0vXG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvcXNoYXJwLWxhbmd1YWdlL3RyZWUvbWFpbi9TcGVjaWZpY2F0aW9ucy9MYW5ndWFnZS81X0dyYW1tYXJcblx0dmFyIGtleXdvcmRLaW5kcyA9IHtcblx0XHQvLyBrZXl3b3JkcyB3aGljaCByZXByZXNlbnQgYSByZXR1cm4gb3IgdmFyaWFibGUgdHlwZVxuXHRcdHR5cGU6ICdBZGogQmlnSW50IEJvb2wgQ3RsIERvdWJsZSBmYWxzZSBJbnQgT25lIFBhdWxpIFBhdWxpSSBQYXVsaVggUGF1bGlZIFBhdWxpWiBRdWJpdCBSYW5nZSBSZXN1bHQgU3RyaW5nIHRydWUgVW5pdCBaZXJvJyxcblx0XHQvLyBhbGwgb3RoZXIga2V5d29yZHNcblx0XHRvdGhlcjogJ0Fkam9pbnQgYWRqb2ludCBhcHBseSBhcyBhdXRvIGJvZHkgYm9ycm93IGJvcnJvd2luZyBDb250cm9sbGVkIGNvbnRyb2xsZWQgZGlzdHJpYnV0ZSBlbGlmIGVsc2UgZmFpbCBmaXh1cCBmb3IgZnVuY3Rpb24gaWYgaW4gaW50ZXJuYWwgaW50cmluc2ljIGludmVydCBpcyBsZXQgbXV0YWJsZSBuYW1lc3BhY2UgbmV3IG5ld3R5cGUgb3BlbiBvcGVyYXRpb24gcmVwZWF0IHJldHVybiBzZWxmIHNldCB1bnRpbCB1c2UgdXNpbmcgd2hpbGUgd2l0aGluJ1xuXHR9O1xuXHQvLyBrZXl3b3Jkc1xuXHRmdW5jdGlvbiBrZXl3b3Jkc1RvUGF0dGVybih3b3Jkcykge1xuXHRcdHJldHVybiAnXFxcXGIoPzonICsgd29yZHMudHJpbSgpLnJlcGxhY2UoLyAvZywgJ3wnKSArICcpXFxcXGInO1xuXHR9XG5cdHZhciBrZXl3b3JkcyA9IFJlZ0V4cChrZXl3b3Jkc1RvUGF0dGVybihrZXl3b3JkS2luZHMudHlwZSArICcgJyArIGtleXdvcmRLaW5kcy5vdGhlcikpO1xuXG5cdC8vIHR5cGVzXG5cdHZhciBpZGVudGlmaWVyID0gL1xcYltBLVphLXpfXVxcdypcXGIvLnNvdXJjZTtcblx0dmFyIHF1YWxpZmllZE5hbWUgPSByZXBsYWNlKC88PDA+Pig/OlxccypcXC5cXHMqPDwwPj4pKi8uc291cmNlLCBbaWRlbnRpZmllcl0pO1xuXG5cdHZhciB0eXBlSW5zaWRlID0ge1xuXHRcdCdrZXl3b3JkJzoga2V5d29yZHMsXG5cdFx0J3B1bmN0dWF0aW9uJzogL1s8PigpPywuOltcXF1dL1xuXHR9O1xuXG5cdC8vIHN0cmluZ3Ncblx0dmFyIHJlZ3VsYXJTdHJpbmcgPSAvXCIoPzpcXFxcLnxbXlxcXFxcIl0pKlwiLy5zb3VyY2U7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnFzaGFycCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHRcdCdjb21tZW50JzogL1xcL1xcLy4qLyxcblx0XHQnc3RyaW5nJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiByZSgvKF58W14kXFxcXF0pPDwwPj4vLnNvdXJjZSwgW3JlZ3VsYXJTdHJpbmddKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnY2xhc3MtbmFtZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gb3BlbiBNaWNyb3NvZnQuUXVhbnR1bS5DYW5vbjtcblx0XHRcdFx0Ly8gb3BlbiBNaWNyb3NvZnQuUXVhbnR1bS5DYW5vbiBhcyBDTjtcblx0XHRcdFx0cGF0dGVybjogcmUoLyhcXGIoPzphc3xvcGVuKVxccyspPDwwPj4oPz1cXHMqKD86O3xhc1xcYikpLy5zb3VyY2UsIFtxdWFsaWZpZWROYW1lXSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogdHlwZUluc2lkZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gbmFtZXNwYWNlIFF1YW50dW0uQXBwMTtcblx0XHRcdFx0cGF0dGVybjogcmUoLyhcXGJuYW1lc3BhY2VcXHMrKTw8MD4+KD89XFxzKlxceykvLnNvdXJjZSwgW3F1YWxpZmllZE5hbWVdKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB0eXBlSW5zaWRlXG5cdFx0XHR9LFxuXHRcdF0sXG5cdFx0J2tleXdvcmQnOiBrZXl3b3Jkcyxcblx0XHQnbnVtYmVyJzogLyg/OlxcYjAoPzp4W1xcZGEtZl0rfGJbMDFdK3xvWzAtN10rKXwoPzpcXEJcXC5cXGQrfFxcYlxcZCsoPzpcXC5cXGQqKT8pKD86ZVstK10/XFxkKyk/KWw/XFxiL2ksXG5cdFx0J29wZXJhdG9yJzogL1xcYmFuZD18XFxib3I9fFxcYmFuZFxcYnxcXGJub3RcXGJ8XFxib3JcXGJ8PFstPV18Wy09XT58Pj4+PT98PDw8PT98XFxeXFxeXFxePT98XFx8XFx8XFx8PT98JiYmPT98d1xcLz0/fH5+fnxbKlxcLytcXC1ePSElXT0/Lyxcblx0XHQncHVuY3R1YXRpb24nOiAvOjp8W3t9W1xcXTsoKSwuOl0vXG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3FzaGFycCcsICdudW1iZXInLCB7XG5cdFx0J3JhbmdlJzoge1xuXHRcdFx0cGF0dGVybjogL1xcLlxcLi8sXG5cdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdH1cblx0fSk7XG5cblx0Ly8gc2luZ2xlIGxpbmVcblx0dmFyIGludGVycG9sYXRpb25FeHByID0gbmVzdGVkKHJlcGxhY2UoL1xceyg/OlteXCJ7fV18PDwwPj58PDxzZWxmPj4pKlxcfS8uc291cmNlLCBbcmVndWxhclN0cmluZ10pLCAyKTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdxc2hhcnAnLCAnc3RyaW5nJywge1xuXHRcdCdpbnRlcnBvbGF0aW9uLXN0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IHJlKC9cXCRcIig/OlxcXFwufDw8MD4+fFteXFxcXFwie10pKlwiLy5zb3VyY2UsIFtpbnRlcnBvbGF0aW9uRXhwcl0pLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IHJlKC8oKD86XnxbXlxcXFxdKSg/OlxcXFxcXFxcKSopPDwwPj4vLnNvdXJjZSwgW2ludGVycG9sYXRpb25FeHByXSksXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFx7fFxcfSQvLFxuXHRcdFx0XHRcdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRcdFx0XHRhbGlhczogJ2xhbmd1YWdlLXFzaGFycCcsXG5cdFx0XHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnFzaGFycFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMucXMgPSBQcmlzbS5sYW5ndWFnZXMucXNoYXJwO1xuXG5QcmlzbS5sYW5ndWFnZXMucSA9IHtcblx0J3N0cmluZyc6IC9cIig/OlxcXFwufFteXCJcXFxcXFxyXFxuXSkqXCIvLFxuXHQnY29tbWVudCc6IFtcblx0XHQvLyBGcm9tIGh0dHA6Ly9jb2RlLmt4LmNvbS93aWtpL1JlZmVyZW5jZS9TbGFzaDpcblx0XHQvLyBXaGVuIC8gaXMgZm9sbG93aW5nIGEgc3BhY2UgKG9yIGEgcmlnaHQgcGFyZW50aGVzaXMsIGJyYWNrZXQsIG9yIGJyYWNlKSwgaXQgaXMgaWdub3JlZCB3aXRoIHRoZSByZXN0IG9mIHRoZSBsaW5lLlxuXHRcdHtcblxuXHRcdFx0cGF0dGVybjogLyhbXFx0IClcXF19XSlcXC8uKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQvLyBGcm9tIGh0dHA6Ly9jb2RlLmt4LmNvbS93aWtpL1JlZmVyZW5jZS9TbGFzaDpcblx0XHQvLyBBIGxpbmUgd2hpY2ggaGFzIC8gYXMgaXRzIGZpcnN0IGNoYXJhY3RlciBhbmQgY29udGFpbnMgYXQgbGVhc3Qgb25lIG90aGVyIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBhIHdob2xlLWxpbmUgY29tbWVudCBhbmQgaXMgaWdub3JlZCBlbnRpcmVseS5cblx0XHQvLyBBIC8gb24gYSBsaW5lIGJ5IGl0c2VsZiBiZWdpbnMgYSBtdWx0aWxpbmUgY29tbWVudCB3aGljaCBpcyB0ZXJtaW5hdGVkIGJ5IHRoZSBuZXh0IFxcIG9uIGEgbGluZSBieSBpdHNlbGYuXG5cdFx0Ly8gSWYgYSAvIGlzIG5vdCBtYXRjaGVkIGJ5IGEgXFwsIHRoZSBtdWx0aWxpbmUgY29tbWVudCBpcyB1bnRlcm1pbmF0ZWQgYW5kIGNvbnRpbnVlcyB0byBlbmQgb2YgZmlsZS5cblx0XHQvLyBUaGUgLyBhbmQgXFwgbXVzdCBiZSB0aGUgZmlyc3QgY2hhciBvbiB0aGUgbGluZSwgYnV0IG1heSBiZSBmb2xsb3dlZCBieSBhbnkgYW1vdW50IG9mIHdoaXRlc3BhY2UuXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFxccj9cXG58XFxyKVxcL1tcXHQgXSooPzooPzpcXHI/XFxufFxccikoPzouKig/Olxccj9cXG58XFxyKD8hXFxuKSkpKj8oPzpcXFxcKD89W1xcdCBdKig/Olxccj9cXG58XFxyKSl8JCl8XFxTLiopLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdC8vIEZyb20gaHR0cDovL2NvZGUua3guY29tL3dpa2kvUmVmZXJlbmNlL1NsYXNoOlxuXHRcdC8vIEEgXFwgb24gYSBsaW5lIGJ5IGl0c2VsZiB3aXRoIG5vIHByZWNlZGluZyBtYXRjaGluZyAvIHdpbGwgY29tbWVudCB0byBlbmQgb2YgZmlsZS5cblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXlxcXFxbXFx0IF0qKD86XFxyP1xcbnxcXHIpW1xcc1xcU10rL20sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9eIyEuKy9tLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQnc3ltYm9sJzogL2AoPzo6XFxTK3xbXFx3Ll0qKS8sXG5cdCdkYXRldGltZSc6IHtcblx0XHRwYXR0ZXJuOiAvME5bbWR6dXZ0XXwwV1tkdHpdfFxcZHs0fVxcLlxcZFxcZCg/Om18XFwuXFxkXFxkKD86VCg/OlxcZFxcZCg/OjpcXGRcXGQoPzo6XFxkXFxkKD86Wy46XVxcZFxcZFxcZCk/KT8pPyk/KT9bZHpdPyl8XFxkXFxkOlxcZFxcZCg/OjpcXGRcXGQoPzpbLjpdXFxkXFxkXFxkKT8pP1t1dnRdPy8sXG5cdFx0YWxpYXM6ICdudW1iZXInXG5cdH0sXG5cdC8vIFRoZSBuZWdhdGl2ZSBsb29rLWFoZWFkIHByZXZlbnRzIGJhZCBoaWdobGlnaHRpbmdcblx0Ly8gb2YgdmVyYnMgMDogYW5kIDE6XG5cdCdudW1iZXInOiAvXFxiKD8hWzAxXTopKD86ME5baGplXT98MFdbaGpdP3wwW3duXXwweFtcXGRhLWZBLUZdK3xcXGQrKD86XFwuXFxkKik/KD86ZVsrLV0/XFxkKyk/W2hqZmViXT8pLyxcblx0J2tleXdvcmQnOiAvXFxcXFxcdytcXGJ8XFxiKD86YWJzfGFjb3N8YWowP3xhbGx8YW5kfGFueXxhc2N8YXNpbnxhc29mfGF0YW58YXR0cnxhdmdzP3xiaW5yP3xieXxjZWlsaW5nfGNvbHN8Y29yfGNvc3xjb3VudHxjb3Z8Y3Jvc3N8Y3N2fGN1dHxkZWxldGV8ZGVsdGFzfGRlc2N8ZGV2fGRpZmZlcnxkaXN0aW5jdHxkaXZ8ZG98ZHNhdmV8ZWp8ZW5saXN0fGV2YWx8ZXhjZXB0fGV4ZWN8ZXhpdHxleHB8ZmJ5fGZpbGxzfGZpcnN0fGZrZXlzfGZsaXB8Zmxvb3J8ZnJvbXxnZXR8Z2V0ZW52fGdyb3VwfGd0aW1lfGhjbG9zZXxoY291bnR8aGRlbHxob3Blbnxoc3ltfGlhc2N8aWRlbnRpdHl8aWRlc2N8aWZ8aWp8aW58aW5zZXJ0fGludGVyfGludnxrZXlzP3xsYXN0fGxpa2V8bGlzdHxsamY/fGxvYWR8bG9nfGxvd2VyfGxzcXxsdGltZXxsdHJpbXxtYXZnfG1heHM/fG1jb3VudHxtZDV8bWRldnxtZWR8bWV0YXxtaW5zP3xtbWF4fG1taW58bW11fG1vZHxtc3VtfG5lZ3xuZXh0fG5vdHxudWxsfG9yfG92ZXJ8cGFyc2V8cGVhY2h8cGp8cGxpc3R8cHJkcz98cHJldnxwcmlvcnxyYW5kfHJhbmt8cmF0aW9zfHJhemV8cmVhZDB8cmVhZDF8cmVjaXByb2NhbHxyZXZhbHxyZXZlcnNlfHJsb2FkfHJvdGF0ZXxyc2F2ZXxydHJpbXxzYXZlfHNjYW58c2NvdnxzZGV2fHNlbGVjdHxzZXR8c2V0ZW52fHNob3d8c2lnbnVtfHNpbnxzcXJ0fHNzcj98c3RyaW5nfHN1Ymxpc3R8c3Vtcz98c3Z8c3ZhcnxzeXN0ZW18dGFibGVzfHRhbnx0aWx8dHJpbXx0eGZ8dHlwZXx1anx1bmdyb3VwfHVuaW9ufHVwZGF0ZXx1cHBlcnx1cHNlcnR8dmFsdWV8dmFyfHZpZXdzP3x2c3x3YXZnfHdoZXJlfHdoaWxlfHdpdGhpbnx3ajE/fHdzdW18d3d8eGFzY3x4YmFyfHhjb2xzP3x4ZGVzY3x4ZXhwfHhncm91cHx4a2V5fHhsb2d8eHByZXZ8eHJhbmspXFxiLyxcblx0J2FkdmVyYic6IHtcblx0XHRwYXR0ZXJuOiAvWydcXC9cXFxcXTo/fFxcYmVhY2hcXGIvLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdH0sXG5cdCd2ZXJiJzoge1xuXHRcdHBhdHRlcm46IC8oPzpcXEJcXC5cXEJ8XFxiWzAxXTp8PFs9Pl0/fD49P3xbOitcXC0qJSwhP349fCQmI0BeXSk6P3xcXGJfXFxiOj8vLFxuXHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdH0sXG5cdCdwdW5jdHVhdGlvbic6IC9bKCl7fVxcW1xcXTsuXS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIganNTdHJpbmcgPSAvXCIoPzpcXFxcLnxbXlxcXFxcIlxcclxcbl0pKlwifCcoPzpcXFxcLnxbXlxcXFwnXFxyXFxuXSkqJy8uc291cmNlO1xuXHR2YXIganNDb21tZW50ID0gL1xcL1xcLy4qKD8hLil8XFwvXFwqKD86W14qXXxcXCooPyFcXC8pKSpcXCpcXC8vLnNvdXJjZTtcblxuXHR2YXIganNFeHByID0gLyg/OlteXFxcXCgpW1xcXXt9XCInL118PHN0cmluZz58XFwvKD8hWyovXSl8PGNvbW1lbnQ+fFxcKDxleHByPipcXCl8XFxbPGV4cHI+KlxcXXxcXHs8ZXhwcj4qXFx9fFxcXFxbXFxzXFxTXSkvXG5cdFx0LnNvdXJjZS5yZXBsYWNlKC88c3RyaW5nPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBqc1N0cmluZzsgfSkucmVwbGFjZSgvPGNvbW1lbnQ+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGpzQ29tbWVudDsgfSk7XG5cblx0Ly8gdGhlIHBhdHRlcm4gd2lsbCBibG93IHVwLCBzbyBvbmx5IGEgZmV3IGl0ZXJhdGlvbnNcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCAyOyBpKyspIHtcblx0XHRqc0V4cHIgPSBqc0V4cHIucmVwbGFjZSgvPGV4cHI+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGpzRXhwcjsgfSk7XG5cdH1cblx0anNFeHByID0ganNFeHByLnJlcGxhY2UoLzxleHByPi9nLCAnW15cXFxcc1xcXFxTXScpO1xuXG5cblx0UHJpc20ubGFuZ3VhZ2VzLnFtbCA9IHtcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXC9cXC8uKnxcXC9cXCpbXFxzXFxTXSo/XFwqXFwvLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2phdmFzY3JpcHQtZnVuY3Rpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLygoPzpefDspWyBcXHRdKilmdW5jdGlvblxccysoPyFcXHMpW18kYS16QS1aXFx4QTAtXFx1RkZGRl0oPzooPyFcXHMpWyRcXHdcXHhBMC1cXHVGRkZGXSkqXFxzKlxcKDxqcz4qXFwpXFxzKlxcezxqcz4qXFx9Ly5zb3VyY2UucmVwbGFjZSgvPGpzPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBqc0V4cHI7IH0pLCAnbScpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtamF2YXNjcmlwdCcsXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0XG5cdFx0fSxcblx0XHQnY2xhc3MtbmFtZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oKD86XnxbOjtdKVsgXFx0XSopKD8hXFxkKVxcdysoPz1bIFxcdF0qXFx7fFsgXFx0XStvblxcYikvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdwcm9wZXJ0eSc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFs7e10pWyBcXHRdKikoPyFcXGQpXFx3Kyg/OlxcLlxcdyspKig/PVsgXFx0XSo6KS9tLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58Wzt7XSlbIFxcdF0qKXByb3BlcnR5WyBcXHRdKyg/IVxcZClcXHcrKD86XFwuXFx3KykqWyBcXHRdKyg/IVxcZClcXHcrKD86XFwuXFx3KykqKD89WyBcXHRdKjopL20sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdrZXl3b3JkJzogL15wcm9wZXJ0eS8sXG5cdFx0XHRcdFx0J3Byb3BlcnR5JzogL1xcdysoPzpcXC5cXHcrKSovXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXHRcdCdqYXZhc2NyaXB0LWV4cHJlc3Npb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyg6WyBcXHRdKikoPyFbXFxzO31bXSkoPzooPyEkfFs7fV0pPGpzPikrLy5zb3VyY2UucmVwbGFjZSgvPGpzPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBqc0V4cHI7IH0pLCAnbScpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtamF2YXNjcmlwdCcsXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0XG5cdFx0fSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL1wiKD86XFxcXC58W15cXFxcXCJcXHJcXG5dKSpcIi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdrZXl3b3JkJzogL1xcYig/OmFzfGltcG9ydHxvbilcXGIvLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9be31bXFxdOjssXS9cblx0fTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMucW9yZSA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkoPzpcXC9cXCpbXFxzXFxTXSo/XFwqXFwvfCg/OlxcL1xcL3wjKS4qKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQvLyBPdmVycmlkZGVuIHRvIGFsbG93IHVuZXNjYXBlZCBtdWx0aS1saW5lIHN0cmluZ3Ncblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFwifCcpKD86XFxcXFtcXHNcXFNdfCg/IVxcMSlbXlxcXFxdKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzphYnN0cmFjdHxhbnl8YXNzZXJ0fGJpbmFyeXxib29sfGJvb2xlYW58YnJlYWt8Ynl0ZXxjYXNlfGNhdGNofGNoYXJ8Y2xhc3N8Y29kZXxjb25zdHxjb250aW51ZXxkYXRhfGRlZmF1bHR8ZG98ZG91YmxlfGVsc2V8ZW51bXxleHRlbmRzfGZpbmFsfGZpbmFsbHl8ZmxvYXR8Zm9yfGdvdG98aGFzaHxpZnxpbXBsZW1lbnRzfGltcG9ydHxpbmhlcml0c3xpbnN0YW5jZW9mfGludHxpbnRlcmZhY2V8bG9uZ3xteXxuYXRpdmV8bmV3fG5vdGhpbmd8bnVsbHxvYmplY3R8b3VyfG93bnxwcml2YXRlfHJlZmVyZW5jZXxyZXRocm93fHJldHVybnxzaG9ydHxzb2Z0KD86Ym9vbHxkYXRlfGZsb2F0fGludHxsaXN0fG51bWJlcnxzdHJpbmcpfHN0YXRpY3xzdHJpY3RmcHxzdHJpbmd8c3VifHN1cGVyfHN3aXRjaHxzeW5jaHJvbml6ZWR8dGhpc3x0aHJvd3x0aHJvd3N8dHJhbnNpZW50fHRyeXx2b2lkfHZvbGF0aWxlfHdoaWxlKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiL2ksXG5cdCdmdW5jdGlvbic6IC9cXCQ/XFxiKD8hXFxkKVxcdysoPz1cXCgpLyxcblx0J251bWJlcic6IC9cXGIoPzowYlswMV0rfDB4KD86W1xcZGEtZl0qXFwuKT9bXFxkYS1mcFxcLV0rfCg/OlxcZCsoPzpcXC5cXGQrKT98XFwuXFxkKykoPzplXFxkKyk/W2RmXXwoPzpcXGQrKD86XFwuXFxkKyk/fFxcLlxcZCspKVxcYi9pLFxuXHQnb3BlcmF0b3InOiB7XG5cdFx0cGF0dGVybjogLyhefFteLl0pKD86XFwrWys9XT98LVstPV0/fFshPV0oPzo9PT98fik/fD4+Pz0/fDwoPzo9Pj98PD0/KT98JlsmPV0/fFxcfFt8PV0/fFsqXFwvJV5dPT98W34/XSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J3ZhcmlhYmxlJzogL1xcJCg/IVxcZClcXHcrXFxiL1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5yID0ge1xuXHQnY29tbWVudCc6IC8jLiovLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oWydcIl0pKD86XFxcXC58KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdwZXJjZW50LW9wZXJhdG9yJzoge1xuXHRcdC8vIEluY2x1ZGVzIHVzZXItZGVmaW5lZCBvcGVyYXRvcnNcblx0XHQvLyBhbmQgJSUsICUqJSwgJS8lLCAlaW4lLCAlbyUsICV4JVxuXHRcdHBhdHRlcm46IC8lW14lXFxzXSolLyxcblx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHR9LFxuXHQnYm9vbGVhbic6IC9cXGIoPzpGQUxTRXxUUlVFKVxcYi8sXG5cdCdlbGxpcHNpcyc6IC9cXC5cXC4oPzpcXC58XFxkKykvLFxuXHQnbnVtYmVyJzogW1xuXHRcdC9cXGIoPzpJbmZ8TmFOKVxcYi8sXG5cdFx0Lyg/OlxcYjB4W1xcZEEtRmEtZl0rKD86XFwuXFxkKik/fFxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzpbRWVQcF1bKy1dP1xcZCspP1tpTF0/L1xuXHRdLFxuXHQna2V5d29yZCc6IC9cXGIoPzpOQXxOQV9jaGFyYWN0ZXJffE5BX2NvbXBsZXhffE5BX2ludGVnZXJffE5BX3JlYWxffE5VTEx8YnJlYWt8ZWxzZXxmb3J8ZnVuY3Rpb258aWZ8aW58bmV4dHxyZXBlYXR8d2hpbGUpXFxiLyxcblx0J29wZXJhdG9yJzogLy0+Pz4/fDwoPzo9fDw/LSk/fFs+PSFdPT98Ojo/fCYmP3xcXHxcXHw/fFsrKlxcL14kQH5dLyxcblx0J3B1bmN0dWF0aW9uJzogL1soKXt9XFxbXFxdLDtdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnJhY2tldCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ3NjaGVtZScsIHtcblx0J2xhbWJkYS1wYXJhbWV0ZXInOiB7XG5cdFx0Ly8gdGhlIHJhY2tldCBsYW1iZGEgc3ludGF4IGlzIGEgbG90IG1vcmUgY29tcGxleCwgc28gd2Ugd29uJ3QgZXZlbiBhdHRlbXB0IHRvIGNhcHR1cmUgaXQuXG5cdFx0Ly8gdGhpcyB3aWxsIGp1c3QgcHJldmVudCBmYWxzZSBwb3NpdGl2ZXMgb2YgdGhlIGBmdW5jdGlvbmAgcGF0dGVyblxuXHRcdHBhdHRlcm46IC8oWyhcXFtdbGFtYmRhXFxzK1soXFxbXSlbXigpXFxbXFxdJ1xcc10rLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdyYWNrZXQnLCAnc3RyaW5nJywge1xuXHQnbGFuZyc6IHtcblx0XHRwYXR0ZXJuOiAvXiNsYW5nLisvbSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLnJrdCA9IFByaXNtLmxhbmd1YWdlcy5yYWNrZXQ7XG5cbi8vIERvY3M6XG4vLyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9hc3BuZXQvY29yZS9yYXpvci1wYWdlcy8/dmlldz1hc3BuZXRjb3JlLTUuMCZ0YWJzPXZpc3VhbC1zdHVkaW9cbi8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2FzcG5ldC9jb3JlL212Yy92aWV3cy9yYXpvcj92aWV3PWFzcG5ldGNvcmUtNS4wXG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgY29tbWVudExpa2UgPSAvXFwvKD8hWy8qXSl8XFwvXFwvLipbXFxyXFxuXXxcXC9cXCpbXipdKig/OlxcKig/IVxcLylbXipdKikqXFwqXFwvLy5zb3VyY2U7XG5cdHZhciBzdHJpbmdMaWtlID1cblx0XHQvQCg/IVwiKXxcIig/OlteXFxyXFxuXFxcXFwiXXxcXFxcLikqXCJ8QFwiKD86W15cXFxcXCJdfFwiXCJ8XFxcXFtcXHNcXFNdKSpcIig/IVwiKS8uc291cmNlICtcblx0XHQnfCcgK1xuXHRcdC8nKD86KD86W15cXHJcXG4nXFxcXF18XFxcXC58XFxcXFtVdXhdW1xcZGEtZkEtRl17MSw4fSknfCg/PVteXFxcXF0oPyEnKSkpLy5zb3VyY2U7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXN0ZWQgcGF0dGVybiB3aGVyZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHN0cmluZyBgPDxzZWxmPj5gIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBwYXR0ZXJuIGl0c2VsZi5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm5cblx0ICogQHBhcmFtIHtudW1iZXJ9IGRlcHRoTG9nMlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKi9cblx0ZnVuY3Rpb24gbmVzdGVkKHBhdHRlcm4sIGRlcHRoTG9nMikge1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZGVwdGhMb2cyOyBpKyspIHtcblx0XHRcdHBhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2UoLzxzZWxmPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiAnKD86JyArIHBhdHRlcm4gKyAnKSc7IH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gcGF0dGVyblxuXHRcdFx0LnJlcGxhY2UoLzxzZWxmPi9nLCAnW15cXFxcc1xcXFxTXScpXG5cdFx0XHQucmVwbGFjZSgvPHN0cj4vZywgJyg/OicgKyBzdHJpbmdMaWtlICsgJyknKVxuXHRcdFx0LnJlcGxhY2UoLzxjb21tZW50Pi9nLCAnKD86JyArIGNvbW1lbnRMaWtlICsgJyknKTtcblx0fVxuXG5cdHZhciByb3VuZCA9IG5lc3RlZCgvXFwoKD86W14oKSdcIkAvXXw8c3RyPnw8Y29tbWVudD58PHNlbGY+KSpcXCkvLnNvdXJjZSwgMik7XG5cdHZhciBzcXVhcmUgPSBuZXN0ZWQoL1xcWyg/OlteXFxbXFxdJ1wiQC9dfDxzdHI+fDxjb21tZW50Pnw8c2VsZj4pKlxcXS8uc291cmNlLCAxKTtcblx0dmFyIGN1cmx5ID0gbmVzdGVkKC9cXHsoPzpbXnt9J1wiQC9dfDxzdHI+fDxjb21tZW50Pnw8c2VsZj4pKlxcfS8uc291cmNlLCAyKTtcblx0dmFyIGFuZ2xlID0gbmVzdGVkKC88KD86W148PidcIkAvXXw8Y29tbWVudD58PHNlbGY+KSo+Ly5zb3VyY2UsIDEpO1xuXG5cdHZhciBpbmxpbmVDcyA9IC9ALy5zb3VyY2UgK1xuXHRcdC8oPzphd2FpdFxcYlxccyopPy8uc291cmNlICtcblx0XHQnKD86JyArIC8oPyFhd2FpdFxcYilcXHcrXFxiLy5zb3VyY2UgKyAnfCcgKyByb3VuZCArICcpJyArXG5cdFx0Jyg/OicgKyAvWz8hXT9cXC5cXHcrXFxiLy5zb3VyY2UgKyAnfCcgKyAnKD86JyArIGFuZ2xlICsgJyk/JyArIHJvdW5kICsgJ3wnICsgc3F1YXJlICsgJykqJyArXG5cdFx0Lyg/IVs/IVxcLihcXFtdfDwoPyFcXC8pKS8uc291cmNlO1xuXG5cdC8vIE5vdGUgYWJvdXQgdGhlIGFib3ZlIGJyYWNrZXQgcGF0dGVybnM6XG5cdC8vIFRoZXkgYWxsIGlnbm9yZSBIVE1MIGV4cHJlc3Npb25zIHRoYXQgbWlnaHQgYmUgaW4gdGhlIEMjIGNvZGUuIFRoaXMgaXMgYSBwcm9ibGVtIGJlY2F1c2UgSFRNTCAobGlrZSBzdHJpbmdzIGFuZFxuXHQvLyBjb21tZW50cykgaXMgcGFyc2VkIGRpZmZlcmVudGx5LiBUaGlzIGlzIGEgaHVnZSBwcm9ibGVtIGJlY2F1c2UgSFRNTCBtaWdodCBjb250YWluIGJyYWNrZXRzIGFuZCBxdW90ZXMgd2hpY2hcblx0Ly8gbWVzc2VzIHVwIHRoZSBicmFja2V0IGFuZCBzdHJpbmcgY291bnRpbmcgaW1wbGVtZW50ZWQgYnkgdGhlIGFib3ZlIHBhdHRlcm5zLlxuXHQvL1xuXHQvLyBUaGlzIHByb2JsZW0gaXMgbm90IGZpeGFibGUgYmVjYXVzZSAxKSBIVE1MIGV4cHJlc3Npb24gYXJlIGhpZ2hseSBjb250ZXh0IHNlbnNpdGl2ZSBhbmQgdmVyeSBkaWZmaWN1bHQgdG8gZGV0ZWN0XG5cdC8vIGFuZCAyKSB0aGV5IHJlcXVpcmUgb25lIGNhcHR1cmluZyBncm91cCBhdCBldmVyeSBuZXN0ZWQgbGV2ZWwuIFNlZSB0aGUgYHRhZ1JlZ2lvbmAgcGF0dGVybiB0byBhZG1pcmUgdGhlXG5cdC8vIGNvbXBsZXhpdHkgb2YgYW4gSFRNTCBleHByZXNzaW9uLlxuXHQvL1xuXHQvLyBUbyBzb21ld2hhdCBhbGxldmlhdGUgdGhlIHByb2JsZW0gYSBiaXQsIHRoZSBwYXR0ZXJucyBmb3IgY2hhcmFjdGVycyAoZS5nLiAnYScpIGlzIHZlcnkgcGVybWlzc2l2ZSwgaXQgYWxzb1xuXHQvLyBhbGxvd3MgaW52YWxpZCBjaGFyYWN0ZXJzIHRvIHN1cHBvcnQgSFRNTCBleHByZXNzaW9ucyBsaWtlIHRoaXM6IDxwPlRoYXQncyBpdCE8L3A+LlxuXG5cdHZhciB0YWdBdHRySW5saW5lQ3MgPSAvQCg/IVtcXHcoKV0pLy5zb3VyY2UgKyAnfCcgKyBpbmxpbmVDcztcblx0dmFyIHRhZ0F0dHJWYWx1ZSA9ICcoPzonICtcblx0XHQvXCJbXlwiQF0qXCJ8J1teJ0BdKid8W15cXHMnXCJAPj1dKyg/PVtcXHM+XSkvLnNvdXJjZSArXG5cdFx0J3wnICtcblx0XHQnW1wiXFwnXVteXCJcXCdAXSooPzooPzonICsgdGFnQXR0cklubGluZUNzICsgJylbXlwiXFwnQF0qKStbXCJcXCddJyArXG5cdFx0JyknO1xuXG5cdHZhciB0YWdBdHRycyA9IC8oPzpcXHMoPzpcXHMqW15cXHM+XFwvPV0rKD86XFxzKj1cXHMqPHRhZ0F0dHJWYWx1ZT58KD89W1xccy8+XSkpKSspPy8uc291cmNlLnJlcGxhY2UoLzx0YWdBdHRyVmFsdWU+LywgdGFnQXR0clZhbHVlKTtcblx0dmFyIHRhZ0NvbnRlbnQgPSAvKD8hXFxkKVteXFxzPlxcLz0kPCVdKy8uc291cmNlICsgdGFnQXR0cnMgKyAvXFxzKlxcLz8+Ly5zb3VyY2U7XG5cdHZhciB0YWdSZWdpb24gPVxuXHRcdC9cXEJAPy8uc291cmNlICtcblx0XHQnKD86JyArXG5cdFx0LzwoW2EtekEtWl1bXFx3Ol0qKS8uc291cmNlICsgdGFnQXR0cnMgKyAvXFxzKj4vLnNvdXJjZSArXG5cdFx0Jyg/OicgK1xuXHRcdChcblx0XHRcdC9bXjxdLy5zb3VyY2UgK1xuXHRcdFx0J3wnICtcblx0XHRcdC8vIGFsbCB0YWdzIHRoYXQgYXJlIG5vdCB0aGUgc3RhcnQgdGFnXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL3N0cmljdFxuXHRcdFx0LzxcXC8/KD8hXFwxXFxiKS8uc291cmNlICsgdGFnQ29udGVudCArXG5cdFx0XHQnfCcgK1xuXHRcdFx0Ly8gbmVzdGVkIHN0YXJ0IHRhZ1xuXHRcdFx0bmVzdGVkKFxuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL3N0cmljdFxuXHRcdFx0XHQvPFxcMS8uc291cmNlICsgdGFnQXR0cnMgKyAvXFxzKj4vLnNvdXJjZSArXG5cdFx0XHRcdCcoPzonICtcblx0XHRcdFx0KFxuXHRcdFx0XHRcdC9bXjxdLy5zb3VyY2UgK1xuXHRcdFx0XHRcdCd8JyArXG5cdFx0XHRcdFx0Ly8gYWxsIHRhZ3MgdGhhdCBhcmUgbm90IHRoZSBzdGFydCB0YWdcblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL3N0cmljdFxuXHRcdFx0XHRcdC88XFwvPyg/IVxcMVxcYikvLnNvdXJjZSArIHRhZ0NvbnRlbnQgK1xuXHRcdFx0XHRcdCd8JyArXG5cdFx0XHRcdFx0JzxzZWxmPidcblx0XHRcdFx0KSArXG5cdFx0XHRcdCcpKicgK1xuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL3N0cmljdFxuXHRcdFx0XHQvPFxcL1xcMVxccyo+Ly5zb3VyY2UsXG5cdFx0XHRcdDJcblx0XHRcdClcblx0XHQpICtcblx0XHQnKSonICtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL3N0cmljdFxuXHRcdC88XFwvXFwxXFxzKj4vLnNvdXJjZSArXG5cdFx0J3wnICtcblx0XHQvPC8uc291cmNlICsgdGFnQ29udGVudCArXG5cdFx0JyknO1xuXG5cdC8vIE5vdyBmb3IgdGhlIGFjdHVhbCBsYW5ndWFnZSBkZWZpbml0aW9uKHMpOlxuXHQvL1xuXHQvLyBSYXpvciBhcyBhIGxhbmd1YWdlIGhhcyAyIHBhcnRzOlxuXHQvLyAgMSkgQ1NIVE1MOiBBIG1hcmt1cC1saWtlIGxhbmd1YWdlIHRoYXQgaGFzIGJlZW4gZXh0ZW5kZWQgd2l0aCBpbmxpbmUgQyMgY29kZSBleHByZXNzaW9ucyBhbmQgYmxvY2tzLlxuXHQvLyAgMikgQyMrSFRNTDogQSB2YXJpYW50IG9mIEMjIHRoYXQgY2FuIGNvbnRhaW4gQ1NIVE1MIHRhZ3MgYXMgZXhwcmVzc2lvbnMuXG5cdC8vXG5cdC8vIEluIHRoZSBiZWxvdyBjb2RlLCBib3RoIENTSFRNTCBhbmQgQyMrSFRNTCB3aWxsIGJlIGNyZWF0ZSBhcyBzZXBhcmF0ZSBsYW5ndWFnZSBkZWZpbml0aW9ucyB0aGF0IHJlZmVyZW5jZSBlYWNoXG5cdC8vIG90aGVyLiBIb3dldmVyLCBvbmx5IENTSFRNTCB3aWxsIGJlIGV4cG9ydGVkIHZpYSBgUHJpc20ubGFuZ3VhZ2VzYC5cblxuXHRQcmlzbS5sYW5ndWFnZXMuY3NodG1sID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnbWFya3VwJywge30pO1xuXG5cdHZhciBjc2hhcnBXaXRoSHRtbCA9IFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2NzaGFycCcsICdzdHJpbmcnLCB7XG5cdFx0J2h0bWwnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAodGFnUmVnaW9uKSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmNzaHRtbFxuXHRcdH0sXG5cdH0sIHsgY3NoYXJwOiBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjc2hhcnAnLCB7fSkgfSk7XG5cblx0dmFyIGNzID0ge1xuXHRcdHBhdHRlcm46IC9cXFNbXFxzXFxTXSovLFxuXHRcdGFsaWFzOiAnbGFuZ3VhZ2UtY3NoYXJwJyxcblx0XHRpbnNpZGU6IGNzaGFycFdpdGhIdG1sXG5cdH07XG5cblx0dmFyIGlubGluZVZhbHVlID0ge1xuXHRcdHBhdHRlcm46IFJlZ0V4cCgvKF58W15AXSkvLnNvdXJjZSArIGlubGluZUNzKSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ3ZhcmlhYmxlJyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdrZXl3b3JkJzogL15ALyxcblx0XHRcdCdjc2hhcnAnOiBjc1xuXHRcdH1cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuY3NodG1sLnRhZy5wYXR0ZXJuID0gUmVnRXhwKC88XFwvPy8uc291cmNlICsgdGFnQ29udGVudCk7XG5cdFByaXNtLmxhbmd1YWdlcy5jc2h0bWwudGFnLmluc2lkZVsnYXR0ci12YWx1ZSddLnBhdHRlcm4gPSBSZWdFeHAoLz1cXHMqLy5zb3VyY2UgKyB0YWdBdHRyVmFsdWUpO1xuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdpbnNpZGUnLCAncHVuY3R1YXRpb24nLCB7ICd2YWx1ZSc6IGlubGluZVZhbHVlIH0sIFByaXNtLmxhbmd1YWdlcy5jc2h0bWwudGFnLmluc2lkZVsnYXR0ci12YWx1ZSddKTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjc2h0bWwnLCAncHJvbG9nJywge1xuXHRcdCdyYXpvci1jb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogL0BcXCpbXFxzXFxTXSo/XFwqQC8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ2NvbW1lbnQnXG5cdFx0fSxcblxuXHRcdCdibG9jayc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdFx0LyhefFteQF0pQC8uc291cmNlICtcblx0XHRcdFx0Jyg/OicgK1xuXHRcdFx0XHRbXG5cdFx0XHRcdFx0Ly8gQHsgLi4uIH1cblx0XHRcdFx0XHRjdXJseSxcblx0XHRcdFx0XHQvLyBAY29kZXsgLi4uIH1cblx0XHRcdFx0XHQvKD86Y29kZXxmdW5jdGlvbnMpXFxzKi8uc291cmNlICsgY3VybHksXG5cdFx0XHRcdFx0Ly8gQGZvciAoLi4uKSB7IC4uLiB9XG5cdFx0XHRcdFx0Lyg/OmZvcnxmb3JlYWNofGxvY2t8c3dpdGNofHVzaW5nfHdoaWxlKVxccyovLnNvdXJjZSArIHJvdW5kICsgL1xccyovLnNvdXJjZSArIGN1cmx5LFxuXHRcdFx0XHRcdC8vIEBkbyB7IC4uLiB9IHdoaWxlICguLi4pO1xuXHRcdFx0XHRcdC9kb1xccyovLnNvdXJjZSArIGN1cmx5ICsgL1xccyp3aGlsZVxccyovLnNvdXJjZSArIHJvdW5kICsgLyg/Olxccyo7KT8vLnNvdXJjZSxcblx0XHRcdFx0XHQvLyBAdHJ5IHsgLi4uIH0gY2F0Y2ggKC4uLikgeyAuLi4gfSBmaW5hbGx5IHsgLi4uIH1cblx0XHRcdFx0XHQvdHJ5XFxzKi8uc291cmNlICsgY3VybHkgKyAvXFxzKmNhdGNoXFxzKi8uc291cmNlICsgcm91bmQgKyAvXFxzKi8uc291cmNlICsgY3VybHkgKyAvXFxzKmZpbmFsbHlcXHMqLy5zb3VyY2UgKyBjdXJseSxcblx0XHRcdFx0XHQvLyBAaWYgKC4uLikgey4uLn0gZWxzZSBpZiAoLi4uKSB7Li4ufSBlbHNlIHsuLi59XG5cdFx0XHRcdFx0L2lmXFxzKi8uc291cmNlICsgcm91bmQgKyAvXFxzKi8uc291cmNlICsgY3VybHkgKyAnKD86JyArIC9cXHMqZWxzZS8uc291cmNlICsgJyg/OicgKyAvXFxzK2lmXFxzKi8uc291cmNlICsgcm91bmQgKyAnKT8nICsgL1xccyovLnNvdXJjZSArIGN1cmx5ICsgJykqJyxcblx0XHRcdFx0XHQvLyBAaGVscGVyIElkZW50KHBhcmFtcykgeyAuLi4gfVxuXHRcdFx0XHRcdC9oZWxwZXJcXHMrXFx3K1xccyovLnNvdXJjZSArIHJvdW5kICsgL1xccyovLnNvdXJjZSArIGN1cmx5LFxuXHRcdFx0XHRdLmpvaW4oJ3wnKSArXG5cdFx0XHRcdCcpJ1xuXHRcdFx0KSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2tleXdvcmQnOiAvXkBcXHcqLyxcblx0XHRcdFx0J2NzaGFycCc6IGNzXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdCdkaXJlY3RpdmUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXihbIFxcdF0qKUAoPzphZGRUYWdIZWxwZXJ8YXR0cmlidXRlfGltcGxlbWVudHN8aW5oZXJpdHN8aW5qZWN0fGxheW91dHxtb2RlbHxuYW1lc3BhY2V8cGFnZXxwcmVzZXJ2ZXdoaXRlc3BhY2V8cmVtb3ZlVGFnSGVscGVyfHNlY3Rpb258dGFnSGVscGVyUHJlZml4fHVzaW5nKSg/PVxccykuKi9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQna2V5d29yZCc6IC9eQFxcdysvLFxuXHRcdFx0XHQnY3NoYXJwJzogY3Ncblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0J3ZhbHVlJzogaW5saW5lVmFsdWUsXG5cblx0XHQnZGVsZWdhdGUtb3BlcmF0b3InOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15AXSlAKD89PCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMucmF6b3IgPSBQcmlzbS5sYW5ndWFnZXMuY3NodG1sO1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgamF2YXNjcmlwdCA9IFByaXNtLnV0aWwuY2xvbmUoUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHQpO1xuXG5cdHZhciBzcGFjZSA9IC8oPzpcXHN8XFwvXFwvLiooPyEuKXxcXC9cXCooPzpbXipdfFxcKig/IVxcLykpXFwqXFwvKS8uc291cmNlO1xuXHR2YXIgYnJhY2VzID0gLyg/Olxceyg/Olxceyg/Olxce1tee31dKlxcfXxbXnt9XSkqXFx9fFtee31dKSpcXH0pLy5zb3VyY2U7XG5cdHZhciBzcHJlYWQgPSAvKD86XFx7PFM+KlxcLnszfSg/Oltee31dfDxCUkFDRVM+KSpcXH0pLy5zb3VyY2U7XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2Vcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtmbGFnc11cblx0ICovXG5cdGZ1bmN0aW9uIHJlKHNvdXJjZSwgZmxhZ3MpIHtcblx0XHRzb3VyY2UgPSBzb3VyY2Vcblx0XHRcdC5yZXBsYWNlKC88Uz4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gc3BhY2U7IH0pXG5cdFx0XHQucmVwbGFjZSgvPEJSQUNFUz4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gYnJhY2VzOyB9KVxuXHRcdFx0LnJlcGxhY2UoLzxTUFJFQUQ+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNwcmVhZDsgfSk7XG5cdFx0cmV0dXJuIFJlZ0V4cChzb3VyY2UsIGZsYWdzKTtcblx0fVxuXG5cdHNwcmVhZCA9IHJlKHNwcmVhZCkuc291cmNlO1xuXG5cblx0UHJpc20ubGFuZ3VhZ2VzLmpzeCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ21hcmt1cCcsIGphdmFzY3JpcHQpO1xuXHRQcmlzbS5sYW5ndWFnZXMuanN4LnRhZy5wYXR0ZXJuID0gcmUoXG5cdFx0LzxcXC8/KD86W1xcdy46LV0rKD86PFM+Kyg/OltcXHcuOiQtXSsoPzo9KD86XCIoPzpcXFxcW1xcc1xcU118W15cXFxcXCJdKSpcInwnKD86XFxcXFtcXHNcXFNdfFteXFxcXCddKSonfFteXFxzeydcIi8+PV0rfDxCUkFDRVM+KSk/fDxTUFJFQUQ+KSkqPFM+KlxcLz8pPz4vLnNvdXJjZVxuXHQpO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5qc3gudGFnLmluc2lkZVsndGFnJ10ucGF0dGVybiA9IC9ePFxcLz9bXlxccz5cXC9dKi87XG5cdFByaXNtLmxhbmd1YWdlcy5qc3gudGFnLmluc2lkZVsnYXR0ci12YWx1ZSddLnBhdHRlcm4gPSAvPSg/IVxceykoPzpcIig/OlxcXFxbXFxzXFxTXXxbXlxcXFxcIl0pKlwifCcoPzpcXFxcW1xcc1xcU118W15cXFxcJ10pKid8W15cXHMnXCI+XSspLztcblx0UHJpc20ubGFuZ3VhZ2VzLmpzeC50YWcuaW5zaWRlWyd0YWcnXS5pbnNpZGVbJ2NsYXNzLW5hbWUnXSA9IC9eW0EtWl1cXHcqKD86XFwuW0EtWl1cXHcqKSokLztcblx0UHJpc20ubGFuZ3VhZ2VzLmpzeC50YWcuaW5zaWRlWydjb21tZW50J10gPSBqYXZhc2NyaXB0Wydjb21tZW50J107XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnaW5zaWRlJywgJ2F0dHItbmFtZScsIHtcblx0XHQnc3ByZWFkJzoge1xuXHRcdFx0cGF0dGVybjogcmUoLzxTUFJFQUQ+Ly5zb3VyY2UpLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuanN4XG5cdFx0fVxuXHR9LCBQcmlzbS5sYW5ndWFnZXMuanN4LnRhZyk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnaW5zaWRlJywgJ3NwZWNpYWwtYXR0cicsIHtcblx0XHQnc2NyaXB0Jzoge1xuXHRcdFx0Ly8gQWxsb3cgZm9yIHR3byBsZXZlbHMgb2YgbmVzdGluZ1xuXHRcdFx0cGF0dGVybjogcmUoLz08QlJBQ0VTPi8uc291cmNlKSxcblx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtamF2YXNjcmlwdCcsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3NjcmlwdC1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXj0oPz1cXHspLyxcblx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRyZXN0OiBQcmlzbS5sYW5ndWFnZXMuanN4XG5cdFx0XHR9LFxuXHRcdH1cblx0fSwgUHJpc20ubGFuZ3VhZ2VzLmpzeC50YWcpO1xuXG5cdC8vIFRoZSBmb2xsb3dpbmcgd2lsbCBoYW5kbGUgcGxhaW4gdGV4dCBpbnNpZGUgdGFnc1xuXHR2YXIgc3RyaW5naWZ5VG9rZW4gPSBmdW5jdGlvbiAodG9rZW4pIHtcblx0XHRpZiAoIXRva2VuKSB7XG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRyZXR1cm4gdG9rZW47XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgdG9rZW4uY29udGVudCA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHJldHVybiB0b2tlbi5jb250ZW50O1xuXHRcdH1cblx0XHRyZXR1cm4gdG9rZW4uY29udGVudC5tYXAoc3RyaW5naWZ5VG9rZW4pLmpvaW4oJycpO1xuXHR9O1xuXG5cdHZhciB3YWxrVG9rZW5zID0gZnVuY3Rpb24gKHRva2Vucykge1xuXHRcdHZhciBvcGVuZWRUYWdzID0gW107XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciB0b2tlbiA9IHRva2Vuc1tpXTtcblx0XHRcdHZhciBub3RUYWdOb3JCcmFjZSA9IGZhbHNlO1xuXG5cdFx0XHRpZiAodHlwZW9mIHRva2VuICE9PSAnc3RyaW5nJykge1xuXHRcdFx0XHRpZiAodG9rZW4udHlwZSA9PT0gJ3RhZycgJiYgdG9rZW4uY29udGVudFswXSAmJiB0b2tlbi5jb250ZW50WzBdLnR5cGUgPT09ICd0YWcnKSB7XG5cdFx0XHRcdFx0Ly8gV2UgZm91bmQgYSB0YWcsIG5vdyBmaW5kIGl0cyBraW5kXG5cblx0XHRcdFx0XHRpZiAodG9rZW4uY29udGVudFswXS5jb250ZW50WzBdLmNvbnRlbnQgPT09ICc8LycpIHtcblx0XHRcdFx0XHRcdC8vIENsb3NpbmcgdGFnXG5cdFx0XHRcdFx0XHRpZiAob3BlbmVkVGFncy5sZW5ndGggPiAwICYmIG9wZW5lZFRhZ3Nbb3BlbmVkVGFncy5sZW5ndGggLSAxXS50YWdOYW1lID09PSBzdHJpbmdpZnlUb2tlbih0b2tlbi5jb250ZW50WzBdLmNvbnRlbnRbMV0pKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFBvcCBtYXRjaGluZyBvcGVuaW5nIHRhZ1xuXHRcdFx0XHRcdFx0XHRvcGVuZWRUYWdzLnBvcCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAodG9rZW4uY29udGVudFt0b2tlbi5jb250ZW50Lmxlbmd0aCAtIDFdLmNvbnRlbnQgPT09ICcvPicpIHtcblx0XHRcdFx0XHRcdFx0Ly8gQXV0b2Nsb3NlZCB0YWcsIGlnbm9yZVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gT3BlbmluZyB0YWdcblx0XHRcdFx0XHRcdFx0b3BlbmVkVGFncy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XHR0YWdOYW1lOiBzdHJpbmdpZnlUb2tlbih0b2tlbi5jb250ZW50WzBdLmNvbnRlbnRbMV0pLFxuXHRcdFx0XHRcdFx0XHRcdG9wZW5lZEJyYWNlczogMFxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAob3BlbmVkVGFncy5sZW5ndGggPiAwICYmIHRva2VuLnR5cGUgPT09ICdwdW5jdHVhdGlvbicgJiYgdG9rZW4uY29udGVudCA9PT0gJ3snKSB7XG5cblx0XHRcdFx0XHQvLyBIZXJlIHdlIG1pZ2h0IGhhdmUgZW50ZXJlZCBhIEpTWCBjb250ZXh0IGluc2lkZSBhIHRhZ1xuXHRcdFx0XHRcdG9wZW5lZFRhZ3Nbb3BlbmVkVGFncy5sZW5ndGggLSAxXS5vcGVuZWRCcmFjZXMrKztcblxuXHRcdFx0XHR9IGVsc2UgaWYgKG9wZW5lZFRhZ3MubGVuZ3RoID4gMCAmJiBvcGVuZWRUYWdzW29wZW5lZFRhZ3MubGVuZ3RoIC0gMV0ub3BlbmVkQnJhY2VzID4gMCAmJiB0b2tlbi50eXBlID09PSAncHVuY3R1YXRpb24nICYmIHRva2VuLmNvbnRlbnQgPT09ICd9Jykge1xuXG5cdFx0XHRcdFx0Ly8gSGVyZSB3ZSBtaWdodCBoYXZlIGxlZnQgYSBKU1ggY29udGV4dCBpbnNpZGUgYSB0YWdcblx0XHRcdFx0XHRvcGVuZWRUYWdzW29wZW5lZFRhZ3MubGVuZ3RoIC0gMV0ub3BlbmVkQnJhY2VzLS07XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRub3RUYWdOb3JCcmFjZSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChub3RUYWdOb3JCcmFjZSB8fCB0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdGlmIChvcGVuZWRUYWdzLmxlbmd0aCA+IDAgJiYgb3BlbmVkVGFnc1tvcGVuZWRUYWdzLmxlbmd0aCAtIDFdLm9wZW5lZEJyYWNlcyA9PT0gMCkge1xuXHRcdFx0XHRcdC8vIEhlcmUgd2UgYXJlIGluc2lkZSBhIHRhZywgYW5kIG5vdCBpbnNpZGUgYSBKU1ggY29udGV4dC5cblx0XHRcdFx0XHQvLyBUaGF0J3MgcGxhaW4gdGV4dDogZHJvcCBhbnkgdG9rZW5zIG1hdGNoZWQuXG5cdFx0XHRcdFx0dmFyIHBsYWluVGV4dCA9IHN0cmluZ2lmeVRva2VuKHRva2VuKTtcblxuXHRcdFx0XHRcdC8vIEFuZCBtZXJnZSB0ZXh0IHdpdGggYWRqYWNlbnQgdGV4dFxuXHRcdFx0XHRcdGlmIChpIDwgdG9rZW5zLmxlbmd0aCAtIDEgJiYgKHR5cGVvZiB0b2tlbnNbaSArIDFdID09PSAnc3RyaW5nJyB8fCB0b2tlbnNbaSArIDFdLnR5cGUgPT09ICdwbGFpbi10ZXh0JykpIHtcblx0XHRcdFx0XHRcdHBsYWluVGV4dCArPSBzdHJpbmdpZnlUb2tlbih0b2tlbnNbaSArIDFdKTtcblx0XHRcdFx0XHRcdHRva2Vucy5zcGxpY2UoaSArIDEsIDEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoaSA+IDAgJiYgKHR5cGVvZiB0b2tlbnNbaSAtIDFdID09PSAnc3RyaW5nJyB8fCB0b2tlbnNbaSAtIDFdLnR5cGUgPT09ICdwbGFpbi10ZXh0JykpIHtcblx0XHRcdFx0XHRcdHBsYWluVGV4dCA9IHN0cmluZ2lmeVRva2VuKHRva2Vuc1tpIC0gMV0pICsgcGxhaW5UZXh0O1xuXHRcdFx0XHRcdFx0dG9rZW5zLnNwbGljZShpIC0gMSwgMSk7XG5cdFx0XHRcdFx0XHRpLS07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dG9rZW5zW2ldID0gbmV3IFByaXNtLlRva2VuKCdwbGFpbi10ZXh0JywgcGxhaW5UZXh0LCBudWxsLCBwbGFpblRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0b2tlbi5jb250ZW50ICYmIHR5cGVvZiB0b2tlbi5jb250ZW50ICE9PSAnc3RyaW5nJykge1xuXHRcdFx0XHR3YWxrVG9rZW5zKHRva2VuLmNvbnRlbnQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2FmdGVyLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdGlmIChlbnYubGFuZ3VhZ2UgIT09ICdqc3gnICYmIGVudi5sYW5ndWFnZSAhPT0gJ3RzeCcpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0d2Fsa1Rva2VucyhlbnYudG9rZW5zKTtcblx0fSk7XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHR2YXIgdHlwZXNjcmlwdCA9IFByaXNtLnV0aWwuY2xvbmUoUHJpc20ubGFuZ3VhZ2VzLnR5cGVzY3JpcHQpO1xuXHRQcmlzbS5sYW5ndWFnZXMudHN4ID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnanN4JywgdHlwZXNjcmlwdCk7XG5cblx0Ly8gZG9lc24ndCB3b3JrIHdpdGggVFMgYmVjYXVzZSBUUyBpcyB0b28gY29tcGxleFxuXHRkZWxldGUgUHJpc20ubGFuZ3VhZ2VzLnRzeFsncGFyYW1ldGVyJ107XG5cdGRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMudHN4WydsaXRlcmFsLXByb3BlcnR5J107XG5cblx0Ly8gVGhpcyB3aWxsIHByZXZlbnQgY29sbGlzaW9ucyBiZXR3ZWVuIFRTWCB0YWdzIGFuZCBUUyBnZW5lcmljIHR5cGVzLlxuXHQvLyBJZGVhIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9rYXJsaG9ya3lcblx0Ly8gRGlzY3Vzc2lvbjogaHR0cHM6Ly9naXRodWIuY29tL1ByaXNtSlMvcHJpc20vaXNzdWVzLzI1OTQjaXNzdWVjb21tZW50LTcxMDY2NjkyOFxuXHR2YXIgdGFnID0gUHJpc20ubGFuZ3VhZ2VzLnRzeC50YWc7XG5cdHRhZy5wYXR0ZXJuID0gUmVnRXhwKC8oXnxbXlxcdyRdfCg/PTxcXC8pKS8uc291cmNlICsgJyg/OicgKyB0YWcucGF0dGVybi5zb3VyY2UgKyAnKScsIHRhZy5wYXR0ZXJuLmZsYWdzKTtcblx0dGFnLmxvb2tiZWhpbmQgPSB0cnVlO1xufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMucmVhc29uID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8W15cXFxcXFxyXFxuXCJdKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdC8vICdjbGFzcy1uYW1lJyBtdXN0IGJlIG1hdGNoZWQgKmFmdGVyKiAnY29uc3RydWN0b3InIGRlZmluZWQgYmVsb3dcblx0J2NsYXNzLW5hbWUnOiAvXFxiW0EtWl1cXHcqLyxcblx0J2tleXdvcmQnOiAvXFxiKD86YW5kfGFzfGFzc2VydHxiZWdpbnxjbGFzc3xjb25zdHJhaW50fGRvfGRvbmV8ZG93bnRvfGVsc2V8ZW5kfGV4Y2VwdGlvbnxleHRlcm5hbHxmb3J8ZnVufGZ1bmN0aW9ufGZ1bmN0b3J8aWZ8aW58aW5jbHVkZXxpbmhlcml0fGluaXRpYWxpemVyfGxhenl8bGV0fG1ldGhvZHxtb2R1bGV8bXV0YWJsZXxuZXd8bm9ucmVjfG9iamVjdHxvZnxvcGVufG9yfHByaXZhdGV8cmVjfHNpZ3xzdHJ1Y3R8c3dpdGNofHRoZW58dG98dHJ5fHR5cGV8dmFsfHZpcnR1YWx8d2hlbnx3aGlsZXx3aXRoKVxcYi8sXG5cdCdvcGVyYXRvcic6IC9cXC57M318Ols6PV18XFx8PnwtPnw9KD86PT0/fD4pP3w8PT98Pj0/fFt8Xj8nIyF+YF18WytcXC0qXFwvXVxcLj98XFxiKD86YXNyfGxhbmR8bG9yfGxzbHxsc3J8bHhvcnxtb2QpXFxiL1xufSk7XG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdyZWFzb24nLCAnY2xhc3MtbmFtZScsIHtcblx0J2NoYXInOiB7XG5cdFx0cGF0dGVybjogLycoPzpcXFxceFtcXGRhLWZdezJ9fFxcXFxvWzAtM11bMC03XVswLTddfFxcXFxcXGR7M318XFxcXC58W14nXFxcXFxcclxcbl0pJy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdC8vIE5lZ2F0aXZlIGxvb2stYWhlYWQgcHJldmVudHMgZnJvbSBtYXRjaGluZyB0aGluZ3MgbGlrZSBTdHJpbmcuY2FwaXRhbGl6ZVxuXHQnY29uc3RydWN0b3InOiAvXFxiW0EtWl1cXHcqXFxiKD8hXFxzKlxcLikvLFxuXHQnbGFiZWwnOiB7XG5cdFx0cGF0dGVybjogL1xcYlthLXpdXFx3Kig/PTo6KS8sXG5cdFx0YWxpYXM6ICdzeW1ib2wnXG5cdH1cbn0pO1xuXG4vLyBXZSBjYW4ndCBtYXRjaCBmdW5jdGlvbnMgcHJvcGVydHksIHNvIGxldCdzIG5vdCBldmVuIHRyeS5cbmRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMucmVhc29uLmZ1bmN0aW9uO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIHNwZWNpYWxFc2NhcGUgPSB7XG5cdFx0cGF0dGVybjogL1xcXFxbXFxcXCgpe31bXFxdXiQrKj98Ll0vLFxuXHRcdGFsaWFzOiAnZXNjYXBlJ1xuXHR9O1xuXHR2YXIgZXNjYXBlID0gL1xcXFwoPzp4W1xcZGEtZkEtRl17Mn18dVtcXGRhLWZBLUZdezR9fHVcXHtbXFxkYS1mQS1GXStcXH18MFswLTddezAsMn18WzEyM11bMC03XXsyfXxjW2EtekEtWl18LikvO1xuXHR2YXIgY2hhclNldCA9IHtcblx0XHRwYXR0ZXJuOiAvXFwufFxcXFxbd3NkXXxcXFxccFxce1tee31dK1xcfS9pLFxuXHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0fTtcblx0dmFyIGNoYXJTZXRXaXRob3V0RG90ID0ge1xuXHRcdHBhdHRlcm46IC9cXFxcW3dzZF18XFxcXHBcXHtbXnt9XStcXH0vaSxcblx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdH07XG5cblx0dmFyIHJhbmdlQ2hhciA9ICcoPzpbXlxcXFxcXFxcLV18JyArIGVzY2FwZS5zb3VyY2UgKyAnKSc7XG5cdHZhciByYW5nZSA9IFJlZ0V4cChyYW5nZUNoYXIgKyAnLScgKyByYW5nZUNoYXIpO1xuXG5cdC8vIHRoZSBuYW1lIG9mIGEgY2FwdHVyaW5nIGdyb3VwXG5cdHZhciBncm91cE5hbWUgPSB7XG5cdFx0cGF0dGVybjogLyg8fCcpW148PiddKyg/PVs+J10kKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5yZWdleCA9IHtcblx0XHQnY2hhci1jbGFzcyc6IHtcblx0XHRcdHBhdHRlcm46IC8oKD86XnxbXlxcXFxdKSg/OlxcXFxcXFxcKSopXFxbKD86W15cXFxcXFxdXXxcXFxcW1xcc1xcU10pKlxcXS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdjaGFyLWNsYXNzLW5lZ2F0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXlxcWylcXF4vLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHRcdFx0fSxcblx0XHRcdFx0J2NoYXItY2xhc3MtcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15cXFt8XFxdJC8sXG5cdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0fSxcblx0XHRcdFx0J3JhbmdlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IHJhbmdlLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J2VzY2FwZSc6IGVzY2FwZSxcblx0XHRcdFx0XHRcdCdyYW5nZS1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogLy0vLFxuXHRcdFx0XHRcdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J3NwZWNpYWwtZXNjYXBlJzogc3BlY2lhbEVzY2FwZSxcblx0XHRcdFx0J2NoYXItc2V0JzogY2hhclNldFdpdGhvdXREb3QsXG5cdFx0XHRcdCdlc2NhcGUnOiBlc2NhcGVcblx0XHRcdH1cblx0XHR9LFxuXHRcdCdzcGVjaWFsLWVzY2FwZSc6IHNwZWNpYWxFc2NhcGUsXG5cdFx0J2NoYXItc2V0JzogY2hhclNldCxcblx0XHQnYmFja3JlZmVyZW5jZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gYSBiYWNrcmVmZXJlbmNlIHdoaWNoIGlzIG5vdCBhbiBvY3RhbCBlc2NhcGVcblx0XHRcdFx0cGF0dGVybjogL1xcXFwoPyFbMTIzXVswLTddezJ9KVsxLTldLyxcblx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcXFxrPFtePD4nXSs+Lyxcblx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2dyb3VwLW5hbWUnOiBncm91cE5hbWVcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2FuY2hvcic6IHtcblx0XHRcdHBhdHRlcm46IC9bJF5dfFxcXFxbQUJiR1p6XS8sXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH0sXG5cdFx0J2VzY2FwZSc6IGVzY2FwZSxcblx0XHQnZ3JvdXAnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS8xMC9kb2NzL2FwaS9qYXZhL3V0aWwvcmVnZXgvUGF0dGVybi5odG1sXG5cdFx0XHRcdC8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2RvdG5ldC9zdGFuZGFyZC9iYXNlLXR5cGVzL3JlZ3VsYXItZXhwcmVzc2lvbi1sYW5ndWFnZS1xdWljay1yZWZlcmVuY2U/dmlldz1uZXRmcmFtZXdvcmstNC43LjIjZ3JvdXBpbmctY29uc3RydWN0c1xuXG5cdFx0XHRcdC8vICgpLCAoPzxuYW1lPiksICg/J25hbWUnKSwgKD8+KSwgKD86KSwgKD89KSwgKD8hKSwgKD88PSksICg/PCEpLCAoP2lzLW0pLCAoP2ktbTopXG5cdFx0XHRcdHBhdHRlcm46IC9cXCgoPzpcXD8oPzo8W148PiddKz58J1tePD4nXSsnfFs+Ol18PD9bPSFdfFtpZG1uc3V4VV0rKD86LVtpZG1uc3V4VV0rKT86PykpPy8sXG5cdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnZ3JvdXAtbmFtZSc6IGdyb3VwTmFtZVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFwpLyxcblx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdxdWFudGlmaWVyJzoge1xuXHRcdFx0cGF0dGVybjogLyg/OlsrKj9dfFxce1xcZCsoPzosXFxkKik/XFx9KVs/K10/Lyxcblx0XHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHRcdH0sXG5cdFx0J2FsdGVybmF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogL1xcfC8sXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fVxuXHR9O1xuXG59KFByaXNtKSk7XG5cbi8vIGh0dHBzOi8vd3d3Lm9wZW5wb2xpY3lhZ2VudC5vcmcvZG9jcy9sYXRlc3QvcG9saWN5LXJlZmVyZW5jZS9cblxuUHJpc20ubGFuZ3VhZ2VzLnJlZ28gPSB7XG5cdCdjb21tZW50JzogLyMuKi8sXG5cdCdwcm9wZXJ0eSc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcLl0pKD86XCIoPzpcXFxcLnxbXlxcXFxcIlxcclxcbl0pKlwifGBbXmBdKmB8XFxiW2Etel9dXFx3KlxcYikoPz1cXHMqOig/IT0pKS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pXCIoPzpcXFxcLnxbXlxcXFxcIlxcclxcbl0pKlwifGBbXmBdKmAvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J2tleXdvcmQnOiAvXFxiKD86YXN8ZGVmYXVsdHxlbHNlfGltcG9ydHxub3R8bnVsbHxwYWNrYWdlfHNldCg/PVxccypcXCgpfHNvbWV8d2l0aClcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cblx0J2Z1bmN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC9cXGJbYS16X11cXHcqXFxiKD86XFxzKlxcLlxccypcXGJbYS16X11cXHcqXFxiKSooPz1cXHMqXFwoKS9pLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J25hbWVzcGFjZSc6IC9cXGJcXHcrXFxiKD89XFxzKlxcLikvLFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHR9XG5cdH0sXG5cblx0J251bWJlcic6IC8tP1xcYlxcZCsoPzpcXC5cXGQrKT8oPzplWystXT9cXGQrKT9cXGIvaSxcblx0J29wZXJhdG9yJzogL1stKyovJXwmXXxbPD46PV09P3whPXxcXGJfXFxiLyxcblx0J3B1bmN0dWF0aW9uJzogL1ssOy5cXFtcXF17fSgpXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5yZW5weSA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pIy4rLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFwiXCJcInwnJycpW1xcc1xcU10rP1xcMXwoXCJ8JykoPzpcXFxcLnwoPyFcXDIpW15cXFxcXSkqXFwyfCg/Ol4jPyg/Oig/OlswLTlhLWZBLUZdKXszfXxbMC05YS1mQS1GXXs2fSkkKS9tLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89XFwoKS9pLFxuXG5cdCdwcm9wZXJ0eSc6IC9cXGIoPzpVcGRhdGV8VXBkYXRlVmVyc2lvbnxhY3Rpb258YWN0aXZhdGVfc291bmR8YWR2X252bF90cmFuc2l0aW9ufGFmdGVyX2xvYWRfdHJhbnNpdGlvbnxhbGlnbnxhbHBoYXxhbHR8YW5jaG9yfGFudGlhbGlhc3xhcmVhfGF1dG98YmFja2dyb3VuZHxiYXJfaW52ZXJ0fGJhcl9yZXNpemluZ3xiYXJfdmVydGljYWx8YmxhY2tfY29sb3J8Ym9sZHxib3R0b21fYmFyfGJvdHRvbV9ndXR0ZXJ8Ym90dG9tX21hcmdpbnxib3R0b21fcGFkZGluZ3xib3hfcmV2ZXJzZXxib3hfd3JhcHxjYW5fdXBkYXRlfGNhcmV0fGNoaWxkfGNvbG9yfGNyb3B8ZGVmYXVsdF9hZm1fZW5hYmxlfGRlZmF1bHRfYWZtX3RpbWV8ZGVmYXVsdF9mdWxsc2NyZWVufGRlZmF1bHRfdGV4dF9jcHN8ZGV2ZWxvcGVyfGRpcmVjdG9yeV9uYW1lfGRyYWdfaGFuZGxlfGRyYWdfam9pbmVkfGRyYWdfbmFtZXxkcmFnX3JhaXNlfGRyYWdnYWJsZXxkcmFnZ2VkfGRyb3Bfc2hhZG93fGRyb3Bfc2hhZG93X2NvbG9yfGRyb3BwYWJsZXxkcm9wcGVkfGVhc2VpbnxlYXNlb3V0fGVkZ2VzY3JvbGx8ZW5kX2dhbWVfdHJhbnNpdGlvbnxlbmRfc3BsYXNoX3RyYW5zaXRpb258ZW50ZXJfcmVwbGF5X3RyYW5zaXRpb258ZW50ZXJfc291bmR8ZW50ZXJfdHJhbnNpdGlvbnxlbnRlcl95ZXNub190cmFuc2l0aW9ufGV4ZWN1dGFibGVfbmFtZXxleGl0X3JlcGxheV90cmFuc2l0aW9ufGV4aXRfc291bmR8ZXhpdF90cmFuc2l0aW9ufGV4aXRfeWVzbm9fdHJhbnNpdGlvbnxmYWRlaW58ZmFkZW91dHxmaXJzdF9pbmRlbnR8Zmlyc3Rfc3BhY2luZ3xmaXRfZmlyc3R8Zm9jdXN8Zm9jdXNfbWFza3xmb250fGZvcmVncm91bmR8Z2FtZV9tYWluX3RyYW5zaXRpb258Z2V0X2luc3RhbGxlZF9wYWNrYWdlc3xnb29nbGVfcGxheV9rZXl8Z29vZ2xlX3BsYXlfc2FsdHxncm91bmR8aGFzX211c2ljfGhhc19zb3VuZHxoYXNfdm9pY2V8aGVpZ2h0fGhlbHB8aGludGluZ3xob3Zlcnxob3Zlcl9iYWNrZ3JvdW5kfGhvdmVyX2NvbG9yfGhvdmVyX3NvdW5kfGhvdmVyZWR8aHlwZXJsaW5rX2Z1bmN0aW9uc3xpZGxlfGlkbGVfY29sb3J8aW1hZ2Vfc3R5bGV8aW5jbHVkZV91cGRhdGV8aW5zZW5zaXRpdmV8aW5zZW5zaXRpdmVfYmFja2dyb3VuZHxpbnNlbnNpdGl2ZV9jb2xvcnxpbnNpZGV8aW50cmFfdHJhbnNpdGlvbnxpdGFsaWN8anVzdGlmeXxrZXJuaW5nfGtleWJvYXJkX2ZvY3VzfGxhbmd1YWdlfGxheWVyX2NsaXBwaW5nfGxheWVyc3xsYXlvdXR8bGVmdF9iYXJ8bGVmdF9ndXR0ZXJ8bGVmdF9tYXJnaW58bGVmdF9wYWRkaW5nfGxlbmd0aHxsaW5lX2xlYWRpbmd8bGluZV9vdmVybGFwX3NwbGl0fGxpbmVfc3BhY2luZ3xsaW5lYXJ8bWFpbl9nYW1lX3RyYW5zaXRpb258bWFpbl9tZW51X211c2ljfG1heGltdW18bWluX3dpZHRofG1pbmltdW18bWlud2lkdGh8bW9kYWx8bW91c2V8bW91c2V3aGVlbHxuYW1lfG5hcnJhdG9yX21lbnV8bmV3bGluZV9pbmRlbnR8bnZsX2Fkdl90cmFuc2l0aW9ufG9mZnNldHxvcmRlcl9yZXZlcnNlfG91dGxpbmVzfG92ZXJsYXlfZnVuY3Rpb25zfHBvc3xwb3NpdGlvbnxwcmVmaXh8cmFkaXVzfHJhbmdlfHJlc3RfaW5kZW50fHJpZ2h0X2JhcnxyaWdodF9ndXR0ZXJ8cmlnaHRfbWFyZ2lufHJpZ2h0X3BhZGRpbmd8cm90YXRlfHJvdGF0ZV9wYWR8cnVieV9zdHlsZXxzYW1wbGVfc291bmR8c2F2ZV9kaXJlY3Rvcnl8c2F5X2F0dHJpYnV0ZV90cmFuc2l0aW9ufHNjcmVlbl9oZWlnaHR8c2NyZWVuX3dpZHRofHNjcm9sbGJhcnN8c2VsZWN0ZWRfaG92ZXJ8c2VsZWN0ZWRfaG92ZXJfY29sb3J8c2VsZWN0ZWRfaWRsZXxzZWxlY3RlZF9pZGxlX2NvbG9yfHNlbGVjdGVkX2luc2Vuc2l0aXZlfHNob3dfc2lkZV9pbWFnZXxzaG93X3R3b193aW5kb3d8c2lkZV9zcGFjaW5nfHNpZGVfeHBvc3xzaWRlX3lwb3N8c2l6ZXxzaXplX2dyb3VwfHNsb3dfY3BzfHNsb3dfY3BzX211bHRpcGxpZXJ8c3BhY2luZ3xzdHJpa2V0aHJvdWdofHN1YnBpeGVsfHRleHRfYWxpZ258dGV4dF9zdHlsZXx0ZXh0X3hwb3N8dGV4dF95X2Z1ZGdlfHRleHRfeXBvc3x0aHVtYnx0aHVtYl9vZmZzZXR8dGh1bWJfc2hhZG93fHRodW1ibmFpbF9oZWlnaHR8dGh1bWJuYWlsX3dpZHRofHRpbWV8dG9wX2Jhcnx0b3BfZ3V0dGVyfHRvcF9tYXJnaW58dG9wX3BhZGRpbmd8dHJhbnNsYXRpb25zfHVuZGVybGluZXx1bnNjcm9sbGFibGV8dXBkYXRlfHZhbHVlfHZlcnNpb258dmVyc2lvbl9uYW1lfHZlcnNpb25fdHVwbGV8dmVydGljYWx8d2lkdGh8d2luZG93X2hpZGVfdHJhbnNpdGlvbnx3aW5kb3dfaWNvbnx3aW5kb3dfbGVmdF9wYWRkaW5nfHdpbmRvd19zaG93X3RyYW5zaXRpb258d2luZG93X3RpdGxlfHdpbmRvd3NfaWNvbnx4YWRqdXN0bWVudHx4YWxpZ258eGFuY2hvcnx4YW5jaG9yYXJvdW5kfHhhcm91bmR8eGNlbnRlcnx4ZmlsbHx4aW5pdGlhbHx4bWFyZ2lufHhtYXhpbXVtfHhtaW5pbXVtfHhvZmZzZXR8eG9mc3NldHx4cGFkZGluZ3x4cG9zfHhzaXplfHh6b29tfHlhZGp1c3RtZW50fHlhbGlnbnx5YW5jaG9yfHlhbmNob3Jhcm91bmR8eWFyb3VuZHx5Y2VudGVyfHlmaWxsfHlpbml0aWFsfHltYXJnaW58eW1heGltdW18eW1pbmltdW18eW9mZnNldHx5cGFkZGluZ3x5cG9zfHlzaXplfHlzaXpleHlzaXplfHl6b29tfHpvb218em9yZGVyKVxcYi8sXG5cblx0J3RhZyc6IC9cXGIoPzpiYXJ8YmxvY2t8YnV0dG9ufGJ1dHRvc2NyZWVubnxkcmFnfGRyYWdncm91cHxmaXhlZHxmcmFtZXxncmlkfFtodl1ib3h8aG90YmFyfGhvdHNwb3R8aW1hZ2V8aW1hZ2VidXR0b258aW1hZ2VtYXB8aW5wdXR8a2V5fGxhYmVsfG1lbnV8bW1fbWVudV9mcmFtZXxtb3VzZWFyZWF8bnZsfHBhcmFsbGVsfHNjcmVlbnxzZWxmfHNpZGV8dGFnfHRleHR8dGV4dGJ1dHRvbnx0aW1lcnx2YmFyfHZpZXdwb3J0fHdpbmRvdylcXGJ8XFwkLyxcblxuXHQna2V5d29yZCc6IC9cXGIoPzpOb25lfGFkZHxhZGp1c3RtZW50fGFsaWduYXJvdW5kfGFsbG93fGFuZ2xlfGFuaW1hdGlvbnxhcm91bmR8YXN8YXNzZXJ0fGJlaGluZHxib3hfbGF5b3V0fGJyZWFrfGJ1aWxkfGNhY2hlfGNhbGx8Y2VudGVyfGNoYW5nZWR8Y2hpbGRfc2l6ZXxjaG9pY2V8Y2lyY2xlc3xjbGFzc3xjbGVhcnxjbGlja2VkfGNsaXBwaW5nfGNsb2Nrd2lzZXxjb25maWd8Y29udGFpbnN8Y29udGludWV8Y29ybmVyMXxjb3JuZXIyfGNvdW50ZXJjbG9ja3dpc2V8ZGVmfGRlZmF1bHR8ZGVmaW5lfGRlbHxkZWxheXxkaXNhYmxlZHxkaXNhYmxlZF90ZXh0fGRpc3NvbHZlfGVsaWZ8ZWxzZXxldmVudHxleGNlcHR8ZXhjbHVkZXxleGVjfGV4cHJlc3Npb258ZmFkZXxmaW5hbGx5fGZvcnxmcm9tfGZ1bmN0aW9ufGdsb2JhbHxnbV9yb290fGhhc3xoaWRlfGlkfGlmfGltcG9ydHxpbnxpbml0fGlzfGp1bXB8a25vdHxsYW1iZGF8bGVmdHxsZXNzX3JvdW5kZWR8bW1fcm9vdHxtb3ZpZXxtdXNpY3xudWxsfG9ufG9ubGF5ZXJ8cGFzc3xwYXVzZXxwZXJzaXN0ZW50fHBsYXl8cHJpbnR8cHl0aG9ufHF1ZXVlfHJhaXNlfHJhbmRvbXxyZW5weXxyZXBlYXR8cmV0dXJufHJpZ2h0fHJvdW5kZWRfd2luZG93fHNjZW5lfHNjb3BlfHNldHxzaG93fHNsb3d8c2xvd19hYm9ydGFibGV8c2xvd19kb25lfHNvdW5kfHN0b3B8c3RvcmV8c3R5bGV8c3R5bGVfZ3JvdXB8c3Vic3RpdHV0ZXxzdWZmaXh8dGhlbWV8dHJhbnNmb3JtfHRyYW5zZm9ybV9hbmNob3J8dHJhbnNwb3NlfHRyeXx1aXx1bmhvdmVyZWR8dXBkYXRlcnx1c2V8dm9pY2V8d2hpbGV8d2lkZ2V0fHdpZGdldF9ob3Zlcnx3aWRnZXRfc2VsZWN0ZWR8d2lkZ2V0X3RleHR8eWllbGQpXFxiLyxcblxuXHQnYm9vbGVhbic6IC9cXGIoPzpbRmZdYWxzZXxbVHRdcnVlKVxcYi8sXG5cblx0J251bWJlcic6IC8oPzpcXGIoPzowW2JvXSk/KD86KD86XFxkfDB4W1xcZGEtZl0pW1xcZGEtZl0qKD86XFwuXFxkKik/KXxcXEJcXC5cXGQrKSg/OmVbKy1dP1xcZCspP2o/L2ksXG5cblx0J29wZXJhdG9yJzogL1stKyU9XT0/fCE9fFxcKlxcKj89P3xcXC9cXC8/PT98PFs8PT5dP3w+Wz0+XT98WyZ8Xn5dfFxcYig/OmFuZHxhdHxub3R8b3J8d2l0aClcXGIvLFxuXG5cdCdwdW5jdHVhdGlvbic6IC9be31bXFxdOygpLC46XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5ycHkgPSBQcmlzbS5sYW5ndWFnZXMucmVucHk7XG5cblByaXNtLmxhbmd1YWdlcy5yZXNjcmlwdCA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcL1xcLy4qfFxcL1xcKltcXHNcXFNdKj8oPzpcXCpcXC98JCkvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY2hhcic6IHsgcGF0dGVybjogLycoPzpbXlxcclxcblxcXFxdfFxcXFwoPzoufFxcdyspKScvLCBncmVlZHk6IHRydWUgfSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXxbXlxcXFxcXHJcXG5cIl0pKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NsYXNzLW5hbWUnOiAvXFxiW0EtWl1cXHcqfEBbYS16Ll0qfCNbQS1aYS16XVxcdyp8I1xcZC8sXG5cdCdmdW5jdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvW2EtekEtWl1cXHcqKD89XFwoKXwoXFwuKVthLXpdXFx3Ki8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0fSxcblx0J251bWJlcic6IC8oPzpcXGIweCg/OltcXGRhLWZdKyg/OlxcLltcXGRhLWZdKik/fFxcLltcXGRhLWZdKykoPzpwWystXT9cXGQrKT98KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OmVbKy1dP1xcZCspPylbZnVsXXswLDR9L2ksXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0J2F0dHItdmFsdWUnOiAvW0EtWmEtel1cXHcqKD89PSkvLFxuXHQnY29uc3RhbnQnOiB7XG5cdFx0cGF0dGVybjogLyhcXGJ0eXBlXFxzKylbYS16XVxcdyovLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J3RhZyc6IHtcblx0XHRwYXR0ZXJuOiAvKDwpW2Etel1cXHcqfCg/OjxcXC8pW2Etel1cXHcqLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J29wZXJhdG9yJzogLzx8PnxcXC8vLFxuXHRcdH0sXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFuZHxhc3xhc3NlcnR8YmVnaW58Ym9vbHxjbGFzc3xjb25zdHJhaW50fGRvfGRvbmV8ZG93bnRvfGVsc2V8ZW5kfGV4Y2VwdGlvbnxleHRlcm5hbHxmbG9hdHxmb3J8ZnVufGZ1bmN0aW9ufGlmfGlufGluY2x1ZGV8aW5oZXJpdHxpbml0aWFsaXplcnxpbnR8bGF6eXxsZXR8bWV0aG9kfG1vZHVsZXxtdXRhYmxlfG5ld3xub25yZWN8b2JqZWN0fG9mfG9wZW58b3J8cHJpdmF0ZXxyZWN8c3RyaW5nfHN3aXRjaHx0aGVufHRvfHRyeXx0eXBlfHdoZW58d2hpbGV8d2l0aClcXGIvLFxuXHQnb3BlcmF0b3InOiAvXFwuezN9fDpbOj1dP3xcXHw+fC0+fD0oPzo9PT98Pik/fDw9P3w+PT98W3xePycjIX5gXXxbK1xcLSpcXC9dXFwuP3xcXGIoPzphc3J8bGFuZHxsb3J8bHNsfGxzcnxseG9yfG1vZClcXGIvLFxuXHQncHVuY3R1YXRpb24nOiAvWygpe31bXFxdLDsuXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3Jlc2NyaXB0JywgJ3N0cmluZycsIHtcblx0J3RlbXBsYXRlLXN0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvYCg/OlxcXFxbXFxzXFxTXXxcXCRcXHsoPzpbXnt9XXxcXHsoPzpbXnt9XXxcXHtbXn1dKlxcfSkqXFx9KStcXH18KD8hXFwkXFx7KVteXFxcXGBdKSpgLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQndGVtcGxhdGUtcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eYHxgJC8sXG5cdFx0XHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHRcdFx0fSxcblx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W15cXFxcXSkoPzpcXFxcezJ9KSopXFwkXFx7KD86W157fV18XFx7KD86W157fV18XFx7W159XSpcXH0pKlxcfSkrXFx9Lyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2ludGVycG9sYXRpb24tcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcJFxce3xcXH0kLyxcblx0XHRcdFx0XHRcdGFsaWFzOiAndGFnJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0cmVzdDogUHJpc20ubGFuZ3VhZ2VzLnJlc2NyaXB0XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHR9XG5cdH0sXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLnJlcyA9IFByaXNtLmxhbmd1YWdlcy5yZXNjcmlwdDtcblxuUHJpc20ubGFuZ3VhZ2VzLnJlc3QgPSB7XG5cdCd0YWJsZSc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKSg/OlxcK1s9LV0rKStcXCsoPzpcXHI/XFxufFxccikoPzpcXDFbK3xdLitbK3xdKD86XFxyP1xcbnxcXHIpKStcXDEoPzpcXCtbPS1dKykrXFwrL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXHx8KD86XFwrWz0tXSspK1xcKy9cblx0XHRcdH1cblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXltcXHQgXSopPSsgWyA9XSo9KD86KD86XFxyP1xcbnxcXHIpXFwxLispKyg/Olxccj9cXG58XFxyKVxcMT0rIFsgPV0qPSg/PSg/Olxccj9cXG58XFxyKXsyfXxcXHMqJCkvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1s9LV0rL1xuXHRcdFx0fVxuXHRcdH1cblx0XSxcblxuXHQvLyBEaXJlY3RpdmUtbGlrZSBwYXR0ZXJuc1xuXG5cdCdzdWJzdGl0dXRpb24tZGVmJzoge1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSpcXC5cXC4gKVxcfCg/OltefFxcc10oPzpbXnxdKltefFxcc10pPylcXHwgW146XSs6Oi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnc3Vic3RpdHV0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXlxcfCg/OltefFxcc118W158XFxzXVtefF0qW158XFxzXSlcXHwvLFxuXHRcdFx0XHRhbGlhczogJ2F0dHItdmFsdWUnLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlxcfHxcXHwkL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J2RpcmVjdGl2ZSc6IHtcblx0XHRcdFx0cGF0dGVybjogLyggKSg/ISApW146XSs6Oi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvOjokL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQnbGluay10YXJnZXQnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyheW1xcdCBdKlxcLlxcLiApXFxbW15cXF1dK1xcXS9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlxcW3xcXF0kL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyheW1xcdCBdKlxcLlxcLiApXyg/OmBbXmBdK2B8KD86W146XFxcXF18XFxcXC4pKyk6L20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eX3w6JC9cblx0XHRcdH1cblx0XHR9XG5cdF0sXG5cdCdkaXJlY3RpdmUnOiB7XG5cdFx0cGF0dGVybjogLyheW1xcdCBdKlxcLlxcLiApW146XSs6Oi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdmdW5jdGlvbicsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvOjokL1xuXHRcdH1cblx0fSxcblx0J2NvbW1lbnQnOiB7XG5cdFx0Ly8gVGhlIHR3byBhbHRlcm5hdGl2ZXMgdHJ5IHRvIHByZXZlbnQgaGlnaGxpZ2h0aW5nIG9mIGJsYW5rIGNvbW1lbnRzXG5cdFx0cGF0dGVybjogLyheW1xcdCBdKlxcLlxcLikoPzooPzogLispPyg/Oig/Olxccj9cXG58XFxyKS4rKSt8IC4rKSg/PSg/Olxccj9cXG58XFxyKXsyfXwkKS9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblxuXHQndGl0bGUnOiBbXG5cdFx0Ly8gT3ZlcmxpbmVkIGFuZCB1bmRlcmxpbmVkXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL14oKFshXCIjJCUmJygpKissXFwtLlxcLzo7PD0+P0BcXFtcXFxcXFxdXl9ge3x9fl0pXFwyKykoPzpcXHI/XFxufFxccikuKyg/Olxccj9cXG58XFxyKVxcMSQvbSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlshXCIjJCUmJygpKissXFwtLlxcLzo7PD0+P0BcXFtcXFxcXFxdXl9ge3x9fl0rfFshXCIjJCUmJygpKissXFwtLlxcLzo7PD0+P0BcXFtcXFxcXFxdXl9ge3x9fl0rJC8sXG5cdFx0XHRcdCdpbXBvcnRhbnQnOiAvLisvXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIFVuZGVybGluZWQgb25seVxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnwoPzpcXHI/XFxufFxccil7Mn0pLisoPzpcXHI/XFxufFxccikoWyFcIiMkJSYnKCkqKyxcXC0uXFwvOjs8PT4/QFxcW1xcXFxcXF1eX2B7fH1+XSlcXDIrKD89XFxyP1xcbnxcXHJ8JCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWyFcIiMkJSYnKCkqKyxcXC0uXFwvOjs8PT4/QFxcW1xcXFxcXF1eX2B7fH1+XSskLyxcblx0XHRcdFx0J2ltcG9ydGFudCc6IC8uKy9cblx0XHRcdH1cblx0XHR9XG5cdF0sXG5cdCdocic6IHtcblx0XHRwYXR0ZXJuOiAvKCg/Olxccj9cXG58XFxyKXsyfSkoWyFcIiMkJSYnKCkqKyxcXC0uXFwvOjs8PT4/QFxcW1xcXFxcXF1eX2B7fH1+XSlcXDJ7Myx9KD89KD86XFxyP1xcbnxcXHIpezJ9KS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHR9LFxuXHQnZmllbGQnOiB7XG5cdFx0cGF0dGVybjogLyheW1xcdCBdKik6W146XFxyXFxuXSs6KD89ICkvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnYXR0ci1uYW1lJ1xuXHR9LFxuXHQnY29tbWFuZC1saW5lLW9wdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKSg/OlsrLV1bYS16XFxkXXwoPzotLXxcXC8pW2EtelxcZC1dKykoPzpbID1dKD86W2Etel1bXFx3LV0qfDxbXjw+XSs+KSk/KD86LCAoPzpbKy1dW2EtelxcZF18KD86LS18XFwvKVthLXpcXGQtXSspKD86WyA9XSg/OlthLXpdW1xcdy1dKnw8W148Pl0rPikpPykqKD89KD86XFxyP1xcbnxcXHIpPyB7Mix9XFxTKS9pbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHR9LFxuXHQnbGl0ZXJhbC1ibG9jayc6IHtcblx0XHRwYXR0ZXJuOiAvOjooPzpcXHI/XFxufFxccil7Mn0oWyBcXHRdKykoPyFbIFxcdF0pLisoPzooPzpcXHI/XFxufFxccilcXDEuKykqLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdsaXRlcmFsLWJsb2NrLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXjo6Lyxcblx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdCdxdW90ZWQtbGl0ZXJhbC1ibG9jayc6IHtcblx0XHRwYXR0ZXJuOiAvOjooPzpcXHI/XFxufFxccil7Mn0oWyFcIiMkJSYnKCkqKyxcXC0uXFwvOjs8PT4/QFxcW1xcXFxcXF1eX2B7fH1+XSkuKig/Oig/Olxccj9cXG58XFxyKVxcMS4qKSovLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2xpdGVyYWwtYmxvY2stcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eKD86Ojp8KFshXCIjJCUmJygpKissXFwtLlxcLzo7PD0+P0BcXFtcXFxcXFxdXl9ge3x9fl0pXFwxKikvbSxcblx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdCdsaXN0LWJ1bGxldCc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKSg/OlsqK1xcLVx1MjAyMlx1MjAyM1x1MjA0M118XFwoPyg/OlxcZCt8W2Etel18W2l2eGRjbG1dKylcXCl8KD86XFxkK3xbYS16XXxbaXZ4ZGNsbV0rKVxcLikoPz0gKS9pbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdH0sXG5cdCdkb2N0ZXN0LWJsb2NrJzoge1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSopPj4+IC4rKD86KD86XFxyP1xcbnxcXHIpLispKi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXj4+Pi9cblx0XHR9XG5cdH0sXG5cblx0J2lubGluZSc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W1xcc1xcLTpcXC8nXCI8KFxcW3tdKSg/OjpbXjpdKzpgLio/YHxgLio/YDpbXjpdKzp8KFxcKlxcKj98YGA/fFxcfCkoPyFcXHMpKD86KD8hXFwyKS4pKlxcU1xcMig/PVtcXHNcXC0uLDo7IT9cXFxcXFwvJ1wiKVxcXX1dfCQpKS9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnYm9sZCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5cXCpcXCopLisoPz1cXCpcXCokKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnaXRhbGljJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXlxcKikuKyg/PVxcKiQpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdpbmxpbmUtbGl0ZXJhbCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5gYCkuKyg/PWBgJCkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdzeW1ib2wnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdyb2xlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eOlteOl0rOnw6W146XSs6JC8sXG5cdFx0XHRcdFx0YWxpYXM6ICdmdW5jdGlvbicsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXjp8OiQvXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnaW50ZXJwcmV0ZWQtdGV4dCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5gKS4rKD89YCQpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAnYXR0ci12YWx1ZSdcblx0XHRcdFx0fSxcblx0XHRcdFx0J3N1YnN0aXR1dGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5cXHwpLisoPz1cXHwkKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ2F0dHItdmFsdWUnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXCpcXCo/fGBgP3xcXHwvXG5cdFx0XHR9XG5cdFx0fVxuXHRdLFxuXG5cdCdsaW5rJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXFtbXlxcW1xcXV0rXFxdXyg/PVtcXHNcXC0uLDo7IT9cXFxcXFwvJ1wiKVxcXX1dfCQpLyxcblx0XHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlxcW3xcXF1fJC9cblx0XHRcdH1cblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oPzpcXGJbYS16XFxkXSsoPzpbXy46K11bYS16XFxkXSspKl8/X3xgW15gXStgXz9ffF9gW15gXStgKSg/PVtcXHNcXC0uLDo7IT9cXFxcXFwvJ1wiKVxcXX1dfCQpL2ksXG5cdFx0XHRhbGlhczogJ3N0cmluZycsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15fP2B8YCR8YD9fP18kL1xuXHRcdFx0fVxuXHRcdH1cblx0XSxcblxuXHQvLyBMaW5lIGJsb2NrIHN0YXJ0LFxuXHQvLyBxdW90ZSBhdHRyaWJ1dGlvbixcblx0Ly8gZXhwbGljaXQgbWFya3VwIHN0YXJ0LFxuXHQvLyBhbmQgYW5vbnltb3VzIGh5cGVybGluayB0YXJnZXQgc2hvcnRjdXQgKF9fKVxuXHQncHVuY3R1YXRpb24nOiB7XG5cdFx0cGF0dGVybjogLyheW1xcdCBdKikoPzpcXHwoPz0gfCQpfCg/Oi0tLT98XHUyMDE0fFxcLlxcLnxfXykoPz0gKXxcXC5cXC4kKS9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fVxufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnJpcCA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyMuKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J2NoYXInOiB7XG5cdFx0cGF0dGVybjogL1xcQmBbXlxcc2AnXCIsLjo7I1xcL1xcXFwoKTw+XFxbXFxde31dXFxiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFwifCcpKD86XFxcXC58KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J3JlZ2V4Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXi9dKVxcLyg/IVxcLykoPzpcXFtbXlxcblxcclxcXV0qXFxdfFxcXFwufFteL1xcXFxcXHJcXG5cXFtdKStcXC8oPz1cXHMqKD86JHxbXFxyXFxuLC47fSldKSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J2tleXdvcmQnOiAvKD86PT58LT4pfFxcYig/OmNhc2V8Y2F0Y2h8Y2xhc3N8ZWxzZXxleGl0fGZpbmFsbHl8aWZ8cmFpc2V8cmV0dXJufHN3aXRjaHx0cnkpXFxiLyxcblxuXHQnYnVpbHRpbic6IC9AfFxcYlN5c3RlbVxcYi8sXG5cblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXG5cdCdkYXRlJzogL1xcYlxcZHs0fS1cXGR7Mn0tXFxkezJ9XFxiLyxcblx0J3RpbWUnOiAvXFxiXFxkezJ9OlxcZHsyfTpcXGR7Mn1cXGIvLFxuXHQnZGF0ZXRpbWUnOiAvXFxiXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn1cXGIvLFxuXG5cdCdzeW1ib2wnOiAvOlteXFxkXFxzYCdcIiwuOjsjXFwvXFxcXCgpPD5cXFtcXF17fV1bXlxcc2AnXCIsLjo7I1xcL1xcXFwoKTw+XFxbXFxde31dKi8sXG5cdCdudW1iZXInOiAvWystXT9cXGIoPzpcXGQrXFwuXFxkK3xcXGQrKVxcYi8sXG5cblx0J3B1bmN0dWF0aW9uJzogLyg/OlxcLnsyLDN9KXxbYCwuOjs9XFwvXFxcXCgpPD5cXFtcXF17fV0vLFxuXG5cdCdyZWZlcmVuY2UnOiAvW15cXGRcXHNgJ1wiLC46OyNcXC9cXFxcKCk8PlxcW1xcXXt9XVteXFxzYCdcIiwuOjsjXFwvXFxcXCgpPD5cXFtcXF17fV0qL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnJvYm9jb25mID0ge1xuXHQnY29tbWVudCc6IC8jLiovLFxuXHQna2V5d29yZCc6IHtcblx0XHQncGF0dGVybic6IC8oXnxcXHMpKD86KD86ZXh0ZXJuYWx8aW1wb3J0KVxcYnwoPzpmYWNldHxpbnN0YW5jZSBvZikoPz1bIFxcdF0rW1xcdy1dK1sgXFx0XSpcXHspKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnY29tcG9uZW50Jzoge1xuXHRcdHBhdHRlcm46IC9bXFx3LV0rKD89WyBcXHRdKlxceykvLFxuXHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdH0sXG5cdCdwcm9wZXJ0eSc6IC9bXFx3Li1dKyg/PVsgXFx0XSo6KS8sXG5cdCd2YWx1ZSc6IHtcblx0XHRwYXR0ZXJuOiAvKD1bIFxcdF0qKD8hWyBcXHRdKSlbXiw7XSsvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdhdHRyLXZhbHVlJ1xuXHR9LFxuXHQnb3B0aW9uYWwnOiB7XG5cdFx0cGF0dGVybjogL1xcKG9wdGlvbmFsXFwpLyxcblx0XHRhbGlhczogJ2J1aWx0aW4nXG5cdH0sXG5cdCd3aWxkY2FyZCc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcLilcXCovLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0fSxcblx0J3B1bmN0dWF0aW9uJzogL1t7fSwuOzo9XS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgY29tbWVudCA9IHtcblx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qfCB7Mn18XFx0KSMuKi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH07XG5cblx0dmFyIHZhcmlhYmxlID0ge1xuXHRcdHBhdHRlcm46IC8oKD86XnxbXlxcXFxdKSg/OlxcXFx7Mn0pKilbJEAmJV1cXHsoPzpbXnt9XFxyXFxuXXxcXHtbXnt9XFxyXFxuXSpcXH0pKlxcfS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9eWyRAJiVdXFx7fFxcfSQvXG5cdFx0fVxuXHR9O1xuXG5cdGZ1bmN0aW9uIGNyZWF0ZVNlY3Rpb24obmFtZSwgaW5zaWRlKSB7XG5cdFx0dmFyIGV4dGVuZGVjSW5zaWRlID0ge307XG5cblx0XHRleHRlbmRlY0luc2lkZVsnc2VjdGlvbi1oZWFkZXInXSA9IHtcblx0XHRcdHBhdHRlcm46IC9eID9cXCp7M30uKz9cXCp7M30vLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH07XG5cblx0XHQvLyBjb3B5IGluc2lkZSB0b2tlbnNcblx0XHRmb3IgKHZhciB0b2tlbiBpbiBpbnNpZGUpIHtcblx0XHRcdGV4dGVuZGVjSW5zaWRlW3Rva2VuXSA9IGluc2lkZVt0b2tlbl07XG5cdFx0fVxuXG5cdFx0ZXh0ZW5kZWNJbnNpZGVbJ3RhZyddID0ge1xuXHRcdFx0cGF0dGVybjogLyhbXFxyXFxuXSg/OiB7Mn18XFx0KVsgXFx0XSopXFxbWy1cXHddK1xcXS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXFt8XFxdL1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0ZXh0ZW5kZWNJbnNpZGVbJ3ZhcmlhYmxlJ10gPSB2YXJpYWJsZTtcblx0XHRleHRlbmRlY0luc2lkZVsnY29tbWVudCddID0gY29tbWVudDtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoL14gP1xcKnszfVsgXFx0XSo8bmFtZT5bIFxcdF0qXFwqezN9KD86LnxbXFxyXFxuXSg/IVxcKnszfSkpKi8uc291cmNlLnJlcGxhY2UoLzxuYW1lPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBuYW1lOyB9KSwgJ2ltJyksXG5cdFx0XHRhbGlhczogJ3NlY3Rpb24nLFxuXHRcdFx0aW5zaWRlOiBleHRlbmRlY0luc2lkZVxuXHRcdH07XG5cdH1cblxuXG5cdHZhciBkb2NUYWcgPSB7XG5cdFx0cGF0dGVybjogLyhcXFtEb2N1bWVudGF0aW9uXFxdKD86IHsyfXxcXHQpWyBcXHRdKikoPyFbIFxcdF18IykoPzoufCg/Olxcclxcbj98XFxuKVsgXFx0XSpcXC57M30pKy8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3N0cmluZydcblx0fTtcblxuXHR2YXIgdGVzdE5hbWVMaWtlID0ge1xuXHRcdHBhdHRlcm46IC8oW1xcclxcbl0gPykoPyEjKSg/OlxcUyg/OlsgXFx0XVxcUykqKSsvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdmdW5jdGlvbicsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQndmFyaWFibGUnOiB2YXJpYWJsZVxuXHRcdH1cblx0fTtcblxuXHR2YXIgdGVzdFByb3BlcnR5TGlrZSA9IHtcblx0XHRwYXR0ZXJuOiAvKFtcXHJcXG5dKD86IHsyfXxcXHQpWyBcXHRdKikoPyFcXFt8XFwuezN9fCMpKD86XFxTKD86WyBcXHRdXFxTKSopKy8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCd2YXJpYWJsZSc6IHZhcmlhYmxlXG5cdFx0fVxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlc1sncm9ib3RmcmFtZXdvcmsnXSA9IHtcblx0XHQnc2V0dGluZ3MnOiBjcmVhdGVTZWN0aW9uKCdTZXR0aW5ncycsIHtcblx0XHRcdCdkb2N1bWVudGF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFtcXHJcXG5dID9Eb2N1bWVudGF0aW9uKD86IHsyfXxcXHQpWyBcXHRdKikoPyFbIFxcdF18IykoPzoufCg/Olxcclxcbj98XFxuKVsgXFx0XSpcXC57M30pKy8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHRcdFx0fSxcblx0XHRcdCdwcm9wZXJ0eSc6IHtcblx0XHRcdFx0cGF0dGVybjogLyhbXFxyXFxuXSA/KSg/IVxcLnszfXwjKSg/OlxcUyg/OlsgXFx0XVxcUykqKSsvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9XG5cdFx0fSksXG5cdFx0J3ZhcmlhYmxlcyc6IGNyZWF0ZVNlY3Rpb24oJ1ZhcmlhYmxlcycpLFxuXHRcdCd0ZXN0LWNhc2VzJzogY3JlYXRlU2VjdGlvbignVGVzdCBDYXNlcycsIHtcblx0XHRcdCd0ZXN0LW5hbWUnOiB0ZXN0TmFtZUxpa2UsXG5cdFx0XHQnZG9jdW1lbnRhdGlvbic6IGRvY1RhZyxcblx0XHRcdCdwcm9wZXJ0eSc6IHRlc3RQcm9wZXJ0eUxpa2Vcblx0XHR9KSxcblx0XHQna2V5d29yZHMnOiBjcmVhdGVTZWN0aW9uKCdLZXl3b3JkcycsIHtcblx0XHRcdCdrZXl3b3JkLW5hbWUnOiB0ZXN0TmFtZUxpa2UsXG5cdFx0XHQnZG9jdW1lbnRhdGlvbic6IGRvY1RhZyxcblx0XHRcdCdwcm9wZXJ0eSc6IHRlc3RQcm9wZXJ0eUxpa2Vcblx0XHR9KSxcblx0XHQndGFza3MnOiBjcmVhdGVTZWN0aW9uKCdUYXNrcycsIHtcblx0XHRcdCd0YXNrLW5hbWUnOiB0ZXN0TmFtZUxpa2UsXG5cdFx0XHQnZG9jdW1lbnRhdGlvbic6IGRvY1RhZyxcblx0XHRcdCdwcm9wZXJ0eSc6IHRlc3RQcm9wZXJ0eUxpa2Vcblx0XHR9KSxcblx0XHQnY29tbWVudCc6IGNvbW1lbnRcblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMucm9ib3QgPSBQcmlzbS5sYW5ndWFnZXNbJ3JvYm90ZnJhbWV3b3JrJ107XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBtdWx0aWxpbmVDb21tZW50ID0gL1xcL1xcKig/OlteKi9dfFxcKig/IVxcLyl8XFwvKD8hXFwqKXw8c2VsZj4pKlxcKlxcLy8uc291cmNlO1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IDI7IGkrKykge1xuXHRcdC8vIHN1cHBvcnQgNCBsZXZlbHMgb2YgbmVzdGVkIGNvbW1lbnRzXG5cdFx0bXVsdGlsaW5lQ29tbWVudCA9IG11bHRpbGluZUNvbW1lbnQucmVwbGFjZSgvPHNlbGY+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG11bHRpbGluZUNvbW1lbnQ7IH0pO1xuXHR9XG5cdG11bHRpbGluZUNvbW1lbnQgPSBtdWx0aWxpbmVDb21tZW50LnJlcGxhY2UoLzxzZWxmPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiAvW15cXHNcXFNdLy5zb3VyY2U7IH0pO1xuXG5cblx0UHJpc20ubGFuZ3VhZ2VzLnJ1c3QgPSB7XG5cdFx0J2NvbW1lbnQnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKF58W15cXFxcXSkvLnNvdXJjZSArIG11bHRpbGluZUNvbW1lbnQpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFw6XSlcXC9cXC8uKi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9iP1wiKD86XFxcXFtcXHNcXFNdfFteXFxcXFwiXSkqXCJ8Yj9yKCMqKVwiKD86W15cIl18XCIoPyFcXDEpKSpcIlxcMS8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdjaGFyJzoge1xuXHRcdFx0cGF0dGVybjogL2I/Jyg/OlxcXFwoPzp4WzAtN11bXFxkYS1mQS1GXXx1XFx7KD86W1xcZGEtZkEtRl1fKil7MSw2fVxcfXwuKXxbXlxcXFxcXHJcXG5cXHQnXSknLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2F0dHJpYnV0ZSc6IHtcblx0XHRcdHBhdHRlcm46IC8jIT9cXFsoPzpbXlxcW1xcXVwiXXxcIig/OlxcXFxbXFxzXFxTXXxbXlxcXFxcIl0pKlwiKSpcXF0vLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdhdHRyLW5hbWUnLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdzdHJpbmcnOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBDbG9zdXJlIHBhcmFtcyBzaG91bGQgbm90IGJlIGNvbmZ1c2VkIHdpdGggYml0d2lzZSBPUiB8XG5cdFx0J2Nsb3N1cmUtcGFyYW1zJzoge1xuXHRcdFx0cGF0dGVybjogLyhbPSgsOl1cXHMqfFxcYm1vdmVcXHMqKVxcfFtefF0qXFx8fFxcfFtefF0qXFx8KD89XFxzKig/Olxce3wtPikpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2Nsb3N1cmUtcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15cXHx8XFx8JC8sXG5cdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0fSxcblx0XHRcdFx0cmVzdDogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0J2xpZmV0aW1lLWFubm90YXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvJ1xcdysvLFxuXHRcdFx0YWxpYXM6ICdzeW1ib2wnXG5cdFx0fSxcblxuXHRcdCdmcmFnbWVudC1zcGVjaWZpZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcJFxcdys6KVthLXpdKy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXHRcdCd2YXJpYWJsZSc6IC9cXCRcXHcrLyxcblxuXHRcdCdmdW5jdGlvbi1kZWZpbml0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXGJmblxccyspXFx3Ky8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9LFxuXHRcdCd0eXBlLWRlZmluaXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYig/OmVudW18c3RydWN0fHRyYWl0fHR5cGV8dW5pb24pXFxzKylcXHcrLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdFx0fSxcblx0XHQnbW9kdWxlLWRlY2xhcmF0aW9uJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcYig/OmNyYXRlfG1vZClcXHMrKVthLXpdW2Etel9cXGRdKi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnbmFtZXNwYWNlJ1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXGIoPzpjcmF0ZXxzZWxmfHN1cGVyKVxccyopOjpcXHMqW2Etel1bYS16X1xcZF0qXFxiKD86XFxzKjo6KD86XFxzKlthLXpdW2Etel9cXGRdKlxccyo6OikqKT8vLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ25hbWVzcGFjZScsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC86Oi9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2tleXdvcmQnOiBbXG5cdFx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL3JlZmVyZW5jZS9ibG9iL21hc3Rlci9zcmMva2V5d29yZHMubWRcblx0XHRcdC9cXGIoPzpTZWxmfGFic3RyYWN0fGFzfGFzeW5jfGF3YWl0fGJlY29tZXxib3h8YnJlYWt8Y29uc3R8Y29udGludWV8Y3JhdGV8ZG98ZHlufGVsc2V8ZW51bXxleHRlcm58ZmluYWx8Zm58Zm9yfGlmfGltcGx8aW58bGV0fGxvb3B8bWFjcm98bWF0Y2h8bW9kfG1vdmV8bXV0fG92ZXJyaWRlfHByaXZ8cHVifHJlZnxyZXR1cm58c2VsZnxzdGF0aWN8c3RydWN0fHN1cGVyfHRyYWl0fHRyeXx0eXBlfHR5cGVvZnx1bmlvbnx1bnNhZmV8dW5zaXplZHx1c2V8dmlydHVhbHx3aGVyZXx3aGlsZXx5aWVsZClcXGIvLFxuXHRcdFx0Ly8gcHJpbWl0aXZlcyBhbmQgc3RyXG5cdFx0XHQvLyBodHRwczovL2RvYy5ydXN0LWxhbmcub3JnL3N0YWJsZS9ydXN0LWJ5LWV4YW1wbGUvcHJpbWl0aXZlcy5odG1sXG5cdFx0XHQvXFxiKD86Ym9vbHxjaGFyfGYoPzozMnw2NCl8W3VpXSg/Ojh8MTZ8MzJ8NjR8MTI4fHNpemUpfHN0cilcXGIvXG5cdFx0XSxcblxuXHRcdC8vIGZ1bmN0aW9ucyBjYW4gdGVjaG5pY2FsbHkgc3RhcnQgd2l0aCBhbiB1cHBlci1jYXNlIGxldHRlciwgYnV0IHRoaXMgd2lsbCBpbnRyb2R1Y2UgYSBsb3Qgb2YgZmFsc2UgcG9zaXRpdmVzXG5cdFx0Ly8gYW5kIFJ1c3QncyBuYW1pbmcgY29udmVudGlvbnMgcmVjb21tZW5kIHNuYWtlX2Nhc2UgYW55d2F5LlxuXHRcdC8vIGh0dHBzOi8vZG9jLnJ1c3QtbGFuZy5vcmcvMS4wLjAvc3R5bGUvc3R5bGUvbmFtaW5nL1JFQURNRS5odG1sXG5cdFx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1cXHMqKD86OjpcXHMqPHxcXCgpKS8sXG5cdFx0J21hY3JvJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYlxcdyshLyxcblx0XHRcdGFsaWFzOiAncHJvcGVydHknXG5cdFx0fSxcblx0XHQnY29uc3RhbnQnOiAvXFxiW0EtWl9dW0EtWl9cXGRdK1xcYi8sXG5cdFx0J2NsYXNzLW5hbWUnOiAvXFxiW0EtWl1cXHcqXFxiLyxcblxuXHRcdCduYW1lc3BhY2UnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKD86XFxiW2Etel1bYS16X1xcZF0qXFxzKjo6XFxzKikqXFxiW2Etel1bYS16X1xcZF0qXFxzKjo6KD8hXFxzKjwpLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvOjovXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIEhleCwgb2N0LCBiaW4sIGRlYyBudW1iZXJzIHdpdGggdmlzdWFsIHNlcGFyYXRvcnMgYW5kIHR5cGUgc3VmZml4XG5cdFx0J251bWJlcic6IC9cXGIoPzoweFtcXGRBLUZhLWZdKD86Xz9bXFxkQS1GYS1mXSkqfDBvWzAtN10oPzpfP1swLTddKSp8MGJbMDFdKD86Xz9bMDFdKSp8KD86KD86XFxkKD86Xz9cXGQpKik/XFwuKT9cXGQoPzpfP1xcZCkqKD86W0VlXVsrLV0/XFxkKyk/KSg/Ol8/KD86ZjMyfGY2NHxbaXVdKD86OHwxNnwzMnw2NHxzaXplKT8pKT9cXGIvLFxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0XHQncHVuY3R1YXRpb24nOiAvLT58XFwuXFwuPXxcXC57MSwzfXw6Onxbe31bXFxdOygpLDpdLyxcblx0XHQnb3BlcmF0b3InOiAvWy0rKlxcLyUhXl09P3w9Wz0+XT98JlsmPV0/fFxcfFt8PV0/fDw8Pz0/fD4+Pz0/fFtAP10vXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnJ1c3RbJ2Nsb3N1cmUtcGFyYW1zJ10uaW5zaWRlLnJlc3QgPSBQcmlzbS5sYW5ndWFnZXMucnVzdDtcblx0UHJpc20ubGFuZ3VhZ2VzLnJ1c3RbJ2F0dHJpYnV0ZSddLmluc2lkZVsnc3RyaW5nJ10gPSBQcmlzbS5sYW5ndWFnZXMucnVzdFsnc3RyaW5nJ107XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBzdHJpbmdQYXR0ZXJuID0gLyg/OlwiKD86XCJcInxbXlwiXSkqXCIoPyFcIil8Jyg/OicnfFteJ10pKicoPyEnKSkvLnNvdXJjZTtcblxuXHR2YXIgbnVtYmVyID0gL1xcYig/OlxcZFtcXGRhLWZdKnh8XFxkKyg/OlxcLlxcZCspPyg/OmVbKy1dP1xcZCspPylcXGIvaTtcblx0dmFyIG51bWVyaWNDb25zdGFudCA9IHtcblx0XHRwYXR0ZXJuOiBSZWdFeHAoc3RyaW5nUGF0dGVybiArICdbYnhdJyksXG5cdFx0YWxpYXM6ICdudW1iZXInXG5cdH07XG5cblx0dmFyIG1hY3JvVmFyaWFibGUgPSB7XG5cdFx0cGF0dGVybjogLyZbYS16X11cXHcqL2lcblx0fTtcblxuXHR2YXIgbWFjcm9LZXl3b3JkID0ge1xuXHRcdHBhdHRlcm46IC8oKD86XnxcXHN8PXxcXCgpKSUoPzpBQk9SVHxCWXxDTVN8Q09QWXxESVNQTEFZfERPfEVMU0V8RU5EfEVWQUx8R0xPQkFMfEdPfEdPVE98SUZ8SU5DfElOQ0xVREV8SU5ERVh8SU5QVVR8S1RSSU18TEVOR1RIfExFVHxMSVNUfExPQ0FMfFBVVHxRS1RSSU18UVNDQU58UVNVQlNUUnxRU1lTRlVOQ3xRVVBDQVNFfFJFVFVSTnxSVU58U0NBTnxTVUJTVFJ8U1VQRVJRfFNZTURFTHxTWU1FWElTVHxTWU1HTE9CTHxTWU1MT0NBTHxTWVNDQUxMfFNZU0VWQUxGfFNZU0VYRUN8U1lTRlVOQ3xTWVNHRVR8U1lTUlBVVHxUSEVOfFRPfFRTT3xVTlFVT1RFfFVOVElMfFVQQ0FTRXxXSElMRXxXSU5ET1cpXFxiL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH07XG5cblx0dmFyIHN0ZXAgPSB7XG5cdFx0cGF0dGVybjogLyhefFxccykoPzpwcm9jXFxzK1xcdyt8ZGF0YSg/IT0pfHF1aXR8cnVuKVxcYi9pLFxuXHRcdGFsaWFzOiAna2V5d29yZCcsXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9O1xuXG5cdHZhciBjb21tZW50ID0gW1xuXHRcdC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvLyxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qfDtcXHMqKVxcKlteO10qOy9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0XTtcblxuXHR2YXIgc3RyaW5nID0ge1xuXHRcdHBhdHRlcm46IFJlZ0V4cChzdHJpbmdQYXR0ZXJuKSxcblx0XHRncmVlZHk6IHRydWVcblx0fTtcblxuXHR2YXIgcHVuY3R1YXRpb24gPSAvWyQlQC4oKXt9XFxbXFxdOyxcXFxcXS87XG5cblx0dmFyIGZ1bmMgPSB7XG5cdFx0cGF0dGVybjogLyU/XFxiXFx3Kyg/PVxcKCkvLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fTtcblxuXHR2YXIgYXJncyA9IHtcblx0XHQnZnVuY3Rpb24nOiBmdW5jLFxuXHRcdCdhcmctdmFsdWUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKD1cXHMqKVtBLVpcXC5dKy9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J29wZXJhdG9yJzogLz0vLFxuXHRcdCdtYWNyby12YXJpYWJsZSc6IG1hY3JvVmFyaWFibGUsXG5cdFx0J2FyZyc6IHtcblx0XHRcdHBhdHRlcm46IC9bQS1aXSsvaSxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9LFxuXHRcdCdudW1iZXInOiBudW1iZXIsXG5cdFx0J251bWVyaWMtY29uc3RhbnQnOiBudW1lcmljQ29uc3RhbnQsXG5cdFx0J3B1bmN0dWF0aW9uJzogcHVuY3R1YXRpb24sXG5cdFx0J3N0cmluZyc6IHN0cmluZ1xuXHR9O1xuXG5cdHZhciBmb3JtYXQgPSB7XG5cdFx0cGF0dGVybjogL1xcYig/OmZvcm1hdHxwdXQpXFxiPT9bXFx3JyQuXSsvaSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdrZXl3b3JkJzogL14oPzpmb3JtYXR8cHV0KSg/PT0pL2ksXG5cdFx0XHQnZXF1YWxzJzogLz0vLFxuXHRcdFx0J2Zvcm1hdCc6IHtcblx0XHRcdFx0cGF0dGVybjogLyg/Olxcd3xcXCRcXGQpK1xcLlxcZD8vLFxuXHRcdFx0XHRhbGlhczogJ251bWJlcidcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0dmFyIGFsdGZvcm1hdCA9IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86Zm9ybWF0fHB1dClcXHMrW1xcdyddKyg/OlxccytbJC5cXHddKykrKD89OykvaSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdrZXl3b3JkJzogL14oPzpmb3JtYXR8cHV0KS9pLFxuXHRcdFx0J2Zvcm1hdCc6IHtcblx0XHRcdFx0cGF0dGVybjogL1tcXHckXStcXC5cXGQ/Lyxcblx0XHRcdFx0YWxpYXM6ICdudW1iZXInXG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdHZhciBnbG9iYWxTdGF0ZW1lbnRzID0ge1xuXHRcdHBhdHRlcm46IC8oKD86XnxcXHMpPT8pKD86Y2F0bmFtZXxjaGVja3BvaW50IGV4ZWN1dGVfYWx3YXlzfGRtfGVuZHNhc3xmaWxlbmFtZXxmb290bm90ZXwlaW5jbHVkZXxsaWJuYW1lfCVsaXN0fGxvY2t8bWlzc2luZ3xvcHRpb25zfHBhZ2V8cmVzZXRsaW5lfCVydW58c2FzZmlsZXxza2lwfHN5c2VjaG98dGl0bGVcXGQ/KVxcYi9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9O1xuXG5cdHZhciBzdWJtaXRTdGF0ZW1lbnQgPSB7XG5cdFx0cGF0dGVybjogLyhefFxccykoPzpzdWJtaXQoPzpcXHMrKD86bG9hZHxub3J1bnxwYXJzZW9ubHkpKT98ZW5kc3VibWl0KVxcYi9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9O1xuXG5cdHZhciBhY3Rpb25TZXRzID0gL2FTdG9yZXxhY2Nlc3NDb250cm9sfGFnZ3JlZ2F0aW9ufGF1ZGlvfGF1dG90dW5lfGJheWVzaWFuTmV0Q2xhc3NpZmllcnxiaW9NZWRJbWFnZXxib29sUnVsZXxidWlsdGluc3xjYXJkaW5hbGl0eXxjZG18Y2x1c3RlcmluZ3xjb25kaXRpb25hbFJhbmRvbUZpZWxkc3xjb25maWd1cmF0aW9ufGNvcHVsYXxjb3VudHJlZ3xkYXRhRGlzY292ZXJ5fGRhdGFQcmVwcm9jZXNzfGRhdGFTY2llbmNlUGlsb3R8ZGF0YVN0ZXB8ZGVjaXNpb25UcmVlfGRlZHVwbGljYXRpb258ZGVlcExlYXJufGRlZXBOZXVyYWx8ZGVlcFJubnxkczJ8ZWNtfGVudGl0eVJlc3xlc3BDbHVzdGVyfGV4cGxhaW5Nb2RlbHxmYWN0bWFjfGZhc3RLbm58ZmNtcGFjdHxmZWRTcWx8ZnJlcVRhYnxnVmFyQ2x1c3RlcnxnYW18Z2xlYW18Z3JhcGhTZW1pU3VwTGVhcm58aGlkZGVuTWFya292TW9kZWx8aHlwZXJHcm91cHxpY2F8aW1hZ2V8aW1sfGtlcm5hbFBjYXxsYW5nTW9kZWx8bGRhVG9waWN8bG9hZFN0cmVhbXN8bWJjfG1peGVkfG1sVG9vbHN8bW9kZWxQdWJsaXNoaW5nfG5ldHdvcmt8bmV1cmFsTmV0fG5tZnxub25QYXJhbWV0cmljQmF5ZXN8bm9ubGluZWFyfG9wdE5ldHdvcmt8b3B0aW1pemF0aW9ufHBhbmVsfHBjYXxwZXJjZW50aWxlfHBocmVnfHBsc3xxa2J8cWxpbXxxdWFudHJlZ3xyZWNvbW1lbmR8cmVncmVzc2lvbnxyZWluZm9yY2VtZW50TGVhcm58cm9idXN0UGNhfHJ1bGVNaW5pbmd8c2FtcGxpbmd8c2FuZHdpY2h8c2NjYXNsfHNlYXJjaCg/OkFuYWx5dGljcyk/fHNlbnRpbWVudEFuYWx5c2lzfHNlcXVlbmNlfHNlc3Npb24oPzpQcm9wKT98c2V2ZXJpdHl8c2ltU3lzdGVtfHNpbXBsZXxzbWFydERhdGF8c3BhcmtFbWJlZGRlZFByb2Nlc3N8c3BhcnNlTUx8c3BhdGlhbHJlZ3xzcGN8c3RhYmlsaXR5TW9uaXRvcmluZ3xzdkRhdGFEZXNjcmlwdGlvbnxzdm18dGFibGV8dGV4dCg/OkZpbHRlcnN8RnJlcXVlbmN5fE1pbmluZ3xQYXJzZXxSdWxlKD86RGV2ZWxvcHxTY29yZSl8VG9waWN8VXRpbCl8dGltZURhdGF8dHJhbnNwb3NlfHRzSW5mb3x0c1JlY29uY2lsZXx1bmlUaW1lU2VyaWVzfHZhclJlZHVjZS8uc291cmNlO1xuXG5cdHZhciBjYXNBY3Rpb25zID0ge1xuXHRcdHBhdHRlcm46IFJlZ0V4cCgvKF58XFxzKSg/OmFjdGlvblxccyspPyg/OjxhY3Q+KVxcLlthLXpdK1xcYlteO10rLy5zb3VyY2UucmVwbGFjZSgvPGFjdD4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gYWN0aW9uU2V0czsgfSksICdpJyksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdrZXl3b3JkJzogUmVnRXhwKC8oPzo8YWN0PilcXC5bYS16XStcXGIvLnNvdXJjZS5yZXBsYWNlKC88YWN0Pi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBhY3Rpb25TZXRzOyB9KSwgJ2knKSxcblx0XHRcdCdhY3Rpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oPzphY3Rpb24pL2ksXG5cdFx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHRcdH0sXG5cdFx0XHQnY29tbWVudCc6IGNvbW1lbnQsXG5cdFx0XHQnZnVuY3Rpb24nOiBmdW5jLFxuXHRcdFx0J2FyZy12YWx1ZSc6IGFyZ3NbJ2FyZy12YWx1ZSddLFxuXHRcdFx0J29wZXJhdG9yJzogYXJncy5vcGVyYXRvcixcblx0XHRcdCdhcmd1bWVudCc6IGFyZ3MuYXJnLFxuXHRcdFx0J251bWJlcic6IG51bWJlcixcblx0XHRcdCdudW1lcmljLWNvbnN0YW50JzogbnVtZXJpY0NvbnN0YW50LFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogcHVuY3R1YXRpb24sXG5cdFx0XHQnc3RyaW5nJzogc3RyaW5nXG5cdFx0fVxuXHR9O1xuXG5cdHZhciBrZXl3b3JkcyA9IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxzKT0/KSg/OmFmdGVyfGFuYWx5c2lzfGFuZHxhcnJheXxiYXJjaGFydHxiYXJ3aWR0aHxiZWdpbmdyYXBofGJ5fGNhbGx8Y2FzfGNiYXJsaW5lfGNmaWxsfGNsYXNzKD86bGV2KT98Y2xvc2V8Y29sdW1ufGNvbXB1dGVkP3xjb250YWluc3xjb250aW51ZXxkYXRhKD89PSl8ZGVmaW5lfGRlbGV0ZXxkZXNjcmliZXxkb2N1bWVudHxkb1xccytvdmVyfGRvfGRvbHxkcm9wfGR1bHxlbHNlfGVuZCg/OmNvbXB8c291cmNlKT98ZW50cnlUaXRsZXxldmFsKD86dWF0ZSk/fGV4ZWMoPzp1dGUpP3xleGl0fGZpbGUoPzpuYW1lKT98ZmlsbCg/OmF0dHJzKT98Zmxpc3R8Zm5jfGZ1bmN0aW9uKD86bGlzdCk/fGdsb2JhbHxnb3RvfGdyb3VwKD86YnkpP3xoZWFkbGluZXxoZWFkc2tpcHxoaXN0b2dyYW18aWZ8aW5maWxlfGtlZXB8a2V5bGFiZWx8a2V5d29yZHxsYWJlbHxsYXlvdXR8bGVhdmV8bGVnZW5kbGFiZWx8bGVuZ3RofGxpYm5hbWV8bG9hZGFjdGlvbnNldHxtZXJnZXxtaWRwb2ludHN8Xz9udWxsX3xuYW1lfG5vb2JzfG5vd2R8b2RzfG9wdGlvbnN8b3J8b3RoZXJ3aXNlfG91dCg/OnB1dCk/fG92ZXIoPzpsYXkpP3xwbG90fHByaW50fHB1dHxyYWlzZXxyYW5leHB8cmFubm9yfHJicmVha3xyZXRhaW58cmV0dXJufHNlbGVjdHxzZXNzaW9ufHNlc3NyZWZ8c2V0fHNvdXJjZXxzdGF0Z3JhcGh8c3VtfHN1bW1hcml6ZXx0YWJsZXx0ZW1wfHRlcm1pbmF0ZXx0aGVuXFxzK2RvfHRoZW58dGl0bGVcXGQ/fHRvfHZhcnx3aGVufHdoZXJlfHhheGlzb3B0c3x5MmF4aXNvcHRzfHlheGlzb3B0cylcXGIvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5zYXMgPSB7XG5cdFx0J2RhdGFsaW5lcyc6IHtcblx0XHRcdHBhdHRlcm46IC9eKFsgXFx0XSopKD86Y2FyZHN8KD86ZGF0YSk/bGluZXMpO1tcXHNcXFNdKz9eWyBcXHRdKjsvaW0sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdrZXl3b3JkJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eKD86Y2FyZHN8KD86ZGF0YSk/bGluZXMpL2lcblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLzsvXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdCdwcm9jLXNxbCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnByb2NcXHMrKD86ZmVkKT9zcWwoPzpcXHMrW1xcd3w9XSspPzspW1xcc1xcU10rPyg/PV4oPzpwcm9jXFxzK1xcdyt8ZGF0YXxxdWl0fHJ1bik7fCg/IVtcXHNcXFNdKSkvaW0sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdzcWwnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC9eWyBcXHRdKig/OnNlbGVjdHxhbHRlclxccyt0YWJsZXwoPzpjcmVhdGV8ZGVzY3JpYmV8ZHJvcClcXHMrKD86aW5kZXh8dGFibGUoPzpcXHMrY29uc3RyYWludHMpP3x2aWV3KXxjcmVhdGVcXHMrdW5pcXVlXFxzK2luZGV4fGluc2VydFxccytpbnRvfHVwZGF0ZSkoPzo8c3RyPnxbXjtcIiddKSs7Ly5zb3VyY2UucmVwbGFjZSgvPHN0cj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gc3RyaW5nUGF0dGVybjsgfSksICdpbScpLFxuXHRcdFx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2Utc3FsJyxcblx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5zcWxcblx0XHRcdFx0fSxcblx0XHRcdFx0J2dsb2JhbC1zdGF0ZW1lbnRzJzogZ2xvYmFsU3RhdGVtZW50cyxcblx0XHRcdFx0J3NxbC1zdGF0ZW1lbnRzJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXnxcXHMpKD86ZGlzY29ubmVjdFxccytmcm9tfGJlZ2lufGNvbW1pdHxleGVjKD86dXRlKT98cmVzZXR8cm9sbGJhY2t8dmFsaWRhdGUpXFxiL2ksXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdudW1iZXInOiBudW1iZXIsXG5cdFx0XHRcdCdudW1lcmljLWNvbnN0YW50JzogbnVtZXJpY0NvbnN0YW50LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiBwdW5jdHVhdGlvbixcblx0XHRcdFx0J3N0cmluZyc6IHN0cmluZ1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQncHJvYy1ncm9vdnknOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5wcm9jXFxzK2dyb292eSg/OlxccytbXFx3fD1dKyk/OylbXFxzXFxTXSs/KD89Xig/OnByb2NcXHMrXFx3K3xkYXRhfHF1aXR8cnVuKTt8KD8hW1xcc1xcU10pKS9pbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2NvbW1lbnQnOiBjb21tZW50LFxuXHRcdFx0XHQnZ3Jvb3Z5Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKF5bIFxcdF0qc3VibWl0KD86XFxzKyg/OmxvYWR8bm9ydW58cGFyc2Vvbmx5KSk/KSg/OjxzdHI+fFteXCInXSkrPyg/PWVuZHN1Ym1pdDspLy5zb3VyY2UucmVwbGFjZSgvPHN0cj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gc3RyaW5nUGF0dGVybjsgfSksICdpbScpLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1ncm9vdnknLFxuXHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmdyb292eVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQna2V5d29yZCc6IGtleXdvcmRzLFxuXHRcdFx0XHQnc3VibWl0LXN0YXRlbWVudCc6IHN1Ym1pdFN0YXRlbWVudCxcblx0XHRcdFx0J2dsb2JhbC1zdGF0ZW1lbnRzJzogZ2xvYmFsU3RhdGVtZW50cyxcblx0XHRcdFx0J251bWJlcic6IG51bWJlcixcblx0XHRcdFx0J251bWVyaWMtY29uc3RhbnQnOiBudW1lcmljQ29uc3RhbnQsXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IHB1bmN0dWF0aW9uLFxuXHRcdFx0XHQnc3RyaW5nJzogc3RyaW5nXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdCdwcm9jLWx1YSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnByb2NcXHMrbHVhKD86XFxzK1tcXHd8PV0rKT87KVtcXHNcXFNdKz8oPz1eKD86cHJvY1xccytcXHcrfGRhdGF8cXVpdHxydW4pO3woPyFbXFxzXFxTXSkpL2ltLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnY29tbWVudCc6IGNvbW1lbnQsXG5cdFx0XHRcdCdsdWEnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXlsgXFx0XSpzdWJtaXQoPzpcXHMrKD86bG9hZHxub3J1bnxwYXJzZW9ubHkpKT8pKD86PHN0cj58W15cIiddKSs/KD89ZW5kc3VibWl0OykvLnNvdXJjZS5yZXBsYWNlKC88c3RyPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBzdHJpbmdQYXR0ZXJuOyB9KSwgJ2ltJyksXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ2xhbmd1YWdlLWx1YScsXG5cdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMubHVhXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdrZXl3b3JkJzoga2V5d29yZHMsXG5cdFx0XHRcdCdzdWJtaXQtc3RhdGVtZW50Jzogc3VibWl0U3RhdGVtZW50LFxuXHRcdFx0XHQnZ2xvYmFsLXN0YXRlbWVudHMnOiBnbG9iYWxTdGF0ZW1lbnRzLFxuXHRcdFx0XHQnbnVtYmVyJzogbnVtYmVyLFxuXHRcdFx0XHQnbnVtZXJpYy1jb25zdGFudCc6IG51bWVyaWNDb25zdGFudCxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogcHVuY3R1YXRpb24sXG5cdFx0XHRcdCdzdHJpbmcnOiBzdHJpbmdcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0J3Byb2MtY2FzJzoge1xuXHRcdFx0cGF0dGVybjogLyhecHJvY1xccytjYXMoPzpcXHMrW1xcd3w9XSspPzspW1xcc1xcU10rPyg/PV4oPzpwcm9jXFxzK1xcdyt8cXVpdHxkYXRhKTt8KD8hW1xcc1xcU10pKS9pbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2NvbW1lbnQnOiBjb21tZW50LFxuXHRcdFx0XHQnc3RhdGVtZW50LXZhcic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxzKT0/KXNhdmVyZXN1bHRcXHNbXjtdKy9pbSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXG5cdFx0XHRcdFx0XHQnc3RhdGVtZW50Jzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXnNhdmVyZXN1bHRcXHMrXFxTKy9pLFxuXHRcdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0XHRrZXl3b3JkOiAvXig/OnNhdmVyZXN1bHQpL2lcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHJlc3Q6IGFyZ3Ncblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdjYXMtYWN0aW9ucyc6IGNhc0FjdGlvbnMsXG5cdFx0XHRcdCdzdGF0ZW1lbnQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLygoPzpefFxccyk9PykoPzpkZWZhdWx0fCg/OnVuKT9zZXR8b258b3V0cHV0fHVwbG9hZClbXjtdKy9pbSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZTogYXJnc1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnc3RlcCc6IHN0ZXAsXG5cdFx0XHRcdCdrZXl3b3JkJzoga2V5d29yZHMsXG5cdFx0XHRcdCdmdW5jdGlvbic6IGZ1bmMsXG5cdFx0XHRcdCdmb3JtYXQnOiBmb3JtYXQsXG5cdFx0XHRcdCdhbHRmb3JtYXQnOiBhbHRmb3JtYXQsXG5cdFx0XHRcdCdnbG9iYWwtc3RhdGVtZW50cyc6IGdsb2JhbFN0YXRlbWVudHMsXG5cdFx0XHRcdCdudW1iZXInOiBudW1iZXIsXG5cdFx0XHRcdCdudW1lcmljLWNvbnN0YW50JzogbnVtZXJpY0NvbnN0YW50LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiBwdW5jdHVhdGlvbixcblx0XHRcdFx0J3N0cmluZyc6IHN0cmluZ1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQncHJvYy1hcmdzJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXnByb2NcXHMrXFx3K1xccyspKD8hXFxzKSg/OlteO1wiJ118PHN0cj4pKzsvLnNvdXJjZS5yZXBsYWNlKC88c3RyPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBzdHJpbmdQYXR0ZXJuOyB9KSwgJ2ltJyksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBhcmdzXG5cdFx0fSxcblx0XHQvKlNwZWNpYWwga2V5d29yZHMgd2l0aGluIG1hY3JvcyovXG5cdFx0J21hY3JvLWtleXdvcmQnOiBtYWNyb0tleXdvcmQsXG5cdFx0J21hY3JvLXZhcmlhYmxlJzogbWFjcm9WYXJpYWJsZSxcblx0XHQnbWFjcm8tc3RyaW5nLWZ1bmN0aW9ucyc6IHtcblx0XHRcdHBhdHRlcm46IC8oKD86XnxcXHN8PSkpJSg/OkJRVU9URXxOUkJRVU9URXxOUlFVT1RFfE5SU1RSfFFVT1RFfFNUUilcXCguKj8oPzpbXiVdXFwpKS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZnVuY3Rpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyUoPzpCUVVPVEV8TlJCUVVPVEV8TlJRVU9URXxOUlNUUnxRVU9URXxTVFIpL2ksXG5cdFx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnbWFjcm8ta2V5d29yZCc6IG1hY3JvS2V5d29yZCxcblx0XHRcdFx0J21hY3JvLXZhcmlhYmxlJzogbWFjcm9WYXJpYWJsZSxcblx0XHRcdFx0J2VzY2FwZWQtY2hhcic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvJVsnXCIoKTw+PVx1MDBBQ15+OywjXS8sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IHB1bmN0dWF0aW9uXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnbWFjcm8tZGVjbGFyYXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXiVtYWNyb1teO10rKD89OykvaW0sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2tleXdvcmQnOiAvJW1hY3JvL2ksXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnbWFjcm8tZW5kJzoge1xuXHRcdFx0cGF0dGVybjogL14lbWVuZFteO10rKD89OykvaW0sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2tleXdvcmQnOiAvJW1lbmQvaSxcblx0XHRcdH1cblx0XHR9LFxuXHRcdC8qJV96c2NvcmUoaGVhZGNpciwgX2xoYywgX21oYywgX3NoYywgaGVhZGN6LCBoZWFkY3BjdCwgX0ZoZWFkY3opOyAqL1xuXHRcdCdtYWNybyc6IHtcblx0XHRcdHBhdHRlcm46IC8lX1xcdysoPz1cXCgpLyxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9LFxuXHRcdCdpbnB1dCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGJpbnB1dFxcc1stXFx3XFxzLyouJCZdKzsvaSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnaW5wdXQnOiB7XG5cdFx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJyxcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXmlucHV0L2ksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdjb21tZW50JzogY29tbWVudCxcblx0XHRcdFx0J251bWJlcic6IG51bWJlcixcblx0XHRcdFx0J251bWVyaWMtY29uc3RhbnQnOiBudW1lcmljQ29uc3RhbnRcblx0XHRcdH1cblx0XHR9LFxuXHRcdCdvcHRpb25zLWFyZ3MnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5vcHRpb25zKVstJ1wifC9cXFxcPD4qKz06KClcXHdcXHNdKig/PTspL2ltLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZTogYXJnc1xuXHRcdH0sXG5cdFx0J2Nhcy1hY3Rpb25zJzogY2FzQWN0aW9ucyxcblx0XHQnY29tbWVudCc6IGNvbW1lbnQsXG5cdFx0J2Z1bmN0aW9uJzogZnVuYyxcblx0XHQnZm9ybWF0JzogZm9ybWF0LFxuXHRcdCdhbHRmb3JtYXQnOiBhbHRmb3JtYXQsXG5cdFx0J251bWVyaWMtY29uc3RhbnQnOiBudW1lcmljQ29uc3RhbnQsXG5cdFx0J2RhdGV0aW1lJzoge1xuXHRcdFx0Ly8gJzFqYW4yMDEzJ2QsICc5OjI1OjE5cG0ndCwgJzE4amFuMjAwMzo5OjI3OjA1YW0nZHRcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChzdHJpbmdQYXR0ZXJuICsgJyg/OmR0P3x0KScpLFxuXHRcdFx0YWxpYXM6ICdudW1iZXInXG5cdFx0fSxcblx0XHQnc3RyaW5nJzogc3RyaW5nLFxuXHRcdCdzdGVwJzogc3RlcCxcblx0XHQna2V5d29yZCc6IGtleXdvcmRzLFxuXHRcdC8vIEluIFNBUyBTdHVkaW8gc3ludGF4IGhpZ2hsaWdodGluZywgdGhlc2Ugb3BlcmF0b3JzIGFyZSBzdHlsZWQgbGlrZSBrZXl3b3Jkc1xuXHRcdCdvcGVyYXRvci1rZXl3b3JkJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYig/OmVxfGdlfGd0fGlufGxlfGx0fG5lfG5vdClcXGIvaSxcblx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0fSxcblx0XHQvLyBEZWNpbWFsICgxLjJlMjMpLCBoZXhhZGVjaW1hbCAoMGMxeClcblx0XHQnbnVtYmVyJzogbnVtYmVyLFxuXHRcdCdvcGVyYXRvcic6IC9cXCpcXCo/fFxcfFxcfD98ISE/fFx1MDBBNlx1MDBBNj98PFs+PV0/fD5bPD1dP3xbLStcXC89Jl18W35cdTAwQUNeXT0/Lyxcblx0XHQncHVuY3R1YXRpb24nOiBwdW5jdHVhdGlvblxuXHR9O1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0UHJpc20ubGFuZ3VhZ2VzLnNhc3MgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjc3MnLCB7XG5cdFx0Ly8gU2FzcyBjb21tZW50cyBkb24ndCBuZWVkIHRvIGJlIGNsb3NlZCwgb25seSBpbmRlbnRlZFxuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogL14oWyBcXHRdKilcXC9bXFwvKl0uKig/Oig/Olxccj9cXG58XFxyKVxcMVsgXFx0XS4rKSovbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3Nhc3MnLCAnYXRydWxlJywge1xuXHRcdC8vIFdlIHdhbnQgdG8gY29uc3VtZSB0aGUgd2hvbGUgbGluZVxuXHRcdCdhdHJ1bGUtbGluZSc6IHtcblx0XHRcdC8vIEluY2x1ZGVzIHN1cHBvcnQgZm9yID0gYW5kICsgc2hvcnRjdXRzXG5cdFx0XHRwYXR0ZXJuOiAvXig/OlsgXFx0XSopW0ArPV0uKy9tLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdhdHJ1bGUnOiAvKD86QFtcXHctXSt8Wys9XSkvXG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0ZGVsZXRlIFByaXNtLmxhbmd1YWdlcy5zYXNzLmF0cnVsZTtcblxuXG5cdHZhciB2YXJpYWJsZSA9IC9cXCRbLVxcd10rfCNcXHtcXCRbLVxcd10rXFx9Lztcblx0dmFyIG9wZXJhdG9yID0gW1xuXHRcdC9bKypcXC8lXXxbPSFdPXw8PT98Pj0/fFxcYig/OmFuZHxub3R8b3IpXFxiLyxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKFxccyktKD89XFxzKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3Nhc3MnLCAncHJvcGVydHknLCB7XG5cdFx0Ly8gV2Ugd2FudCB0byBjb25zdW1lIHRoZSB3aG9sZSBsaW5lXG5cdFx0J3ZhcmlhYmxlLWxpbmUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXlsgXFx0XSpcXCQuKy9tLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC86Lyxcblx0XHRcdFx0J3ZhcmlhYmxlJzogdmFyaWFibGUsXG5cdFx0XHRcdCdvcGVyYXRvcic6IG9wZXJhdG9yXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvLyBXZSB3YW50IHRvIGNvbnN1bWUgdGhlIHdob2xlIGxpbmVcblx0XHQncHJvcGVydHktbGluZSc6IHtcblx0XHRcdHBhdHRlcm46IC9eWyBcXHRdKig/OlteOlxcc10rICo6Lip8OlteOlxcc10uKikvbSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHJvcGVydHknOiBbXG5cdFx0XHRcdFx0L1teOlxcc10rKD89XFxzKjopLyxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKDopW146XFxzXSsvLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLzovLFxuXHRcdFx0XHQndmFyaWFibGUnOiB2YXJpYWJsZSxcblx0XHRcdFx0J29wZXJhdG9yJzogb3BlcmF0b3IsXG5cdFx0XHRcdCdpbXBvcnRhbnQnOiBQcmlzbS5sYW5ndWFnZXMuc2Fzcy5pbXBvcnRhbnRcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHRkZWxldGUgUHJpc20ubGFuZ3VhZ2VzLnNhc3MucHJvcGVydHk7XG5cdGRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMuc2Fzcy5pbXBvcnRhbnQ7XG5cblx0Ly8gTm93IHRoYXQgd2hvbGUgbGluZXMgZm9yIG90aGVyIHBhdHRlcm5zIGFyZSBjb25zdW1lZCxcblx0Ly8gd2hhdCdzIGxlZnQgc2hvdWxkIGJlIHNlbGVjdG9yc1xuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdzYXNzJywgJ3B1bmN0dWF0aW9uJywge1xuXHRcdCdzZWxlY3Rvcic6IHtcblx0XHRcdHBhdHRlcm46IC9eKFsgXFx0XSopXFxTKD86LFteLFxcclxcbl0rfFteLFxcclxcbl0qKSg/OixbXixcXHJcXG5dKykqKD86LCg/Olxccj9cXG58XFxyKVxcMVsgXFx0XStcXFMoPzosW14sXFxyXFxuXSt8W14sXFxyXFxuXSopKD86LFteLFxcclxcbl0rKSopKi9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0fSk7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLnNjc3MgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjc3MnLCB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSg/OlxcL1xcKltcXHNcXFNdKj9cXCpcXC98XFwvXFwvLiopLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdhdHJ1bGUnOiB7XG5cdFx0cGF0dGVybjogL0BbXFx3LV0oPzpcXChbXigpXStcXCl8W14oKVxcc118XFxzKyg/IVxccykpKj8oPz1cXHMrW3s7XSkvLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3J1bGUnOiAvQFtcXHctXSsvXG5cdFx0XHQvLyBTZWUgcmVzdCBiZWxvd1xuXHRcdH1cblx0fSxcblx0Ly8gdXJsLCBjb21wYXNzaWZpZWRcblx0J3VybCc6IC8oPzpbLWEtel0rLSk/dXJsKD89XFwoKS9pLFxuXHQvLyBDU1Mgc2VsZWN0b3IgcmVnZXggaXMgbm90IGFwcHJvcHJpYXRlIGZvciBTYXNzXG5cdC8vIHNpbmNlIHRoZXJlIGNhbiBiZSBsb3QgbW9yZSB0aGluZ3MgKHZhciwgQCBkaXJlY3RpdmUsIG5lc3RpbmcuLilcblx0Ly8gYSBzZWxlY3RvciBtdXN0IHN0YXJ0IGF0IHRoZSBlbmQgb2YgYSBwcm9wZXJ0eSBvciBhZnRlciBhIGJyYWNlIChlbmQgb2Ygb3RoZXIgcnVsZXMgb3IgbmVzdGluZylcblx0Ly8gaXQgY2FuIGNvbnRhaW4gc29tZSBjaGFyYWN0ZXJzIHRoYXQgYXJlbid0IHVzZWQgZm9yIGRlZmluaW5nIHJ1bGVzIG9yIGVuZCBvZiBzZWxlY3RvciwgJiAocGFyZW50IHNlbGVjdG9yKSwgb3IgaW50ZXJwb2xhdGVkIHZhcmlhYmxlXG5cdC8vIHRoZSBlbmQgb2YgYSBzZWxlY3RvciBpcyBmb3VuZCB3aGVuIHRoZXJlIGlzIG5vIHJ1bGVzIGluIGl0ICgge30gb3Ige1xcc30pIG9yIGlmIHRoZXJlIGlzIGEgcHJvcGVydHkgKGJlY2F1c2UgYW4gaW50ZXJwb2xhdGVkIHZhclxuXHQvLyBjYW4gXCJwYXNzXCIgYXMgYSBzZWxlY3Rvci0gZS5nOiBwcm9wZXIjeyRlcnR5fSlcblx0Ly8gdGhpcyBvbmUgd2FzIGhhcmQgdG8gZG8sIHNvIHBsZWFzZSBiZSBjYXJlZnVsIGlmIHlvdSBlZGl0IHRoaXMgb25lIDopXG5cdCdzZWxlY3Rvcic6IHtcblx0XHQvLyBJbml0aWFsIGxvb2stYWhlYWQgaXMgdXNlZCB0byBwcmV2ZW50IG1hdGNoaW5nIG9mIGJsYW5rIHNlbGVjdG9yc1xuXHRcdHBhdHRlcm46IC8oPz1cXFMpW15AO3t9KCldPyg/OlteQDt7fSgpXFxzXXxcXHMrKD8hXFxzKXwjXFx7XFwkWy1cXHddK1xcfSkrKD89XFxzKlxceyg/OlxcfXxcXHN8W159XVteOnt9XSpbOntdW159XSkpLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwYXJlbnQnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8mLyxcblx0XHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdFx0XHR9LFxuXHRcdFx0J3BsYWNlaG9sZGVyJzogLyVbLVxcd10rLyxcblx0XHRcdCd2YXJpYWJsZSc6IC9cXCRbLVxcd10rfCNcXHtcXCRbLVxcd10rXFx9L1xuXHRcdH1cblx0fSxcblx0J3Byb3BlcnR5Jzoge1xuXHRcdHBhdHRlcm46IC8oPzpbLVxcd118XFwkWy1cXHddfCNcXHtcXCRbLVxcd10rXFx9KSsoPz1cXHMqOikvLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3ZhcmlhYmxlJzogL1xcJFstXFx3XSt8I1xce1xcJFstXFx3XStcXH0vXG5cdFx0fVxuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnc2NzcycsICdhdHJ1bGUnLCB7XG5cdCdrZXl3b3JkJzogW1xuXHRcdC9AKD86Y29udGVudHxkZWJ1Z3xlYWNofGVsc2UoPzogaWYpP3xleHRlbmR8Zm9yfGZvcndhcmR8ZnVuY3Rpb258aWZ8aW1wb3J0fGluY2x1ZGV8bWl4aW58cmV0dXJufHVzZXx3YXJufHdoaWxlKVxcYi9pLFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oICkoPzpmcm9tfHRocm91Z2gpKD89ICkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0XVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3Njc3MnLCAnaW1wb3J0YW50Jywge1xuXHQvLyB2YXIgYW5kIGludGVycG9sYXRlZCB2YXJzXG5cdCd2YXJpYWJsZSc6IC9cXCRbLVxcd10rfCNcXHtcXCRbLVxcd10rXFx9L1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3Njc3MnLCAnZnVuY3Rpb24nLCB7XG5cdCdtb2R1bGUtbW9kaWZpZXInOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OmFzfGhpZGV8c2hvd3x3aXRoKVxcYi9pLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J3BsYWNlaG9sZGVyJzoge1xuXHRcdHBhdHRlcm46IC8lWy1cXHddKy8sXG5cdFx0YWxpYXM6ICdzZWxlY3Rvcidcblx0fSxcblx0J3N0YXRlbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxCISg/OmRlZmF1bHR8b3B0aW9uYWwpXFxiL2ksXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdCdudWxsJzoge1xuXHRcdHBhdHRlcm46IC9cXGJudWxsXFxiLyxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdvcGVyYXRvcic6IHtcblx0XHRwYXR0ZXJuOiAvKFxccykoPzpbLSsqXFwvJV18Wz0hXT18PD0/fD49P3xhbmR8bm90fG9yKSg/PVxccykvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5zY3NzWydhdHJ1bGUnXS5pbnNpZGUucmVzdCA9IFByaXNtLmxhbmd1YWdlcy5zY3NzO1xuXG5QcmlzbS5sYW5ndWFnZXMuc2NhbGEgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdqYXZhJywge1xuXHQndHJpcGxlLXF1b3RlZC1zdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiXCJcIltcXHNcXFNdKj9cIlwiXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ3N0cmluZydcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFwifCcpKD86XFxcXC58KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogLzwtfD0+fFxcYig/OmFic3RyYWN0fGNhc2V8Y2F0Y2h8Y2xhc3N8ZGVmfGRvfGVsc2V8ZXh0ZW5kc3xmaW5hbHxmaW5hbGx5fGZvcnxmb3JTb21lfGlmfGltcGxpY2l0fGltcG9ydHxsYXp5fG1hdGNofG5ld3xudWxsfG9iamVjdHxvdmVycmlkZXxwYWNrYWdlfHByaXZhdGV8cHJvdGVjdGVkfHJldHVybnxzZWFsZWR8c2VsZnxzdXBlcnx0aGlzfHRocm93fHRyYWl0fHRyeXx0eXBlfHZhbHx2YXJ8d2hpbGV8d2l0aHx5aWVsZClcXGIvLFxuXHQnbnVtYmVyJzogL1xcYjB4KD86W1xcZGEtZl0qXFwuKT9bXFxkYS1mXSt8KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OmVcXGQrKT9bZGZsXT8vaSxcblx0J2J1aWx0aW4nOiAvXFxiKD86QW55fEFueVJlZnxBbnlWYWx8Qm9vbGVhbnxCeXRlfENoYXJ8RG91YmxlfEZsb2F0fEludHxMb25nfE5vdGhpbmd8U2hvcnR8U3RyaW5nfFVuaXQpXFxiLyxcblx0J3N5bWJvbCc6IC8nW15cXGRcXHNcXFxcXVxcdyovXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnc2NhbGEnLCAndHJpcGxlLXF1b3RlZC1zdHJpbmcnLCB7XG5cdCdzdHJpbmctaW50ZXJwb2xhdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvXFxiW2Etel1cXHcqKD86XCJcIlwiKD86W14kXXxcXCQoPzpbXntdfFxceyg/Oltee31dfFxce1tee31dKlxcfSkqXFx9KSkqP1wiXCJcInxcIig/OlteJFwiXFxyXFxuXXxcXCQoPzpbXntdfFxceyg/Oltee31dfFxce1tee31dKlxcfSkqXFx9KSkqXCIpL2ksXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2lkJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXlxcdysvLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0XHR9LFxuXHRcdFx0J2VzY2FwZSc6IHtcblx0XHRcdFx0cGF0dGVybjogL1xcXFxcXCRcInxcXCRbJFwiXS8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdzeW1ib2wnXG5cdFx0XHR9LFxuXHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9cXCQoPzpcXHcrfFxceyg/Oltee31dfFxce1tee31dKlxcfSkqXFx9KS8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXCRcXHs/fFxcfSQvLFxuXHRcdFx0XHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5zY2FsYVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdH1cblx0fVxufSk7XG5cbmRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMuc2NhbGFbJ2NsYXNzLW5hbWUnXTtcbmRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMuc2NhbGFbJ2Z1bmN0aW9uJ107XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHQvLyBDQVJFRlVMIVxuXHQvLyBUaGUgZm9sbG93aW5nIHBhdHRlcm5zIGFyZSBjb25jYXRlbmF0ZWQsIHNvIHRoZSBncm91cCByZWZlcmVuY2VkIGJ5IGEgYmFjayByZWZlcmVuY2UgaXMgbm9uLW9idmlvdXMhXG5cblx0dmFyIHN0cmluZ3MgPSBbXG5cdFx0Ly8gbm9ybWFsIHN0cmluZ1xuXHRcdC9cIig/OlxcXFxbXFxzXFxTXXxcXCRcXChbXildK1xcKXxcXCQoPyFcXCgpfGBbXmBdK2B8W15cIlxcXFxgJF0pKlwiLy5zb3VyY2UsXG5cdFx0LydbXiddKicvLnNvdXJjZSxcblx0XHQvXFwkJyg/OlteJ1xcXFxdfFxcXFxbXFxzXFxTXSkqJy8uc291cmNlLFxuXG5cdFx0Ly8gaGVyZSBkb2Ncblx0XHQvLyAyIGNhcHR1cmluZyBncm91cHNcblx0XHQvPDwtP1xccyooW1wiJ10/KShcXHcrKVxcMVxcc1tcXHNcXFNdKj9bXFxyXFxuXVxcMi8uc291cmNlXG5cdF0uam9pbignfCcpO1xuXG5cdFByaXNtLmxhbmd1YWdlc1snc2hlbGwtc2Vzc2lvbiddID0ge1xuXHRcdCdjb21tYW5kJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0XHQvLyB1c2VyIGluZm9cblx0XHRcdFx0L14vLnNvdXJjZSArXG5cdFx0XHRcdCcoPzonICtcblx0XHRcdFx0KFxuXHRcdFx0XHRcdC8vIDx1c2VyPiBcIjpcIiAoIDxwYXRoPiApP1xuXHRcdFx0XHRcdC9bXlxcc0A6JCMlKiEvXFxcXF0rQFteXFxyXFxuQDokIyUqIS9cXFxcXSsoPzo6W15cXDAtXFx4MUYkIyUqP1wiPD46O3xdKyk/Ly5zb3VyY2UgK1xuXHRcdFx0XHRcdCd8JyArXG5cdFx0XHRcdFx0Ly8gPHBhdGg+XG5cdFx0XHRcdFx0Ly8gU2luY2UgdGhlIHBhdGggcGF0dGVybiBpcyBxdWl0ZSBnZW5lcmFsLCB3ZSB3aWxsIHJlcXVpcmUgaXQgdG8gc3RhcnQgd2l0aCBhIHNwZWNpYWwgY2hhcmFjdGVyIHRvXG5cdFx0XHRcdFx0Ly8gcHJldmVudCBmYWxzZSBwb3NpdGl2ZXMuXG5cdFx0XHRcdFx0L1svfi5dW15cXDAtXFx4MUYkIyUqP1wiPD5AOjt8XSovLnNvdXJjZVxuXHRcdFx0XHQpICtcblx0XHRcdFx0Jyk/JyArXG5cdFx0XHRcdC8vIHNoZWxsIHN5bWJvbFxuXHRcdFx0XHQvWyQjJV0oPz1cXHMpLy5zb3VyY2UgK1xuXHRcdFx0XHQvLyBiYXNoIGNvbW1hbmRcblx0XHRcdFx0Lyg/OlteXFxcXFxcclxcbiBcXHQnXCI8JF18WyBcXHRdKD86KD8hIyl8Iy4qJCl8XFxcXCg/OlteXFxyXXxcXHJcXG4/KXxcXCQoPyEnKXw8KD8hPCl8PDxzdHI+PikrLy5zb3VyY2UucmVwbGFjZSgvPDxzdHI+Pi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBzdHJpbmdzOyB9KSxcblx0XHRcdFx0J20nXG5cdFx0XHQpLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdpbmZvJzoge1xuXHRcdFx0XHRcdC8vIGZvb0BiYXI6fi9maWxlcyQgZXhpdFxuXHRcdFx0XHRcdC8vIGZvb0BiYXIkIGV4aXRcblx0XHRcdFx0XHQvLyB+L2ZpbGVzJCBleGl0XG5cdFx0XHRcdFx0cGF0dGVybjogL15bXiMkJV0rLyxcblx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCd1c2VyJzogL15bXlxcc0A6JCMlKiEvXFxcXF0rQFteXFxyXFxuQDokIyUqIS9cXFxcXSsvLFxuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLzovLFxuXHRcdFx0XHRcdFx0J3BhdGgnOiAvW1xcc1xcU10rL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J2Jhc2gnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyheWyQjJV1cXHMqKVxcU1tcXHNcXFNdKi8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ2xhbmd1YWdlLWJhc2gnLFxuXHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmJhc2hcblx0XHRcdFx0fSxcblx0XHRcdFx0J3NoZWxsLXN5bWJvbCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXlskIyVdLyxcblx0XHRcdFx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J291dHB1dCc6IC8uKD86LiooPzpbXFxyXFxuXXwuJCkpKi9cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXNbJ3NoLXNlc3Npb24nXSA9IFByaXNtLmxhbmd1YWdlc1snc2hlbGxzZXNzaW9uJ10gPSBQcmlzbS5sYW5ndWFnZXNbJ3NoZWxsLXNlc3Npb24nXTtcblxufShQcmlzbSkpO1xuXG4vLyBUZXN0IGZpbGVzIGZvciB0aGUgcGFyc2VyIGl0c2VsZjpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9KZXN1c0ZyZWtlL3NtYWxpL3RyZWUvbWFzdGVyL3NtYWxpL3NyYy90ZXN0L3Jlc291cmNlcy9MZXhlclRlc3RcblxuUHJpc20ubGFuZ3VhZ2VzLnNtYWxpID0ge1xuXHQnY29tbWVudCc6IC8jLiovLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlteXFxyXFxuXFxcXFwiXXxcXFxcLikqXCJ8Jyg/OlteXFxyXFxuXFxcXCddfFxcXFwoPzoufHVbXFxkYS1mQS1GXXs0fSkpJy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0cGF0dGVybjogLyhefFteTF0pTCg/Oig/Olxcdyt8YFteYFxcclxcbl0qYClcXC8pKig/OltcXHckXSt8YFteYFxcclxcbl0qYCkoPz1cXHMqOykvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnY2xhc3MtbmFtZSc6IHtcblx0XHRcdFx0cGF0dGVybjogLyheTHxcXC8pKD86W1xcdyRdK3xgW15gXFxyXFxuXSpgKSQvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0J25hbWVzcGFjZSc6IHtcblx0XHRcdFx0cGF0dGVybjogL14oTCkoPzooPzpcXHcrfGBbXmBcXHJcXG5dKmApXFwvKSsvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwvL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J2J1aWx0aW4nOiAvXkwvXG5cdFx0fVxuXHR9LFxuXHQnYnVpbHRpbic6IFtcblx0XHR7XG5cdFx0XHQvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9KZXN1c0ZyZWtlL3NtYWxpL3dpa2kvVHlwZXNNZXRob2RzQW5kRmllbGRzI3R5cGVzXG5cdFx0XHRwYXR0ZXJuOiAvKFsoKTtcXFtdKVtCQ0RGSUpTVlpdKy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHQvLyBlLmcuIC5maWVsZCBtV2lmaU9uVWlkOklcblx0XHRcdHBhdHRlcm46IC8oW1xcdyQ+XTopW0JDREZJSlNWWl0vLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J2tleXdvcmQnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhcXC5lbmRcXHMrKVtcXHctXSsvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFx3Li1dKVxcLig/IVxcZClbXFx3LV0rLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcdy4tXSkoPzphYnN0cmFjdHxhbm5vdGF0aW9ufGJyaWRnZXxjb25zdHJ1Y3RvcnxlbnVtfGZpbmFsfGludGVyZmFjZXxwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8cnVudGltZXxzdGF0aWN8c3ludGhldGljfHN5c3RlbXx0cmFuc2llbnQpKD8hW1xcdy4tXSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J2Z1bmN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcdy4tXSkoPzpcXHcrfDxbXFx3JC1dKz4pKD89XFwoKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXG5cdCdmaWVsZCc6IHtcblx0XHRwYXR0ZXJuOiAvW1xcdyRdKyg/PTopLyxcblx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHR9LFxuXHQncmVnaXN0ZXInOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFx3Li1dKVt2cF1cXGQoPyFbXFx3Li1dKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHR9LFxuXG5cdCdib29sZWFuJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcdy4tXSkoPzpmYWxzZXx0cnVlKSg/IVtcXHcuLV0pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdudW1iZXInOiB7XG5cdFx0cGF0dGVybjogLyhefFteL1xcdy4tXSktPyg/Ok5BTnxJTkZJTklUWXwweCg/OltcXGRBLUZdKyg/OlxcLltcXGRBLUZdKik/fFxcLltcXGRBLUZdKykoPzpwWystXT9bXFxkQS1GXSspP3woPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKD86ZVsrLV0/XFxkKyk/KVtkZmxzdF0/KD8hW1xcdy4tXSkvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cblx0J2xhYmVsJzoge1xuXHRcdHBhdHRlcm46IC8oOilcXHcrLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cblx0J29wZXJhdG9yJzogLy0+fFxcLlxcLnxbXFxbPV0vLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9KCksOzpdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnNtYWxsdGFsayA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86XCJcInxbXlwiXSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY2hhcic6IHtcblx0XHRwYXR0ZXJuOiAvXFwkLi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLycoPzonJ3xbXiddKSonLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N5bWJvbCc6IC8jW1xcZGEtel0rfCMoPzotfChbK1xcL1xcXFwqfjw+PUAlfCY/IV0pXFwxPyl8Iyg/PVxcKCkvaSxcblx0J2Jsb2NrLWFyZ3VtZW50cyc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcW1xccyopOlteXFxbfF0qXFx8Lyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3ZhcmlhYmxlJzogLzpbXFxkYS16XSsvaSxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXHwvXG5cdFx0fVxuXHR9LFxuXHQndGVtcG9yYXJ5LXZhcmlhYmxlcyc6IHtcblx0XHRwYXR0ZXJuOiAvXFx8W158XStcXHwvLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3ZhcmlhYmxlJzogL1tcXGRhLXpdKy9pLFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcfC9cblx0XHR9XG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/Om5ld3xuaWx8c2VsZnxzdXBlcilcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdCdudW1iZXInOiBbXG5cdFx0L1xcZCtyLT9bXFxkQS1aXSsoPzpcXC5bXFxkQS1aXSspPyg/OmUtP1xcZCspPy8sXG5cdFx0L1xcYlxcZCsoPzpcXC5cXGQrKT8oPzplLT9cXGQrKT8vXG5cdF0sXG5cdCdvcGVyYXRvcic6IC9bPD1dPT98Oj18flt+PV18XFwvXFwvP3xcXFxcXFxcXHw+Wz49XT98WyFeK1xcLSomfCxAXS8sXG5cdCdwdW5jdHVhdGlvbic6IC9bLjs6P1xcW1xcXSgpe31dL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdFByaXNtLmxhbmd1YWdlcy5zbWFydHkgPSB7XG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXlxce1xcKltcXHNcXFNdKj9cXCpcXH0vLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnZW1iZWRkZWQtcGhwJzoge1xuXHRcdFx0cGF0dGVybjogL15cXHtwaHBcXH1bXFxzXFxTXSo/XFx7XFwvcGhwXFx9Lyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnc21hcnR5Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eXFx7cGhwXFx9fFxce1xcL3BocFxcfSQvLFxuXHRcdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdFx0fSxcblx0XHRcdFx0J3BocCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0XHRhbGlhczogJ2xhbmd1YWdlLXBocCcsXG5cdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMucGhwXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdzdHJpbmcnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cIig/OlxcXFwufFteXCJcXFxcXFxyXFxuXSkqXCIvLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1xce1tee31dKlxcfXxgW15gXSpgLyxcblx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbi1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXlt7YF18W2B9XSQvLFxuXHRcdFx0XHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRcdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3ZhcmlhYmxlJzogL1xcJFxcdysvXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8nKD86XFxcXC58W14nXFxcXFxcclxcbl0pKicvLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XSxcblx0XHQna2V5d29yZCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXlxce1xcLz8pW2Etel9dXFx3KlxcYig/IVxcKCkvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXlxce1xcLz98XFx9JC8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cdFx0J251bWJlcic6IC9cXGIweFtcXGRBLUZhLWZdK3woPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86W0VlXVstK10/XFxkKyk/Lyxcblx0XHQndmFyaWFibGUnOiBbXG5cdFx0XHQvXFwkKD8hXFxkKVxcdysvLFxuXHRcdFx0LyMoPyFcXGQpXFx3KyMvLFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcLnwtPnxcXHdcXHMqPSkoPyFcXGQpXFx3K1xcYig/IVxcKCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcWykoPyFcXGQpXFx3Kyg/PVxcXSkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnZnVuY3Rpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcfFxccyopQD9bYS16X11cXHcqfFxcYlthLXpfXVxcdyooPz1cXCgpL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnYXR0ci1uYW1lJzogL1xcYlthLXpfXVxcdyooPz1cXHMqPSkvaSxcblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXxub3xvZmZ8b258dHJ1ZXx5ZXMpXFxiLyxcblx0XHQncHVuY3R1YXRpb24nOiAvW1xcW1xcXSgpe30uLDpgXXwtPi8sXG5cdFx0J29wZXJhdG9yJzogW1xuXHRcdFx0L1srXFwtKlxcLyVdfD09Pz0/fFshPD5dPT98JiZ8XFx8XFx8Py8sXG5cdFx0XHQvXFxiaXNcXHMrKD86bm90XFxzKyk/KD86ZGl2fGV2ZW58b2RkKSg/OlxccytieSk/XFxiLyxcblx0XHRcdC9cXGIoPzphbmR8ZXF8Z3Q/ZXxndHxsdD9lfGx0fG1vZHxuZXE/fG5vdHxvcilcXGIvXG5cdFx0XVxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5zbWFydHlbJ2VtYmVkZGVkLXBocCddLmluc2lkZS5zbWFydHkuaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLnNtYXJ0eTtcblx0UHJpc20ubGFuZ3VhZ2VzLnNtYXJ0eS5zdHJpbmdbMF0uaW5zaWRlLmludGVycG9sYXRpb24uaW5zaWRlLmV4cHJlc3Npb24uaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLnNtYXJ0eTtcblxuXHR2YXIgc3RyaW5nID0gL1wiKD86XFxcXC58W15cIlxcXFxcXHJcXG5dKSpcInwnKD86XFxcXC58W14nXFxcXFxcclxcbl0pKicvO1xuXHR2YXIgc21hcnR5UGF0dGVybiA9IFJlZ0V4cChcblx0XHQvLyBjb21tZW50c1xuXHRcdC9cXHtcXCpbXFxzXFxTXSo/XFwqXFx9Ly5zb3VyY2UgK1xuXHRcdCd8JyArXG5cdFx0Ly8gcGhwIHRhZ3Ncblx0XHQvXFx7cGhwXFx9W1xcc1xcU10qP1xce1xcL3BocFxcfS8uc291cmNlICtcblx0XHQnfCcgK1xuXHRcdC8vIHNtYXJ0eSBibG9ja3Ncblx0XHQvXFx7KD86W157fVwiJ118PHN0cj58XFx7KD86W157fVwiJ118PHN0cj58XFx7KD86W157fVwiJ118PHN0cj4pKlxcfSkqXFx9KSpcXH0vLnNvdXJjZVxuXHRcdFx0LnJlcGxhY2UoLzxzdHI+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN0cmluZy5zb3VyY2U7IH0pLFxuXHRcdCdnJ1xuXHQpO1xuXG5cdC8vIFRva2VuaXplIGFsbCBpbmxpbmUgU21hcnR5IGV4cHJlc3Npb25zXG5cdFByaXNtLmhvb2tzLmFkZCgnYmVmb3JlLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdHZhciBzbWFydHlMaXRlcmFsU3RhcnQgPSAne2xpdGVyYWx9Jztcblx0XHR2YXIgc21hcnR5TGl0ZXJhbEVuZCA9ICd7L2xpdGVyYWx9Jztcblx0XHR2YXIgc21hcnR5TGl0ZXJhbE1vZGUgPSBmYWxzZTtcblxuXHRcdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS5idWlsZFBsYWNlaG9sZGVycyhlbnYsICdzbWFydHknLCBzbWFydHlQYXR0ZXJuLCBmdW5jdGlvbiAobWF0Y2gpIHtcblx0XHRcdC8vIFNtYXJ0eSB0YWdzIGluc2lkZSB7bGl0ZXJhbH0gYmxvY2sgYXJlIGlnbm9yZWRcblx0XHRcdGlmIChtYXRjaCA9PT0gc21hcnR5TGl0ZXJhbEVuZCkge1xuXHRcdFx0XHRzbWFydHlMaXRlcmFsTW9kZSA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIXNtYXJ0eUxpdGVyYWxNb2RlKSB7XG5cdFx0XHRcdGlmIChtYXRjaCA9PT0gc21hcnR5TGl0ZXJhbFN0YXJ0KSB7XG5cdFx0XHRcdFx0c21hcnR5TGl0ZXJhbE1vZGUgPSB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSk7XG5cdH0pO1xuXG5cdC8vIFJlLWluc2VydCB0aGUgdG9rZW5zIGFmdGVyIHRva2VuaXppbmdcblx0UHJpc20uaG9va3MuYWRkKCdhZnRlci10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10udG9rZW5pemVQbGFjZWhvbGRlcnMoZW52LCAnc21hcnR5Jyk7XG5cdH0pO1xuXG59KFByaXNtKSk7XG5cbi8vIGh0dHBzOi8vc21sZmFtaWx5LmdpdGh1Yi5pby9zbWw5Ny1kZWZuLnBkZlxuLy8gaHR0cHM6Ly9wZW9wbGUubXBpLXN3cy5vcmcvfnJvc3NiZXJnL3NtbC5odG1sXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGtleXdvcmRzID0gL1xcYig/OmFic3R5cGV8YW5kfGFuZGFsc298YXN8Y2FzZXxkYXRhdHlwZXxkb3xlbHNlfGVuZHxlcXR5cGV8ZXhjZXB0aW9ufGZufGZ1bnxmdW5jdG9yfGhhbmRsZXxpZnxpbnxpbmNsdWRlfGluZml4fGluZml4cnxsZXR8bG9jYWx8bm9uZml4fG9mfG9wfG9wZW58b3JlbHNlfHJhaXNlfHJlY3xzaGFyaW5nfHNpZ3xzaWduYXR1cmV8c3RydWN0fHN0cnVjdHVyZXx0aGVufHR5cGV8dmFsfHdoZXJlfHdoaWxlfHdpdGh8d2l0aHR5cGUpXFxiL2k7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnNtbCA9IHtcblx0XHQvLyBhbGxvdyBvbmUgbGV2ZWwgb2YgbmVzdGluZ1xuXHRcdCdjb21tZW50JzogL1xcKFxcKig/OlteKihdfFxcKig/IVxcKSl8XFwoKD8hXFwqKXxcXChcXCooPzpbXiooXXxcXCooPyFcXCkpfFxcKCg/IVxcKikpKlxcKlxcKSkqXFwqXFwpLyxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogLyM/XCIoPzpbXlwiXFxcXF18XFxcXC4pKlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cblx0XHQnY2xhc3MtbmFtZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gVGhpcyBpcyBvbmx5IGFuIGFwcHJveGltYXRpb24gc2luY2UgdGhlIHJlYWwgZ3JhbW1hciBpcyBjb250ZXh0LWZyZWVcblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly8gV2h5IHRoZSBtYWluIGxvb3Agc28gY29tcGxleD9cblx0XHRcdFx0Ly8gVGhlIG1haW4gbG9vcCBpcyBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGFzIC8oPzpcXHMqKD86WyosXXwtPilcXHMqPFRFUk1JTkFMPikqLyB3aGljaCBpcywgb2J2aW91c2x5LCBhIGxvdFxuXHRcdFx0XHQvLyBzaW1wbGVyLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IGlmIGEgY29tbWEgaXMgdGhlIGxhc3QgaXRlcmF0aW9uIG9mIHRoZSBsb29wLCB0aGVuIHRoZSB0ZXJtaW5hbCBtdXN0IGJlXG5cdFx0XHRcdC8vIGZvbGxvd2VkIGJ5IGEgbG9uZyBpZGVudGlmaWVyLlxuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHRcdFx0LygoPzpefFteOl0pOlxccyopPFRFUk1JTkFMPig/OlxccyooPzooPzpcXCp8LT4pXFxzKjxURVJNSU5BTD58LFxccyo8VEVSTUlOQUw+KD86KD89PE5PVC1MQVNUPil8KD8hPE5PVC1MQVNUPilcXHMrPExPTkctSUQ+KSkpKi8uc291cmNlXG5cdFx0XHRcdFx0XHQucmVwbGFjZSgvPE5PVC1MQVNUPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiAvXFxzKig/OlsqLF18LT4pLy5zb3VyY2U7IH0pXG5cdFx0XHRcdFx0XHQucmVwbGFjZSgvPFRFUk1JTkFMPi9nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiAvKD86J1tcXHcnXSp8PExPTkctSUQ+fFxcKCg/OlteKCldfFxcKFteKCldKlxcKSkqXFwpfFxceyg/Oltee31dfFxce1tee31dKlxcfSkqXFx9KSg/Olxccys8TE9ORy1JRD4pKi8uc291cmNlO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5yZXBsYWNlKC88TE9ORy1JRD4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gLyg/ITxLRVlXT1JEPilbYS16XFxkX11bXFx3Jy5dKi8uc291cmNlOyB9KVxuXHRcdFx0XHRcdFx0LnJlcGxhY2UoLzxLRVlXT1JEPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBrZXl3b3Jkcy5zb3VyY2U7IH0pLFxuXHRcdFx0XHRcdCdpJ1xuXHRcdFx0XHQpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbXlxcdyddKSg/OmRhdGF0eXBlfGV4Y2VwdGlvbnxmdW5jdG9yfHNpZ25hdHVyZXxzdHJ1Y3R1cmV8dHlwZSlcXHMrKVthLXpfXVtcXHcnLl0qL2ksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdmdW5jdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oKD86XnxbXlxcdyddKWZ1blxccyspW2Etel9dW1xcdycuXSovaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXG5cdFx0J2tleXdvcmQnOiBrZXl3b3Jkcyxcblx0XHQndmFyaWFibGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXHcnXSknW1xcdyddKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdH0sXG5cblx0XHQnbnVtYmVyJzogL34/XFxiKD86XFxkKyg/OlxcLlxcZCspPyg/OmV+P1xcZCspP3wweFtcXGRhLWZdKylcXGIvaSxcblx0XHQnd29yZCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGIwdyg/OlxcZCt8eFtcXGRhLWZdKylcXGIvaSxcblx0XHRcdGFsaWFzOiAnY29uc3RhbnQnXG5cdFx0fSxcblxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiL2ksXG5cdFx0J29wZXJhdG9yJzogL1xcLlxcLlxcLnw6Wz49Ol18PT4/fC0+fFs8Pl09P3xbIStcXC0qL14jfEB+XS8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1soKXt9XFxbXFxdLjosO10vXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnNtbFsnY2xhc3MtbmFtZSddWzBdLmluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy5zbWw7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnNtbG5qID0gUHJpc20ubGFuZ3VhZ2VzLnNtbDtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuc29saWRpdHkgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0cGF0dGVybjogLyhcXGIoPzpjb250cmFjdHxlbnVtfGludGVyZmFjZXxsaWJyYXJ5fG5ld3xzdHJ1Y3R8dXNpbmcpXFxzKykoPyFcXGQpW1xcdyRdKy8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzpffGFub255bW91c3xhc3xhc3NlbWJseXxhc3NlcnR8YnJlYWt8Y2FsbGRhdGF8Y2FzZXxjb25zdGFudHxjb25zdHJ1Y3Rvcnxjb250aW51ZXxjb250cmFjdHxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGVtaXR8ZW51bXxldmVudHxleHRlcm5hbHxmb3J8ZnJvbXxmdW5jdGlvbnxpZnxpbXBvcnR8aW5kZXhlZHxpbmhlcml0ZWR8aW50ZXJmYWNlfGludGVybmFsfGlzfGxldHxsaWJyYXJ5fG1hcHBpbmd8bWVtb3J5fG1vZGlmaWVyfG5ld3xwYXlhYmxlfHByYWdtYXxwcml2YXRlfHB1YmxpY3xwdXJlfHJlcXVpcmV8cmV0dXJucz98cmV2ZXJ0fHNlbGZkZXN0cnVjdHxzb2xpZGl0eXxzdG9yYWdlfHN0cnVjdHxzdWljaWRlfHN3aXRjaHx0aGlzfHRocm93fHVzaW5nfHZhcnx2aWV3fHdoaWxlKVxcYi8sXG5cdCdvcGVyYXRvcic6IC89PnwtPnw6PXw9OnxcXCpcXCp8XFwrXFwrfC0tfFxcfFxcfHwmJnw8PD0/fD4+PT98Wy0rKi8lXiZ8PD4hPV09P3xbfj9dL1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3NvbGlkaXR5JywgJ2tleXdvcmQnLCB7XG5cdCdidWlsdGluJzogL1xcYig/OmFkZHJlc3N8Ym9vbHxieXRlfHU/aW50KD86OHwxNnwyNHwzMnw0MHw0OHw1Nnw2NHw3Mnw4MHw4OHw5NnwxMDR8MTEyfDEyMHwxMjh8MTM2fDE0NHwxNTJ8MTYwfDE2OHwxNzZ8MTg0fDE5MnwyMDB8MjA4fDIxNnwyMjR8MjMyfDI0MHwyNDh8MjU2KT98c3RyaW5nfGJ5dGVzKD86WzEtOV18WzEyXVxcZHwzWzAtMl0pPylcXGIvXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnc29saWRpdHknLCAnbnVtYmVyJywge1xuXHQndmVyc2lvbic6IHtcblx0XHRwYXR0ZXJuOiAvKFs8Pl09P3xcXF4pXFxkK1xcLlxcZCtcXC5cXGQrXFxiLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnbnVtYmVyJyxcblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5zb2wgPSBQcmlzbS5sYW5ndWFnZXMuc29saWRpdHk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgZ3VpZCA9IHtcblx0XHQvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vbml2ZXJzYWxseV91bmlxdWVfaWRlbnRpZmllciNGb3JtYXRcblx0XHRwYXR0ZXJuOiAvXFx7W1xcZGEtZl17OH0tW1xcZGEtZl17NH0tW1xcZGEtZl17NH0tW1xcZGEtZl17NH0tW1xcZGEtZl17MTJ9XFx9L2ksXG5cdFx0YWxpYXM6ICdjb25zdGFudCcsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvW3t9XS9cblx0XHR9XG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzWydzb2x1dGlvbi1maWxlJ10gPSB7XG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvIy4qLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9cIlteXCJcXHJcXG5dKlwifCdbXidcXHJcXG5dKicvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdndWlkJzogZ3VpZFxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J29iamVjdCc6IHtcblx0XHRcdC8vIEZvb1xuXHRcdFx0Ly8gICBCYXIoXCJhYnNcIikgPSA5XG5cdFx0XHQvLyAgIEVuZEJhclxuXHRcdFx0Ly8gICBQcm9wID0gVFJVRVxuXHRcdFx0Ly8gRW5kRm9vXG5cdFx0XHRwYXR0ZXJuOiAvXihbIFxcdF0qKSg/OihbQS1aXVxcdyopXFxiKD89LiooPzpcXHJcXG4/fFxcbikoPzpcXDFbIFxcdF0uKig/Olxcclxcbj98XFxuKSkqXFwxRW5kXFwyKD89WyBcXHRdKiQpKXxFbmRbQS1aXVxcdyooPz1bIFxcdF0qJCkpL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH0sXG5cdFx0J3Byb3BlcnR5Jzoge1xuXHRcdFx0cGF0dGVybjogL14oWyBcXHRdKikoPyFcXHMpW15cXHJcXG5cIiM9KCldKlteXFxzXCIjPSgpXSg/PVxccyo9KS9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZ3VpZCc6IGd1aWRcblx0XHRcdH1cblx0XHR9LFxuXHRcdCdndWlkJzogZ3VpZCxcblx0XHQnbnVtYmVyJzogL1xcYlxcZCsoPzpcXC5cXGQrKSpcXGIvLFxuXHRcdCdib29sZWFuJzogL1xcYig/OkZBTFNFfFRSVUUpXFxiLyxcblx0XHQnb3BlcmF0b3InOiAvPS8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1soKSxdL1xuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlc1snc2xuJ10gPSBQcmlzbS5sYW5ndWFnZXNbJ3NvbHV0aW9uLWZpbGUnXTtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdHZhciBzdHJpbmdQYXR0ZXJuID0gLyhbXCInXSkoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLztcblx0dmFyIG51bWJlclBhdHRlcm4gPSAvXFxiXFxkKyg/OlxcLlxcZCspPyg/OltlRV1bKy1dP1xcZCspP1xcYnxcXGIweFtcXGRBLUZdK1xcYi87XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnNveSA9IHtcblx0XHQnY29tbWVudCc6IFtcblx0XHRcdC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvLyxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXHMpXFwvXFwvLiovLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdjb21tYW5kLWFyZyc6IHtcblx0XHRcdHBhdHRlcm46IC8oXFx7K1xcLz9cXHMqKD86YWxpYXN8Y2FsbHxkZWxjYWxsfGRlbHBhY2thZ2V8ZGVsdGVtcGxhdGV8bmFtZXNwYWNlfHRlbXBsYXRlKVxccyspXFwuP1tcXHcuXSsvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3BhcmFtZXRlcic6IHtcblx0XHRcdHBhdHRlcm46IC8oXFx7K1xcLz9cXHMqQD9wYXJhbVxcPz9cXHMrKVxcLj9bXFx3Ll0rLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFx7K1xcLz9bXlxcU1xcclxcbl0qKSg/OlxcXFxbbnJ0XXxhbGlhc3xjYWxsfGNhc2V8Y3NzfGRlZmF1bHR8ZGVsY2FsbHxkZWxwYWNrYWdlfGRlbHRlbXBsYXRlfGVsc2UoPzppZik/fGZhbGxiYWNrbXNnfGZvcig/OmVhY2gpP3xpZig/OmVtcHR5KT98bGJ8bGV0fGxpdGVyYWx8bXNnfG5hbWVzcGFjZXxuaWx8QD9wYXJhbVxcPz98cmJ8c3B8c3dpdGNofHRlbXBsYXRlfHhpZCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0L1xcYig/OmFueXxhc3xhdHRyaWJ1dGVzfGJvb2x8Y3NzfGZsb2F0fGh0bWx8aW58aW50fGpzfGxpc3R8bWFwfG51bGx8bnVtYmVyfHN0cmluZ3x1cmkpXFxiL1xuXHRcdF0sXG5cdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdHBhdHRlcm46IC9eXFx7K1xcLz98XFwvP1xcfSskLyxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblx0XHQncHJvcGVydHknOiAvXFx3Kyg/PT0pLyxcblx0XHQndmFyaWFibGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwkW15cXFdcXGRdXFx3Kig/OlxcPz8oPzpcXC5cXHcrfFxcW1teXFxdXStcXF0pKSovLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogc3RyaW5nUGF0dGVybixcblx0XHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0J251bWJlcic6IG51bWJlclBhdHRlcm4sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bXFxbXFxdLj9dL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IHN0cmluZ1BhdHRlcm4sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdmdW5jdGlvbic6IFtcblx0XHRcdC9cXHcrKD89XFwoKS8sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFx8W15cXFNcXHJcXG5dKilcXHcrLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHRcdCdudW1iZXInOiBudW1iZXJQYXR0ZXJuLFxuXHRcdCdvcGVyYXRvcic6IC9cXD86P3w8PT98Pj0/fD09P3whPXxbKyovJS1dfFxcYig/OmFuZHxub3R8b3IpXFxiLyxcblx0XHQncHVuY3R1YXRpb24nOiAvW3t9KClcXFtcXF18Liw6XS9cblx0fTtcblxuXHQvLyBUb2tlbml6ZSBhbGwgaW5saW5lIFNveSBleHByZXNzaW9uc1xuXHRQcmlzbS5ob29rcy5hZGQoJ2JlZm9yZS10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHR2YXIgc295UGF0dGVybiA9IC9cXHtcXHsuKz9cXH1cXH18XFx7Lis/XFx9fFxcc1xcL1xcLy4qfFxcL1xcKltcXHNcXFNdKj9cXCpcXC8vZztcblx0XHR2YXIgc295TGl0dGVyYWxTdGFydCA9ICd7bGl0ZXJhbH0nO1xuXHRcdHZhciBzb3lMaXR0ZXJhbEVuZCA9ICd7L2xpdGVyYWx9Jztcblx0XHR2YXIgc295TGl0dGVyYWxNb2RlID0gZmFsc2U7XG5cblx0XHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10uYnVpbGRQbGFjZWhvbGRlcnMoZW52LCAnc295Jywgc295UGF0dGVybiwgZnVuY3Rpb24gKG1hdGNoKSB7XG5cdFx0XHQvLyBTb3kgdGFncyBpbnNpZGUge2xpdGVyYWx9IGJsb2NrIGFyZSBpZ25vcmVkXG5cdFx0XHRpZiAobWF0Y2ggPT09IHNveUxpdHRlcmFsRW5kKSB7XG5cdFx0XHRcdHNveUxpdHRlcmFsTW9kZSA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIXNveUxpdHRlcmFsTW9kZSkge1xuXHRcdFx0XHRpZiAobWF0Y2ggPT09IHNveUxpdHRlcmFsU3RhcnQpIHtcblx0XHRcdFx0XHRzb3lMaXR0ZXJhbE1vZGUgPSB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSk7XG5cdH0pO1xuXG5cdC8vIFJlLWluc2VydCB0aGUgdG9rZW5zIGFmdGVyIHRva2VuaXppbmdcblx0UHJpc20uaG9va3MuYWRkKCdhZnRlci10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10udG9rZW5pemVQbGFjZWhvbGRlcnMoZW52LCAnc295Jyk7XG5cdH0pO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy50dXJ0bGUgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8jLiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnbXVsdGlsaW5lLXN0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCJcIlwiKD86KD86XCJcIj8pPyg/OlteXCJcXFxcXXxcXFxcLikpKlwiXCJcInwnJycoPzooPzonJz8pPyg/OlteJ1xcXFxdfFxcXFwuKSkqJycnLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2NvbW1lbnQnOiAvIy4qL1xuXHRcdH1cblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpbXlxcXFxcIlxcclxcbl18XFxcXC4pKlwifCcoPzpbXlxcXFwnXFxyXFxuXXxcXFxcLikqJy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCd1cmwnOiB7XG5cdFx0cGF0dGVybjogLzwoPzpbXlxceDAwLVxceDIwPD5cInt9fF5gXFxcXF18XFxcXCg/OnVbXFxkYS1mQS1GXXs0fXxVW1xcZGEtZkEtRl17OH0pKSo+Lyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvWzw+XS9cblx0XHR9XG5cdH0sXG5cdCdmdW5jdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKD86KD8hWy0uXFxkXFx4QjddKVstLlxcd1xceEI3XFx4QzAtXFx1RkZGRF0rKT86KD86KD8hWy0uXSkoPzpbLS46XFx3XFx4QzAtXFx1RkZGRF18JVtcXGRhLWZdezJ9fFxcXFwuKSspPy9pLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2xvY2FsLW5hbWUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oW146XSo6KVtcXHNcXFNdKy8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQncHJlZml4Jzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLzovXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdCdudW1iZXInOiAvWystXT9cXGJcXGQrKD86XFwuXFxkKik/KD86ZVsrLV0/XFxkKyk/L2ksXG5cdCdwdW5jdHVhdGlvbic6IC9be30uLDsoKVtcXF1dfFxcXlxcXi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0J2tleXdvcmQnOiBbXG5cdFx0Lyg/OlxcYmF8QHByZWZpeHxAYmFzZSlcXGJ8PS8sXG5cdFx0L1xcYig/OmJhc2V8Z3JhcGh8cHJlZml4KVxcYi9pXG5cdF0sXG5cdCd0YWcnOiB7XG5cdFx0cGF0dGVybjogL0BbYS16XSsoPzotW2EtelxcZF0rKSovaSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9AL1xuXHRcdH1cblx0fVxufTtcblByaXNtLmxhbmd1YWdlcy50cmlnID0gUHJpc20ubGFuZ3VhZ2VzWyd0dXJ0bGUnXTtcblxuUHJpc20ubGFuZ3VhZ2VzLnNwYXJxbCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ3R1cnRsZScsIHtcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvaSxcblx0J3ZhcmlhYmxlJzoge1xuXHRcdHBhdHRlcm46IC9bPyRdXFx3Ky8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG59XG4pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdzcGFycWwnLCAncHVuY3R1YXRpb24nLCB7XG5cdCdrZXl3b3JkJzogW1xuXHRcdC9cXGIoPzpBfEFERHxBTEx8QVN8QVNDfEFTS3xCTk9ERXxCWXxDTEVBUnxDT05TVFJVQ1R8Q09QWXxDUkVBVEV8REFUQXxERUZBVUxUfERFTEVURXxERVNDfERFU0NSSUJFfERJU1RJTkNUfERST1B8RVhJU1RTfEZJTFRFUnxGUk9NfEdST1VQfEhBVklOR3xJTlNFUlR8SU5UT3xMSU1JVHxMT0FEfE1JTlVTfE1PVkV8TkFNRUR8Tk9UfE5PV3xPRkZTRVR8T1BUSU9OQUx8T1JERVJ8UkFORHxSRURVQ0VEfFNFTEVDVHxTRVBBUkFUT1J8U0VSVklDRXxTSUxFTlR8U1RSVVVJRHxVTklPTnxVU0lOR3xVVUlEfFZBTFVFU3xXSEVSRSlcXGIvaSxcblx0XHQvXFxiKD86QUJTfEFWR3xCSU5EfEJPVU5EfENFSUx8Q09BTEVTQ0V8Q09OQ0FUfENPTlRBSU5TfENPVU5UfERBVEFUWVBFfERBWXxFTkNPREVfRk9SX1VSSXxGTE9PUnxHUk9VUF9DT05DQVR8SE9VUlN8SUZ8SVJJfGlzQkxBTkt8aXNJUkl8aXNMSVRFUkFMfGlzTlVNRVJJQ3xpc1VSSXxMQU5HfExBTkdNQVRDSEVTfExDQVNFfE1BWHxNRDV8TUlOfE1JTlVURVN8TU9OVEh8UkVHRVh8UkVQTEFDRXxST1VORHxzYW1lVGVybXxTQU1QTEV8U0VDT05EU3xTSEExfFNIQTI1NnxTSEEzODR8U0hBNTEyfFNUUnxTVFJBRlRFUnxTVFJCRUZPUkV8U1RSRFR8U1RSRU5EU3xTVFJMQU5HfFNUUkxFTnxTVFJTVEFSVFN8U1VCU1RSfFNVTXxUSU1FWk9ORXxUWnxVQ0FTRXxVUkl8WUVBUilcXGIoPz1cXHMqXFwoKS9pLFxuXHRcdC9cXGIoPzpCQVNFfEdSQVBIfFBSRUZJWClcXGIvaVxuXHRdXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLnJxID0gUHJpc20ubGFuZ3VhZ2VzLnNwYXJxbDtcblxuUHJpc20ubGFuZ3VhZ2VzWydzcGx1bmstc3BsJ10gPSB7XG5cdCdjb21tZW50JzogL2Bjb21tZW50XFwoXCIoPzpcXFxcLnxbXlxcXFxcIl0pKlwiXFwpYC8sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86XFxcXC58W15cXFxcXCJdKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdC8vIGh0dHBzOi8vZG9jcy5zcGx1bmsuY29tL0RvY3VtZW50YXRpb24vU3BsdW5rLzcuMy4wL1NlYXJjaFJlZmVyZW5jZS9MaXN0T2ZTZWFyY2hDb21tYW5kc1xuXHQna2V5d29yZCc6IC9cXGIoPzphYnN0cmFjdHxhY2N1bXxhZGRjb2x0b3RhbHN8YWRkaW5mb3xhZGR0b3RhbHN8YW5hbHl6ZWZpZWxkc3xhbm9tYWxpZXN8YW5vbWFsb3VzdmFsdWV8YW5vbWFseWRldGVjdGlvbnxhcHBlbmR8YXBwZW5kY29sc3xhcHBlbmRjc3Z8YXBwZW5kbG9va3VwfGFwcGVuZHBpcGV8YXJ1bGVzfGFzc29jaWF0ZXxhdWRpdHxhdXRvcmVncmVzc3xiaW58YnVja2V0fGJ1Y2tldGRpcnxjaGFydHxjbHVzdGVyfGNvZmlsdGVyfGNvbGxlY3R8Y29uY3VycmVuY3l8Y29udGluZ2VuY3l8Y29udmVydHxjb3JyZWxhdGV8ZGF0YW1vZGVsfGRiaW5zcGVjdHxkZWR1cHxkZWxldGV8ZGVsdGF8ZGlmZnxlcmV4fGV2YWx8ZXZlbnRjb3VudHxldmVudHN0YXRzfGV4dHJhY3R8ZmllbGRmb3JtYXR8ZmllbGRzfGZpZWxkc3VtbWFyeXxmaWxsZG93bnxmaWxsbnVsbHxmaW5kdHlwZXN8Zm9sZGVyaXplfGZvcmVhY2h8Zm9ybWF0fGZyb218Z2F1Z2V8Z2VudGltZXN8Z2VvbXxnZW9tZmlsdGVyfGdlb3N0YXRzfGhlYWR8aGlnaGxpZ2h0fGhpc3Rvcnl8aWNvbmlmeXxpbnB1dHxpbnB1dGNzdnxpbnB1dGxvb2t1cHxpcGxvY2F0aW9ufGpvaW58a21lYW5zfGt2fGt2Zm9ybXxsb2Fkam9ifGxvY2FsaXplfGxvY2Fsb3B8bG9va3VwfG1ha2Vjb250aW51b3VzfG1ha2VtdnxtYWtlcmVzdWx0c3xtYXB8bWNvbGxlY3R8bWV0YWRhdGF8bWV0YXNlYXJjaHxtZXZlbnRjb2xsZWN0fG1zdGF0c3xtdWx0aWt2fG11bHRpc2VhcmNofG12Y29tYmluZXxtdmV4cGFuZHxub212fG91dGxpZXJ8b3V0cHV0Y3N2fG91dHB1dGxvb2t1cHxvdXRwdXR0ZXh0fG92ZXJsYXB8cGl2b3R8cHJlZGljdHxyYW5nZW1hcHxyYXJlfHJlZ2V4fHJlbGV2YW5jeXxyZWx0aW1lfHJlbmFtZXxyZXBsYWNlfHJlc3R8cmV0dXJufHJldmVyc2V8cmV4fHJ0b3JkZXJ8cnVufHNhdmVkc2VhcmNofHNjcmlwdHxzY3J1YnxzZWFyY2h8c2VhcmNodHhufHNlbGZqb2lufHNlbmRlbWFpbHxzZXR8c2V0ZmllbGRzfHNpY2hhcnR8c2lyYXJlfHNpc3RhdHN8c2l0aW1lY2hhcnR8c2l0b3B8c29ydHxzcGF0aHxzdGF0c3xzdHJjYXR8c3RyZWFtc3RhdHN8dGFibGV8dGFnc3x0YWlsfHRpbWVjaGFydHx0aW1ld3JhcHx0b3B8dHJhbnNhY3Rpb258dHJhbnNwb3NlfHRyZW5kbGluZXx0c2NvbGxlY3R8dHN0YXRzfHR5cGVhaGVhZHx0eXBlbGVhcm5lcnx0eXBlcnx1bmlvbnx1bmlxfHVudGFibGV8d2hlcmV8eDExfHhtbGt2fHhtbHVuZXNjYXBlfHhwYXRofHh5c2VyaWVzKVxcYi9pLFxuXHQnb3BlcmF0b3Itd29yZCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86YW5kfGFzfGJ5fG5vdHxvcnx4b3IpXFxiL2ksXG5cdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0fSxcblx0J2Z1bmN0aW9uJzogL1xcYlxcdysoPz1cXHMqXFwoKS8sXG5cdCdwcm9wZXJ0eSc6IC9cXGJcXHcrKD89XFxzKj0oPyE9KSkvLFxuXHQnZGF0ZSc6IHtcblx0XHQvLyBNTS9ERC9ZWVlZKDpISDpNTTpTUyk/XG5cdFx0cGF0dGVybjogL1xcYlxcZHsxLDJ9XFwvXFxkezEsMn1cXC9cXGR7MSw0fSg/Oig/OjpcXGR7MSwyfSl7M30pP1xcYi8sXG5cdFx0YWxpYXM6ICdudW1iZXInXG5cdH0sXG5cdCdudW1iZXInOiAvXFxiXFxkKyg/OlxcLlxcZCspP1xcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZ8ZmFsc2V8dHx0cnVlKVxcYi9pLFxuXHQnb3BlcmF0b3InOiAvWzw+PV09P3xbLSsqLyV8XS8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKClbXFxdLF0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuc3FmID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86KD86XCJcIik/W15cIl0pKlwiKD8hXCIpfCcoPzpbXiddKSonLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86YnJlYWtPdXR8YnJlYWtUb3xjYWxsfGNhc2V8Y2F0Y2h8ZGVmYXVsdHxkb3xlY2hvfGVsc2V8ZXhlY0ZTTXxleGVjVk18ZXhpdFdpdGh8Zm9yfGZvckVhY2h8Zm9yRWFjaE1lbWJlcnxmb3JFYWNoTWVtYmVyQWdlbnR8Zm9yRWFjaE1lbWJlclRlYW18ZnJvbXxnb3RvfGlmfG5pbHxwcmVwcm9jZXNzRmlsZXxwcmVwcm9jZXNzRmlsZUxpbmVOdW1iZXJzfHByaXZhdGV8c2NvcGVOYW1lfHNwYXdufHN0ZXB8c3dpdGNofHRoZW58dGhyb3d8dG98dHJ5fHdoaWxlfHdpdGgpXFxiL2ksXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiL2ksXG5cdCdmdW5jdGlvbic6IC9cXGIoPzphYnN8YWNjVGltZXxhY29zfGFjdGlvbnxhY3Rpb25JRHN8YWN0aW9uS2V5c3xhY3Rpb25LZXlzSW1hZ2VzfGFjdGlvbktleXNOYW1lc3xhY3Rpb25LZXlzTmFtZXNBcnJheXxhY3Rpb25OYW1lfGFjdGlvblBhcmFtc3xhY3RpdmF0ZUFkZG9uc3xhY3RpdmF0ZWRBZGRvbnN8YWN0aXZhdGVLZXl8YWRkM0RFTkNvbm5lY3Rpb258YWRkM0RFTkV2ZW50SGFuZGxlcnxhZGQzREVOTGF5ZXJ8YWRkQWN0aW9ufGFkZEJhY2twYWNrfGFkZEJhY2twYWNrQ2FyZ298YWRkQmFja3BhY2tDYXJnb0dsb2JhbHxhZGRCYWNrcGFja0dsb2JhbHxhZGRDYW1TaGFrZXxhZGRDdXJhdG9yQWRkb25zfGFkZEN1cmF0b3JDYW1lcmFBcmVhfGFkZEN1cmF0b3JFZGl0YWJsZU9iamVjdHN8YWRkQ3VyYXRvckVkaXRpbmdBcmVhfGFkZEN1cmF0b3JQb2ludHN8YWRkRWRpdG9yT2JqZWN0fGFkZEV2ZW50SGFuZGxlcnxhZGRGb3JjZXxhZGRGb3JjZUdlbmVyYXRvclJURHxhZGRHb2dnbGVzfGFkZEdyb3VwSWNvbnxhZGRIYW5kZ3VuSXRlbXxhZGRIZWFkZ2VhcnxhZGRJdGVtfGFkZEl0ZW1DYXJnb3xhZGRJdGVtQ2FyZ29HbG9iYWx8YWRkSXRlbVBvb2x8YWRkSXRlbVRvQmFja3BhY2t8YWRkSXRlbVRvVW5pZm9ybXxhZGRJdGVtVG9WZXN0fGFkZExpdmVTdGF0c3xhZGRNYWdhemluZXxhZGRNYWdhemluZUFtbW9DYXJnb3xhZGRNYWdhemluZUNhcmdvfGFkZE1hZ2F6aW5lQ2FyZ29HbG9iYWx8YWRkTWFnYXppbmVHbG9iYWx8YWRkTWFnYXppbmVQb29sfGFkZE1hZ2F6aW5lc3xhZGRNYWdhemluZVR1cnJldHxhZGRNZW51fGFkZE1lbnVJdGVtfGFkZE1pc3Npb25FdmVudEhhbmRsZXJ8YWRkTVBFdmVudEhhbmRsZXJ8YWRkTXVzaWNFdmVudEhhbmRsZXJ8YWRkT3duZWRNaW5lfGFkZFBsYXllclNjb3Jlc3xhZGRQcmltYXJ5V2VhcG9uSXRlbXxhZGRQdWJsaWNWYXJpYWJsZUV2ZW50SGFuZGxlcnxhZGRSYXRpbmd8YWRkUmVzb3VyY2VzfGFkZFNjb3JlfGFkZFNjb3JlU2lkZXxhZGRTZWNvbmRhcnlXZWFwb25JdGVtfGFkZFN3aXRjaGFibGVVbml0fGFkZFRlYW1NZW1iZXJ8YWRkVG9SZW1haW5zQ29sbGVjdG9yfGFkZFRvcnF1ZXxhZGRVbmlmb3JtfGFkZFZlaGljbGV8YWRkVmVzdHxhZGRXYXlwb2ludHxhZGRXZWFwb258YWRkV2VhcG9uQ2FyZ298YWRkV2VhcG9uQ2FyZ29HbG9iYWx8YWRkV2VhcG9uR2xvYmFsfGFkZFdlYXBvbkl0ZW18YWRkV2VhcG9uUG9vbHxhZGRXZWFwb25UdXJyZXR8YWRtaW58YWdlbnR8YWdlbnRzfEFHTFRvQVNMfGFpbWVkQXRUYXJnZXR8YWltUG9zfGFpckRlbnNpdHlDdXJ2ZVJURHxhaXJEZW5zaXR5UlREfGFpcnBsYW5lVGhyb3R0bGV8YWlycG9ydFNpZGV8QUlTRmluaXNoSGVhbHxhbGl2ZXxhbGwzREVORW50aXRpZXN8YWxsQWlycG9ydHN8YWxsQ29udHJvbHN8YWxsQ3VyYXRvcnN8YWxsQ3V0TGF5ZXJzfGFsbERlYWR8YWxsRGVhZE1lbnxhbGxEaXNwbGF5c3xhbGxHcm91cHN8YWxsTWFwTWFya2Vyc3xhbGxNaW5lc3xhbGxNaXNzaW9uT2JqZWN0c3xhbGxvdzNETW9kZXxhbGxvd0NyZXdJbkltbW9iaWxlfGFsbG93Q3VyYXRvckxvZ2ljSWdub3JlQXJlYXN8YWxsb3dEYW1hZ2V8YWxsb3dEYW1tYWdlfGFsbG93RmlsZU9wZXJhdGlvbnN8YWxsb3dGbGVlaW5nfGFsbG93R2V0SW58YWxsb3dTcHJpbnR8YWxsUGxheWVyc3xhbGxTaW1wbGVPYmplY3RzfGFsbFNpdGVzfGFsbFR1cnJldHN8YWxsVW5pdHN8YWxsVW5pdHNVQVZ8YWxsVmFyaWFibGVzfGFtbW98YW1tb09uUHlsb258YW5pbWF0ZXxhbmltYXRlQmF5fGFuaW1hdGVEb29yfGFuaW1hdGVQeWxvbnxhbmltYXRlU291cmNlfGFuaW1hdGlvbk5hbWVzfGFuaW1hdGlvblBoYXNlfGFuaW1hdGlvblNvdXJjZVBoYXNlfGFuaW1hdGlvblN0YXRlfGFwcGVuZHxhcHBseXxhcm1vcnlQb2ludHN8YXJyYXlJbnRlcnNlY3R8YXNpbnxBU0xUb0FHTHxBU0xUb0FUTHxhc3NlcnR8YXNzaWduQXNDYXJnb3xhc3NpZ25Bc0NhcmdvSW5kZXh8YXNzaWduQXNDb21tYW5kZXJ8YXNzaWduQXNEcml2ZXJ8YXNzaWduQXNHdW5uZXJ8YXNzaWduQXNUdXJyZXR8YXNzaWduQ3VyYXRvcnxhc3NpZ25lZENhcmdvfGFzc2lnbmVkQ29tbWFuZGVyfGFzc2lnbmVkRHJpdmVyfGFzc2lnbmVkR3VubmVyfGFzc2lnbmVkSXRlbXN8YXNzaWduZWRUYXJnZXR8YXNzaWduZWRUZWFtfGFzc2lnbmVkVmVoaWNsZXxhc3NpZ25lZFZlaGljbGVSb2xlfGFzc2lnbkl0ZW18YXNzaWduVGVhbXxhc3NpZ25Ub0FpcnBvcnR8YXRhbnxhdGFuMnxhdGd8QVRMVG9BU0x8YXR0YWNoZWRPYmplY3R8YXR0YWNoZWRPYmplY3RzfGF0dGFjaGVkVG98YXR0YWNoT2JqZWN0fGF0dGFjaFRvfGF0dGFja0VuYWJsZWR8YmFja3BhY2t8YmFja3BhY2tDYXJnb3xiYWNrcGFja0NvbnRhaW5lcnxiYWNrcGFja0l0ZW1zfGJhY2twYWNrTWFnYXppbmVzfGJhY2twYWNrU3BhY2VGb3J8YmVoYXZpb3VyfGJlbmNobWFya3xiaW5vY3VsYXJ8Ymx1Zm9yfGJvdW5kaW5nQm94fGJvdW5kaW5nQm94UmVhbHxib3VuZGluZ0NlbnRlcnxicmllZmluZ05hbWV8YnVpbGRpbmdFeGl0fGJ1aWxkaW5nUG9zfGJ1bGRvemVyX0VuYWJsZVJvYWREaWFnfGJ1bGRvemVyX0lzRW5hYmxlZFJvYWREaWFnfGJ1bGRvemVyX0xvYWROZXdSb2Fkc3xidWxkb3plcl9yZWxvYWRPcGVyTWFwfGJ1dHRvbkFjdGlvbnxidXR0b25TZXRBY3Rpb258Y2FkZXRNb2RlfGNhbGxFeHRlbnNpb258Y2FtQ29tbWFuZHxjYW1Db21taXR8Y2FtQ29tbWl0UHJlcGFyZWR8Y2FtQ29tbWl0dGVkfGNhbUNvbnN0dWN0aW9uU2V0UGFyYW1zfGNhbUNyZWF0ZXxjYW1EZXN0cm95fGNhbWVyYUVmZmVjdHxjYW1lcmFFZmZlY3RFbmFibGVIVUR8Y2FtZXJhSW50ZXJlc3R8Y2FtZXJhT258Y2FtZXJhVmlld3xjYW1wYWlnbkNvbmZpZ0ZpbGV8Y2FtUHJlbG9hZHxjYW1QcmVsb2FkZWR8Y2FtUHJlcGFyZUJhbmt8Y2FtUHJlcGFyZURpcnxjYW1QcmVwYXJlRGl2ZXxjYW1QcmVwYXJlRm9jdXN8Y2FtUHJlcGFyZUZvdnxjYW1QcmVwYXJlRm92UmFuZ2V8Y2FtUHJlcGFyZVBvc3xjYW1QcmVwYXJlUmVsUG9zfGNhbVByZXBhcmVUYXJnZXR8Y2FtU2V0QmFua3xjYW1TZXREaXJ8Y2FtU2V0RGl2ZXxjYW1TZXRGb2N1c3xjYW1TZXRGb3Z8Y2FtU2V0Rm92UmFuZ2V8Y2FtU2V0UG9zfGNhbVNldFJlbFBvc3xjYW1TZXRUYXJnZXR8Y2FtVGFyZ2V0fGNhbVVzZU5WR3xjYW5BZGR8Y2FuQWRkSXRlbVRvQmFja3BhY2t8Y2FuQWRkSXRlbVRvVW5pZm9ybXxjYW5BZGRJdGVtVG9WZXN0fGNhbmNlbFNpbXBsZVRhc2tEZXN0aW5hdGlvbnxjYW5GaXJlfGNhbk1vdmV8Y2FuU2xpbmdMb2FkfGNhblN0YW5kfGNhblN1c3BlbmR8Y2FuVHJpZ2dlckR5bmFtaWNTaW11bGF0aW9ufGNhblVubG9hZEluQ29tYmF0fGNhblZlaGljbGVDYXJnb3xjYXB0aXZlfGNhcHRpdmVOdW18Y2JDaGVja2VkfGNiU2V0Q2hlY2tlZHxjZWlsfGNoYW5uZWxFbmFibGVkfGNoZWF0c0VuYWJsZWR8Y2hlY2tBSUZlYXR1cmV8Y2hlY2tWaXNpYmlsaXR5fGNpdmlsaWFufGNsYXNzTmFtZXxjbGVhcjNERU5BdHRyaWJ1dGV8Y2xlYXIzREVOSW52ZW50b3J5fGNsZWFyQWxsSXRlbXNGcm9tQmFja3BhY2t8Y2xlYXJCYWNrcGFja0NhcmdvfGNsZWFyQmFja3BhY2tDYXJnb0dsb2JhbHxjbGVhckZvcmNlc1JURHxjbGVhckdyb3VwSWNvbnN8Y2xlYXJJdGVtQ2FyZ298Y2xlYXJJdGVtQ2FyZ29HbG9iYWx8Y2xlYXJJdGVtUG9vbHxjbGVhck1hZ2F6aW5lQ2FyZ298Y2xlYXJNYWdhemluZUNhcmdvR2xvYmFsfGNsZWFyTWFnYXppbmVQb29sfGNsZWFyT3ZlcmxheXxjbGVhclJhZGlvfGNsZWFyVmVoaWNsZUluaXR8Y2xlYXJXZWFwb25DYXJnb3xjbGVhcldlYXBvbkNhcmdvR2xvYmFsfGNsZWFyV2VhcG9uUG9vbHxjbGllbnRPd25lcnxjbG9zZURpYWxvZ3xjbG9zZURpc3BsYXl8Y2xvc2VPdmVybGF5fGNvbGxhcHNlT2JqZWN0VHJlZXxjb2xsZWN0M0RFTkhpc3Rvcnl8Y29sbGVjdGl2ZVJURHxjb21iYXRNb2RlfGNvbW1hbmRBcnRpbGxlcnlGaXJlfGNvbW1hbmRDaGF0fGNvbW1hbmRlcnxjb21tYW5kRmlyZXxjb21tYW5kRm9sbG93fGNvbW1hbmRGU018Y29tbWFuZEdldE91dHxjb21tYW5kaW5nTWVudXxjb21tYW5kTW92ZXxjb21tYW5kUmFkaW98Y29tbWFuZFN0b3B8Y29tbWFuZFN1cHByZXNzaXZlRmlyZXxjb21tYW5kVGFyZ2V0fGNvbW1hbmRXYXRjaHxjb21tZW50fGNvbW1pdE92ZXJsYXl8Y29tcGlsZXxjb21waWxlRmluYWx8Y29tcGxldGVkRlNNfGNvbXBvc2VUZXh0fGNvbmZpZ0NsYXNzZXN8Y29uZmlnRmlsZXxjb25maWdIaWVyYXJjaHl8Y29uZmlnTmFtZXxjb25maWdOdWxsfGNvbmZpZ1Byb3BlcnRpZXN8Y29uZmlnU291cmNlQWRkb25MaXN0fGNvbmZpZ1NvdXJjZU1vZHxjb25maWdTb3VyY2VNb2RMaXN0fGNvbmZpcm1TZW5zb3JUYXJnZXR8Y29ubmVjdFRlcm1pbmFsVG9VQVZ8Y29udHJvbE51bGx8Y29udHJvbHNHcm91cEN0cmx8Y29weUZyb21DbGlwYm9hcmR8Y29weVRvQ2xpcGJvYXJkfGNvcHlXYXlwb2ludHN8Y29zfGNvdW50fGNvdW50RW5lbXl8Y291bnRGcmllbmRseXxjb3VudFNpZGV8Y291bnRUeXBlfGNvdW50VW5rbm93bnxjcmVhdGUzREVOQ29tcG9zaXRpb258Y3JlYXRlM0RFTkVudGl0eXxjcmVhdGVBZ2VudHxjcmVhdGVDZW50ZXJ8Y3JlYXRlRGlhbG9nfGNyZWF0ZURpYXJ5TGlua3xjcmVhdGVEaWFyeVJlY29yZHxjcmVhdGVEaWFyeVN1YmplY3R8Y3JlYXRlRGlzcGxheXxjcmVhdGVHZWFyRGlhbG9nfGNyZWF0ZUdyb3VwfGNyZWF0ZUd1YXJkZWRQb2ludHxjcmVhdGVMb2NhdGlvbnxjcmVhdGVNYXJrZXJ8Y3JlYXRlTWFya2VyTG9jYWx8Y3JlYXRlTWVudXxjcmVhdGVNaW5lfGNyZWF0ZU1pc3Npb25EaXNwbGF5fGNyZWF0ZU1QQ2FtcGFpZ25EaXNwbGF5fGNyZWF0ZVNpbXBsZU9iamVjdHxjcmVhdGVTaW1wbGVUYXNrfGNyZWF0ZVNpdGV8Y3JlYXRlU291bmRTb3VyY2V8Y3JlYXRlVGFza3xjcmVhdGVUZWFtfGNyZWF0ZVRyaWdnZXJ8Y3JlYXRlVW5pdHxjcmVhdGVWZWhpY2xlfGNyZWF0ZVZlaGljbGVDcmV3fGNyZWF0ZVZlaGljbGVMb2NhbHxjcmV3fGN0QWRkSGVhZGVyfGN0QWRkUm93fGN0Q2xlYXJ8Y3RDdXJTZWx8Y3REYXRhfGN0RmluZEhlYWRlclJvd3N8Y3RGaW5kUm93SGVhZGVyfGN0SGVhZGVyQ29udHJvbHN8Y3RIZWFkZXJDb3VudHxjdFJlbW92ZUhlYWRlcnN8Y3RSZW1vdmVSb3dzfGN0cmxBY3RpdmF0ZXxjdHJsQWRkRXZlbnRIYW5kbGVyfGN0cmxBbmdsZXxjdHJsQXV0b1Njcm9sbERlbGF5fGN0cmxBdXRvU2Nyb2xsUmV3aW5kfGN0cmxBdXRvU2Nyb2xsU3BlZWR8Y3RybENoZWNrZWR8Y3RybENsYXNzTmFtZXxjdHJsQ29tbWl0fGN0cmxDb21taXR0ZWR8Y3RybENyZWF0ZXxjdHJsRGVsZXRlfGN0cmxFbmFibGV8Y3RybEVuYWJsZWR8Y3RybEZhZGV8Y3RybEhUTUxMb2FkZWR8Y3RybElEQ3xjdHJsSUREfGN0cmxNYXBBbmltQWRkfGN0cmxNYXBBbmltQ2xlYXJ8Y3RybE1hcEFuaW1Db21taXR8Y3RybE1hcEFuaW1Eb25lfGN0cmxNYXBDdXJzb3J8Y3RybE1hcE1vdXNlT3ZlcnxjdHJsTWFwU2NhbGV8Y3RybE1hcFNjcmVlblRvV29ybGR8Y3RybE1hcFdvcmxkVG9TY3JlZW58Y3RybE1vZGVsfGN0cmxNb2RlbERpckFuZFVwfGN0cmxNb2RlbFNjYWxlfGN0cmxQYXJlbnR8Y3RybFBhcmVudENvbnRyb2xzR3JvdXB8Y3RybFBvc2l0aW9ufGN0cmxSZW1vdmVBbGxFdmVudEhhbmRsZXJzfGN0cmxSZW1vdmVFdmVudEhhbmRsZXJ8Y3RybFNjYWxlfGN0cmxTZXRBY3RpdmVDb2xvcnxjdHJsU2V0QW5nbGV8Y3RybFNldEF1dG9TY3JvbGxEZWxheXxjdHJsU2V0QXV0b1Njcm9sbFJld2luZHxjdHJsU2V0QXV0b1Njcm9sbFNwZWVkfGN0cmxTZXRCYWNrZ3JvdW5kQ29sb3J8Y3RybFNldENoZWNrZWR8Y3RybFNldERpc2FibGVkQ29sb3J8Y3RybFNldEV2ZW50SGFuZGxlcnxjdHJsU2V0RmFkZXxjdHJsU2V0Rm9jdXN8Y3RybFNldEZvbnR8Y3RybFNldEZvbnRIMXxjdHJsU2V0Rm9udEgxQnxjdHJsU2V0Rm9udEgyfGN0cmxTZXRGb250SDJCfGN0cmxTZXRGb250SDN8Y3RybFNldEZvbnRIM0J8Y3RybFNldEZvbnRINHxjdHJsU2V0Rm9udEg0QnxjdHJsU2V0Rm9udEg1fGN0cmxTZXRGb250SDVCfGN0cmxTZXRGb250SDZ8Y3RybFNldEZvbnRINkJ8Y3RybFNldEZvbnRIZWlnaHR8Y3RybFNldEZvbnRIZWlnaHRIMXxjdHJsU2V0Rm9udEhlaWdodEgyfGN0cmxTZXRGb250SGVpZ2h0SDN8Y3RybFNldEZvbnRIZWlnaHRINHxjdHJsU2V0Rm9udEhlaWdodEg1fGN0cmxTZXRGb250SGVpZ2h0SDZ8Y3RybFNldEZvbnRIZWlnaHRTZWNvbmRhcnl8Y3RybFNldEZvbnRQfGN0cmxTZXRGb250UEJ8Y3RybFNldEZvbnRTZWNvbmRhcnl8Y3RybFNldEZvcmVncm91bmRDb2xvcnxjdHJsU2V0TW9kZWx8Y3RybFNldE1vZGVsRGlyQW5kVXB8Y3RybFNldE1vZGVsU2NhbGV8Y3RybFNldFBpeGVsUHJlY2lzaW9ufGN0cmxTZXRQb3NpdGlvbnxjdHJsU2V0U2NhbGV8Y3RybFNldFN0cnVjdHVyZWRUZXh0fGN0cmxTZXRUZXh0fGN0cmxTZXRUZXh0Q29sb3J8Y3RybFNldFRleHRDb2xvclNlY29uZGFyeXxjdHJsU2V0VGV4dFNlY29uZGFyeXxjdHJsU2V0VG9vbHRpcHxjdHJsU2V0VG9vbHRpcENvbG9yQm94fGN0cmxTZXRUb29sdGlwQ29sb3JTaGFkZXxjdHJsU2V0VG9vbHRpcENvbG9yVGV4dHxjdHJsU2hvd3xjdHJsU2hvd258Y3RybFRleHR8Y3RybFRleHRIZWlnaHR8Y3RybFRleHRTZWNvbmRhcnl8Y3RybFRleHRXaWR0aHxjdHJsVHlwZXxjdHJsVmlzaWJsZXxjdFJvd0NvbnRyb2xzfGN0Um93Q291bnR8Y3RTZXRDdXJTZWx8Y3RTZXREYXRhfGN0U2V0SGVhZGVyVGVtcGxhdGV8Y3RTZXRSb3dUZW1wbGF0ZXxjdFNldFZhbHVlfGN0VmFsdWV8Y3VyYXRvckFkZG9uc3xjdXJhdG9yQ2FtZXJhfGN1cmF0b3JDYW1lcmFBcmVhfGN1cmF0b3JDYW1lcmFBcmVhQ2VpbGluZ3xjdXJhdG9yQ29lZnxjdXJhdG9yRWRpdGFibGVPYmplY3RzfGN1cmF0b3JFZGl0aW5nQXJlYXxjdXJhdG9yRWRpdGluZ0FyZWFUeXBlfGN1cmF0b3JNb3VzZU92ZXJ8Y3VyYXRvclBvaW50c3xjdXJhdG9yUmVnaXN0ZXJlZE9iamVjdHN8Y3VyYXRvclNlbGVjdGVkfGN1cmF0b3JXYXlwb2ludENvc3R8Y3VycmVudDNERU5PcGVyYXRpb258Y3VycmVudENoYW5uZWx8Y3VycmVudENvbW1hbmR8Y3VycmVudE1hZ2F6aW5lfGN1cnJlbnRNYWdhemluZURldGFpbHxjdXJyZW50TWFnYXppbmVEZXRhaWxUdXJyZXR8Y3VycmVudE1hZ2F6aW5lVHVycmV0fGN1cnJlbnRNdXp6bGV8Y3VycmVudE5hbWVzcGFjZXxjdXJyZW50VGFza3xjdXJyZW50VGFza3N8Y3VycmVudFRocm93YWJsZXxjdXJyZW50VmlzaW9uTW9kZXxjdXJyZW50V2F5cG9pbnR8Y3VycmVudFdlYXBvbnxjdXJyZW50V2VhcG9uTW9kZXxjdXJyZW50V2VhcG9uVHVycmV0fGN1cnJlbnRaZXJvaW5nfGN1cnNvck9iamVjdHxjdXJzb3JUYXJnZXR8Y3VzdG9tQ2hhdHxjdXN0b21SYWRpb3xjdXRGYWRlT3V0fGN1dE9ianxjdXRSc2N8Y3V0VGV4dHxkYW1hZ2V8ZGF0ZXxkYXRlVG9OdW1iZXJ8ZGF5dGltZXxkZUFjdGl2YXRlS2V5fGRlYnJpZWZpbmdUZXh0fGRlYnVnRlNNfGRlYnVnTG9nfGRlZ3xkZWxldGUzREVORW50aXRpZXN8ZGVsZXRlQXR8ZGVsZXRlQ2VudGVyfGRlbGV0ZUNvbGxlY3Rpb258ZGVsZXRlRWRpdG9yT2JqZWN0fGRlbGV0ZUdyb3VwfGRlbGV0ZUdyb3VwV2hlbkVtcHR5fGRlbGV0ZUlkZW50aXR5fGRlbGV0ZUxvY2F0aW9ufGRlbGV0ZU1hcmtlcnxkZWxldGVNYXJrZXJMb2NhbHxkZWxldGVSYW5nZXxkZWxldGVSZXNvdXJjZXN8ZGVsZXRlU2l0ZXxkZWxldGVTdGF0dXN8ZGVsZXRlVGVhbXxkZWxldGVWZWhpY2xlfGRlbGV0ZVZlaGljbGVDcmV3fGRlbGV0ZVdheXBvaW50fGRldGFjaHxkZXRlY3RlZE1pbmVzfGRpYWdfYWN0aXZlTWlzc2lvbkZTTXN8ZGlhZ19hY3RpdmVTY3JpcHRzfGRpYWdfYWN0aXZlU1FGU2NyaXB0c3xkaWFnX2FjdGl2ZVNRU1NjcmlwdHN8ZGlhZ19jYXB0dXJlRnJhbWV8ZGlhZ19jYXB0dXJlRnJhbWVUb0ZpbGV8ZGlhZ19jYXB0dXJlU2xvd0ZyYW1lfGRpYWdfY29kZVBlcmZvcm1hbmNlfGRpYWdfZHJhd01vZGV8ZGlhZ19keW5hbWljU2ltdWxhdGlvbkVuZHxkaWFnX2VuYWJsZXxkaWFnX2VuYWJsZWR8ZGlhZ19mcHN8ZGlhZ19mcHNNaW58ZGlhZ19mcmFtZU5vfGRpYWdfbGlnaHROZXdMb2FkfGRpYWdfbGlzdHxkaWFnX2xvZ3xkaWFnX2xvZ1Nsb3dGcmFtZXxkaWFnX21lcmdlQ29uZmlnRmlsZXxkaWFnX3JlY29yZFR1cnJldExpbWl0c3xkaWFnX3NldExpZ2h0TmV3fGRpYWdfdGlja1RpbWV8ZGlhZ190b2dnbGV8ZGlhbG9nfGRpYXJ5U3ViamVjdEV4aXN0c3xkaWRKSVB8ZGlkSklQT3duZXJ8ZGlmZmljdWx0eXxkaWZmaWN1bHR5RW5hYmxlZHxkaWZmaWN1bHR5RW5hYmxlZFJURHxkaWZmaWN1bHR5T3B0aW9ufGRpcmVjdGlvbnxkaXJlY3RTYXl8ZGlzYWJsZUFJfGRpc2FibGVDb2xsaXNpb25XaXRofGRpc2FibGVDb252ZXJzYXRpb258ZGlzYWJsZURlYnJpZWZpbmdTdGF0c3xkaXNhYmxlTWFwSW5kaWNhdG9yc3xkaXNhYmxlTlZHRXF1aXBtZW50fGRpc2FibGVSZW1vdGVTZW5zb3JzfGRpc2FibGVTZXJpYWxpemF0aW9ufGRpc2FibGVUSUVxdWlwbWVudHxkaXNhYmxlVUFWQ29ubmVjdGFiaWxpdHl8ZGlzYWJsZVVzZXJJbnB1dHxkaXNwbGF5QWRkRXZlbnRIYW5kbGVyfGRpc3BsYXlDdHJsfGRpc3BsYXlOdWxsfGRpc3BsYXlQYXJlbnR8ZGlzcGxheVJlbW92ZUFsbEV2ZW50SGFuZGxlcnN8ZGlzcGxheVJlbW92ZUV2ZW50SGFuZGxlcnxkaXNwbGF5U2V0RXZlbnRIYW5kbGVyfGRpc3NvbHZlVGVhbXxkaXN0YW5jZXxkaXN0YW5jZTJEfGRpc3RhbmNlU3FyfGRpc3RyaWJ1dGlvblJlZ2lvbnxkbzNERU5BY3Rpb258ZG9BcnRpbGxlcnlGaXJlfGRvRmlyZXxkb0ZvbGxvd3xkb0ZTTXxkb0dldE91dHxkb01vdmV8ZG9vclBoYXNlfGRvU3RvcHxkb1N1cHByZXNzaXZlRmlyZXxkb1RhcmdldHxkb1dhdGNofGRyYXdBcnJvd3xkcmF3RWxsaXBzZXxkcmF3SWNvbnxkcmF3SWNvbjNEfGRyYXdMaW5lfGRyYXdMaW5lM0R8ZHJhd0xpbmt8ZHJhd0xvY2F0aW9ufGRyYXdQb2x5Z29ufGRyYXdSZWN0YW5nbGV8ZHJhd1RyaWFuZ2xlfGRyaXZlcnxkcm9wfGR5bmFtaWNTaW11bGF0aW9uRGlzdGFuY2V8ZHluYW1pY1NpbXVsYXRpb25EaXN0YW5jZUNvZWZ8ZHluYW1pY1NpbXVsYXRpb25FbmFibGVkfGR5bmFtaWNTaW11bGF0aW9uU3lzdGVtRW5hYmxlZHxlYXN0fGVkaXQzREVOTWlzc2lvbkF0dHJpYnV0ZXN8ZWRpdE9iamVjdHxlZGl0b3JTZXRFdmVudEhhbmRsZXJ8ZWZmZWN0aXZlQ29tbWFuZGVyfGVtcHR5UG9zaXRpb25zfGVuYWJsZUFJfGVuYWJsZUFJRmVhdHVyZXxlbmFibGVBaW1QcmVjaXNpb258ZW5hYmxlQXR0YWNrfGVuYWJsZUF1ZGlvRmVhdHVyZXxlbmFibGVBdXRvU3RhcnRVcFJURHxlbmFibGVBdXRvVHJpbVJURHxlbmFibGVDYW1TaGFrZXxlbmFibGVDYXVzdGljc3xlbmFibGVDaGFubmVsfGVuYWJsZUNvbGxpc2lvbldpdGh8ZW5hYmxlQ29waWxvdHxlbmFibGVEZWJyaWVmaW5nU3RhdHN8ZW5hYmxlRGlhZ0xlZ2VuZHxlbmFibGVEeW5hbWljU2ltdWxhdGlvbnxlbmFibGVEeW5hbWljU2ltdWxhdGlvblN5c3RlbXxlbmFibGVFbmREaWFsb2d8ZW5hYmxlRW5naW5lQXJ0aWxsZXJ5fGVuYWJsZUVudmlyb25tZW50fGVuYWJsZUZhdGlndWV8ZW5hYmxlR3VuTGlnaHRzfGVuYWJsZUluZm9QYW5lbENvbXBvbmVudHxlbmFibGVJUkxhc2Vyc3xlbmFibGVNaW1pY3N8ZW5hYmxlUGVyc29uVHVycmV0fGVuYWJsZVJhZGlvfGVuYWJsZVJlbG9hZHxlbmFibGVSb3BlQXR0YWNofGVuYWJsZVNhdE5vcm1hbE9uRGV0YWlsfGVuYWJsZVNhdmluZ3xlbmFibGVTZW50ZW5jZXN8ZW5hYmxlU2ltdWxhdGlvbnxlbmFibGVTaW11bGF0aW9uR2xvYmFsfGVuYWJsZVN0YW1pbmF8ZW5hYmxlU3RyZXNzRGFtYWdlfGVuYWJsZVRlYW1Td2l0Y2h8ZW5hYmxlVHJhZmZpY3xlbmFibGVVQVZDb25uZWN0YWJpbGl0eXxlbmFibGVVQVZXYXlwb2ludHN8ZW5hYmxlVmVoaWNsZUNhcmdvfGVuYWJsZVZlaGljbGVTZW5zb3J8ZW5hYmxlV2VhcG9uRGlzYXNzZW1ibHl8ZW5kbHxlbmRMb2FkaW5nU2NyZWVufGVuZE1pc3Npb258ZW5naW5lT258ZW5naW5lc0lzT25SVER8ZW5naW5lc1Bvd2VyUlREfGVuZ2luZXNScG1SVER8ZW5naW5lc1RvcnF1ZVJURHxlbnRpdGllc3xlbnZpcm9ubWVudEVuYWJsZWR8ZXN0aW1hdGVkRW5kU2VydmVyVGltZXxlc3RpbWF0ZWRUaW1lTGVmdHxldmFsT2JqZWN0QXJndW1lbnR8ZXZlcnlCYWNrcGFja3xldmVyeUNvbnRhaW5lcnxleGVjfGV4ZWNFZGl0b3JTY3JpcHR8ZXhwfGV4cGVjdGVkRGVzdGluYXRpb258ZXhwb3J0SklQTWVzc2FnZXN8ZXllRGlyZWN0aW9ufGV5ZVBvc3xmYWNlfGZhY3Rpb258ZmFkZU11c2ljfGZhZGVSYWRpb3xmYWRlU291bmR8ZmFkZVNwZWVjaHxmYWlsTWlzc2lvbnxmaWxsV2VhcG9uc0Zyb21Qb29sfGZpbmR8ZmluZENvdmVyfGZpbmREaXNwbGF5fGZpbmRFZGl0b3JPYmplY3R8ZmluZEVtcHR5UG9zaXRpb258ZmluZEVtcHR5UG9zaXRpb25SZWFkeXxmaW5kSWZ8ZmluZE5lYXJlc3RFbmVteXxmaW5pc2hNaXNzaW9uSW5pdHxmaW5pdGV8ZmlyZXxmaXJlQXRUYXJnZXR8Zmlyc3RCYWNrcGFja3xmbGFnfGZsYWdBbmltYXRpb25QaGFzZXxmbGFnT3duZXJ8ZmxhZ1NpZGV8ZmxhZ1RleHR1cmV8ZmxlZWluZ3xmbG9vcnxmbHlJbkhlaWdodHxmbHlJbkhlaWdodEFTTHxmb2d8Zm9nRm9yZWNhc3R8Zm9nUGFyYW1zfGZvcmNlQWRkVW5pZm9ybXxmb3JjZUF0UG9zaXRpb25SVER8Zm9yY2VkTWFwfGZvcmNlRW5kfGZvcmNlRmxhZ1RleHR1cmV8Zm9yY2VGb2xsb3dSb2FkfGZvcmNlR2VuZXJhdG9yUlREfGZvcmNlTWFwfGZvcmNlUmVzcGF3bnxmb3JjZVNwZWVkfGZvcmNlV2Fsa3xmb3JjZVdlYXBvbkZpcmV8Zm9yY2VXZWF0aGVyQ2hhbmdlfGZvcmdldFRhcmdldHxmb3JtYXR8Zm9ybWF0aW9ufGZvcm1hdGlvbkRpcmVjdGlvbnxmb3JtYXRpb25MZWFkZXJ8Zm9ybWF0aW9uTWVtYmVyc3xmb3JtYXRpb25Qb3NpdGlvbnxmb3JtYXRpb25UYXNrfGZvcm1hdFRleHR8Zm9ybUxlYWRlcnxmcmVlTG9va3xmcm9tRWRpdG9yfGZ1ZWx8ZnVsbENyZXd8Z2VhcklEQ0FtbW9Db3VudHxnZWFyU2xvdEFtbW9Db3VudHxnZWFyU2xvdERhdGF8Z2V0M0RFTkFjdGlvblN0YXRlfGdldDNERU5BdHRyaWJ1dGV8Z2V0M0RFTkNhbWVyYXxnZXQzREVOQ29ubmVjdGlvbnN8Z2V0M0RFTkVudGl0eXxnZXQzREVORW50aXR5SUR8Z2V0M0RFTkdyaWR8Z2V0M0RFTkljb25zVmlzaWJsZXxnZXQzREVOTGF5ZXJFbnRpdGllc3xnZXQzREVOTGluZXNWaXNpYmxlfGdldDNERU5NaXNzaW9uQXR0cmlidXRlfGdldDNERU5Nb3VzZU92ZXJ8Z2V0M0RFTlNlbGVjdGVkfGdldEFpbWluZ0NvZWZ8Z2V0QWxsRW52U291bmRDb250cm9sbGVyc3xnZXRBbGxIaXRQb2ludHNEYW1hZ2V8Z2V0QWxsT3duZWRNaW5lc3xnZXRBbGxTb3VuZENvbnRyb2xsZXJzfGdldEFtbW9DYXJnb3xnZXRBbmltQWltUHJlY2lzaW9ufGdldEFuaW1TcGVlZENvZWZ8Z2V0QXJyYXl8Z2V0QXJ0aWxsZXJ5QW1tb3xnZXRBcnRpbGxlcnlDb21wdXRlclNldHRpbmdzfGdldEFydGlsbGVyeUVUQXxnZXRBc3NpZ25lZEN1cmF0b3JMb2dpY3xnZXRBc3NpZ25lZEN1cmF0b3JVbml0fGdldEJhY2twYWNrQ2FyZ298Z2V0QmxlZWRpbmdSZW1haW5pbmd8Z2V0QnVybmluZ1ZhbHVlfGdldENhbWVyYVZpZXdEaXJlY3Rpb258Z2V0Q2FyZ29JbmRleHxnZXRDZW50ZXJPZk1hc3N8Z2V0Q2xpZW50U3RhdGV8Z2V0Q2xpZW50U3RhdGVOdW1iZXJ8Z2V0Q29tcGF0aWJsZVB5bG9uTWFnYXppbmVzfGdldENvbm5lY3RlZFVBVnxnZXRDb250YWluZXJNYXhMb2FkfGdldEN1cnNvck9iamVjdFBhcmFtc3xnZXRDdXN0b21BaW1Db2VmfGdldERhbW1hZ2V8Z2V0RGVzY3JpcHRpb258Z2V0RGlyfGdldERpclZpc3VhbHxnZXRETENBc3NldHNVc2FnZXxnZXRETENBc3NldHNVc2FnZUJ5TmFtZXxnZXRETENzfGdldERMQ1VzYWdlVGltZXxnZXRFZGl0b3JDYW1lcmF8Z2V0RWRpdG9yTW9kZXxnZXRFZGl0b3JPYmplY3RTY29wZXxnZXRFbGV2YXRpb25PZmZzZXR8Z2V0RW5naW5lVGFyZ2V0UnBtUlREfGdldEVudlNvdW5kQ29udHJvbGxlcnxnZXRGYXRpZ3VlfGdldEZpZWxkTWFudWFsU3RhcnRQYWdlfGdldEZvcmNlZEZsYWdUZXh0dXJlfGdldEZyaWVuZHxnZXRGU01WYXJpYWJsZXxnZXRGdWVsQ2FyZ298Z2V0R3JvdXBJY29ufGdldEdyb3VwSWNvblBhcmFtc3xnZXRHcm91cEljb25zfGdldEhpZGVGcm9tfGdldEhpdHxnZXRIaXRJbmRleHxnZXRIaXRQb2ludERhbWFnZXxnZXRJdGVtQ2FyZ298Z2V0TWFnYXppbmVDYXJnb3xnZXRNYXJrZXJDb2xvcnxnZXRNYXJrZXJQb3N8Z2V0TWFya2VyU2l6ZXxnZXRNYXJrZXJUeXBlfGdldE1hc3N8Z2V0TWlzc2lvbkNvbmZpZ3xnZXRNaXNzaW9uQ29uZmlnVmFsdWV8Z2V0TWlzc2lvbkRMQ3N8Z2V0TWlzc2lvbkxheWVyRW50aXRpZXN8Z2V0TWlzc2lvbkxheWVyc3xnZXRNb2RlbEluZm98Z2V0TW91c2VQb3NpdGlvbnxnZXRNdXNpY1BsYXllZFRpbWV8Z2V0TnVtYmVyfGdldE9iamVjdEFyZ3VtZW50fGdldE9iamVjdENoaWxkcmVufGdldE9iamVjdERMQ3xnZXRPYmplY3RNYXRlcmlhbHN8Z2V0T2JqZWN0UHJveHl8Z2V0T2JqZWN0VGV4dHVyZXN8Z2V0T2JqZWN0VHlwZXxnZXRPYmplY3RWaWV3RGlzdGFuY2V8Z2V0T3h5Z2VuUmVtYWluaW5nfGdldFBlcnNvblVzZWRETENzfGdldFBpbG90Q2FtZXJhRGlyZWN0aW9ufGdldFBpbG90Q2FtZXJhUG9zaXRpb258Z2V0UGlsb3RDYW1lcmFSb3RhdGlvbnxnZXRQaWxvdENhbWVyYVRhcmdldHxnZXRQbGF0ZU51bWJlcnxnZXRQbGF5ZXJDaGFubmVsfGdldFBsYXllclNjb3Jlc3xnZXRQbGF5ZXJVSUR8Z2V0UGxheWVyVUlET2xkfGdldFBvc3xnZXRQb3NBU0x8Z2V0UG9zQVNMVmlzdWFsfGdldFBvc0FTTFd8Z2V0UG9zQVRMfGdldFBvc0FUTFZpc3VhbHxnZXRQb3NWaXN1YWx8Z2V0UG9zV29ybGR8Z2V0UHlsb25NYWdhemluZXN8Z2V0UmVsRGlyfGdldFJlbFBvc3xnZXRSZW1vdGVTZW5zb3JzRGlzYWJsZWR8Z2V0UmVwYWlyQ2FyZ298Z2V0UmVzb2x1dGlvbnxnZXRSb3RvckJyYWtlUlREfGdldFNoYWRvd0Rpc3RhbmNlfGdldFNob3RQYXJlbnRzfGdldFNsaW5nTG9hZHxnZXRTb3VuZENvbnRyb2xsZXJ8Z2V0U291bmRDb250cm9sbGVyUmVzdWx0fGdldFNwZWVkfGdldFN0YW1pbmF8Z2V0U3RhdFZhbHVlfGdldFN1cHByZXNzaW9ufGdldFRlcnJhaW5HcmlkfGdldFRlcnJhaW5IZWlnaHRBU0x8Z2V0VGV4dHxnZXRUb3RhbERMQ1VzYWdlVGltZXxnZXRUcmltT2Zmc2V0UlREfGdldFVuaXRMb2Fkb3V0fGdldFVuaXRUcmFpdHxnZXRVc2VyTUZEVGV4dHxnZXRVc2VyTUZEVmFsdWV8Z2V0VmFyaWFibGV8Z2V0VmVoaWNsZUNhcmdvfGdldFdlYXBvbkNhcmdvfGdldFdlYXBvblN3YXl8Z2V0V2luZ3NPcmllbnRhdGlvblJURHxnZXRXaW5nc1Bvc2l0aW9uUlREfGdldFdQUG9zfGdsYW5jZUF0fGdsb2JhbENoYXR8Z2xvYmFsUmFkaW98Z29nZ2xlc3xncm91cHxncm91cENoYXR8Z3JvdXBGcm9tTmV0SWR8Z3JvdXBJY29uU2VsZWN0YWJsZXxncm91cEljb25zVmlzaWJsZXxncm91cElkfGdyb3VwT3duZXJ8Z3JvdXBSYWRpb3xncm91cFNlbGVjdGVkVW5pdHN8Z3JvdXBTZWxlY3RVbml0fGdycE51bGx8Z3VubmVyfGd1c3RzfGhhbHR8aGFuZGd1bkl0ZW1zfGhhbmRndW5NYWdhemluZXxoYW5kZ3VuV2VhcG9ufGhhbmRzSGl0fGhhc0ludGVyZmFjZXxoYXNQaWxvdENhbWVyYXxoYXNXZWFwb258aGNBbGxHcm91cHN8aGNHcm91cFBhcmFtc3xoY0xlYWRlcnxoY1JlbW92ZUFsbEdyb3Vwc3xoY1JlbW92ZUdyb3VwfGhjU2VsZWN0ZWR8aGNTZWxlY3RHcm91cHxoY1NldEdyb3VwfGhjU2hvd0JhcnxoY1Nob3duQmFyfGhlYWRnZWFyfGhpZGVCb2R5fGhpZGVPYmplY3R8aGlkZU9iamVjdEdsb2JhbHxoaWRlU2VsZWN0aW9ufGhpbnR8aGludEN8aGludENhZGV0fGhpbnRTaWxlbnR8aG1kfGhvc3RNaXNzaW9ufGh0bWxMb2FkfEhVRE1vdmVtZW50TGV2ZWxzfGh1bWlkaXR5fGltYWdlfGltcG9ydEFsbEdyb3Vwc3xpbXBvcnRhbmNlfGlufGluQXJlYXxpbkFyZWFBcnJheXxpbmNhcGFjaXRhdGVkU3RhdGV8aW5kZXBlbmRlbnR8aW5mbGFtZXxpbmZsYW1lZHxpbmZvUGFuZWx8aW5mb1BhbmVsQ29tcG9uZW50RW5hYmxlZHxpbmZvUGFuZWxDb21wb25lbnRzfGluZm9QYW5lbHN8aW5HYW1lVUlTZXRFdmVudEhhbmRsZXJ8aW5oZXJpdHNGcm9tfGluaXRBbWJpZW50TGlmZXxpblBvbHlnb258aW5wdXRBY3Rpb258aW5SYW5nZU9mQXJ0aWxsZXJ5fGluc2VydEVkaXRvck9iamVjdHxpbnRlcnNlY3R8aXMzREVOfGlzM0RFTk11bHRpcGxheWVyfGlzQWJsZVRvQnJlYXRoZXxpc0FnZW50fGlzQWltUHJlY2lzaW9uRW5hYmxlZHxpc0FycmF5fGlzQXV0b0hvdmVyT258aXNBdXRvbm9tb3VzfGlzQXV0b1N0YXJ0VXBFbmFibGVkUlREfGlzQXV0b3Rlc3R8aXNBdXRvVHJpbU9uUlREfGlzQmxlZWRpbmd8aXNCdXJuaW5nfGlzQ2xhc3N8aXNDb2xsaXNpb25MaWdodE9ufGlzQ29waWxvdEVuYWJsZWR8aXNEYW1hZ2VBbGxvd2VkfGlzRGVkaWNhdGVkfGlzRExDQXZhaWxhYmxlfGlzRW5naW5lT258aXNFcXVhbFRvfGlzRXF1YWxUeXBlfGlzRXF1YWxUeXBlQWxsfGlzRXF1YWxUeXBlQW55fGlzRXF1YWxUeXBlQXJyYXl8aXNFcXVhbFR5cGVQYXJhbXN8aXNGaWxlUGF0Y2hpbmdFbmFibGVkfGlzRmxhc2hsaWdodE9ufGlzRmxhdEVtcHR5fGlzRm9yY2VkV2Fsa3xpc0Zvcm1hdGlvbkxlYWRlcnxpc0dyb3VwRGVsZXRlZFdoZW5FbXB0eXxpc0hpZGRlbnxpc0luUmVtYWluc0NvbGxlY3Rvcnxpc0luc3RydWN0b3JGaWd1cmVFbmFibGVkfGlzSVJMYXNlck9ufGlzS2V5QWN0aXZlfGlzS2luZE9mfGlzTGFzZXJPbnxpc0xpZ2h0T258aXNMb2NhbGl6ZWR8aXNNYW51YWxGaXJlfGlzTWFya2VkRm9yQ29sbGVjdGlvbnxpc011bHRpcGxheWVyfGlzTXVsdGlwbGF5ZXJTb2xvfGlzTmlsfGlzTnVsbHxpc051bWJlcnxpc09iamVjdEhpZGRlbnxpc09iamVjdFJURHxpc09uUm9hZHxpc1BpcEVuYWJsZWR8aXNQbGF5ZXJ8aXNSZWFsVGltZXxpc1JlbW90ZUV4ZWN1dGVkfGlzUmVtb3RlRXhlY3V0ZWRKSVB8aXNTZXJ2ZXJ8aXNTaG93aW5nM0RJY29uc3xpc1NpbXBsZU9iamVjdHxpc1NwcmludEFsbG93ZWR8aXNTdGFtaW5hRW5hYmxlZHxpc1N0ZWFtTWlzc2lvbnxpc1N0cmVhbUZyaWVuZGx5VUlFbmFibGVkfGlzU3RyZXNzRGFtYWdlRW5hYmxlZHxpc1RleHR8aXNUb3VjaGluZ0dyb3VuZHxpc1R1cm5lZE91dHxpc1R1dEhpbnRzRW5hYmxlZHxpc1VBVkNvbm5lY3RhYmxlfGlzVUFWQ29ubmVjdGVkfGlzVUlDb250ZXh0fGlzVW5pZm9ybUFsbG93ZWR8aXNWZWhpY2xlQ2FyZ298aXNWZWhpY2xlUmFkYXJPbnxpc1ZlaGljbGVTZW5zb3JFbmFibGVkfGlzV2Fsa2luZ3xpc1dlYXBvbkRlcGxveWVkfGlzV2VhcG9uUmVzdGVkfGl0ZW1DYXJnb3xpdGVtc3xpdGVtc1dpdGhNYWdhemluZXN8am9pbnxqb2luQXN8am9pbkFzU2lsZW50fGpvaW5TaWxlbnR8am9pblN0cmluZ3xrYkFkZERhdGFiYXNlfGtiQWRkRGF0YWJhc2VUYXJnZXRzfGtiQWRkVG9waWN8a2JIYXNUb3BpY3xrYlJlYWN0fGtiUmVtb3ZlVG9waWN8a2JUZWxsfGtiV2FzU2FpZHxrZXlJbWFnZXxrZXlOYW1lfGtub3dzQWJvdXR8bGFuZHxsYW5kQXR8bGFuZFJlc3VsdHxsYW5ndWFnZXxsYXNlclRhcmdldHxsYkFkZHxsYkNsZWFyfGxiQ29sb3J8bGJDb2xvclJpZ2h0fGxiQ3VyU2VsfGxiRGF0YXxsYkRlbGV0ZXxsYklzU2VsZWN0ZWR8bGJQaWN0dXJlfGxiUGljdHVyZVJpZ2h0fGxiU2VsZWN0aW9ufGxiU2V0Q29sb3J8bGJTZXRDb2xvclJpZ2h0fGxiU2V0Q3VyU2VsfGxiU2V0RGF0YXxsYlNldFBpY3R1cmV8bGJTZXRQaWN0dXJlQ29sb3J8bGJTZXRQaWN0dXJlQ29sb3JEaXNhYmxlZHxsYlNldFBpY3R1cmVDb2xvclNlbGVjdGVkfGxiU2V0UGljdHVyZVJpZ2h0fGxiU2V0UGljdHVyZVJpZ2h0Q29sb3J8bGJTZXRQaWN0dXJlUmlnaHRDb2xvckRpc2FibGVkfGxiU2V0UGljdHVyZVJpZ2h0Q29sb3JTZWxlY3RlZHxsYlNldFNlbGVjdENvbG9yfGxiU2V0U2VsZWN0Q29sb3JSaWdodHxsYlNldFNlbGVjdGVkfGxiU2V0VGV4dHxsYlNldFRleHRSaWdodHxsYlNldFRvb2x0aXB8bGJTZXRWYWx1ZXxsYlNpemV8bGJTb3J0fGxiU29ydEJ5VmFsdWV8bGJUZXh0fGxiVGV4dFJpZ2h0fGxiVmFsdWV8bGVhZGVyfGxlYWRlcmJvYXJkRGVJbml0fGxlYWRlcmJvYXJkR2V0Um93c3xsZWFkZXJib2FyZEluaXR8bGVhZGVyYm9hcmRSZXF1ZXN0Um93c0ZyaWVuZHN8bGVhZGVyYm9hcmRSZXF1ZXN0Um93c0dsb2JhbHxsZWFkZXJib2FyZFJlcXVlc3RSb3dzR2xvYmFsQXJvdW5kVXNlcnxsZWFkZXJib2FyZHNSZXF1ZXN0VXBsb2FkU2NvcmV8bGVhZGVyYm9hcmRzUmVxdWVzdFVwbG9hZFNjb3JlS2VlcEJlc3R8bGVhZGVyYm9hcmRTdGF0ZXxsZWF2ZVZlaGljbGV8bGlicmFyeUNyZWRpdHN8bGlicmFyeURpc2NsYWltZXJzfGxpZmVTdGF0ZXxsaWdodEF0dGFjaE9iamVjdHxsaWdodERldGFjaE9iamVjdHxsaWdodElzT258bGlnaHRuaW5nc3xsaW1pdFNwZWVkfGxpbmVhckNvbnZlcnNpb258bGluZUJyZWFrfGxpbmVJbnRlcnNlY3RzfGxpbmVJbnRlcnNlY3RzT2Jqc3xsaW5lSW50ZXJzZWN0c1N1cmZhY2VzfGxpbmVJbnRlcnNlY3RzV2l0aHxsaW5rSXRlbXxsaXN0fGxpc3RPYmplY3RzfGxpc3RSZW1vdGVUYXJnZXRzfGxpc3RWZWhpY2xlU2Vuc29yc3xsbnxsbmJBZGRBcnJheXxsbmJBZGRDb2x1bW58bG5iQWRkUm93fGxuYkNsZWFyfGxuYkNvbG9yfGxuYkNvbG9yUmlnaHR8bG5iQ3VyU2VsUm93fGxuYkRhdGF8bG5iRGVsZXRlQ29sdW1ufGxuYkRlbGV0ZVJvd3xsbmJHZXRDb2x1bW5zUG9zaXRpb258bG5iUGljdHVyZXxsbmJQaWN0dXJlUmlnaHR8bG5iU2V0Q29sb3J8bG5iU2V0Q29sb3JSaWdodHxsbmJTZXRDb2x1bW5zUG9zfGxuYlNldEN1clNlbFJvd3xsbmJTZXREYXRhfGxuYlNldFBpY3R1cmV8bG5iU2V0UGljdHVyZUNvbG9yfGxuYlNldFBpY3R1cmVDb2xvclJpZ2h0fGxuYlNldFBpY3R1cmVDb2xvclNlbGVjdGVkfGxuYlNldFBpY3R1cmVDb2xvclNlbGVjdGVkUmlnaHR8bG5iU2V0UGljdHVyZVJpZ2h0fGxuYlNldFRleHR8bG5iU2V0VGV4dFJpZ2h0fGxuYlNldFZhbHVlfGxuYlNpemV8bG5iU29ydHxsbmJTb3J0QnlWYWx1ZXxsbmJUZXh0fGxuYlRleHRSaWdodHxsbmJWYWx1ZXxsb2FkfGxvYWRBYnN8bG9hZEJhY2twYWNrfGxvYWRGaWxlfGxvYWRHYW1lfGxvYWRJZGVudGl0eXxsb2FkTWFnYXppbmV8bG9hZE92ZXJsYXl8bG9hZFN0YXR1c3xsb2FkVW5pZm9ybXxsb2FkVmVzdHxsb2NhbHxsb2NhbGl6ZXxsb2NhdGlvbk51bGx8bG9jYXRpb25Qb3NpdGlvbnxsb2NrfGxvY2tDYW1lcmFUb3xsb2NrQ2FyZ298bG9ja0RyaXZlcnxsb2NrZWR8bG9ja2VkQ2FyZ298bG9ja2VkRHJpdmVyfGxvY2tlZFR1cnJldHxsb2NrSWRlbnRpdHl8bG9ja1R1cnJldHxsb2NrV1B8bG9nfGxvZ0VudGl0aWVzfGxvZ05ldHdvcmt8bG9nTmV0d29ya1Rlcm1pbmF0ZXxsb29rQXR8bG9va0F0UG9zfG1hZ2F6aW5lQ2FyZ298bWFnYXppbmVzfG1hZ2F6aW5lc0FsbFR1cnJldHN8bWFnYXppbmVzQW1tb3xtYWdhemluZXNBbW1vQ2FyZ298bWFnYXppbmVzQW1tb0Z1bGx8bWFnYXppbmVzRGV0YWlsfG1hZ2F6aW5lc0RldGFpbEJhY2twYWNrfG1hZ2F6aW5lc0RldGFpbFVuaWZvcm18bWFnYXppbmVzRGV0YWlsVmVzdHxtYWdhemluZXNUdXJyZXR8bWFnYXppbmVUdXJyZXRBbW1vfG1hcEFuaW1BZGR8bWFwQW5pbUNsZWFyfG1hcEFuaW1Db21taXR8bWFwQW5pbURvbmV8bWFwQ2VudGVyT25DYW1lcmF8bWFwR3JpZFBvc2l0aW9ufG1hcmtBc0ZpbmlzaGVkT25TdGVhbXxtYXJrZXJBbHBoYXxtYXJrZXJCcnVzaHxtYXJrZXJDb2xvcnxtYXJrZXJEaXJ8bWFya2VyUG9zfG1hcmtlclNoYXBlfG1hcmtlclNpemV8bWFya2VyVGV4dHxtYXJrZXJUeXBlfG1heHxtZW1iZXJzfG1lbnVBY3Rpb258bWVudUFkZHxtZW51Q2hlY2tlZHxtZW51Q2xlYXJ8bWVudUNvbGxhcHNlfG1lbnVEYXRhfG1lbnVEZWxldGV8bWVudUVuYWJsZXxtZW51RW5hYmxlZHxtZW51RXhwYW5kfG1lbnVIb3ZlcnxtZW51UGljdHVyZXxtZW51U2V0QWN0aW9ufG1lbnVTZXRDaGVja3xtZW51U2V0RGF0YXxtZW51U2V0UGljdHVyZXxtZW51U2V0VmFsdWV8bWVudVNob3J0Y3V0fG1lbnVTaG9ydGN1dFRleHR8bWVudVNpemV8bWVudVNvcnR8bWVudVRleHR8bWVudVVSTHxtZW51VmFsdWV8bWlufG1pbmVBY3RpdmV8bWluZURldGVjdGVkQnl8bWlzc2lvbkNvbmZpZ0ZpbGV8bWlzc2lvbkRpZmZpY3VsdHl8bWlzc2lvbk5hbWV8bWlzc2lvbk5hbWVzcGFjZXxtaXNzaW9uU3RhcnR8bWlzc2lvblZlcnNpb258bW9kZWxUb1dvcmxkfG1vZGVsVG9Xb3JsZFZpc3VhbHxtb2RlbFRvV29ybGRWaXN1YWxXb3JsZHxtb2RlbFRvV29ybGRXb3JsZHxtb2RQYXJhbXN8bW9vbkludGVuc2l0eXxtb29uUGhhc2V8bW9yYWxlfG1vdmV8bW92ZTNERU5DYW1lcmF8bW92ZUluQW55fG1vdmVJbkNhcmdvfG1vdmVJbkNvbW1hbmRlcnxtb3ZlSW5Ecml2ZXJ8bW92ZUluR3VubmVyfG1vdmVJblR1cnJldHxtb3ZlT2JqZWN0VG9FbmR8bW92ZU91dHxtb3ZlVGltZXxtb3ZlVG98bW92ZVRvQ29tcGxldGVkfG1vdmVUb0ZhaWxlZHxtdXNpY1ZvbHVtZXxuYW1lfG5hbWVTb3VuZHxuZWFyRW50aXRpZXN8bmVhcmVzdEJ1aWxkaW5nfG5lYXJlc3RMb2NhdGlvbnxuZWFyZXN0TG9jYXRpb25zfG5lYXJlc3RMb2NhdGlvbldpdGhEdWJiaW5nfG5lYXJlc3RPYmplY3R8bmVhcmVzdE9iamVjdHN8bmVhcmVzdFRlcnJhaW5PYmplY3RzfG5lYXJPYmplY3RzfG5lYXJPYmplY3RzUmVhZHl8bmVhclJvYWRzfG5lYXJTdXBwbGllc3xuZWFyVGFyZ2V0c3xuZWVkUmVsb2FkfG5ldElkfG5ldE9iak51bGx8bmV3T3ZlcmxheXxuZXh0TWVudUl0ZW1JbmRleHxuZXh0V2VhdGhlckNoYW5nZXxuTWVudUl0ZW1zfG51bWJlck9mRW5naW5lc1JURHxudW1iZXJUb0RhdGV8b2JqZWN0Q3VyYXRvcnN8b2JqZWN0RnJvbU5ldElkfG9iamVjdFBhcmVudHxvYmpOdWxsfG9ialN0YXR1c3xvbkJyaWVmaW5nR2VhcnxvbkJyaWVmaW5nR3JvdXB8b25CcmllZmluZ05vdGVzfG9uQnJpZWZpbmdQbGFufG9uQnJpZWZpbmdUZWFtU3dpdGNofG9uQ29tbWFuZE1vZGVDaGFuZ2VkfG9uRG91YmxlQ2xpY2t8b25FYWNoRnJhbWV8b25Hcm91cEljb25DbGlja3xvbkdyb3VwSWNvbk92ZXJFbnRlcnxvbkdyb3VwSWNvbk92ZXJMZWF2ZXxvbkhDR3JvdXBTZWxlY3Rpb25DaGFuZ2VkfG9uTWFwU2luZ2xlQ2xpY2t8b25QbGF5ZXJDb25uZWN0ZWR8b25QbGF5ZXJEaXNjb25uZWN0ZWR8b25QcmVsb2FkRmluaXNoZWR8b25QcmVsb2FkU3RhcnRlZHxvblNob3dOZXdPYmplY3R8b25UZWFtU3dpdGNofG9wZW5DdXJhdG9ySW50ZXJmYWNlfG9wZW5ETENQYWdlfG9wZW5EU0ludGVyZmFjZXxvcGVuTWFwfG9wZW5TdGVhbUFwcHxvcGVuWW91dHViZVZpZGVvfG9wZm9yfG9yZGVyR2V0SW58b3ZlcmNhc3R8b3ZlcmNhc3RGb3JlY2FzdHxvd25lcnxwYXJhbXxwYXJhbXN8cGFyc2VOdW1iZXJ8cGFyc2VTaW1wbGVBcnJheXxwYXJzZVRleHR8cGFyc2luZ05hbWVzcGFjZXxwYXJ0aWNsZXNRdWFsaXR5fHBpfHBpY2tXZWFwb25Qb29sfHBpdGNofHBpeGVsR3JpZHxwaXhlbEdyaWRCYXNlfHBpeGVsR3JpZE5vVUlTY2FsZXxwaXhlbEh8cGl4ZWxXfHBsYXlhYmxlU2xvdHNOdW1iZXJ8cGxheWFibGVVbml0c3xwbGF5QWN0aW9ufHBsYXlBY3Rpb25Ob3d8cGxheWVyfHBsYXllclJlc3Bhd25UaW1lfHBsYXllclNpZGV8cGxheWVyc051bWJlcnxwbGF5R2VzdHVyZXxwbGF5TWlzc2lvbnxwbGF5TW92ZXxwbGF5TW92ZU5vd3xwbGF5TXVzaWN8cGxheVNjcmlwdGVkTWlzc2lvbnxwbGF5U291bmR8cGxheVNvdW5kM0R8cG9zaXRpb258cG9zaXRpb25DYW1lcmFUb1dvcmxkfHBvc1NjcmVlblRvV29ybGR8cG9zV29ybGRUb1NjcmVlbnxwcEVmZmVjdEFkanVzdHxwcEVmZmVjdENvbW1pdHxwcEVmZmVjdENvbW1pdHRlZHxwcEVmZmVjdENyZWF0ZXxwcEVmZmVjdERlc3Ryb3l8cHBFZmZlY3RFbmFibGV8cHBFZmZlY3RFbmFibGVkfHBwRWZmZWN0Rm9yY2VJbk5WR3xwcmVjaXNpb258cHJlbG9hZENhbWVyYXxwcmVsb2FkT2JqZWN0fHByZWxvYWRTb3VuZHxwcmVsb2FkVGl0bGVPYmp8cHJlbG9hZFRpdGxlUnNjfHByaW1hcnlXZWFwb258cHJpbWFyeVdlYXBvbkl0ZW1zfHByaW1hcnlXZWFwb25NYWdhemluZXxwcmlvcml0eXxwcm9jZXNzRGlhcnlMaW5rfHByb2Nlc3NJbml0Q29tbWFuZHN8cHJvZHVjdFZlcnNpb258cHJvZmlsZU5hbWV8cHJvZmlsZU5hbWVzcGFjZXxwcm9maWxlTmFtZVN0ZWFtfHByb2dyZXNzTG9hZGluZ1NjcmVlbnxwcm9ncmVzc1Bvc2l0aW9ufHByb2dyZXNzU2V0UG9zaXRpb258cHVibGljVmFyaWFibGV8cHVibGljVmFyaWFibGVDbGllbnR8cHVibGljVmFyaWFibGVTZXJ2ZXJ8cHVzaEJhY2t8cHVzaEJhY2tVbmlxdWV8cHV0V2VhcG9uUG9vbHxxdWVyeUl0ZW1zUG9vbHxxdWVyeU1hZ2F6aW5lUG9vbHxxdWVyeVdlYXBvblBvb2x8cmFkfHJhZGlvQ2hhbm5lbEFkZHxyYWRpb0NoYW5uZWxDcmVhdGV8cmFkaW9DaGFubmVsUmVtb3ZlfHJhZGlvQ2hhbm5lbFNldENhbGxTaWdufHJhZGlvQ2hhbm5lbFNldExhYmVsfHJhZGlvVm9sdW1lfHJhaW58cmFpbmJvd3xyYW5kb218cmFua3xyYW5rSWR8cmF0aW5nfHJlY3Rhbmd1bGFyfHJlZ2lzdGVyZWRUYXNrc3xyZWdpc3RlclRhc2t8cmVsb2FkfHJlbG9hZEVuYWJsZWR8cmVtb3RlQ29udHJvbHxyZW1vdGVFeGVjfHJlbW90ZUV4ZWNDYWxsfHJlbW90ZUV4ZWN1dGVkT3duZXJ8cmVtb3ZlM0RFTkNvbm5lY3Rpb258cmVtb3ZlM0RFTkV2ZW50SGFuZGxlcnxyZW1vdmUzREVOTGF5ZXJ8cmVtb3ZlQWN0aW9ufHJlbW92ZUFsbDNERU5FdmVudEhhbmRsZXJzfHJlbW92ZUFsbEFjdGlvbnN8cmVtb3ZlQWxsQXNzaWduZWRJdGVtc3xyZW1vdmVBbGxDb250YWluZXJzfHJlbW92ZUFsbEN1cmF0b3JBZGRvbnN8cmVtb3ZlQWxsQ3VyYXRvckNhbWVyYUFyZWFzfHJlbW92ZUFsbEN1cmF0b3JFZGl0aW5nQXJlYXN8cmVtb3ZlQWxsRXZlbnRIYW5kbGVyc3xyZW1vdmVBbGxIYW5kZ3VuSXRlbXN8cmVtb3ZlQWxsSXRlbXN8cmVtb3ZlQWxsSXRlbXNXaXRoTWFnYXppbmVzfHJlbW92ZUFsbE1pc3Npb25FdmVudEhhbmRsZXJzfHJlbW92ZUFsbE1QRXZlbnRIYW5kbGVyc3xyZW1vdmVBbGxNdXNpY0V2ZW50SGFuZGxlcnN8cmVtb3ZlQWxsT3duZWRNaW5lc3xyZW1vdmVBbGxQcmltYXJ5V2VhcG9uSXRlbXN8cmVtb3ZlQWxsV2VhcG9uc3xyZW1vdmVCYWNrcGFja3xyZW1vdmVCYWNrcGFja0dsb2JhbHxyZW1vdmVDdXJhdG9yQWRkb25zfHJlbW92ZUN1cmF0b3JDYW1lcmFBcmVhfHJlbW92ZUN1cmF0b3JFZGl0YWJsZU9iamVjdHN8cmVtb3ZlQ3VyYXRvckVkaXRpbmdBcmVhfHJlbW92ZURyYXdJY29ufHJlbW92ZURyYXdMaW5rc3xyZW1vdmVFdmVudEhhbmRsZXJ8cmVtb3ZlRnJvbVJlbWFpbnNDb2xsZWN0b3J8cmVtb3ZlR29nZ2xlc3xyZW1vdmVHcm91cEljb258cmVtb3ZlSGFuZGd1bkl0ZW18cmVtb3ZlSGVhZGdlYXJ8cmVtb3ZlSXRlbXxyZW1vdmVJdGVtRnJvbUJhY2twYWNrfHJlbW92ZUl0ZW1Gcm9tVW5pZm9ybXxyZW1vdmVJdGVtRnJvbVZlc3R8cmVtb3ZlSXRlbXN8cmVtb3ZlTWFnYXppbmV8cmVtb3ZlTWFnYXppbmVHbG9iYWx8cmVtb3ZlTWFnYXppbmVzfHJlbW92ZU1hZ2F6aW5lc1R1cnJldHxyZW1vdmVNYWdhemluZVR1cnJldHxyZW1vdmVNZW51SXRlbXxyZW1vdmVNaXNzaW9uRXZlbnRIYW5kbGVyfHJlbW92ZU1QRXZlbnRIYW5kbGVyfHJlbW92ZU11c2ljRXZlbnRIYW5kbGVyfHJlbW92ZU93bmVkTWluZXxyZW1vdmVQcmltYXJ5V2VhcG9uSXRlbXxyZW1vdmVTZWNvbmRhcnlXZWFwb25JdGVtfHJlbW92ZVNpbXBsZVRhc2t8cmVtb3ZlU3dpdGNoYWJsZVVuaXR8cmVtb3ZlVGVhbU1lbWJlcnxyZW1vdmVVbmlmb3JtfHJlbW92ZVZlc3R8cmVtb3ZlV2VhcG9ufHJlbW92ZVdlYXBvbkF0dGFjaG1lbnRDYXJnb3xyZW1vdmVXZWFwb25DYXJnb3xyZW1vdmVXZWFwb25HbG9iYWx8cmVtb3ZlV2VhcG9uVHVycmV0fHJlcG9ydFJlbW90ZVRhcmdldHxyZXF1aXJlZFZlcnNpb258cmVzZXRDYW1TaGFrZXxyZXNldFN1Ymdyb3VwRGlyZWN0aW9ufHJlc2lzdGFuY2V8cmVzaXplfHJlc291cmNlc3xyZXNwYXduVmVoaWNsZXxyZXN0YXJ0RWRpdG9yQ2FtZXJhfHJldmVhbHxyZXZlYWxNaW5lfHJldmVyc2V8cmV2ZXJzZWRNb3VzZVl8cm9hZEF0fHJvYWRzQ29ubmVjdGVkVG98cm9sZURlc2NyaXB0aW9ufHJvcGVBdHRhY2hlZE9iamVjdHN8cm9wZUF0dGFjaGVkVG98cm9wZUF0dGFjaEVuYWJsZWR8cm9wZUF0dGFjaFRvfHJvcGVDcmVhdGV8cm9wZUN1dHxyb3BlRGVzdHJveXxyb3BlRGV0YWNofHJvcGVFbmRQb3NpdGlvbnxyb3BlTGVuZ3RofHJvcGVzfHJvcGVVbndpbmR8cm9wZVVud291bmR8cm90b3JzRm9yY2VzUlREfHJvdG9yc1JwbVJURHxyb3VuZHxydW5Jbml0U2NyaXB0fHNhZmVab25lSHxzYWZlWm9uZVd8c2FmZVpvbmVXQWJzfHNhZmVab25lWHxzYWZlWm9uZVhBYnN8c2FmZVpvbmVZfHNhdmUzREVOSW52ZW50b3J5fHNhdmVHYW1lfHNhdmVJZGVudGl0eXxzYXZlSm95c3RpY2tzfHNhdmVPdmVybGF5fHNhdmVQcm9maWxlTmFtZXNwYWNlfHNhdmVTdGF0dXN8c2F2ZVZhcnxzYXZpbmdFbmFibGVkfHNheXxzYXkyRHxzYXkzRHxzY29yZXxzY29yZVNpZGV8c2NyZWVuc2hvdHxzY3JlZW5Ub1dvcmxkfHNjcmlwdERvbmV8c2NyaXB0TmFtZXxzY3JpcHROdWxsfHNjdWRTdGF0ZXxzZWNvbmRhcnlXZWFwb258c2Vjb25kYXJ5V2VhcG9uSXRlbXN8c2Vjb25kYXJ5V2VhcG9uTWFnYXppbmV8c2VsZWN0fHNlbGVjdEJlc3RQbGFjZXN8c2VsZWN0RGlhcnlTdWJqZWN0fHNlbGVjdGVkRWRpdG9yT2JqZWN0c3xzZWxlY3RFZGl0b3JPYmplY3R8c2VsZWN0aW9uTmFtZXN8c2VsZWN0aW9uUG9zaXRpb258c2VsZWN0TGVhZGVyfHNlbGVjdE1heHxzZWxlY3RNaW58c2VsZWN0Tm9QbGF5ZXJ8c2VsZWN0UGxheWVyfHNlbGVjdFJhbmRvbXxzZWxlY3RSYW5kb21XZWlnaHRlZHxzZWxlY3RXZWFwb258c2VsZWN0V2VhcG9uVHVycmV0fHNlbmRBVU1lc3NhZ2V8c2VuZFNpbXBsZUNvbW1hbmR8c2VuZFRhc2t8c2VuZFRhc2tSZXN1bHR8c2VuZFVEUE1lc3NhZ2V8c2VydmVyQ29tbWFuZHxzZXJ2ZXJDb21tYW5kQXZhaWxhYmxlfHNlcnZlckNvbW1hbmRFeGVjdXRhYmxlfHNlcnZlck5hbWV8c2VydmVyVGltZXxzZXR8c2V0M0RFTkF0dHJpYnV0ZXxzZXQzREVOQXR0cmlidXRlc3xzZXQzREVOR3JpZHxzZXQzREVOSWNvbnNWaXNpYmxlfHNldDNERU5MYXllcnxzZXQzREVOTGluZXNWaXNpYmxlfHNldDNERU5Mb2dpY1R5cGV8c2V0M0RFTk1pc3Npb25BdHRyaWJ1dGV8c2V0M0RFTk1pc3Npb25BdHRyaWJ1dGVzfHNldDNERU5Nb2RlbHNWaXNpYmxlfHNldDNERU5PYmplY3RUeXBlfHNldDNERU5TZWxlY3RlZHxzZXRBY2NUaW1lfHNldEFjdHVhbENvbGxlY3RpdmVSVER8c2V0QWlycGxhbmVUaHJvdHRsZXxzZXRBaXJwb3J0U2lkZXxzZXRBbW1vfHNldEFtbW9DYXJnb3xzZXRBbW1vT25QeWxvbnxzZXRBbmltU3BlZWRDb2VmfHNldEFwZXJ0dXJlfHNldEFwZXJ0dXJlTmV3fHNldEFybW9yeVBvaW50c3xzZXRBdHRyaWJ1dGVzfHNldEF1dG9ub21vdXN8c2V0QmVoYXZpb3VyfHNldEJsZWVkaW5nUmVtYWluaW5nfHNldEJyYWtlc1JURHxzZXRDYW1lcmFJbnRlcmVzdHxzZXRDYW1TaGFrZURlZlBhcmFtc3xzZXRDYW1TaGFrZVBhcmFtc3xzZXRDYW1Vc2VUSXxzZXRDYXB0aXZlfHNldENlbnRlck9mTWFzc3xzZXRDb2xsaXNpb25MaWdodHxzZXRDb21iYXRNb2RlfHNldENvbXBhc3NPc2NpbGxhdGlvbnxzZXRDb252b3lTZXBhcmF0aW9ufHNldEN1cmF0b3JDYW1lcmFBcmVhQ2VpbGluZ3xzZXRDdXJhdG9yQ29lZnxzZXRDdXJhdG9yRWRpdGluZ0FyZWFUeXBlfHNldEN1cmF0b3JXYXlwb2ludENvc3R8c2V0Q3VycmVudENoYW5uZWx8c2V0Q3VycmVudFRhc2t8c2V0Q3VycmVudFdheXBvaW50fHNldEN1c3RvbUFpbUNvZWZ8c2V0Q3VzdG9tV2VpZ2h0UlREfHNldERhbWFnZXxzZXREYW1tYWdlfHNldERhdGV8c2V0RGVicmllZmluZ1RleHR8c2V0RGVmYXVsdENhbWVyYXxzZXREZXN0aW5hdGlvbnxzZXREZXRhaWxNYXBCbGVuZFBhcnN8c2V0RGlyfHNldERpcmVjdGlvbnxzZXREcmF3SWNvbnxzZXREcml2ZU9uUGF0aHxzZXREcm9wSW50ZXJ2YWx8c2V0RHluYW1pY1NpbXVsYXRpb25EaXN0YW5jZXxzZXREeW5hbWljU2ltdWxhdGlvbkRpc3RhbmNlQ29lZnxzZXRFZGl0b3JNb2RlfHNldEVkaXRvck9iamVjdFNjb3BlfHNldEVmZmVjdENvbmRpdGlvbnxzZXRFbmdpbmVScG1SVER8c2V0RmFjZXxzZXRGYWNlQW5pbWF0aW9ufHNldEZhdGlndWV8c2V0RmVhdHVyZVR5cGV8c2V0RmxhZ0FuaW1hdGlvblBoYXNlfHNldEZsYWdPd25lcnxzZXRGbGFnU2lkZXxzZXRGbGFnVGV4dHVyZXxzZXRGb2d8c2V0Rm9yY2VHZW5lcmF0b3JSVER8c2V0Rm9ybWF0aW9ufHNldEZvcm1hdGlvblRhc2t8c2V0Rm9ybURpcnxzZXRGcmllbmR8c2V0RnJvbUVkaXRvcnxzZXRGU01WYXJpYWJsZXxzZXRGdWVsfHNldEZ1ZWxDYXJnb3xzZXRHcm91cEljb258c2V0R3JvdXBJY29uUGFyYW1zfHNldEdyb3VwSWNvbnNTZWxlY3RhYmxlfHNldEdyb3VwSWNvbnNWaXNpYmxlfHNldEdyb3VwSWR8c2V0R3JvdXBJZEdsb2JhbHxzZXRHcm91cE93bmVyfHNldEd1c3RzfHNldEhpZGVCZWhpbmR8c2V0SGl0fHNldEhpdEluZGV4fHNldEhpdFBvaW50RGFtYWdlfHNldEhvcml6b25QYXJhbGxheENvZWZ8c2V0SFVETW92ZW1lbnRMZXZlbHN8c2V0SWRlbnRpdHl8c2V0SW1wb3J0YW5jZXxzZXRJbmZvUGFuZWx8c2V0TGVhZGVyfHNldExpZ2h0QW1iaWVudHxzZXRMaWdodEF0dGVudWF0aW9ufHNldExpZ2h0QnJpZ2h0bmVzc3xzZXRMaWdodENvbG9yfHNldExpZ2h0RGF5TGlnaHR8c2V0TGlnaHRGbGFyZU1heERpc3RhbmNlfHNldExpZ2h0RmxhcmVTaXplfHNldExpZ2h0SW50ZW5zaXR5fHNldExpZ2h0bmluZ3N8c2V0TGlnaHRVc2VGbGFyZXxzZXRMb2NhbFdpbmRQYXJhbXN8c2V0TWFnYXppbmVUdXJyZXRBbW1vfHNldE1hcmtlckFscGhhfHNldE1hcmtlckFscGhhTG9jYWx8c2V0TWFya2VyQnJ1c2h8c2V0TWFya2VyQnJ1c2hMb2NhbHxzZXRNYXJrZXJDb2xvcnxzZXRNYXJrZXJDb2xvckxvY2FsfHNldE1hcmtlckRpcnxzZXRNYXJrZXJEaXJMb2NhbHxzZXRNYXJrZXJQb3N8c2V0TWFya2VyUG9zTG9jYWx8c2V0TWFya2VyU2hhcGV8c2V0TWFya2VyU2hhcGVMb2NhbHxzZXRNYXJrZXJTaXplfHNldE1hcmtlclNpemVMb2NhbHxzZXRNYXJrZXJUZXh0fHNldE1hcmtlclRleHRMb2NhbHxzZXRNYXJrZXJUeXBlfHNldE1hcmtlclR5cGVMb2NhbHxzZXRNYXNzfHNldE1pbWljfHNldE1vdXNlUG9zaXRpb258c2V0TXVzaWNFZmZlY3R8c2V0TXVzaWNFdmVudEhhbmRsZXJ8c2V0TmFtZXxzZXROYW1lU291bmR8c2V0T2JqZWN0QXJndW1lbnRzfHNldE9iamVjdE1hdGVyaWFsfHNldE9iamVjdE1hdGVyaWFsR2xvYmFsfHNldE9iamVjdFByb3h5fHNldE9iamVjdFRleHR1cmV8c2V0T2JqZWN0VGV4dHVyZUdsb2JhbHxzZXRPYmplY3RWaWV3RGlzdGFuY2V8c2V0T3ZlcmNhc3R8c2V0T3duZXJ8c2V0T3h5Z2VuUmVtYWluaW5nfHNldFBhcnRpY2xlQ2lyY2xlfHNldFBhcnRpY2xlQ2xhc3N8c2V0UGFydGljbGVGaXJlfHNldFBhcnRpY2xlUGFyYW1zfHNldFBhcnRpY2xlUmFuZG9tfHNldFBpbG90Q2FtZXJhRGlyZWN0aW9ufHNldFBpbG90Q2FtZXJhUm90YXRpb258c2V0UGlsb3RDYW1lcmFUYXJnZXR8c2V0UGlsb3RMaWdodHxzZXRQaVBFZmZlY3R8c2V0UGl0Y2h8c2V0UGxhdGVOdW1iZXJ8c2V0UGxheWFibGV8c2V0UGxheWVyUmVzcGF3blRpbWV8c2V0UG9zfHNldFBvc0FTTHxzZXRQb3NBU0wyfHNldFBvc0FTTFd8c2V0UG9zQVRMfHNldFBvc2l0aW9ufHNldFBvc1dvcmxkfHNldFB5bG9uTG9hZE91dHxzZXRQeWxvbnNQcmlvcml0eXxzZXRSYWRpb01zZ3xzZXRSYWlufHNldFJhaW5ib3d8c2V0UmFuZG9tTGlwfHNldFJhbmt8c2V0UmVjdGFuZ3VsYXJ8c2V0UmVwYWlyQ2FyZ298c2V0Um90b3JCcmFrZVJURHxzZXRTaGFkb3dEaXN0YW5jZXxzZXRTaG90UGFyZW50c3xzZXRTaWRlfHNldFNpbXBsZVRhc2tBbHdheXNWaXNpYmxlfHNldFNpbXBsZVRhc2tDdXN0b21EYXRhfHNldFNpbXBsZVRhc2tEZXNjcmlwdGlvbnxzZXRTaW1wbGVUYXNrRGVzdGluYXRpb258c2V0U2ltcGxlVGFza1RhcmdldHxzZXRTaW1wbGVUYXNrVHlwZXxzZXRTaW11bFdlYXRoZXJMYXllcnN8c2V0U2l6ZXxzZXRTa2lsbHxzZXRTbGluZ0xvYWR8c2V0U291bmRFZmZlY3R8c2V0U3BlYWtlcnxzZXRTcGVlY2h8c2V0U3BlZWRNb2RlfHNldFN0YW1pbmF8c2V0U3RhbWluYVNjaGVtZXxzZXRTdGF0VmFsdWV8c2V0U3VwcHJlc3Npb258c2V0U3lzdGVtT2ZVbml0c3xzZXRUYXJnZXRBZ2V8c2V0VGFza01hcmtlck9mZnNldHxzZXRUYXNrUmVzdWx0fHNldFRhc2tTdGF0ZXxzZXRUZXJyYWluR3JpZHxzZXRUZXh0fHNldFRpbWVNdWx0aXBsaWVyfHNldFRpdGxlRWZmZWN0fHNldFRvbmVNYXBwaW5nfHNldFRvbmVNYXBwaW5nUGFyYW1zfHNldFRyYWZmaWNEZW5zaXR5fHNldFRyYWZmaWNEaXN0YW5jZXxzZXRUcmFmZmljR2FwfHNldFRyYWZmaWNTcGVlZHxzZXRUcmlnZ2VyQWN0aXZhdGlvbnxzZXRUcmlnZ2VyQXJlYXxzZXRUcmlnZ2VyU3RhdGVtZW50c3xzZXRUcmlnZ2VyVGV4dHxzZXRUcmlnZ2VyVGltZW91dHxzZXRUcmlnZ2VyVHlwZXxzZXRUeXBlfHNldFVuY29uc2Npb3VzfHNldFVuaXRBYmlsaXR5fHNldFVuaXRMb2Fkb3V0fHNldFVuaXRQb3N8c2V0VW5pdFBvc1dlYWt8c2V0VW5pdFJhbmt8c2V0VW5pdFJlY29pbENvZWZmaWNpZW50fHNldFVuaXRUcmFpdHxzZXRVbmxvYWRJbkNvbWJhdHxzZXRVc2VyQWN0aW9uVGV4dHxzZXRVc2VyTUZEVGV4dHxzZXRVc2VyTUZEVmFsdWV8c2V0VmFyaWFibGV8c2V0VmVjdG9yRGlyfHNldFZlY3RvckRpckFuZFVwfHNldFZlY3RvclVwfHNldFZlaGljbGVBbW1vfHNldFZlaGljbGVBbW1vRGVmfHNldFZlaGljbGVBcm1vcnxzZXRWZWhpY2xlQ2FyZ298c2V0VmVoaWNsZUlkfHNldFZlaGljbGVJbml0fHNldFZlaGljbGVMb2NrfHNldFZlaGljbGVQb3NpdGlvbnxzZXRWZWhpY2xlUmFkYXJ8c2V0VmVoaWNsZVJlY2VpdmVSZW1vdGVUYXJnZXRzfHNldFZlaGljbGVSZXBvcnRPd25Qb3NpdGlvbnxzZXRWZWhpY2xlUmVwb3J0UmVtb3RlVGFyZ2V0c3xzZXRWZWhpY2xlVElQYXJzfHNldFZlaGljbGVWYXJOYW1lfHNldFZlbG9jaXR5fHNldFZlbG9jaXR5TW9kZWxTcGFjZXxzZXRWZWxvY2l0eVRyYW5zZm9ybWF0aW9ufHNldFZpZXdEaXN0YW5jZXxzZXRWaXNpYmxlSWZUcmVlQ29sbGFwc2VkfHNldFdhbnRlZFJwbVJURHxzZXRXYXZlc3xzZXRXYXlwb2ludEJlaGF2aW91cnxzZXRXYXlwb2ludENvbWJhdE1vZGV8c2V0V2F5cG9pbnRDb21wbGV0aW9uUmFkaXVzfHNldFdheXBvaW50RGVzY3JpcHRpb258c2V0V2F5cG9pbnRGb3JjZUJlaGF2aW91cnxzZXRXYXlwb2ludEZvcm1hdGlvbnxzZXRXYXlwb2ludEhvdXNlUG9zaXRpb258c2V0V2F5cG9pbnRMb2l0ZXJSYWRpdXN8c2V0V2F5cG9pbnRMb2l0ZXJUeXBlfHNldFdheXBvaW50TmFtZXxzZXRXYXlwb2ludFBvc2l0aW9ufHNldFdheXBvaW50U2NyaXB0fHNldFdheXBvaW50U3BlZWR8c2V0V2F5cG9pbnRTdGF0ZW1lbnRzfHNldFdheXBvaW50VGltZW91dHxzZXRXYXlwb2ludFR5cGV8c2V0V2F5cG9pbnRWaXNpYmxlfHNldFdlYXBvblJlbG9hZGluZ1RpbWV8c2V0V2luZHxzZXRXaW5kRGlyfHNldFdpbmRGb3JjZXxzZXRXaW5kU3RyfHNldFdpbmdGb3JjZVNjYWxlUlREfHNldFdQUG9zfHNob3czREljb25zfHNob3dDaGF0fHNob3dDaW5lbWFCb3JkZXJ8c2hvd0NvbW1hbmRpbmdNZW51fHNob3dDb21wYXNzfHNob3dDdXJhdG9yQ29tcGFzc3xzaG93R1BTfHNob3dIVUR8c2hvd0xlZ2VuZHxzaG93TWFwfHNob3duQXJ0aWxsZXJ5Q29tcHV0ZXJ8c2hvd25DaGF0fHNob3duQ29tcGFzc3xzaG93bkN1cmF0b3JDb21wYXNzfHNob3dOZXdFZGl0b3JPYmplY3R8c2hvd25HUFN8c2hvd25IVUR8c2hvd25NYXB8c2hvd25QYWR8c2hvd25SYWRpb3xzaG93blNjb3JldGFibGV8c2hvd25VQVZGZWVkfHNob3duV2FycmFudHxzaG93bldhdGNofHNob3dQYWR8c2hvd1JhZGlvfHNob3dTY29yZXRhYmxlfHNob3dTdWJ0aXRsZXN8c2hvd1VBVkZlZWR8c2hvd1dhcnJhbnR8c2hvd1dhdGNofHNob3dXYXlwb2ludHxzaG93V2F5cG9pbnRzfHNpZGV8c2lkZUFtYmllbnRMaWZlfHNpZGVDaGF0fHNpZGVFbXB0eXxzaWRlRW5lbXl8c2lkZUZyaWVuZGx5fHNpZGVMb2dpY3xzaWRlUmFkaW98c2lkZVVua25vd258c2ltcGxlVGFza3N8c2ltdWxhdGlvbkVuYWJsZWR8c2ltdWxDbG91ZERlbnNpdHl8c2ltdWxDbG91ZE9jY2x1c2lvbnxzaW11bEluQ2xvdWRzfHNpbXVsV2VhdGhlclN5bmN8c2lufHNpemV8c2l6ZU9mfHNraWxsfHNraWxsRmluYWx8c2tpcFRpbWV8c2xlZXB8c2xpZGVyUG9zaXRpb258c2xpZGVyUmFuZ2V8c2xpZGVyU2V0UG9zaXRpb258c2xpZGVyU2V0UmFuZ2V8c2xpZGVyU2V0U3BlZWR8c2xpZGVyU3BlZWR8c2xpbmdMb2FkQXNzaXN0YW50U2hvd258c29sZGllck1hZ2F6aW5lc3xzb21lQW1tb3xzb3J0fHNvdW5kVm9sdW1lfHNwZWFrZXJ8c3BlZWR8c3BlZWRNb2RlfHNwbGl0U3RyaW5nfHNxcnR8c3F1YWRQYXJhbXN8c3RhbmNlfHN0YXJ0TG9hZGluZ1NjcmVlbnxzdG9wfHN0b3BFbmdpbmVSVER8c3RvcHBlZHxzdHJ8c3VuT3JNb29ufHN1cHBvcnRJbmZvfHN1cHByZXNzRm9yfHN1cmZhY2VJc1dhdGVyfHN1cmZhY2VOb3JtYWx8c3VyZmFjZVR5cGV8c3dpbUluRGVwdGh8c3dpdGNoYWJsZVVuaXRzfHN3aXRjaEFjdGlvbnxzd2l0Y2hDYW1lcmF8c3dpdGNoR2VzdHVyZXxzd2l0Y2hMaWdodHxzd2l0Y2hNb3ZlfHN5bmNocm9uaXplZE9iamVjdHN8c3luY2hyb25pemVkVHJpZ2dlcnN8c3luY2hyb25pemVkV2F5cG9pbnRzfHN5bmNocm9uaXplT2JqZWN0c0FkZHxzeW5jaHJvbml6ZU9iamVjdHNSZW1vdmV8c3luY2hyb25pemVUcmlnZ2VyfHN5bmNocm9uaXplV2F5cG9pbnR8c3lzdGVtQ2hhdHxzeXN0ZW1PZlVuaXRzfHRhbnx0YXJnZXRLbm93bGVkZ2V8dGFyZ2V0c3x0YXJnZXRzQWdncmVnYXRlfHRhcmdldHNRdWVyeXx0YXNrQWx3YXlzVmlzaWJsZXx0YXNrQ2hpbGRyZW58dGFza0NvbXBsZXRlZHx0YXNrQ3VzdG9tRGF0YXx0YXNrRGVzY3JpcHRpb258dGFza0Rlc3RpbmF0aW9ufHRhc2tIaW50fHRhc2tNYXJrZXJPZmZzZXR8dGFza051bGx8dGFza1BhcmVudHx0YXNrUmVzdWx0fHRhc2tTdGF0ZXx0YXNrVHlwZXx0ZWFtTWVtYmVyfHRlYW1NZW1iZXJOdWxsfHRlYW1OYW1lfHRlYW1zfHRlYW1Td2l0Y2h8dGVhbVN3aXRjaEVuYWJsZWR8dGVhbVR5cGV8dGVybWluYXRlfHRlcnJhaW5JbnRlcnNlY3R8dGVycmFpbkludGVyc2VjdEFTTHx0ZXJyYWluSW50ZXJzZWN0QXRBU0x8dGV4dHx0ZXh0TG9nfHRleHRMb2dGb3JtYXR8dGd8dGltZXx0aW1lTXVsdGlwbGllcnx0aXRsZUN1dHx0aXRsZUZhZGVPdXR8dGl0bGVPYmp8dGl0bGVSc2N8dGl0bGVUZXh0fHRvQXJyYXl8dG9GaXhlZHx0b0xvd2VyfHRvU3RyaW5nfHRvVXBwZXJ8dHJpZ2dlckFjdGl2YXRlZHx0cmlnZ2VyQWN0aXZhdGlvbnx0cmlnZ2VyQXJlYXx0cmlnZ2VyQXR0YWNoZWRWZWhpY2xlfHRyaWdnZXJBdHRhY2hPYmplY3R8dHJpZ2dlckF0dGFjaFZlaGljbGV8dHJpZ2dlckR5bmFtaWNTaW11bGF0aW9ufHRyaWdnZXJTdGF0ZW1lbnRzfHRyaWdnZXJUZXh0fHRyaWdnZXJUaW1lb3V0fHRyaWdnZXJUaW1lb3V0Q3VycmVudHx0cmlnZ2VyVHlwZXx0dXJyZXRMb2NhbHx0dXJyZXRPd25lcnx0dXJyZXRVbml0fHR2QWRkfHR2Q2xlYXJ8dHZDb2xsYXBzZXx0dkNvbGxhcHNlQWxsfHR2Q291bnR8dHZDdXJTZWx8dHZEYXRhfHR2RGVsZXRlfHR2RXhwYW5kfHR2RXhwYW5kQWxsfHR2UGljdHVyZXx0dlBpY3R1cmVSaWdodHx0dlNldENvbG9yfHR2U2V0Q3VyU2VsfHR2U2V0RGF0YXx0dlNldFBpY3R1cmV8dHZTZXRQaWN0dXJlQ29sb3J8dHZTZXRQaWN0dXJlQ29sb3JEaXNhYmxlZHx0dlNldFBpY3R1cmVDb2xvclNlbGVjdGVkfHR2U2V0UGljdHVyZVJpZ2h0fHR2U2V0UGljdHVyZVJpZ2h0Q29sb3J8dHZTZXRQaWN0dXJlUmlnaHRDb2xvckRpc2FibGVkfHR2U2V0UGljdHVyZVJpZ2h0Q29sb3JTZWxlY3RlZHx0dlNldFNlbGVjdENvbG9yfHR2U2V0VGV4dHx0dlNldFRvb2x0aXB8dHZTZXRWYWx1ZXx0dlNvcnR8dHZTb3J0QnlWYWx1ZXx0dlRleHR8dHZUb29sdGlwfHR2VmFsdWV8dHlwZXx0eXBlTmFtZXx0eXBlT2Z8VUFWQ29udHJvbHx1aU5hbWVzcGFjZXx1aVNsZWVwfHVuYXNzaWduQ3VyYXRvcnx1bmFzc2lnbkl0ZW18dW5hc3NpZ25UZWFtfHVuYXNzaWduVmVoaWNsZXx1bmRlcndhdGVyfHVuaWZvcm18dW5pZm9ybUNvbnRhaW5lcnx1bmlmb3JtSXRlbXN8dW5pZm9ybU1hZ2F6aW5lc3x1bml0QWRkb25zfHVuaXRBaW1Qb3NpdGlvbnx1bml0QWltUG9zaXRpb25WaXN1YWx8dW5pdEJhY2twYWNrfHVuaXRJc1VBVnx1bml0UG9zfHVuaXRSZWFkeXx1bml0UmVjb2lsQ29lZmZpY2llbnR8dW5pdHN8dW5pdHNCZWxvd0hlaWdodHx1bmxpbmtJdGVtfHVubG9ja0FjaGlldmVtZW50fHVucmVnaXN0ZXJUYXNrfHVwZGF0ZURyYXdJY29ufHVwZGF0ZU1lbnVJdGVtfHVwZGF0ZU9iamVjdFRyZWV8dXNlQUlPcGVyTWFwT2JzdHJ1Y3Rpb25UZXN0fHVzZUFJU3RlZXJpbmdDb21wb25lbnR8dXNlQXVkaW9UaW1lRm9yTW92ZXN8dXNlcklucHV0RGlzYWJsZWR8dmVjdG9yQWRkfHZlY3RvckNvc3x2ZWN0b3JDcm9zc1Byb2R1Y3R8dmVjdG9yRGlmZnx2ZWN0b3JEaXJ8dmVjdG9yRGlyVmlzdWFsfHZlY3RvckRpc3RhbmNlfHZlY3RvckRpc3RhbmNlU3FyfHZlY3RvckRvdFByb2R1Y3R8dmVjdG9yRnJvbVRvfHZlY3Rvck1hZ25pdHVkZXx2ZWN0b3JNYWduaXR1ZGVTcXJ8dmVjdG9yTW9kZWxUb1dvcmxkfHZlY3Rvck1vZGVsVG9Xb3JsZFZpc3VhbHx2ZWN0b3JNdWx0aXBseXx2ZWN0b3JOb3JtYWxpemVkfHZlY3RvclVwfHZlY3RvclVwVmlzdWFsfHZlY3RvcldvcmxkVG9Nb2RlbHx2ZWN0b3JXb3JsZFRvTW9kZWxWaXN1YWx8dmVoaWNsZXx2ZWhpY2xlQ2FyZ29FbmFibGVkfHZlaGljbGVDaGF0fHZlaGljbGVSYWRpb3x2ZWhpY2xlUmVjZWl2ZVJlbW90ZVRhcmdldHN8dmVoaWNsZVJlcG9ydE93blBvc2l0aW9ufHZlaGljbGVSZXBvcnRSZW1vdGVUYXJnZXRzfHZlaGljbGVzfHZlaGljbGVWYXJOYW1lfHZlbG9jaXR5fHZlbG9jaXR5TW9kZWxTcGFjZXx2ZXJpZnlTaWduYXR1cmV8dmVzdHx2ZXN0Q29udGFpbmVyfHZlc3RJdGVtc3x2ZXN0TWFnYXppbmVzfHZpZXdEaXN0YW5jZXx2aXNpYmxlQ29tcGFzc3x2aXNpYmxlR1BTfHZpc2libGVNYXB8dmlzaWJsZVBvc2l0aW9ufHZpc2libGVQb3NpdGlvbkFTTHx2aXNpYmxlU2NvcmV0YWJsZXx2aXNpYmxlV2F0Y2h8d2FpdFVudGlsfHdhdmVzfHdheXBvaW50QXR0YWNoZWRPYmplY3R8d2F5cG9pbnRBdHRhY2hlZFZlaGljbGV8d2F5cG9pbnRBdHRhY2hPYmplY3R8d2F5cG9pbnRBdHRhY2hWZWhpY2xlfHdheXBvaW50QmVoYXZpb3VyfHdheXBvaW50Q29tYmF0TW9kZXx3YXlwb2ludENvbXBsZXRpb25SYWRpdXN8d2F5cG9pbnREZXNjcmlwdGlvbnx3YXlwb2ludEZvcmNlQmVoYXZpb3VyfHdheXBvaW50Rm9ybWF0aW9ufHdheXBvaW50SG91c2VQb3NpdGlvbnx3YXlwb2ludExvaXRlclJhZGl1c3x3YXlwb2ludExvaXRlclR5cGV8d2F5cG9pbnROYW1lfHdheXBvaW50UG9zaXRpb258d2F5cG9pbnRzfHdheXBvaW50U2NyaXB0fHdheXBvaW50c0VuYWJsZWRVQVZ8d2F5cG9pbnRTaG93fHdheXBvaW50U3BlZWR8d2F5cG9pbnRTdGF0ZW1lbnRzfHdheXBvaW50VGltZW91dHx3YXlwb2ludFRpbWVvdXRDdXJyZW50fHdheXBvaW50VHlwZXx3YXlwb2ludFZpc2libGV8d2VhcG9uQWNjZXNzb3JpZXN8d2VhcG9uQWNjZXNzb3JpZXNDYXJnb3x3ZWFwb25DYXJnb3x3ZWFwb25EaXJlY3Rpb258d2VhcG9uSW5lcnRpYXx3ZWFwb25Mb3dlcmVkfHdlYXBvbnN8d2VhcG9uc0l0ZW1zfHdlYXBvbnNJdGVtc0NhcmdvfHdlYXBvblN0YXRlfHdlYXBvbnNUdXJyZXR8d2VpZ2h0UlREfHdlc3R8V0ZTaWRlVGV4dHx3aW5kfHdpbmREaXJ8d2luZFJURHx3aW5kU3RyfHdpbmdzRm9yY2VzUlREfHdvcmxkTmFtZXx3b3JsZFNpemV8d29ybGRUb01vZGVsfHdvcmxkVG9Nb2RlbFZpc3VhbHx3b3JsZFRvU2NyZWVuKVxcYi9pLFxuXHQnbnVtYmVyJzogLyg/OlxcJHxcXGIweClbXFxkYS1mXStcXGJ8KD86XFxCXFwuXFxkK3xcXGJcXGQrKD86XFwuXFxkKyk/KSg/OmVbKy1dP1xcZCspP1xcYi9pLFxuXHQnb3BlcmF0b3InOiAvIyN8Pj58JiZ8XFx8XFx8fFshPTw+XT0/fFstKyovJSNeXXxcXGIoPzphbmR8bW9kfG5vdHxvcilcXGIvaSxcblx0J21hZ2ljLXZhcmlhYmxlJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzp0aGlzfHRoaXNMaXN0fHRoaXNUcmlnZ2VyfF9leGNlcHRpb258X2ZuY19zY3JpcHROYW1lfF9mbmNfc2NyaXB0TmFtZVBhcmVudHxfZm9yRWFjaEluZGV4fF90aGlzfF90aGlzRXZlbnRIYW5kbGVyfF90aGlzRlNNfF90aGlzU2NyaXB0fF94KVxcYi9pLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J2NvbnN0YW50JzogL1xcYkRJSyg/Ol9bYS16XFxkXSspK1xcYi9pXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnc3FmJywgJ3N0cmluZycsIHtcblx0J21hY3JvJzoge1xuXHRcdHBhdHRlcm46IC8oXlsgXFx0XSopI1thLXpdKD86W15cXHJcXG5cXFxcXXxcXFxcKD86XFxyXFxufFtcXHNcXFNdKSkqL2ltLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAncHJvcGVydHknLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2RpcmVjdGl2ZSc6IHtcblx0XHRcdFx0cGF0dGVybjogLyNbYS16XStcXGIvaSxcblx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdFx0fSxcblx0XHRcdCdjb21tZW50JzogUHJpc20ubGFuZ3VhZ2VzLnNxZi5jb21tZW50XG5cdFx0fVxuXHR9XG59KTtcblxuZGVsZXRlIFByaXNtLmxhbmd1YWdlcy5zcWZbJ2NsYXNzLW5hbWUnXTtcblxuUHJpc20ubGFuZ3VhZ2VzLnNxdWlycmVsID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdCdjb21tZW50JzogW1xuXHRcdFByaXNtLmxhbmd1YWdlcy5jbGlrZVsnY29tbWVudCddWzBdLFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFw6XSkoPzpcXC9cXC98IykuKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxcIidAXSkoPzpAXCIoPzpbXlwiXXxcIlwiKSpcIig/IVwiKXxcIig/OlteXFxcXFxcclxcblwiXXxcXFxcLikqXCIpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCdjbGFzcy1uYW1lJzoge1xuXHRcdHBhdHRlcm46IC8oXFxiKD86Y2xhc3N8ZW51bXxleHRlbmRzfGluc3RhbmNlb2YpXFxzKylcXHcrKD86XFwuXFx3KykqLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHR9XG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/Ol9fRklMRV9ffF9fTElORV9ffGJhc2V8YnJlYWt8Y2FzZXxjYXRjaHxjbGFzc3xjbG9uZXxjb25zdHxjb25zdHJ1Y3Rvcnxjb250aW51ZXxkZWZhdWx0fGRlbGV0ZXxlbHNlfGVudW18ZXh0ZW5kc3xmb3J8Zm9yZWFjaHxmdW5jdGlvbnxpZnxpbnxpbnN0YW5jZW9mfGxvY2FsfG51bGx8cmVzdW1lfHJldHVybnxzdGF0aWN8c3dpdGNofHRoaXN8dGhyb3d8dHJ5fHR5cGVvZnx3aGlsZXx5aWVsZClcXGIvLFxuXG5cdCdudW1iZXInOiAvXFxiKD86MHhbMC05YS1mQS1GXSt8XFxkKyg/OlxcLig/OlxcZCt8W2VFXVsrLV0/XFxkKykpPylcXGIvLFxuXHQnb3BlcmF0b3InOiAvXFwrXFwrfC0tfDw9Pnw8Wy08XXw+Pj4/fCYmP3xcXHxcXHw/fFstKyovJSE9PD5dPT98W35eXXw6Oj8vLFxuXHQncHVuY3R1YXRpb24nOiAvWygpe31cXFtcXF0sOy5dL1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3NxdWlycmVsJywgJ3N0cmluZycsIHtcblx0J2NoYXInOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXFwiJ10pJyg/OlteXFxcXCddfFxcXFwoPzpbeHVVXVswLTlhLWZBLUZdezAsOH18W1xcc1xcU10pKScvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdzcXVpcnJlbCcsICdvcGVyYXRvcicsIHtcblx0J2F0dHJpYnV0ZS1wdW5jdHVhdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvPFxcL3xcXC8+Lyxcblx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0fSxcblx0J2xhbWJkYSc6IHtcblx0XHRwYXR0ZXJuOiAvQCg/PVxcKCkvLFxuXHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdH1cbn0pO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0Ly8gaHR0cHM6Ly9tYy1zdGFuLm9yZy9kb2NzLzJfMjgvcmVmZXJlbmNlLW1hbnVhbC9ibmYtZ3JhbW1hcnMuaHRtbFxuXG5cdHZhciBoaWdoZXJPcmRlckZ1bmN0aW9ucyA9IC9cXGIoPzphbGdlYnJhX3NvbHZlcnxhbGdlYnJhX3NvbHZlcl9uZXd0b258aW50ZWdyYXRlXzFkfGludGVncmF0ZV9vZGV8aW50ZWdyYXRlX29kZV9iZGZ8aW50ZWdyYXRlX29kZV9yazQ1fG1hcF9yZWN0fG9kZV8oPzphZGFtc3xiZGZ8Y2tya3xyazQ1KSg/Ol90b2wpP3xvZGVfYWRqb2ludF90b2xfY3RsfHJlZHVjZV9zdW18cmVkdWNlX3N1bV9zdGF0aWMpXFxiLztcblxuXHRQcmlzbS5sYW5ndWFnZXMuc3RhbiA9IHtcblx0XHQnY29tbWVudCc6IC9cXC9cXC8uKnxcXC9cXCpbXFxzXFxTXSo/XFwqXFwvfCMoPyFpbmNsdWRlKS4qLyxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0Ly8gU3RyaW5nIGxpdGVyYWxzIGNhbiBjb250YWluIHNwYWNlcyBhbmQgYW55IHByaW50YWJsZSBBU0NJSSBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IgXCIgYW5kIFxcXG5cdFx0XHQvLyBodHRwczovL21jLXN0YW4ub3JnL2RvY3MvMl8yNC9yZWZlcmVuY2UtbWFudWFsL3ByaW50LXN0YXRlbWVudHMtc2VjdGlvbi5odG1sI3N0cmluZy1saXRlcmFsc1xuXHRcdFx0cGF0dGVybjogL1wiW1xceDIwXFx4MjFcXHgyMy1cXHg1QlxceDVELVxceDdFXSpcIi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdkaXJlY3RpdmUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXihbIFxcdF0qKSNpbmNsdWRlXFxiLiovbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHRcdH0sXG5cblx0XHQnZnVuY3Rpb24tYXJnJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0XHQnKCcgK1xuXHRcdFx0XHRoaWdoZXJPcmRlckZ1bmN0aW9ucy5zb3VyY2UgK1xuXHRcdFx0XHQvXFxzKlxcKFxccyovLnNvdXJjZSArXG5cdFx0XHRcdCcpJyArXG5cdFx0XHRcdC9bYS16QS1aXVxcdyovLnNvdXJjZVxuXHRcdFx0KSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH0sXG5cdFx0J2NvbnN0cmFpbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYig/OmludHxtYXRyaXh8cmVhbHxyb3dfdmVjdG9yfHZlY3RvcilcXHMqKTxbXjw+XSo+Lyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyg9XFxzKilcXFMoPzpcXFN8XFxzKyg/IVxccykpKj8oPz1cXHMqKD86PiR8LFxccypcXHcrXFxzKj0pKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwcm9wZXJ0eSc6IC9cXGJbYS16XVxcdyooPz1cXHMqPSkvaSxcblx0XHRcdFx0J29wZXJhdG9yJzogLz0vLFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXjx8PiR8LC9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdrZXl3b3JkJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxiZGF0YSg/PVxccypcXHspfFxcYig/OmZ1bmN0aW9uc3xnZW5lcmF0ZWR8bW9kZWx8cGFyYW1ldGVyc3xxdWFudGl0aWVzfHRyYW5zZm9ybWVkKVxcYi8sXG5cdFx0XHRcdGFsaWFzOiAncHJvZ3JhbS1ibG9jaydcblx0XHRcdH0sXG5cdFx0XHQvXFxiKD86YXJyYXl8YnJlYWt8Y2hvbGVza3lfZmFjdG9yX2NvcnJ8Y2hvbGVza3lfZmFjdG9yX2Nvdnxjb21wbGV4fGNvbnRpbnVlfGNvcnJfbWF0cml4fGNvdl9tYXRyaXh8ZGF0YXxlbHNlfGZvcnxpZnxpbnxpbmNyZW1lbnRfbG9nX3Byb2J8aW50fG1hdHJpeHxvcmRlcmVkfHBvc2l0aXZlX29yZGVyZWR8cHJpbnR8cmVhbHxyZWplY3R8cmV0dXJufHJvd192ZWN0b3J8c2ltcGxleHx0YXJnZXR8dW5pdF92ZWN0b3J8dmVjdG9yfHZvaWR8d2hpbGUpXFxiLyxcblx0XHRcdC8vIHRoZXNlIGFyZSBmdW5jdGlvbnMgdGhhdCBhcmUga25vd24gdG8gdGFrZSBhbm90aGVyIGZ1bmN0aW9uIGFzIHRoZWlyIGZpcnN0IGFyZ3VtZW50LlxuXHRcdFx0aGlnaGVyT3JkZXJGdW5jdGlvbnNcblx0XHRdLFxuXHRcdCdmdW5jdGlvbic6IC9cXGJbYS16XVxcdyooPz1cXHMqXFwoKS9pLFxuXHRcdCdudW1iZXInOiAvKD86XFxiXFxkKyg/Ol9cXGQrKSooPzpcXC4oPzpcXGQrKD86X1xcZCspKik/KT98XFxCXFwuXFxkKyg/Ol9cXGQrKSopKD86RVsrLV0/XFxkKyg/Ol9cXGQrKSopP2k/KD8hXFx3KS9pLFxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblxuXHRcdCdvcGVyYXRvcic6IC88LXxcXC5bKi9dPT98XFx8XFx8P3wmJnxbIT08PitcXC0qL109P3xbJ14lfj86XS8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1soKVxcW1xcXXt9LDtdL1xuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5zdGFuLmNvbnN0cmFpbnQuaW5zaWRlLmV4cHJlc3Npb24uaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLnN0YW47XG5cbn0oUHJpc20pKTtcblxuLy8gaHR0cHM6Ly93d3cuc3RhdGEuY29tL21hbnVhbHMvdS5wZGZcbi8vIGh0dHBzOi8vd3d3LnN0YXRhLmNvbS9tYW51YWxzL3AucGRmXG5cblByaXNtLmxhbmd1YWdlcy5zdGF0YSA9IHtcblx0J2NvbW1lbnQnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKilcXCouKi9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFxccylcXC9cXC8uKnxcXC9cXCpbXFxzXFxTXSo/XFwqXFwvLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdzdHJpbmctbGl0ZXJhbCc6IHtcblx0XHRwYXR0ZXJuOiAvXCJbXlwiXFxyXFxuXSpcInxbXHUyMDE4YCddXCIuKj9cIltcdTIwMTlgJ10vLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFwkXFx7W157fV0qXFx9fFtcdTIwMThgJ11cXHdbXlx1MjAxOWAnXFxyXFxuXSpbXHUyMDE5YCddLyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXCRcXHt8XFx9JC8sXG5cdFx0XHRcdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHR9XG5cdH0sXG5cblx0J21hdGEnOiB7XG5cdFx0cGF0dGVybjogLyheWyBcXHRdKm1hdGFbIFxcdF0qOilbXFxzXFxTXSs/KD89XmVuZFxcYikvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ2xhbmd1YWdlLW1hdGEnLFxuXHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLm1hdGFcblx0fSxcblx0J2phdmEnOiB7XG5cdFx0cGF0dGVybjogLyheWyBcXHRdKmphdmFbIFxcdF0qOilbXFxzXFxTXSs/KD89XmVuZFxcYikvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ2xhbmd1YWdlLWphdmEnLFxuXHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmphdmFcblx0fSxcblx0J3B5dGhvbic6IHtcblx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qcHl0aG9uWyBcXHRdKjopW1xcc1xcU10rPyg/PV5lbmRcXGIpL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdsYW5ndWFnZS1weXRob24nLFxuXHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnB5dGhvblxuXHR9LFxuXG5cblx0J2NvbW1hbmQnOiB7XG5cdFx0cGF0dGVybjogLyheWyBcXHRdKig/OlxcLlsgXFx0XSspPyg/Oig/OmJheWVzfGJvb3RzdHJhcHxieXxieXNvcnR8Y2FwdHVyZXxjb2xsZWN0fGZtbXxmcHxmcmFtZXxqYWNra25pZmV8bWZwfG1pfG5lc3RyZWd8bm9pc2lseXxwZXJtdXRlfHF1aWV0bHl8cm9sbGluZ3xzaW11bGF0ZXxzdGF0c2J5fHN0ZXB3aXNlfHN2eXx2ZXJzaW9ufHhpKVxcYlteOlxcclxcbl0qOlsgXFx0XSp8KD86Y2FwdHVyZXxub2lzaWx5fHF1aWV0bHl8dmVyc2lvbilbIFxcdF0rKT8pW2EtekEtWl1cXHcqL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQndmFyaWFibGUnOiAvXFwkXFx3K3xbXHUyMDE4YCddXFx3W15cdTIwMTlgJ1xcclxcbl0qW1x1MjAxOWAnXS8sXG5cdCdrZXl3b3JkJzogL1xcYig/OmJheWVzfGJvb3RzdHJhcHxieXxieXNvcnR8Y2FwdHVyZXxjbGVhcnxjb2xsZWN0fGZtbXxmcHxmcmFtZXxpZnxpbnxqYWNra25pZmV8bWlbIFxcdF0rZXN0aW1hdGV8bWZwfG5lc3RyZWd8bm9pc2lseXxvZnxwZXJtdXRlfHF1aWV0bHl8cm9sbGluZ3xzaW11bGF0ZXxzb3J0fHN0YXRzYnl8c3RlcHdpc2V8c3Z5fHZhcmxpc3R8dmVyc2lvbnx4aSlcXGIvLFxuXG5cblx0J2Jvb2xlYW4nOiAvXFxiKD86b2ZmfG9uKVxcYi8sXG5cdCdudW1iZXInOiAvXFxiXFxkKyg/OlxcLlxcZCspP1xcYnxcXEJcXC5cXGQrLyxcblx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1cXCgpL2ksXG5cblx0J29wZXJhdG9yJzogL1xcK1xcK3wtLXwjIz98Wzw+IT1+XT0/fFsrXFwtKl4mfC9dLyxcblx0J3B1bmN0dWF0aW9uJzogL1soKXt9W1xcXSw6XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5zdGF0YVsnc3RyaW5nLWxpdGVyYWwnXS5pbnNpZGUuaW50ZXJwb2xhdGlvbi5pbnNpZGUuZXhwcmVzc2lvbi5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMuc3RhdGE7XG5cblByaXNtLmxhbmd1YWdlcy5pZWNzdCA9IHtcblx0J2NvbW1lbnQnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pKD86XFwvXFwqW1xcc1xcU10qPyg/OlxcKlxcL3wkKXxcXChcXCpbXFxzXFxTXSo/KD86XFwqXFwpfCQpfFxce1tcXHNcXFNdKj8oPzpcXH18JCkpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcOl0pXFwvXFwvLiovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHR9LFxuXHRdLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oW1wiJ10pKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHR9LFxuXHQna2V5d29yZCc6IFtcblx0XHQvXFxiKD86RU5EXyk/KD86UFJPR1JBTXxDT05GSUdVUkFUSU9OfElOVEVSRkFDRXxGVU5DVElPTl9CTE9DS3xGVU5DVElPTnxBQ1RJT058VFJBTlNJVElPTnxUWVBFfFNUUlVDVHwoPzpJTklUSUFMXyk/U1RFUHxOQU1FU1BBQ0V8TElCUkFSWXxDSEFOTkVMfEZPTERFUnxSRVNPVVJDRXxWQVJfKD86QUNDRVNTfENPTkZJR3xFWFRFUk5BTHxHTE9CQUx8SU5QVVR8SU5fT1VUfE9VVFBVVHxURU1QKXxWQVJ8TUVUSE9EfFBST1BFUlRZKVxcYi9pLFxuXHRcdC9cXGIoPzpBVHxCWXwoPzpFTkRfKT8oPzpDQVNFfEZPUnxJRnxSRVBFQVR8V0hJTEUpfENPTlNUQU5UfENPTlRJTlVFfERPfEVMU0V8RUxTSUZ8RVhJVHxFWFRFTkRTfEZST018R0VUfEdPVE98SU1QTEVNRU5UU3xKTVB8Tk9OX1JFVEFJTnxPRnxQUklWQVRFfFBST1RFQ1RFRHxQVUJMSUN8UkVUQUlOfFJFVFVSTnxTRVR8VEFTS3xUSEVOfFRPfFVOVElMfFVTSU5HfFdJVEh8X19DQVRDSHxfX0VORFRSWXxfX0ZJTkFMTFl8X19UUlkpXFxiL1xuXHRdLFxuXHQnY2xhc3MtbmFtZSc6IC9cXGIoPzpBTll8QVJSQVl8Qk9PTHxCWVRFfFU/KD86RHxMfFMpP0lOVHwoPzpEfEwpP1dPUkR8REFURSg/Ol9BTkRfVElNRSk/fERUfEw/UkVBTHxQT0lOVEVSfFNUUklOR3xUSU1FKD86X09GX0RBWSk/fFRPRClcXGIvLFxuXHQnYWRkcmVzcyc6IHtcblx0XHRwYXR0ZXJuOiAvJVtJUU1dW1hCV0RMXVtcXGQuXSp8JVtJUV1bXFxkLl0qLyxcblx0XHRhbGlhczogJ3N5bWJvbCdcblx0fSxcblx0J251bWJlcic6IC9cXGIoPzoxNiNbXFxkYS1mXSt8MiNbMDFfXSt8MHhbXFxkYS1mXSspXFxifFxcYig/OkR8RFR8VHxUT0QpI1tcXGRfc2htZDpdKnxcXGJbQS1aXSojW1xcZC4sX10qfCg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzplWystXT9cXGQrKT8vaSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86RkFMU0V8TlVMTHxUUlVFKVxcYi8sXG5cdCdvcGVyYXRvcic6IC9TP1I/Oj89Pj98JiY/fFxcKlxcKj98PFs9Pl0/fD49P3xbLTpeLysjXXxcXGIoPzpBTkR8RVF8RVhQVHxHRXxHVHxMRXxMVHxNT0R8TkV8Tk9UfE9SfFhPUilcXGIvLFxuXHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVxccypcXCgpL2ksXG5cdCdwdW5jdHVhdGlvbic6IC9bKClbXFxdLiw7XS8sXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdHZhciB1bml0ID0ge1xuXHRcdHBhdHRlcm46IC8oXFxiXFxkKykoPzolfFthLXpdKykvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fTtcblx0Ly8gMTIzIC0xMjMgLjEyMyAtLjEyMyAxMi4zIC0xMi4zXG5cdHZhciBudW1iZXIgPSB7XG5cdFx0cGF0dGVybjogLyhefFteXFx3Li1dKS0/KD86XFxkKyg/OlxcLlxcZCspP3xcXC5cXGQrKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9O1xuXG5cdHZhciBpbnNpZGUgPSB7XG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkoPzpcXC9cXCpbXFxzXFxTXSo/XFwqXFwvfFxcL1xcLy4qKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQndXJsJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYnVybFxcKChbXCInXT8pLio/XFwxXFwpL2ksXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFwifCcpKD86KD8hXFwxKVteXFxcXFxcclxcbl18XFxcXCg/OlxcclxcbnxbXFxzXFxTXSkpKlxcMS8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdpbnRlcnBvbGF0aW9uJzogbnVsbCwgLy8gU2VlIGJlbG93XG5cdFx0J2Z1bmMnOiBudWxsLCAvLyBTZWUgYmVsb3dcblx0XHQnaW1wb3J0YW50JzogL1xcQiEoPzppbXBvcnRhbnR8b3B0aW9uYWwpXFxiL2ksXG5cdFx0J2tleXdvcmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58XFxzKykoPzooPzplbHNlfGZvcnxpZnxyZXR1cm58dW5sZXNzKSg/PVxcc3wkKXxAW1xcdy1dKykvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2hleGNvZGUnOiAvI1tcXGRhLWZdezMsNn0vaSxcblx0XHQnY29sb3InOiBbXG5cdFx0XHQvXFxiKD86QWxpY2VCbHVlfEFudGlxdWVXaGl0ZXxBcXVhfEFxdWFtYXJpbmV8QXp1cmV8QmVpZ2V8QmlzcXVlfEJsYWNrfEJsYW5jaGVkQWxtb25kfEJsdWV8Qmx1ZVZpb2xldHxCcm93bnxCdXJseVdvb2R8Q2FkZXRCbHVlfENoYXJ0cmV1c2V8Q2hvY29sYXRlfENvcmFsfENvcm5mbG93ZXJCbHVlfENvcm5zaWxrfENyaW1zb258Q3lhbnxEYXJrQmx1ZXxEYXJrQ3lhbnxEYXJrR29sZGVuUm9kfERhcmtHclthZV15fERhcmtHcmVlbnxEYXJrS2hha2l8RGFya01hZ2VudGF8RGFya09saXZlR3JlZW58RGFya09yYW5nZXxEYXJrT3JjaGlkfERhcmtSZWR8RGFya1NhbG1vbnxEYXJrU2VhR3JlZW58RGFya1NsYXRlQmx1ZXxEYXJrU2xhdGVHclthZV15fERhcmtUdXJxdW9pc2V8RGFya1Zpb2xldHxEZWVwUGlua3xEZWVwU2t5Qmx1ZXxEaW1HclthZV15fERvZGdlckJsdWV8RmlyZUJyaWNrfEZsb3JhbFdoaXRlfEZvcmVzdEdyZWVufEZ1Y2hzaWF8R2FpbnNib3JvfEdob3N0V2hpdGV8R29sZHxHb2xkZW5Sb2R8R3JbYWVdeXxHcmVlbnxHcmVlblllbGxvd3xIb25leURld3xIb3RQaW5rfEluZGlhblJlZHxJbmRpZ298SXZvcnl8S2hha2l8TGF2ZW5kZXJ8TGF2ZW5kZXJCbHVzaHxMYXduR3JlZW58TGVtb25DaGlmZm9ufExpZ2h0Qmx1ZXxMaWdodENvcmFsfExpZ2h0Q3lhbnxMaWdodEdvbGRlblJvZFllbGxvd3xMaWdodEdyW2FlXXl8TGlnaHRHcmVlbnxMaWdodFBpbmt8TGlnaHRTYWxtb258TGlnaHRTZWFHcmVlbnxMaWdodFNreUJsdWV8TGlnaHRTbGF0ZUdyW2FlXXl8TGlnaHRTdGVlbEJsdWV8TGlnaHRZZWxsb3d8TGltZXxMaW1lR3JlZW58TGluZW58TWFnZW50YXxNYXJvb258TWVkaXVtQXF1YU1hcmluZXxNZWRpdW1CbHVlfE1lZGl1bU9yY2hpZHxNZWRpdW1QdXJwbGV8TWVkaXVtU2VhR3JlZW58TWVkaXVtU2xhdGVCbHVlfE1lZGl1bVNwcmluZ0dyZWVufE1lZGl1bVR1cnF1b2lzZXxNZWRpdW1WaW9sZXRSZWR8TWlkbmlnaHRCbHVlfE1pbnRDcmVhbXxNaXN0eVJvc2V8TW9jY2FzaW58TmF2YWpvV2hpdGV8TmF2eXxPbGRMYWNlfE9saXZlfE9saXZlRHJhYnxPcmFuZ2V8T3JhbmdlUmVkfE9yY2hpZHxQYWxlR29sZGVuUm9kfFBhbGVHcmVlbnxQYWxlVHVycXVvaXNlfFBhbGVWaW9sZXRSZWR8UGFwYXlhV2hpcHxQZWFjaFB1ZmZ8UGVydXxQaW5rfFBsdW18UG93ZGVyQmx1ZXxQdXJwbGV8UmVkfFJvc3lCcm93bnxSb3lhbEJsdWV8U2FkZGxlQnJvd258U2FsbW9ufFNhbmR5QnJvd258U2VhR3JlZW58U2VhU2hlbGx8U2llbm5hfFNpbHZlcnxTa3lCbHVlfFNsYXRlQmx1ZXxTbGF0ZUdyW2FlXXl8U25vd3xTcHJpbmdHcmVlbnxTdGVlbEJsdWV8VGFufFRlYWx8VGhpc3RsZXxUb21hdG98VHJhbnNwYXJlbnR8VHVycXVvaXNlfFZpb2xldHxXaGVhdHxXaGl0ZXxXaGl0ZVNtb2tlfFllbGxvd3xZZWxsb3dHcmVlbilcXGIvaSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcYig/OmhzbHxyZ2IpXFwoXFxzKlxcZHsxLDN9XFxzKixcXHMqXFxkezEsM30lP1xccyosXFxzKlxcZHsxLDN9JT9cXHMqXFwpXFxCfFxcYig/OmhzbHxyZ2IpYVxcKFxccypcXGR7MSwzfVxccyosXFxzKlxcZHsxLDN9JT9cXHMqLFxccypcXGR7MSwzfSU/XFxzKixcXHMqKD86MHwwP1xcLlxcZCt8MSlcXHMqXFwpXFxCL2ksXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCd1bml0JzogdW5pdCxcblx0XHRcdFx0XHQnbnVtYmVyJzogbnVtYmVyLFxuXHRcdFx0XHRcdCdmdW5jdGlvbic6IC9bXFx3LV0rKD89XFwoKS8sXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1soKSxdL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnZW50aXR5JzogL1xcXFxbXFxkYS1mXXsxLDh9L2ksXG5cdFx0J3VuaXQnOiB1bml0LFxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0XHQnb3BlcmF0b3InOiBbXG5cdFx0XHQvLyBXZSB3YW50IG5vbi13b3JkIGNoYXJzIGFyb3VuZCBcIi1cIiBiZWNhdXNlIGl0IGlzXG5cdFx0XHQvLyBhY2NlcHRlZCBpbiBwcm9wZXJ0eSBuYW1lcy5cblx0XHRcdC9+fFsrIVxcLyU8Pj89XT0/fFstOl09fFxcKlsqPV0/fFxcLnsyLDN9fCYmfFxcfFxcfHxcXEItXFxCfFxcYig/OmFuZHxpbnxpcyg/OiBhfCBkZWZpbmVkfCBub3R8bnQpP3xub3R8b3IpXFxiL1xuXHRcdF0sXG5cdFx0J251bWJlcic6IG51bWJlcixcblx0XHQncHVuY3R1YXRpb24nOiAvW3t9KClcXFtcXF07OixdL1xuXHR9O1xuXG5cdGluc2lkZVsnaW50ZXJwb2xhdGlvbiddID0ge1xuXHRcdHBhdHRlcm46IC9cXHtbXlxcclxcbn06XStcXH0vLFxuXHRcdGFsaWFzOiAndmFyaWFibGUnLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdFx0cGF0dGVybjogL15cXHt8XFx9JC8sXG5cdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHR9LFxuXHRcdFx0cmVzdDogaW5zaWRlXG5cdFx0fVxuXHR9O1xuXHRpbnNpZGVbJ2Z1bmMnXSA9IHtcblx0XHRwYXR0ZXJuOiAvW1xcdy1dK1xcKFteKV0qXFwpLiovLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2Z1bmN0aW9uJzogL15bXihdKy8sXG5cdFx0XHRyZXN0OiBpbnNpZGVcblx0XHR9XG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnN0eWx1cyA9IHtcblx0XHQnYXRydWxlLWRlY2xhcmF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKilALisvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2F0cnVsZSc6IC9eQFtcXHctXSsvLFxuXHRcdFx0XHRyZXN0OiBpbnNpZGVcblx0XHRcdH1cblx0XHR9LFxuXHRcdCd2YXJpYWJsZS1kZWNsYXJhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopW1xcdyQtXStcXHMqLj89WyBcXHRdKig/Olxce1tee31dKlxcfXxcXFMuKnwkKS9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQndmFyaWFibGUnOiAvXlxcUysvLFxuXHRcdFx0XHRyZXN0OiBpbnNpZGVcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0J3N0YXRlbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopKD86ZWxzZXxmb3J8aWZ8cmV0dXJufHVubGVzcylbIFxcdF0uKy9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQna2V5d29yZCc6IC9eXFxTKy8sXG5cdFx0XHRcdHJlc3Q6IGluc2lkZVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBBIHByb3BlcnR5L3ZhbHVlIHBhaXIgY2Fubm90IGVuZCB3aXRoIGEgY29tbWEgb3IgYSBicmFjZVxuXHRcdC8vIEl0IGNhbm5vdCBoYXZlIGluZGVudGVkIGNvbnRlbnQgdW5sZXNzIGl0IGVuZGVkIHdpdGggYSBzZW1pY29sb25cblx0XHQncHJvcGVydHktZGVjbGFyYXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKCg/Ol58XFx7KShbIFxcdF0qKSkoPzpbXFx3LV18XFx7W159XFxyXFxuXStcXH0pKyg/Olxccyo6XFxzKnxbIFxcdF0rKSg/IVxccylbXntcXHJcXG5dKig/Ojt8W157XFxyXFxuLF0kKD8hKD86XFxyP1xcbnxcXHIpKD86XFx7fFxcMlsgXFx0XSkpKS9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHJvcGVydHknOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15bXlxcczpdKy8sXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IGluc2lkZS5pbnRlcnBvbGF0aW9uXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRyZXN0OiBpbnNpZGVcblx0XHRcdH1cblx0XHR9LFxuXG5cblx0XHQvLyBBIHNlbGVjdG9yIGNhbiBjb250YWluIHBhcmVudGhlc2VzIG9ubHkgYXMgcGFydCBvZiBhIHBzZXVkby1lbGVtZW50XG5cdFx0Ly8gSXQgY2FuIHNwYW4gbXVsdGlwbGUgbGluZXMuXG5cdFx0Ly8gSXQgbXVzdCBlbmQgd2l0aCBhIGNvbW1hIG9yIGFuIGFjY29sYWRlIG9yIGhhdmUgaW5kZW50ZWQgY29udGVudC5cblx0XHQnc2VsZWN0b3InOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKSg/Oig/PVxcUykoPzpbXnt9XFxyXFxuOigpXXw6Oj9bXFx3LV0rKD86XFwoW14pXFxyXFxuXSpcXCl8KD8hW1xcdy1dKSl8XFx7W159XFxyXFxuXStcXH0pKykoPzooPzpcXHI/XFxufFxccikoPzpcXDEoPzooPz1cXFMpKD86W157fVxcclxcbjooKV18Ojo/W1xcdy1dKyg/OlxcKFteKVxcclxcbl0qXFwpfCg/IVtcXHctXSkpfFxce1tefVxcclxcbl0rXFx9KSspKSkqKD86LCR8XFx7fCg/PSg/Olxccj9cXG58XFxyKSg/Olxce3xcXDFbIFxcdF0pKSkvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2ludGVycG9sYXRpb24nOiBpbnNpZGUuaW50ZXJwb2xhdGlvbixcblx0XHRcdFx0J2NvbW1lbnQnOiBpbnNpZGUuY29tbWVudCxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1t7fSxdL1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQnZnVuYyc6IGluc2lkZS5mdW5jLFxuXHRcdCdzdHJpbmcnOiBpbnNpZGUuc3RyaW5nLFxuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pKD86XFwvXFwqW1xcc1xcU10qP1xcKlxcL3xcXC9cXC8uKikvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2ludGVycG9sYXRpb24nOiBpbnNpZGUuaW50ZXJwb2xhdGlvbixcblx0XHQncHVuY3R1YXRpb24nOiAvW3t9KClcXFtcXF07Oi5dL1xuXHR9O1xufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuc3VwZXJjb2xsaWRlciA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcL1xcLy4qfFxcL1xcKig/OlteKi9dfFxcKig/IVxcLyl8XFwvKD8hXFwqKXxcXC9cXCooPzpbXipdfFxcKig/IVxcLykpKlxcKlxcLykqXFwqXFwvLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcIig/OlteXCJcXFxcXXxcXFxcW1xcc1xcU10pKlwiLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY2hhcic6IHtcblx0XHRwYXR0ZXJuOiAvXFwkKD86W15cXFxcXFxyXFxuXXxcXFxcLikvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3ltYm9sJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKScoPzpbXidcXFxcXXxcXFxcW1xcc1xcU10pKid8XFxcXFxcdysvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J2tleXdvcmQnOiAvXFxiKD86X3xhcmd8Y2xhc3N2YXJ8Y29uc3R8bmlsfHZhcnx3aGlsZSlcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cblx0J2xhYmVsJzoge1xuXHRcdHBhdHRlcm46IC9cXGJbYS16X11cXHcqKD89XFxzKjopLyxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXG5cdCdudW1iZXInOiAvXFxiKD86aW5mfHBpfDB4WzAtOWEtZkEtRl0rfFxcZCsoPzpcXC5cXGQrKT8oPzpbZUVdWystXT9cXGQrKT8oPzpwaSk/fFxcZCtyWzAtOWEtekEtWl0rKD86XFwuWzAtOWEtekEtWl0rKT98XFxkK1tzYl17MSw0fVxcZCopXFxiLyxcblx0J2NsYXNzLW5hbWUnOiAvXFxiW0EtWl1cXHcqXFxiLyxcblxuXHQnb3BlcmF0b3InOiAvXFwuezIsM318Iyg/IVtbe10pfCYmfFshPV09PT98XFwrPj58XFwrezEsM318LVstPl18PT58Pj58XFw/XFw/fEBcXHw/QHxcXHwoPzpAfFshPV09KT9cXHx8IVxcP3w8WyE9Pl18XFwqezEsMn18PHsyLDN9XFwqP3xbLSElJi88Pj9AfD1gXS8sXG5cdCdwdW5jdHVhdGlvbic6IC9be30oKVtcXF0uOiw7XXwjW1t7XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5zY2xhbmcgPSBQcmlzbS5sYW5ndWFnZXMuc3VwZXJjb2xsaWRlcjtcblxuUHJpc20ubGFuZ3VhZ2VzLnN3aWZ0ID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHQvLyBOZXN0ZWQgY29tbWVudHMgYXJlIHN1cHBvcnRlZCB1cCB0byAyIGxldmVsc1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFw6XSkoPzpcXC9cXC8uKnxcXC9cXCooPzpbXi8qXXxcXC8oPyFcXCopfFxcKig/IVxcLyl8XFwvXFwqKD86W14qXXxcXCooPyFcXC8pKSpcXCpcXC8pKlxcKlxcLykvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmctbGl0ZXJhbCc6IFtcblx0XHQvLyBodHRwczovL2RvY3Muc3dpZnQub3JnL3N3aWZ0LWJvb2svTGFuZ3VhZ2VHdWlkZS9TdHJpbmdzQW5kQ2hhcmFjdGVycy5odG1sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0XHQvKF58W15cIiNdKS8uc291cmNlXG5cdFx0XHRcdCsgJyg/Oidcblx0XHRcdFx0Ly8gc2luZ2xlLWxpbmUgc3RyaW5nXG5cdFx0XHRcdCsgL1wiKD86XFxcXCg/OlxcKCg/OlteKCldfFxcKFteKCldKlxcKSkqXFwpfFxcclxcbnxbXihdKXxbXlxcXFxcXHJcXG5cIl0pKlwiLy5zb3VyY2Vcblx0XHRcdFx0KyAnfCdcblx0XHRcdFx0Ly8gbXVsdGktbGluZSBzdHJpbmdcblx0XHRcdFx0KyAvXCJcIlwiKD86XFxcXCg/OlxcKCg/OlteKCldfFxcKFteKCldKlxcKSkqXFwpfFteKF0pfFteXFxcXFwiXXxcIig/IVwiXCIpKSpcIlwiXCIvLnNvdXJjZVxuXHRcdFx0XHQrICcpJ1xuXHRcdFx0XHQrIC8oPyFbXCIjXSkvLnNvdXJjZVxuXHRcdFx0KSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhcXFxcXFwoKSg/OlteKCldfFxcKFteKCldKlxcKSkqKD89XFwpKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdpbnRlcnBvbGF0aW9uLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eXFwpfFxcXFxcXCgkLyxcblx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFxcXCg/PVtcXHJcXG5dKS8sXG5cdFx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0XHQvKF58W15cIiNdKSgjKykvLnNvdXJjZVxuXHRcdFx0XHQrICcoPzonXG5cdFx0XHRcdC8vIHNpbmdsZS1saW5lIHN0cmluZ1xuXHRcdFx0XHQrIC9cIig/OlxcXFwoPzojK1xcKCg/OlteKCldfFxcKFteKCldKlxcKSkqXFwpfFxcclxcbnxbXiNdKXxbXlxcXFxcXHJcXG5dKSo/XCIvLnNvdXJjZVxuXHRcdFx0XHQrICd8J1xuXHRcdFx0XHQvLyBtdWx0aS1saW5lIHN0cmluZ1xuXHRcdFx0XHQrIC9cIlwiXCIoPzpcXFxcKD86IytcXCgoPzpbXigpXXxcXChbXigpXSpcXCkpKlxcKXxbXiNdKXxbXlxcXFxdKSo/XCJcIlwiLy5zb3VyY2Vcblx0XHRcdFx0KyAnKSdcblx0XHRcdFx0KyAnXFxcXDInXG5cdFx0XHQpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKFxcXFwjK1xcKCkoPzpbXigpXXxcXChbXigpXSpcXCkpKig/PVxcKSkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnaW50ZXJwb2xhdGlvbi1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcKXxcXFxcIytcXCgkLyxcblx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHRcdH1cblx0XHR9LFxuXHRdLFxuXG5cdCdkaXJlY3RpdmUnOiB7XG5cdFx0Ly8gZGlyZWN0aXZlcyB3aXRoIGNvbmRpdGlvbnNcblx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHQvIy8uc291cmNlXG5cdFx0XHQrICcoPzonXG5cdFx0XHQrIChcblx0XHRcdFx0Lyg/OmVsc2VpZnxpZilcXGIvLnNvdXJjZVxuXHRcdFx0XHQrICcoPzpbIFxcdF0qJ1xuXHRcdFx0XHQvLyBUaGlzIHJlZ2V4IGlzIGEgbGl0dGxlIGNvbXBsZXguIEl0J3MgZXF1aXZhbGVudCB0byB0aGlzOlxuXHRcdFx0XHQvLyAgICg/OiFbIFxcdF0qKT8oPzpcXGJcXHcrXFxiKD86WyBcXHRdKjxyb3VuZD4pP3w8cm91bmQ+KSg/OlsgXFx0XSooPzomJnxcXHxcXHwpKT9cblx0XHRcdFx0Ly8gd2hlcmUgPHJvdW5kPiBpcyBhIGdlbmVyYWwgcGFyZW50aGVzZXMgZXhwcmVzc2lvbi5cblx0XHRcdFx0KyAvKD86IVsgXFx0XSopPyg/OlxcYlxcdytcXGIoPzpbIFxcdF0qXFwoKD86W14oKV18XFwoW14oKV0qXFwpKSpcXCkpP3xcXCgoPzpbXigpXXxcXChbXigpXSpcXCkpKlxcKSkoPzpbIFxcdF0qKD86JiZ8XFx8XFx8KSk/Ly5zb3VyY2Vcblx0XHRcdFx0KyAnKSsnXG5cdFx0XHQpXG5cdFx0XHQrICd8J1xuXHRcdFx0KyAvKD86ZWxzZXxlbmRpZilcXGIvLnNvdXJjZVxuXHRcdFx0KyAnKSdcblx0XHQpLFxuXHRcdGFsaWFzOiAncHJvcGVydHknLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2RpcmVjdGl2ZS1uYW1lJzogL14jXFx3Ky8sXG5cdFx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdFx0XHQnbnVtYmVyJzogL1xcYlxcZCsoPzpcXC5cXGQrKSpcXGIvLFxuXHRcdFx0J29wZXJhdG9yJzogLyF8JiZ8XFx8XFx8fFs8Pl09Py8sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvWygpLF0vXG5cdFx0fVxuXHR9LFxuXHQnbGl0ZXJhbCc6IHtcblx0XHRwYXR0ZXJuOiAvIyg/OmNvbG9yTGl0ZXJhbHxjb2x1bW58ZHNvaGFuZGxlfGZpbGUoPzpJRHxMaXRlcmFsfFBhdGgpP3xmdW5jdGlvbnxpbWFnZUxpdGVyYWx8bGluZSlcXGIvLFxuXHRcdGFsaWFzOiAnY29uc3RhbnQnXG5cdH0sXG5cdCdvdGhlci1kaXJlY3RpdmUnOiB7XG5cdFx0cGF0dGVybjogLyNcXHcrXFxiLyxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXG5cdCdhdHRyaWJ1dGUnOiB7XG5cdFx0cGF0dGVybjogL0BcXHcrLyxcblx0XHRhbGlhczogJ2F0cnVsZSdcblx0fSxcblxuXHQnZnVuY3Rpb24tZGVmaW5pdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYmZ1bmNcXHMrKVxcdysvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0fSxcblx0J2xhYmVsJzoge1xuXHRcdC8vIGh0dHBzOi8vZG9jcy5zd2lmdC5vcmcvc3dpZnQtYm9vay9MYW5ndWFnZUd1aWRlL0NvbnRyb2xGbG93Lmh0bWwjSUQxNDFcblx0XHRwYXR0ZXJuOiAvXFxiKGJyZWFrfGNvbnRpbnVlKVxccytcXHcrfFxcYlthLXpBLVpfXVxcdyooPz1cXHMqOlxccyooPzpmb3J8cmVwZWF0fHdoaWxlKVxcYikvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdH0sXG5cblx0J2tleXdvcmQnOiAvXFxiKD86QW55fFByb3RvY29sfFNlbGZ8VHlwZXxhY3Rvcnxhc3xhc3NpZ25tZW50fGFzc29jaWF0ZWR0eXBlfGFzc29jaWF0aXZpdHl8YXN5bmN8YXdhaXR8YnJlYWt8Y2FzZXxjYXRjaHxjbGFzc3xjb250aW51ZXxjb252ZW5pZW5jZXxkZWZhdWx0fGRlZmVyfGRlaW5pdHxkaWRTZXR8ZG98ZHluYW1pY3xlbHNlfGVudW18ZXh0ZW5zaW9ufGZhbGx0aHJvdWdofGZpbGVwcml2YXRlfGZpbmFsfGZvcnxmdW5jfGdldHxndWFyZHxoaWdoZXJUaGFufGlmfGltcG9ydHxpbnxpbmRpcmVjdHxpbmZpeHxpbml0fGlub3V0fGludGVybmFsfGlzfGlzb2xhdGVkfGxhenl8bGVmdHxsZXR8bG93ZXJUaGFufG11dGF0aW5nfG5vbmV8bm9uaXNvbGF0ZWR8bm9ubXV0YXRpbmd8b3BlbnxvcGVyYXRvcnxvcHRpb25hbHxvdmVycmlkZXxwb3N0Zml4fHByZWNlZGVuY2Vncm91cHxwcmVmaXh8cHJpdmF0ZXxwcm90b2NvbHxwdWJsaWN8cmVwZWF0fHJlcXVpcmVkfHJldGhyb3dzfHJldHVybnxyaWdodHxzYWZlfHNlbGZ8c2V0fHNvbWV8c3RhdGljfHN0cnVjdHxzdWJzY3JpcHR8c3VwZXJ8c3dpdGNofHRocm93fHRocm93c3x0cnl8dHlwZWFsaWFzfHVub3duZWR8dW5zYWZlfHZhcnx3ZWFrfHdoZXJlfHdoaWxlfHdpbGxTZXQpXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQnbmlsJzoge1xuXHRcdHBhdHRlcm46IC9cXGJuaWxcXGIvLFxuXHRcdGFsaWFzOiAnY29uc3RhbnQnXG5cdH0sXG5cblx0J3Nob3J0LWFyZ3VtZW50JzogL1xcJFxcZCtcXGIvLFxuXHQnb21pdCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiX1xcYi8sXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQnbnVtYmVyJzogL1xcYig/OltcXGRfXSsoPzpcXC5bXFxkZV9dKyk/fDB4W2EtZjAtOV9dKyg/OlxcLlthLWYwLTlwX10rKT98MGJbMDFfXSt8MG9bMC03X10rKVxcYi9pLFxuXG5cdC8vIEEgY2xhc3MgbmFtZSBtdXN0IHN0YXJ0IHdpdGggYW4gdXBwZXItY2FzZSBsZXR0ZXIgYW5kIGJlIGVpdGhlciAxIGxldHRlciBsb25nIG9yIGNvbnRhaW4gYSBsb3dlci1jYXNlIGxldHRlci5cblx0J2NsYXNzLW5hbWUnOiAvXFxiW0EtWl0oPzpbQS1aX1xcZF0qW2Etel1cXHcqKT9cXGIvLFxuXHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVxccypcXCgpL2ksXG5cdCdjb25zdGFudCc6IC9cXGIoPzpbQS1aX117Mix9fGtbQS1aXVtBLVphLXpfXSspXFxiLyxcblxuXHQvLyBPcGVyYXRvcnMgYXJlIGdlbmVyaWMgaW4gU3dpZnQuIERldmVsb3BlcnMgY2FuIGV2ZW4gY3JlYXRlIG5ldyBvcGVyYXRvcnMgKGUuZy4gKysrKS5cblx0Ly8gaHR0cHM6Ly9kb2NzLnN3aWZ0Lm9yZy9zd2lmdC1ib29rL1JlZmVyZW5jZU1hbnVhbC96elN1bW1hcnlPZlRoZUdyYW1tYXIuaHRtbCNJRDQ4MVxuXHQvLyBUaGlzIHJlZ2V4IG9ubHkgc3VwcG9ydHMgQVNDSUkgb3BlcmF0b3JzLlxuXHQnb3BlcmF0b3InOiAvWy0rKi8lPSE8PiZ8Xn4/XSt8XFwuWy5cXC0rKi8lPSE8PiZ8Xn4/XSsvLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXSgpOywuOlxcXFxdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnN3aWZ0WydzdHJpbmctbGl0ZXJhbCddLmZvckVhY2goZnVuY3Rpb24gKHJ1bGUpIHtcblx0cnVsZS5pbnNpZGVbJ2ludGVycG9sYXRpb24nXS5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMuc3dpZnQ7XG59KTtcblxuLy8gaHR0cHM6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL3N5c3RlbWQvbWFuL3N5c3RlbWQuc3ludGF4Lmh0bWxcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBjb21tZW50ID0ge1xuXHRcdHBhdHRlcm46IC9eWzsjXS4qL20sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH07XG5cblx0dmFyIHF1b3Rlc1NvdXJjZSA9IC9cIig/OlteXFxyXFxuXCJcXFxcXXxcXFxcKD86W15cXHJdfFxcclxcbj8pKSpcIig/IVxcUykvLnNvdXJjZTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuc3lzdGVtZCA9IHtcblx0XHQnY29tbWVudCc6IGNvbW1lbnQsXG5cblx0XHQnc2VjdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC9eXFxbW15cXG5cXHJcXFtcXF1dKlxcXSg/PVsgXFx0XSokKS9tLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFxbfFxcXSQvLFxuXHRcdFx0XHQnc2VjdGlvbi1uYW1lJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRcdGFsaWFzOiAnc2VsZWN0b3InXG5cdFx0XHRcdH0sXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdCdrZXknOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXlteXFxzPV0rKD89WyBcXHRdKj0pL20sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ2F0dHItbmFtZSdcblx0XHR9LFxuXHRcdCd2YWx1ZSc6IHtcblx0XHRcdC8vIFRoaXMgcGF0dGVybiBpcyBxdWl0ZSBjb21wbGV4IGJlY2F1c2Ugb2YgdHdvIHByb3BlcnRpZXM6XG5cdFx0XHQvLyAgMSkgUXVvdGVzIChzdHJpbmdzKSBtdXN0IGJlIHByZWNlZGVkIGJ5IGEgc3BhY2UuIFNpbmNlIHdlIGNhbid0IHVzZSBsb29rYmVoaW5kcywgd2UgaGF2ZSB0byBcInJlc29sdmVcIlxuXHRcdFx0Ly8gICAgIHRoZSBsb29rYmVoaW5kLiBZb3Ugd2lsbCBzZWUgdGhpcyBpbiB0aGUgbWFpbiBsb29wIHdoZXJlIHNwYWNlcyBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5LlxuXHRcdFx0Ly8gIDIpIExpbmUgY29udGludWF0aW9ucy5cblx0XHRcdC8vICAgICBBZnRlciBsaW5lIGNvbnRpbnVhdGlvbnMsIGVtcHR5IGxpbmVzIGFuZCBjb21tZW50cyBhcmUgaWdub3JlZCBzbyB3ZSBoYXZlIHRvIGNvbnN1bWUgdGhlbS5cblx0XHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdFx0Lyg9WyBcXHRdKig/IVxccykpLy5zb3VyY2UgK1xuXHRcdFx0XHQvLyB0aGUgdmFsdWUgZWl0aGVyIHN0YXJ0cyB3aXRoIHF1b3RlcyBvciBub3Rcblx0XHRcdFx0Jyg/OicgKyBxdW90ZXNTb3VyY2UgKyAnfCg/PVteXCJcXHJcXG5dKSknICtcblx0XHRcdFx0Ly8gbWFpbiBsb29wXG5cdFx0XHRcdCcoPzonICsgKFxuXHRcdFx0XHRcdC9bXlxcc1xcXFxdLy5zb3VyY2UgK1xuXHRcdFx0XHRcdC8vIGhhbmRsZSBzcGFjZXMgc2VwYXJhdGVseSBiZWNhdXNlIG9mIHF1b3Rlc1xuXHRcdFx0XHRcdCd8JyArICdbIFxcdF0rKD86KD8hWyBcXHRcIl0pfCcgKyBxdW90ZXNTb3VyY2UgKyAnKScgK1xuXHRcdFx0XHRcdC8vIGxpbmUgY29udGludWF0aW9uXG5cdFx0XHRcdFx0J3wnICsgL1xcXFxbXFxyXFxuXSsoPzpbIztdLipbXFxyXFxuXSspKig/IVsjO10pLy5zb3VyY2Vcblx0XHRcdFx0KSArXG5cdFx0XHRcdCcpKidcblx0XHRcdCksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdhdHRyLXZhbHVlJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnY29tbWVudCc6IGNvbW1lbnQsXG5cdFx0XHRcdCdxdW90ZWQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXnxcXHMpLy5zb3VyY2UgKyBxdW90ZXNTb3VyY2UpLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFxcXCQvbSxcblxuXHRcdFx0XHQnYm9vbGVhbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXig/OmZhbHNlfG5vfG9mZnxvbnx0cnVlfHllcykkLyxcblx0XHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQncHVuY3R1YXRpb24nOiAvPS9cblx0fTtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0ZnVuY3Rpb24gY3JlYXRlQmxvY2socHJlZml4LCBpbnNpZGUsIGNvbnRlbnRBbGlhcykge1xuXHRcdHJldHVybiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJzwjJyArIHByZWZpeCArICdbXFxcXHNcXFxcU10qPyM+JyksXG5cdFx0XHRhbGlhczogJ2Jsb2NrJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnXjwjJyArIHByZWZpeCArICd8Iz4kJyksXG5cdFx0XHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdjb250ZW50Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRcdGluc2lkZTogaW5zaWRlLFxuXHRcdFx0XHRcdGFsaWFzOiBjb250ZW50QWxpYXNcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHRmdW5jdGlvbiBjcmVhdGVUNChpbnNpZGVMYW5nKSB7XG5cdFx0dmFyIGdyYW1tYXIgPSBQcmlzbS5sYW5ndWFnZXNbaW5zaWRlTGFuZ107XG5cdFx0dmFyIGNsYXNzTmFtZSA9ICdsYW5ndWFnZS0nICsgaW5zaWRlTGFuZztcblxuXHRcdHJldHVybiB7XG5cdFx0XHQnYmxvY2snOiB7XG5cdFx0XHRcdHBhdHRlcm46IC88I1tcXHNcXFNdKz8jPi8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdkaXJlY3RpdmUnOiBjcmVhdGVCbG9jaygnQCcsIHtcblx0XHRcdFx0XHRcdCdhdHRyLXZhbHVlJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvPSg/OihcInwnKSg/OlxcXFxbXFxzXFxTXXwoPyFcXDEpW15cXFxcXSkqXFwxfFteXFxzJ1wiPj1dKykvLFxuXHRcdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXj18XltcIiddfFtcIiddJC9cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdrZXl3b3JkJzogL1xcYlxcdysoPz1cXHMpLyxcblx0XHRcdFx0XHRcdCdhdHRyLW5hbWUnOiAvXFxiXFx3Ky9cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHQnZXhwcmVzc2lvbic6IGNyZWF0ZUJsb2NrKCc9JywgZ3JhbW1hciwgY2xhc3NOYW1lKSxcblx0XHRcdFx0XHQnY2xhc3MtZmVhdHVyZSc6IGNyZWF0ZUJsb2NrKCdcXFxcKycsIGdyYW1tYXIsIGNsYXNzTmFtZSksXG5cdFx0XHRcdFx0J3N0YW5kYXJkJzogY3JlYXRlQmxvY2soJycsIGdyYW1tYXIsIGNsYXNzTmFtZSlcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHRQcmlzbS5sYW5ndWFnZXNbJ3Q0LXRlbXBsYXRpbmcnXSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2NyZWF0ZVQ0JywgeyB2YWx1ZTogY3JlYXRlVDQgfSk7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLnQ0ID0gUHJpc20ubGFuZ3VhZ2VzWyd0NC1jcyddID0gUHJpc20ubGFuZ3VhZ2VzWyd0NC10ZW1wbGF0aW5nJ10uY3JlYXRlVDQoJ2NzaGFycCcpO1xuXG5QcmlzbS5sYW5ndWFnZXMudmJuZXQgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdiYXNpYycsIHtcblx0J2NvbW1lbnQnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyg/OiF8UkVNXFxiKS4rL2ksXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2tleXdvcmQnOiAvXlJFTS9pXG5cdFx0XHR9XG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcOl0pJy4qLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXCJdKVwiKD86XCJcInxbXlwiXSkqXCIoPyFcIikvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogLyg/OlxcYig/OkFEREhBTkRMRVJ8QUREUkVTU09GfEFMSUFTfEFORHxBTkRBTFNPfEFTfEJFRVB8QkxPQUR8Qk9PTEVBTnxCU0FWRXxCWVJFRnxCWVRFfEJZVkFMfENBTEwoPzogQUJTT0xVVEUpP3xDQVNFfENBVENIfENCT09MfENCWVRFfENDSEFSfENEQVRFfENEQkx8Q0RFQ3xDSEFJTnxDSEFSfENIRElSfENJTlR8Q0xBU1N8Q0xFQVJ8Q0xOR3xDTE9TRXxDTFN8Q09CSnxDT018Q09NTU9OfENPTlNUfENPTlRJTlVFfENTQllURXxDU0hPUlR8Q1NOR3xDU1RSfENUWVBFfENVSU5UfENVTE5HfENVU0hPUlR8REFUQXxEQVRFfERFQ0lNQUx8REVDTEFSRXxERUYoPzogRk58IFNFR3xEQkx8SU5UfExOR3xTTkd8U1RSKXxERUZBVUxUfERFTEVHQVRFfERJTXxESVJFQ1RDQVNUfERPfERPVUJMRXxFTFNFfEVMU0VJRnxFTkR8RU5VTXxFTlZJUk9OfEVSQVNFfEVSUk9SfEVWRU5UfEVYSVR8RkFMU0V8RklFTER8RklMRVN8RklOQUxMWXxGT1IoPzogRUFDSCk/fEZSSUVORHxGVU5DVElPTnxHRVR8R0VUVFlQRXxHRVRYTUxOQU1FU1BBQ0V8R0xPQkFMfEdPU1VCfEdPVE98SEFORExFU3xJRnxJTVBMRU1FTlRTfElNUE9SVFN8SU58SU5IRVJJVFN8SU5QVVR8SU5URUdFUnxJTlRFUkZBQ0V8SU9DVEx8SVN8SVNOT1R8S0VZfEtJTEx8TEVUfExJQnxMSUtFfExJTkUgSU5QVVR8TE9DQVRFfExPQ0t8TE9OR3xMT09QfExTRVR8TUV8TUtESVJ8TU9EfE1PRFVMRXxNVVNUSU5IRVJJVHxNVVNUT1ZFUlJJREV8TVlCQVNFfE1ZQ0xBU1N8TkFNRXxOQU1FU1BBQ0V8TkFSUk9XSU5HfE5FV3xORVhUfE5PVHxOT1RISU5HfE5PVElOSEVSSVRBQkxFfE5PVE9WRVJSSURBQkxFfE9CSkVDVHxPRnxPRkZ8T04oPzogQ09NfCBFUlJPUnwgS0VZfCBUSU1FUik/fE9QRU58T1BFUkFUT1J8T1BUSU9OKD86IEJBU0UpP3xPUFRJT05BTHxPUnxPUkVMU0V8T1VUfE9WRVJMT0FEU3xPVkVSUklEQUJMRXxPVkVSUklERVN8UEFSQU1BUlJBWXxQQVJUSUFMfFBPS0V8UFJJVkFURXxQUk9QRVJUWXxQUk9URUNURUR8UFVCTElDfFBVVHxSQUlTRUVWRU5UfFJFQUR8UkVBRE9OTFl8UkVESU18UkVNfFJFTU9WRUhBTkRMRVJ8UkVTVE9SRXxSRVNVTUV8UkVUVVJOfFJNRElSfFJTRVR8UlVOfFNCWVRFfFNFTEVDVCg/OiBDQVNFKT98U0VUfFNIQURPV1N8U0hBUkVEfFNIRUxMfFNIT1JUfFNJTkdMRXxTTEVFUHxTVEFUSUN8U1RFUHxTVE9QfFNUUklOR3xTVFJVQ1RVUkV8U1VCfFNXQVB8U1lOQ0xPQ0t8U1lTVEVNfFRIRU58VEhST1d8VElNRVJ8VE98VFJPRkZ8VFJPTnxUUlVFfFRSWXxUUllDQVNUfFRZUEV8VFlQRU9GfFVJTlRFR0VSfFVMT05HfFVOTE9DS3xVTlRJTHxVU0hPUlR8VVNJTkd8VklFVyBQUklOVHxXQUlUfFdFTkR8V0hFTnxXSElMRXxXSURFTklOR3xXSVRIfFdJVEhFVkVOVFN8V1JJVEV8V1JJVEVPTkxZfFhPUil8XFxCKD86I0NPTlNUfCNFTFNFfCNFTFNFSUZ8I0VORHwjSUYpKSg/OlxcJHxcXGIpL2ksXG5cdCdwdW5jdHVhdGlvbic6IC9bLDs6KCl7fV0vXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzWyd0NC12YiddID0gUHJpc20ubGFuZ3VhZ2VzWyd0NC10ZW1wbGF0aW5nJ10uY3JlYXRlVDQoJ3ZibmV0Jyk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHQvLyBodHRwczovL3lhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNjLW5zLWFuY2hvci1wcm9wZXJ0eVxuXHQvLyBodHRwczovL3lhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNjLW5zLWFsaWFzLW5vZGVcblx0dmFyIGFuY2hvck9yQWxpYXMgPSAvWyomXVteXFxzW1xcXXt9LF0rLztcblx0Ly8gaHR0cHM6Ly95YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjYy1ucy10YWctcHJvcGVydHlcblx0dmFyIHRhZyA9IC8hKD86PFtcXHdcXC0lIzsvPzpAJj0rJCwuIX4qJygpW1xcXV0rPnwoPzpbYS16QS1aXFxkLV0qISk/W1xcd1xcLSUjOy8/OkAmPSskLn4qJygpXSspPy87XG5cdC8vIGh0dHBzOi8veWFtbC5vcmcvc3BlYy8xLjIvc3BlYy5odG1sI2MtbnMtcHJvcGVydGllcyhuLGMpXG5cdHZhciBwcm9wZXJ0aWVzID0gJyg/OicgKyB0YWcuc291cmNlICsgJyg/OlsgXFx0XSsnICsgYW5jaG9yT3JBbGlhcy5zb3VyY2UgKyAnKT98J1xuXHRcdCsgYW5jaG9yT3JBbGlhcy5zb3VyY2UgKyAnKD86WyBcXHRdKycgKyB0YWcuc291cmNlICsgJyk/KSc7XG5cdC8vIGh0dHBzOi8veWFtbC5vcmcvc3BlYy8xLjIvc3BlYy5odG1sI25zLXBsYWluKG4sYylcblx0Ly8gVGhpcyBpcyBhIHNpbXBsaWZpZWQgdmVyc2lvbiB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBcIiNcIiBhbmQgbXVsdGlsaW5lIGtleXNcblx0Ly8gQWxsIHRoZXNlIGxvbmcgc2NhcnJ5IGNoYXJhY3RlciBjbGFzc2VzIGFyZSBzaW1wbGlmaWVkIHZlcnNpb25zIG9mIFlBTUwncyBjaGFyYWN0ZXJzXG5cdHZhciBwbGFpbktleSA9IC8oPzpbXlxcc1xceDAwLVxceDA4XFx4MGUtXFx4MWYhXCIjJSYnKixcXC06Pj9AW1xcXWB7fH1cXHg3Zi1cXHg4NFxceDg2LVxceDlmXFx1ZDgwMC1cXHVkZmZmXFx1ZmZmZVxcdWZmZmZdfFs/Oi1dPFBMQUlOPikoPzpbIFxcdF0qKD86KD8hWyM6XSk8UExBSU4+fDo8UExBSU4+KSkqLy5zb3VyY2Vcblx0XHQucmVwbGFjZSgvPFBMQUlOPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiAvW15cXHNcXHgwMC1cXHgwOFxceDBlLVxceDFmLFtcXF17fVxceDdmLVxceDg0XFx4ODYtXFx4OWZcXHVkODAwLVxcdWRmZmZcXHVmZmZlXFx1ZmZmZl0vLnNvdXJjZTsgfSk7XG5cdHZhciBzdHJpbmcgPSAvXCIoPzpbXlwiXFxcXFxcclxcbl18XFxcXC4pKlwifCcoPzpbXidcXFxcXFxyXFxuXXxcXFxcLikqJy8uc291cmNlO1xuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtmbGFnc11cblx0ICogQHJldHVybnMge1JlZ0V4cH1cblx0ICovXG5cdGZ1bmN0aW9uIGNyZWF0ZVZhbHVlUGF0dGVybih2YWx1ZSwgZmxhZ3MpIHtcblx0XHRmbGFncyA9IChmbGFncyB8fCAnJykucmVwbGFjZSgvbS9nLCAnJykgKyAnbSc7IC8vIGFkZCBtIGZsYWdcblx0XHR2YXIgcGF0dGVybiA9IC8oWzpcXC0sW3tdXFxzKig/Olxcczw8cHJvcD4+WyBcXHRdKyk/KSg/Ojw8dmFsdWU+PikoPz1bIFxcdF0qKD86JHwsfFxcXXxcXH18KD86W1xcclxcbl1cXHMqKT8jKSkvLnNvdXJjZVxuXHRcdFx0LnJlcGxhY2UoLzw8cHJvcD4+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHByb3BlcnRpZXM7IH0pLnJlcGxhY2UoLzw8dmFsdWU+Pi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiB2YWx1ZTsgfSk7XG5cdFx0cmV0dXJuIFJlZ0V4cChwYXR0ZXJuLCBmbGFncyk7XG5cdH1cblxuXHRQcmlzbS5sYW5ndWFnZXMueWFtbCA9IHtcblx0XHQnc2NhbGFyJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKC8oW1xcLTpdXFxzKig/Olxcczw8cHJvcD4+WyBcXHRdKyk/W3w+XSlbIFxcdF0qKD86KCg/Olxccj9cXG58XFxyKVsgXFx0XSspXFxTW15cXHJcXG5dKig/OlxcMlteXFxyXFxuXSspKikvLnNvdXJjZVxuXHRcdFx0XHQucmVwbGFjZSgvPDxwcm9wPj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gcHJvcGVydGllczsgfSkpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHRcdH0sXG5cdFx0J2NvbW1lbnQnOiAvIy4qLyxcblx0XHQna2V5Jzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKC8oKD86XnxbOlxcLSxbe1xcclxcbj9dKVsgXFx0XSooPzo8PHByb3A+PlsgXFx0XSspPyk8PGtleT4+KD89XFxzKjpcXHMpLy5zb3VyY2Vcblx0XHRcdFx0LnJlcGxhY2UoLzw8cHJvcD4+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHByb3BlcnRpZXM7IH0pXG5cdFx0XHRcdC5yZXBsYWNlKC88PGtleT4+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuICcoPzonICsgcGxhaW5LZXkgKyAnfCcgKyBzdHJpbmcgKyAnKSc7IH0pKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ2F0cnVsZSdcblx0XHR9LFxuXHRcdCdkaXJlY3RpdmUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKSUuKy9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHRcdH0sXG5cdFx0J2RhdGV0aW1lJzoge1xuXHRcdFx0cGF0dGVybjogY3JlYXRlVmFsdWVQYXR0ZXJuKC9cXGR7NH0tXFxkXFxkPy1cXGRcXGQ/KD86W3RUXXxbIFxcdF0rKVxcZFxcZD86XFxkezJ9OlxcZHsyfSg/OlxcLlxcZCopPyg/OlsgXFx0XSooPzpafFstK11cXGRcXGQ/KD86OlxcZHsyfSk/KSk/fFxcZHs0fS1cXGR7Mn0tXFxkezJ9fFxcZFxcZD86XFxkezJ9KD86OlxcZHsyfSg/OlxcLlxcZCopPyk/Ly5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHRcdH0sXG5cdFx0J2Jvb2xlYW4nOiB7XG5cdFx0XHRwYXR0ZXJuOiBjcmVhdGVWYWx1ZVBhdHRlcm4oL2ZhbHNlfHRydWUvLnNvdXJjZSwgJ2knKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0XHR9LFxuXHRcdCdudWxsJzoge1xuXHRcdFx0cGF0dGVybjogY3JlYXRlVmFsdWVQYXR0ZXJuKC9udWxsfH4vLnNvdXJjZSwgJ2knKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0XHR9LFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiBjcmVhdGVWYWx1ZVBhdHRlcm4oc3RyaW5nKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdudW1iZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiBjcmVhdGVWYWx1ZVBhdHRlcm4oL1srLV0/KD86MHhbXFxkYS1mXSt8MG9bMC03XSt8KD86XFxkKyg/OlxcLlxcZCopP3xcXC5cXGQrKSg/OmVbKy1dP1xcZCspP3xcXC5pbmZ8XFwubmFuKS8uc291cmNlLCAnaScpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J3RhZyc6IHRhZyxcblx0XHQnaW1wb3J0YW50JzogYW5jaG9yT3JBbGlhcyxcblx0XHQncHVuY3R1YXRpb24nOiAvLS0tfFs6W1xcXXt9XFwtLHw+P118XFwuXFwuXFwuL1xuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy55bWwgPSBQcmlzbS5sYW5ndWFnZXMueWFtbDtcblxufShQcmlzbSkpO1xuXG4vLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9UZXN0X0FueXRoaW5nX1Byb3RvY29sXG5cblByaXNtLmxhbmd1YWdlcy50YXAgPSB7XG5cdCdmYWlsJzogL25vdCBva1teI3tcXG5cXHJdKi8sXG5cdCdwYXNzJzogL29rW14je1xcblxccl0qLyxcblx0J3ByYWdtYSc6IC9wcmFnbWEgWystXVthLXpdKy8sXG5cdCdiYWlsb3V0JzogL2JhaWwgb3V0IS4qL2ksXG5cdCd2ZXJzaW9uJzogL1RBUCB2ZXJzaW9uIFxcZCsvaSxcblx0J3BsYW4nOiAvXFxiXFxkK1xcLlxcLlxcZCsoPzogKyMuKik/Lyxcblx0J3N1YnRlc3QnOiB7XG5cdFx0cGF0dGVybjogLyMgU3VidGVzdCg/OjogLiopPy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdwdW5jdHVhdGlvbic6IC9be31dLyxcblx0J2RpcmVjdGl2ZSc6IC8jLiovLFxuXHQneWFtbGlzaCc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKS0tLVtcXHNcXFNdKj9bXFxyXFxuXVsgXFx0XSpcXC5cXC5cXC4kL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy55YW1sLFxuXHRcdGFsaWFzOiAnbGFuZ3VhZ2UteWFtbCdcblx0fVxufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnRjbCA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pIy4qLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86W15cIlxcXFxcXHJcXG5dfFxcXFwoPzpcXHJcXG58W1xcc1xcU10pKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCd2YXJpYWJsZSc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcJCkoPzo6Oik/KD86W2EtekEtWjAtOV0rOjopKlxcdysvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhcXCQpXFx7W159XStcXH0vLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyheW1xcdCBdKnNldFsgXFx0XSspKD86OjopPyg/OlthLXpBLVowLTldKzo6KSpcXHcrL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQnZnVuY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogLyheW1xcdCBdKnByb2NbIFxcdF0rKVxcUysvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdidWlsdGluJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXltcXHQgXSopKD86YnJlYWt8Y2xhc3N8Y29udGludWV8ZXJyb3J8ZXZhbHxleGl0fGZvcnxmb3JlYWNofGlmfHByb2N8cmV0dXJufHN3aXRjaHx3aGlsZSlcXGIvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdC9cXGIoPzplbHNlfGVsc2VpZilcXGIvXG5cdF0sXG5cdCdzY29wZSc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKSg/Omdsb2JhbHx1cHZhcnx2YXJpYWJsZSlcXGIvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnY29uc3RhbnQnXG5cdH0sXG5cdCdrZXl3b3JkJzoge1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSp8XFxbKSg/OlNhZmVfQmFzZXxUY2x8YWZ0ZXJ8YXBwZW5kfGFwcGx5fGFycmF5fGF1dG9fKD86ZXhlY29rfGltcG9ydHxsb2FkfG1raW5kZXh8cXVhbGlmeXxyZXNldCl8YXV0b21raW5kZXhfb2xkfGJnZXJyb3J8YmluYXJ5fGNhdGNofGNkfGNoYW58Y2xvY2t8Y2xvc2V8Y29uY2F0fGRkZXxkaWN0fGVuY29kaW5nfGVvZnxleGVjfGV4cHJ8ZmJsb2NrZWR8ZmNvbmZpZ3VyZXxmY29weXxmaWxlKD86ZXZlbnR8bmFtZSk/fGZsdXNofGdldHN8Z2xvYnxoaXN0b3J5fGh0dHB8aW5jcnxpbmZvfGludGVycHxqb2lufGxhcHBlbmR8bGFzc2lnbnxsaW5kZXh8bGluc2VydHxsaXN0fGxsZW5ndGh8bG9hZHxscmFuZ2V8bHJlcGVhdHxscmVwbGFjZXxscmV2ZXJzZXxsc2VhcmNofGxzZXR8bHNvcnR8bWF0aCg/OmZ1bmN8b3ApfG1lbW9yeXxtc2djYXR8bmFtZXNwYWNlfG9wZW58cGFja2FnZXxwYXJyYXl8cGlkfHBrZ19ta0luZGV4fHBsYXRmb3JtfHB1dHN8cHdkfHJlX3N5bnRheHxyZWFkfHJlZmNoYW58cmVnZXhwfHJlZ2lzdHJ5fHJlZ3N1YnxyZW5hbWV8c2NhbnxzZWVrfHNldHxzb2NrZXR8c291cmNlfHNwbGl0fHN0cmluZ3xzdWJzdHx0Y2woPzpfZW5kT2ZXb3JkfF9maW5kTGlicmFyeXxzdGFydE9mKD86TmV4dHxQcmV2aW91cylXb3JkfHRlc3R8dmFyc3x3b3JkQnJlYWsoPzpBZnRlcnxCZWZvcmUpKXx0ZWxsfHRpbWV8dG18dHJhY2V8dW5rbm93bnx1bmxvYWR8dW5zZXR8dXBkYXRlfHVwbGV2ZWx8dndhaXQpXFxiL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnb3BlcmF0b3InOiAvIT0/fFxcKlxcKj98PT18JiY/fFxcfFxcfD98PFs9PF0/fD5bPT5dP3xbLSt+XFwvJT9eXXxcXGIoPzplcXxpbnxuZXxuaSlcXGIvLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9KClcXFtcXF1dL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdFByaXNtLmxhbmd1YWdlcy50dDIgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0XHQnY29tbWVudCc6IC8jLip8XFxbJSNbXFxzXFxTXSo/JVxcXS8sXG5cdFx0J2tleXdvcmQnOiAvXFxiKD86QkxPQ0t8Q0FMTHxDQVNFfENBVENIfENMRUFSfERFQlVHfERFRkFVTFR8RUxTRXxFTFNJRnxFTkR8RklMVEVSfEZJTkFMfEZPUkVBQ0h8R0VUfElGfElOfElOQ0xVREV8SU5TRVJUfExBU1R8TUFDUk98TUVUQXxORVhUfFBFUkx8UFJPQ0VTU3xSQVdQRVJMfFJFVFVSTnxTRVR8U1RPUHxTV0lUQ0h8VEFHU3xUSFJPV3xUUll8VU5MRVNTfFVTRXxXSElMRXxXUkFQUEVSKVxcYi8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1tbXFxde30sKCldL1xuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCd0dDInLCAnbnVtYmVyJywge1xuXHRcdCdvcGVyYXRvcic6IC89Wz49XT98IT0/fDw9P3w+PT98JiZ8XFx8XFx8P3xcXGIoPzphbmR8bm90fG9yKVxcYi8sXG5cdFx0J3ZhcmlhYmxlJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYlthLXpdXFx3Kig/OlxccypcXC5cXHMqKD86XFxkK3xcXCQ/W2Etel1cXHcqKSkqXFxiL2lcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3R0MicsICdrZXl3b3JkJywge1xuXHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXig/OlxcWyV8JSUpLT98LT8lXFxdJC8sXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgndHQyJywgJ3N0cmluZycsIHtcblx0XHQnc2luZ2xlLXF1b3RlZC1zdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvJ1teXFxcXCddKig/OlxcXFxbXFxzXFxTXVteXFxcXCddKikqJy8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ3N0cmluZydcblx0XHR9LFxuXHRcdCdkb3VibGUtcXVvdGVkLXN0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9cIlteXFxcXFwiXSooPzpcXFxcW1xcc1xcU11bXlxcXFxcIl0qKSpcIi8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ3N0cmluZycsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3ZhcmlhYmxlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9cXCQoPzpbYS16XVxcdyooPzpcXC4oPzpcXGQrfFxcJD9bYS16XVxcdyopKSopL2lcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0Ly8gVGhlIGRpZmZlcmVudCB0eXBlcyBvZiBUVDIgc3RyaW5ncyBcInJlcGxhY2VcIiB0aGUgQy1saWtlIHN0YW5kYXJkIHN0cmluZ1xuXHRkZWxldGUgUHJpc20ubGFuZ3VhZ2VzLnR0Mi5zdHJpbmc7XG5cblx0UHJpc20uaG9va3MuYWRkKCdiZWZvcmUtdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0dmFyIHR0MlBhdHRlcm4gPSAvXFxbJVtcXHNcXFNdKz8lXFxdL2c7XG5cdFx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLmJ1aWxkUGxhY2Vob2xkZXJzKGVudiwgJ3R0MicsIHR0MlBhdHRlcm4pO1xuXHR9KTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2FmdGVyLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS50b2tlbml6ZVBsYWNlaG9sZGVycyhlbnYsICd0dDInKTtcblx0fSk7XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHQvLyBXZSBkb24ndCBhbGxvdyBmb3IgcGlwZXMgaW5zaWRlIHBhcmVudGhlc2VzXG5cdC8vIHRvIG5vdCBicmVhayB0YWJsZSBwYXR0ZXJuIHwoLiBmb28gfCkuIGJhciB8XG5cdHZhciBtb2RpZmllclJlZ2V4ID0gL1xcKFtefCgpXFxuXStcXCl8XFxbW15cXF1cXG5dK1xcXXxcXHtbXn1cXG5dK1xcfS8uc291cmNlO1xuXHQvLyBPcGVuaW5nIGFuZCBjbG9zaW5nIHBhcmVudGhlc2VzIHdoaWNoIGFyZSBub3QgYSBtb2RpZmllclxuXHQvLyBUaGlzIHBhdHRlcm4gaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgZXhwb25lbnRpYWwgYmFja3RyYWNraW5nXG5cdHZhciBwYXJlbnRoZXNlc1JlZ2V4ID0gL1xcKXxcXCgoPyFbXnwoKVxcbl0rXFwpKS8uc291cmNlO1xuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2ZsYWdzXVxuXHQgKi9cblx0ZnVuY3Rpb24gd2l0aE1vZGlmaWVyKHNvdXJjZSwgZmxhZ3MpIHtcblx0XHRyZXR1cm4gUmVnRXhwKFxuXHRcdFx0c291cmNlXG5cdFx0XHRcdC5yZXBsYWNlKC88TU9EPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiAnKD86JyArIG1vZGlmaWVyUmVnZXggKyAnKSc7IH0pXG5cdFx0XHRcdC5yZXBsYWNlKC88UEFSPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiAnKD86JyArIHBhcmVudGhlc2VzUmVnZXggKyAnKSc7IH0pLFxuXHRcdFx0ZmxhZ3MgfHwgJycpO1xuXHR9XG5cblx0dmFyIG1vZGlmaWVyVG9rZW5zID0ge1xuXHRcdCdjc3MnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFx7W157fV0rXFx9Lyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRyZXN0OiBQcmlzbS5sYW5ndWFnZXMuY3NzXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnY2xhc3MtaWQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcKClbXigpXSsoPz1cXCkpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2F0dHItdmFsdWUnXG5cdFx0fSxcblx0XHQnbGFuZyc6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxbKVteXFxbXFxdXSsoPz1cXF0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2F0dHItdmFsdWUnXG5cdFx0fSxcblx0XHQvLyBBbnl0aGluZyBlbHNlIGlzIHB1bmN0dWF0aW9uICh0aGUgZmlyc3QgcGF0dGVybiBpcyBmb3Igcm93L2NvbCBzcGFucyBpbnNpZGUgdGFibGVzKVxuXHRcdCdwdW5jdHVhdGlvbic6IC9bXFxcXFxcL11cXGQrfFxcUy9cblx0fTtcblxuXG5cdHZhciB0ZXh0aWxlID0gUHJpc20ubGFuZ3VhZ2VzLnRleHRpbGUgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdtYXJrdXAnLCB7XG5cdFx0J3BocmFzZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxcXHJ8XFxuKVxcU1tcXHNcXFNdKj8oPz0kfFxccj9cXG5cXHI/XFxufFxcclxccikvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXG5cdFx0XHRcdC8vIGgxLiBIZWFkZXIgMVxuXHRcdFx0XHQnYmxvY2stdGFnJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IHdpdGhNb2RpZmllcigvXlthLXpdXFx3Kig/OjxNT0Q+fDxQQVI+fFs8Pj1dKSpcXC4vLnNvdXJjZSksXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQnbW9kaWZpZXInOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IHdpdGhNb2RpZmllcigvKF5bYS16XVxcdyopKD86PE1PRD58PFBBUj58Wzw+PV0pKyg/PVxcLikvLnNvdXJjZSksXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGluc2lkZTogbW9kaWZpZXJUb2tlbnNcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQndGFnJzogL15bYS16XVxcdyovLFxuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLiQvXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vICMgTGlzdCBpdGVtXG5cdFx0XHRcdC8vICogTGlzdCBpdGVtXG5cdFx0XHRcdCdsaXN0Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IHdpdGhNb2RpZmllcigvXlsqI10rPE1PRD4qXFxzK1xcUy4qLy5zb3VyY2UsICdtJyksXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQnbW9kaWZpZXInOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IHdpdGhNb2RpZmllcigvKF5bKiNdKyk8TU9EPisvLnNvdXJjZSksXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGluc2lkZTogbW9kaWZpZXJUb2tlbnNcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlsqI10rL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyB8IGNlbGwgfCBjZWxsIHwgY2VsbCB8XG5cdFx0XHRcdCd0YWJsZSc6IHtcblx0XHRcdFx0XHQvLyBNb2RpZmllcnMgY2FuIGJlIGFwcGxpZWQgdG8gdGhlIHJvdzoge2NvbG9yOnJlZH0ufDF8MnwzfFxuXHRcdFx0XHRcdC8vIG9yIHRoZSBjZWxsOiB8e2NvbG9yOnJlZH0uMXwyfDN8XG5cdFx0XHRcdFx0cGF0dGVybjogd2l0aE1vZGlmaWVyKC9eKD86KD86PE1PRD58PFBBUj58Wzw+PV5+XSkrXFwuXFxzKik/KD86XFx8KD86KD86PE1PRD58PFBBUj58Wzw+PV5+X118W1xcXFwvXVxcZCspK1xcLnwoPyEoPzo8TU9EPnw8UEFSPnxbPD49Xn5fXXxbXFxcXC9dXFxkKykrXFwuKSlbXnxdKikrXFx8Ly5zb3VyY2UsICdtJyksXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQnbW9kaWZpZXInOiB7XG5cdFx0XHRcdFx0XHRcdC8vIE1vZGlmaWVycyBmb3Igcm93cyBhZnRlciB0aGUgZmlyc3Qgb25lIGFyZVxuXHRcdFx0XHRcdFx0XHQvLyBwcmVjZWRlZCBieSBhIHBpcGUgYW5kIGEgbGluZSBmZWVkXG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IHdpdGhNb2RpZmllcigvKF58XFx8KD86XFxyP1xcbnxcXHIpPykoPzo8TU9EPnw8UEFSPnxbPD49Xn5fXXxbXFxcXC9dXFxkKykrKD89XFwuKS8uc291cmNlKSxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0aW5zaWRlOiBtb2RpZmllclRva2Vuc1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXHx8XlxcLi9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0J2lubGluZSc6IHtcblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLXN1cGVyLWxpbmVhci1iYWNrdHJhY2tpbmdcblx0XHRcdFx0XHRwYXR0ZXJuOiB3aXRoTW9kaWZpZXIoLyhefFteYS16QS1aXFxkXSkoXFwqXFwqfF9ffFxcP1xcP3xbKl8lQCtcXC1efl0pPE1PRD4qLis/XFwyKD8hW2EtekEtWlxcZF0pLy5zb3VyY2UpLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQvLyBOb3RlOiBzdXBlcnNjcmlwdHMgYW5kIHN1YnNjcmlwdHMgYXJlIG5vdCBoYW5kbGVkIHNwZWNpZmljYWxseVxuXG5cdFx0XHRcdFx0XHQvLyAqYm9sZCosICoqYm9sZCoqXG5cdFx0XHRcdFx0XHQnYm9sZCc6IHtcblx0XHRcdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9uby1zdXBlci1saW5lYXItYmFja3RyYWNraW5nXG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IHdpdGhNb2RpZmllcigvKF4oXFwqXFwqPyk8TU9EPiopLis/KD89XFwyKS8uc291cmNlKSxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdFx0Ly8gX2l0YWxpY18sIF9faXRhbGljX19cblx0XHRcdFx0XHRcdCdpdGFsaWMnOiB7XG5cdFx0XHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvbm8tc3VwZXItbGluZWFyLWJhY2t0cmFja2luZ1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiB3aXRoTW9kaWZpZXIoLyheKF9fPyk8TU9EPiopLis/KD89XFwyKS8uc291cmNlKSxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdFx0Ly8gPz9jaXRlPz9cblx0XHRcdFx0XHRcdCdjaXRlJzoge1xuXHRcdFx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLXN1cGVyLWxpbmVhci1iYWNrdHJhY2tpbmdcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogd2l0aE1vZGlmaWVyKC8oXlxcP1xcPzxNT0Q+KikuKz8oPz1cXD9cXD8pLy5zb3VyY2UpLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRhbGlhczogJ3N0cmluZydcblx0XHRcdFx0XHRcdH0sXG5cblx0XHRcdFx0XHRcdC8vIEBjb2RlQFxuXHRcdFx0XHRcdFx0J2NvZGUnOiB7XG5cdFx0XHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvbm8tc3VwZXItbGluZWFyLWJhY2t0cmFja2luZ1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiB3aXRoTW9kaWZpZXIoLyheQDxNT0Q+KikuKz8oPz1AKS8uc291cmNlKSxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdFx0Ly8gK2luc2VydGVkK1xuXHRcdFx0XHRcdFx0J2luc2VydGVkJzoge1xuXHRcdFx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLXN1cGVyLWxpbmVhci1iYWNrdHJhY2tpbmdcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogd2l0aE1vZGlmaWVyKC8oXlxcKzxNT0Q+KikuKz8oPz1cXCspLy5zb3VyY2UpLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0XHQvLyAtZGVsZXRlZC1cblx0XHRcdFx0XHRcdCdkZWxldGVkJzoge1xuXHRcdFx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLXN1cGVyLWxpbmVhci1iYWNrdHJhY2tpbmdcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogd2l0aE1vZGlmaWVyKC8oXi08TU9EPiopLis/KD89LSkvLnNvdXJjZSksXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdH0sXG5cblx0XHRcdFx0XHRcdC8vICVzcGFuJVxuXHRcdFx0XHRcdFx0J3NwYW4nOiB7XG5cdFx0XHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvbm8tc3VwZXItbGluZWFyLWJhY2t0cmFja2luZ1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiB3aXRoTW9kaWZpZXIoLyheJTxNT0Q+KikuKz8oPz0lKS8uc291cmNlKSxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdFx0J21vZGlmaWVyJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiB3aXRoTW9kaWZpZXIoLyheXFwqXFwqfF9ffFxcP1xcP3xbKl8lQCtcXC1efl0pPE1PRD4rLy5zb3VyY2UpLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRpbnNpZGU6IG1vZGlmaWVyVG9rZW5zXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1sqXyU/QCtcXC1efl0rL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBbYWxpYXNdaHR0cDovL2V4YW1wbGUuY29tXG5cdFx0XHRcdCdsaW5rLXJlZic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcW1teXFxdXStcXF1cXFMrJC9tLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3N0cmluZyc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyheXFxbKVteXFxdXSsoPz1cXF0pLyxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCd1cmwnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8oXlxcXSlcXFMrJC8sXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvW1xcW1xcXV0vXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFwidGV4dFwiOmh0dHA6Ly9leGFtcGxlLmNvbVxuXHRcdFx0XHQvLyBcInRleHRcIjpsaW5rLXJlZlxuXHRcdFx0XHQnbGluayc6IHtcblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLXN1cGVyLWxpbmVhci1iYWNrdHJhY2tpbmdcblx0XHRcdFx0XHRwYXR0ZXJuOiB3aXRoTW9kaWZpZXIoL1wiPE1PRD4qW15cIl0rXCI6Lis/KD89W15cXHcvXT8oPzpcXHN8JCkpLy5zb3VyY2UpLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3RleHQnOiB7XG5cdFx0XHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvbm8tc3VwZXItbGluZWFyLWJhY2t0cmFja2luZ1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiB3aXRoTW9kaWZpZXIoLyheXCI8TU9EPiopW15cIl0rKD89XCIpLy5zb3VyY2UpLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J21vZGlmaWVyJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiB3aXRoTW9kaWZpZXIoLyheXCIpPE1PRD4rLy5zb3VyY2UpLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRpbnNpZGU6IG1vZGlmaWVyVG9rZW5zXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J3VybCc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyg6KS4rLyxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bXCI6XS9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gIWltYWdlLmpwZyFcblx0XHRcdFx0Ly8gIWltYWdlLmpwZyhUaXRsZSkhOmh0dHA6Ly9leGFtcGxlLmNvbVxuXHRcdFx0XHQnaW1hZ2UnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogd2l0aE1vZGlmaWVyKC8hKD86PE1PRD58PFBBUj58Wzw+PV0pKig/IVs8Pj1dKVteIVxccygpXSsoPzpcXChbXildK1xcKSk/ISg/OjouKz8oPz1bXlxcdy9dPyg/Olxcc3wkKSkpPy8uc291cmNlKSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdzb3VyY2UnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IHdpdGhNb2RpZmllcigvKF4hKD86PE1PRD58PFBBUj58Wzw+PV0pKikoPyFbPD49XSlbXiFcXHMoKV0rKD86XFwoW14pXStcXCkpPyg/PSEpLy5zb3VyY2UpLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRhbGlhczogJ3VybCdcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQnbW9kaWZpZXInOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IHdpdGhNb2RpZmllcigvKF4hKSg/OjxNT0Q+fDxQQVI+fFs8Pj1dKSsvLnNvdXJjZSksXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGluc2lkZTogbW9kaWZpZXJUb2tlbnNcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQndXJsJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKDopLisvLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1shOl0vXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIEZvb3Rub3RlWzFdXG5cdFx0XHRcdCdmb290bm90ZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxiXFxbXFxkK1xcXS8sXG5cdFx0XHRcdFx0YWxpYXM6ICdjb21tZW50Jyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXFt8XFxdL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBDU1MoQ2FzY2FkaW5nIFN0eWxlIFNoZWV0KVxuXHRcdFx0XHQnYWNyb255bSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxiW0EtWlxcZF0rXFwoW14pXStcXCkvLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8oXFwoKVteKCldKyg/PVxcKSkvLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1soKV0vXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFByaXNtKEMpXG5cdFx0XHRcdCdtYXJrJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9cXGJcXCgoPzpDfFJ8VE0pXFwpLyxcblx0XHRcdFx0XHRhbGlhczogJ2NvbW1lbnQnLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1soKV0vXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHR2YXIgcGhyYXNlSW5zaWRlID0gdGV4dGlsZVsncGhyYXNlJ10uaW5zaWRlO1xuXHR2YXIgbmVzdGVkUGF0dGVybnMgPSB7XG5cdFx0J2lubGluZSc6IHBocmFzZUluc2lkZVsnaW5saW5lJ10sXG5cdFx0J2xpbmsnOiBwaHJhc2VJbnNpZGVbJ2xpbmsnXSxcblx0XHQnaW1hZ2UnOiBwaHJhc2VJbnNpZGVbJ2ltYWdlJ10sXG5cdFx0J2Zvb3Rub3RlJzogcGhyYXNlSW5zaWRlWydmb290bm90ZSddLFxuXHRcdCdhY3JvbnltJzogcGhyYXNlSW5zaWRlWydhY3JvbnltJ10sXG5cdFx0J21hcmsnOiBwaHJhc2VJbnNpZGVbJ21hcmsnXVxuXHR9O1xuXG5cdC8vIE9ubHkgYWxsb3cgYWxwaGEtbnVtZXJpYyBIVE1MIHRhZ3MsIG5vdCBYTUwgdGFnc1xuXHR0ZXh0aWxlLnRhZy5wYXR0ZXJuID0gLzxcXC8/KD8hXFxkKVthLXowLTldKyg/OlxccytbXlxccz5cXC89XSsoPzo9KD86KFwifCcpKD86XFxcXFtcXHNcXFNdfCg/IVxcMSlbXlxcXFxdKSpcXDF8W15cXHMnXCI+PV0rKSk/KSpcXHMqXFwvPz4vaTtcblxuXHQvLyBBbGxvdyBzb21lIG5lc3Rpbmdcblx0dmFyIHBocmFzZUlubGluZUluc2lkZSA9IHBocmFzZUluc2lkZVsnaW5saW5lJ10uaW5zaWRlO1xuXHRwaHJhc2VJbmxpbmVJbnNpZGVbJ2JvbGQnXS5pbnNpZGUgPSBuZXN0ZWRQYXR0ZXJucztcblx0cGhyYXNlSW5saW5lSW5zaWRlWydpdGFsaWMnXS5pbnNpZGUgPSBuZXN0ZWRQYXR0ZXJucztcblx0cGhyYXNlSW5saW5lSW5zaWRlWydpbnNlcnRlZCddLmluc2lkZSA9IG5lc3RlZFBhdHRlcm5zO1xuXHRwaHJhc2VJbmxpbmVJbnNpZGVbJ2RlbGV0ZWQnXS5pbnNpZGUgPSBuZXN0ZWRQYXR0ZXJucztcblx0cGhyYXNlSW5saW5lSW5zaWRlWydzcGFuJ10uaW5zaWRlID0gbmVzdGVkUGF0dGVybnM7XG5cblx0Ly8gQWxsb3cgc29tZSBzdHlsZXMgaW5zaWRlIHRhYmxlIGNlbGxzXG5cdHZhciBwaHJhc2VUYWJsZUluc2lkZSA9IHBocmFzZUluc2lkZVsndGFibGUnXS5pbnNpZGU7XG5cdHBocmFzZVRhYmxlSW5zaWRlWydpbmxpbmUnXSA9IG5lc3RlZFBhdHRlcm5zWydpbmxpbmUnXTtcblx0cGhyYXNlVGFibGVJbnNpZGVbJ2xpbmsnXSA9IG5lc3RlZFBhdHRlcm5zWydsaW5rJ107XG5cdHBocmFzZVRhYmxlSW5zaWRlWydpbWFnZSddID0gbmVzdGVkUGF0dGVybnNbJ2ltYWdlJ107XG5cdHBocmFzZVRhYmxlSW5zaWRlWydmb290bm90ZSddID0gbmVzdGVkUGF0dGVybnNbJ2Zvb3Rub3RlJ107XG5cdHBocmFzZVRhYmxlSW5zaWRlWydhY3JvbnltJ10gPSBuZXN0ZWRQYXR0ZXJuc1snYWNyb255bSddO1xuXHRwaHJhc2VUYWJsZUluc2lkZVsnbWFyayddID0gbmVzdGVkUGF0dGVybnNbJ21hcmsnXTtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGtleSA9IC8oPzpbXFx3LV0rfCdbXidcXG5cXHJdKid8XCIoPzpcXFxcLnxbXlxcXFxcIlxcclxcbl0pKlwiKS8uc291cmNlO1xuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVyblxuXHQgKi9cblx0ZnVuY3Rpb24gaW5zZXJ0S2V5KHBhdHRlcm4pIHtcblx0XHRyZXR1cm4gcGF0dGVybi5yZXBsYWNlKC9fXy9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBrZXk7IH0pO1xuXHR9XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnRvbWwgPSB7XG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvIy4qLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J3RhYmxlJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKGluc2VydEtleSgvKF5bXFx0IF0qXFxbXFxzKig/OlxcW1xccyopPylfXyg/OlxccypcXC5cXHMqX18pKig/PVxccypcXF0pLy5zb3VyY2UpLCAnbScpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0XHR9LFxuXHRcdCdrZXknOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoaW5zZXJ0S2V5KC8oXltcXHQgXSp8W3ssXVxccyopX18oPzpcXHMqXFwuXFxzKl9fKSooPz1cXHMqPSkvLnNvdXJjZSksICdtJyksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0XHR9LFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXCJcIlwiKD86XFxcXFtcXHNcXFNdfFteXFxcXF0pKj9cIlwiXCJ8JycnW1xcc1xcU10qPycnJ3wnW14nXFxuXFxyXSonfFwiKD86XFxcXC58W15cXFxcXCJcXHJcXG5dKSpcIi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdkYXRlJzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyBPZmZzZXQgRGF0ZS1UaW1lLCBMb2NhbCBEYXRlLVRpbWUsIExvY2FsIERhdGVcblx0XHRcdFx0cGF0dGVybjogL1xcYlxcZHs0fS1cXGR7Mn0tXFxkezJ9KD86W1RcXHNdXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGQrKT8oPzpafFsrLV1cXGR7Mn06XFxkezJ9KT8pP1xcYi9pLFxuXHRcdFx0XHRhbGlhczogJ251bWJlcidcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIExvY2FsIFRpbWVcblx0XHRcdFx0cGF0dGVybjogL1xcYlxcZHsyfTpcXGR7Mn06XFxkezJ9KD86XFwuXFxkKyk/XFxiLyxcblx0XHRcdFx0YWxpYXM6ICdudW1iZXInXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnbnVtYmVyJzogLyg/OlxcYjAoPzp4W1xcZGEtekEtWl0rKD86X1tcXGRhLXpBLVpdKykqfG9bMC03XSsoPzpfWzAtN10rKSp8YlsxMF0rKD86X1sxMF0rKSopKVxcYnxbLStdP1xcYlxcZCsoPzpfXFxkKykqKD86XFwuXFxkKyg/Ol9cXGQrKSopPyg/OltlRV1bKy1dP1xcZCsoPzpfXFxkKykqKT9cXGJ8Wy0rXT9cXGIoPzppbmZ8bmFuKVxcYi8sXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bLiw9W1xcXXt9XS9cblx0fTtcbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdFByaXNtLmxhbmd1YWdlcy50cmVtb3IgPSB7XG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkoPzpcXC9cXCpbXFxzXFxTXSo/XFwqXFwvfCg/Oi0tfFxcL1xcL3wjKS4qKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnaW50ZXJwb2xhdGVkLXN0cmluZyc6IG51bGwsIC8vIHNlZSBiZWxvd1xuXHRcdCdleHRyYWN0b3InOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiW2Etel9dXFx3KlxcfCg/OlteXFxyXFxuXFxcXHxdfFxcXFwoPzpcXHJcXG58W1xcc1xcU10pKSpcXHwvaSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncmVnZXgnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhecmUpXFx8W1xcc1xcU10rLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdmdW5jdGlvbic6IC9eXFx3Ky8sXG5cdFx0XHRcdCd2YWx1ZSc6IC9cXHxbXFxzXFxTXSsvXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnaWRlbnRpZmllcic6IHtcblx0XHRcdHBhdHRlcm46IC9gW15gXSpgLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cblx0XHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVxccyooPzo6Olxccyo8fFxcKCkpXFxiLyxcblxuXHRcdCdrZXl3b3JkJzogL1xcYig/OmFyZ3N8YXN8Ynl8Y2FzZXxjb25maWd8Y29ubmVjdHxjb25uZWN0b3J8Y29uc3R8Y29weXxjcmVhdGV8ZGVmYXVsdHxkZWZpbmV8ZGVwbG95fGRyb3B8ZWFjaHxlbWl0fGVuZHxlcmFzZXxldmVudHxmbG93fGZufGZvcnxmcm9tfGdyb3VwfGhhdmluZ3xpbnNlcnR8aW50b3xpbnRyaW5zaWN8bGV0fGxpbmtzfG1hdGNofG1lcmdlfG1vZHxtb3ZlfG9mfG9wZXJhdG9yfHBhdGNofHBpcGVsaW5lfHJlY3VyfHNjcmlwdHxzZWxlY3R8c2V0fHNsaWRpbmd8c3RhdGV8c3RyZWFtfHRvfHR1bWJsaW5nfHVwZGF0ZXx1c2V8d2hlbnx3aGVyZXx3aW5kb3d8d2l0aClcXGIvLFxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfG51bGx8dHJ1ZSlcXGIvaSxcblxuXHRcdCdudW1iZXInOiAvXFxiKD86MGJbMDFfXSp8MHhbMC05YS1mQS1GX10qfFxcZFtcXGRfXSooPzpcXC5cXGRbXFxkX10qKT8oPzpbRWVdWystXT9bXFxkX10rKT8pXFxiLyxcblxuXHRcdCdwYXR0ZXJuLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyUoPz1bKHtbXSkvLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXHRcdCdvcGVyYXRvcic6IC9bLSsqXFwvJX4hXl09P3w9Wz0+XT98JlsmPV0/fFxcfFt8PV0/fDw8Pz0/fD4+Pz4/PT98KD86YWJzZW50fGFuZHxub3R8b3J8cHJlc2VudHx4b3IpXFxiLyxcblx0XHQncHVuY3R1YXRpb24nOiAvOjp8WztcXFtcXF0oKVxce1xcfSwuOl0vLFxuXHR9O1xuXG5cdHZhciBpbnRlcnBvbGF0aW9uUGF0dGVybiA9IC8jXFx7KD86W15cInt9XXxcXHtbXnt9XSpcXH18XCIoPzpbXlwiXFxcXFxcclxcbl18XFxcXCg/OlxcclxcbnxbXFxzXFxTXSkpKlwiKSpcXH0vLnNvdXJjZTtcblxuXHRQcmlzbS5sYW5ndWFnZXMudHJlbW9yWydpbnRlcnBvbGF0ZWQtc3RyaW5nJ10gPSB7XG5cdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0LyhefFteXFxcXF0pLy5zb3VyY2UgK1xuXHRcdFx0Jyg/OicgK1xuXHRcdFx0J1wiXCJcIig/OicgKyAvW15cIlxcXFwjXXxcXFxcW1xcc1xcU118XCIoPyFcIlwiKXwjKD8hXFx7KS8uc291cmNlICsgJ3wnICsgaW50ZXJwb2xhdGlvblBhdHRlcm4gKyAnKSpcIlwiXCInICtcblx0XHRcdCd8JyArXG5cdFx0XHQnXCIoPzonICsgL1teXCJcXFxcXFxyXFxuI118XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8Iyg/IVxceykvLnNvdXJjZSArICd8JyArIGludGVycG9sYXRpb25QYXR0ZXJuICsgJykqXCInICtcblx0XHRcdCcpJ1xuXHRcdCksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKGludGVycG9sYXRpb25QYXR0ZXJuKSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL14jXFx7fFxcfSQvLFxuXHRcdFx0XHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy50cmVtb3Jcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHR9XG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnRyb3kgPSBQcmlzbS5sYW5ndWFnZXNbJ3RyZW1vciddO1xuXHRQcmlzbS5sYW5ndWFnZXMudHJpY2tsZSA9IFByaXNtLmxhbmd1YWdlc1sndHJlbW9yJ107XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLnR3aWcgPSB7XG5cdCdjb21tZW50JzogL15cXHsjW1xcc1xcU10qPyNcXH0kLyxcblxuXHQndGFnLW5hbWUnOiB7XG5cdFx0cGF0dGVybjogLyheXFx7JS0/XFxzKilcXHcrLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J2RlbGltaXRlcic6IHtcblx0XHRwYXR0ZXJuOiAvXlxce1t7JV0tP3wtP1slfV1cXH0kLyxcblx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHR9LFxuXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhcInwnKSg/OlxcXFwufCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL15bJ1wiXXxbJ1wiXSQvXG5cdFx0fVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzpldmVufGlmfG9kZClcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXxudWxsfHRydWUpXFxiLyxcblx0J251bWJlcic6IC9cXGIweFtcXGRBLUZhLWZdK3woPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86W0VlXVstK10/XFxkKyk/Lyxcblx0J29wZXJhdG9yJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXFxzKSg/OmFuZHxiLWFuZHxiLW9yfGIteG9yfGVuZHMgd2l0aHxpbnxpc3xtYXRjaGVzfG5vdHxvcnxzYW1lIGFzfHN0YXJ0cyB3aXRoKSg/PVxccykvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0L1s9PD5dPT98IT18XFwqXFwqP3xcXC9cXC8/fFxcPzo/fFstK34lfF0vXG5cdF0sXG5cdCdwdW5jdHVhdGlvbic6IC9bKClcXFtcXF17fTouLF0vXG59O1xuXG5QcmlzbS5ob29rcy5hZGQoJ2JlZm9yZS10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0aWYgKGVudi5sYW5ndWFnZSAhPT0gJ3R3aWcnKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0dmFyIHBhdHRlcm4gPSAvXFx7KD86I1tcXHNcXFNdKj8jfCVbXFxzXFxTXSo/JXxcXHtbXFxzXFxTXSo/XFx9KVxcfS9nO1xuXHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10uYnVpbGRQbGFjZWhvbGRlcnMoZW52LCAndHdpZycsIHBhdHRlcm4pO1xufSk7XG5cblByaXNtLmhvb2tzLmFkZCgnYWZ0ZXItdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS50b2tlbml6ZVBsYWNlaG9sZGVycyhlbnYsICd0d2lnJyk7XG59KTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBrZXl3b3JkcyA9IC9cXGIoPzpBQ1R8QUNUSUZTVUJ8Q0FSUkFZfENBU0V8Q0xFQVJHSUZ8Q09BfENPQV9JTlR8Q09OU1RBTlRTfENPTlRFTlR8Q1VSfEVESVRQQU5FTHxFRkZFQ1R8RVhUfEZJTEV8RkxVSURURU1QTEFURXxGT1JNfEZSQU1FfEZSQU1FU0VUfEdJRkJVSUxERVJ8R01FTlV8R01FTlVfRk9MRE9VVHxHTUVOVV9MQVlFUlN8R1B8SE1FTlV8SFJVTEVSfEhUTUx8SUVOVnxJRlNVQnxJTUFHRXxJTUdNRU5VfElNR01FTlVJVEVNfElNR1RFWFR8SU1HX1JFU09VUkNFfElOQ0xVREVfVFlQT1NDUklQVHxKU01FTlV8SlNNRU5VSVRFTXxMTEx8TE9BRF9SRUdJU1RFUnxOT3xQQUdFfFJFQ09SRFN8UkVTVE9SRV9SRUdJU1RFUnxURU1QTEFURXxURVhUfFRNRU5VfFRNRU5VSVRFTXxUTUVOVV9MQVlFUlN8VVNFUnxVU0VSX0lOVHxfR0lGQlVJTERFUnxnbG9iYWx8Z2xvYmFsU3RyaW5nfGdsb2JhbFZhcilcXGIvO1xuXG5cdFByaXNtLmxhbmd1YWdlcy50eXBvc2NyaXB0ID0ge1xuXHRcdCdjb21tZW50JzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyBtdWx0aWxpbmUgY29tbWVudHMgLyogKi9cblx0XHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pXFwvXFwqW1xcc1xcU10qPyg/OlxcKlxcL3wkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGRvdWJsZS1zbGFzaCBjb21tZW50cyAtIGlnbm9yZWQgd2hlbiBiYWNrc2xhc2hlcyBvciBjb2xvbiBpcyBmb3VuZCBpbiBmcm9udFxuXHRcdFx0XHQvLyBhbHNvIGlnbm9yZWQgd2hlbmV2ZXIgZGlyZWN0bHkgYWZ0ZXIgYW4gZXF1YWwtc2lnbiwgYmVjYXVzZSBpdCB3b3VsZCBwcm9iYWJseSBiZSBhbiB1cmwgd2l0aG91dCBwcm90b2NvbFxuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcOj0gXFx0XXwoPzpefFtePSBcXHRdKVsgXFx0XSspXFwvXFwvLiovLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGhhc2ggY29tbWVudHMgLSBpZ25vcmVkIHdoZW4gbGVhZGluZyBxdW90ZSBpcyBmb3VuZCBmb3IgaGV4IGNvbG9ycyBpbiBzdHJpbmdzXG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlwiJ10pIy4qLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnZnVuY3Rpb24nOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vIG9sZCBpbmNsdWRlIHN0eWxlXG5cdFx0XHRcdHBhdHRlcm46IC88SU5DTFVERV9UWVBPU0NSSVBUOlxccypzb3VyY2VcXHMqPVxccyooPzpcIlteXCJcXHJcXG5dKlwifCdbXidcXHJcXG5dKicpXFxzKj4vLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnc3RyaW5nJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1wiW15cIlxcclxcbl0qXCJ8J1teJ1xcclxcbl0qJy8sXG5cdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0J2tleXdvcmQnOiBrZXl3b3Jkcyxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQna2V5d29yZCc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9JTkNMVURFX1RZUE9TQ1JJUFQvLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBuZXcgaW5jbHVkZSBzdHlsZVxuXHRcdFx0XHRwYXR0ZXJuOiAvQGltcG9ydFxccyooPzpcIlteXCJcXHJcXG5dKlwifCdbXidcXHJcXG5dKicpLyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3N0cmluZyc6IC9cIlteXCJcXHJcXG5dKlwifCdbXidcXHJcXG5dKicvLFxuXHRcdFx0XHR9LFxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9eKFtePV0qPVs8IF0/KSg/Oig/IVxcXVxcbikuKSovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZnVuY3Rpb24nOiAvXFx7XFwkLipcXH0vLCAvLyBjb25zdGFudHMgaW5jbHVkZVxuXHRcdFx0XHQna2V5d29yZCc6IGtleXdvcmRzLFxuXHRcdFx0XHQnbnVtYmVyJzogL15cXGQrJC8sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bLHw6XS8sXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQna2V5d29yZCc6IGtleXdvcmRzLFxuXHRcdCdudW1iZXInOiB7XG5cdFx0XHQvLyBzcGVjaWFsIGhpZ2hsaWdodGluZyBmb3IgaW5kZXhlcyBvZiBhcnJheXMgaW4gdGFnc1xuXHRcdFx0cGF0dGVybjogL1xcYlxcZCtcXHMqWy57PV0vLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdvcGVyYXRvcic6IC9bLns9XS8sXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQndGFnJzoge1xuXHRcdFx0cGF0dGVybjogL1xcLj9bLVxcd1xcXFxdK1xcLj8vLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vLFxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF07KCksLjp8XS8sXG5cdFx0J29wZXJhdG9yJzogL1s8Pl09P3xbIT1dPT89P3wtLT98XFwrXFwrP3wmJj98XFx8XFx8P3xbPyovfl4lXS8sXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnRzY29uZmlnID0gUHJpc20ubGFuZ3VhZ2VzLnR5cG9zY3JpcHQ7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLnVucmVhbHNjcmlwdCA9IHtcblx0J2NvbW1lbnQnOiAvXFwvXFwvLip8XFwvXFwqW1xcc1xcU10qP1xcKlxcLy8sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhbXCInXSkoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NhdGVnb3J5Jzoge1xuXHRcdHBhdHRlcm46IC8oXFxiKD86KD86YXV0b2V4cGFuZHxoaWRlfHNob3cpY2F0ZWdvcmllc3x2YXIpXFxzKlxcKClbXigpXSsoPz1cXCkpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXHQnbWV0YWRhdGEnOiB7XG5cdFx0cGF0dGVybjogLyhcXHdcXHMqKTxcXHMqXFx3K1xccyo9W148Pnw9XFxyXFxuXSsoPzpcXHxcXHMqXFx3K1xccyo9W148Pnw9XFxyXFxuXSspKj4vLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3Byb3BlcnR5JzogL1xcYlxcdysoPz1cXHMqPSkvLFxuXHRcdFx0J29wZXJhdG9yJzogLz0vLFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1s8PnxdL1xuXHRcdH1cblx0fSxcblx0J21hY3JvJzoge1xuXHRcdHBhdHRlcm46IC9gXFx3Ky8sXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0cGF0dGVybjogLyhcXGIoPzpjbGFzc3xlbnVtfGV4dGVuZHN8aW50ZXJmYWNlfHN0YXRlKD86XFwoXFwpKT98c3RydWN0fHdpdGhpbilcXHMrKVxcdysvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblxuXHQna2V5d29yZCc6IC9cXGIoPzphYnN0cmFjdHxhY3RvcnxhcnJheXxhdXRvfGF1dG9leHBhbmRjYXRlZ29yaWVzfGJvb2x8YnJlYWt8Ynl0ZXxjYXNlfGNsYXNzfGNsYXNzZ3JvdXB8Y2xpZW50fGNvZXJjZXxjb2xsYXBzZWNhdGVnb3JpZXN8Y29uZmlnfGNvbnN0fGNvbnRpbnVlfGRlZmF1bHR8ZGVmYXVsdHByb3BlcnRpZXN8ZGVsZWdhdGV8ZGVwZW5kc29ufGRlcHJlY2F0ZWR8ZG98ZG9udGNvbGxhcHNlY2F0ZWdvcmllc3xlZGl0Y29uc3R8ZWRpdGlubGluZW5ld3xlbHNlfGVudW18ZXZlbnR8ZXhlY3xleHBvcnR8ZXh0ZW5kc3xmaW5hbHxmbG9hdHxmb3J8Zm9yY2VzY3JpcHRvcmRlcnxmb3JlYWNofGZ1bmN0aW9ufGdvdG98Z3VpZHxoaWRlY2F0ZWdvcmllc3xoaWRlZHJvcGRvd258aWZ8aWdub3Jlc3xpbXBsZW1lbnRzfGluaGVyaXRzfGlucHV0fGludHxpbnRlcmZhY2V8aXRlcmF0b3J8bGF0ZW50fGxvY2FsfG1hdGVyaWFsfG5hbWV8bmF0aXZlfG5hdGl2ZXJlcGxpY2F0aW9ufG5vZXhwb3J0fG5vbnRyYW5zaWVudHxub3RlZGl0aW5saW5lbmV3fG5vdHBsYWNlYWJsZXxvcGVyYXRvcnxvcHRpb25hbHxvdXR8cGF3bnxwZXJvYmplY3Rjb25maWd8cGVyb2JqZWN0bG9jYWxpemVkfHBsYWNlYWJsZXxwb3N0b3BlcmF0b3J8cHJlb3BlcmF0b3J8cHJpdmF0ZXxwcm90ZWN0ZWR8cmVsaWFibGV8cmVwbGljYXRpb258cmV0dXJufHNlcnZlcnxzaG93Y2F0ZWdvcmllc3xzaW11bGF0ZWR8c2luZ3VsYXJ8c3RhdGV8c3RhdGljfHN0cmluZ3xzdHJ1Y3R8c3RydWN0ZGVmYXVsdHxzdHJ1Y3RkZWZhdWx0cHJvcGVydGllc3xzd2l0Y2h8dGV4dHVyZXx0cmFuc2llbnR8dHJhdmVsfHVucmVsaWFibGV8dW50aWx8dmFyfHZlY3Rvcnx3aGlsZXx3aXRoaW4pXFxiLyxcblx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1cXHMqXFwoKS9pLFxuXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0J251bWJlcic6IC9cXGIweFtcXGRhLWZdK1xcYnwoPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86ZVsrLV0/XFxkKyk/L2ksXG5cdC8vIGh0dHBzOi8vZG9jcy51bnJlYWxlbmdpbmUuY29tL3Vkay9UaHJlZS9VbnJlYWxTY3JpcHRFeHByZXNzaW9ucy5odG1sXG5cdCdvcGVyYXRvcic6IC8+Pnw8PHwtLXxcXCtcXCt8XFwqXFwqfFstKyovfiE9PD4kQF09P3wmJj98XFx8XFx8P3xcXF5cXF4/fFs/OiVdfFxcYig/OkNsb2Nrd2lzZUZyb218Q3Jvc3N8RG90KVxcYi8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKClbXFxde307LC5dL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnVjID0gUHJpc20ubGFuZ3VhZ2VzLnVzY3JpcHQgPSBQcmlzbS5sYW5ndWFnZXMudW5yZWFsc2NyaXB0O1xuXG5QcmlzbS5sYW5ndWFnZXMudW9yYXpvciA9IHtcblx0J2NvbW1lbnQtaGFzaCc6IHtcblx0XHRwYXR0ZXJuOiAvIy4qLyxcblx0XHRhbGlhczogJ2NvbW1lbnQnLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY29tbWVudC1zbGFzaCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwvXFwvLiovLFxuXHRcdGFsaWFzOiAnY29tbWVudCcsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhcInwnKSg/OlxcXFwufCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL15bJ1wiXXxbJ1wiXSQvXG5cdFx0fSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3NvdXJjZS1sYXllcnMnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OmFybXN8YmFja3BhY2t8Ymx1ZXxicmFjZWxldHxjYW5jZWx8Y2xlYXJ8Y2xvYWt8Y3JpbWluYWx8ZWFycmluZ3N8ZW5lbXl8ZmFjaWFsaGFpcnxmcmllbmR8ZnJpZW5kbHl8Z2xvdmVzfGdyYXl8Z3JleXxncm91bmR8aGFpcnxoZWFkfGlubmVybGVnc3xpbm5lcnRvcnNvfGlubm9jZW50fGxlZnRoYW5kfG1pZGRsZXRvcnNvfG11cmRlcmVyfG5lY2t8bm9uZnJpZW5kbHl8b25laGFuZGVkc2Vjb25kYXJ5fG91dGVybGVnc3xvdXRlcnRvcnNvfHBhbnRzfHJlZHxyaWdodGhhbmR8cmluZ3xzZWxmfHNoaXJ0fHNob2VzfHRhbGlzbWFufHdhaXN0KVxcYi9pLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdH0sXG5cdCdzb3VyY2UtY29tbWFuZHMnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OmFsbGlhbmNlfGF0dGFja3xjYXN0fGNsZWFyYWxsfGNsZWFyaWdub3JlfGNsZWFyam91cm5hbHxjbGVhcmxpc3R8Y2xlYXJzeXNtc2d8Y3JlYXRlbGlzdHxjcmVhdGV0aW1lcnxkY2xpY2t8ZGNsaWNrdHlwZXxkY2xpY2t2YXJ8ZHJlc3N8ZHJlc3Njb25maWd8ZHJvcHxkcm9wcmVsbG9jfGVtb3RlfGdldGxhYmVsfGd1aWxkfGd1bXBjbG9zZXxndW1wcmVzcG9uc2V8aG90a2V5fGlnbm9yZXxsYXN0dGFyZ2V0fGxpZnR8bGlmdHR5cGV8bWVudXxtZW51cmVzcG9uc2V8bXNnfG9yZ3xvcmdhbml6ZXxvcmdhbml6ZXJ8b3ZlcmhlYWR8cGF1c2V8cG9wbGlzdHxwb3Rpb258cHJvbXB0cmVzcG9uc2V8cHVzaGxpc3R8cmVtb3ZlbGlzdHxyZW1vdmV0aW1lcnxyZW5hbWV8cmVzdG9ja3xzYXl8c2NhdnxzY2F2ZW5nZXJ8c2NyaXB0fHNldGFiaWxpdHl8c2V0bGFzdHRhcmdldHxzZXRza2lsbHxzZXR0aW1lcnxzZXR2YXJ8c3lzbXNnfHRhcmdldHx0YXJnZXRsb2N8dGFyZ2V0cmVsbG9jfHRhcmdldHR5cGV8dW5kcmVzc3x1bmlnbm9yZXx1bnNldHZhcnx1c2VvYmplY3R8dXNlb25jZXx1c2Vza2lsbHx1c2V0eXBlfHZpcnR1ZXx3YWl0fHdhaXRmb3JndW1wfHdhaXRmb3JtZW51fHdhaXRmb3Jwcm9tcHR8d2FpdGZvcnN0YXR8d2FpdGZvcnN5c21zZ3x3YWl0Zm9ydGFyZ2V0fHdhbGt8d2ZzeXNtc2d8d2Z0fHdoaXNwZXJ8eWVsbClcXGIvLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdH0sXG5cdCd0YWctbmFtZSc6IHtcblx0XHRwYXR0ZXJuOiAvKF5cXHslLT9cXHMqKVxcdysvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQnZGVsaW1pdGVyJzoge1xuXHRcdHBhdHRlcm46IC9eXFx7W3slXS0/fC0/WyV9XVxcfSQvLFxuXHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdH0sXG5cdCdmdW5jdGlvbic6IC9cXGIoPzphdGxpc3R8Y2xvc2V8Y2xvc2VzdHxjb3VudHxjb3VudGVyfGNvdW50dHlwZXxkZWFkfGRleHxkaWZmaGl0c3xkaWZmbWFuYXxkaWZmc3RhbXxkaWZmd2VpZ2h0fGZpbmR8ZmluZGJ1ZmZ8ZmluZGRlYnVmZnxmaW5kbGF5ZXJ8ZmluZHR5cGV8ZmluZHR5cGVsaXN0fGZvbGxvd2Vyc3xndW1wZXhpc3RzfGhpZGRlbnxoaXRzfGhwfGh1ZXxodW1hbnxodW1hbm9pZHxpbmd1bXB8aW5saXN0fGluc3lzbWVzc2FnZXxpbnN5c21zZ3xpbnR8aW52dWx8bGhhbmRlbXB0eXxsaXN0fGxpc3RleGlzdHN8bWFuYXxtYXhoaXRzfG1heGhwfG1heG1hbmF8bWF4c3RhbXxtYXh3ZWlnaHR8bW9uc3Rlcnxtb3VudGVkfG5hbWV8bmV4dHxub3RvfHBhcmFseXplZHxwb2lzb25lZHxwb3NpdGlvbnxwcmV2fHByZXZpb3VzfHF1ZXVlZHxyYW5kfHJhbmRvbXxyaGFuZGVtcHR5fHNraWxsfHN0YW18c3RyfHRhcmdldGV4aXN0c3x0aW1lcnx0aW1lcmV4aXN0c3x2YXJleGlzdHx3YXJtb2RlfHdlaWdodClcXGIvLFxuXHQna2V5d29yZCc6IC9cXGIoPzphbmR8YXN8YnJlYWt8Y29udGludWV8ZWxzZXxlbHNlaWZ8ZW5kZm9yfGVuZGlmfGVuZHdoaWxlfGZvcnxpZnxsb29wfG5vdHxvcnxyZXBsYXl8c3RvcHx3aGlsZSlcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXxudWxsfHRydWUpXFxiLyxcblx0J251bWJlcic6IC9cXGIweFtcXGRBLUZhLWZdK3woPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86W0VlXVstK10/XFxkKyk/Lyxcblx0J29wZXJhdG9yJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXFxzKSg/OmFuZHxiLWFuZHxiLW9yfGIteG9yfGVuZHMgd2l0aHxpbnxpc3xtYXRjaGVzfG5vdHxvcnxzYW1lIGFzfHN0YXJ0cyB3aXRoKSg/PVxccykvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0L1s9PD5dPT98IT18XFwqXFwqP3xcXC9cXC8/fFxcPzo/fFstK34lfF0vXG5cdF0sXG5cdCdwdW5jdHVhdGlvbic6IC9bKClcXFtcXF17fTouLF0vXG59O1xuXG4vLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNhcHBlbmRpeC1BXG5cblByaXNtLmxhbmd1YWdlcy51cmkgPSB7XG5cdCdzY2hlbWUnOiB7XG5cdFx0cGF0dGVybjogL15bYS16XVthLXowLTkrLi1dKjovaW0sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3NjaGVtZS1kZWxpbWl0ZXInOiAvOiQvXG5cdFx0fVxuXHR9LFxuXHQnZnJhZ21lbnQnOiB7XG5cdFx0cGF0dGVybjogLyNbXFx3XFwtLn4hJCYnKCkqKyw7PSU6QC8/XSovLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2ZyYWdtZW50LWRlbGltaXRlcic6IC9eIy9cblx0XHR9XG5cdH0sXG5cdCdxdWVyeSc6IHtcblx0XHRwYXR0ZXJuOiAvXFw/W1xcd1xcLS5+ISQmJygpKissOz0lOkAvP10qLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdxdWVyeS1kZWxpbWl0ZXInOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eXFw/Lyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0J3BhaXItZGVsaW1pdGVyJzogL1smO10vLFxuXHRcdFx0J3BhaXInOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eW149XVtcXHNcXFNdKi8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdrZXknOiAvXltePV0rLyxcblx0XHRcdFx0XHQndmFsdWUnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKF49KVtcXHNcXFNdKy8sXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQnYXV0aG9yaXR5Jzoge1xuXHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdC9eXFwvXFwvLy5zb3VyY2Vcblx0XHRcdC8vIFsgdXNlcmluZm8gXCJAXCIgXVxuXHRcdFx0KyAvKD86W1xcd1xcLS5+ISQmJygpKissOz0lOl0qQCk/Ly5zb3VyY2Vcblx0XHRcdC8vIGhvc3Rcblx0XHRcdCsgKFxuXHRcdFx0XHQnKD86J1xuXHRcdFx0XHQvLyBJUC1saXRlcmFsXG5cdFx0XHRcdCsgL1xcWyg/OlswLTlhLWZBLUY6Ll17Miw0OH18dlswLTlhLWZBLUZdK1xcLltcXHdcXC0ufiEkJicoKSorLDs9XSspXFxdLy5zb3VyY2Vcblx0XHRcdFx0KyAnfCdcblx0XHRcdFx0Ly8gSVB2NGFkZHJlc3Mgb3IgcmVnaXN0ZXJlZCBuYW1lXG5cdFx0XHRcdCsgL1tcXHdcXC0ufiEkJicoKSorLDs9JV0qLy5zb3VyY2Vcblx0XHRcdFx0KyAnKSdcblx0XHRcdClcblx0XHRcdC8vIFsgXCI6XCIgcG9ydCBdXG5cdFx0XHQrIC8oPzo6XFxkKik/Ly5zb3VyY2UsXG5cdFx0XHQnbSdcblx0XHQpLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2F1dGhvcml0eS1kZWxpbWl0ZXInOiAvXlxcL1xcLy8sXG5cdFx0XHQndXNlci1pbmZvLXNlZ21lbnQnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eW1xcd1xcLS5+ISQmJygpKissOz0lOl0qQC8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCd1c2VyLWluZm8tZGVsaW1pdGVyJzogL0AkLyxcblx0XHRcdFx0XHQndXNlci1pbmZvJzogL15bXFx3XFwtLn4hJCYnKCkqKyw7PSU6XSsvXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQncG9ydC1zZWdtZW50Jzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvOlxcZCokLyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3BvcnQtZGVsaW1pdGVyJzogL146Lyxcblx0XHRcdFx0XHQncG9ydCc6IC9eXFxkKy9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdob3N0Jzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2lwLWxpdGVyYWwnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcW1tcXHNcXFNdK1xcXSQvLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdCdpcC1saXRlcmFsLWRlbGltaXRlcic6IC9eXFxbfFxcXSQvLFxuXHRcdFx0XHRcdFx0XHQnaXB2LWZ1dHVyZSc6IC9edltcXHNcXFNdKy8sXG5cdFx0XHRcdFx0XHRcdCdpcHY2LWFkZHJlc3MnOiAvXltcXHNcXFNdKy9cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdpcHY0LWFkZHJlc3MnOiAvXig/Oig/OlswMy05XVxcZD98WzEyXVxcZHswLDJ9KVxcLil7M30oPzpbMDMtOV1cXGQ/fFsxMl1cXGR7MCwyfSkkL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQncGF0aCc6IHtcblx0XHRwYXR0ZXJuOiAvXltcXHdcXC0ufiEkJicoKSorLDs9JTpAL10rL20sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncGF0aC1zZXBhcmF0b3InOiAvXFwvL1xuXHRcdH1cblx0fVxufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnVybCA9IFByaXNtLmxhbmd1YWdlcy51cmk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0dmFyIGludGVycG9sYXRpb25FeHByID0ge1xuXHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdGluc2lkZTogbnVsbFxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy52ID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9yPyhbXCInXSkoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0XHRcdGFsaWFzOiAncXVvdGVkLXN0cmluZycsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLygoPzpefFteXFxcXF0pKD86XFxcXHsyfSkqKVxcJCg/Olxce1tee31dKlxcfXxcXHcrKD86XFwuXFx3Kyg/OlxcKFteXFwoXFwpXSpcXCkpP3xcXFtbXlxcW1xcXV0rXFxdKSopLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J2ludGVycG9sYXRpb24tdmFyaWFibGUnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9eXFwkXFx3W1xcc1xcU10qJC8sXG5cdFx0XHRcdFx0XHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J2ludGVycG9sYXRpb24tcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9eXFwkXFx7fFxcfSQvLFxuXHRcdFx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uLWV4cHJlc3Npb24nOiBpbnRlcnBvbGF0aW9uRXhwclxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYig/OmVudW18aW50ZXJmYWNlfHN0cnVjdHx0eXBlKVxccyspKD86Q1xcLik/XFx3Ky8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQna2V5d29yZCc6IC8oPzpcXGIoPzpfX2dsb2JhbHxhc3xhc218YXNzZXJ0fGF0b21pY3xicmVha3xjaGFufGNvbnN0fGNvbnRpbnVlfGRlZmVyfGVsc2V8ZW1iZWR8ZW51bXxmbnxmb3J8Z28oPzp0byk/fGlmfGltcG9ydHxpbnxpbnRlcmZhY2V8aXN8bG9ja3xtYXRjaHxtb2R1bGV8bXV0fG5vbmV8b3J8cHVifHJldHVybnxybG9ja3xzZWxlY3R8c2hhcmVkfHNpemVvZnxzdGF0aWN8c3RydWN0fHR5cGUoPzpvZik/fHVuaW9ufHVuc2FmZSl8XFwkKD86ZWxzZXxmb3J8aWYpfCMoPzpmbGFnfGluY2x1ZGUpKVxcYi8sXG5cdFx0J251bWJlcic6IC9cXGIoPzoweFthLWZcXGRdKyg/Ol9bYS1mXFxkXSspKnwwYlswMV0rKD86X1swMV0rKSp8MG9bMC03XSsoPzpfWzAtN10rKSp8XFxkKyg/Ol9cXGQrKSooPzpcXC5cXGQrKD86X1xcZCspKik/KVxcYi9pLFxuXHRcdCdvcGVyYXRvcic6IC9+fFxcP3xbKlxcLyVeIT1dPT98XFwrWz0rXT98LVs9LV0/fFxcfFs9fF0/fCYoPzo9fCZ8XFxePT8pP3w+KD86Pj0/fD0pP3w8KD86PD0/fD18LSk/fDo9fFxcLlxcLlxcLj8vLFxuXHRcdCdidWlsdGluJzogL1xcYig/OmFueSg/Ol9mbG9hdHxfaW50KT98Ym9vbHxieXRlKD86cHRyKT98Y2hhcnB0cnxmKD86MzJ8NjQpfGkoPzo4fDE2fDY0fDEyOHxudCl8cnVuZXxzaXplX3R8c3RyaW5nfHUoPzoxNnwzMnw2NHwxMjgpfHZvaWRwdHIpXFxiL1xuXHR9KTtcblxuXHRpbnRlcnBvbGF0aW9uRXhwci5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMudjtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCd2JywgJ3N0cmluZycsIHtcblx0XHQnY2hhcic6IHtcblx0XHRcdHBhdHRlcm46IC9gKD86XFxcXGB8XFxcXD9bXmBdezEsMn0pYC8sIC8vIHVzaW5nIHsxLDJ9IGluc3RlYWQgb2YgYHVgIGZsYWcgZm9yIGNvbXBhdGliaWxpdHlcblx0XHRcdGFsaWFzOiAncnVuZSdcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3YnLCAnb3BlcmF0b3InLCB7XG5cdFx0J2F0dHJpYnV0ZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXltcXHQgXSopXFxbKD86ZGVwcmVjYXRlZHxkaXJlY3RfYXJyYXlfYWNjZXNzfGZsYWd8aW5saW5lfGxpdmV8cmVmX29ubHl8dHlwZWRlZnx1bnNhZmVfZm58d2luZG93c19zdGRjYWxsKVxcXS9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnYW5ub3RhdGlvbicsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1tcXFtcXF1dLyxcblx0XHRcdFx0J2tleXdvcmQnOiAvXFx3Ky9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdnZW5lcmljJzoge1xuXHRcdFx0cGF0dGVybjogLzxcXHcrPig/PVxccypbXFwpXFx7XSkvLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bPD5dLyxcblx0XHRcdFx0J2NsYXNzLW5hbWUnOiAvXFx3Ky9cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3YnLCAnZnVuY3Rpb24nLCB7XG5cdFx0J2dlbmVyaWMtZnVuY3Rpb24nOiB7XG5cdFx0XHQvLyBlLmcuIGZvbzxUPiggLi4uXG5cdFx0XHRwYXR0ZXJuOiAvXFxiXFx3K1xccyo8XFx3Kz4oPz1cXCgpLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZnVuY3Rpb24nOiAvXlxcdysvLFxuXHRcdFx0XHQnZ2VuZXJpYyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvPFxcdys+Lyxcblx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy52LmdlbmVyaWMuaW5zaWRlXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMudmFsYSA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHQvLyBDbGFzc2VzIGNvcGllZCBmcm9tIHByaXNtLWNzaGFycFxuXHQnY2xhc3MtbmFtZSc6IFtcblx0XHR7XG5cdFx0XHQvLyAoRm9vIGJhciwgQmFyIGJheilcblx0XHRcdHBhdHRlcm46IC9cXGJbQS1aXVxcdyooPzpcXC5cXHcrKSpcXGIoPz0oPzpcXD9cXHMrfFxcKj9cXHMrXFwqPylcXHcpLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRwdW5jdHVhdGlvbjogL1xcLi9cblx0XHRcdH1cblx0XHR9LFxuXHRcdHtcblx0XHRcdC8vIFtGb29dXG5cdFx0XHRwYXR0ZXJuOiAvKFxcWylbQS1aXVxcdyooPzpcXC5cXHcrKSpcXGIvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRwdW5jdHVhdGlvbjogL1xcLi9cblx0XHRcdH1cblx0XHR9LFxuXHRcdHtcblx0XHRcdC8vIGNsYXNzIEZvbyA6IEJhclxuXHRcdFx0cGF0dGVybjogLyhcXGIoPzpjbGFzc3xpbnRlcmZhY2UpXFxzK1tBLVpdXFx3Kig/OlxcLlxcdyspKlxccyo6XFxzKilbQS1aXVxcdyooPzpcXC5cXHcrKSpcXGIvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRwdW5jdHVhdGlvbjogL1xcLi9cblx0XHRcdH1cblx0XHR9LFxuXHRcdHtcblx0XHRcdC8vIGNsYXNzIEZvb1xuXHRcdFx0cGF0dGVybjogLygoPzpcXGIoPzpjbGFzc3xlbnVtfGludGVyZmFjZXxuZXd8c3RydWN0KVxccyspfCg/OmNhdGNoXFxzK1xcKCkpW0EtWl1cXHcqKD86XFwuXFx3KykqXFxiLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0cHVuY3R1YXRpb246IC9cXC4vXG5cdFx0XHR9XG5cdFx0fVxuXHRdLFxuXHQna2V5d29yZCc6IC9cXGIoPzphYnN0cmFjdHxhc3xhc3NlcnR8YXN5bmN8YmFzZXxib29sfGJyZWFrfGNhc2V8Y2F0Y2h8Y2hhcnxjbGFzc3xjb25zdHxjb25zdHJ1Y3R8Y29udGludWV8ZGVmYXVsdHxkZWxlZ2F0ZXxkZWxldGV8ZG98ZG91YmxlfGR5bmFtaWN8ZWxzZXxlbnN1cmVzfGVudW18ZXJyb3Jkb21haW58ZXh0ZXJufGZpbmFsbHl8ZmxvYXR8Zm9yfGZvcmVhY2h8Z2V0fGlmfGlufGlubGluZXxpbnR8aW50MTZ8aW50MzJ8aW50NjR8aW50OHxpbnRlcmZhY2V8aW50ZXJuYWx8aXN8bG9ja3xsb25nfG5hbWVzcGFjZXxuZXd8bnVsbHxvdXR8b3ZlcnJpZGV8b3duZWR8cGFyYW1zfHByaXZhdGV8cHJvdGVjdGVkfHB1YmxpY3xyZWZ8cmVxdWlyZXN8cmV0dXJufHNldHxzaG9ydHxzaWduYWx8c2l6ZW9mfHNpemVfdHxzc2l6ZV90fHN0YXRpY3xzdHJpbmd8c3RydWN0fHN3aXRjaHx0aGlzfHRocm93fHRocm93c3x0cnl8dHlwZW9mfHVjaGFyfHVpbnR8dWludDE2fHVpbnQzMnx1aW50NjR8dWludDh8dWxvbmd8dW5pY2hhcnx1bm93bmVkfHVzaG9ydHx1c2luZ3x2YWx1ZXx2YXJ8dmlydHVhbHx2b2lkfHZvbGF0aWxlfHdlYWt8d2hpbGV8eWllbGQpXFxiL2ksXG5cdCdmdW5jdGlvbic6IC9cXGJcXHcrKD89XFxzKlxcKCkvLFxuXHQnbnVtYmVyJzogLyg/OlxcYjB4W1xcZGEtZl0rXFxifCg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzplWystXT9cXGQrKT8pKD86Znx1P2w/KT8vaSxcblx0J29wZXJhdG9yJzogL1xcK1xcK3wtLXwmJnxcXHxcXHx8PDw9P3w+Pj0/fD0+fC0+fH58WytcXC0qXFwvJSZefD0hPD5dPT98XFw/XFw/P3xcXC5cXC5cXC4vLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXTsoKSwuOl0vLFxuXHQnY29uc3RhbnQnOiAvXFxiW0EtWjAtOV9dK1xcYi9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCd2YWxhJywgJ3N0cmluZycsIHtcblx0J3Jhdy1zdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiXCJcIltcXHNcXFNdKj9cIlwiXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ3N0cmluZydcblx0fSxcblx0J3RlbXBsYXRlLXN0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvQFwiW1xcc1xcU10qP1wiLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogL1xcJCg/OlxcKFteKV0qXFwpfFthLXpBLVpdXFx3KikvLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL15cXCRcXCg/fFxcKSQvLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHJlc3Q6IFByaXNtLmxhbmd1YWdlcy52YWxhXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHR9XG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCd2YWxhJywgJ2tleXdvcmQnLCB7XG5cdCdyZWdleCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwvKD86XFxbKD86W15cXF1cXFxcXFxyXFxuXXxcXFxcLikqXFxdfFxcXFwufFteL1xcXFxcXFtcXHJcXG5dKStcXC9baW1zeF17MCw0fSg/PVxccyooPzokfFtcXHJcXG4sLjt9KVxcXV0pKS8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3JlZ2V4LXNvdXJjZSc6IHtcblx0XHRcdFx0cGF0dGVybjogL14oXFwvKVtcXHNcXFNdKyg/PVxcL1thLXpdKiQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1yZWdleCcsXG5cdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnJlZ2V4XG5cdFx0XHR9LFxuXHRcdFx0J3JlZ2V4LWRlbGltaXRlcic6IC9eXFwvLyxcblx0XHRcdCdyZWdleC1mbGFncyc6IC9eW2Etel0rJC8sXG5cdFx0fVxuXHR9XG59KTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHRQcmlzbS5sYW5ndWFnZXMudmVsb2NpdHkgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdtYXJrdXAnLCB7fSk7XG5cblx0dmFyIHZlbG9jaXR5ID0ge1xuXHRcdCd2YXJpYWJsZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKD86XFxcXFxcXFwpKilcXCQhPyg/OlthLXpdW1xcdy1dKig/OlxcKFteKV0qXFwpKT8oPzpcXC5bYS16XVtcXHctXSooPzpcXChbXildKlxcKSk/fFxcW1teXFxdXStcXF0pKnxcXHtbXn1dK1xcfSkvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHt9IC8vIFNlZSBiZWxvd1xuXHRcdH0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9cIlteXCJdKlwifCdbXiddKicvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnbnVtYmVyJzogL1xcYlxcZCtcXGIvLFxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0XHQnb3BlcmF0b3InOiAvWz0hPD5dPT98WysqLyUtXXwmJnxcXHxcXHx8XFwuXFwufFxcYig/OmVxfGdbZXRdfGxbZXRdfG4oPzplfG90KSlcXGIvLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bKCl7fVtcXF06LC5dL1xuXHR9O1xuXG5cdHZlbG9jaXR5LnZhcmlhYmxlLmluc2lkZSA9IHtcblx0XHQnc3RyaW5nJzogdmVsb2NpdHlbJ3N0cmluZyddLFxuXHRcdCdmdW5jdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oW15cXHctXSlbYS16XVtcXHctXSooPz1cXCgpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdudW1iZXInOiB2ZWxvY2l0eVsnbnVtYmVyJ10sXG5cdFx0J2Jvb2xlYW4nOiB2ZWxvY2l0eVsnYm9vbGVhbiddLFxuXHRcdCdwdW5jdHVhdGlvbic6IHZlbG9jaXR5WydwdW5jdHVhdGlvbiddXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgndmVsb2NpdHknLCAnY29tbWVudCcsIHtcblx0XHQndW5wYXJzZWQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkjXFxbXFxbW1xcc1xcU10qP1xcXVxcXSMvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXiNcXFtcXFt8XFxdXFxdIyQvXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQndmVsb2NpdHktY29tbWVudCc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pI1xcKltcXHNcXFNdKj9cXCojLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ2NvbW1lbnQnXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkjIy4qLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ2NvbW1lbnQnXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnZGlyZWN0aXZlJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0oPzpcXFxcXFxcXCkqKSNAPyg/OlthLXpdW1xcdy1dKnxcXHtbYS16XVtcXHctXSpcXH0pKD86XFxzKlxcKCg/OlteKCldfFxcKFteKCldKlxcKSkqXFwpKT8vaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2tleXdvcmQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14jQD8oPzpbYS16XVtcXHctXSp8XFx7W2Etel1bXFx3LV0qXFx9KXxcXGJpblxcYi8sXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvW3t9XS9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHJlc3Q6IHZlbG9jaXR5XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQndmFyaWFibGUnOiB2ZWxvY2l0eVsndmFyaWFibGUnXVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMudmVsb2NpdHlbJ3RhZyddLmluc2lkZVsnYXR0ci12YWx1ZSddLmluc2lkZS5yZXN0ID0gUHJpc20ubGFuZ3VhZ2VzLnZlbG9jaXR5O1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy52ZXJpbG9nID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwvXFwvLip8XFwvXFwqW1xcc1xcU10qP1xcKlxcLy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8W15cIlxcXFxcXHJcXG5dKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdrZXJuZWwtZnVuY3Rpb24nOiB7XG5cdFx0Ly8gc3VwcG9ydCBmb3IgYW55IGtlcm5lbCBmdW5jdGlvbiAoZXg6ICRkaXNwbGF5KCkpXG5cdFx0cGF0dGVybjogL1xcQlxcJFxcdytcXGIvLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cdC8vIHN1cHBvcnQgZm9yIHVzZXIgZGVmaW5lZCBjb25zdGFudHMgKGV4OiBgZGVmaW5lKVxuXHQnY29uc3RhbnQnOiAvXFxCYFxcdytcXGIvLFxuXHQnZnVuY3Rpb24nOiAvXFxiXFx3Kyg/PVxcKCkvLFxuXHQvLyBzdXBwb3J0IGZvciB2ZXJpbG9nIGFuZCBzeXN0ZW0gdmVyaWxvZyBrZXl3b3Jkc1xuXHQna2V5d29yZCc6IC9cXGIoPzphbGlhc3xhbmR8YXNzZXJ0fGFzc2lnbnxhc3N1bWV8YXV0b21hdGljfGJlZm9yZXxiZWdpbnxiaW5kfGJpbnN8Ymluc29mfGJpdHxicmVha3xidWZ8YnVmaWYwfGJ1ZmlmMXxieXRlfGNhc2V8Y2FzZXh8Y2FzZXp8Y2VsbHxjaGFuZGxlfGNsYXNzfGNsb2NraW5nfGNtb3N8Y29uZmlnfGNvbnN0fGNvbnN0cmFpbnR8Y29udGV4dHxjb250aW51ZXxjb3Zlcnxjb3Zlcmdyb3VwfGNvdmVycG9pbnR8Y3Jvc3N8ZGVhc3NpZ258ZGVmYXVsdHxkZWZwYXJhbXxkZXNpZ258ZGlzYWJsZXxkaXN0fGRvfGVkZ2V8ZWxzZXxlbmR8ZW5kY2FzZXxlbmRjbGFzc3xlbmRjbG9ja2luZ3xlbmRjb25maWd8ZW5kZnVuY3Rpb258ZW5kZ2VuZXJhdGV8ZW5kZ3JvdXB8ZW5kaW50ZXJmYWNlfGVuZG1vZHVsZXxlbmRwYWNrYWdlfGVuZHByaW1pdGl2ZXxlbmRwcm9ncmFtfGVuZHByb3BlcnR5fGVuZHNlcXVlbmNlfGVuZHNwZWNpZnl8ZW5kdGFibGV8ZW5kdGFza3xlbnVtfGV2ZW50fGV4cGVjdHxleHBvcnR8ZXh0ZW5kc3xleHRlcm58ZmluYWx8Zmlyc3RfbWF0Y2h8Zm9yfGZvcmNlfGZvcmVhY2h8Zm9yZXZlcnxmb3JrfGZvcmtqb2lufGZ1bmN0aW9ufGdlbmVyYXRlfGdlbnZhcnxoaWdoejB8aGlnaHoxfGlmfGlmZnxpZm5vbmV8aWdub3JlX2JpbnN8aWxsZWdhbF9iaW5zfGltcG9ydHxpbmNkaXJ8aW5jbHVkZXxpbml0aWFsfGlub3V0fGlucHV0fGluc2lkZXxpbnN0YW5jZXxpbnR8aW50ZWdlcnxpbnRlcmZhY2V8aW50ZXJzZWN0fGpvaW58am9pbl9hbnl8am9pbl9ub25lfGxhcmdlfGxpYmxpc3R8bGlicmFyeXxsb2NhbHxsb2NhbHBhcmFtfGxvZ2ljfGxvbmdpbnR8bWFjcm9tb2R1bGV8bWF0Y2hlc3xtZWRpdW18bW9kcG9ydHxtb2R1bGV8bmFuZHxuZWdlZGdlfG5ld3xubW9zfG5vcnxub3Nob3djYW5jZWxsZWR8bm90fG5vdGlmMHxub3RpZjF8bnVsbHxvcnxvdXRwdXR8cGFja2FnZXxwYWNrZWR8cGFyYW1ldGVyfHBtb3N8cG9zZWRnZXxwcmltaXRpdmV8cHJpb3JpdHl8cHJvZ3JhbXxwcm9wZXJ0eXxwcm90ZWN0ZWR8cHVsbDB8cHVsbDF8cHVsbGRvd258cHVsbHVwfHB1bHNlc3R5bGVfb25kZXRlY3R8cHVsc2VzdHlsZV9vbmV2ZW50fHB1cmV8cmFuZHxyYW5kY3xyYW5kY2FzZXxyYW5kc2VxdWVuY2V8cmNtb3N8cmVhbHxyZWFsdGltZXxyZWZ8cmVnfHJlbGVhc2V8cmVwZWF0fHJldHVybnxybm1vc3xycG1vc3xydHJhbnxydHJhbmlmMHxydHJhbmlmMXxzY2FsYXJlZHxzZXF1ZW5jZXxzaG9ydGludHxzaG9ydHJlYWx8c2hvd2NhbmNlbGxlZHxzaWduZWR8c21hbGx8c29sdmV8c3BlY2lmeXxzcGVjcGFyYW18c3RhdGljfHN0cmluZ3xzdHJvbmcwfHN0cm9uZzF8c3RydWN0fHN1cGVyfHN1cHBseTB8c3VwcGx5MXx0YWJsZXx0YWdnZWR8dGFza3x0aGlzfHRocm91Z2hvdXR8dGltZXx0aW1lcHJlY2lzaW9ufHRpbWV1bml0fHRyYW58dHJhbmlmMHx0cmFuaWYxfHRyaXx0cmkwfHRyaTF8dHJpYW5kfHRyaW9yfHRyaXJlZ3x0eXBlfHR5cGVkZWZ8dW5pb258dW5pcXVlfHVuc2lnbmVkfHVzZXx1d2lyZXx2YXJ8dmVjdG9yZWR8dmlydHVhbHx2b2lkfHdhaXR8d2FpdF9vcmRlcnx3YW5kfHdlYWswfHdlYWsxfHdoaWxlfHdpbGRjYXJkfHdpcmV8d2l0aHx3aXRoaW58d29yfHhub3J8eG9yKVxcYi8sXG5cdC8vIGJvbGQgaGlnaGxpZ2h0aW5nIGZvciBhbGwgdmVyaWxvZyBhbmQgc3lzdGVtIHZlcmlsb2cgbG9naWMgYmxvY2tzXG5cdCdpbXBvcnRhbnQnOiAvXFxiKD86YWx3YXlzfGFsd2F5c19jb21ifGFsd2F5c19mZnxhbHdheXNfbGF0Y2gpXFxiKD86ICpAKT8vLFxuXHQvLyBzdXBwb3J0IGZvciB0aW1lIHRpY2tzLCB2ZWN0b3JzLCBhbmQgcmVhbCBudW1iZXJzXG5cdCdudW1iZXInOiAvXFxCIyM/XFxkK3woPzpcXGJcXGQrKT8nW29kYmhdID9bXFxkYS1menhfP10rfFxcYig/OlxcZCpbLl9dKT9cXGQrKD86ZVstK10/XFxkKyk/L2ksXG5cdCdvcGVyYXRvcic6IC9bLSt7fV5+JSpcXC8/PSE8PiZ8XSsvLFxuXHQncHVuY3R1YXRpb24nOiAvW1tcXF07KCksLjpdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnZoZGwgPSB7XG5cdCdjb21tZW50JzogLy0tLisvLFxuXHQvLyBzdXBwb3J0IGZvciBhbGwgbG9naWMgdmVjdG9yc1xuXHQndmhkbC12ZWN0b3JzJzoge1xuXHRcdCdwYXR0ZXJuJzogL1xcYltveGJdXCJbXFxkYS1mX10rXCJ8XCJbMDF1eHp3bGgtXStcIi9pLFxuXHRcdCdhbGlhcyc6ICdudW1iZXInXG5cdH0sXG5cdC8vIHN1cHBvcnQgZm9yIG9wZXJhdG9yIG92ZXJsb2FkaW5nIGluY2x1ZGVkXG5cdCdxdW90ZWQtZnVuY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogL1wiXFxTKz9cIig/PVxcKCkvLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdH0sXG5cdCdzdHJpbmcnOiAvXCIoPzpbXlxcXFxcIlxcclxcbl18XFxcXCg/OlxcclxcbnxbXFxzXFxTXSkpKlwiLyxcblx0J2F0dHJpYnV0ZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiJ1xcdysvLFxuXHRcdGFsaWFzOiAnYXR0ci1uYW1lJ1xuXHR9LFxuXHQvLyBzdXBwb3J0IGZvciBwcmVkZWZpbmVkIGF0dHJpYnV0ZXMgaW5jbHVkZWRcblx0J2tleXdvcmQnOiAvXFxiKD86YWNjZXNzfGFmdGVyfGFsaWFzfGFsbHxhcmNoaXRlY3R1cmV8YXJyYXl8YXNzZXJ0fGF0dHJpYnV0ZXxiZWdpbnxibG9ja3xib2R5fGJ1ZmZlcnxidXN8Y2FzZXxjb21wb25lbnR8Y29uZmlndXJhdGlvbnxjb25zdGFudHxkaXNjb25uZWN0fGRvd250b3xlbHNlfGVsc2lmfGVuZHxlbnRpdHl8ZXhpdHxmaWxlfGZvcnxmdW5jdGlvbnxnZW5lcmF0ZXxnZW5lcmljfGdyb3VwfGd1YXJkZWR8aWZ8aW1wdXJlfGlufGluZXJ0aWFsfGlub3V0fGlzfGxhYmVsfGxpYnJhcnl8bGlua2FnZXxsaXRlcmFsfGxvb3B8bWFwfG5ld3xuZXh0fG51bGx8b2Z8b258b3BlbnxvdGhlcnN8b3V0fHBhY2thZ2V8cG9ydHxwb3N0cG9uZWR8cHJpdmF0ZXxwcm9jZWR1cmV8cHJvY2Vzc3xwdXJlfHJhbmdlfHJlY29yZHxyZWdpc3RlcnxyZWplY3R8cmVwb3J0fHJldHVybnxzZWxlY3R8c2V2ZXJpdHl8c2hhcmVkfHNpZ25hbHxzdWJ0eXBlfHRoZW58dG98dHJhbnNwb3J0fHR5cGV8dW5hZmZlY3RlZHx1bml0c3x1bnRpbHx1c2V8dmFyaWFibGV8dmlld3x3YWl0fHdoZW58d2hpbGV8d2l0aClcXGIvaSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvaSxcblx0J2Z1bmN0aW9uJzogL1xcdysoPz1cXCgpLyxcblx0Ly8gZGVjaW1hbCwgYmFzZWQsIHBoeXNpY2FsLCBhbmQgZXhwb25lbnRpYWwgbnVtYmVycyBzdXBwb3J0ZWRcblx0J251bWJlcic6IC8nWzAxdXh6d2xoLV0nfFxcYig/OlxcZCsjW1xcZGEtZl8uXSsjfFxcZFtcXGRfLl0qKSg/OmVbLStdP1xcZCspPy9pLFxuXHQnb3BlcmF0b3InOiAvWzw+XT0/fDo9fFstKyovJj1dfFxcYig/OmFic3xhbmR8bW9kfG5hbmR8bm9yfG5vdHxvcnxyZW18cm9sfHJvcnxzbGF8c2xsfHNyYXxzcmx8eG5vcnx4b3IpXFxiL2ksXG5cdCdwdW5jdHVhdGlvbic6IC9be31bXFxdOygpLC46XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy52aW0gPSB7XG5cdCdzdHJpbmcnOiAvXCIoPzpbXlwiXFxcXFxcclxcbl18XFxcXC4pKlwifCcoPzpbXidcXHJcXG5dfCcnKSonLyxcblx0J2NvbW1lbnQnOiAvXCIuKi8sXG5cdCdmdW5jdGlvbic6IC9cXGJcXHcrKD89XFwoKS8sXG5cdCdrZXl3b3JkJzogL1xcYig/Ok58TmV4dHxQfFByaW50fFh8WE1MZW50fFhNTG5zfGFifGFiYnJldmlhdGV8YWJjfGFiY2xlYXJ8YWJvfGFib3ZlbGVmdHxhbHxhbGx8YXJ8YXJnYXxhcmdhZGR8YXJnZHxhcmdkZWxldGV8YXJnZG98YXJnZXxhcmdlZGl0fGFyZ2d8YXJnZ2xvYmFsfGFyZ2x8YXJnbG9jYWx8YXJnc3xhcmd1fGFyZ3VtZW50fGFzfGFzY2lpfGJ8Yk58Yk5leHR8YmF8YmFkfGJhZGR8YmFsbHxiZHxiZGVsZXRlfGJlfGJlbHxiZWxvd3JpZ2h0fGJmfGJmaXJzdHxibHxibGFzdHxibXxibW9kaWZpZWR8Ym58Ym5leHR8Ym98Ym90cmlnaHR8YnB8YnByZXZpb3VzfGJyfGJyZWF8YnJlYWt8YnJlYWthfGJyZWFrYWRkfGJyZWFrZHxicmVha2RlbHxicmVha2x8YnJlYWtsaXN0fGJyZXdpbmR8YnJvfGJyb3dzZXxidWZkb3xidWZmZXJ8YnVmZmVyc3xidW58YnVubG9hZHxid3xid2lwZW91dHxjfGNOfGNOZXh0fGNOZmNOZmlsZXxjYXxjYWJicmV2fGNhYmN8Y2FiY2xlYXJ8Y2FkfGNhZGRifGNhZGRidWZmZXJ8Y2FkZGV4cHJ8Y2FkZGZ8Y2FkZGZpbGV8Y2FsfGNhbGx8Y2F0fGNhdGNofGNifGNidWZmZXJ8Y2N8Y2NsfGNjbG9zZXxjZHxjZXxjZW50ZXJ8Y2V4fGNleHByfGNmfGNmaWxlfGNmaXJ8Y2ZpcnN0fGNnfGNnZXRifGNnZXRidWZmZXJ8Y2dldGV8Y2dldGV4cHJ8Y2dldGZpbGV8Y2hhbmdlfGNoYW5nZXN8Y2hkfGNoZGlyfGNoZXxjaGVja3BhdGh8Y2hlY2t0fGNoZWNrdGltZXxjbHxjbGF8Y2xhc3R8Y2xpc3R8Y2xvfGNsb3NlfGNtYXBjfGNtYXBjbGVhcnxjbnxjbmV3fGNuZXdlcnxjbmV4dHxjbmZ8Y25maWxlfGNub3JlYXxjbm9yZWFiYnJldnxjb3xjb2x8Y29sZGVyfGNvbG98Y29sb3JzY2hlbWV8Y29tY3xjb21jbGVhcnxjb21wfGNvbXBpbGVyfGNvbnxjb25mfGNvbmZpcm18Y29udGludWV8Y29wZXxjb3Blbnxjb3B5fGNwfGNwZnxjcGZpbGV8Y3ByZXZpb3VzfGNxfGNxdWl0fGNyfGNyZXdpbmR8Y3V8Y3VuYXxjdW5hYmJyZXZ8Y3VubWFwfGN3fGN3aW5kb3d8ZHxkZWJ1Z2d8ZGVidWdncmVlZHl8ZGVsY3xkZWxjb21tYW5kfGRlbGV0ZXxkZWxmfGRlbGZ1bmN0aW9ufGRlbG18ZGVsbWFya3N8ZGl8ZGlmZmd8ZGlmZmdldHxkaWZmb2ZmfGRpZmZwYXRjaHxkaWZmcHV8ZGlmZnB1dHxkaWZmc3BsaXR8ZGlmZnRoaXN8ZGlmZnV8ZGlmZnVwZGF0ZXxkaWd8ZGlncmFwaHN8ZGlzcGxheXxkanxkanVtcHxkbHxkbGlzdHxkcnxkcm9wfGRzfGRzZWFyY2h8ZHNwfGRzcGxpdHxlfGVhcmxpZXJ8ZWNob2V8ZWNob2VycnxlY2hvbXxlY2hvbXNnfGVjaG9ufGVkaXR8ZWx8ZWxzZXxlbHNlaXxlbHNlaWZ8ZW18ZW1lbnV8ZW58ZW5kZnxlbmRmb3xlbmRmb3J8ZW5kZnVufGVuZGZ1bmN0aW9ufGVuZGlmfGVuZHR8ZW5kdHJ5fGVuZHd8ZW5kd2hpbGV8ZW5lfGVuZXd8ZXh8ZXhpfGV4aXR8ZXh1fGV4dXNhZ2V8ZnxmaWxlfGZpbGVzfGZpbGV0eXBlfGZpbnxmaW5hfGZpbmFsbHl8ZmluZHxmaW5pfGZpbmlzaHxmaXJ8Zmlyc3R8Zml4fGZpeGRlbHxmb3xmb2xkfGZvbGRjfGZvbGRjbG9zZXxmb2xkZHxmb2xkZG9jfGZvbGRkb2Nsb3NlZHxmb2xkZG9vcGVufGZvbGRvfGZvbGRvcGVufGZvcnxmdXxmdW58ZnVuY3Rpb258Z298Z290b3xncnxncmVwfGdyZXBhfGdyZXBhZGR8aHxoYXxoYXJkY29weXxoZWxwfGhlbHBmfGhlbHBmaW5kfGhlbHBnfGhlbHBncmVwfGhlbHB0fGhlbHB0YWdzfGhpZHxoaWRlfGhpc3xoaXN0b3J5fGlhfGlhYmJyZXZ8aWFiY3xpYWJjbGVhcnxpZnxpanxpanVtcHxpbHxpbGlzdHxpbWFwY3xpbWFwY2xlYXJ8aW58aW5vcmVhfGlub3JlYWJicmV2fGlzZWFyY2h8aXNwfGlzcGxpdHxpdXxpdW5hfGl1bmFiYnJldnxpdW5tYXB8anxqb2lufGp1fGp1bXBzfGt8a2VlfGtlZXBhbHR8a2VlcGp8a2VlcGp1bXBzfGtlZXBtYXJrc3xsfGxOfGxOZXh0fGxOZnxsTmZpbGV8bGF8bGFkfGxhZGRifGxhZGRidWZmZXJ8bGFkZGV4cHJ8bGFkZGZ8bGFkZGZpbGV8bGFufGxhbmd1YWdlfGxhc3R8bGF0ZXJ8bGJ8bGJ1ZmZlcnxsY3xsY2R8bGNofGxjaGRpcnxsY2x8bGNsb3NlfGxlZnR8bGVmdGF8bGVmdGFib3ZlfGxldHxsZXh8bGV4cHJ8bGZ8bGZpbGV8bGZpcnxsZmlyc3R8bGd8bGdldGJ8bGdldGJ1ZmZlcnxsZ2V0ZXxsZ2V0ZXhwcnxsZ2V0ZmlsZXxsZ3J8bGdyZXB8bGdyZXBhfGxncmVwYWRkfGxofGxoZWxwZ3JlcHxsaXN0fGxsfGxsYXxsbGFzdHxsbGl8bGxpc3R8bG18bG1ha3xsbWFrZXxsbWFwfGxtYXBjfGxtYXBjbGVhcnxsbnxsbmV8bG5ld3xsbmV3ZXJ8bG5leHR8bG5mfGxuZmlsZXxsbm9yZW1hcHxsb3xsb2Fkdmlld3xsb2N8bG9ja21hcmtzfGxvY2t2fGxvY2t2YXJ8bG9sfGxvbGRlcnxsb3B8bG9wZW58bHB8bHBmfGxwZmlsZXxscHJldmlvdXN8bHJ8bHJld2luZHxsc3xsdHxsdGFnfGx1fGx1bm1hcHxsdnxsdmltZ3JlcHxsdmltZ3JlcGF8bHZpbWdyZXBhZGR8bHd8bHdpbmRvd3xtfG1hfG1ha3xtYWtlfG1hcmt8bWFya3N8bWF0fG1hdGNofG1lbnV0fG1lbnV0cmFuc2xhdGV8bWt8bWtleHJjfG1rc3xta3Nlc3Npb258bWtzcHxta3NwZWxsfG1rdnxta3ZpZXxta3ZpZXd8bWt2aW1yY3xtb2R8bW9kZXxtb3ZlfG16fG16ZnxtemZpbGV8bXpzY2hlbWV8bnxuYmtleXxuZXd8bmV4dHxubWFwY3xubWFwY2xlYXJ8bm9ofG5vaGxzZWFyY2h8bm9yZWF8bm9yZWFiYnJldnxudXxudW1iZXJ8bnVufG51bm1hcHxvfG9tYXBjfG9tYXBjbGVhcnxvbnxvbmx5fG9wZW58b3B0fG9wdGlvbnN8b3V8b3VubWFwfHB8cGN8cGNsb3NlfHBlfHBlZHxwZWRpdHxwZXJsfHBlcmxkfHBlcmxkb3xwb3xwb3B8cG9wdXxwb3B1cHxwcHxwcG9wfHByZXxwcmVzZXJ2ZXxwcmV2fHByZXZpb3VzfHByaW50fHByb2Z8cHJvZmR8cHJvZmRlbHxwcm9maWxlfHByb21wdGZ8cHJvbXB0ZmluZHxwcm9tcHRyfHByb21wdHJlcGx8cHN8cHNlYXJjaHxwdE58cHROZXh0fHB0YXxwdGFnfHB0ZnxwdGZpcnN0fHB0anxwdGp1bXB8cHRsfHB0bGFzdHxwdG58cHRuZXh0fHB0cHxwdHByZXZpb3VzfHB0cnxwdHJld2luZHxwdHN8cHRzZWxlY3R8cHV8cHV0fHB3fHB3ZHxweXxweWZ8cHlmaWxlfHB5dGhvbnxxfHFhfHFhbGx8cXVpdHxxdWl0YXxxdWl0YWxsfHJ8cmVhZHxyZWN8cmVjb3ZlcnxyZWR8cmVkaXxyZWRpcnxyZWRvfHJlZHJ8cmVkcmF3fHJlZHJhd3N8cmVkcmF3c3RhdHVzfHJlZ3xyZWdpc3RlcnN8cmVzfHJlc2l6ZXxyZXR8cmV0YWJ8cmV0dXxyZXR1cm58cmV3fHJld2luZHxyaXxyaWdodHxyaWdodGJ8cmlnaHRiZWxvd3xydXxydWJ8cnVieXxydWJ5ZHxydWJ5ZG98cnVieWZ8cnVieWZpbGV8cnVudGltZXxydnxydmltaW5mb3xzTnxzTmV4dHxzYXxzYWx8c2FsbHxzYW58c2FuZGJveHxzYXJndW1lbnR8c2F2fHNhdmVhc3xzYnxzYk58c2JOZXh0fHNiYXxzYmFsbHxzYmZ8c2JmaXJzdHxzYmx8c2JsYXN0fHNibXxzYm1vZGlmaWVkfHNibnxzYm5leHR8c2JwfHNicHJldmlvdXN8c2JyfHNicmV3aW5kfHNidWZmZXJ8c2NyaXB8c2NyaXB0ZXxzY3JpcHRlbmNvZGluZ3xzY3JpcHRuYW1lc3xzZXxzZXR8c2V0ZnxzZXRmaWxldHlwZXxzZXRnfHNldGdsb2JhbHxzZXRsfHNldGxvY2FsfHNmfHNmaW5kfHNmaXJ8c2ZpcnN0fHNofHNoZWxsfHNpZ258c2lsfHNpbGVudHxzaW18c2ltYWx0fHNsfHNsYXxzbGFzdHxzbGVlcHxzbXxzbWFnaWN8c21hcHxzbWFwY3xzbWFwY2xlYXJ8c21lfHNtZW51fHNufHNuZXh0fHNuaXxzbmlmZnxzbm98c25vbWFnaWN8c25vcnxzbm9yZW1hcHxzbm9yZW1lfHNub3JlbWVudXxzb3xzb3J8c29ydHxzb3VyY2V8c3B8c3BlfHNwZWxsZHxzcGVsbGR1bXB8c3BlbGxnb29kfHNwZWxsaXxzcGVsbGluZm98c3BlbGxyfHNwZWxscmVwYWxsfHNwZWxsdXxzcGVsbHVuZG98c3BlbGx3fHNwZWxsd3Jvbmd8c3BsaXR8c3ByfHNwcmV2aW91c3xzcmV8c3Jld2luZHxzdHxzdGF8c3RhZ3xzdGFyfHN0YXJ0Z3xzdGFydGdyZXBsYWNlfHN0YXJ0aW5zZXJ0fHN0YXJ0cnxzdGFydHJlcGxhY2V8c3RqfHN0anVtcHxzdG9wfHN0b3BpfHN0b3BpbnNlcnR8c3RzfHN0c2VsZWN0fHN1bnxzdW5oaWRlfHN1bm18c3VubWFwfHN1c3xzdXNwZW5kfHN2fHN2aWV3fHN5bmNiaW5kfHR8dE58dE5leHR8dGF8dGFifHRhYk58dGFiTmV4dHx0YWJjfHRhYmNsb3NlfHRhYmR8dGFiZG98dGFiZXx0YWJlZGl0fHRhYmZ8dGFiZmluZHx0YWJmaXJ8dGFiZmlyc3R8dGFibHx0YWJsYXN0fHRhYm18dGFibW92ZXx0YWJufHRhYm5ld3x0YWJuZXh0fHRhYm98dGFib25seXx0YWJwfHRhYnByZXZpb3VzfHRhYnJ8dGFicmV3aW5kfHRhYnN8dGFnfHRhZ3N8dGN8dGNsfHRjbGR8dGNsZG98dGNsZnx0Y2xmaWxlfHRlfHRlYXJvZmZ8dGZ8dGZpcnN0fHRofHRocm93fHRqfHRqdW1wfHRsfHRsYXN0fHRtfHRtZW51fHRufHRuZXh0fHRvfHRvcGxlZnR8dHB8dHByZXZpb3VzfHRyfHRyZXdpbmR8dHJ5fHRzfHRzZWxlY3R8dHV8dHVubWVudXx1fHVuYXx1bmFiYnJldmlhdGV8dW5kb3x1bmRvanx1bmRvam9pbnx1bmRvbHx1bmRvbGlzdHx1bmh8dW5oaWRlfHVubGV0fHVubG98dW5sb2NrdmFyfHVubXx1bm1hcHx1cHx1cGRhdGV8dmV8dmVyYnx2ZXJib3NlfHZlcnNpb258dmVydHx2ZXJ0aWNhbHx2aXx2aWV8dmlld3x2aW18dmltZ3JlcHx2aW1ncmVwYXx2aW1ncmVwYWRkfHZpc3VhbHx2aXV8dml1c2FnZXx2bWFwY3x2bWFwY2xlYXJ8dm5lfHZuZXd8dnN8dnNwbGl0fHZ1fHZ1bm1hcHx3fHdOfHdOZXh0fHdhfHdhbGx8d2h8d2hpbGV8d2lufHdpbmN8d2luY21kfHdpbmRvfHdpbnB8d2lucG9zfHdpbnNpemV8d258d25leHR8d3B8d3ByZXZpb3VzfHdxfHdxYXx3cWFsbHx3cml0ZXx3c3x3c3ZlcmJ8d3Z8d3ZpbWluZm98eHx4YXx4YWxsfHhpdHx4bXx4bWFwfHhtYXBjfHhtYXBjbGVhcnx4bWV8eG1lbnV8eG58eG5vcmVtYXB8eG5vcmVtZXx4bm9yZW1lbnV8eHV8eHVubWFwfHl8eWFuaylcXGIvLFxuXHQnYnVpbHRpbic6IC9cXGIoPzphY2R8YWl8YWttfGFsZXBofGFsbG93cmV2aW5zfGFsdGtleW1hcHxhbWJpd2lkdGh8YW1id3xhbnRpfGFudGlhbGlhc3xhcmFifGFyYWJpY3xhcmFiaWNzaGFwZXxhcml8YXJzaGFwZXxhdXRvY2hkaXJ8YXV0b2NtZHxhdXRvaW5kZW50fGF1dG9yZWFkfGF1dG93cml0ZXxhdXRvd3JpdGVhbGx8YXd8YXdhfGJhY2tncm91bmR8YmFja3NwYWNlfGJhY2t1cHxiYWNrdXBjb3B5fGJhY2t1cGRpcnxiYWNrdXBleHR8YmFja3Vwc2tpcHxiYWxsb29uZGVsYXl8YmFsbG9vbmV2YWx8YmFsbG9vbmV4cHJ8YmRpcnxiZGxheXxiZXZhbHxiZXh8YmV4cHJ8Ymd8Ymh8YmlufGJpbmFyeXxiaW9za3xiaW9za2V5fGJrfGJrY3xib21ifGJyZWFrYXR8YnJrfGJyb3dzZWRpcnxic3xic2Rpcnxic2t8YnR8YnVmaGlkZGVufGJ1Zmxpc3RlZHxidWZ0eXBlfGNhc2VtYXB8Y2N2fGNkcGF0aHxjZWRpdHxjZnV8Y2h8Y2hhcmNvbnZlcnR8Y2l8Y2lufGNpbmRlbnR8Y2lua3xjaW5rZXlzfGNpbm98Y2lub3B0aW9uc3xjaW53fGNpbndvcmRzfGNsaXBib2FyZHxjbWRoZWlnaHR8Y21kd2luaGVpZ2h0fGNtcHxjbXN8Y29sdW1uc3xjb218Y29tbWVudHN8Y29tbWVudHN0cmluZ3xjb21wYXRpYmxlfGNvbXBsZXRlfGNvbXBsZXRlZnVuY3xjb21wbGV0ZW9wdHxjb25za3xjb25za2V5fGNvcHlpbmRlbnR8Y290fGNwb3xjcG9wdGlvbnN8Y3B0fGNzY29wZXBhdGhjb21wfGNzY29wZXByZ3xjc2NvcGVxdWlja2ZpeHxjc2NvcGV0YWd8Y3Njb3BldGFnb3JkZXJ8Y3Njb3BldmVyYm9zZXxjc3BjfGNzcHJnfGNzcWZ8Y3N0fGNzdG98Y3N2ZXJifGN1Y3xjdWx8Y3Vyc29yY29sdW1ufGN1cnNvcmxpbmV8Y3dofGRlYnVnfGRlY298ZGVmfGRlZmluZXxkZWxjb21iaW5lfGRleHxkZ3xkaWN0fGRpY3Rpb25hcnl8ZGlmZnxkaWZmZXhwcnxkaWZmb3B0fGRpZ3JhcGh8ZGlwfGRpcnxkaXJlY3Rvcnl8ZHl8ZWF8ZWFkfGVhZGlyZWN0aW9ufGVifGVkfGVkY29tcGF0aWJsZXxlZnxlZm18ZWl8ZWt8ZW5jfGVuY29kaW5nfGVuZG9mbGluZXxlb2x8ZXB8ZXF1YWxhbHdheXN8ZXF1YWxwcmd8ZXJyb3JiZWxsc3xlcnJvcmZpbGV8ZXJyb3Jmb3JtYXR8ZXNja2V5c3xldHxldmVudGlnbm9yZXxleHBhbmR0YWJ8ZXhyY3xmY2x8ZmNzfGZkY3xmZGV8ZmRpfGZkbHxmZGxzfGZkbXxmZG58ZmRvfGZkdHxmZW58ZmVuY3xmZW5jc3xmZXh8ZmZ8ZmZzfGZpbGVlbmNvZGluZ3xmaWxlZW5jb2RpbmdzfGZpbGVmb3JtYXR8ZmlsZWZvcm1hdHN8ZmlsbGNoYXJzfGZrfGZrbWFwfGZscHxmbWx8Zm1yfGZvbGRjb2x1bW58Zm9sZGVuYWJsZXxmb2xkZXhwcnxmb2xkaWdub3JlfGZvbGRsZXZlbHxmb2xkbGV2ZWxzdGFydHxmb2xkbWFya2VyfGZvbGRtZXRob2R8Zm9sZG1pbmxpbmVzfGZvbGRuZXN0bWF4fGZvbGR0ZXh0fGZvcm1hdGV4cHJ8Zm9ybWF0bGlzdHBhdHxmb3JtYXRvcHRpb25zfGZvcm1hdHByZ3xmcHxmc3xmc3luY3xmdHxnY3J8Z2R8Z2RlZmF1bHR8Z2ZtfGdmbnxnZnN8Z2Z3fGdocnxncHxncmVwZm9ybWF0fGdyZXBwcmd8Z3RsfGd0dHxndWljdXJzb3J8Z3VpZm9udHxndWlmb250c2V0fGd1aWZvbnR3aWRlfGd1aWhlYWRyb29tfGd1aW9wdGlvbnN8Z3VpcHR5fGd1aXRhYmxhYmVsfGd1aXRhYnRvb2x0aXB8aGVscGZpbGV8aGVscGhlaWdodHxoZWxwbGFuZ3xoZnxoaHxoaXxoaWRkZW58aGlnaGxpZ2h0fGhrfGhrbWFwfGhrbWFwcHxoa3B8aGx8aGxnfGhsc3xobHNlYXJjaHxpY3xpY29ufGljb25zdHJpbmd8aWdub3JlY2FzZXxpbXxpbWFjdGl2YXRla2V5fGltYWt8aW1jfGltY21kbGluZXxpbWR8aW1kaXNhYmxlfGltaXxpbWluc2VydHxpbXN8aW1zZWFyY2h8aW5jfGluY2x1ZGV8aW5jbHVkZWV4cHJ8aW5jc2VhcmNofGluZGV8aW5kZW50ZXhwcnxpbmRlbnRrZXlzfGluZGt8aW5leHxpbmZ8aW5mZXJjYXNlfGluc2VydG1vZGV8aW52YWNkfGludmFpfGludmFrbXxpbnZhbGxvd3Jldmluc3xpbnZhbHRrZXltYXB8aW52YW50aXxpbnZhbnRpYWxpYXN8aW52YXJ8aW52YXJhYnxpbnZhcmFiaWN8aW52YXJhYmljc2hhcGV8aW52YXJpfGludmFyc2hhcGV8aW52YXV0b2NoZGlyfGludmF1dG9pbmRlbnR8aW52YXV0b3JlYWR8aW52YXV0b3dyaXRlfGludmF1dG93cml0ZWFsbHxpbnZhd3xpbnZhd2F8aW52YmFja3VwfGludmJhbGxvb25ldmFsfGludmJldmFsfGludmJpbnxpbnZiaW5hcnl8aW52Ymlvc2t8aW52Ymlvc2tleXxpbnZia3xpbnZibHxpbnZib21ifGludmJ1Zmxpc3RlZHxpbnZjZnxpbnZjaXxpbnZjaW58aW52Y2luZGVudHxpbnZjb21wYXRpYmxlfGludmNvbmZpcm18aW52Y29uc2t8aW52Y29uc2tleXxpbnZjb3B5aW5kZW50fGludmNwfGludmNzY29wZXRhZ3xpbnZjc2NvcGV2ZXJib3NlfGludmNzdHxpbnZjc3ZlcmJ8aW52Y3VjfGludmN1bHxpbnZjdXJzb3Jjb2x1bW58aW52Y3Vyc29ybGluZXxpbnZkZWNvfGludmRlbGNvbWJpbmV8aW52ZGd8aW52ZGlmZnxpbnZkaWdyYXBofGludmRpc2FibGV8aW52ZWF8aW52ZWJ8aW52ZWR8aW52ZWRjb21wYXRpYmxlfGludmVrfGludmVuZG9mbGluZXxpbnZlb2x8aW52ZXF1YWxhbHdheXN8aW52ZXJyb3JiZWxsc3xpbnZlc2NrZXlzfGludmV0fGludmV4fGludmV4cGFuZHRhYnxpbnZleHJjfGludmZlbnxpbnZma3xpbnZma21hcHxpbnZmb2xkZW5hYmxlfGludmdkfGludmdkZWZhdWx0fGludmd1aXB0eXxpbnZoaWR8aW52aGlkZGVufGludmhrfGludmhrbWFwfGludmhrbWFwcHxpbnZoa3B8aW52aGxzfGludmhsc2VhcmNofGludmljfGludmljb258aW52aWdub3JlY2FzZXxpbnZpbXxpbnZpbWN8aW52aW1jbWRsaW5lfGludmltZHxpbnZpbmNzZWFyY2h8aW52aW5mfGludmluZmVyY2FzZXxpbnZpbnNlcnRtb2RlfGludmlzfGludmpvaW5zcGFjZXN8aW52anN8aW52bGF6eXJlZHJhd3xpbnZsYnJ8aW52bGluZWJyZWFrfGludmxpc3B8aW52bGlzdHxpbnZsb2FkcGx1Z2luc3xpbnZscGx8aW52bHp8aW52bWF8aW52bWFjYXRzdWl8aW52bWFnaWN8aW52bWh8aW52bWx8aW52bW9kfGludm1vZGVsaW5lfGludm1vZGlmaWFibGV8aW52bW9kaWZpZWR8aW52bW9yZXxpbnZtb3VzZWZ8aW52bW91c2Vmb2N1c3xpbnZtb3VzZWhpZGV8aW52bnV8aW52bnVtYmVyfGludm9kZXZ8aW52b3BlbmRldmljZXxpbnZwYXN0ZXxpbnZwaXxpbnZwcmVzZXJ2ZWluZGVudHxpbnZwcmV2aWV3d2luZG93fGludnByb21wdHxpbnZwdnd8aW52cmVhZG9ubHl8aW52cmVtYXB8aW52cmVzdG9yZXNjcmVlbnxpbnZyZXZpbnN8aW52cml8aW52cmlnaHRsZWZ0fGludnJpZ2h0bGVmdGNtZHxpbnZybHxpbnZybGN8aW52cm98aW52cnN8aW52cnV8aW52cnVsZXJ8aW52c2J8aW52c2N8aW52c2NifGludnNjcm9sbGJpbmR8aW52c2NzfGludnNlY3VyZXxpbnZzZnR8aW52c2hlbGxzbGFzaHxpbnZzaGVsbHRlbXB8aW52c2hpZnRyb3VuZHxpbnZzaG9ydG5hbWV8aW52c2hvd2NtZHxpbnZzaG93ZnVsbHRhZ3xpbnZzaG93bWF0Y2h8aW52c2hvd21vZGV8aW52c2l8aW52c218aW52c21hcnRjYXNlfGludnNtYXJ0aW5kZW50fGludnNtYXJ0dGFifGludnNtZHxpbnZzbnxpbnZzb2x8aW52c3BlbGx8aW52c3BsaXRiZWxvd3xpbnZzcGxpdHJpZ2h0fGludnNwcnxpbnZzcnxpbnZzc2x8aW52c3RhfGludnN0YXJ0b2ZsaW5lfGludnN0bXB8aW52c3dhcGZpbGV8aW52c3dmfGludnRhfGludnRhZ2JzZWFyY2h8aW52dGFncmVsYXRpdmV8aW52dGFnc3RhY2t8aW52dGJpfGludnRiaWRpfGludnRic3xpbnZ0ZXJtYmlkaXxpbnZ0ZXJzZXxpbnZ0ZXh0YXV0b3xpbnZ0ZXh0bW9kZXxpbnZ0ZnxpbnZ0Z3N0fGludnRpbGRlb3B8aW52dGltZW91dHxpbnZ0aXRsZXxpbnZ0b3xpbnZ0b3B8aW52dHJ8aW52dHRpbWVvdXR8aW52dHR5YnVpbHRpbnxpbnZ0dHlmYXN0fGludnR4fGludnZifGludnZpc3VhbGJlbGx8aW52d2F8aW52d2FybnxpbnZ3YnxpbnZ3ZWlyZGludmVydHxpbnZ3Zmh8aW52d2Z3fGludndpbGRtZW51fGludndpbmZpeGhlaWdodHxpbnZ3aW5maXh3aWR0aHxpbnZ3aXZ8aW52d21udXxpbnZ3cmFwfGludndyYXBzY2FufGludndyaXRlfGludndyaXRlYW55fGludndyaXRlYmFja3VwfGludndzfGlzZnxpc2ZuYW1lfGlzaXxpc2lkZW50fGlza3xpc2tleXdvcmR8aXNwcmludHxqb2luc3BhY2VzfGpzfGtleXxrZXltYXB8a2V5bW9kZWx8a2V5d29yZHByZ3xrbXxrbXB8a3B8bGFuZ21hcHxsYW5nbWVudXxsYXN0c3RhdHVzfGxhenlyZWRyYXd8bGJyfGxjc3xsaW5lYnJlYWt8bGluZXN8bGluZXNwYWNlfGxpc3B8bGlzcHdvcmRzfGxpc3RjaGFyc3xsb2FkcGx1Z2luc3xscGx8bHNwfGx6fG1hY2F0c3VpfG1hZ2ljfG1ha2VlZnxtYWtlcHJnfG1hdGNocGFpcnN8bWF0Y2h0aW1lfG1heGNvbWJpbmV8bWF4ZnVuY2RlcHRofG1heG1hcGRlcHRofG1heG1lbXxtYXhtZW1wYXR0ZXJufG1heG1lbXRvdHxtY298bWVmfG1lbnVpdGVtc3xtZmR8bWh8bWlzfG1rc3BlbGxtZW18bWx8bWxzfG1tfG1tZHxtbXB8bW10fG1vZGVsaW5lfG1vZGVsaW5lc3xtb2RpZmlhYmxlfG1vZGlmaWVkfG1vcmV8bW91c2V8bW91c2VmfG1vdXNlZm9jdXN8bW91c2VoaWRlfG1vdXNlbXxtb3VzZW1vZGVsfG1vdXNlc3xtb3VzZXNoYXBlfG1vdXNldHxtb3VzZXRpbWV8bXB8bXBzfG1zbXxtenF8bXpxdWFudHVtfG5mfG5vYWNkfG5vYWl8bm9ha218bm9hbGxvd3Jldmluc3xub2FsdGtleW1hcHxub2FudGl8bm9hbnRpYWxpYXN8bm9hcnxub2FyYWJ8bm9hcmFiaWN8bm9hcmFiaWNzaGFwZXxub2FyaXxub2Fyc2hhcGV8bm9hdXRvY2hkaXJ8bm9hdXRvaW5kZW50fG5vYXV0b3JlYWR8bm9hdXRvd3JpdGV8bm9hdXRvd3JpdGVhbGx8bm9hd3xub2F3YXxub2JhY2t1cHxub2JhbGxvb25ldmFsfG5vYmV2YWx8bm9iaW58bm9iaW5hcnl8bm9iaW9za3xub2Jpb3NrZXl8bm9ia3xub2JsfG5vYm9tYnxub2J1Zmxpc3RlZHxub2NmfG5vY2l8bm9jaW58bm9jaW5kZW50fG5vY29tcGF0aWJsZXxub2NvbmZpcm18bm9jb25za3xub2NvbnNrZXl8bm9jb3B5aW5kZW50fG5vY3B8bm9jc2NvcGV0YWd8bm9jc2NvcGV2ZXJib3NlfG5vY3N0fG5vY3N2ZXJifG5vY3VjfG5vY3VsfG5vY3Vyc29yY29sdW1ufG5vY3Vyc29ybGluZXxub2RlY298bm9kZWxjb21iaW5lfG5vZGd8bm9kaWZmfG5vZGlncmFwaHxub2Rpc2FibGV8bm9lYXxub2VifG5vZWR8bm9lZGNvbXBhdGlibGV8bm9la3xub2VuZG9mbGluZXxub2VvbHxub2VxdWFsYWx3YXlzfG5vZXJyb3JiZWxsc3xub2VzY2tleXN8bm9ldHxub2V4fG5vZXhwYW5kdGFifG5vZXhyY3xub2Zlbnxub2ZrfG5vZmttYXB8bm9mb2xkZW5hYmxlfG5vZ2R8bm9nZGVmYXVsdHxub2d1aXB0eXxub2hpZHxub2hpZGRlbnxub2hrfG5vaGttYXB8bm9oa21hcHB8bm9oa3B8bm9obHN8bm9pY3xub2ljb258bm9pZ25vcmVjYXNlfG5vaW18bm9pbWN8bm9pbWNtZGxpbmV8bm9pbWR8bm9pbmNzZWFyY2h8bm9pbmZ8bm9pbmZlcmNhc2V8bm9pbnNlcnRtb2RlfG5vaXN8bm9qb2luc3BhY2VzfG5vanN8bm9sYXp5cmVkcmF3fG5vbGJyfG5vbGluZWJyZWFrfG5vbGlzcHxub2xpc3R8bm9sb2FkcGx1Z2luc3xub2xwbHxub2x6fG5vbWF8bm9tYWNhdHN1aXxub21hZ2ljfG5vbWh8bm9tbHxub21vZHxub21vZGVsaW5lfG5vbW9kaWZpYWJsZXxub21vZGlmaWVkfG5vbW9yZXxub21vdXNlZnxub21vdXNlZm9jdXN8bm9tb3VzZWhpZGV8bm9udXxub251bWJlcnxub29kZXZ8bm9vcGVuZGV2aWNlfG5vcGFzdGV8bm9waXxub3ByZXNlcnZlaW5kZW50fG5vcHJldmlld3dpbmRvd3xub3Byb21wdHxub3B2d3xub3JlYWRvbmx5fG5vcmVtYXB8bm9yZXN0b3Jlc2NyZWVufG5vcmV2aW5zfG5vcml8bm9yaWdodGxlZnR8bm9yaWdodGxlZnRjbWR8bm9ybHxub3JsY3xub3JvfG5vcnN8bm9ydXxub3J1bGVyfG5vc2J8bm9zY3xub3NjYnxub3Njcm9sbGJpbmR8bm9zY3N8bm9zZWN1cmV8bm9zZnR8bm9zaGVsbHNsYXNofG5vc2hlbGx0ZW1wfG5vc2hpZnRyb3VuZHxub3Nob3J0bmFtZXxub3Nob3djbWR8bm9zaG93ZnVsbHRhZ3xub3Nob3dtYXRjaHxub3Nob3dtb2RlfG5vc2l8bm9zbXxub3NtYXJ0Y2FzZXxub3NtYXJ0aW5kZW50fG5vc21hcnR0YWJ8bm9zbWR8bm9zbnxub3NvbHxub3NwZWxsfG5vc3BsaXRiZWxvd3xub3NwbGl0cmlnaHR8bm9zcHJ8bm9zcnxub3NzbHxub3N0YXxub3N0YXJ0b2ZsaW5lfG5vc3RtcHxub3N3YXBmaWxlfG5vc3dmfG5vdGF8bm90YWdic2VhcmNofG5vdGFncmVsYXRpdmV8bm90YWdzdGFja3xub3RiaXxub3RiaWRpfG5vdGJzfG5vdGVybWJpZGl8bm90ZXJzZXxub3RleHRhdXRvfG5vdGV4dG1vZGV8bm90Znxub3Rnc3R8bm90aWxkZW9wfG5vdGltZW91dHxub3RpdGxlfG5vdG98bm90b3B8bm90cnxub3R0aW1lb3V0fG5vdHR5YnVpbHRpbnxub3R0eWZhc3R8bm90eHxub3ZifG5vdmlzdWFsYmVsbHxub3dhfG5vd2Fybnxub3difG5vd2VpcmRpbnZlcnR8bm93Zmh8bm93Znd8bm93aWxkbWVudXxub3dpbmZpeGhlaWdodHxub3dpbmZpeHdpZHRofG5vd2l2fG5vd21udXxub3dyYXB8bm93cmFwc2Nhbnxub3dyaXRlfG5vd3JpdGVhbnl8bm93cml0ZWJhY2t1cHxub3dzfG5yZm9ybWF0c3xudW1iZXJ3aWR0aHxudXd8b2RldnxvZnR8b2Z1fG9tbmlmdW5jfG9wZW5kZXZpY2V8b3BlcmF0b3JmdW5jfG9wZnVuY3xvc2ZpbGV0eXBlfHBhfHBhcmF8cGFyYWdyYXBoc3xwYXN0ZXxwYXN0ZXRvZ2dsZXxwYXRjaGV4cHJ8cGF0Y2htb2RlfHBhdGh8cGRldnxwZW5jfHBleHxwZXhwcnxwZm58cGh8cGhlYWRlcnxwaXxwbXxwbWJjc3xwbWJmbnxwb3B0fHByZXNlcnZlaW5kZW50fHByZXZpZXdoZWlnaHR8cHJldmlld3dpbmRvd3xwcmludGRldmljZXxwcmludGVuY29kaW5nfHByaW50ZXhwcnxwcmludGZvbnR8cHJpbnRoZWFkZXJ8cHJpbnRtYmNoYXJzZXR8cHJpbnRtYmZvbnR8cHJpbnRvcHRpb25zfHByb21wdHxwdHxwdW1oZWlnaHR8cHZofHB2d3xxZXxxdW90ZWVzY2FwZXxyZWFkb25seXxyZW1hcHxyZXBvcnR8cmVzdG9yZXNjcmVlbnxyZXZpbnN8cmlnaHRsZWZ0fHJpZ2h0bGVmdGNtZHxybHxybGN8cm98cnN8cnRwfHJ1ZnxydWxlcnxydWxlcmZvcm1hdHxydW50aW1lcGF0aHxzYm98c2N8c2NifHNjcnxzY3JvbGx8c2Nyb2xsYmluZHxzY3JvbGxqdW1wfHNjcm9sbG9mZnxzY3JvbGxvcHR8c2NzfHNlY3R8c2VjdGlvbnN8c2VjdXJlfHNlbHxzZWxlY3Rpb258c2VsZWN0bW9kZXxzZXNzaW9ub3B0aW9uc3xzZnR8c2hjZnxzaGVsbGNtZGZsYWd8c2hlbGxwaXBlfHNoZWxscXVvdGV8c2hlbGxyZWRpcnxzaGVsbHNsYXNofHNoZWxsdGVtcHxzaGVsbHR5cGV8c2hlbGx4cXVvdGV8c2hpZnRyb3VuZHxzaGlmdHdpZHRofHNobXxzaG9ydG1lc3N8c2hvcnRuYW1lfHNob3dicmVha3xzaG93Y21kfHNob3dmdWxsdGFnfHNob3dtYXRjaHxzaG93bW9kZXxzaG93dGFibGluZXxzaHF8c2l8c2lkZXNjcm9sbHxzaWRlc2Nyb2xsb2ZmfHNpc298c2p8c2xtfHNtYXJ0Y2FzZXxzbWFydGluZGVudHxzbWFydHRhYnxzbWN8c21kfHNvZnR0YWJzdG9wfHNvbHxzcGN8c3BlbGx8c3BlbGxjYXBjaGVja3xzcGVsbGZpbGV8c3BlbGxsYW5nfHNwZWxsc3VnZ2VzdHxzcGZ8c3BsfHNwbGl0YmVsb3d8c3BsaXRyaWdodHxzcHN8c3J8c3JyfHNzfHNzbHxzc29wfHN0YWx8c3RhcnRvZmxpbmV8c3RhdHVzbGluZXxzdGx8c3RtcHxzdXxzdWF8c3VmZml4ZXN8c3VmZml4ZXNhZGR8c3d8c3dhcGZpbGV8c3dhcHN5bmN8c3difHN3Znxzd2l0Y2hidWZ8c3dzfHN4cXxzeW58c3lubWF4Y29sfHN5bnRheHx0X0FCfHRfQUZ8dF9BTHx0X0NTfHRfQ1Z8dF9DZXx0X0NvfHRfQ3N8dF9ETHx0X0VJfHRfRjF8dF9GMnx0X0YzfHRfRjR8dF9GNXx0X0Y2fHRfRjd8dF9GOHx0X0Y5fHRfSUV8dF9JU3x0X0sxfHRfSzN8dF9LNHx0X0s1fHRfSzZ8dF9LN3x0X0s4fHRfSzl8dF9LQXx0X0tCfHRfS0N8dF9LRHx0X0tFfHRfS0Z8dF9LR3x0X0tIfHRfS0l8dF9LSnx0X0tLfHRfS0x8dF9SSXx0X1JWfHRfU0l8dF9TYnx0X1NmfHRfV1B8dF9XU3x0X1pIfHRfWlJ8dF9hbHx0X2JjfHRfY2R8dF9jZXx0X2NsfHRfY218dF9jc3x0X2RhfHRfZGJ8dF9kbHx0X2ZzfHRfazF8dF9rMnx0X2szfHRfazR8dF9rNXx0X2s2fHRfazd8dF9rOHx0X2s5fHRfa0J8dF9rRHx0X2tJfHRfa058dF9rUHx0X2tifHRfa2R8dF9rZXx0X2tofHRfa2x8dF9rcnx0X2tzfHRfa3V8dF9sZXx0X21ifHRfbWR8dF9tZXx0X21yfHRfbXN8dF9uZHx0X29wfHRfc2V8dF9zb3x0X3NyfHRfdGV8dF90aXx0X3RzfHRfdWV8dF91c3x0X3V0fHRfdmJ8dF92ZXx0X3ZpfHRfdnN8dF94c3x0YWJsaW5lfHRhYnBhZ2VtYXh8dGFic3RvcHx0YWdic2VhcmNofHRhZ2xlbmd0aHx0YWdyZWxhdGl2ZXx0YWdzdGFja3x0YWx8dGJ8dGJpfHRiaWRpfHRiaXN8dGJzfHRlbmN8dGVybXx0ZXJtYmlkaXx0ZXJtZW5jb2Rpbmd8dGVyc2V8dGV4dGF1dG98dGV4dG1vZGV8dGV4dHdpZHRofHRnc3R8dGhlc2F1cnVzfHRpbGRlb3B8dGltZW91dHx0aW1lb3V0bGVufHRpdGxlfHRpdGxlbGVufHRpdGxlb2xkfHRpdGxlc3RyaW5nfHRvb2xiYXJ8dG9vbGJhcmljb25zaXplfHRvcHx0cG18dHNsfHRzcnx0dGltZW91dHx0dGltZW91dGxlbnx0dG18dHR5fHR0eWJ1aWx0aW58dHR5ZmFzdHx0dHltfHR0eW1vdXNlfHR0eXNjcm9sbHx0dHl0eXBlfHR3fHR4fHVjfHVsfHVuZG9sZXZlbHN8dXBkYXRlY291bnR8dXBkYXRldGltZXx1dHx2Ynx2YnN8dmRpcnx2ZXJib3NlZmlsZXx2ZmlsZXx2aWV3ZGlyfHZpZXdvcHRpb25zfHZpbWluZm98dmlydHVhbGVkaXR8dmlzdWFsYmVsbHx2b3B8d2FrfHdhcm58d2J8d2N8d2NtfHdkfHdlaXJkaW52ZXJ0fHdmaHx3Znd8d2hpY2h3cmFwfHdpfHdpZ3x3aWxkY2hhcnx3aWxkY2hhcm18d2lsZGlnbm9yZXx3aWxkbWVudXx3aWxkbW9kZXx3aWxkb3B0aW9uc3x3aW18d2luYWx0a2V5c3x3aW5kb3d8d2luZml4aGVpZ2h0fHdpbmZpeHdpZHRofHdpbmhlaWdodHx3aW5taW5oZWlnaHR8d2lubWlud2lkdGh8d2lud2lkdGh8d2l2fHdpd3x3bXx3bWh8d21udXx3bXd8d29wfHdyYXB8d3JhcG1hcmdpbnx3cmFwc2Nhbnx3cml0ZWFueXx3cml0ZWJhY2t1cHx3cml0ZWRlbGF5fHd3KVxcYi8sXG5cdCdudW1iZXInOiAvXFxiKD86MHhbXFxkYS1mXSt8XFxkKyg/OlxcLlxcZCspPylcXGIvaSxcblx0J29wZXJhdG9yJzogL1xcfFxcfHwmJnxbLSsuXT0/fFs9IV0oPzpbPX5dWyM/XT8pP3xbPD5dPT9bIz9dP3xbKlxcLyU/XXxcXGIoPzppcyg/Om5vdCk/KVxcYi8sXG5cdCdwdW5jdHVhdGlvbic6IC9be31bXFxdKCksOzpdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzWyd2aXN1YWwtYmFzaWMnXSA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyg/OlsnXHUyMDE4XHUyMDE5XXxSRU1cXGIpKD86W15cXHJcXG5fXXxfKD86XFxyXFxuP3xcXG4pPykqL2ksXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQna2V5d29yZCc6IC9eUkVNL2lcblx0XHR9XG5cdH0sXG5cdCdkaXJlY3RpdmUnOiB7XG5cdFx0cGF0dGVybjogLyMoPzpDb25zdHxFbHNlfEVsc2VJZnxFbmR8RXh0ZXJuYWxDaGVja3N1bXxFeHRlcm5hbFNvdXJjZXxJZnxSZWdpb24pKD86XFxiX1sgXFx0XSooPzpcXHJcXG4/fFxcbil8LikrL2ksXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eScsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1xcJD9bXCJcdTIwMUNcdTIwMURdKD86W1wiXHUyMDFDXHUyMDFEXXsyfXxbXlwiXHUyMDFDXHUyMDFEXSkqW1wiXHUyMDFDXHUyMDFEXUM/L2ksXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdkYXRlJzoge1xuXHRcdHBhdHRlcm46IC8jWyBcXHRdKig/OlxcZCsoWy8tXSlcXGQrXFwxXFxkKyg/OlsgXFx0XSsoPzpcXGQrWyBcXHRdKig/OkFNfFBNKXxcXGQrOlxcZCsoPzo6XFxkKyk/KD86WyBcXHRdKig/OkFNfFBNKSk/KSk/fFxcZCtbIFxcdF0qKD86QU18UE0pfFxcZCs6XFxkKyg/OjpcXGQrKT8oPzpbIFxcdF0qKD86QU18UE0pKT8pWyBcXHRdKiMvaSxcblx0XHRhbGlhczogJ251bWJlcidcblx0fSxcblx0J251bWJlcic6IC8oPzooPzpcXGJcXGQrKD86XFwuXFxkKyk/fFxcLlxcZCspKD86RVsrLV0/XFxkKyk/fCZbSE9dW1xcZEEtRl0rKSg/OltGUkRdfFU/W0lMU10pPy9pLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpGYWxzZXxOb3RoaW5nfFRydWUpXFxiL2ksXG5cdCdrZXl3b3JkJzogL1xcYig/OkFkZEhhbmRsZXJ8QWRkcmVzc09mfEFsaWFzfEFuZCg/OkFsc28pP3xBc3xCb29sZWFufEJ5UmVmfEJ5dGV8QnlWYWx8Q2FsbHxDYXNlfENhdGNofEMoPzpCb29sfEJ5dGV8Q2hhcnxEYXRlfERibHxEZWN8SW50fExuZ3xPYmp8U0J5dGV8U2hvcnR8U25nfFN0cnxUeXBlfFVJbnR8VUxuZ3xVU2hvcnQpfENoYXJ8Q2xhc3N8Q29uc3R8Q29udGludWV8Q3VycmVuY3l8RGF0ZXxEZWNpbWFsfERlY2xhcmV8RGVmYXVsdHxEZWxlZ2F0ZXxEaW18RGlyZWN0Q2FzdHxEb3xEb3VibGV8RWFjaHxFbHNlKD86SWYpP3xFbmQoPzpJZik/fEVudW18RXJhc2V8RXJyb3J8RXZlbnR8RXhpdHxGaW5hbGx5fEZvcnxGcmllbmR8RnVuY3Rpb258R2V0KD86VHlwZXxYTUxOYW1lc3BhY2UpP3xHbG9iYWx8R29TdWJ8R29Ub3xIYW5kbGVzfElmfEltcGxlbWVudHN8SW1wb3J0c3xJbnxJbmhlcml0c3xJbnRlZ2VyfEludGVyZmFjZXxJc3xJc05vdHxMZXR8TGlifExpa2V8TG9uZ3xMb29wfE1lfE1vZHxNb2R1bGV8TXVzdCg/OkluaGVyaXR8T3ZlcnJpZGUpfE15KD86QmFzZXxDbGFzcyl8TmFtZXNwYWNlfE5hcnJvd2luZ3xOZXd8TmV4dHxOb3QoPzpJbmhlcml0YWJsZXxPdmVycmlkYWJsZSk/fE9iamVjdHxPZnxPbnxPcGVyYXRvcnxPcHRpb24oPzphbCk/fE9yKD86RWxzZSk/fE91dHxPdmVybG9hZHN8T3ZlcnJpZGFibGV8T3ZlcnJpZGVzfFBhcmFtQXJyYXl8UGFydGlhbHxQcml2YXRlfFByb3BlcnR5fFByb3RlY3RlZHxQdWJsaWN8UmFpc2VFdmVudHxSZWFkT25seXxSZURpbXxSZW1vdmVIYW5kbGVyfFJlc3VtZXxSZXR1cm58U0J5dGV8U2VsZWN0fFNldHxTaGFkb3dzfFNoYXJlZHxzaG9ydHxTaW5nbGV8U3RhdGljfFN0ZXB8U3RvcHxTdHJpbmd8U3RydWN0dXJlfFN1YnxTeW5jTG9ja3xUaGVufFRocm93fFRvfFRyeXxUcnlDYXN0fFR5cGV8VHlwZU9mfFUoPzpJbnRlZ2VyfExvbmd8U2hvcnQpfFVudGlsfFVzaW5nfFZhcmlhbnR8V2VuZHxXaGVufFdoaWxlfFdpZGVuaW5nfFdpdGgoPzpFdmVudHMpP3xXcml0ZU9ubHl8WG9yKVxcYi9pLFxuXHQnb3BlcmF0b3InOiAvWytcXC0qL1xcXFxePD0+JiNAJCUhXXxcXGJfKD89WyBcXHRdKltcXHJcXG5dKS8sXG5cdCdwdW5jdHVhdGlvbic6IC9be30oKS4sOj9dL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnZiID0gUHJpc20ubGFuZ3VhZ2VzWyd2aXN1YWwtYmFzaWMnXTtcblByaXNtLmxhbmd1YWdlcy52YmEgPSBQcmlzbS5sYW5ndWFnZXNbJ3Zpc3VhbC1iYXNpYyddO1xuXG5QcmlzbS5sYW5ndWFnZXMud2FycHNjcmlwdCA9IHtcblx0J2NvbW1lbnQnOiAvIy4qfFxcL1xcLy4qfFxcL1xcKltcXHNcXFNdKj9cXCpcXC8vLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlteXCJcXFxcXFxyXFxuXXxcXFxcLikqXCJ8Jyg/OlteJ1xcXFxcXHJcXG5dfFxcXFwuKSonfDwnKD86W15cXFxcJ118Jyg/IT4pfFxcXFwuKSonPi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCd2YXJpYWJsZSc6IC9cXCRcXFMrLyxcblx0J21hY3JvJzoge1xuXHRcdHBhdHRlcm46IC9AXFxTKy8sXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblx0Ly8gV2FycFNjcmlwdCBkb2Vzbid0IGhhdmUgYW55IGtleXdvcmRzLCB0aGVzZSBhcmUgYWxsIGZ1bmN0aW9ucyB1bmRlciB0aGUgY29udHJvbCBjYXRlZ29yeVxuXHQvLyBodHRwczovL3d3dy53YXJwMTAuaW8vdGFncy9jb250cm9sXG5cdCdrZXl3b3JkJzogL1xcYig/OkJSRUFLfENIRUNLTUFDUk98Q09OVElOVUV8Q1VERnxERUZJTkVEfERFRklORURNQUNST3xFVkFMfEZBSUx8Rk9SfEZPUkVBQ0h8Rk9SU1RFUHxJRlR8SUZURXxNU0dGQUlMfE5SRVRVUk58UkVUSFJPV3xSRVRVUk58U1dJVENIfFRSWXxVREZ8VU5USUx8V0hJTEUpXFxiLyxcblx0J251bWJlcic6IC9bKy1dP1xcYig/Ok5hTnxJbmZpbml0eXxcXGQrKD86XFwuXFxkKik/KD86W0VlXVsrLV0/XFxkKyk/fDB4W1xcZGEtZkEtRl0rfDBiWzAxXSspXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86RnxUfGZhbHNlfHRydWUpXFxiLyxcblx0J3B1bmN0dWF0aW9uJzogLzwlfCU+fFt7fVtcXF0oKV0vLFxuXHQvLyBTb21lIG9wZXJhdG9ycyBmcm9tIHRoZSBcIm9wZXJhdG9yc1wiIGNhdGVnb3J5XG5cdC8vIGh0dHBzOi8vd3d3LndhcnAxMC5pby90YWdzL29wZXJhdG9yc1xuXHQnb3BlcmF0b3InOiAvPT18JiY/fFxcfFxcfD98XFwqXFwqP3w+Pj4/fDw8fFs8PiF+XT0/fFstLyVeXXxcXCshP3xcXGIoPzpBTkR8Tk9UfE9SKVxcYi9cbn07XG5cblByaXNtLmxhbmd1YWdlcy53YXNtID0ge1xuXHQnY29tbWVudCc6IFtcblx0XHQvXFwoO1tcXHNcXFNdKj87XFwpLyxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvOzsuKi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86XFxcXFtcXHNcXFNdfFteXCJcXFxcXSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86YWxpZ258b2Zmc2V0KT0vLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdvcGVyYXRvcic6IC89L1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcYig/Oig/OmYzMnxmNjR8aTMyfGk2NCkoPzpcXC4oPzphYnN8YWRkfGFuZHxjZWlsfGNsenxjb25zdHxjb252ZXJ0X1tzdV1cXC9pKD86MzJ8NjQpfGNvcHlzaWdufGN0enxkZW1vdGVcXC9mNjR8ZGl2KD86X1tzdV0pP3xlcXo/fGV4dGVuZF9bc3VdXFwvaTMyfGZsb29yfGdlKD86X1tzdV0pP3xndCg/Ol9bc3VdKT98bGUoPzpfW3N1XSk/fGxvYWQoPzooPzo4fDE2fDMyKV9bc3VdKT98bHQoPzpfW3N1XSk/fG1heHxtaW58bXVsfG5lZz98bmVhcmVzdHxvcnxwb3BjbnR8cHJvbW90ZVxcL2YzMnxyZWludGVycHJldFxcL1tmaV0oPzozMnw2NCl8cmVtX1tzdV18cm90W2xyXXxzaGx8c2hyX1tzdV18c3FydHxzdG9yZSg/Ojh8MTZ8MzIpP3xzdWJ8dHJ1bmMoPzpfW3N1XVxcL2YoPzozMnw2NCkpP3x3cmFwXFwvaTY0fHhvcikpP3xtZW1vcnlcXC4oPzpncm93fHNpemUpKVxcYi8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHRcdH1cblx0XHR9LFxuXHRcdC9cXGIoPzphbnlmdW5jfGJsb2NrfGJyKD86X2lmfF90YWJsZSk/fGNhbGwoPzpfaW5kaXJlY3QpP3xkYXRhfGRyb3B8ZWxlbXxlbHNlfGVuZHxleHBvcnR8ZnVuY3xnZXRfKD86Z2xvYmFsfGxvY2FsKXxnbG9iYWx8aWZ8aW1wb3J0fGxvY2FsfGxvb3B8bWVtb3J5fG1vZHVsZXxtdXR8bm9wfG9mZnNldHxwYXJhbXxyZXN1bHR8cmV0dXJufHNlbGVjdHxzZXRfKD86Z2xvYmFsfGxvY2FsKXxzdGFydHx0YWJsZXx0ZWVfbG9jYWx8dGhlbnx0eXBlfHVucmVhY2hhYmxlKVxcYi9cblx0XSxcblx0J3ZhcmlhYmxlJzogL1xcJFtcXHchIyQlJicqK1xcLS4vOjw9Pj9AXFxcXF5gfH5dKy8sXG5cdCdudW1iZXInOiAvWystXT9cXGIoPzpcXGQoPzpfP1xcZCkqKD86XFwuXFxkKD86Xz9cXGQpKik/KD86W2VFXVsrLV0/XFxkKD86Xz9cXGQpKik/fDB4W1xcZGEtZkEtRl0oPzpfP1tcXGRhLWZBLUZdKSooPzpcXC5bXFxkYS1mQS1GXSg/Ol8/W1xcZGEtZkEtRF0pKik/KD86W3BQXVsrLV0/XFxkKD86Xz9cXGQpKik/KVxcYnxcXGJpbmZcXGJ8XFxibmFuKD86OjB4W1xcZGEtZkEtRl0oPzpfP1tcXGRhLWZBLURdKSopP1xcYi8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKCldL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBpZCA9IC8oPzpcXEItfFxcYl98XFxiKVtBLVphLXpdW1xcdy1dKig/IVtcXHctXSkvLnNvdXJjZTtcblx0dmFyIHR5cGUgPVxuXHRcdCcoPzonICtcblx0XHQvXFxiKD86dW5zaWduZWRcXHMrKT9sb25nXFxzK2xvbmcoPyFbXFx3LV0pLy5zb3VyY2UgK1xuXHRcdCd8JyArXG5cdFx0L1xcYig/OnVucmVzdHJpY3RlZHx1bnNpZ25lZClcXHMrW2Etel0rKD8hW1xcdy1dKS8uc291cmNlICtcblx0XHQnfCcgK1xuXHRcdC8oPyEoPzp1bnJlc3RyaWN0ZWR8dW5zaWduZWQpXFxiKS8uc291cmNlICsgaWQgKyAvKD86XFxzKjwoPzpbXjw+XXw8W148Pl0qPikqPik/Ly5zb3VyY2UgK1xuXHRcdCcpJyArIC8oPzpcXHMqXFw/KT8vLnNvdXJjZTtcblxuXHR2YXIgdHlwZUluc2lkZSA9IHt9O1xuXG5cdFByaXNtLmxhbmd1YWdlc1snd2ViLWlkbCddID0ge1xuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogL1xcL1xcLy4qfFxcL1xcKltcXHNcXFNdKj9cXCpcXC8vLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL1wiW15cIl0qXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblxuXHRcdCduYW1lc3BhY2UnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhcXGJuYW1lc3BhY2VcXHMrKS8uc291cmNlICsgaWQpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHR9LFxuXHRcdCdjbGFzcy1uYW1lJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXHctXSkoPzppdGVyYWJsZXxtYXBsaWtlfHNldGxpa2UpXFxzKjwoPzpbXjw+XXw8W148Pl0qPikqPi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogdHlwZUluc2lkZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXFxiKD86YXR0cmlidXRlfGNvbnN0fGRlbGV0ZXJ8Z2V0dGVyfG9wdGlvbmFsfHNldHRlcilcXHMrKS8uc291cmNlICsgdHlwZSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogdHlwZUluc2lkZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gY2FsbGJhY2sgcmV0dXJuIHR5cGVcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKCcoJyArIC9cXGJjYWxsYmFja1xccysvLnNvdXJjZSArIGlkICsgL1xccyo9XFxzKi8uc291cmNlICsgJyknICsgdHlwZSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogdHlwZUluc2lkZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gdHlwZWRlZlxuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhcXGJ0eXBlZGVmXFxiXFxzKikvLnNvdXJjZSArIHR5cGUpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHR5cGVJbnNpZGVcblx0XHRcdH0sXG5cblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXFxiKD86Y2FsbGJhY2t8ZGljdGlvbmFyeXxlbnVtfGludGVyZmFjZSg/OlxccyttaXhpbik/KVxccyspKD8hKD86aW50ZXJmYWNlfG1peGluKVxcYikvLnNvdXJjZSArIGlkKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGluaGVyaXRhbmNlXG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKDpcXHMqKS8uc291cmNlICsgaWQpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0fSxcblxuXHRcdFx0Ly8gaW5jbHVkZXMgYW5kIGltcGxlbWVudHNcblx0XHRcdFJlZ0V4cChpZCArIC8oPz1cXHMrKD86aW1wbGVtZW50c3xpbmNsdWRlcylcXGIpLy5zb3VyY2UpLFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhcXGIoPzppbXBsZW1lbnRzfGluY2x1ZGVzKVxccyspLy5zb3VyY2UgKyBpZCksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHR9LFxuXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGZ1bmN0aW9uIHJldHVybiB0eXBlLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBkaWN0aW9uYXJ5IG1lbWJlcnNcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKHR5cGUgKyAnKD89JyArIC9cXHMqKD86XFwuezN9XFxzKik/Ly5zb3VyY2UgKyBpZCArIC9cXHMqWygpLDs9XS8uc291cmNlICsgJyknKSxcblx0XHRcdFx0aW5zaWRlOiB0eXBlSW5zaWRlXG5cdFx0XHR9LFxuXHRcdF0sXG5cblx0XHQnYnVpbHRpbic6IC9cXGIoPzpBcnJheUJ1ZmZlcnxCaWdJbnQ2NEFycmF5fEJpZ1VpbnQ2NEFycmF5fEJ5dGVTdHJpbmd8RE9NU3RyaW5nfERhdGFWaWV3fEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8RnJvemVuQXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXxPYnNlcnZhYmxlQXJyYXl8UHJvbWlzZXxVU1ZTdHJpbmd8VWludDE2QXJyYXl8VWludDMyQXJyYXl8VWludDhBcnJheXxVaW50OENsYW1wZWRBcnJheSlcXGIvLFxuXHRcdCdrZXl3b3JkJzogW1xuXHRcdFx0L1xcYig/OmFzeW5jfGF0dHJpYnV0ZXxjYWxsYmFja3xjb25zdHxjb25zdHJ1Y3RvcnxkZWxldGVyfGRpY3Rpb25hcnl8ZW51bXxnZXR0ZXJ8aW1wbGVtZW50c3xpbmNsdWRlc3xpbmhlcml0fGludGVyZmFjZXxtaXhpbnxuYW1lc3BhY2V8bnVsbHxvcHRpb25hbHxvcnxwYXJ0aWFsfHJlYWRvbmx5fHJlcXVpcmVkfHNldHRlcnxzdGF0aWN8c3RyaW5naWZpZXJ8dHlwZWRlZnx1bnJlc3RyaWN0ZWQpXFxiLyxcblx0XHRcdC8vIHR5cGUga2V5d29yZHNcblx0XHRcdC9cXGIoPzphbnl8YmlnaW50fGJvb2xlYW58Ynl0ZXxkb3VibGV8ZmxvYXR8aXRlcmFibGV8bG9uZ3xtYXBsaWtlfG9iamVjdHxvY3RldHxyZWNvcmR8c2VxdWVuY2V8c2V0bGlrZXxzaG9ydHxzeW1ib2x8dW5kZWZpbmVkfHVuc2lnbmVkfHZvaWQpXFxiL1xuXHRcdF0sXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXG5cdFx0J251bWJlcic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcdy1dKS0/KD86MHhbMC05YS1mXSt8KD86XFxkKyg/OlxcLlxcZCopP3xcXC5cXGQrKSg/OmVbKy1dP1xcZCspP3xOYU58SW5maW5pdHkpKD8hW1xcdy1dKS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J29wZXJhdG9yJzogL1xcLnszfXxbPTo/PD4tXS8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1soKXt9W1xcXS4sO10vXG5cdH07XG5cblx0Zm9yICh2YXIga2V5IGluIFByaXNtLmxhbmd1YWdlc1snd2ViLWlkbCddKSB7XG5cdFx0aWYgKGtleSAhPT0gJ2NsYXNzLW5hbWUnKSB7XG5cdFx0XHR0eXBlSW5zaWRlW2tleV0gPSBQcmlzbS5sYW5ndWFnZXNbJ3dlYi1pZGwnXVtrZXldO1xuXHRcdH1cblx0fVxuXG5cdFByaXNtLmxhbmd1YWdlc1snd2ViaWRsJ10gPSBQcmlzbS5sYW5ndWFnZXNbJ3dlYi1pZGwnXTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMud2dzbCA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcL1xcLy4qfFxcL1xcKltcXHNcXFNdKj8oPzpcXCpcXC98JCkvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0fSxcblx0J2J1aWx0aW4tYXR0cmlidXRlJzoge1xuXHRcdHBhdHRlcm46IC8oQClidWlsdGluXFwoLio/XFwpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2F0dHJpYnV0ZSc6IHtcblx0XHRcdFx0cGF0dGVybjogL15idWlsdGluLyxcblx0XHRcdFx0YWxpYXM6ICdhdHRyLW5hbWUnLFxuXHRcdFx0fSxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9bKCksXS8sXG5cdFx0XHQnYnVpbHQtaW4tdmFsdWVzJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxiKD86ZnJhZ19kZXB0aHxmcm9udF9mYWNpbmd8Z2xvYmFsX2ludm9jYXRpb25faWR8aW5zdGFuY2VfaW5kZXh8bG9jYWxfaW52b2NhdGlvbl9pZHxsb2NhbF9pbnZvY2F0aW9uX2luZGV4fG51bV93b3JrZ3JvdXBzfHBvc2l0aW9ufHNhbXBsZV9pbmRleHxzYW1wbGVfbWFza3x2ZXJ0ZXhfaW5kZXh8d29ya2dyb3VwX2lkKVxcYi8sXG5cdFx0XHRcdGFsaWFzOiAnYXR0ci12YWx1ZScsXG5cdFx0XHR9LFxuXHRcdH0sXG5cdH0sXG5cdCdhdHRyaWJ1dGVzJzoge1xuXHRcdHBhdHRlcm46IC8oQCkoPzphbGlnbnxiaW5kaW5nfGNvbXB1dGV8Y29uc3R8ZnJhZ21lbnR8Z3JvdXB8aWR8aW50ZXJwb2xhdGV8aW52YXJpYW50fGxvY2F0aW9ufHNpemV8dmVydGV4fHdvcmtncm91cF9zaXplKS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdhdHRyLW5hbWUnLFxuXHR9LFxuXHQnZnVuY3Rpb25zJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoZm5cXHMrKVtfYS16QS1aXVxcdyooPz1bKDxdKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJyxcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86Yml0Y2FzdHxicmVha3xjYXNlfGNvbnN0fGNvbnRpbnVlfGNvbnRpbnVpbmd8ZGVmYXVsdHxkaXNjYXJkfGVsc2V8ZW5hYmxlfGZhbGx0aHJvdWdofGZufGZvcnxmdW5jdGlvbnxpZnxsZXR8bG9vcHxwcml2YXRlfHJldHVybnxzdG9yYWdlfHN0cnVjdHxzd2l0Y2h8dHlwZXx1bmlmb3JtfHZhcnx3aGlsZXx3b3JrZ3JvdXApXFxiLyxcblx0J2J1aWx0aW4nOiAvXFxiKD86YWJzfGFjb3N8YWNvc2h8YWxsfGFueXxhcnJheXxhc2lufGFzaW5ofGF0YW58YXRhbjJ8YXRhbmh8YXRvbWljfGF0b21pY0FkZHxhdG9taWNBbmR8YXRvbWljQ29tcGFyZUV4Y2hhbmdlV2Vha3xhdG9taWNFeGNoYW5nZXxhdG9taWNMb2FkfGF0b21pY01heHxhdG9taWNNaW58YXRvbWljT3J8YXRvbWljU3RvcmV8YXRvbWljU3VifGF0b21pY1hvcnxib29sfGNlaWx8Y2xhbXB8Y29zfGNvc2h8Y291bnRMZWFkaW5nWmVyb3N8Y291bnRPbmVCaXRzfGNvdW50VHJhaWxpbmdaZXJvc3xjcm9zc3xkZWdyZWVzfGRldGVybWluYW50fGRpc3RhbmNlfGRvdHxkcGR4fGRwZHhDb2Fyc2V8ZHBkeEZpbmV8ZHBkeXxkcGR5Q29hcnNlfGRwZHlGaW5lfGV4cHxleHAyfGV4dHJhY3RCaXRzfGYzMnxmNjR8ZmFjZUZvcndhcmR8Zmlyc3RMZWFkaW5nQml0fGZsb29yfGZtYXxmcmFjdHxmcmV4cHxmd2lkdGh8ZndpZHRoQ29hcnNlfGZ3aWR0aEZpbmV8aTMyfGk2NHxpbnNlcnRCaXRzfGludmVyc2VTcXJ0fGxkZXhwfGxlbmd0aHxsb2d8bG9nMnxtYXRbMi00XXhbMi00XXxtYXh8bWlufG1peHxtb2RmfG5vcm1hbGl6ZXxvdmVycmlkZXxwYWNrMngxNmZsb2F0fHBhY2syeDE2c25vcm18cGFjazJ4MTZ1bm9ybXxwYWNrNHg4c25vcm18cGFjazR4OHVub3JtfHBvd3xwdHJ8cXVhbnRpemVUb0YxNnxyYWRpYW5zfHJlZmxlY3R8cmVmcmFjdHxyZXZlcnNlQml0c3xyb3VuZHxzYW1wbGVyfHNhbXBsZXJfY29tcGFyaXNvbnxzZWxlY3R8c2hpZnRMZWZ0fHNoaWZ0UmlnaHR8c2lnbnxzaW58c2luaHxzbW9vdGhzdGVwfHNxcnR8c3RhdGljQXNzZXJ0fHN0ZXB8c3RvcmFnZUJhcnJpZXJ8dGFufHRhbmh8dGV4dHVyZURpbWVuc2lvbnN8dGV4dHVyZUdhdGhlcnx0ZXh0dXJlR2F0aGVyQ29tcGFyZXx0ZXh0dXJlTG9hZHx0ZXh0dXJlTnVtTGF5ZXJzfHRleHR1cmVOdW1MZXZlbHN8dGV4dHVyZU51bVNhbXBsZXN8dGV4dHVyZVNhbXBsZXx0ZXh0dXJlU2FtcGxlQmlhc3x0ZXh0dXJlU2FtcGxlQ29tcGFyZXx0ZXh0dXJlU2FtcGxlQ29tcGFyZUxldmVsfHRleHR1cmVTYW1wbGVHcmFkfHRleHR1cmVTYW1wbGVMZXZlbHx0ZXh0dXJlU3RvcmV8dGV4dHVyZV8xZHx0ZXh0dXJlXzJkfHRleHR1cmVfMmRfYXJyYXl8dGV4dHVyZV8zZHx0ZXh0dXJlX2N1YmV8dGV4dHVyZV9jdWJlX2FycmF5fHRleHR1cmVfZGVwdGhfMmR8dGV4dHVyZV9kZXB0aF8yZF9hcnJheXx0ZXh0dXJlX2RlcHRoX2N1YmV8dGV4dHVyZV9kZXB0aF9jdWJlX2FycmF5fHRleHR1cmVfZGVwdGhfbXVsdGlzYW1wbGVkXzJkfHRleHR1cmVfbXVsdGlzYW1wbGVkXzJkfHRleHR1cmVfc3RvcmFnZV8xZHx0ZXh0dXJlX3N0b3JhZ2VfMmR8dGV4dHVyZV9zdG9yYWdlXzJkX2FycmF5fHRleHR1cmVfc3RvcmFnZV8zZHx0cmFuc3Bvc2V8dHJ1bmN8dTMyfHU2NHx1bnBhY2syeDE2ZmxvYXR8dW5wYWNrMngxNnNub3JtfHVucGFjazJ4MTZ1bm9ybXx1bnBhY2s0eDhzbm9ybXx1bnBhY2s0eDh1bm9ybXx2ZWNbMi00XXx3b3JrZ3JvdXBCYXJyaWVyKVxcYi8sXG5cdCdmdW5jdGlvbi1jYWxscyc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiW19hLXpdXFx3Kig/PVxcKCkvaSxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJyxcblx0fSxcblx0J2NsYXNzLW5hbWUnOiAvXFxiKD86W0EtWl1bQS1aYS16MC05XSopXFxiLyxcblx0J2Jvb2wtbGl0ZXJhbCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHRcdGFsaWFzOiAnYm9vbGVhbicsXG5cdH0sXG5cdCdoZXgtaW50LWxpdGVyYWwnOiB7XG5cdFx0cGF0dGVybjogL1xcYjBbeFhdWzAtOWEtZkEtRl0rW2l1XT9cXGIoPyFbLnBQXSkvLFxuXHRcdGFsaWFzOiAnbnVtYmVyJyxcblx0fSxcblx0J2hleC1mbG9hdC1saXRlcmFsJzoge1xuXHRcdHBhdHRlcm46IC9cXGIwW3hYXVswLTlhLWZBLUZdKig/OlxcLlswLTlhLWZBLUZdKik/KD86W3BQXVsrLV0/XFxkK1tmaF0/KT8vLCBhbGlhczogJ251bWJlcidcblx0fSxcblx0J2RlY2ltYWwtZmxvYXQtbGl0ZXJhbCc6IFtcblx0XHR7IHBhdHRlcm46IC9cXGQqXFwuXFxkKyg/OltlRV0oPzpcXCt8LSk/XFxkKyk/W2ZoXT8vLCBhbGlhczogJ251bWJlcicgfSxcblx0XHR7IHBhdHRlcm46IC9cXGQrXFwuXFxkKig/OltlRV0oPzpcXCt8LSk/XFxkKyk/W2ZoXT8vLCBhbGlhczogJ251bWJlcicgfSxcblx0XHR7IHBhdHRlcm46IC9cXGQrW2VFXSg/OlxcK3wtKT9cXGQrW2ZoXT8vLCBhbGlhczogJ251bWJlcicgfSxcblx0XHR7IHBhdHRlcm46IC9cXGJcXGQrW2ZoXVxcYi8sIGFsaWFzOiAnbnVtYmVyJyB9LFxuXHRdLFxuXHQnaW50LWxpdGVyYWwnOiB7XG5cdFx0cGF0dGVybjogL1xcYlxcZCtbaXVdP1xcYi8sXG5cdFx0YWxpYXM6ICdudW1iZXInLFxuXHR9LFxuXHQnb3BlcmF0b3InOiBbXG5cdFx0eyBwYXR0ZXJuOiAvKD86XFxefH58XFx8KD8hXFx8KXxcXHxcXHx8JiZ8PDx8Pj58ISkoPyE9KS8gfSxcblx0XHR7IHBhdHRlcm46IC8mKD8hWyY9XSkvIH0sXG5cdFx0eyBwYXR0ZXJuOiAvKD86XFwrPXwtPXxcXCo9fFxcLz18JT18XFxePXwmPXxcXHw9fDw8PXw+Pj0pLyB9LFxuXHRcdHsgcGF0dGVybjogLyhefFtePD49IV0pPSg/IVs9Pl0pLywgbG9va2JlaGluZDogdHJ1ZSB9LFxuXHRcdHsgcGF0dGVybjogLyg/Oj09fCE9fDw9fFxcK1xcK3wtLXwoXnxbXj1dKT49KS8sIGxvb2tiZWhpbmQ6IHRydWUgfSxcblx0XHR7IHBhdHRlcm46IC8oPzooPzpbKyVdfCg/OlxcKig/IVxcdykpKSg/IT0pKXwoPzotKD8hPikpfCg/OlxcLyg/IVxcLykpLyB9LFxuXHRcdHsgcGF0dGVybjogLy0+LyB9LFxuXHRdLFxuXHQncHVuY3R1YXRpb24nOiAvW0AoKXt9W1xcXSw7PD46Ll0vLFxufTtcblxuUHJpc20ubGFuZ3VhZ2VzLndpa2kgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdtYXJrdXAnLCB7XG5cdCdibG9jay1jb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVxcL1xcKltcXHNcXFNdKj9cXCpcXC8vLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdjb21tZW50J1xuXHR9LFxuXHQnaGVhZGluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXig9KylbXj1cXHJcXG5dLio/XFwxL20sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXj0rfD0rJC8sXG5cdFx0XHQnaW1wb3J0YW50JzogLy4rL1xuXHRcdH1cblx0fSxcblx0J2VtcGhhc2lzJzoge1xuXHRcdC8vIFRPRE8gTXVsdGktbGluZVxuXHRcdHBhdHRlcm46IC8oJ3syLDV9KS4rP1xcMS8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnYm9sZC1pdGFsaWMnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oJycnJycpLis/KD89XFwxKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiBbJ2JvbGQnLCAnaXRhbGljJ11cblx0XHRcdH0sXG5cdFx0XHQnYm9sZCc6IHtcblx0XHRcdFx0cGF0dGVybjogLygnJycpW14nXSg/Oi4qP1teJ10pPyg/PVxcMSkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0J2l0YWxpYyc6IHtcblx0XHRcdFx0cGF0dGVybjogLygnJylbXiddKD86Lio/W14nXSk/KD89XFwxKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXicnK3wnJyskL1xuXHRcdH1cblx0fSxcblx0J2hyJzoge1xuXHRcdHBhdHRlcm46IC9eLXs0LH0vbSxcblx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHR9LFxuXHQndXJsJzogW1xuXHRcdC9JU0JOICsoPzo5N1s4OV1bIC1dPyk/KD86XFxkWyAtXT8pezl9W1xcZHhdXFxifCg/OlBNSUR8UkZDKSArXFxkKy9pLFxuXHRcdC9cXFtcXFsuKz9cXF1cXF18XFxbLis/XFxdL1xuXHRdLFxuXHQndmFyaWFibGUnOiBbXG5cdFx0L19fW0EtWl0rX18vLFxuXHRcdC8vIEZJWE1FIE5lc3RlZCBzdHJ1Y3R1cmVzIHNob3VsZCBiZSBoYW5kbGVkXG5cdFx0Ly8ge3tmb3JtYXRudW06e3sjZXhwcjp7e3szfX19fX19fVxuXHRcdC9cXHt7M30uKz9cXH17M30vLFxuXHRcdC9cXHtcXHsuKz9cXH1cXH0vXG5cdF0sXG5cdCdzeW1ib2wnOiBbXG5cdFx0L14jcmVkaXJlY3QvaW0sXG5cdFx0L357Myw1fS9cblx0XSxcblx0Ly8gSGFuZGxlIHRhYmxlIGF0dHJzOlxuXHQvLyB7fFxuXHQvLyAhIHN0eWxlPVwidGV4dC1hbGlnbjpsZWZ0O1wifCBJdGVtXG5cdC8vIHx9XG5cdCd0YWJsZS10YWcnOiB7XG5cdFx0cGF0dGVybjogLygoPzpefFt8IV0pW3whXSlbXnxcXHJcXG5dK1xcfCg/IVxcfCkvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3RhYmxlLWJhcic6IHtcblx0XHRcdFx0cGF0dGVybjogL1xcfCQvLFxuXHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0fSxcblx0XHRcdHJlc3Q6IFByaXNtLmxhbmd1YWdlcy5tYXJrdXBbJ3RhZyddLmluc2lkZVxuXHRcdH1cblx0fSxcblx0J3B1bmN0dWF0aW9uJzogL14oPzpcXHtcXHx8XFx8XFx9fFxcfC18WyojOjshfF0pfFxcfFxcfHwhIS9tXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnd2lraScsICd0YWcnLCB7XG5cdC8vIFByZXZlbnQgaGlnaGxpZ2h0aW5nIGluc2lkZSA8bm93aWtpPiwgPHNvdXJjZT4gYW5kIDxwcmU+IHRhZ3Ncblx0J25vd2lraSc6IHtcblx0XHRwYXR0ZXJuOiAvPChub3dpa2l8cHJlfHNvdXJjZSlcXGJbXj5dKj5bXFxzXFxTXSo/PFxcL1xcMT4vaSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCd0YWcnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC88KD86bm93aWtpfHByZXxzb3VyY2UpXFxiW14+XSo+fDxcXC8oPzpub3dpa2l8cHJlfHNvdXJjZSk+L2ksXG5cdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cFsndGFnJ10uaW5zaWRlXG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLndvbGZyYW0gPSB7XG5cdCdjb21tZW50JzogLy8gQWxsb3cgb25lIGxldmVsIG9mIG5lc3RpbmcgLSBub3RlOiByZWdleCB0YWtlbiBmcm9tIGFwcGxlc2NpcHRcblx0XHQvXFwoXFwqKD86XFwoXFwqKD86W14qXXxcXCooPyFcXCkpKSpcXCpcXCl8KD8hXFwoXFwqKVtcXHNcXFNdKSo/XFwqXFwpLyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcLnxbXlwiXFxcXFxcclxcbl0pKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86QWJzfEFic0FyZ3xBY2N1cmFjeXxCbG9ja3xEb3xGb3J8RnVuY3Rpb258SWZ8TWFuaXB1bGF0ZXxNb2R1bGV8TmVzdHxOZXN0TGlzdHxOb25lfFJldHVybnxTd2l0Y2h8VGFibGV8V2hpY2h8V2hpbGUpXFxiLyxcblx0J2NvbnRleHQnOiB7XG5cdFx0cGF0dGVybjogL1xcYlxcdytgK1xcdyovLFxuXHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0fSxcblx0J2JsYW5rJzoge1xuXHRcdHBhdHRlcm46IC9cXGJcXHcrX1xcYi8sXG5cdFx0YWxpYXM6ICdyZWdleCdcblx0fSxcblx0J2dsb2JhbC12YXJpYWJsZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFwkXFx3Ky8sXG5cdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0fSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86RmFsc2V8VHJ1ZSlcXGIvLFxuXHQnbnVtYmVyJzogLyg/OlxcYig/PVxcZCl8XFxCKD89XFwuKSkoPzowW2JvXSk/KD86KD86XFxkfDB4W1xcZGEtZl0pW1xcZGEtZl0qKD86XFwuXFxkKik/fFxcLlxcZCspKD86ZVsrLV0/XFxkKyk/aj9cXGIvaSxcblx0J29wZXJhdG9yJzogL1xcL1xcLnw7fD1cXC58XFxePXxcXF46PXw6PXw8PHw+Pnw8XFx8fFxcfD58Oj58XFx8LT58LT58PC18QEBAfEBAfEB8XFwvQHw9IT18PT09fD09fD18XFwrfC18XFxbXFwvLSslPVxcXT0/fCE9fFxcKlxcKj89P3xcXC9cXC8/PT98PFs8PT5dP3w+Wz0+XT98WyZ8Xn5dLyxcblx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF07KCksLjpdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLm1hdGhlbWF0aWNhID0gUHJpc20ubGFuZ3VhZ2VzLndvbGZyYW07XG5QcmlzbS5sYW5ndWFnZXMud2wgPSBQcmlzbS5sYW5ndWFnZXMud29sZnJhbTtcblByaXNtLmxhbmd1YWdlcy5uYiA9IFByaXNtLmxhbmd1YWdlcy53b2xmcmFtO1xuXG4vLyBodHRwczovL3dyZW4uaW8vXG5cblByaXNtLmxhbmd1YWdlcy53cmVuID0ge1xuXHQvLyBNdWx0aWxpbmUgY29tbWVudHMgaW4gV3JlbiBjYW4gaGF2ZSBuZXN0ZWQgbXVsdGlsaW5lIGNvbW1lbnRzXG5cdC8vIENvbW1lbnRzOiAvLyBhbmQgLyogKi9cblx0J2NvbW1lbnQnOiBbXG5cdFx0e1xuXHRcdFx0Ly8gc3VwcG9ydCAzIGxldmVscyBvZiBuZXN0aW5nXG5cdFx0XHQvLyByZWdleDogXFwvXFwqKD86W14qL118XFwqKD8hXFwvKXxcXC8oPyFcXCopfDxzZWxmPikqXFwqXFwvXG5cdFx0XHRwYXR0ZXJuOiAvXFwvXFwqKD86W14qL118XFwqKD8hXFwvKXxcXC8oPyFcXCopfFxcL1xcKig/OlteKi9dfFxcKig/IVxcLyl8XFwvKD8hXFwqKXxcXC9cXCooPzpbXiovXXxcXCooPyFcXC8pfFxcLyg/IVxcKikpKlxcKlxcLykqXFwqXFwvKSpcXCpcXC8vLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcOl0pXFwvXFwvLiovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0XSxcblxuXHQvLyBUcmlwbGUgcXVvdGVkIHN0cmluZ3MgYXJlIG11bHRpbGluZSBidXQgY2Fubm90IGhhdmUgaW50ZXJwb2xhdGlvbiAocmF3IHN0cmluZ3MpXG5cdC8vIEJhc2VkIG9uIHByaXNtLXB5dGhvbi5qc1xuXHQndHJpcGxlLXF1b3RlZC1zdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiXCJcIltcXHNcXFNdKj9cIlwiXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ3N0cmluZydcblx0fSxcblxuXHQvLyBzZWUgYmVsb3dcblx0J3N0cmluZy1saXRlcmFsJzogbnVsbCxcblxuXHQvLyAjIS91c3IvYmluL2VudiB3cmVuIG9uIHRoZSBmaXJzdCBsaW5lXG5cdCdoYXNoYmFuZyc6IHtcblx0XHRwYXR0ZXJuOiAvXiMhXFwvLisvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ2NvbW1lbnQnXG5cdH0sXG5cblx0Ly8gQXR0cmlidXRlcyBhcmUgc3BlY2lhbCBrZXl3b3JkcyB0byBhZGQgbWV0YSBkYXRhIHRvIGNsYXNzZXNcblx0J2F0dHJpYnV0ZSc6IHtcblx0XHQvLyAjISBhdHRyaWJ1dGVzIGFyZSBzdG9yZWQgaW4gY2xhc3MgcHJvcGVydGllc1xuXHRcdC8vICMhbXl2YXIgPSB0cnVlXG5cdFx0Ly8gI2F0dHJpYnV0ZXMgYXJlIG5vdCBzdG9yZWQgYW5kIGRpc21pc3NlZCBhdCBjb21waWxhdGlvblxuXHRcdHBhdHRlcm46IC8jIT9bIFxcdFxcdTMwMDBdKlxcdysvLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J2NsYXNzLW5hbWUnOiBbXG5cdFx0e1xuXHRcdFx0Ly8gY2xhc3MgZGVmaW5pdGlvblxuXHRcdFx0Ly8gY2xhc3MgTWV0YSB7fVxuXHRcdFx0cGF0dGVybjogLyhcXGJjbGFzc1xccyspXFx3Ky8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQvLyBBIGNsYXNzIG11c3QgYWx3YXlzIHN0YXJ0IHdpdGggYW4gdXBwZXJjYXNlLlxuXHRcdC8vIEZpbGUucmVhZFxuXHRcdC9cXGJbQS1aXVthLXpcXGRfXSpcXGIvLFxuXHRdLFxuXG5cdC8vIEEgY29uc3RhbnQgY2FuIGJlIGEgdmFyaWFibGUsIGNsYXNzLCBwcm9wZXJ0eSBvciBtZXRob2QuIEp1c3QgbmFtZWQgaW4gYWxsIHVwcGVyY2FzZSBsZXR0ZXJzXG5cdCdjb25zdGFudCc6IC9cXGJbQS1aXVtBLVpcXGRfXSpcXGIvLFxuXG5cdCdudWxsJzoge1xuXHRcdHBhdHRlcm46IC9cXGJudWxsXFxiLyxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFzfGJyZWFrfGNsYXNzfGNvbnN0cnVjdHxjb250aW51ZXxlbHNlfGZvcnxmb3JlaWdufGlmfGltcG9ydHxpbnxpc3xyZXR1cm58c3RhdGljfHN1cGVyfHRoaXN8dmFyfHdoaWxlKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0J251bWJlcic6IC9cXGIoPzoweFtcXGRhLWZdK3xcXGQrKD86XFwuXFxkKyk/KD86ZVsrLV0/XFxkKyk/KVxcYi9pLFxuXG5cdC8vIEZ1bmN0aW9ucyBjYW4gYmUgQ2xhc3MubWV0aG9kKClcblx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1cXHMqWyh7XSkvaSxcblxuXHQnb3BlcmF0b3InOiAvPDx8Pj58Wz0hPD5dPT98JiZ8XFx8XFx8fFstKyovJX5eJnw/Ol18XFwuezIsM30vLFxuXHQncHVuY3R1YXRpb24nOiAvW1xcW1xcXSgpe30uLDtdLyxcbn07XG5cblByaXNtLmxhbmd1YWdlcy53cmVuWydzdHJpbmctbGl0ZXJhbCddID0ge1xuXHQvLyBBIHNpbmdsZSBxdW90ZSBzdHJpbmcgaXMgbXVsdGlsaW5lIGFuZCBjYW4gaGF2ZSBpbnRlcnBvbGF0aW9uIChzaW1pbGFyIHRvIEpTIGJhY2t0aWNrcyBgYClcblx0cGF0dGVybjogLyhefFteXFxcXFwiXSlcIig/OlteXFxcXFwiJV18XFxcXFtcXHNcXFNdfCUoPyFcXCgpfCVcXCgoPzpbXigpXXxcXCgoPzpbXigpXXxcXChbXildKlxcKSkqXFwpKSpcXCkpKlwiLyxcblx0bG9va2JlaGluZDogdHJ1ZSxcblx0Z3JlZWR5OiB0cnVlLFxuXHRpbnNpZGU6IHtcblx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdC8vIFwiJShpbnRlcnBvbGF0aW9uKVwiXG5cdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W15cXFxcXSkoPzpcXFxcezJ9KSopJVxcKCg/OlteKCldfFxcKCg/OlteKCldfFxcKFteKV0qXFwpKSpcXCkpKlxcKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eKCVcXCgpW1xcc1xcU10rKD89XFwpJCkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMud3JlblxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnaW50ZXJwb2xhdGlvbi1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXiVcXCh8XFwpJC8sXG5cdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0fSxcblx0XHRcdH1cblx0XHR9LFxuXHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHR9XG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdFByaXNtLmxhbmd1YWdlcy54ZW9yYSA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ21hcmt1cCcsIHtcblx0XHQnY29uc3RhbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwkKD86RG9tYWluQ29udGVudHN8UGFnZVJlbmRlckR1cmF0aW9uKVxcJC8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9cXCQvXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdCd2YXJpYWJsZSc6IHtcblx0XHRcdHBhdHRlcm46IC9cXCRAPyg/OiMrfFstKyp+PV5dKT9bXFx3Ll0rXFwkLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1skLl0vXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdvcGVyYXRvcic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvIyt8Wy0rKn49XkBdL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnZnVuY3Rpb24taW5saW5lJzoge1xuXHRcdFx0cGF0dGVybjogL1xcJEY6Wy1cXHcuXStcXD9bLVxcdy5dKyg/OiwoPzooPzpAWy0jXSpcXHcrXFwuW1xcdysuXVxcLiopKlxcfCkqKD86KD86W1xcdytdfFstIyoufl5dK1tcXHcrXXw9XFxTKSg/OlteJD1dfD0rW149XSkqPSp8KD86QFstI10qXFx3K1xcLltcXHcrLl1cXC4qKSsoPzooPzpbXFx3K118Wy0jKn5eXVstIyoufl5dKltcXHcrXXw9XFxTKSg/OlteJD1dfD0rW149XSkqPSopPyk/KT9cXCQvLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCd2YXJpYWJsZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKD86Wyx8XSlAPyg/OiMrfFstKyp+PV5dKT9bXFx3Ll0rLyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogL1ssLnxdL1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdvcGVyYXRvcic6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyMrfFstKyp+PV5AXS9cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXFwkXFx3OnxbJDo/Lix8XS9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fSxcblx0XHQnZnVuY3Rpb24tYmxvY2snOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwkWEY6XFx7Wy1cXHcuXStcXD9bLVxcdy5dKyg/OiwoPzooPzpAWy0jXSpcXHcrXFwuW1xcdysuXVxcLiopKlxcfCkqKD86KD86W1xcdytdfFstIyoufl5dK1tcXHcrXXw9XFxTKSg/OlteJD1dfD0rW149XSkqPSp8KD86QFstI10qXFx3K1xcLltcXHcrLl1cXC4qKSsoPzooPzpbXFx3K118Wy0jKn5eXVstIyoufl5dKltcXHcrXXw9XFxTKSg/OlteJD1dfD0rW149XSkqPSopPyk/KT9cXH06WEZcXCQvLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvWyQ6e30/Lix8XS9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fSxcblx0XHQnZGlyZWN0aXZlLWlubGluZSc6IHtcblx0XHRcdHBhdHRlcm46IC9cXCRcXHcoPzojXFxkK1xcKz8pPyg/OlxcW1stXFx3Ll0rXFxdKT86Wy1cXC9cXHcuXStcXCQvLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXFwkKD86XFx3OnxDKD86XFxbfCNcXGQpKT98Wzp7W1xcXV0vLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3RhZyc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyNcXGQvXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9LFxuXHRcdCdkaXJlY3RpdmUtYmxvY2stb3Blbic6IHtcblx0XHRcdHBhdHRlcm46IC9cXCRcXHcrOlxce3xcXCRcXHcoPzojXFxkK1xcKz8pPyg/OlxcW1stXFx3Ll0rXFxdKT86Wy1cXHcuXSs6XFx7KD86IVtBLVpdKyk/Lyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1xcJCg/Olxcdzp8Qyg/OlxcW3wjXFxkKSk/fFs6e1tcXF1dLyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCd0YWcnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8jXFxkL1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J2F0dHJpYnV0ZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvIVtBLVpdKyQvLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvIS9cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fSxcblx0XHQnZGlyZWN0aXZlLWJsb2NrLXNlcGFyYXRvcic6IHtcblx0XHRcdHBhdHRlcm46IC9cXH06Wy1cXHcuXSs6XFx7Lyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1s6e31dL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9LFxuXHRcdCdkaXJlY3RpdmUtYmxvY2stY2xvc2UnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFx9OlstXFx3Ll0rXFwkLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1s6e30kXS9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdpbnNpZGUnLCAncHVuY3R1YXRpb24nLCB7XG5cdFx0J3ZhcmlhYmxlJzogUHJpc20ubGFuZ3VhZ2VzLnhlb3JhWydmdW5jdGlvbi1pbmxpbmUnXS5pbnNpZGVbJ3ZhcmlhYmxlJ11cblx0fSwgUHJpc20ubGFuZ3VhZ2VzLnhlb3JhWydmdW5jdGlvbi1ibG9jayddKTtcblxuXHRQcmlzbS5sYW5ndWFnZXMueGVvcmFjdWJlID0gUHJpc20ubGFuZ3VhZ2VzLnhlb3JhO1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHQvKipcblx0ICogSWYgdGhlIGdpdmVuIGxhbmd1YWdlIGlzIHByZXNlbnQsIGl0IHdpbGwgaW5zZXJ0IHRoZSBnaXZlbiBkb2MgY29tbWVudCBncmFtbWFyIHRva2VuIGludG8gaXQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBsYW5nXG5cdCAqIEBwYXJhbSB7YW55fSBkb2NDb21tZW50XG5cdCAqL1xuXHRmdW5jdGlvbiBpbnNlcnREb2NDb21tZW50KGxhbmcsIGRvY0NvbW1lbnQpIHtcblx0XHRpZiAoUHJpc20ubGFuZ3VhZ2VzW2xhbmddKSB7XG5cdFx0XHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKGxhbmcsICdjb21tZW50Jywge1xuXHRcdFx0XHQnZG9jLWNvbW1lbnQnOiBkb2NDb21tZW50XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHR2YXIgdGFnID0gUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cC50YWc7XG5cblx0dmFyIHNsYXNoRG9jQ29tbWVudCA9IHtcblx0XHRwYXR0ZXJuOiAvXFwvXFwvXFwvLiovLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ2NvbW1lbnQnLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3RhZyc6IHRhZ1xuXHRcdH1cblx0fTtcblx0dmFyIHRpY2tEb2NDb21tZW50ID0ge1xuXHRcdHBhdHRlcm46IC8nJycuKi8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnY29tbWVudCcsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQndGFnJzogdGFnXG5cdFx0fVxuXHR9O1xuXG5cdGluc2VydERvY0NvbW1lbnQoJ2NzaGFycCcsIHNsYXNoRG9jQ29tbWVudCk7XG5cdGluc2VydERvY0NvbW1lbnQoJ2ZzaGFycCcsIHNsYXNoRG9jQ29tbWVudCk7XG5cdGluc2VydERvY0NvbW1lbnQoJ3ZibmV0JywgdGlja0RvY0NvbW1lbnQpO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy54b2pvID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKD86J3xcXC9cXC98UmVtXFxiKS4rL2ksXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86XCJcInxbXlwiXSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnbnVtYmVyJzogW1xuXHRcdC8oPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86RVsrLV0/XFxkKyk/L2ksXG5cdFx0LyZbYmNob3VdW2EtelxcZF0rL2lcblx0XSxcblx0J2RpcmVjdGl2ZSc6IHtcblx0XHRwYXR0ZXJuOiAvIyg/OkVsc2V8RWxzZUlmfEVuZGlmfElmfFByYWdtYSlcXGIvaSxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzpBZGRIYW5kbGVyfEFwcHxBcnJheXxBcyg/OnNpZ25zKT98QXV0b3xCb29sZWFufEJyZWFrfEJ5KD86UmVmfFZhbCl8Qnl0ZXxDYWxsfENhc2V8Q2F0Y2h8Q0ZTdHJpbmdSZWZ8Q0dGbG9hdHxDbGFzc3xDb2xvcnxDb25zdHxDb250aW51ZXxDU3RyaW5nfEN1cnJlbmN5fEN1cnJlbnRNZXRob2ROYW1lfERlY2xhcmV8RGVsZWdhdGV8RGltfERvKD86dWJsZXx3blRvKT98RWFjaHxFbHNlKD86SWYpP3xFbmR8RW51bWVyYXRpb258RXZlbnR8RXhjZXB0aW9ufEV4aXR8RXh0ZW5kc3xGYWxzZXxGaW5hbGx5fEZvcnxGdW5jdGlvbnxHZXR8R2V0VHlwZUluZm98R2xvYmFsfEdPVE98SWZ8SW1wbGVtZW50c3xJbnxJbmhlcml0c3xJbnQoPzo4fDE2fDMyfDY0fGVnZXJ8ZXJmYWNlKT98TGlifExvb3B8TWV8TW9kdWxlfE5leHR8TmlsfE9iamVjdHxPcHRpb25hbHxPU1R5cGV8UGFyYW1BcnJheXxQcml2YXRlfFByb3BlcnR5fFByb3RlY3RlZHxQU3RyaW5nfFB0cnxSYWlzZSg/OkV2ZW50KT98UmVEaW18UmVtb3ZlSGFuZGxlcnxSZXR1cm58U2VsZWN0KD86b3IpP3xTZWxmfFNldHxTaGFyZWR8U2hvcnR8U2luZ2xlfFNvZnR8U3RhdGljfFN0ZXB8U3RyaW5nfFN1YnxTdXBlcnxUZXh0fFRoZW58VG98VHJ1ZXxUcnl8VWJvdW5kfFVJbnQoPzo4fDE2fDMyfDY0fGVnZXIpP3xVbnRpbHxVc2luZ3xWYXIoPzppYW50KT98V2VuZHxXaGlsZXxXaW5kb3dQdHJ8V1N0cmluZylcXGIvaSxcblx0J29wZXJhdG9yJzogLzxbPT5dP3w+PT98WytcXC0qXFwvXFxcXF49XXxcXGIoPzpBZGRyZXNzT2Z8QW5kfEN0eXBlfElzQT98TW9kfE5ld3xOb3R8T3J8V2Vha0FkZHJlc3NPZnxYb3IpXFxiL2ksXG5cdCdwdW5jdHVhdGlvbic6IC9bLiw7OigpXS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHRQcmlzbS5sYW5ndWFnZXMueHF1ZXJ5ID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnbWFya3VwJywge1xuXHRcdCd4cXVlcnktY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXCg6W1xcc1xcU10qPzpcXCkvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdjb21tZW50J1xuXHRcdH0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC8oW1wiJ10pKD86XFwxXFwxfCg/IVxcMSlbXFxzXFxTXSkqXFwxLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2V4dGVuc2lvbic6IHtcblx0XHRcdHBhdHRlcm46IC9cXCgjLis/I1xcKS8sXG5cdFx0XHRhbGlhczogJ3N5bWJvbCdcblx0XHR9LFxuXHRcdCd2YXJpYWJsZSc6IC9cXCRbLVxcdzpdKy8sXG5cdFx0J2F4aXMnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W14tXSkoPzphbmNlc3Rvcig/Oi1vci1zZWxmKT98YXR0cmlidXRlfGNoaWxkfGRlc2NlbmRhbnQoPzotb3Itc2VsZik/fGZvbGxvd2luZyg/Oi1zaWJsaW5nKT98cGFyZW50fHByZWNlZGluZyg/Oi1zaWJsaW5nKT98c2VsZikoPz06OikvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0fSxcblx0XHQna2V5d29yZC1vcGVyYXRvcic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXjotXSlcXGIoPzphbmR8Y2FzdGFibGUgYXN8ZGl2fGVxfGV4Y2VwdHxnZXxndHxpZGl2fGluc3RhbmNlIG9mfGludGVyc2VjdHxpc3xsZXxsdHxtb2R8bmV8b3J8dW5pb24pXFxiKD89JHxbXjotXSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0fSxcblx0XHQna2V5d29yZCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXjotXSlcXGIoPzphc3xhc2NlbmRpbmd8YXR8YmFzZS11cml8Ym91bmRhcnktc3BhY2V8Y2FzZXxjYXN0IGFzfGNvbGxhdGlvbnxjb25zdHJ1Y3Rpb258Y29weS1uYW1lc3BhY2VzfGRlY2xhcmV8ZGVmYXVsdHxkZXNjZW5kaW5nfGVsc2V8ZW1wdHkgKD86Z3JlYXRlc3R8bGVhc3QpfGVuY29kaW5nfGV2ZXJ5fGV4dGVybmFsfGZvcnxmdW5jdGlvbnxpZnxpbXBvcnR8aW58aW5oZXJpdHxsYXh8bGV0fG1hcHxtb2R1bGV8bmFtZXNwYWNlfG5vLWluaGVyaXR8bm8tcHJlc2VydmV8b3B0aW9ufG9yZGVyKD86IGJ5fGVkfGluZyk/fHByZXNlcnZlfHJldHVybnxzYXRpc2ZpZXN8c2NoZW1hfHNvbWV8c3RhYmxlfHN0cmljdHxzdHJpcHx0aGVufHRvfHRyZWF0IGFzfHR5cGVzd2l0Y2h8dW5vcmRlcmVkfHZhbGlkYXRlfHZhcmlhYmxlfHZlcnNpb258d2hlcmV8eHF1ZXJ5KVxcYig/PSR8W146LV0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdmdW5jdGlvbic6IC9bXFx3LV0rKD86OltcXHctXSspKig/PVxccypcXCgpLyxcblx0XHQneHF1ZXJ5LWVsZW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKGVsZW1lbnRcXHMrKVtcXHctXSsoPzo6W1xcdy1dKykqLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3RhZydcblx0XHR9LFxuXHRcdCd4cXVlcnktYXR0cmlidXRlJzoge1xuXHRcdFx0cGF0dGVybjogLyhhdHRyaWJ1dGVcXHMrKVtcXHctXSsoPzo6W1xcdy1dKykqLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2F0dHItbmFtZSdcblx0XHR9LFxuXHRcdCdidWlsdGluJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteOi1dKVxcYig/OmF0dHJpYnV0ZXxjb21tZW50fGRvY3VtZW50fGVsZW1lbnR8cHJvY2Vzc2luZy1pbnN0cnVjdGlvbnx0ZXh0fHhzOig/OkVOVElUSUVTfEVOVElUWXxJRHxJRFJFRlM/fE5DTmFtZXxOTVRPS0VOUz98Tk9UQVRJT058TmFtZXxRTmFtZXxhbnlBdG9taWNUeXBlfGFueVR5cGV8YW55VVJJfGJhc2U2NEJpbmFyeXxib29sZWFufGJ5dGV8ZGF0ZXxkYXRlVGltZXxkYXlUaW1lRHVyYXRpb258ZGVjaW1hbHxkb3VibGV8ZHVyYXRpb258ZmxvYXR8Z0RheXxnTW9udGh8Z01vbnRoRGF5fGdZZWFyfGdZZWFyTW9udGh8aGV4QmluYXJ5fGludHxpbnRlZ2VyfGxhbmd1YWdlfGxvbmd8bmVnYXRpdmVJbnRlZ2VyfG5vbk5lZ2F0aXZlSW50ZWdlcnxub25Qb3NpdGl2ZUludGVnZXJ8bm9ybWFsaXplZFN0cmluZ3xwb3NpdGl2ZUludGVnZXJ8c2hvcnR8c3RyaW5nfHRpbWV8dG9rZW58dW5zaWduZWQoPzpCeXRlfEludHxMb25nfFNob3J0KXx1bnR5cGVkKD86QXRvbWljKT98eWVhck1vbnRoRHVyYXRpb24pKVxcYig/PSR8W146LV0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdudW1iZXInOiAvXFxiXFxkKyg/OlxcLlxcZCspPyg/OkVbKy1dP1xcZCspPy8sXG5cdFx0J29wZXJhdG9yJzogW1xuXHRcdFx0L1srKj0/fEBdfFxcLlxcLj98Oj18IT18PFs9PF0/fD5bPT5dPy8sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFxzKS0oPz1cXHMpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1tbXFxdKCl7fSw7Oi9dL1xuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMueHF1ZXJ5LnRhZy5wYXR0ZXJuID0gLzxcXC8/KD8hXFxkKVteXFxzPlxcLz0kPCVdKyg/OlxccytbXlxccz5cXC89XSsoPzo9KD86KFwifCcpKD86XFxcXFtcXHNcXFNdfFxceyg/IVxceykoPzpcXHsoPzpcXHtbXnt9XSpcXH18W157fV0pKlxcfXxbXnt9XSkrXFx9fCg/IVxcMSlbXlxcXFxdKSpcXDF8W15cXHMnXCI+PV0rKSk/KSpcXHMqXFwvPz4vO1xuXHRQcmlzbS5sYW5ndWFnZXMueHF1ZXJ5Wyd0YWcnXS5pbnNpZGVbJ2F0dHItdmFsdWUnXS5wYXR0ZXJuID0gLz0oPzooXCJ8JykoPzpcXFxcW1xcc1xcU118XFx7KD8hXFx7KSg/Olxceyg/Olxce1tee31dKlxcfXxbXnt9XSkqXFx9fFtee31dKStcXH18KD8hXFwxKVteXFxcXF0pKlxcMXxbXlxccydcIj49XSspLztcblx0UHJpc20ubGFuZ3VhZ2VzLnhxdWVyeVsndGFnJ10uaW5zaWRlWydhdHRyLXZhbHVlJ10uaW5zaWRlWydwdW5jdHVhdGlvbiddID0gL149XCJ8XCIkLztcblx0UHJpc20ubGFuZ3VhZ2VzLnhxdWVyeVsndGFnJ10uaW5zaWRlWydhdHRyLXZhbHVlJ10uaW5zaWRlWydleHByZXNzaW9uJ10gPSB7XG5cdFx0Ly8gQWxsb3cgZm9yIHR3byBsZXZlbHMgb2YgbmVzdGluZ1xuXHRcdHBhdHRlcm46IC9cXHsoPyFcXHspKD86XFx7KD86XFx7W157fV0qXFx9fFtee31dKSpcXH18W157fV0pK1xcfS8sXG5cdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMueHF1ZXJ5LFxuXHRcdGFsaWFzOiAnbGFuZ3VhZ2UteHF1ZXJ5J1xuXHR9O1xuXG5cdC8vIFRoZSBmb2xsb3dpbmcgd2lsbCBoYW5kbGUgcGxhaW4gdGV4dCBpbnNpZGUgdGFnc1xuXHR2YXIgc3RyaW5naWZ5VG9rZW4gPSBmdW5jdGlvbiAodG9rZW4pIHtcblx0XHRpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIHRva2VuO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHRva2VuLmNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRyZXR1cm4gdG9rZW4uY29udGVudDtcblx0XHR9XG5cdFx0cmV0dXJuIHRva2VuLmNvbnRlbnQubWFwKHN0cmluZ2lmeVRva2VuKS5qb2luKCcnKTtcblx0fTtcblxuXHR2YXIgd2Fsa1Rva2VucyA9IGZ1bmN0aW9uICh0b2tlbnMpIHtcblx0XHR2YXIgb3BlbmVkVGFncyA9IFtdO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgdG9rZW4gPSB0b2tlbnNbaV07XG5cdFx0XHR2YXIgbm90VGFnTm9yQnJhY2UgPSBmYWxzZTtcblxuXHRcdFx0aWYgKHR5cGVvZiB0b2tlbiAhPT0gJ3N0cmluZycpIHtcblx0XHRcdFx0aWYgKHRva2VuLnR5cGUgPT09ICd0YWcnICYmIHRva2VuLmNvbnRlbnRbMF0gJiYgdG9rZW4uY29udGVudFswXS50eXBlID09PSAndGFnJykge1xuXHRcdFx0XHRcdC8vIFdlIGZvdW5kIGEgdGFnLCBub3cgZmluZCBpdHMga2luZFxuXG5cdFx0XHRcdFx0aWYgKHRva2VuLmNvbnRlbnRbMF0uY29udGVudFswXS5jb250ZW50ID09PSAnPC8nKSB7XG5cdFx0XHRcdFx0XHQvLyBDbG9zaW5nIHRhZ1xuXHRcdFx0XHRcdFx0aWYgKG9wZW5lZFRhZ3MubGVuZ3RoID4gMCAmJiBvcGVuZWRUYWdzW29wZW5lZFRhZ3MubGVuZ3RoIC0gMV0udGFnTmFtZSA9PT0gc3RyaW5naWZ5VG9rZW4odG9rZW4uY29udGVudFswXS5jb250ZW50WzFdKSkge1xuXHRcdFx0XHRcdFx0XHQvLyBQb3AgbWF0Y2hpbmcgb3BlbmluZyB0YWdcblx0XHRcdFx0XHRcdFx0b3BlbmVkVGFncy5wb3AoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKHRva2VuLmNvbnRlbnRbdG9rZW4uY29udGVudC5sZW5ndGggLSAxXS5jb250ZW50ID09PSAnLz4nKSB7XG5cdFx0XHRcdFx0XHRcdC8vIEF1dG9jbG9zZWQgdGFnLCBpZ25vcmVcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIE9wZW5pbmcgdGFnXG5cdFx0XHRcdFx0XHRcdG9wZW5lZFRhZ3MucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0dGFnTmFtZTogc3RyaW5naWZ5VG9rZW4odG9rZW4uY29udGVudFswXS5jb250ZW50WzFdKSxcblx0XHRcdFx0XHRcdFx0XHRvcGVuZWRCcmFjZXM6IDBcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdG9wZW5lZFRhZ3MubGVuZ3RoID4gMCAmJiB0b2tlbi50eXBlID09PSAncHVuY3R1YXRpb24nICYmIHRva2VuLmNvbnRlbnQgPT09ICd7JyAmJlxuXHRcdFx0XHRcdC8vIElnbm9yZSBge3tgXG5cdFx0XHRcdFx0KCF0b2tlbnNbaSArIDFdIHx8IHRva2Vuc1tpICsgMV0udHlwZSAhPT0gJ3B1bmN0dWF0aW9uJyB8fCB0b2tlbnNbaSArIDFdLmNvbnRlbnQgIT09ICd7JykgJiZcblx0XHRcdFx0XHQoIXRva2Vuc1tpIC0gMV0gfHwgdG9rZW5zW2kgLSAxXS50eXBlICE9PSAncGxhaW4tdGV4dCcgfHwgdG9rZW5zW2kgLSAxXS5jb250ZW50ICE9PSAneycpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdC8vIEhlcmUgd2UgbWlnaHQgaGF2ZSBlbnRlcmVkIGFuIFhRdWVyeSBleHByZXNzaW9uIGluc2lkZSBhIHRhZ1xuXHRcdFx0XHRcdG9wZW5lZFRhZ3Nbb3BlbmVkVGFncy5sZW5ndGggLSAxXS5vcGVuZWRCcmFjZXMrKztcblxuXHRcdFx0XHR9IGVsc2UgaWYgKG9wZW5lZFRhZ3MubGVuZ3RoID4gMCAmJiBvcGVuZWRUYWdzW29wZW5lZFRhZ3MubGVuZ3RoIC0gMV0ub3BlbmVkQnJhY2VzID4gMCAmJiB0b2tlbi50eXBlID09PSAncHVuY3R1YXRpb24nICYmIHRva2VuLmNvbnRlbnQgPT09ICd9Jykge1xuXG5cdFx0XHRcdFx0Ly8gSGVyZSB3ZSBtaWdodCBoYXZlIGxlZnQgYW4gWFF1ZXJ5IGV4cHJlc3Npb24gaW5zaWRlIGEgdGFnXG5cdFx0XHRcdFx0b3BlbmVkVGFnc1tvcGVuZWRUYWdzLmxlbmd0aCAtIDFdLm9wZW5lZEJyYWNlcy0tO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAodG9rZW4udHlwZSAhPT0gJ2NvbW1lbnQnKSB7XG5cdFx0XHRcdFx0bm90VGFnTm9yQnJhY2UgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAobm90VGFnTm9yQnJhY2UgfHwgdHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRpZiAob3BlbmVkVGFncy5sZW5ndGggPiAwICYmIG9wZW5lZFRhZ3Nbb3BlbmVkVGFncy5sZW5ndGggLSAxXS5vcGVuZWRCcmFjZXMgPT09IDApIHtcblx0XHRcdFx0XHQvLyBIZXJlIHdlIGFyZSBpbnNpZGUgYSB0YWcsIGFuZCBub3QgaW5zaWRlIGFuIFhRdWVyeSBleHByZXNzaW9uLlxuXHRcdFx0XHRcdC8vIFRoYXQncyBwbGFpbiB0ZXh0OiBkcm9wIGFueSB0b2tlbnMgbWF0Y2hlZC5cblx0XHRcdFx0XHR2YXIgcGxhaW5UZXh0ID0gc3RyaW5naWZ5VG9rZW4odG9rZW4pO1xuXG5cdFx0XHRcdFx0Ly8gQW5kIG1lcmdlIHRleHQgd2l0aCBhZGphY2VudCB0ZXh0XG5cdFx0XHRcdFx0aWYgKGkgPCB0b2tlbnMubGVuZ3RoIC0gMSAmJiAodHlwZW9mIHRva2Vuc1tpICsgMV0gPT09ICdzdHJpbmcnIHx8IHRva2Vuc1tpICsgMV0udHlwZSA9PT0gJ3BsYWluLXRleHQnKSkge1xuXHRcdFx0XHRcdFx0cGxhaW5UZXh0ICs9IHN0cmluZ2lmeVRva2VuKHRva2Vuc1tpICsgMV0pO1xuXHRcdFx0XHRcdFx0dG9rZW5zLnNwbGljZShpICsgMSwgMSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChpID4gMCAmJiAodHlwZW9mIHRva2Vuc1tpIC0gMV0gPT09ICdzdHJpbmcnIHx8IHRva2Vuc1tpIC0gMV0udHlwZSA9PT0gJ3BsYWluLXRleHQnKSkge1xuXHRcdFx0XHRcdFx0cGxhaW5UZXh0ID0gc3RyaW5naWZ5VG9rZW4odG9rZW5zW2kgLSAxXSkgKyBwbGFpblRleHQ7XG5cdFx0XHRcdFx0XHR0b2tlbnMuc3BsaWNlKGkgLSAxLCAxKTtcblx0XHRcdFx0XHRcdGktLTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoL15cXHMrJC8udGVzdChwbGFpblRleHQpKSB7XG5cdFx0XHRcdFx0XHR0b2tlbnNbaV0gPSBwbGFpblRleHQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRva2Vuc1tpXSA9IG5ldyBQcmlzbS5Ub2tlbigncGxhaW4tdGV4dCcsIHBsYWluVGV4dCwgbnVsbCwgcGxhaW5UZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHRva2VuLmNvbnRlbnQgJiYgdHlwZW9mIHRva2VuLmNvbnRlbnQgIT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdHdhbGtUb2tlbnModG9rZW4uY29udGVudCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYWZ0ZXItdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0aWYgKGVudi5sYW5ndWFnZSAhPT0gJ3hxdWVyeScpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0d2Fsa1Rva2VucyhlbnYudG9rZW5zKTtcblx0fSk7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLnlhbmcgPSB7XG5cdC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MDIwI3BhZ2UtMzRcblx0Ly8gaHR0cDovL3d3dy55YW5nLWNlbnRyYWwub3JnL3R3aWtpL2Jpbi92aWV3L01haW4vWWFuZ0V4YW1wbGVzXG5cdCdjb21tZW50JzogL1xcL1xcKltcXHNcXFNdKj9cXCpcXC98XFwvXFwvLiovLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlteXFxcXFwiXXxcXFxcLikqXCJ8J1teJ10qJy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbe307XFxyXFxuXVsgXFx0XSopW2Etel9dW1xcdy4tXSovaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCduYW1lc3BhY2UnOiB7XG5cdFx0cGF0dGVybjogLyhcXHMpW2Etel9dW1xcdy4tXSooPz06KS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQnb3BlcmF0b3InOiAvXFwrLyxcblx0J3B1bmN0dWF0aW9uJzogL1t7fTs6XS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHRmdW5jdGlvbiBsaXRlcmFsKHN0cikge1xuXHRcdHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBzdHI7IH07XG5cdH1cblxuXHR2YXIga2V5d29yZCA9IC9cXGIoPzphbGlnbnxhbGxvd3plcm98YW5kfGFueWZyYW1lfGFueXR5cGV8YXNtfGFzeW5jfGF3YWl0fGJyZWFrfGNhbmNlbHxjYXRjaHxjb21wdGltZXxjb25zdHxjb250aW51ZXxkZWZlcnxlbHNlfGVudW18ZXJyZGVmZXJ8ZXJyb3J8ZXhwb3J0fGV4dGVybnxmbnxmb3J8aWZ8aW5saW5lfGxpbmtzZWN0aW9ufG5ha2VkY2N8bm9hbGlhc3xub3N1c3BlbmR8bnVsbHxvcnxvcmVsc2V8cGFja2VkfHByb21pc2V8cHVifHJlc3VtZXxyZXR1cm58c3RkY2FsbGNjfHN0cnVjdHxzdXNwZW5kfHN3aXRjaHx0ZXN0fHRocmVhZGxvY2FsfHRyeXx1bmRlZmluZWR8dW5pb258dW5yZWFjaGFibGV8dXNpbmduYW1lc3BhY2V8dmFyfHZvbGF0aWxlfHdoaWxlKVxcYi87XG5cblx0dmFyIElERU5USUZJRVIgPSAnXFxcXGIoPyEnICsga2V5d29yZC5zb3VyY2UgKyAnKSg/IVxcXFxkKVxcXFx3K1xcXFxiJztcblx0dmFyIEFMSUdOID0gL2FsaWduXFxzKlxcKCg/OlteKCldfFxcKFteKCldKlxcKSkqXFwpLy5zb3VyY2U7XG5cdHZhciBQUkVGSVhfVFlQRV9PUCA9IC8oPzpcXD98XFxicHJvbWlzZS0+fCg/OlxcW1teW1xcXV0qXFxdfFxcKig/IVxcKil8XFwqXFwqKSg/Olxccyo8QUxJR04+fFxccypjb25zdFxcYnxcXHMqdm9sYXRpbGVcXGJ8XFxzKmFsbG93emVyb1xcYikqKS8uc291cmNlLnJlcGxhY2UoLzxBTElHTj4vZywgbGl0ZXJhbChBTElHTikpO1xuXHR2YXIgU1VGRklYX0VYUFIgPSAvKD86XFxicHJvbWlzZVxcYnwoPzpcXGJlcnJvclxcLik/PElEPig/OlxcLjxJRD4pKig/IVxccys8SUQ+KSkvLnNvdXJjZS5yZXBsYWNlKC88SUQ+L2csIGxpdGVyYWwoSURFTlRJRklFUikpO1xuXHR2YXIgVFlQRSA9ICcoPyFcXFxccykoPzohP1xcXFxzKig/OicgKyBQUkVGSVhfVFlQRV9PUCArICdcXFxccyopKicgKyBTVUZGSVhfRVhQUiArICcpKyc7XG5cblx0Lypcblx0ICogQSBzaW1wbGlmaWVkIGdyYW1tYXIgZm9yIFppZyBjb21waWxlIHRpbWUgdHlwZSBsaXRlcmFsczpcblx0ICpcblx0ICogVHlwZUV4cHIgPSAoIFwiIVwiPyBQUkVGSVhfVFlQRV9PUCogU1VGRklYX0VYUFIgKStcblx0ICpcblx0ICogU1VGRklYX0VYUFIgPSAoIFxcYiBcInByb21pc2VcIiBcXGIgfCAoIFxcYiBcImVycm9yXCIgXCIuXCIgKT8gSURFTlRJRklFUiAoIFwiLlwiIElERU5USUZJRVIgKSogKD8hIFxccysgSURFTlRJRklFUiApIClcblx0ICpcblx0ICogUFJFRklYX1RZUEVfT1AgPSBcIj9cIlxuXHQgKiAgICAgICAgICAgICAgICB8IFxcYiBcInByb21pc2VcIiBcIi0+XCJcblx0ICogICAgICAgICAgICAgICAgfCAoIFwiW1wiIFteXFxbXFxdXSogXCJdXCIgfCBcIipcIiB8IFwiKipcIiApICggQUxJR04gfCBcImNvbnN0XCIgXFxiIHwgXCJ2b2xhdGlsZVwiIFxcYiB8IFwiYWxsb3d6ZXJvXCIgXFxiICkqXG5cdCAqXG5cdCAqIEFMSUdOID0gXCJhbGlnblwiIFwiKFwiICggW14oKV0gfCBcIihcIiBbXigpXSogXCIpXCIgKSogXCIpXCJcblx0ICpcblx0ICogSURFTlRJRklFUiA9IFxcYiAoPyEgS0VZV09SRCApIFthLXpBLVpfXSBcXHcqIFxcYlxuXHQgKlxuXHQqL1xuXG5cdFByaXNtLmxhbmd1YWdlcy56aWcgPSB7XG5cdFx0J2NvbW1lbnQnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXC9cXC9bLyFdLiovLFxuXHRcdFx0XHRhbGlhczogJ2RvYy1jb21tZW50J1xuXHRcdFx0fSxcblx0XHRcdC9cXC97Mn0uKi9cblx0XHRdLFxuXHRcdCdzdHJpbmcnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFwic3RyaW5nXCIgYW5kIGNcInN0cmluZ1wiXG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxAXSljP1wiKD86W15cIlxcXFxcXHJcXG5dfFxcXFwuKSpcIi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gbXVsdGlsaW5lIHN0cmluZ3MgYW5kIGMtc3RyaW5nc1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFtcXHJcXG5dKShbIFxcdF0rYz9cXFxcezJ9KS4qKD86KD86XFxyXFxuP3xcXG4pXFwyLiopKi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2NoYXInOiB7XG5cdFx0XHQvLyBjaGFyYWN0ZXJzICdhJywgJ1xcbicsICdcXHhGRicsICdcXHV7MTBGRkZGfSdcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKScoPzpbXidcXFxcXFxyXFxuXXxbXFx1RDgwMC1cXHVERkZGXXsyfXxcXFxcKD86Lnx4W2EtZkEtRlxcZF17Mn18dVxce1thLWZBLUZcXGRdezEsNn1cXH0pKScvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2J1aWx0aW4nOiAvXFxCQCg/IVxcZClcXHcrKD89XFxzKlxcKCkvLFxuXHRcdCdsYWJlbCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxiKD86YnJlYWt8Y29udGludWUpXFxzKjpcXHMqKVxcdytcXGJ8XFxiKD8hXFxkKVxcdytcXGIoPz1cXHMqOlxccyooPzpcXHt8d2hpbGVcXGIpKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnY2xhc3MtbmFtZSc6IFtcblx0XHRcdC8vIGNvbnN0IEZvbyA9IHN0cnVjdCB7fTtcblx0XHRcdC9cXGIoPyFcXGQpXFx3Kyg/PVxccyo9XFxzKig/Oig/OmV4dGVybnxwYWNrZWQpXFxzKyk/KD86ZW51bXxzdHJ1Y3R8dW5pb24pXFxzKlsoe10pLyxcblx0XHRcdHtcblx0XHRcdFx0Ly8gY29uc3QgeDogaTMyID0gOTtcblx0XHRcdFx0Ly8gdmFyIHg6IEJhcjtcblx0XHRcdFx0Ly8gZm4gZm9vKHg6IGJvb2wsIHk6IGYzMikgdm9pZCB7fVxuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyg6XFxzKik8VFlQRT4oPz1cXHMqKD86PEFMSUdOPlxccyopP1s9OywpXSl8PFRZUEU+KD89XFxzKig/OjxBTElHTj5cXHMqKT9cXHspLy5zb3VyY2UucmVwbGFjZSgvPFRZUEU+L2csIGxpdGVyYWwoVFlQRSkpLnJlcGxhY2UoLzxBTElHTj4vZywgbGl0ZXJhbChBTElHTikpKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gZXh0ZXJuIGZuIGZvbyh4OiBmNjQpIGY2NDsgKG9wdGlvbmFsIGFsaWdubWVudClcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXFwpXFxzKik8VFlQRT4oPz1cXHMqKD86PEFMSUdOPlxccyopPzspLy5zb3VyY2UucmVwbGFjZSgvPFRZUEU+L2csIGxpdGVyYWwoVFlQRSkpLnJlcGxhY2UoLzxBTElHTj4vZywgbGl0ZXJhbChBTElHTikpKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2J1aWx0aW4tdHlwZSc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzphbnllcnJvcnxib29sfGNfdT8oPzppbnR8bG9uZ3xsb25nbG9uZ3xzaG9ydCl8Y19sb25nZG91YmxlfGNfdm9pZHxjb21wdGltZV8oPzpmbG9hdHxpbnQpfGYoPzoxNnwzMnw2NHwxMjgpfFtpdV0oPzo4fDE2fDMyfDY0fDEyOHxzaXplKXxub3JldHVybnx0eXBlfHZvaWQpXFxiLyxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9LFxuXHRcdCdrZXl3b3JkJzoga2V5d29yZCxcblx0XHQnZnVuY3Rpb24nOiAvXFxiKD8hXFxkKVxcdysoPz1cXHMqXFwoKS8sXG5cdFx0J251bWJlcic6IC9cXGIoPzowYlswMV0rfDBvWzAtN10rfDB4W2EtZkEtRlxcZF0rKD86XFwuW2EtZkEtRlxcZF0qKT8oPzpbcFBdWystXT9bYS1mQS1GXFxkXSspP3xcXGQrKD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KVxcYi8sXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHRcdCdvcGVyYXRvcic6IC9cXC5bKj9dfFxcLnsyLDN9fFstPV0+fFxcKlxcKnxcXCtcXCt8XFx8XFx8fCg/Ojw8fD4+fFstKypdJXxbLSsqLyVeJnw8PiE9XSk9P3xbP35dLyxcblx0XHQncHVuY3R1YXRpb24nOiAvWy46LDsoKXt9W1xcXV0vXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnppZ1snY2xhc3MtbmFtZSddLmZvckVhY2goZnVuY3Rpb24gKG9iaikge1xuXHRcdGlmIChvYmouaW5zaWRlID09PSBudWxsKSB7XG5cdFx0XHRvYmouaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLnppZztcblx0XHR9XG5cdH0pO1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoKSB7XG5cblx0aWYgKHR5cGVvZiBQcmlzbSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8qKlxuXHQgKiBQbHVnaW4gbmFtZSB3aGljaCBpcyB1c2VkIGFzIGEgY2xhc3MgbmFtZSBmb3IgPHByZT4gd2hpY2ggaXMgYWN0aXZhdGluZyB0aGUgcGx1Z2luXG5cdCAqXG5cdCAqIEB0eXBlIHtzdHJpbmd9XG5cdCAqL1xuXHR2YXIgUExVR0lOX05BTUUgPSAnbGluZS1udW1iZXJzJztcblxuXHQvKipcblx0ICogUmVndWxhciBleHByZXNzaW9uIHVzZWQgZm9yIGRldGVybWluaW5nIGxpbmUgYnJlYWtzXG5cdCAqXG5cdCAqIEB0eXBlIHtSZWdFeHB9XG5cdCAqL1xuXHR2YXIgTkVXX0xJTkVfRVhQID0gL1xcbig/ISQpL2c7XG5cblxuXHQvKipcblx0ICogR2xvYmFsIGV4cG9ydHNcblx0ICovXG5cdHZhciBjb25maWcgPSBQcmlzbS5wbHVnaW5zLmxpbmVOdW1iZXJzID0ge1xuXHRcdC8qKlxuXHRcdCAqIEdldCBub2RlIGZvciBwcm92aWRlZCBsaW5lIG51bWJlclxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IHByZSBlbGVtZW50XG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBsaW5lIG51bWJlclxuXHRcdCAqIEByZXR1cm5zIHtFbGVtZW50fHVuZGVmaW5lZH1cblx0XHQgKi9cblx0XHRnZXRMaW5lOiBmdW5jdGlvbiAoZWxlbWVudCwgbnVtYmVyKSB7XG5cdFx0XHRpZiAoZWxlbWVudC50YWdOYW1lICE9PSAnUFJFJyB8fCAhZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoUExVR0lOX05BTUUpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGxpbmVOdW1iZXJSb3dzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcubGluZS1udW1iZXJzLXJvd3MnKTtcblx0XHRcdGlmICghbGluZU51bWJlclJvd3MpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dmFyIGxpbmVOdW1iZXJTdGFydCA9IHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXN0YXJ0JyksIDEwKSB8fCAxO1xuXHRcdFx0dmFyIGxpbmVOdW1iZXJFbmQgPSBsaW5lTnVtYmVyU3RhcnQgKyAobGluZU51bWJlclJvd3MuY2hpbGRyZW4ubGVuZ3RoIC0gMSk7XG5cblx0XHRcdGlmIChudW1iZXIgPCBsaW5lTnVtYmVyU3RhcnQpIHtcblx0XHRcdFx0bnVtYmVyID0gbGluZU51bWJlclN0YXJ0O1xuXHRcdFx0fVxuXHRcdFx0aWYgKG51bWJlciA+IGxpbmVOdW1iZXJFbmQpIHtcblx0XHRcdFx0bnVtYmVyID0gbGluZU51bWJlckVuZDtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGxpbmVJbmRleCA9IG51bWJlciAtIGxpbmVOdW1iZXJTdGFydDtcblxuXHRcdFx0cmV0dXJuIGxpbmVOdW1iZXJSb3dzLmNoaWxkcmVuW2xpbmVJbmRleF07XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFJlc2l6ZXMgdGhlIGxpbmUgbnVtYmVycyBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cblx0XHQgKlxuXHRcdCAqIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgYWRkIGxpbmUgbnVtYmVycy4gSXQgd2lsbCBvbmx5IHJlc2l6ZSBleGlzdGluZyBvbmVzLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCBBIGA8cHJlPmAgZWxlbWVudCB3aXRoIGxpbmUgbnVtYmVycy5cblx0XHQgKiBAcmV0dXJucyB7dm9pZH1cblx0XHQgKi9cblx0XHRyZXNpemU6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG5cdFx0XHRyZXNpemVFbGVtZW50cyhbZWxlbWVudF0pO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBXaGV0aGVyIHRoZSBwbHVnaW4gY2FuIGFzc3VtZSB0aGF0IHRoZSB1bml0cyBmb250IHNpemVzIGFuZCBtYXJnaW5zIGFyZSBub3QgZGVwZW5kZWQgb24gdGhlIHNpemUgb2Zcblx0XHQgKiB0aGUgY3VycmVudCB2aWV3cG9ydC5cblx0XHQgKlxuXHRcdCAqIFNldHRpbmcgdGhpcyB0byBgdHJ1ZWAgd2lsbCBhbGxvdyB0aGUgcGx1Z2luIHRvIGRvIGNlcnRhaW4gb3B0aW1pemF0aW9ucyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLlxuXHRcdCAqXG5cdFx0ICogU2V0IHRoaXMgdG8gYGZhbHNlYCBpZiB5b3UgdXNlIGFueSBvZiB0aGUgZm9sbG93aW5nIENTUyB1bml0czogYHZoYCwgYHZ3YCwgYHZtaW5gLCBgdm1heGAuXG5cdFx0ICpcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cblx0XHQgKi9cblx0XHRhc3N1bWVWaWV3cG9ydEluZGVwZW5kZW5jZTogdHJ1ZVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZXNpemVzIHRoZSBnaXZlbiBlbGVtZW50cy5cblx0ICpcblx0ICogQHBhcmFtIHtIVE1MRWxlbWVudFtdfSBlbGVtZW50c1xuXHQgKi9cblx0ZnVuY3Rpb24gcmVzaXplRWxlbWVudHMoZWxlbWVudHMpIHtcblx0XHRlbGVtZW50cyA9IGVsZW1lbnRzLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuXHRcdFx0dmFyIGNvZGVTdHlsZXMgPSBnZXRTdHlsZXMoZSk7XG5cdFx0XHR2YXIgd2hpdGVTcGFjZSA9IGNvZGVTdHlsZXNbJ3doaXRlLXNwYWNlJ107XG5cdFx0XHRyZXR1cm4gd2hpdGVTcGFjZSA9PT0gJ3ByZS13cmFwJyB8fCB3aGl0ZVNwYWNlID09PSAncHJlLWxpbmUnO1xuXHRcdH0pO1xuXG5cdFx0aWYgKGVsZW1lbnRzLmxlbmd0aCA9PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGluZm9zID0gZWxlbWVudHMubWFwKGZ1bmN0aW9uIChlbGVtZW50KSB7XG5cdFx0XHR2YXIgY29kZUVsZW1lbnQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2NvZGUnKTtcblx0XHRcdHZhciBsaW5lTnVtYmVyc1dyYXBwZXIgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5saW5lLW51bWJlcnMtcm93cycpO1xuXHRcdFx0aWYgKCFjb2RlRWxlbWVudCB8fCAhbGluZU51bWJlcnNXcmFwcGVyKSB7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cblx0XHRcdC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovXG5cdFx0XHR2YXIgbGluZU51bWJlclNpemVyID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcubGluZS1udW1iZXJzLXNpemVyJyk7XG5cdFx0XHR2YXIgY29kZUxpbmVzID0gY29kZUVsZW1lbnQudGV4dENvbnRlbnQuc3BsaXQoTkVXX0xJTkVfRVhQKTtcblxuXHRcdFx0aWYgKCFsaW5lTnVtYmVyU2l6ZXIpIHtcblx0XHRcdFx0bGluZU51bWJlclNpemVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuXHRcdFx0XHRsaW5lTnVtYmVyU2l6ZXIuY2xhc3NOYW1lID0gJ2xpbmUtbnVtYmVycy1zaXplcic7XG5cblx0XHRcdFx0Y29kZUVsZW1lbnQuYXBwZW5kQ2hpbGQobGluZU51bWJlclNpemVyKTtcblx0XHRcdH1cblxuXHRcdFx0bGluZU51bWJlclNpemVyLmlubmVySFRNTCA9ICcwJztcblx0XHRcdGxpbmVOdW1iZXJTaXplci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuXHRcdFx0dmFyIG9uZUxpbmVySGVpZ2h0ID0gbGluZU51bWJlclNpemVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcblx0XHRcdGxpbmVOdW1iZXJTaXplci5pbm5lckhUTUwgPSAnJztcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZWxlbWVudDogZWxlbWVudCxcblx0XHRcdFx0bGluZXM6IGNvZGVMaW5lcyxcblx0XHRcdFx0bGluZUhlaWdodHM6IFtdLFxuXHRcdFx0XHRvbmVMaW5lckhlaWdodDogb25lTGluZXJIZWlnaHQsXG5cdFx0XHRcdHNpemVyOiBsaW5lTnVtYmVyU2l6ZXIsXG5cdFx0XHR9O1xuXHRcdH0pLmZpbHRlcihCb29sZWFuKTtcblxuXHRcdGluZm9zLmZvckVhY2goZnVuY3Rpb24gKGluZm8pIHtcblx0XHRcdHZhciBsaW5lTnVtYmVyU2l6ZXIgPSBpbmZvLnNpemVyO1xuXHRcdFx0dmFyIGxpbmVzID0gaW5mby5saW5lcztcblx0XHRcdHZhciBsaW5lSGVpZ2h0cyA9IGluZm8ubGluZUhlaWdodHM7XG5cdFx0XHR2YXIgb25lTGluZXJIZWlnaHQgPSBpbmZvLm9uZUxpbmVySGVpZ2h0O1xuXG5cdFx0XHRsaW5lSGVpZ2h0c1tsaW5lcy5sZW5ndGggLSAxXSA9IHVuZGVmaW5lZDtcblx0XHRcdGxpbmVzLmZvckVhY2goZnVuY3Rpb24gKGxpbmUsIGluZGV4KSB7XG5cdFx0XHRcdGlmIChsaW5lICYmIGxpbmUubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdHZhciBlID0gbGluZU51bWJlclNpemVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKSk7XG5cdFx0XHRcdFx0ZS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblx0XHRcdFx0XHRlLnRleHRDb250ZW50ID0gbGluZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRsaW5lSGVpZ2h0c1tpbmRleF0gPSBvbmVMaW5lckhlaWdodDtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHRpbmZvcy5mb3JFYWNoKGZ1bmN0aW9uIChpbmZvKSB7XG5cdFx0XHR2YXIgbGluZU51bWJlclNpemVyID0gaW5mby5zaXplcjtcblx0XHRcdHZhciBsaW5lSGVpZ2h0cyA9IGluZm8ubGluZUhlaWdodHM7XG5cblx0XHRcdHZhciBjaGlsZEluZGV4ID0gMDtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbGluZUhlaWdodHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKGxpbmVIZWlnaHRzW2ldID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRsaW5lSGVpZ2h0c1tpXSA9IGxpbmVOdW1iZXJTaXplci5jaGlsZHJlbltjaGlsZEluZGV4KytdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aW5mb3MuZm9yRWFjaChmdW5jdGlvbiAoaW5mbykge1xuXHRcdFx0dmFyIGxpbmVOdW1iZXJTaXplciA9IGluZm8uc2l6ZXI7XG5cdFx0XHR2YXIgd3JhcHBlciA9IGluZm8uZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcubGluZS1udW1iZXJzLXJvd3MnKTtcblxuXHRcdFx0bGluZU51bWJlclNpemVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdFx0XHRsaW5lTnVtYmVyU2l6ZXIuaW5uZXJIVE1MID0gJyc7XG5cblx0XHRcdGluZm8ubGluZUhlaWdodHMuZm9yRWFjaChmdW5jdGlvbiAoaGVpZ2h0LCBsaW5lTnVtYmVyKSB7XG5cdFx0XHRcdHdyYXBwZXIuY2hpbGRyZW5bbGluZU51bWJlcl0uc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4Jztcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgc3R5bGUgZGVjbGFyYXRpb25zIGZvciB0aGUgZWxlbWVudFxuXHQgKlxuXHQgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcblx0ICovXG5cdGZ1bmN0aW9uIGdldFN0eWxlcyhlbGVtZW50KSB7XG5cdFx0aWYgKCFlbGVtZW50KSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUgPyBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpIDogKGVsZW1lbnQuY3VycmVudFN0eWxlIHx8IG51bGwpO1xuXHR9XG5cblx0dmFyIGxhc3RXaWR0aCA9IHVuZGVmaW5lZDtcblx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGZ1bmN0aW9uICgpIHtcblx0XHRpZiAoY29uZmlnLmFzc3VtZVZpZXdwb3J0SW5kZXBlbmRlbmNlICYmIGxhc3RXaWR0aCA9PT0gd2luZG93LmlubmVyV2lkdGgpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0bGFzdFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG5cblx0XHRyZXNpemVFbGVtZW50cyhBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdwcmUuJyArIFBMVUdJTl9OQU1FKSkpO1xuXHR9KTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2NvbXBsZXRlJywgZnVuY3Rpb24gKGVudikge1xuXHRcdGlmICghZW52LmNvZGUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgY29kZSA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKGVudi5lbGVtZW50KTtcblx0XHR2YXIgcHJlID0gLyoqIEB0eXBlIHtIVE1MRWxlbWVudH0gKi8gKGNvZGUucGFyZW50Tm9kZSk7XG5cblx0XHQvLyB3b3JrcyBvbmx5IGZvciA8Y29kZT4gd3JhcHBlZCBpbnNpZGUgPHByZT4gKG5vdCBpbmxpbmUpXG5cdFx0aWYgKCFwcmUgfHwgIS9wcmUvaS50ZXN0KHByZS5ub2RlTmFtZSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBBYm9ydCBpZiBsaW5lIG51bWJlcnMgYWxyZWFkeSBleGlzdHNcblx0XHRpZiAoY29kZS5xdWVyeVNlbGVjdG9yKCcubGluZS1udW1iZXJzLXJvd3MnKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIG9ubHkgYWRkIGxpbmUgbnVtYmVycyBpZiA8Y29kZT4gb3Igb25lIG9mIGl0cyBhbmNlc3RvcnMgaGFzIHRoZSBgbGluZS1udW1iZXJzYCBjbGFzc1xuXHRcdGlmICghUHJpc20udXRpbC5pc0FjdGl2ZShjb2RlLCBQTFVHSU5fTkFNRSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGhlIGNsYXNzICdsaW5lLW51bWJlcnMnIGZyb20gdGhlIDxjb2RlPlxuXHRcdGNvZGUuY2xhc3NMaXN0LnJlbW92ZShQTFVHSU5fTkFNRSk7XG5cdFx0Ly8gQWRkIHRoZSBjbGFzcyAnbGluZS1udW1iZXJzJyB0byB0aGUgPHByZT5cblx0XHRwcmUuY2xhc3NMaXN0LmFkZChQTFVHSU5fTkFNRSk7XG5cblx0XHR2YXIgbWF0Y2ggPSBlbnYuY29kZS5tYXRjaChORVdfTElORV9FWFApO1xuXHRcdHZhciBsaW5lc051bSA9IG1hdGNoID8gbWF0Y2gubGVuZ3RoICsgMSA6IDE7XG5cdFx0dmFyIGxpbmVOdW1iZXJzV3JhcHBlcjtcblxuXHRcdHZhciBsaW5lcyA9IG5ldyBBcnJheShsaW5lc051bSArIDEpLmpvaW4oJzxzcGFuPjwvc3Bhbj4nKTtcblxuXHRcdGxpbmVOdW1iZXJzV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcblx0XHRsaW5lTnVtYmVyc1dyYXBwZXIuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG5cdFx0bGluZU51bWJlcnNXcmFwcGVyLmNsYXNzTmFtZSA9ICdsaW5lLW51bWJlcnMtcm93cyc7XG5cdFx0bGluZU51bWJlcnNXcmFwcGVyLmlubmVySFRNTCA9IGxpbmVzO1xuXG5cdFx0aWYgKHByZS5oYXNBdHRyaWJ1dGUoJ2RhdGEtc3RhcnQnKSkge1xuXHRcdFx0cHJlLnN0eWxlLmNvdW50ZXJSZXNldCA9ICdsaW5lbnVtYmVyICcgKyAocGFyc2VJbnQocHJlLmdldEF0dHJpYnV0ZSgnZGF0YS1zdGFydCcpLCAxMCkgLSAxKTtcblx0XHR9XG5cblx0XHRlbnYuZWxlbWVudC5hcHBlbmRDaGlsZChsaW5lTnVtYmVyc1dyYXBwZXIpO1xuXG5cdFx0cmVzaXplRWxlbWVudHMoW3ByZV0pO1xuXG5cdFx0UHJpc20uaG9va3MucnVuKCdsaW5lLW51bWJlcnMnLCBlbnYpO1xuXHR9KTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2xpbmUtbnVtYmVycycsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRlbnYucGx1Z2lucyA9IGVudi5wbHVnaW5zIHx8IHt9O1xuXHRcdGVudi5wbHVnaW5zLmxpbmVOdW1iZXJzID0gdHJ1ZTtcblx0fSk7XG5cbn0oKSk7XG5cbihmdW5jdGlvbiAoKSB7XG5cblx0aWYgKHR5cGVvZiBQcmlzbSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L21hdGNoZXMjUG9seWZpbGxcblx0aWYgKCFFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzKSB7XG5cdFx0RWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcyA9IEVsZW1lbnQucHJvdG90eXBlLm1zTWF0Y2hlc1NlbGVjdG9yIHx8IEVsZW1lbnQucHJvdG90eXBlLndlYmtpdE1hdGNoZXNTZWxlY3Rvcjtcblx0fVxuXG5cdHZhciBMT0FESU5HX01FU1NBR0UgPSAnTG9hZGluZ1x1MjAyNic7XG5cdHZhciBGQUlMVVJFX01FU1NBR0UgPSBmdW5jdGlvbiAoc3RhdHVzLCBtZXNzYWdlKSB7XG5cdFx0cmV0dXJuICdcdTI3MTYgRXJyb3IgJyArIHN0YXR1cyArICcgd2hpbGUgZmV0Y2hpbmcgZmlsZTogJyArIG1lc3NhZ2U7XG5cdH07XG5cdHZhciBGQUlMVVJFX0VNUFRZX01FU1NBR0UgPSAnXHUyNzE2IEVycm9yOiBGaWxlIGRvZXMgbm90IGV4aXN0IG9yIGlzIGVtcHR5JztcblxuXHR2YXIgRVhURU5TSU9OUyA9IHtcblx0XHQnanMnOiAnamF2YXNjcmlwdCcsXG5cdFx0J3B5JzogJ3B5dGhvbicsXG5cdFx0J3JiJzogJ3J1YnknLFxuXHRcdCdwczEnOiAncG93ZXJzaGVsbCcsXG5cdFx0J3BzbTEnOiAncG93ZXJzaGVsbCcsXG5cdFx0J3NoJzogJ2Jhc2gnLFxuXHRcdCdiYXQnOiAnYmF0Y2gnLFxuXHRcdCdoJzogJ2MnLFxuXHRcdCd0ZXgnOiAnbGF0ZXgnXG5cdH07XG5cblx0dmFyIFNUQVRVU19BVFRSID0gJ2RhdGEtc3JjLXN0YXR1cyc7XG5cdHZhciBTVEFUVVNfTE9BRElORyA9ICdsb2FkaW5nJztcblx0dmFyIFNUQVRVU19MT0FERUQgPSAnbG9hZGVkJztcblx0dmFyIFNUQVRVU19GQUlMRUQgPSAnZmFpbGVkJztcblxuXHR2YXIgU0VMRUNUT1IgPSAncHJlW2RhdGEtc3JjXTpub3QoWycgKyBTVEFUVVNfQVRUUiArICc9XCInICsgU1RBVFVTX0xPQURFRCArICdcIl0pJ1xuXHRcdCsgJzpub3QoWycgKyBTVEFUVVNfQVRUUiArICc9XCInICsgU1RBVFVTX0xPQURJTkcgKyAnXCJdKSc7XG5cblx0LyoqXG5cdCAqIExvYWRzIHRoZSBnaXZlbiBmaWxlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc3JjIFRoZSBVUkwgb3IgcGF0aCBvZiB0aGUgc291cmNlIGZpbGUgdG8gbG9hZC5cblx0ICogQHBhcmFtIHsocmVzdWx0OiBzdHJpbmcpID0+IHZvaWR9IHN1Y2Nlc3Ncblx0ICogQHBhcmFtIHsocmVhc29uOiBzdHJpbmcpID0+IHZvaWR9IGVycm9yXG5cdCAqL1xuXHRmdW5jdGlvbiBsb2FkRmlsZShzcmMsIHN1Y2Nlc3MsIGVycm9yKSB7XG5cdFx0dmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXHRcdHhoci5vcGVuKCdHRVQnLCBzcmMsIHRydWUpO1xuXHRcdHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAoeGhyLnJlYWR5U3RhdGUgPT0gNCkge1xuXHRcdFx0XHRpZiAoeGhyLnN0YXR1cyA8IDQwMCAmJiB4aHIucmVzcG9uc2VUZXh0KSB7XG5cdFx0XHRcdFx0c3VjY2Vzcyh4aHIucmVzcG9uc2VUZXh0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpZiAoeGhyLnN0YXR1cyA+PSA0MDApIHtcblx0XHRcdFx0XHRcdGVycm9yKEZBSUxVUkVfTUVTU0FHRSh4aHIuc3RhdHVzLCB4aHIuc3RhdHVzVGV4dCkpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRlcnJvcihGQUlMVVJFX0VNUFRZX01FU1NBR0UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0eGhyLnNlbmQobnVsbCk7XG5cdH1cblxuXHQvKipcblx0ICogUGFyc2VzIHRoZSBnaXZlbiByYW5nZS5cblx0ICpcblx0ICogVGhpcyByZXR1cm5zIGEgcmFuZ2Ugd2l0aCBpbmNsdXNpdmUgZW5kcy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSByYW5nZVxuXHQgKiBAcmV0dXJucyB7W251bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkXSB8IHVuZGVmaW5lZH1cblx0ICovXG5cdGZ1bmN0aW9uIHBhcnNlUmFuZ2UocmFuZ2UpIHtcblx0XHR2YXIgbSA9IC9eXFxzKihcXGQrKVxccyooPzooLClcXHMqKD86KFxcZCspXFxzKik/KT8kLy5leGVjKHJhbmdlIHx8ICcnKTtcblx0XHRpZiAobSkge1xuXHRcdFx0dmFyIHN0YXJ0ID0gTnVtYmVyKG1bMV0pO1xuXHRcdFx0dmFyIGNvbW1hID0gbVsyXTtcblx0XHRcdHZhciBlbmQgPSBtWzNdO1xuXG5cdFx0XHRpZiAoIWNvbW1hKSB7XG5cdFx0XHRcdHJldHVybiBbc3RhcnQsIHN0YXJ0XTtcblx0XHRcdH1cblx0XHRcdGlmICghZW5kKSB7XG5cdFx0XHRcdHJldHVybiBbc3RhcnQsIHVuZGVmaW5lZF07XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gW3N0YXJ0LCBOdW1iZXIoZW5kKV07XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRQcmlzbS5ob29rcy5hZGQoJ2JlZm9yZS1oaWdobGlnaHRhbGwnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0ZW52LnNlbGVjdG9yICs9ICcsICcgKyBTRUxFQ1RPUjtcblx0fSk7XG5cblx0UHJpc20uaG9va3MuYWRkKCdiZWZvcmUtc2FuaXR5LWNoZWNrJywgZnVuY3Rpb24gKGVudikge1xuXHRcdHZhciBwcmUgPSAvKiogQHR5cGUge0hUTUxQcmVFbGVtZW50fSAqLyAoZW52LmVsZW1lbnQpO1xuXHRcdGlmIChwcmUubWF0Y2hlcyhTRUxFQ1RPUikpIHtcblx0XHRcdGVudi5jb2RlID0gJyc7IC8vIGZhc3QtcGF0aCB0aGUgd2hvbGUgdGhpbmcgYW5kIGdvIHRvIGNvbXBsZXRlXG5cblx0XHRcdHByZS5zZXRBdHRyaWJ1dGUoU1RBVFVTX0FUVFIsIFNUQVRVU19MT0FESU5HKTsgLy8gbWFyayBhcyBsb2FkaW5nXG5cblx0XHRcdC8vIGFkZCBjb2RlIGVsZW1lbnQgd2l0aCBsb2FkaW5nIG1lc3NhZ2Vcblx0XHRcdHZhciBjb2RlID0gcHJlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0NPREUnKSk7XG5cdFx0XHRjb2RlLnRleHRDb250ZW50ID0gTE9BRElOR19NRVNTQUdFO1xuXG5cdFx0XHR2YXIgc3JjID0gcHJlLmdldEF0dHJpYnV0ZSgnZGF0YS1zcmMnKTtcblxuXHRcdFx0dmFyIGxhbmd1YWdlID0gZW52Lmxhbmd1YWdlO1xuXHRcdFx0aWYgKGxhbmd1YWdlID09PSAnbm9uZScpIHtcblx0XHRcdFx0Ly8gdGhlIGxhbmd1YWdlIG1pZ2h0IGJlICdub25lJyBiZWNhdXNlIHRoZXJlIGlzIG5vIGxhbmd1YWdlIHNldDtcblx0XHRcdFx0Ly8gaW4gdGhpcyBjYXNlLCB3ZSB3YW50IHRvIHVzZSB0aGUgZXh0ZW5zaW9uIGFzIHRoZSBsYW5ndWFnZVxuXHRcdFx0XHR2YXIgZXh0ZW5zaW9uID0gKC9cXC4oXFx3KykkLy5leGVjKHNyYykgfHwgWywgJ25vbmUnXSlbMV07XG5cdFx0XHRcdGxhbmd1YWdlID0gRVhURU5TSU9OU1tleHRlbnNpb25dIHx8IGV4dGVuc2lvbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gc2V0IGxhbmd1YWdlIGNsYXNzZXNcblx0XHRcdFByaXNtLnV0aWwuc2V0TGFuZ3VhZ2UoY29kZSwgbGFuZ3VhZ2UpO1xuXHRcdFx0UHJpc20udXRpbC5zZXRMYW5ndWFnZShwcmUsIGxhbmd1YWdlKTtcblxuXHRcdFx0Ly8gcHJlbG9hZCB0aGUgbGFuZ3VhZ2Vcblx0XHRcdHZhciBhdXRvbG9hZGVyID0gUHJpc20ucGx1Z2lucy5hdXRvbG9hZGVyO1xuXHRcdFx0aWYgKGF1dG9sb2FkZXIpIHtcblx0XHRcdFx0YXV0b2xvYWRlci5sb2FkTGFuZ3VhZ2VzKGxhbmd1YWdlKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gbG9hZCBmaWxlXG5cdFx0XHRsb2FkRmlsZShcblx0XHRcdFx0c3JjLFxuXHRcdFx0XHRmdW5jdGlvbiAodGV4dCkge1xuXHRcdFx0XHRcdC8vIG1hcmsgYXMgbG9hZGVkXG5cdFx0XHRcdFx0cHJlLnNldEF0dHJpYnV0ZShTVEFUVVNfQVRUUiwgU1RBVFVTX0xPQURFRCk7XG5cblx0XHRcdFx0XHQvLyBoYW5kbGUgZGF0YS1yYW5nZVxuXHRcdFx0XHRcdHZhciByYW5nZSA9IHBhcnNlUmFuZ2UocHJlLmdldEF0dHJpYnV0ZSgnZGF0YS1yYW5nZScpKTtcblx0XHRcdFx0XHRpZiAocmFuZ2UpIHtcblx0XHRcdFx0XHRcdHZhciBsaW5lcyA9IHRleHQuc3BsaXQoL1xcclxcbj98XFxuL2cpO1xuXG5cdFx0XHRcdFx0XHQvLyB0aGUgcmFuZ2UgaXMgb25lLWJhc2VkIGFuZCBpbmNsdXNpdmUgb24gYm90aCBlbmRzXG5cdFx0XHRcdFx0XHR2YXIgc3RhcnQgPSByYW5nZVswXTtcblx0XHRcdFx0XHRcdHZhciBlbmQgPSByYW5nZVsxXSA9PSBudWxsID8gbGluZXMubGVuZ3RoIDogcmFuZ2VbMV07XG5cblx0XHRcdFx0XHRcdGlmIChzdGFydCA8IDApIHsgc3RhcnQgKz0gbGluZXMubGVuZ3RoOyB9XG5cdFx0XHRcdFx0XHRzdGFydCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHN0YXJ0IC0gMSwgbGluZXMubGVuZ3RoKSk7XG5cdFx0XHRcdFx0XHRpZiAoZW5kIDwgMCkgeyBlbmQgKz0gbGluZXMubGVuZ3RoOyB9XG5cdFx0XHRcdFx0XHRlbmQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihlbmQsIGxpbmVzLmxlbmd0aCkpO1xuXG5cdFx0XHRcdFx0XHR0ZXh0ID0gbGluZXMuc2xpY2Uoc3RhcnQsIGVuZCkuam9pbignXFxuJyk7XG5cblx0XHRcdFx0XHRcdC8vIGFkZCBkYXRhLXN0YXJ0IGZvciBsaW5lIG51bWJlcnNcblx0XHRcdFx0XHRcdGlmICghcHJlLmhhc0F0dHJpYnV0ZSgnZGF0YS1zdGFydCcpKSB7XG5cdFx0XHRcdFx0XHRcdHByZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhcnQnLCBTdHJpbmcoc3RhcnQgKyAxKSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gaGlnaGxpZ2h0IGNvZGVcblx0XHRcdFx0XHRjb2RlLnRleHRDb250ZW50ID0gdGV4dDtcblx0XHRcdFx0XHRQcmlzbS5oaWdobGlnaHRFbGVtZW50KGNvZGUpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRmdW5jdGlvbiAoZXJyb3IpIHtcblx0XHRcdFx0XHQvLyBtYXJrIGFzIGZhaWxlZFxuXHRcdFx0XHRcdHByZS5zZXRBdHRyaWJ1dGUoU1RBVFVTX0FUVFIsIFNUQVRVU19GQUlMRUQpO1xuXG5cdFx0XHRcdFx0Y29kZS50ZXh0Q29udGVudCA9IGVycm9yO1xuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ucGx1Z2lucy5maWxlSGlnaGxpZ2h0ID0ge1xuXHRcdC8qKlxuXHRcdCAqIEV4ZWN1dGVzIHRoZSBGaWxlIEhpZ2hsaWdodCBwbHVnaW4gZm9yIGFsbCBtYXRjaGluZyBgcHJlYCBlbGVtZW50cyB1bmRlciB0aGUgZ2l2ZW4gY29udGFpbmVyLlxuXHRcdCAqXG5cdFx0ICogTm90ZTogRWxlbWVudHMgd2hpY2ggYXJlIGFscmVhZHkgbG9hZGVkIG9yIGN1cnJlbnRseSBsb2FkaW5nIHdpbGwgbm90IGJlIHRvdWNoZWQgYnkgdGhpcyBtZXRob2QuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1BhcmVudE5vZGV9IFtjb250YWluZXI9ZG9jdW1lbnRdXG5cdFx0ICovXG5cdFx0aGlnaGxpZ2h0OiBmdW5jdGlvbiBoaWdobGlnaHQoY29udGFpbmVyKSB7XG5cdFx0XHR2YXIgZWxlbWVudHMgPSAoY29udGFpbmVyIHx8IGRvY3VtZW50KS5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SKTtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IDAsIGVsZW1lbnQ7IChlbGVtZW50ID0gZWxlbWVudHNbaSsrXSk7KSB7XG5cdFx0XHRcdFByaXNtLmhpZ2hsaWdodEVsZW1lbnQoZWxlbWVudCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdHZhciBsb2dnZWQgPSBmYWxzZTtcblx0LyoqIEBkZXByZWNhdGVkIFVzZSBgUHJpc20ucGx1Z2lucy5maWxlSGlnaGxpZ2h0LmhpZ2hsaWdodGAgaW5zdGVhZC4gKi9cblx0UHJpc20uZmlsZUhpZ2hsaWdodCA9IGZ1bmN0aW9uICgpIHtcblx0XHRpZiAoIWxvZ2dlZCkge1xuXHRcdFx0Y29uc29sZS53YXJuKCdQcmlzbS5maWxlSGlnaGxpZ2h0IGlzIGRlcHJlY2F0ZWQuIFVzZSBgUHJpc20ucGx1Z2lucy5maWxlSGlnaGxpZ2h0LmhpZ2hsaWdodGAgaW5zdGVhZC4nKTtcblx0XHRcdGxvZ2dlZCA9IHRydWU7XG5cdFx0fVxuXHRcdFByaXNtLnBsdWdpbnMuZmlsZUhpZ2hsaWdodC5oaWdobGlnaHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0fTtcblxufSgpKTtcblxuIiwgIi8qKlxuICogQGxpY2Vuc2UgTUlUXG4gKiB0b3BiYXIgMS4wLjAsIDIwMjEtMDEtMDZcbiAqIGh0dHA6Ly9idXVuZ3V5ZW4uZ2l0aHViLmlvL3RvcGJhclxuICogQ29weXJpZ2h0IChjKSAyMDIxIEJ1dSBOZ3V5ZW5cbiAqL1xuKGZ1bmN0aW9uICh3aW5kb3csIGRvY3VtZW50KSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIC8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3BhdWxpcmlzaC8xNTc5NjcxXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxhc3RUaW1lID0gMDtcbiAgICB2YXIgdmVuZG9ycyA9IFtcIm1zXCIsIFwibW96XCIsIFwid2Via2l0XCIsIFwib1wiXTtcbiAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHZlbmRvcnMubGVuZ3RoICYmICF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lOyArK3gpIHtcbiAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPVxuICAgICAgICB3aW5kb3dbdmVuZG9yc1t4XSArIFwiUmVxdWVzdEFuaW1hdGlvbkZyYW1lXCJdO1xuICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lID1cbiAgICAgICAgd2luZG93W3ZlbmRvcnNbeF0gKyBcIkNhbmNlbEFuaW1hdGlvbkZyYW1lXCJdIHx8XG4gICAgICAgIHdpbmRvd1t2ZW5kb3JzW3hdICsgXCJDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIl07XG4gICAgfVxuICAgIGlmICghd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSlcbiAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIGN1cnJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIHZhciB0aW1lVG9DYWxsID0gTWF0aC5tYXgoMCwgMTYgLSAoY3VyclRpbWUgLSBsYXN0VGltZSkpO1xuICAgICAgICB2YXIgaWQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY2FsbGJhY2soY3VyclRpbWUgKyB0aW1lVG9DYWxsKTtcbiAgICAgICAgfSwgdGltZVRvQ2FsbCk7XG4gICAgICAgIGxhc3RUaW1lID0gY3VyclRpbWUgKyB0aW1lVG9DYWxsO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgICB9O1xuICAgIGlmICghd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKVxuICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIGNsZWFyVGltZW91dChpZCk7XG4gICAgICB9O1xuICB9KSgpO1xuXG4gIHZhciBjYW52YXMsXG4gICAgcHJvZ3Jlc3NUaW1lcklkLFxuICAgIGZhZGVUaW1lcklkLFxuICAgIGN1cnJlbnRQcm9ncmVzcyxcbiAgICBzaG93aW5nLFxuICAgIGFkZEV2ZW50ID0gZnVuY3Rpb24gKGVsZW0sIHR5cGUsIGhhbmRsZXIpIHtcbiAgICAgIGlmIChlbGVtLmFkZEV2ZW50TGlzdGVuZXIpIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgICBlbHNlIGlmIChlbGVtLmF0dGFjaEV2ZW50KSBlbGVtLmF0dGFjaEV2ZW50KFwib25cIiArIHR5cGUsIGhhbmRsZXIpO1xuICAgICAgZWxzZSBlbGVtW1wib25cIiArIHR5cGVdID0gaGFuZGxlcjtcbiAgICB9LFxuICAgIG9wdGlvbnMgPSB7XG4gICAgICBhdXRvUnVuOiB0cnVlLFxuICAgICAgYmFyVGhpY2tuZXNzOiAzLFxuICAgICAgYmFyQ29sb3JzOiB7XG4gICAgICAgIDA6IFwicmdiYSgyNiwgIDE4OCwgMTU2LCAuOSlcIixcbiAgICAgICAgXCIuMjVcIjogXCJyZ2JhKDUyLCAgMTUyLCAyMTksIC45KVwiLFxuICAgICAgICBcIi41MFwiOiBcInJnYmEoMjQxLCAxOTYsIDE1LCAgLjkpXCIsXG4gICAgICAgIFwiLjc1XCI6IFwicmdiYSgyMzAsIDEyNiwgMzQsICAuOSlcIixcbiAgICAgICAgXCIxLjBcIjogXCJyZ2JhKDIxMSwgODQsICAwLCAgIC45KVwiLFxuICAgICAgfSxcbiAgICAgIHNoYWRvd0JsdXI6IDEwLFxuICAgICAgc2hhZG93Q29sb3I6IFwicmdiYSgwLCAgIDAsICAgMCwgICAuNilcIixcbiAgICAgIGNsYXNzTmFtZTogbnVsbCxcbiAgICB9LFxuICAgIHJlcGFpbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBjYW52YXMud2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBvcHRpb25zLmJhclRoaWNrbmVzcyAqIDU7IC8vIG5lZWQgc3BhY2UgZm9yIHNoYWRvd1xuXG4gICAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGN0eC5zaGFkb3dCbHVyID0gb3B0aW9ucy5zaGFkb3dCbHVyO1xuICAgICAgY3R4LnNoYWRvd0NvbG9yID0gb3B0aW9ucy5zaGFkb3dDb2xvcjtcblxuICAgICAgdmFyIGxpbmVHcmFkaWVudCA9IGN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLCAwLCBjYW52YXMud2lkdGgsIDApO1xuICAgICAgZm9yICh2YXIgc3RvcCBpbiBvcHRpb25zLmJhckNvbG9ycylcbiAgICAgICAgbGluZUdyYWRpZW50LmFkZENvbG9yU3RvcChzdG9wLCBvcHRpb25zLmJhckNvbG9yc1tzdG9wXSk7XG4gICAgICBjdHgubGluZVdpZHRoID0gb3B0aW9ucy5iYXJUaGlja25lc3M7XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICBjdHgubW92ZVRvKDAsIG9wdGlvbnMuYmFyVGhpY2tuZXNzIC8gMik7XG4gICAgICBjdHgubGluZVRvKFxuICAgICAgICBNYXRoLmNlaWwoY3VycmVudFByb2dyZXNzICogY2FudmFzLndpZHRoKSxcbiAgICAgICAgb3B0aW9ucy5iYXJUaGlja25lc3MgLyAyXG4gICAgICApO1xuICAgICAgY3R4LnN0cm9rZVN0eWxlID0gbGluZUdyYWRpZW50O1xuICAgICAgY3R4LnN0cm9rZSgpO1xuICAgIH0sXG4gICAgY3JlYXRlQ2FudmFzID0gZnVuY3Rpb24gKCkge1xuICAgICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgIHZhciBzdHlsZSA9IGNhbnZhcy5zdHlsZTtcbiAgICAgIHN0eWxlLnBvc2l0aW9uID0gXCJmaXhlZFwiO1xuICAgICAgc3R5bGUudG9wID0gc3R5bGUubGVmdCA9IHN0eWxlLnJpZ2h0ID0gc3R5bGUubWFyZ2luID0gc3R5bGUucGFkZGluZyA9IDA7XG4gICAgICBzdHlsZS56SW5kZXggPSAxMDAwMDE7XG4gICAgICBzdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICBpZiAob3B0aW9ucy5jbGFzc05hbWUpIGNhbnZhcy5jbGFzc0xpc3QuYWRkKG9wdGlvbnMuY2xhc3NOYW1lKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2FudmFzKTtcbiAgICAgIGFkZEV2ZW50KHdpbmRvdywgXCJyZXNpemVcIiwgcmVwYWludCk7XG4gICAgfSxcbiAgICB0b3BiYXIgPSB7XG4gICAgICBjb25maWc6IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBvcHRzKVxuICAgICAgICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KGtleSkpIG9wdGlvbnNba2V5XSA9IG9wdHNba2V5XTtcbiAgICAgIH0sXG4gICAgICBzaG93OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChzaG93aW5nKSByZXR1cm47XG4gICAgICAgIHNob3dpbmcgPSB0cnVlO1xuICAgICAgICBpZiAoZmFkZVRpbWVySWQgIT09IG51bGwpIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShmYWRlVGltZXJJZCk7XG4gICAgICAgIGlmICghY2FudmFzKSBjcmVhdGVDYW52YXMoKTtcbiAgICAgICAgY2FudmFzLnN0eWxlLm9wYWNpdHkgPSAxO1xuICAgICAgICBjYW52YXMuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgICAgdG9wYmFyLnByb2dyZXNzKDApO1xuICAgICAgICBpZiAob3B0aW9ucy5hdXRvUnVuKSB7XG4gICAgICAgICAgKGZ1bmN0aW9uIGxvb3AoKSB7XG4gICAgICAgICAgICBwcm9ncmVzc1RpbWVySWQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApO1xuICAgICAgICAgICAgdG9wYmFyLnByb2dyZXNzKFxuICAgICAgICAgICAgICBcIitcIiArIDAuMDUgKiBNYXRoLnBvdygxIC0gTWF0aC5zcXJ0KGN1cnJlbnRQcm9ncmVzcyksIDIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwcm9ncmVzczogZnVuY3Rpb24gKHRvKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdG8gPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBjdXJyZW50UHJvZ3Jlc3M7XG4gICAgICAgIGlmICh0eXBlb2YgdG8gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICB0byA9XG4gICAgICAgICAgICAodG8uaW5kZXhPZihcIitcIikgPj0gMCB8fCB0by5pbmRleE9mKFwiLVwiKSA+PSAwXG4gICAgICAgICAgICAgID8gY3VycmVudFByb2dyZXNzXG4gICAgICAgICAgICAgIDogMCkgKyBwYXJzZUZsb2F0KHRvKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50UHJvZ3Jlc3MgPSB0byA+IDEgPyAxIDogdG87XG4gICAgICAgIHJlcGFpbnQoKTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQcm9ncmVzcztcbiAgICAgIH0sXG4gICAgICBoaWRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghc2hvd2luZykgcmV0dXJuO1xuICAgICAgICBzaG93aW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChwcm9ncmVzc1RpbWVySWQgIT0gbnVsbCkge1xuICAgICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShwcm9ncmVzc1RpbWVySWQpO1xuICAgICAgICAgIHByb2dyZXNzVGltZXJJZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgKGZ1bmN0aW9uIGxvb3AoKSB7XG4gICAgICAgICAgaWYgKHRvcGJhci5wcm9ncmVzcyhcIisuMVwiKSA+PSAxKSB7XG4gICAgICAgICAgICBjYW52YXMuc3R5bGUub3BhY2l0eSAtPSAwLjA1O1xuICAgICAgICAgICAgaWYgKGNhbnZhcy5zdHlsZS5vcGFjaXR5IDw9IDAuMDUpIHtcbiAgICAgICAgICAgICAgY2FudmFzLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgZmFkZVRpbWVySWQgPSBudWxsO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGZhZGVUaW1lcklkID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTtcbiAgICAgICAgfSkoKTtcbiAgICAgIH0sXG4gICAgfTtcblxuICBpZiAodHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHRvcGJhcjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdG9wYmFyO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRoaXMudG9wYmFyID0gdG9wYmFyO1xuICB9XG59LmNhbGwodGhpcywgd2luZG93LCBkb2N1bWVudCkpO1xuIiwgImltcG9ydCAkIGZyb20gXCJqcXVlcnlcIjtcbndpbmRvdy4kID0gJDtcbndpbmRvdy5qUXVlcnkgPSAkO1xuXG5pbXBvcnQgXCJib290c3RyYXBcIjtcbmltcG9ydCBcIi4uL3ZlbmRvci9wcmlzbVwiO1xuXG5pbXBvcnQgXCIuL3JlcG9zaXRvcnlcIjtcbmltcG9ydCBcIi4va214X2FuaW1cIjtcblxuLy8gSWYgeW91IHdhbnQgdG8gdXNlIFBob2VuaXggY2hhbm5lbHMsIHJ1biBgbWl4IGhlbHAgcGh4Lmdlbi5jaGFubmVsYFxuLy8gdG8gZ2V0IHN0YXJ0ZWQgYW5kIHRoZW4gdW5jb21tZW50IHRoZSBsaW5lIGJlbG93LlxuLy8gaW1wb3J0IFwiLi91c2VyX3NvY2tldC5qc1wiXG5cbi8vIEluY2x1ZGUgcGhvZW5peF9odG1sIHRvIGhhbmRsZSBtZXRob2Q9UFVUL0RFTEVURSBpbiBmb3JtcyBhbmQgYnV0dG9ucy5cbmltcG9ydCBcInBob2VuaXhfaHRtbFwiO1xuLy8gRXN0YWJsaXNoIFBob2VuaXggU29ja2V0IGFuZCBMaXZlVmlldyBjb25maWd1cmF0aW9uLlxuaW1wb3J0IHtTb2NrZXR9IGZyb20gXCJwaG9lbml4XCI7XG5pbXBvcnQge0xpdmVTb2NrZXR9IGZyb20gXCJwaG9lbml4X2xpdmVfdmlld1wiO1xuaW1wb3J0IHRvcGJhciBmcm9tIFwiLi4vdmVuZG9yL3RvcGJhclwiO1xuXG5sZXQgY3NyZlRva2VuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0nY3NyZi10b2tlbiddXCIpLmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIik7XG5sZXQgbGl2ZVNvY2tldCA9IG5ldyBMaXZlU29ja2V0KFwiL2xpdmVcIiwgU29ja2V0LCB7cGFyYW1zOiB7X2NzcmZfdG9rZW46IGNzcmZUb2tlbn19KTtcblxuLy8gU2hvdyBwcm9ncmVzcyBiYXIgb24gbGl2ZSBuYXZpZ2F0aW9uIGFuZCBmb3JtIHN1Ym1pdHNcbnRvcGJhci5jb25maWcoe2JhckNvbG9yczogezA6IFwiIzI5ZFwifSwgc2hhZG93Q29sb3I6IFwicmdiYSgwLCAwLCAwLCAuMylcIn0pO1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwaHg6cGFnZS1sb2FkaW5nLXN0YXJ0XCIsIGluZm8gPT4gdG9wYmFyLnNob3coKSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBoeDpwYWdlLWxvYWRpbmctc3RvcFwiLCBpbmZvID0+IHRvcGJhci5oaWRlKCkpO1xuXG4vLyBjb25uZWN0IGlmIHRoZXJlIGFyZSBhbnkgTGl2ZVZpZXdzIG9uIHRoZSBwYWdlXG5saXZlU29ja2V0LmNvbm5lY3QoKTtcblxuLy8gZXhwb3NlIGxpdmVTb2NrZXQgb24gd2luZG93IGZvciB3ZWIgY29uc29sZSBkZWJ1ZyBsb2dzIGFuZCBsYXRlbmN5IHNpbXVsYXRpb246XG4vLyA+PiBsaXZlU29ja2V0LmVuYWJsZURlYnVnKClcbi8vID4+IGxpdmVTb2NrZXQuZW5hYmxlTGF0ZW5jeVNpbSgxMDAwKSAgLy8gZW5hYmxlZCBmb3IgZHVyYXRpb24gb2YgYnJvd3NlciBzZXNzaW9uXG4vLyA+PiBsaXZlU29ja2V0LmRpc2FibGVMYXRlbmN5U2ltKClcbndpbmRvdy5saXZlU29ja2V0ID0gbGl2ZVNvY2tldDtcbiIsICJleHBvcnQgKiBmcm9tIFwiLi9lbnVtcy5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kaWZpZXJzL2luZGV4LmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgcG9wcGVyR2VuZXJhdG9yLCBkZXRlY3RPdmVyZmxvdywgY3JlYXRlUG9wcGVyIGFzIGNyZWF0ZVBvcHBlckJhc2UgfSBmcm9tIFwiLi9jcmVhdGVQb3BwZXIuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIgfSBmcm9tIFwiLi9wb3BwZXIuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIgYXMgY3JlYXRlUG9wcGVyTGl0ZSB9IGZyb20gXCIuL3BvcHBlci1saXRlLmpzXCI7IiwgImV4cG9ydCB2YXIgdG9wID0gJ3RvcCc7XG5leHBvcnQgdmFyIGJvdHRvbSA9ICdib3R0b20nO1xuZXhwb3J0IHZhciByaWdodCA9ICdyaWdodCc7XG5leHBvcnQgdmFyIGxlZnQgPSAnbGVmdCc7XG5leHBvcnQgdmFyIGF1dG8gPSAnYXV0byc7XG5leHBvcnQgdmFyIGJhc2VQbGFjZW1lbnRzID0gW3RvcCwgYm90dG9tLCByaWdodCwgbGVmdF07XG5leHBvcnQgdmFyIHN0YXJ0ID0gJ3N0YXJ0JztcbmV4cG9ydCB2YXIgZW5kID0gJ2VuZCc7XG5leHBvcnQgdmFyIGNsaXBwaW5nUGFyZW50cyA9ICdjbGlwcGluZ1BhcmVudHMnO1xuZXhwb3J0IHZhciB2aWV3cG9ydCA9ICd2aWV3cG9ydCc7XG5leHBvcnQgdmFyIHBvcHBlciA9ICdwb3BwZXInO1xuZXhwb3J0IHZhciByZWZlcmVuY2UgPSAncmVmZXJlbmNlJztcbmV4cG9ydCB2YXIgdmFyaWF0aW9uUGxhY2VtZW50cyA9IC8qI19fUFVSRV9fKi9iYXNlUGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gIHJldHVybiBhY2MuY29uY2F0KFtwbGFjZW1lbnQgKyBcIi1cIiArIHN0YXJ0LCBwbGFjZW1lbnQgKyBcIi1cIiArIGVuZF0pO1xufSwgW10pO1xuZXhwb3J0IHZhciBwbGFjZW1lbnRzID0gLyojX19QVVJFX18qL1tdLmNvbmNhdChiYXNlUGxhY2VtZW50cywgW2F1dG9dKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gIHJldHVybiBhY2MuY29uY2F0KFtwbGFjZW1lbnQsIHBsYWNlbWVudCArIFwiLVwiICsgc3RhcnQsIHBsYWNlbWVudCArIFwiLVwiICsgZW5kXSk7XG59LCBbXSk7IC8vIG1vZGlmaWVycyB0aGF0IG5lZWQgdG8gcmVhZCB0aGUgRE9NXG5cbmV4cG9ydCB2YXIgYmVmb3JlUmVhZCA9ICdiZWZvcmVSZWFkJztcbmV4cG9ydCB2YXIgcmVhZCA9ICdyZWFkJztcbmV4cG9ydCB2YXIgYWZ0ZXJSZWFkID0gJ2FmdGVyUmVhZCc7IC8vIHB1cmUtbG9naWMgbW9kaWZpZXJzXG5cbmV4cG9ydCB2YXIgYmVmb3JlTWFpbiA9ICdiZWZvcmVNYWluJztcbmV4cG9ydCB2YXIgbWFpbiA9ICdtYWluJztcbmV4cG9ydCB2YXIgYWZ0ZXJNYWluID0gJ2FmdGVyTWFpbic7IC8vIG1vZGlmaWVyIHdpdGggdGhlIHB1cnBvc2UgdG8gd3JpdGUgdG8gdGhlIERPTSAob3Igd3JpdGUgaW50byBhIGZyYW1ld29yayBzdGF0ZSlcblxuZXhwb3J0IHZhciBiZWZvcmVXcml0ZSA9ICdiZWZvcmVXcml0ZSc7XG5leHBvcnQgdmFyIHdyaXRlID0gJ3dyaXRlJztcbmV4cG9ydCB2YXIgYWZ0ZXJXcml0ZSA9ICdhZnRlcldyaXRlJztcbmV4cG9ydCB2YXIgbW9kaWZpZXJQaGFzZXMgPSBbYmVmb3JlUmVhZCwgcmVhZCwgYWZ0ZXJSZWFkLCBiZWZvcmVNYWluLCBtYWluLCBhZnRlck1haW4sIGJlZm9yZVdyaXRlLCB3cml0ZSwgYWZ0ZXJXcml0ZV07IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE5vZGVOYW1lKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnQgPyAoZWxlbWVudC5ub2RlTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA6IG51bGw7XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvdyhub2RlKSB7XG4gIGlmIChub2RlID09IG51bGwpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgaWYgKG5vZGUudG9TdHJpbmcoKSAhPT0gJ1tvYmplY3QgV2luZG93XScpIHtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICByZXR1cm4gb3duZXJEb2N1bWVudCA/IG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93IDogd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59IiwgImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIGlzRWxlbWVudChub2RlKSB7XG4gIHZhciBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLkVsZW1lbnQ7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gaXNIVE1MRWxlbWVudChub2RlKSB7XG4gIHZhciBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLkhUTUxFbGVtZW50O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50O1xufVxuXG5mdW5jdGlvbiBpc1NoYWRvd1Jvb3Qobm9kZSkge1xuICAvLyBJRSAxMSBoYXMgbm8gU2hhZG93Um9vdFxuICBpZiAodHlwZW9mIFNoYWRvd1Jvb3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuU2hhZG93Um9vdDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290O1xufVxuXG5leHBvcnQgeyBpc0VsZW1lbnQsIGlzSFRNTEVsZW1lbnQsIGlzU2hhZG93Um9vdCB9OyIsICJpbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4uL2RvbS11dGlscy9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiOyAvLyBUaGlzIG1vZGlmaWVyIHRha2VzIHRoZSBzdHlsZXMgcHJlcGFyZWQgYnkgdGhlIGBjb21wdXRlU3R5bGVzYCBtb2RpZmllclxuLy8gYW5kIGFwcGxpZXMgdGhlbSB0byB0aGUgSFRNTEVsZW1lbnRzIHN1Y2ggYXMgcG9wcGVyIGFuZCBhcnJvd1xuXG5mdW5jdGlvbiBhcHBseVN0eWxlcyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGU7XG4gIE9iamVjdC5rZXlzKHN0YXRlLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdmFyIHN0eWxlID0gc3RhdGUuc3R5bGVzW25hbWVdIHx8IHt9O1xuICAgIHZhciBhdHRyaWJ1dGVzID0gc3RhdGUuYXR0cmlidXRlc1tuYW1lXSB8fCB7fTtcbiAgICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW25hbWVdOyAvLyBhcnJvdyBpcyBvcHRpb25hbCArIHZpcnR1YWwgZWxlbWVudHNcblxuICAgIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAhZ2V0Tm9kZU5hbWUoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIEZsb3cgZG9lc24ndCBzdXBwb3J0IHRvIGV4dGVuZCB0aGlzIHByb3BlcnR5LCBidXQgaXQncyB0aGUgbW9zdFxuICAgIC8vIGVmZmVjdGl2ZSB3YXkgdG8gYXBwbHkgc3R5bGVzIHRvIGFuIEhUTUxFbGVtZW50XG4gICAgLy8gJEZsb3dGaXhNZVtjYW5ub3Qtd3JpdGVdXG5cblxuICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgc3R5bGUpO1xuICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGF0dHJpYnV0ZXNbbmFtZV07XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSA9PT0gdHJ1ZSA/ICcnIDogdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYyKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlO1xuICB2YXIgaW5pdGlhbFN0eWxlcyA9IHtcbiAgICBwb3BwZXI6IHtcbiAgICAgIHBvc2l0aW9uOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgbGVmdDogJzAnLFxuICAgICAgdG9wOiAnMCcsXG4gICAgICBtYXJnaW46ICcwJ1xuICAgIH0sXG4gICAgYXJyb3c6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnXG4gICAgfSxcbiAgICByZWZlcmVuY2U6IHt9XG4gIH07XG4gIE9iamVjdC5hc3NpZ24oc3RhdGUuZWxlbWVudHMucG9wcGVyLnN0eWxlLCBpbml0aWFsU3R5bGVzLnBvcHBlcik7XG4gIHN0YXRlLnN0eWxlcyA9IGluaXRpYWxTdHlsZXM7XG5cbiAgaWYgKHN0YXRlLmVsZW1lbnRzLmFycm93KSB7XG4gICAgT2JqZWN0LmFzc2lnbihzdGF0ZS5lbGVtZW50cy5hcnJvdy5zdHlsZSwgaW5pdGlhbFN0eWxlcy5hcnJvdyk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIE9iamVjdC5rZXlzKHN0YXRlLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW25hbWVdO1xuICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBzdGF0ZS5hdHRyaWJ1dGVzW25hbWVdIHx8IHt9O1xuICAgICAgdmFyIHN0eWxlUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKHN0YXRlLnN0eWxlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IHN0YXRlLnN0eWxlc1tuYW1lXSA6IGluaXRpYWxTdHlsZXNbbmFtZV0pOyAvLyBTZXQgYWxsIHZhbHVlcyB0byBhbiBlbXB0eSBzdHJpbmcgdG8gdW5zZXQgdGhlbVxuXG4gICAgICB2YXIgc3R5bGUgPSBzdHlsZVByb3BlcnRpZXMucmVkdWNlKGZ1bmN0aW9uIChzdHlsZSwgcHJvcGVydHkpIHtcbiAgICAgICAgc3R5bGVbcHJvcGVydHldID0gJyc7XG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgIH0sIHt9KTsgLy8gYXJyb3cgaXMgb3B0aW9uYWwgKyB2aXJ0dWFsIGVsZW1lbnRzXG5cbiAgICAgIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAhZ2V0Tm9kZU5hbWUoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKTtcbiAgICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdhcHBseVN0eWxlcycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnd3JpdGUnLFxuICBmbjogYXBwbHlTdHlsZXMsXG4gIGVmZmVjdDogZWZmZWN0LFxuICByZXF1aXJlczogWydjb21wdXRlU3R5bGVzJ11cbn07IiwgImltcG9ydCB7IGF1dG8gfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbn0iLCAiLy8gaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gJy4vaW5zdGFuY2VPZic7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVudXNlZC1pbXBvcnRzL25vLXVudXNlZC12YXJzXG5pbmNsdWRlU2NhbGUpIHtcbiAgaWYgKGluY2x1ZGVTY2FsZSA9PT0gdm9pZCAwKSB7XG4gICAgaW5jbHVkZVNjYWxlID0gZmFsc2U7XG4gIH1cblxuICB2YXIgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciBzY2FsZVggPSAxO1xuICB2YXIgc2NhbGVZID0gMTsgLy8gRklYTUU6XG4gIC8vIGBvZmZzZXRXaWR0aGAgcmV0dXJucyBhbiBpbnRlZ2VyIHdoaWxlIGBnZXRCb3VuZGluZ0NsaWVudFJlY3RgXG4gIC8vIHJldHVybnMgYSBmbG9hdC4gVGhpcyByZXN1bHRzIGluIGBzY2FsZVhgIG9yIGBzY2FsZVlgIGJlaW5nXG4gIC8vIG5vbi0xIHdoZW4gaXQgc2hvdWxkIGJlIGZvciBlbGVtZW50cyB0aGF0IGFyZW4ndCBhIGZ1bGwgcGl4ZWwgaW5cbiAgLy8gd2lkdGggb3IgaGVpZ2h0LlxuICAvLyBpZiAoaXNIVE1MRWxlbWVudChlbGVtZW50KSAmJiBpbmNsdWRlU2NhbGUpIHtcbiAgLy8gICBjb25zdCBvZmZzZXRIZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgLy8gICBjb25zdCBvZmZzZXRXaWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gIC8vICAgLy8gRG8gbm90IGF0dGVtcHQgdG8gZGl2aWRlIGJ5IDAsIG90aGVyd2lzZSB3ZSBnZXQgYEluZmluaXR5YCBhcyBzY2FsZVxuICAvLyAgIC8vIEZhbGxiYWNrIHRvIDEgaW4gY2FzZSBib3RoIHZhbHVlcyBhcmUgYDBgXG4gIC8vICAgaWYgKG9mZnNldFdpZHRoID4gMCkge1xuICAvLyAgICAgc2NhbGVYID0gcmVjdC53aWR0aCAvIG9mZnNldFdpZHRoIHx8IDE7XG4gIC8vICAgfVxuICAvLyAgIGlmIChvZmZzZXRIZWlnaHQgPiAwKSB7XG4gIC8vICAgICBzY2FsZVkgPSByZWN0LmhlaWdodCAvIG9mZnNldEhlaWdodCB8fCAxO1xuICAvLyAgIH1cbiAgLy8gfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHJlY3Qud2lkdGggLyBzY2FsZVgsXG4gICAgaGVpZ2h0OiByZWN0LmhlaWdodCAvIHNjYWxlWSxcbiAgICB0b3A6IHJlY3QudG9wIC8gc2NhbGVZLFxuICAgIHJpZ2h0OiByZWN0LnJpZ2h0IC8gc2NhbGVYLFxuICAgIGJvdHRvbTogcmVjdC5ib3R0b20gLyBzY2FsZVksXG4gICAgbGVmdDogcmVjdC5sZWZ0IC8gc2NhbGVYLFxuICAgIHg6IHJlY3QubGVmdCAvIHNjYWxlWCxcbiAgICB5OiByZWN0LnRvcCAvIHNjYWxlWVxuICB9O1xufSIsICJpbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiOyAvLyBSZXR1cm5zIHRoZSBsYXlvdXQgcmVjdCBvZiBhbiBlbGVtZW50IHJlbGF0aXZlIHRvIGl0cyBvZmZzZXRQYXJlbnQuIExheW91dFxuLy8gbWVhbnMgaXQgZG9lc24ndCB0YWtlIGludG8gYWNjb3VudCB0cmFuc2Zvcm1zLlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRMYXlvdXRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIGNsaWVudFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCk7IC8vIFVzZSB0aGUgY2xpZW50UmVjdCBzaXplcyBpZiBpdCdzIG5vdCBiZWVuIHRyYW5zZm9ybWVkLlxuICAvLyBGaXhlcyBodHRwczovL2dpdGh1Yi5jb20vcG9wcGVyanMvcG9wcGVyLWNvcmUvaXNzdWVzLzEyMjNcblxuICB2YXIgd2lkdGggPSBlbGVtZW50Lm9mZnNldFdpZHRoO1xuICB2YXIgaGVpZ2h0ID0gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG5cbiAgaWYgKE1hdGguYWJzKGNsaWVudFJlY3Qud2lkdGggLSB3aWR0aCkgPD0gMSkge1xuICAgIHdpZHRoID0gY2xpZW50UmVjdC53aWR0aDtcbiAgfVxuXG4gIGlmIChNYXRoLmFicyhjbGllbnRSZWN0LmhlaWdodCAtIGhlaWdodCkgPD0gMSkge1xuICAgIGhlaWdodCA9IGNsaWVudFJlY3QuaGVpZ2h0O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4OiBlbGVtZW50Lm9mZnNldExlZnQsXG4gICAgeTogZWxlbWVudC5vZmZzZXRUb3AsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH07XG59IiwgImltcG9ydCB7IGlzU2hhZG93Um9vdCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnRhaW5zKHBhcmVudCwgY2hpbGQpIHtcbiAgdmFyIHJvb3ROb2RlID0gY2hpbGQuZ2V0Um9vdE5vZGUgJiYgY2hpbGQuZ2V0Um9vdE5vZGUoKTsgLy8gRmlyc3QsIGF0dGVtcHQgd2l0aCBmYXN0ZXIgbmF0aXZlIG1ldGhvZFxuXG4gIGlmIChwYXJlbnQuY29udGFpbnMoY2hpbGQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gdGhlbiBmYWxsYmFjayB0byBjdXN0b20gaW1wbGVtZW50YXRpb24gd2l0aCBTaGFkb3cgRE9NIHN1cHBvcnRcbiAgZWxzZSBpZiAocm9vdE5vZGUgJiYgaXNTaGFkb3dSb290KHJvb3ROb2RlKSkge1xuICAgICAgdmFyIG5leHQgPSBjaGlsZDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAobmV4dCAmJiBwYXJlbnQuaXNTYW1lTm9kZShuZXh0KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXTogbmVlZCBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoaXMuLi5cblxuXG4gICAgICAgIG5leHQgPSBuZXh0LnBhcmVudE5vZGUgfHwgbmV4dC5ob3N0O1xuICAgICAgfSB3aGlsZSAobmV4dCk7XG4gICAgfSAvLyBHaXZlIHVwLCB0aGUgcmVzdWx0IGlzIGZhbHNlXG5cblxuICByZXR1cm4gZmFsc2U7XG59IiwgImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldFdpbmRvdyhlbGVtZW50KS5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xufSIsICJpbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzVGFibGVFbGVtZW50KGVsZW1lbnQpIHtcbiAgcmV0dXJuIFsndGFibGUnLCAndGQnLCAndGgnXS5pbmRleE9mKGdldE5vZGVOYW1lKGVsZW1lbnQpKSA+PSAwO1xufSIsICJpbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkge1xuICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBhc3N1bWUgYm9keSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gIHJldHVybiAoKGlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQub3duZXJEb2N1bWVudCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICBlbGVtZW50LmRvY3VtZW50KSB8fCB3aW5kb3cuZG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudDtcbn0iLCAiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IHsgaXNTaGFkb3dSb290IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0UGFyZW50Tm9kZShlbGVtZW50KSB7XG4gIGlmIChnZXROb2RlTmFtZShlbGVtZW50KSA9PT0gJ2h0bWwnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gKC8vIHRoaXMgaXMgYSBxdWlja2VyIChidXQgbGVzcyB0eXBlIHNhZmUpIHdheSB0byBzYXZlIHF1aXRlIHNvbWUgYnl0ZXMgZnJvbSB0aGUgYnVuZGxlXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXVxuICAgIC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgIGVsZW1lbnQuYXNzaWduZWRTbG90IHx8IC8vIHN0ZXAgaW50byB0aGUgc2hhZG93IERPTSBvZiB0aGUgcGFyZW50IG9mIGEgc2xvdHRlZCBub2RlXG4gICAgZWxlbWVudC5wYXJlbnROb2RlIHx8ICggLy8gRE9NIEVsZW1lbnQgZGV0ZWN0ZWRcbiAgICBpc1NoYWRvd1Jvb3QoZWxlbWVudCkgPyBlbGVtZW50Lmhvc3QgOiBudWxsKSB8fCAvLyBTaGFkb3dSb290IGRldGVjdGVkXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FsbF06IEhUTUxFbGVtZW50IGlzIGEgTm9kZVxuICAgIGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSAvLyBmYWxsYmFja1xuXG4gICk7XG59IiwgImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgaXNUYWJsZUVsZW1lbnQgZnJvbSBcIi4vaXNUYWJsZUVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcblxuZnVuY3Rpb24gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50KSB7XG4gIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAvLyBodHRwczovL2dpdGh1Yi5jb20vcG9wcGVyanMvcG9wcGVyLWNvcmUvaXNzdWVzLzgzN1xuICBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uID09PSAnZml4ZWQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudC5vZmZzZXRQYXJlbnQ7XG59IC8vIGAub2Zmc2V0UGFyZW50YCByZXBvcnRzIGBudWxsYCBmb3IgZml4ZWQgZWxlbWVudHMsIHdoaWxlIGFic29sdXRlIGVsZW1lbnRzXG4vLyByZXR1cm4gdGhlIGNvbnRhaW5pbmcgYmxvY2tcblxuXG5mdW5jdGlvbiBnZXRDb250YWluaW5nQmxvY2soZWxlbWVudCkge1xuICB2YXIgaXNGaXJlZm94ID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2ZpcmVmb3gnKSAhPT0gLTE7XG4gIHZhciBpc0lFID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdUcmlkZW50JykgIT09IC0xO1xuXG4gIGlmIChpc0lFICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAvLyBJbiBJRSA5LCAxMCBhbmQgMTEgZml4ZWQgZWxlbWVudHMgY29udGFpbmluZyBibG9jayBpcyBhbHdheXMgZXN0YWJsaXNoZWQgYnkgdGhlIHZpZXdwb3J0XG4gICAgdmFyIGVsZW1lbnRDc3MgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuXG4gICAgaWYgKGVsZW1lbnRDc3MucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjdXJyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7XG5cbiAgd2hpbGUgKGlzSFRNTEVsZW1lbnQoY3VycmVudE5vZGUpICYmIFsnaHRtbCcsICdib2R5J10uaW5kZXhPZihnZXROb2RlTmFtZShjdXJyZW50Tm9kZSkpIDwgMCkge1xuICAgIHZhciBjc3MgPSBnZXRDb21wdXRlZFN0eWxlKGN1cnJlbnROb2RlKTsgLy8gVGhpcyBpcyBub24tZXhoYXVzdGl2ZSBidXQgY292ZXJzIHRoZSBtb3N0IGNvbW1vbiBDU1MgcHJvcGVydGllcyB0aGF0XG4gICAgLy8gY3JlYXRlIGEgY29udGFpbmluZyBibG9jay5cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ29udGFpbmluZ19ibG9jayNpZGVudGlmeWluZ190aGVfY29udGFpbmluZ19ibG9ja1xuXG4gICAgaWYgKGNzcy50cmFuc2Zvcm0gIT09ICdub25lJyB8fCBjc3MucGVyc3BlY3RpdmUgIT09ICdub25lJyB8fCBjc3MuY29udGFpbiA9PT0gJ3BhaW50JyB8fCBbJ3RyYW5zZm9ybScsICdwZXJzcGVjdGl2ZSddLmluZGV4T2YoY3NzLndpbGxDaGFuZ2UpICE9PSAtMSB8fCBpc0ZpcmVmb3ggJiYgY3NzLndpbGxDaGFuZ2UgPT09ICdmaWx0ZXInIHx8IGlzRmlyZWZveCAmJiBjc3MuZmlsdGVyICYmIGNzcy5maWx0ZXIgIT09ICdub25lJykge1xuICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59IC8vIEdldHMgdGhlIGNsb3Nlc3QgYW5jZXN0b3IgcG9zaXRpb25lZCBlbGVtZW50LiBIYW5kbGVzIHNvbWUgZWRnZSBjYXNlcyxcbi8vIHN1Y2ggYXMgdGFibGUgYW5jZXN0b3JzIGFuZCBjcm9zcyBicm93c2VyIGJ1Z3MuXG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgdmFyIHdpbmRvdyA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgdmFyIG9mZnNldFBhcmVudCA9IGdldFRydWVPZmZzZXRQYXJlbnQoZWxlbWVudCk7XG5cbiAgd2hpbGUgKG9mZnNldFBhcmVudCAmJiBpc1RhYmxlRWxlbWVudChvZmZzZXRQYXJlbnQpICYmIGdldENvbXB1dGVkU3R5bGUob2Zmc2V0UGFyZW50KS5wb3NpdGlvbiA9PT0gJ3N0YXRpYycpIHtcbiAgICBvZmZzZXRQYXJlbnQgPSBnZXRUcnVlT2Zmc2V0UGFyZW50KG9mZnNldFBhcmVudCk7XG4gIH1cblxuICBpZiAob2Zmc2V0UGFyZW50ICYmIChnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpID09PSAnaHRtbCcgfHwgZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSA9PT0gJ2JvZHknICYmIGdldENvbXB1dGVkU3R5bGUob2Zmc2V0UGFyZW50KS5wb3NpdGlvbiA9PT0gJ3N0YXRpYycpKSB7XG4gICAgcmV0dXJuIHdpbmRvdztcbiAgfVxuXG4gIHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQpIHx8IHdpbmRvdztcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gWyd0b3AnLCAnYm90dG9tJ10uaW5kZXhPZihwbGFjZW1lbnQpID49IDAgPyAneCcgOiAneSc7XG59IiwgImV4cG9ydCB2YXIgbWF4ID0gTWF0aC5tYXg7XG5leHBvcnQgdmFyIG1pbiA9IE1hdGgubWluO1xuZXhwb3J0IHZhciByb3VuZCA9IE1hdGgucm91bmQ7IiwgImltcG9ydCB7IG1heCBhcyBtYXRoTWF4LCBtaW4gYXMgbWF0aE1pbiB9IGZyb20gXCIuL21hdGguanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdpdGhpbihtaW4sIHZhbHVlLCBtYXgpIHtcbiAgcmV0dXJuIG1hdGhNYXgobWluLCBtYXRoTWluKHZhbHVlLCBtYXgpKTtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RnJlc2hTaWRlT2JqZWN0KCkge1xuICByZXR1cm4ge1xuICAgIHRvcDogMCxcbiAgICByaWdodDogMCxcbiAgICBib3R0b206IDAsXG4gICAgbGVmdDogMFxuICB9O1xufSIsICJpbXBvcnQgZ2V0RnJlc2hTaWRlT2JqZWN0IGZyb20gXCIuL2dldEZyZXNoU2lkZU9iamVjdC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VQYWRkaW5nT2JqZWN0KHBhZGRpbmdPYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGdldEZyZXNoU2lkZU9iamVjdCgpLCBwYWRkaW5nT2JqZWN0KTtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXhwYW5kVG9IYXNoTWFwKHZhbHVlLCBrZXlzKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZShmdW5jdGlvbiAoaGFzaE1hcCwga2V5KSB7XG4gICAgaGFzaE1hcFtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIGhhc2hNYXA7XG4gIH0sIHt9KTtcbn0iLCAiaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRMYXlvdXRSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qc1wiO1xuaW1wb3J0IGNvbnRhaW5zIGZyb20gXCIuLi9kb20tdXRpbHMvY29udGFpbnMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHdpdGhpbiBmcm9tIFwiLi4vdXRpbHMvd2l0aGluLmpzXCI7XG5pbXBvcnQgbWVyZ2VQYWRkaW5nT2JqZWN0IGZyb20gXCIuLi91dGlscy9tZXJnZVBhZGRpbmdPYmplY3QuanNcIjtcbmltcG9ydCBleHBhbmRUb0hhc2hNYXAgZnJvbSBcIi4uL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qc1wiO1xuaW1wb3J0IHsgbGVmdCwgcmlnaHQsIGJhc2VQbGFjZW1lbnRzLCB0b3AsIGJvdHRvbSB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciB0b1BhZGRpbmdPYmplY3QgPSBmdW5jdGlvbiB0b1BhZGRpbmdPYmplY3QocGFkZGluZywgc3RhdGUpIHtcbiAgcGFkZGluZyA9IHR5cGVvZiBwYWRkaW5nID09PSAnZnVuY3Rpb24nID8gcGFkZGluZyhPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZWN0cywge1xuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pKSA6IHBhZGRpbmc7XG4gIHJldHVybiBtZXJnZVBhZGRpbmdPYmplY3QodHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gcGFkZGluZyA6IGV4cGFuZFRvSGFzaE1hcChwYWRkaW5nLCBiYXNlUGxhY2VtZW50cykpO1xufTtcblxuZnVuY3Rpb24gYXJyb3coX3JlZikge1xuICB2YXIgX3N0YXRlJG1vZGlmaWVyc0RhdGEkO1xuXG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucztcbiAgdmFyIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93O1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cztcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciBheGlzID0gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpO1xuICB2YXIgaXNWZXJ0aWNhbCA9IFtsZWZ0LCByaWdodF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwO1xuICB2YXIgbGVuID0gaXNWZXJ0aWNhbCA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICBpZiAoIWFycm93RWxlbWVudCB8fCAhcG9wcGVyT2Zmc2V0cykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwYWRkaW5nT2JqZWN0ID0gdG9QYWRkaW5nT2JqZWN0KG9wdGlvbnMucGFkZGluZywgc3RhdGUpO1xuICB2YXIgYXJyb3dSZWN0ID0gZ2V0TGF5b3V0UmVjdChhcnJvd0VsZW1lbnQpO1xuICB2YXIgbWluUHJvcCA9IGF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gIHZhciBtYXhQcm9wID0gYXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gIHZhciBlbmREaWZmID0gc3RhdGUucmVjdHMucmVmZXJlbmNlW2xlbl0gKyBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbYXhpc10gLSBwb3BwZXJPZmZzZXRzW2F4aXNdIC0gc3RhdGUucmVjdHMucG9wcGVyW2xlbl07XG4gIHZhciBzdGFydERpZmYgPSBwb3BwZXJPZmZzZXRzW2F4aXNdIC0gc3RhdGUucmVjdHMucmVmZXJlbmNlW2F4aXNdO1xuICB2YXIgYXJyb3dPZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQoYXJyb3dFbGVtZW50KTtcbiAgdmFyIGNsaWVudFNpemUgPSBhcnJvd09mZnNldFBhcmVudCA/IGF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudEhlaWdodCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50V2lkdGggfHwgMCA6IDA7XG4gIHZhciBjZW50ZXJUb1JlZmVyZW5jZSA9IGVuZERpZmYgLyAyIC0gc3RhcnREaWZmIC8gMjsgLy8gTWFrZSBzdXJlIHRoZSBhcnJvdyBkb2Vzbid0IG92ZXJmbG93IHRoZSBwb3BwZXIgaWYgdGhlIGNlbnRlciBwb2ludCBpc1xuICAvLyBvdXRzaWRlIG9mIHRoZSBwb3BwZXIgYm91bmRzXG5cbiAgdmFyIG1pbiA9IHBhZGRpbmdPYmplY3RbbWluUHJvcF07XG4gIHZhciBtYXggPSBjbGllbnRTaXplIC0gYXJyb3dSZWN0W2xlbl0gLSBwYWRkaW5nT2JqZWN0W21heFByb3BdO1xuICB2YXIgY2VudGVyID0gY2xpZW50U2l6ZSAvIDIgLSBhcnJvd1JlY3RbbGVuXSAvIDIgKyBjZW50ZXJUb1JlZmVyZW5jZTtcbiAgdmFyIG9mZnNldCA9IHdpdGhpbihtaW4sIGNlbnRlciwgbWF4KTsgLy8gUHJldmVudHMgYnJlYWtpbmcgc3ludGF4IGhpZ2hsaWdodGluZy4uLlxuXG4gIHZhciBheGlzUHJvcCA9IGF4aXM7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSAoX3N0YXRlJG1vZGlmaWVyc0RhdGEkID0ge30sIF9zdGF0ZSRtb2RpZmllcnNEYXRhJFtheGlzUHJvcF0gPSBvZmZzZXQsIF9zdGF0ZSRtb2RpZmllcnNEYXRhJC5jZW50ZXJPZmZzZXQgPSBvZmZzZXQgLSBjZW50ZXIsIF9zdGF0ZSRtb2RpZmllcnNEYXRhJCk7XG59XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmMi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkZWxlbWVudCA9IG9wdGlvbnMuZWxlbWVudCxcbiAgICAgIGFycm93RWxlbWVudCA9IF9vcHRpb25zJGVsZW1lbnQgPT09IHZvaWQgMCA/ICdbZGF0YS1wb3BwZXItYXJyb3ddJyA6IF9vcHRpb25zJGVsZW1lbnQ7XG5cbiAgaWYgKGFycm93RWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIENTUyBzZWxlY3RvclxuXG5cbiAgaWYgKHR5cGVvZiBhcnJvd0VsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMucG9wcGVyLnF1ZXJ5U2VsZWN0b3IoYXJyb3dFbGVtZW50KTtcblxuICAgIGlmICghYXJyb3dFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmICghaXNIVE1MRWxlbWVudChhcnJvd0VsZW1lbnQpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFsnUG9wcGVyOiBcImFycm93XCIgZWxlbWVudCBtdXN0IGJlIGFuIEhUTUxFbGVtZW50IChub3QgYW4gU1ZHRWxlbWVudCkuJywgJ1RvIHVzZSBhbiBTVkcgYXJyb3csIHdyYXAgaXQgaW4gYW4gSFRNTEVsZW1lbnQgdGhhdCB3aWxsIGJlIHVzZWQgYXMnLCAndGhlIGFycm93LiddLmpvaW4oJyAnKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb250YWlucyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIsIGFycm93RWxlbWVudCkpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFsnUG9wcGVyOiBcImFycm93XCIgbW9kaWZpZXJcXCdzIGBlbGVtZW50YCBtdXN0IGJlIGEgY2hpbGQgb2YgdGhlIHBvcHBlcicsICdlbGVtZW50LiddLmpvaW4oJyAnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3RhdGUuZWxlbWVudHMuYXJyb3cgPSBhcnJvd0VsZW1lbnQ7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdhcnJvdycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBhcnJvdyxcbiAgZWZmZWN0OiBlZmZlY3QsXG4gIHJlcXVpcmVzOiBbJ3BvcHBlck9mZnNldHMnXSxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydwcmV2ZW50T3ZlcmZsb3cnXVxufTsiLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMV07XG59IiwgImltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgZW5kIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuLi91dGlscy9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG52YXIgdW5zZXRTaWRlcyA9IHtcbiAgdG9wOiAnYXV0bycsXG4gIHJpZ2h0OiAnYXV0bycsXG4gIGJvdHRvbTogJ2F1dG8nLFxuICBsZWZ0OiAnYXV0bydcbn07IC8vIFJvdW5kIHRoZSBvZmZzZXRzIHRvIHRoZSBuZWFyZXN0IHN1aXRhYmxlIHN1YnBpeGVsIGJhc2VkIG9uIHRoZSBEUFIuXG4vLyBab29taW5nIGNhbiBjaGFuZ2UgdGhlIERQUiwgYnV0IGl0IHNlZW1zIHRvIHJlcG9ydCBhIHZhbHVlIHRoYXQgd2lsbFxuLy8gY2xlYW5seSBkaXZpZGUgdGhlIHZhbHVlcyBpbnRvIHRoZSBhcHByb3ByaWF0ZSBzdWJwaXhlbHMuXG5cbmZ1bmN0aW9uIHJvdW5kT2Zmc2V0c0J5RFBSKF9yZWYpIHtcbiAgdmFyIHggPSBfcmVmLngsXG4gICAgICB5ID0gX3JlZi55O1xuICB2YXIgd2luID0gd2luZG93O1xuICB2YXIgZHByID0gd2luLmRldmljZVBpeGVsUmF0aW8gfHwgMTtcbiAgcmV0dXJuIHtcbiAgICB4OiByb3VuZChyb3VuZCh4ICogZHByKSAvIGRwcikgfHwgMCxcbiAgICB5OiByb3VuZChyb3VuZCh5ICogZHByKSAvIGRwcikgfHwgMFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9TdHlsZXMoX3JlZjIpIHtcbiAgdmFyIF9PYmplY3QkYXNzaWduMjtcblxuICB2YXIgcG9wcGVyID0gX3JlZjIucG9wcGVyLFxuICAgICAgcG9wcGVyUmVjdCA9IF9yZWYyLnBvcHBlclJlY3QsXG4gICAgICBwbGFjZW1lbnQgPSBfcmVmMi5wbGFjZW1lbnQsXG4gICAgICB2YXJpYXRpb24gPSBfcmVmMi52YXJpYXRpb24sXG4gICAgICBvZmZzZXRzID0gX3JlZjIub2Zmc2V0cyxcbiAgICAgIHBvc2l0aW9uID0gX3JlZjIucG9zaXRpb24sXG4gICAgICBncHVBY2NlbGVyYXRpb24gPSBfcmVmMi5ncHVBY2NlbGVyYXRpb24sXG4gICAgICBhZGFwdGl2ZSA9IF9yZWYyLmFkYXB0aXZlLFxuICAgICAgcm91bmRPZmZzZXRzID0gX3JlZjIucm91bmRPZmZzZXRzO1xuXG4gIHZhciBfcmVmMyA9IHJvdW5kT2Zmc2V0cyA9PT0gdHJ1ZSA/IHJvdW5kT2Zmc2V0c0J5RFBSKG9mZnNldHMpIDogdHlwZW9mIHJvdW5kT2Zmc2V0cyA9PT0gJ2Z1bmN0aW9uJyA/IHJvdW5kT2Zmc2V0cyhvZmZzZXRzKSA6IG9mZnNldHMsXG4gICAgICBfcmVmMyR4ID0gX3JlZjMueCxcbiAgICAgIHggPSBfcmVmMyR4ID09PSB2b2lkIDAgPyAwIDogX3JlZjMkeCxcbiAgICAgIF9yZWYzJHkgPSBfcmVmMy55LFxuICAgICAgeSA9IF9yZWYzJHkgPT09IHZvaWQgMCA/IDAgOiBfcmVmMyR5O1xuXG4gIHZhciBoYXNYID0gb2Zmc2V0cy5oYXNPd25Qcm9wZXJ0eSgneCcpO1xuICB2YXIgaGFzWSA9IG9mZnNldHMuaGFzT3duUHJvcGVydHkoJ3knKTtcbiAgdmFyIHNpZGVYID0gbGVmdDtcbiAgdmFyIHNpZGVZID0gdG9wO1xuICB2YXIgd2luID0gd2luZG93O1xuXG4gIGlmIChhZGFwdGl2ZSkge1xuICAgIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQocG9wcGVyKTtcbiAgICB2YXIgaGVpZ2h0UHJvcCA9ICdjbGllbnRIZWlnaHQnO1xuICAgIHZhciB3aWR0aFByb3AgPSAnY2xpZW50V2lkdGgnO1xuXG4gICAgaWYgKG9mZnNldFBhcmVudCA9PT0gZ2V0V2luZG93KHBvcHBlcikpIHtcbiAgICAgIG9mZnNldFBhcmVudCA9IGdldERvY3VtZW50RWxlbWVudChwb3BwZXIpO1xuXG4gICAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uICE9PSAnc3RhdGljJyAmJiBwb3NpdGlvbiA9PT0gJ2Fic29sdXRlJykge1xuICAgICAgICBoZWlnaHRQcm9wID0gJ3Njcm9sbEhlaWdodCc7XG4gICAgICAgIHdpZHRoUHJvcCA9ICdzY3JvbGxXaWR0aCc7XG4gICAgICB9XG4gICAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYXN0XTogZm9yY2UgdHlwZSByZWZpbmVtZW50LCB3ZSBjb21wYXJlIG9mZnNldFBhcmVudCB3aXRoIHdpbmRvdyBhYm92ZSwgYnV0IEZsb3cgZG9lc24ndCBkZXRlY3QgaXRcblxuXG4gICAgb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50O1xuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gdG9wIHx8IChwbGFjZW1lbnQgPT09IGxlZnQgfHwgcGxhY2VtZW50ID09PSByaWdodCkgJiYgdmFyaWF0aW9uID09PSBlbmQpIHtcbiAgICAgIHNpZGVZID0gYm90dG9tOyAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cblxuICAgICAgeSAtPSBvZmZzZXRQYXJlbnRbaGVpZ2h0UHJvcF0gLSBwb3BwZXJSZWN0LmhlaWdodDtcbiAgICAgIHkgKj0gZ3B1QWNjZWxlcmF0aW9uID8gMSA6IC0xO1xuICAgIH1cblxuICAgIGlmIChwbGFjZW1lbnQgPT09IGxlZnQgfHwgKHBsYWNlbWVudCA9PT0gdG9wIHx8IHBsYWNlbWVudCA9PT0gYm90dG9tKSAmJiB2YXJpYXRpb24gPT09IGVuZCkge1xuICAgICAgc2lkZVggPSByaWdodDsgLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG5cbiAgICAgIHggLT0gb2Zmc2V0UGFyZW50W3dpZHRoUHJvcF0gLSBwb3BwZXJSZWN0LndpZHRoO1xuICAgICAgeCAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbW1vblN0eWxlcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHBvc2l0aW9uOiBwb3NpdGlvblxuICB9LCBhZGFwdGl2ZSAmJiB1bnNldFNpZGVzKTtcblxuICBpZiAoZ3B1QWNjZWxlcmF0aW9uKSB7XG4gICAgdmFyIF9PYmplY3QkYXNzaWduO1xuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywgKF9PYmplY3QkYXNzaWduID0ge30sIF9PYmplY3QkYXNzaWduW3NpZGVZXSA9IGhhc1kgPyAnMCcgOiAnJywgX09iamVjdCRhc3NpZ25bc2lkZVhdID0gaGFzWCA/ICcwJyA6ICcnLCBfT2JqZWN0JGFzc2lnbi50cmFuc2Zvcm0gPSAod2luLmRldmljZVBpeGVsUmF0aW8gfHwgMSkgPD0gMSA/IFwidHJhbnNsYXRlKFwiICsgeCArIFwicHgsIFwiICsgeSArIFwicHgpXCIgOiBcInRyYW5zbGF0ZTNkKFwiICsgeCArIFwicHgsIFwiICsgeSArIFwicHgsIDApXCIsIF9PYmplY3QkYXNzaWduKSk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCAoX09iamVjdCRhc3NpZ24yID0ge30sIF9PYmplY3QkYXNzaWduMltzaWRlWV0gPSBoYXNZID8geSArIFwicHhcIiA6ICcnLCBfT2JqZWN0JGFzc2lnbjJbc2lkZVhdID0gaGFzWCA/IHggKyBcInB4XCIgOiAnJywgX09iamVjdCRhc3NpZ24yLnRyYW5zZm9ybSA9ICcnLCBfT2JqZWN0JGFzc2lnbjIpKTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVN0eWxlcyhfcmVmNCkge1xuICB2YXIgc3RhdGUgPSBfcmVmNC5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmNC5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkZ3B1QWNjZWxlcmF0ID0gb3B0aW9ucy5ncHVBY2NlbGVyYXRpb24sXG4gICAgICBncHVBY2NlbGVyYXRpb24gPSBfb3B0aW9ucyRncHVBY2NlbGVyYXQgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRncHVBY2NlbGVyYXQsXG4gICAgICBfb3B0aW9ucyRhZGFwdGl2ZSA9IG9wdGlvbnMuYWRhcHRpdmUsXG4gICAgICBhZGFwdGl2ZSA9IF9vcHRpb25zJGFkYXB0aXZlID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkYWRhcHRpdmUsXG4gICAgICBfb3B0aW9ucyRyb3VuZE9mZnNldHMgPSBvcHRpb25zLnJvdW5kT2Zmc2V0cyxcbiAgICAgIHJvdW5kT2Zmc2V0cyA9IF9vcHRpb25zJHJvdW5kT2Zmc2V0cyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHJvdW5kT2Zmc2V0cztcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgdmFyIHRyYW5zaXRpb25Qcm9wZXJ0eSA9IGdldENvbXB1dGVkU3R5bGUoc3RhdGUuZWxlbWVudHMucG9wcGVyKS50cmFuc2l0aW9uUHJvcGVydHkgfHwgJyc7XG5cbiAgICBpZiAoYWRhcHRpdmUgJiYgWyd0cmFuc2Zvcm0nLCAndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0J10uc29tZShmdW5jdGlvbiAocHJvcGVydHkpIHtcbiAgICAgIHJldHVybiB0cmFuc2l0aW9uUHJvcGVydHkuaW5kZXhPZihwcm9wZXJ0eSkgPj0gMDtcbiAgICB9KSkge1xuICAgICAgY29uc29sZS53YXJuKFsnUG9wcGVyOiBEZXRlY3RlZCBDU1MgdHJhbnNpdGlvbnMgb24gYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcnLCAnQ1NTIHByb3BlcnRpZXM6IFwidHJhbnNmb3JtXCIsIFwidG9wXCIsIFwicmlnaHRcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCIuJywgJ1xcblxcbicsICdEaXNhYmxlIHRoZSBcImNvbXB1dGVTdHlsZXNcIiBtb2RpZmllclxcJ3MgYGFkYXB0aXZlYCBvcHRpb24gdG8gYWxsb3cnLCAnZm9yIHNtb290aCB0cmFuc2l0aW9ucywgb3IgcmVtb3ZlIHRoZXNlIHByb3BlcnRpZXMgZnJvbSB0aGUgQ1NTJywgJ3RyYW5zaXRpb24gZGVjbGFyYXRpb24gb24gdGhlIHBvcHBlciBlbGVtZW50IGlmIG9ubHkgdHJhbnNpdGlvbmluZycsICdvcGFjaXR5IG9yIGJhY2tncm91bmQtY29sb3IgZm9yIGV4YW1wbGUuJywgJ1xcblxcbicsICdXZSByZWNvbW1lbmQgdXNpbmcgdGhlIHBvcHBlciBlbGVtZW50IGFzIGEgd3JhcHBlciBhcm91bmQgYW4gaW5uZXInLCAnZWxlbWVudCB0aGF0IGNhbiBoYXZlIGFueSBDU1MgcHJvcGVydHkgdHJhbnNpdGlvbmVkIGZvciBhbmltYXRpb25zLiddLmpvaW4oJyAnKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbW1vblN0eWxlcyA9IHtcbiAgICBwbGFjZW1lbnQ6IGdldEJhc2VQbGFjZW1lbnQoc3RhdGUucGxhY2VtZW50KSxcbiAgICB2YXJpYXRpb246IGdldFZhcmlhdGlvbihzdGF0ZS5wbGFjZW1lbnQpLFxuICAgIHBvcHBlcjogc3RhdGUuZWxlbWVudHMucG9wcGVyLFxuICAgIHBvcHBlclJlY3Q6IHN0YXRlLnJlY3RzLnBvcHBlcixcbiAgICBncHVBY2NlbGVyYXRpb246IGdwdUFjY2VsZXJhdGlvblxuICB9O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zdHlsZXMucG9wcGVyLCBtYXBUb1N0eWxlcyhPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIHtcbiAgICAgIG9mZnNldHM6IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyxcbiAgICAgIHBvc2l0aW9uOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgYWRhcHRpdmU6IGFkYXB0aXZlLFxuICAgICAgcm91bmRPZmZzZXRzOiByb3VuZE9mZnNldHNcbiAgICB9KSkpO1xuICB9XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEuYXJyb3cgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5hcnJvdyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnN0eWxlcy5hcnJvdywgbWFwVG9TdHlsZXMoT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCB7XG4gICAgICBvZmZzZXRzOiBzdGF0ZS5tb2RpZmllcnNEYXRhLmFycm93LFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBhZGFwdGl2ZTogZmFsc2UsXG4gICAgICByb3VuZE9mZnNldHM6IHJvdW5kT2Zmc2V0c1xuICAgIH0pKSk7XG4gIH1cblxuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyLCB7XG4gICAgJ2RhdGEtcG9wcGVyLXBsYWNlbWVudCc6IHN0YXRlLnBsYWNlbWVudFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2NvbXB1dGVTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ2JlZm9yZVdyaXRlJyxcbiAgZm46IGNvbXB1dGVTdHlsZXMsXG4gIGRhdGE6IHt9XG59OyIsICJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0V2luZG93LmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHBhc3NpdmUgPSB7XG4gIHBhc3NpdmU6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2UsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkc2Nyb2xsID0gb3B0aW9ucy5zY3JvbGwsXG4gICAgICBzY3JvbGwgPSBfb3B0aW9ucyRzY3JvbGwgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRzY3JvbGwsXG4gICAgICBfb3B0aW9ucyRyZXNpemUgPSBvcHRpb25zLnJlc2l6ZSxcbiAgICAgIHJlc2l6ZSA9IF9vcHRpb25zJHJlc2l6ZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHJlc2l6ZTtcbiAgdmFyIHdpbmRvdyA9IGdldFdpbmRvdyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIpO1xuICB2YXIgc2Nyb2xsUGFyZW50cyA9IFtdLmNvbmNhdChzdGF0ZS5zY3JvbGxQYXJlbnRzLnJlZmVyZW5jZSwgc3RhdGUuc2Nyb2xsUGFyZW50cy5wb3BwZXIpO1xuXG4gIGlmIChzY3JvbGwpIHtcbiAgICBzY3JvbGxQYXJlbnRzLmZvckVhY2goZnVuY3Rpb24gKHNjcm9sbFBhcmVudCkge1xuICAgICAgc2Nyb2xsUGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAocmVzaXplKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmIChzY3JvbGwpIHtcbiAgICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICAgIHNjcm9sbFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc2l6ZSkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfVxuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnZXZlbnRMaXN0ZW5lcnMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGZ1bmN0aW9uIGZuKCkge30sXG4gIGVmZmVjdDogZWZmZWN0LFxuICBkYXRhOiB7fVxufTsiLCAidmFyIGhhc2ggPSB7XG4gIGxlZnQ6ICdyaWdodCcsXG4gIHJpZ2h0OiAnbGVmdCcsXG4gIGJvdHRvbTogJ3RvcCcsXG4gIHRvcDogJ2JvdHRvbSdcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZywgZnVuY3Rpb24gKG1hdGNoZWQpIHtcbiAgICByZXR1cm4gaGFzaFttYXRjaGVkXTtcbiAgfSk7XG59IiwgInZhciBoYXNoID0ge1xuICBzdGFydDogJ2VuZCcsXG4gIGVuZDogJ3N0YXJ0J1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL3N0YXJ0fGVuZC9nLCBmdW5jdGlvbiAobWF0Y2hlZCkge1xuICAgIHJldHVybiBoYXNoW21hdGNoZWRdO1xuICB9KTtcbn0iLCAiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbChub2RlKSB7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3cobm9kZSk7XG4gIHZhciBzY3JvbGxMZWZ0ID0gd2luLnBhZ2VYT2Zmc2V0O1xuICB2YXIgc2Nyb2xsVG9wID0gd2luLnBhZ2VZT2Zmc2V0O1xuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IHNjcm9sbExlZnQsXG4gICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3BcbiAgfTtcbn0iLCAiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KSB7XG4gIC8vIElmIDxodG1sPiBoYXMgYSBDU1Mgd2lkdGggZ3JlYXRlciB0aGFuIHRoZSB2aWV3cG9ydCwgdGhlbiB0aGlzIHdpbGwgYmVcbiAgLy8gaW5jb3JyZWN0IGZvciBSVEwuXG4gIC8vIFBvcHBlciAxIGlzIGJyb2tlbiBpbiB0aGlzIGNhc2UgYW5kIG5ldmVyIGhhZCBhIGJ1ZyByZXBvcnQgc28gbGV0J3MgYXNzdW1lXG4gIC8vIGl0J3Mgbm90IGFuIGlzc3VlLiBJIGRvbid0IHRoaW5rIGFueW9uZSBldmVyIHNwZWNpZmllcyB3aWR0aCBvbiA8aHRtbD5cbiAgLy8gYW55d2F5LlxuICAvLyBCcm93c2VycyB3aGVyZSB0aGUgbGVmdCBzY3JvbGxiYXIgZG9lc24ndCBjYXVzZSBhbiBpc3N1ZSByZXBvcnQgYDBgIGZvclxuICAvLyB0aGlzIChlLmcuIEVkZ2UgMjAxOSwgSUUxMSwgU2FmYXJpKVxuICByZXR1cm4gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkubGVmdCArIGdldFdpbmRvd1Njcm9sbChlbGVtZW50KS5zY3JvbGxMZWZ0O1xufSIsICJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFZpZXdwb3J0UmVjdChlbGVtZW50KSB7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3coZWxlbWVudCk7XG4gIHZhciBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICB2YXIgdmlzdWFsVmlld3BvcnQgPSB3aW4udmlzdWFsVmlld3BvcnQ7XG4gIHZhciB3aWR0aCA9IGh0bWwuY2xpZW50V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBodG1sLmNsaWVudEhlaWdodDtcbiAgdmFyIHggPSAwO1xuICB2YXIgeSA9IDA7IC8vIE5COiBUaGlzIGlzbid0IHN1cHBvcnRlZCBvbiBpT1MgPD0gMTIuIElmIHRoZSBrZXlib2FyZCBpcyBvcGVuLCB0aGUgcG9wcGVyXG4gIC8vIGNhbiBiZSBvYnNjdXJlZCB1bmRlcm5lYXRoIGl0LlxuICAvLyBBbHNvLCBgaHRtbC5jbGllbnRIZWlnaHRgIGFkZHMgdGhlIGJvdHRvbSBiYXIgaGVpZ2h0IGluIFNhZmFyaSBpT1MsIGV2ZW5cbiAgLy8gaWYgaXQgaXNuJ3Qgb3Blbiwgc28gaWYgdGhpcyBpc24ndCBhdmFpbGFibGUsIHRoZSBwb3BwZXIgd2lsbCBiZSBkZXRlY3RlZFxuICAvLyB0byBvdmVyZmxvdyB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4gdG9vIGVhcmx5LlxuXG4gIGlmICh2aXN1YWxWaWV3cG9ydCkge1xuICAgIHdpZHRoID0gdmlzdWFsVmlld3BvcnQud2lkdGg7XG4gICAgaGVpZ2h0ID0gdmlzdWFsVmlld3BvcnQuaGVpZ2h0OyAvLyBVc2VzIExheW91dCBWaWV3cG9ydCAobGlrZSBDaHJvbWU7IFNhZmFyaSBkb2VzIG5vdCBjdXJyZW50bHkpXG4gICAgLy8gSW4gQ2hyb21lLCBpdCByZXR1cm5zIGEgdmFsdWUgdmVyeSBjbG9zZSB0byAwICgrLy0pIGJ1dCBjb250YWlucyByb3VuZGluZ1xuICAgIC8vIGVycm9ycyBkdWUgdG8gZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgc28gd2UgbmVlZCB0byBjaGVjayBwcmVjaXNpb24uXG4gICAgLy8gU2FmYXJpIHJldHVybnMgYSBudW1iZXIgPD0gMCwgdXN1YWxseSA8IC0xIHdoZW4gcGluY2gtem9vbWVkXG4gICAgLy8gRmVhdHVyZSBkZXRlY3Rpb24gZmFpbHMgaW4gbW9iaWxlIGVtdWxhdGlvbiBtb2RlIGluIENocm9tZS5cbiAgICAvLyBNYXRoLmFicyh3aW4uaW5uZXJXaWR0aCAvIHZpc3VhbFZpZXdwb3J0LnNjYWxlIC0gdmlzdWFsVmlld3BvcnQud2lkdGgpIDxcbiAgICAvLyAwLjAwMVxuICAgIC8vIEZhbGxiYWNrIGhlcmU6IFwiTm90IFNhZmFyaVwiIHVzZXJBZ2VudFxuXG4gICAgaWYgKCEvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG4gICAgICB4ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdDtcbiAgICAgIHkgPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3A7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgeDogeCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCksXG4gICAgeTogeVxuICB9O1xufSIsICJpbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbEJhclggZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsQmFyWC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGwuanNcIjtcbmltcG9ydCB7IG1heCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7IC8vIEdldHMgdGhlIGVudGlyZSBzaXplIG9mIHRoZSBzY3JvbGxhYmxlIGRvY3VtZW50IGFyZWEsIGV2ZW4gZXh0ZW5kaW5nIG91dHNpZGVcbi8vIG9mIHRoZSBgPGh0bWw+YCBhbmQgYDxib2R5PmAgcmVjdCBib3VuZHMgaWYgaG9yaXpvbnRhbGx5IHNjcm9sbGFibGVcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RG9jdW1lbnRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIF9lbGVtZW50JG93bmVyRG9jdW1lbjtcblxuICB2YXIgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgdmFyIHdpblNjcm9sbCA9IGdldFdpbmRvd1Njcm9sbChlbGVtZW50KTtcbiAgdmFyIGJvZHkgPSAoX2VsZW1lbnQkb3duZXJEb2N1bWVuID0gZWxlbWVudC5vd25lckRvY3VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2VsZW1lbnQkb3duZXJEb2N1bWVuLmJvZHk7XG4gIHZhciB3aWR0aCA9IG1heChodG1sLnNjcm9sbFdpZHRoLCBodG1sLmNsaWVudFdpZHRoLCBib2R5ID8gYm9keS5zY3JvbGxXaWR0aCA6IDAsIGJvZHkgPyBib2R5LmNsaWVudFdpZHRoIDogMCk7XG4gIHZhciBoZWlnaHQgPSBtYXgoaHRtbC5zY3JvbGxIZWlnaHQsIGh0bWwuY2xpZW50SGVpZ2h0LCBib2R5ID8gYm9keS5zY3JvbGxIZWlnaHQgOiAwLCBib2R5ID8gYm9keS5jbGllbnRIZWlnaHQgOiAwKTtcbiAgdmFyIHggPSAtd2luU2Nyb2xsLnNjcm9sbExlZnQgKyBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpO1xuICB2YXIgeSA9IC13aW5TY3JvbGwuc2Nyb2xsVG9wO1xuXG4gIGlmIChnZXRDb21wdXRlZFN0eWxlKGJvZHkgfHwgaHRtbCkuZGlyZWN0aW9uID09PSAncnRsJykge1xuICAgIHggKz0gbWF4KGh0bWwuY2xpZW50V2lkdGgsIGJvZHkgPyBib2R5LmNsaWVudFdpZHRoIDogMCkgLSB3aWR0aDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xufSIsICJpbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1Njcm9sbFBhcmVudChlbGVtZW50KSB7XG4gIC8vIEZpcmVmb3ggd2FudHMgdXMgdG8gY2hlY2sgYC14YCBhbmQgYC15YCB2YXJpYXRpb25zIGFzIHdlbGxcbiAgdmFyIF9nZXRDb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KSxcbiAgICAgIG92ZXJmbG93ID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3csXG4gICAgICBvdmVyZmxvd1ggPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvd1gsXG4gICAgICBvdmVyZmxvd1kgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvd1k7XG5cbiAgcmV0dXJuIC9hdXRvfHNjcm9sbHxvdmVybGF5fGhpZGRlbi8udGVzdChvdmVyZmxvdyArIG92ZXJmbG93WSArIG92ZXJmbG93WCk7XG59IiwgImltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0U2Nyb2xsUGFyZW50KG5vZGUpIHtcbiAgaWYgKFsnaHRtbCcsICdib2R5JywgJyNkb2N1bWVudCddLmluZGV4T2YoZ2V0Tm9kZU5hbWUobm9kZSkpID49IDApIHtcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBhc3N1bWUgYm9keSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gICAgcmV0dXJuIG5vZGUub3duZXJEb2N1bWVudC5ib2R5O1xuICB9XG5cbiAgaWYgKGlzSFRNTEVsZW1lbnQobm9kZSkgJiYgaXNTY3JvbGxQYXJlbnQobm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHJldHVybiBnZXRTY3JvbGxQYXJlbnQoZ2V0UGFyZW50Tm9kZShub2RlKSk7XG59IiwgImltcG9ydCBnZXRTY3JvbGxQYXJlbnQgZnJvbSBcIi4vZ2V0U2Nyb2xsUGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gXCIuL2lzU2Nyb2xsUGFyZW50LmpzXCI7XG4vKlxuZ2l2ZW4gYSBET00gZWxlbWVudCwgcmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBzY3JvbGwgcGFyZW50cywgdXAgdGhlIGxpc3Qgb2YgYW5jZXNvcnNcbnVudGlsIHdlIGdldCB0byB0aGUgdG9wIHdpbmRvdyBvYmplY3QuIFRoaXMgbGlzdCBpcyB3aGF0IHdlIGF0dGFjaCBzY3JvbGwgbGlzdGVuZXJzXG50bywgYmVjYXVzZSBpZiBhbnkgb2YgdGhlc2UgcGFyZW50IGVsZW1lbnRzIHNjcm9sbCwgd2UnbGwgbmVlZCB0byByZS1jYWxjdWxhdGUgdGhlXG5yZWZlcmVuY2UgZWxlbWVudCdzIHBvc2l0aW9uLlxuKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGlzdFNjcm9sbFBhcmVudHMoZWxlbWVudCwgbGlzdCkge1xuICB2YXIgX2VsZW1lbnQkb3duZXJEb2N1bWVuO1xuXG4gIGlmIChsaXN0ID09PSB2b2lkIDApIHtcbiAgICBsaXN0ID0gW107XG4gIH1cblxuICB2YXIgc2Nyb2xsUGFyZW50ID0gZ2V0U2Nyb2xsUGFyZW50KGVsZW1lbnQpO1xuICB2YXIgaXNCb2R5ID0gc2Nyb2xsUGFyZW50ID09PSAoKF9lbGVtZW50JG93bmVyRG9jdW1lbiA9IGVsZW1lbnQub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lbGVtZW50JG93bmVyRG9jdW1lbi5ib2R5KTtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhzY3JvbGxQYXJlbnQpO1xuICB2YXIgdGFyZ2V0ID0gaXNCb2R5ID8gW3dpbl0uY29uY2F0KHdpbi52aXN1YWxWaWV3cG9ydCB8fCBbXSwgaXNTY3JvbGxQYXJlbnQoc2Nyb2xsUGFyZW50KSA/IHNjcm9sbFBhcmVudCA6IFtdKSA6IHNjcm9sbFBhcmVudDtcbiAgdmFyIHVwZGF0ZWRMaXN0ID0gbGlzdC5jb25jYXQodGFyZ2V0KTtcbiAgcmV0dXJuIGlzQm9keSA/IHVwZGF0ZWRMaXN0IDogLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FsbF06IGlzQm9keSB0ZWxscyB1cyB0YXJnZXQgd2lsbCBiZSBhbiBIVE1MRWxlbWVudCBoZXJlXG4gIHVwZGF0ZWRMaXN0LmNvbmNhdChsaXN0U2Nyb2xsUGFyZW50cyhnZXRQYXJlbnROb2RlKHRhcmdldCkpKTtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVjdFRvQ2xpZW50UmVjdChyZWN0KSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCByZWN0LCB7XG4gICAgbGVmdDogcmVjdC54LFxuICAgIHRvcDogcmVjdC55LFxuICAgIHJpZ2h0OiByZWN0LnggKyByZWN0LndpZHRoLFxuICAgIGJvdHRvbTogcmVjdC55ICsgcmVjdC5oZWlnaHRcbiAgfSk7XG59IiwgImltcG9ydCB7IHZpZXdwb3J0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0Vmlld3BvcnRSZWN0IGZyb20gXCIuL2dldFZpZXdwb3J0UmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50UmVjdCBmcm9tIFwiLi9nZXREb2N1bWVudFJlY3QuanNcIjtcbmltcG9ydCBsaXN0U2Nyb2xsUGFyZW50cyBmcm9tIFwiLi9saXN0U2Nyb2xsUGFyZW50cy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQsIGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGNvbnRhaW5zIGZyb20gXCIuL2NvbnRhaW5zLmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCByZWN0VG9DbGllbnRSZWN0IGZyb20gXCIuLi91dGlscy9yZWN0VG9DbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgeyBtYXgsIG1pbiB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIGdldElubmVyQm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCk7XG4gIHJlY3QudG9wID0gcmVjdC50b3AgKyBlbGVtZW50LmNsaWVudFRvcDtcbiAgcmVjdC5sZWZ0ID0gcmVjdC5sZWZ0ICsgZWxlbWVudC5jbGllbnRMZWZ0O1xuICByZWN0LmJvdHRvbSA9IHJlY3QudG9wICsgZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIHJlY3QucmlnaHQgPSByZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudFdpZHRoO1xuICByZWN0LndpZHRoID0gZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgcmVjdC5oZWlnaHQgPSBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgcmVjdC54ID0gcmVjdC5sZWZ0O1xuICByZWN0LnkgPSByZWN0LnRvcDtcbiAgcmV0dXJuIHJlY3Q7XG59XG5cbmZ1bmN0aW9uIGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGNsaXBwaW5nUGFyZW50KSB7XG4gIHJldHVybiBjbGlwcGluZ1BhcmVudCA9PT0gdmlld3BvcnQgPyByZWN0VG9DbGllbnRSZWN0KGdldFZpZXdwb3J0UmVjdChlbGVtZW50KSkgOiBpc0hUTUxFbGVtZW50KGNsaXBwaW5nUGFyZW50KSA/IGdldElubmVyQm91bmRpbmdDbGllbnRSZWN0KGNsaXBwaW5nUGFyZW50KSA6IHJlY3RUb0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkpO1xufSAvLyBBIFwiY2xpcHBpbmcgcGFyZW50XCIgaXMgYW4gb3ZlcmZsb3dhYmxlIGNvbnRhaW5lciB3aXRoIHRoZSBjaGFyYWN0ZXJpc3RpYyBvZlxuLy8gY2xpcHBpbmcgKG9yIGhpZGluZykgb3ZlcmZsb3dpbmcgZWxlbWVudHMgd2l0aCBhIHBvc2l0aW9uIGRpZmZlcmVudCBmcm9tXG4vLyBgaW5pdGlhbGBcblxuXG5mdW5jdGlvbiBnZXRDbGlwcGluZ1BhcmVudHMoZWxlbWVudCkge1xuICB2YXIgY2xpcHBpbmdQYXJlbnRzID0gbGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZShlbGVtZW50KSk7XG4gIHZhciBjYW5Fc2NhcGVDbGlwcGluZyA9IFsnYWJzb2x1dGUnLCAnZml4ZWQnXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24pID49IDA7XG4gIHZhciBjbGlwcGVyRWxlbWVudCA9IGNhbkVzY2FwZUNsaXBwaW5nICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkgPyBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkgOiBlbGVtZW50O1xuXG4gIGlmICghaXNFbGVtZW50KGNsaXBwZXJFbGVtZW50KSkge1xuICAgIHJldHVybiBbXTtcbiAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMTQxNFxuXG5cbiAgcmV0dXJuIGNsaXBwaW5nUGFyZW50cy5maWx0ZXIoZnVuY3Rpb24gKGNsaXBwaW5nUGFyZW50KSB7XG4gICAgcmV0dXJuIGlzRWxlbWVudChjbGlwcGluZ1BhcmVudCkgJiYgY29udGFpbnMoY2xpcHBpbmdQYXJlbnQsIGNsaXBwZXJFbGVtZW50KSAmJiBnZXROb2RlTmFtZShjbGlwcGluZ1BhcmVudCkgIT09ICdib2R5JztcbiAgfSk7XG59IC8vIEdldHMgdGhlIG1heGltdW0gYXJlYSB0aGF0IHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gZHVlIHRvIGFueSBudW1iZXIgb2Zcbi8vIGNsaXBwaW5nIHBhcmVudHNcblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDbGlwcGluZ1JlY3QoZWxlbWVudCwgYm91bmRhcnksIHJvb3RCb3VuZGFyeSkge1xuICB2YXIgbWFpbkNsaXBwaW5nUGFyZW50cyA9IGJvdW5kYXJ5ID09PSAnY2xpcHBpbmdQYXJlbnRzJyA/IGdldENsaXBwaW5nUGFyZW50cyhlbGVtZW50KSA6IFtdLmNvbmNhdChib3VuZGFyeSk7XG4gIHZhciBjbGlwcGluZ1BhcmVudHMgPSBbXS5jb25jYXQobWFpbkNsaXBwaW5nUGFyZW50cywgW3Jvb3RCb3VuZGFyeV0pO1xuICB2YXIgZmlyc3RDbGlwcGluZ1BhcmVudCA9IGNsaXBwaW5nUGFyZW50c1swXTtcbiAgdmFyIGNsaXBwaW5nUmVjdCA9IGNsaXBwaW5nUGFyZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjY1JlY3QsIGNsaXBwaW5nUGFyZW50KSB7XG4gICAgdmFyIHJlY3QgPSBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBjbGlwcGluZ1BhcmVudCk7XG4gICAgYWNjUmVjdC50b3AgPSBtYXgocmVjdC50b3AsIGFjY1JlY3QudG9wKTtcbiAgICBhY2NSZWN0LnJpZ2h0ID0gbWluKHJlY3QucmlnaHQsIGFjY1JlY3QucmlnaHQpO1xuICAgIGFjY1JlY3QuYm90dG9tID0gbWluKHJlY3QuYm90dG9tLCBhY2NSZWN0LmJvdHRvbSk7XG4gICAgYWNjUmVjdC5sZWZ0ID0gbWF4KHJlY3QubGVmdCwgYWNjUmVjdC5sZWZ0KTtcbiAgICByZXR1cm4gYWNjUmVjdDtcbiAgfSwgZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgZmlyc3RDbGlwcGluZ1BhcmVudCkpO1xuICBjbGlwcGluZ1JlY3Qud2lkdGggPSBjbGlwcGluZ1JlY3QucmlnaHQgLSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LmhlaWdodCA9IGNsaXBwaW5nUmVjdC5ib3R0b20gLSBjbGlwcGluZ1JlY3QudG9wO1xuICBjbGlwcGluZ1JlY3QueCA9IGNsaXBwaW5nUmVjdC5sZWZ0O1xuICBjbGlwcGluZ1JlY3QueSA9IGNsaXBwaW5nUmVjdC50b3A7XG4gIHJldHVybiBjbGlwcGluZ1JlY3Q7XG59IiwgImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4vZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCBzdGFydCwgZW5kIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciByZWZlcmVuY2UgPSBfcmVmLnJlZmVyZW5jZSxcbiAgICAgIGVsZW1lbnQgPSBfcmVmLmVsZW1lbnQsXG4gICAgICBwbGFjZW1lbnQgPSBfcmVmLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBwbGFjZW1lbnQgPyBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgOiBudWxsO1xuICB2YXIgdmFyaWF0aW9uID0gcGxhY2VtZW50ID8gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgOiBudWxsO1xuICB2YXIgY29tbW9uWCA9IHJlZmVyZW5jZS54ICsgcmVmZXJlbmNlLndpZHRoIC8gMiAtIGVsZW1lbnQud2lkdGggLyAyO1xuICB2YXIgY29tbW9uWSA9IHJlZmVyZW5jZS55ICsgcmVmZXJlbmNlLmhlaWdodCAvIDIgLSBlbGVtZW50LmhlaWdodCAvIDI7XG4gIHZhciBvZmZzZXRzO1xuXG4gIHN3aXRjaCAoYmFzZVBsYWNlbWVudCkge1xuICAgIGNhc2UgdG9wOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgLSBlbGVtZW50LmhlaWdodFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBib3R0b206XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgcmlnaHQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBsZWZ0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggLSBlbGVtZW50LndpZHRoLFxuICAgICAgICB5OiBjb21tb25ZXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLngsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55XG4gICAgICB9O1xuICB9XG5cbiAgdmFyIG1haW5BeGlzID0gYmFzZVBsYWNlbWVudCA/IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KSA6IG51bGw7XG5cbiAgaWYgKG1haW5BeGlzICE9IG51bGwpIHtcbiAgICB2YXIgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHN3aXRjaCAodmFyaWF0aW9uKSB7XG4gICAgICBjYXNlIHN0YXJ0OlxuICAgICAgICBvZmZzZXRzW21haW5BeGlzXSA9IG9mZnNldHNbbWFpbkF4aXNdIC0gKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBlbmQ6XG4gICAgICAgIG9mZnNldHNbbWFpbkF4aXNdID0gb2Zmc2V0c1ttYWluQXhpc10gKyAocmVmZXJlbmNlW2xlbl0gLyAyIC0gZWxlbWVudFtsZW5dIC8gMik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvZmZzZXRzO1xufSIsICJpbXBvcnQgZ2V0Q2xpcHBpbmdSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgY29tcHV0ZU9mZnNldHMgZnJvbSBcIi4vY29tcHV0ZU9mZnNldHMuanNcIjtcbmltcG9ydCByZWN0VG9DbGllbnRSZWN0IGZyb20gXCIuL3JlY3RUb0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCB7IGNsaXBwaW5nUGFyZW50cywgcmVmZXJlbmNlLCBwb3BwZXIsIGJvdHRvbSwgdG9wLCByaWdodCwgYmFzZVBsYWNlbWVudHMsIHZpZXdwb3J0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBtZXJnZVBhZGRpbmdPYmplY3QgZnJvbSBcIi4vbWVyZ2VQYWRkaW5nT2JqZWN0LmpzXCI7XG5pbXBvcnQgZXhwYW5kVG9IYXNoTWFwIGZyb20gXCIuL2V4cGFuZFRvSGFzaE1hcC5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRldGVjdE92ZXJmbG93KHN0YXRlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgX29wdGlvbnMkcGxhY2VtZW50ID0gX29wdGlvbnMucGxhY2VtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX29wdGlvbnMkcGxhY2VtZW50ID09PSB2b2lkIDAgPyBzdGF0ZS5wbGFjZW1lbnQgOiBfb3B0aW9ucyRwbGFjZW1lbnQsXG4gICAgICBfb3B0aW9ucyRib3VuZGFyeSA9IF9vcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgYm91bmRhcnkgPSBfb3B0aW9ucyRib3VuZGFyeSA9PT0gdm9pZCAwID8gY2xpcHBpbmdQYXJlbnRzIDogX29wdGlvbnMkYm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRyb290Qm91bmRhcnkgPSBfb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBfb3B0aW9ucyRyb290Qm91bmRhcnkgPT09IHZvaWQgMCA/IHZpZXdwb3J0IDogX29wdGlvbnMkcm9vdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkZWxlbWVudENvbnRlID0gX29wdGlvbnMuZWxlbWVudENvbnRleHQsXG4gICAgICBlbGVtZW50Q29udGV4dCA9IF9vcHRpb25zJGVsZW1lbnRDb250ZSA9PT0gdm9pZCAwID8gcG9wcGVyIDogX29wdGlvbnMkZWxlbWVudENvbnRlLFxuICAgICAgX29wdGlvbnMkYWx0Qm91bmRhcnkgPSBfb3B0aW9ucy5hbHRCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5ID0gX29wdGlvbnMkYWx0Qm91bmRhcnkgPT09IHZvaWQgMCA/IGZhbHNlIDogX29wdGlvbnMkYWx0Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRwYWRkaW5nID0gX29wdGlvbnMucGFkZGluZyxcbiAgICAgIHBhZGRpbmcgPSBfb3B0aW9ucyRwYWRkaW5nID09PSB2b2lkIDAgPyAwIDogX29wdGlvbnMkcGFkZGluZztcbiAgdmFyIHBhZGRpbmdPYmplY3QgPSBtZXJnZVBhZGRpbmdPYmplY3QodHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gcGFkZGluZyA6IGV4cGFuZFRvSGFzaE1hcChwYWRkaW5nLCBiYXNlUGxhY2VtZW50cykpO1xuICB2YXIgYWx0Q29udGV4dCA9IGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgPyByZWZlcmVuY2UgOiBwb3BwZXI7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW2FsdEJvdW5kYXJ5ID8gYWx0Q29udGV4dCA6IGVsZW1lbnRDb250ZXh0XTtcbiAgdmFyIGNsaXBwaW5nQ2xpZW50UmVjdCA9IGdldENsaXBwaW5nUmVjdChpc0VsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50IDogZWxlbWVudC5jb250ZXh0RWxlbWVudCB8fCBnZXREb2N1bWVudEVsZW1lbnQoc3RhdGUuZWxlbWVudHMucG9wcGVyKSwgYm91bmRhcnksIHJvb3RCb3VuZGFyeSk7XG4gIHZhciByZWZlcmVuY2VDbGllbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHN0YXRlLmVsZW1lbnRzLnJlZmVyZW5jZSk7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gY29tcHV0ZU9mZnNldHMoe1xuICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlQ2xpZW50UmVjdCxcbiAgICBlbGVtZW50OiBwb3BwZXJSZWN0LFxuICAgIHN0cmF0ZWd5OiAnYWJzb2x1dGUnLFxuICAgIHBsYWNlbWVudDogcGxhY2VtZW50XG4gIH0pO1xuICB2YXIgcG9wcGVyQ2xpZW50UmVjdCA9IHJlY3RUb0NsaWVudFJlY3QoT2JqZWN0LmFzc2lnbih7fSwgcG9wcGVyUmVjdCwgcG9wcGVyT2Zmc2V0cykpO1xuICB2YXIgZWxlbWVudENsaWVudFJlY3QgPSBlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyID8gcG9wcGVyQ2xpZW50UmVjdCA6IHJlZmVyZW5jZUNsaWVudFJlY3Q7IC8vIHBvc2l0aXZlID0gb3ZlcmZsb3dpbmcgdGhlIGNsaXBwaW5nIHJlY3RcbiAgLy8gMCBvciBuZWdhdGl2ZSA9IHdpdGhpbiB0aGUgY2xpcHBpbmcgcmVjdFxuXG4gIHZhciBvdmVyZmxvd09mZnNldHMgPSB7XG4gICAgdG9wOiBjbGlwcGluZ0NsaWVudFJlY3QudG9wIC0gZWxlbWVudENsaWVudFJlY3QudG9wICsgcGFkZGluZ09iamVjdC50b3AsXG4gICAgYm90dG9tOiBlbGVtZW50Q2xpZW50UmVjdC5ib3R0b20gLSBjbGlwcGluZ0NsaWVudFJlY3QuYm90dG9tICsgcGFkZGluZ09iamVjdC5ib3R0b20sXG4gICAgbGVmdDogY2xpcHBpbmdDbGllbnRSZWN0LmxlZnQgLSBlbGVtZW50Q2xpZW50UmVjdC5sZWZ0ICsgcGFkZGluZ09iamVjdC5sZWZ0LFxuICAgIHJpZ2h0OiBlbGVtZW50Q2xpZW50UmVjdC5yaWdodCAtIGNsaXBwaW5nQ2xpZW50UmVjdC5yaWdodCArIHBhZGRpbmdPYmplY3QucmlnaHRcbiAgfTtcbiAgdmFyIG9mZnNldERhdGEgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldDsgLy8gT2Zmc2V0cyBjYW4gYmUgYXBwbGllZCBvbmx5IHRvIHRoZSBwb3BwZXIgZWxlbWVudFxuXG4gIGlmIChlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyICYmIG9mZnNldERhdGEpIHtcbiAgICB2YXIgb2Zmc2V0ID0gb2Zmc2V0RGF0YVtwbGFjZW1lbnRdO1xuICAgIE9iamVjdC5rZXlzKG92ZXJmbG93T2Zmc2V0cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgbXVsdGlwbHkgPSBbcmlnaHQsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAxIDogLTE7XG4gICAgICB2YXIgYXhpcyA9IFt0b3AsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAneScgOiAneCc7XG4gICAgICBvdmVyZmxvd09mZnNldHNba2V5XSArPSBvZmZzZXRbYXhpc10gKiBtdWx0aXBseTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBvdmVyZmxvd09mZnNldHM7XG59IiwgImltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4vZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgeyB2YXJpYXRpb25QbGFjZW1lbnRzLCBiYXNlUGxhY2VtZW50cywgcGxhY2VtZW50cyBhcyBhbGxQbGFjZW1lbnRzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4vZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbXB1dGVBdXRvUGxhY2VtZW50KHN0YXRlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgcGxhY2VtZW50ID0gX29wdGlvbnMucGxhY2VtZW50LFxuICAgICAgYm91bmRhcnkgPSBfb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmcgPSBfb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgZmxpcFZhcmlhdGlvbnMgPSBfb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyxcbiAgICAgIF9vcHRpb25zJGFsbG93ZWRBdXRvUCA9IF9vcHRpb25zLmFsbG93ZWRBdXRvUGxhY2VtZW50cyxcbiAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50cyA9IF9vcHRpb25zJGFsbG93ZWRBdXRvUCA9PT0gdm9pZCAwID8gYWxsUGxhY2VtZW50cyA6IF9vcHRpb25zJGFsbG93ZWRBdXRvUDtcbiAgdmFyIHZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpO1xuICB2YXIgcGxhY2VtZW50cyA9IHZhcmlhdGlvbiA/IGZsaXBWYXJpYXRpb25zID8gdmFyaWF0aW9uUGxhY2VtZW50cyA6IHZhcmlhdGlvblBsYWNlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHZhcmlhdGlvbjtcbiAgfSkgOiBiYXNlUGxhY2VtZW50cztcbiAgdmFyIGFsbG93ZWRQbGFjZW1lbnRzID0gcGxhY2VtZW50cy5maWx0ZXIoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgIHJldHVybiBhbGxvd2VkQXV0b1BsYWNlbWVudHMuaW5kZXhPZihwbGFjZW1lbnQpID49IDA7XG4gIH0pO1xuXG4gIGlmIChhbGxvd2VkUGxhY2VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHM7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFsnUG9wcGVyOiBUaGUgYGFsbG93ZWRBdXRvUGxhY2VtZW50c2Agb3B0aW9uIGRpZCBub3QgYWxsb3cgYW55JywgJ3BsYWNlbWVudHMuIEVuc3VyZSB0aGUgYHBsYWNlbWVudGAgb3B0aW9uIG1hdGNoZXMgdGhlIHZhcmlhdGlvbicsICdvZiB0aGUgYWxsb3dlZCBwbGFjZW1lbnRzLicsICdGb3IgZXhhbXBsZSwgXCJhdXRvXCIgY2Fubm90IGJlIHVzZWQgdG8gYWxsb3cgXCJib3R0b20tc3RhcnRcIi4nLCAnVXNlIFwiYXV0by1zdGFydFwiIGluc3RlYWQuJ10uam9pbignICcpKTtcbiAgICB9XG4gIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtdHlwZV06IEZsb3cgc2VlbXMgdG8gaGF2ZSBwcm9ibGVtcyB3aXRoIHR3byBhcnJheSB1bmlvbnMuLi5cblxuXG4gIHZhciBvdmVyZmxvd3MgPSBhbGxvd2VkUGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgYWNjW3BsYWNlbWVudF0gPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmdcbiAgICB9KVtnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCldO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG92ZXJmbG93cykuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBvdmVyZmxvd3NbYV0gLSBvdmVyZmxvd3NbYl07XG4gIH0pO1xufSIsICJpbXBvcnQgZ2V0T3Bwb3NpdGVQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE9wcG9zaXRlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGNvbXB1dGVBdXRvUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9jb21wdXRlQXV0b1BsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgYm90dG9tLCB0b3AsIHN0YXJ0LCByaWdodCwgbGVmdCwgYXV0byB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi4vdXRpbHMvZ2V0VmFyaWF0aW9uLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZnVuY3Rpb24gZ2V0RXhwYW5kZWRGYWxsYmFja1BsYWNlbWVudHMocGxhY2VtZW50KSB7XG4gIGlmIChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8pIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgb3Bwb3NpdGVQbGFjZW1lbnQgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICByZXR1cm4gW2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCksIG9wcG9zaXRlUGxhY2VtZW50LCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChvcHBvc2l0ZVBsYWNlbWVudCldO1xufVxuXG5mdW5jdGlvbiBmbGlwKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdLl9za2lwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIF9vcHRpb25zJG1haW5BeGlzID0gb3B0aW9ucy5tYWluQXhpcyxcbiAgICAgIGNoZWNrTWFpbkF4aXMgPSBfb3B0aW9ucyRtYWluQXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJG1haW5BeGlzLFxuICAgICAgX29wdGlvbnMkYWx0QXhpcyA9IG9wdGlvbnMuYWx0QXhpcyxcbiAgICAgIGNoZWNrQWx0QXhpcyA9IF9vcHRpb25zJGFsdEF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgc3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzID0gb3B0aW9ucy5mYWxsYmFja1BsYWNlbWVudHMsXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPSBvcHRpb25zLmZsaXBWYXJpYXRpb25zLFxuICAgICAgZmxpcFZhcmlhdGlvbnMgPSBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRmbGlwVmFyaWF0aW8sXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBvcHRpb25zLmFsbG93ZWRBdXRvUGxhY2VtZW50cztcbiAgdmFyIHByZWZlcnJlZFBsYWNlbWVudCA9IHN0YXRlLm9wdGlvbnMucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocHJlZmVycmVkUGxhY2VtZW50KTtcbiAgdmFyIGlzQmFzZVBsYWNlbWVudCA9IGJhc2VQbGFjZW1lbnQgPT09IHByZWZlcnJlZFBsYWNlbWVudDtcbiAgdmFyIGZhbGxiYWNrUGxhY2VtZW50cyA9IHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyB8fCAoaXNCYXNlUGxhY2VtZW50IHx8ICFmbGlwVmFyaWF0aW9ucyA/IFtnZXRPcHBvc2l0ZVBsYWNlbWVudChwcmVmZXJyZWRQbGFjZW1lbnQpXSA6IGdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzKHByZWZlcnJlZFBsYWNlbWVudCkpO1xuICB2YXIgcGxhY2VtZW50cyA9IFtwcmVmZXJyZWRQbGFjZW1lbnRdLmNvbmNhdChmYWxsYmFja1BsYWNlbWVudHMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8gPyBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgICBmbGlwVmFyaWF0aW9uczogZmxpcFZhcmlhdGlvbnMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHM6IGFsbG93ZWRBdXRvUGxhY2VtZW50c1xuICAgIH0pIDogcGxhY2VtZW50KTtcbiAgfSwgW10pO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBjaGVja3NNYXAgPSBuZXcgTWFwKCk7XG4gIHZhciBtYWtlRmFsbGJhY2tDaGVja3MgPSB0cnVlO1xuICB2YXIgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50c1swXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBsYWNlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcGxhY2VtZW50ID0gcGxhY2VtZW50c1tpXTtcblxuICAgIHZhciBfYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KTtcblxuICAgIHZhciBpc1N0YXJ0VmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHN0YXJ0O1xuICAgIHZhciBpc1ZlcnRpY2FsID0gW3RvcCwgYm90dG9tXS5pbmRleE9mKF9iYXNlUGxhY2VtZW50KSA+PSAwO1xuICAgIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgIHZhciBvdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnk6IGFsdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZ1xuICAgIH0pO1xuICAgIHZhciBtYWluVmFyaWF0aW9uU2lkZSA9IGlzVmVydGljYWwgPyBpc1N0YXJ0VmFyaWF0aW9uID8gcmlnaHQgOiBsZWZ0IDogaXNTdGFydFZhcmlhdGlvbiA/IGJvdHRvbSA6IHRvcDtcblxuICAgIGlmIChyZWZlcmVuY2VSZWN0W2xlbl0gPiBwb3BwZXJSZWN0W2xlbl0pIHtcbiAgICAgIG1haW5WYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIH1cblxuICAgIHZhciBhbHRWYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIHZhciBjaGVja3MgPSBbXTtcblxuICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICBjaGVja3MucHVzaChvdmVyZmxvd1tfYmFzZVBsYWNlbWVudF0gPD0gMCk7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgICAgY2hlY2tzLnB1c2gob3ZlcmZsb3dbbWFpblZhcmlhdGlvblNpZGVdIDw9IDAsIG92ZXJmbG93W2FsdFZhcmlhdGlvblNpZGVdIDw9IDApO1xuICAgIH1cblxuICAgIGlmIChjaGVja3MuZXZlcnkoZnVuY3Rpb24gKGNoZWNrKSB7XG4gICAgICByZXR1cm4gY2hlY2s7XG4gICAgfSkpIHtcbiAgICAgIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgICAgIG1ha2VGYWxsYmFja0NoZWNrcyA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2hlY2tzTWFwLnNldChwbGFjZW1lbnQsIGNoZWNrcyk7XG4gIH1cblxuICBpZiAobWFrZUZhbGxiYWNrQ2hlY2tzKSB7XG4gICAgLy8gYDJgIG1heSBiZSBkZXNpcmVkIGluIHNvbWUgY2FzZXMgXHUyMDEzIHJlc2VhcmNoIGxhdGVyXG4gICAgdmFyIG51bWJlck9mQ2hlY2tzID0gZmxpcFZhcmlhdGlvbnMgPyAzIDogMTtcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKF9pKSB7XG4gICAgICB2YXIgZml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudHMuZmluZChmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgICAgIHZhciBjaGVja3MgPSBjaGVja3NNYXAuZ2V0KHBsYWNlbWVudCk7XG5cbiAgICAgICAgaWYgKGNoZWNrcykge1xuICAgICAgICAgIHJldHVybiBjaGVja3Muc2xpY2UoMCwgX2kpLmV2ZXJ5KGZ1bmN0aW9uIChjaGVjaykge1xuICAgICAgICAgICAgcmV0dXJuIGNoZWNrO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGZpdHRpbmdQbGFjZW1lbnQpIHtcbiAgICAgICAgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gZml0dGluZ1BsYWNlbWVudDtcbiAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgX2kgPSBudW1iZXJPZkNoZWNrczsgX2kgPiAwOyBfaS0tKSB7XG4gICAgICB2YXIgX3JldCA9IF9sb29wKF9pKTtcblxuICAgICAgaWYgKF9yZXQgPT09IFwiYnJlYWtcIikgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLnBsYWNlbWVudCAhPT0gZmlyc3RGaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCA9IHRydWU7XG4gICAgc3RhdGUucGxhY2VtZW50ID0gZmlyc3RGaXR0aW5nUGxhY2VtZW50O1xuICAgIHN0YXRlLnJlc2V0ID0gdHJ1ZTtcbiAgfVxufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnZmxpcCcsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBmbGlwLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ29mZnNldCddLFxuICBkYXRhOiB7XG4gICAgX3NraXA6IGZhbHNlXG4gIH1cbn07IiwgImltcG9ydCB7IHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuXG5mdW5jdGlvbiBnZXRTaWRlT2Zmc2V0cyhvdmVyZmxvdywgcmVjdCwgcHJldmVudGVkT2Zmc2V0cykge1xuICBpZiAocHJldmVudGVkT2Zmc2V0cyA9PT0gdm9pZCAwKSB7XG4gICAgcHJldmVudGVkT2Zmc2V0cyA9IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdG9wOiBvdmVyZmxvdy50b3AgLSByZWN0LmhlaWdodCAtIHByZXZlbnRlZE9mZnNldHMueSxcbiAgICByaWdodDogb3ZlcmZsb3cucmlnaHQgLSByZWN0LndpZHRoICsgcHJldmVudGVkT2Zmc2V0cy54LFxuICAgIGJvdHRvbTogb3ZlcmZsb3cuYm90dG9tIC0gcmVjdC5oZWlnaHQgKyBwcmV2ZW50ZWRPZmZzZXRzLnksXG4gICAgbGVmdDogb3ZlcmZsb3cubGVmdCAtIHJlY3Qud2lkdGggLSBwcmV2ZW50ZWRPZmZzZXRzLnhcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKG92ZXJmbG93KSB7XG4gIHJldHVybiBbdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0XS5zb21lKGZ1bmN0aW9uIChzaWRlKSB7XG4gICAgcmV0dXJuIG92ZXJmbG93W3NpZGVdID49IDA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBoaWRlKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIHByZXZlbnRlZE9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnByZXZlbnRPdmVyZmxvdztcbiAgdmFyIHJlZmVyZW5jZU92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBlbGVtZW50Q29udGV4dDogJ3JlZmVyZW5jZSdcbiAgfSk7XG4gIHZhciBwb3BwZXJBbHRPdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgYWx0Qm91bmRhcnk6IHRydWVcbiAgfSk7XG4gIHZhciByZWZlcmVuY2VDbGlwcGluZ09mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhyZWZlcmVuY2VPdmVyZmxvdywgcmVmZXJlbmNlUmVjdCk7XG4gIHZhciBwb3BwZXJFc2NhcGVPZmZzZXRzID0gZ2V0U2lkZU9mZnNldHMocG9wcGVyQWx0T3ZlcmZsb3csIHBvcHBlclJlY3QsIHByZXZlbnRlZE9mZnNldHMpO1xuICB2YXIgaXNSZWZlcmVuY2VIaWRkZW4gPSBpc0FueVNpZGVGdWxseUNsaXBwZWQocmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzKTtcbiAgdmFyIGhhc1BvcHBlckVzY2FwZWQgPSBpc0FueVNpZGVGdWxseUNsaXBwZWQocG9wcGVyRXNjYXBlT2Zmc2V0cyk7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSB7XG4gICAgcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzOiByZWZlcmVuY2VDbGlwcGluZ09mZnNldHMsXG4gICAgcG9wcGVyRXNjYXBlT2Zmc2V0czogcG9wcGVyRXNjYXBlT2Zmc2V0cyxcbiAgICBpc1JlZmVyZW5jZUhpZGRlbjogaXNSZWZlcmVuY2VIaWRkZW4sXG4gICAgaGFzUG9wcGVyRXNjYXBlZDogaGFzUG9wcGVyRXNjYXBlZFxuICB9O1xuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyLCB7XG4gICAgJ2RhdGEtcG9wcGVyLXJlZmVyZW5jZS1oaWRkZW4nOiBpc1JlZmVyZW5jZUhpZGRlbixcbiAgICAnZGF0YS1wb3BwZXItZXNjYXBlZCc6IGhhc1BvcHBlckVzY2FwZWRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdoaWRlJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydwcmV2ZW50T3ZlcmZsb3cnXSxcbiAgZm46IGhpZGVcbn07IiwgImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyB0b3AsIGxlZnQsIHJpZ2h0LCBwbGFjZW1lbnRzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2VBbmRTa2lkZGluZ1RvWFkocGxhY2VtZW50LCByZWN0cywgb2Zmc2V0KSB7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICB2YXIgaW52ZXJ0RGlzdGFuY2UgPSBbbGVmdCwgdG9wXS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDAgPyAtMSA6IDE7XG5cbiAgdmFyIF9yZWYgPSB0eXBlb2Ygb2Zmc2V0ID09PSAnZnVuY3Rpb24nID8gb2Zmc2V0KE9iamVjdC5hc3NpZ24oe30sIHJlY3RzLCB7XG4gICAgcGxhY2VtZW50OiBwbGFjZW1lbnRcbiAgfSkpIDogb2Zmc2V0LFxuICAgICAgc2tpZGRpbmcgPSBfcmVmWzBdLFxuICAgICAgZGlzdGFuY2UgPSBfcmVmWzFdO1xuXG4gIHNraWRkaW5nID0gc2tpZGRpbmcgfHwgMDtcbiAgZGlzdGFuY2UgPSAoZGlzdGFuY2UgfHwgMCkgKiBpbnZlcnREaXN0YW5jZTtcbiAgcmV0dXJuIFtsZWZ0LCByaWdodF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwID8ge1xuICAgIHg6IGRpc3RhbmNlLFxuICAgIHk6IHNraWRkaW5nXG4gIH0gOiB7XG4gICAgeDogc2tpZGRpbmcsXG4gICAgeTogZGlzdGFuY2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gb2Zmc2V0KF9yZWYyKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYyLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZjIubmFtZTtcbiAgdmFyIF9vcHRpb25zJG9mZnNldCA9IG9wdGlvbnMub2Zmc2V0LFxuICAgICAgb2Zmc2V0ID0gX29wdGlvbnMkb2Zmc2V0ID09PSB2b2lkIDAgPyBbMCwgMF0gOiBfb3B0aW9ucyRvZmZzZXQ7XG4gIHZhciBkYXRhID0gcGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgYWNjW3BsYWNlbWVudF0gPSBkaXN0YW5jZUFuZFNraWRkaW5nVG9YWShwbGFjZW1lbnQsIHN0YXRlLnJlY3RzLCBvZmZzZXQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbiAgdmFyIF9kYXRhJHN0YXRlJHBsYWNlbWVudCA9IGRhdGFbc3RhdGUucGxhY2VtZW50XSxcbiAgICAgIHggPSBfZGF0YSRzdGF0ZSRwbGFjZW1lbnQueCxcbiAgICAgIHkgPSBfZGF0YSRzdGF0ZSRwbGFjZW1lbnQueTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzICE9IG51bGwpIHtcbiAgICBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMueCArPSB4O1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy55ICs9IHk7XG4gIH1cblxuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gZGF0YTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ29mZnNldCcsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIHJlcXVpcmVzOiBbJ3BvcHBlck9mZnNldHMnXSxcbiAgZm46IG9mZnNldFxufTsiLCAiaW1wb3J0IGNvbXB1dGVPZmZzZXRzIGZyb20gXCIuLi91dGlscy9jb21wdXRlT2Zmc2V0cy5qc1wiO1xuXG5mdW5jdGlvbiBwb3BwZXJPZmZzZXRzKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIC8vIE9mZnNldHMgYXJlIHRoZSBhY3R1YWwgcG9zaXRpb24gdGhlIHBvcHBlciBuZWVkcyB0byBoYXZlIHRvIGJlXG4gIC8vIHByb3Blcmx5IHBvc2l0aW9uZWQgbmVhciBpdHMgcmVmZXJlbmNlIGVsZW1lbnRcbiAgLy8gVGhpcyBpcyB0aGUgbW9zdCBiYXNpYyBwbGFjZW1lbnQsIGFuZCB3aWxsIGJlIGFkanVzdGVkIGJ5XG4gIC8vIHRoZSBtb2RpZmllcnMgaW4gdGhlIG5leHQgc3RlcFxuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gY29tcHV0ZU9mZnNldHMoe1xuICAgIHJlZmVyZW5jZTogc3RhdGUucmVjdHMucmVmZXJlbmNlLFxuICAgIGVsZW1lbnQ6IHN0YXRlLnJlY3RzLnBvcHBlcixcbiAgICBzdHJhdGVneTogJ2Fic29sdXRlJyxcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ3BvcHBlck9mZnNldHMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3JlYWQnLFxuICBmbjogcG9wcGVyT2Zmc2V0cyxcbiAgZGF0YToge31cbn07IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEFsdEF4aXMoYXhpcykge1xuICByZXR1cm4gYXhpcyA9PT0gJ3gnID8gJ3knIDogJ3gnO1xufSIsICJpbXBvcnQgeyB0b3AsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHN0YXJ0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0QWx0QXhpcyBmcm9tIFwiLi4vdXRpbHMvZ2V0QWx0QXhpcy5qc1wiO1xuaW1wb3J0IHdpdGhpbiBmcm9tIFwiLi4vdXRpbHMvd2l0aGluLmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IGdldEZyZXNoU2lkZU9iamVjdCBmcm9tIFwiLi4vdXRpbHMvZ2V0RnJlc2hTaWRlT2JqZWN0LmpzXCI7XG5pbXBvcnQgeyBtYXggYXMgbWF0aE1heCwgbWluIGFzIG1hdGhNaW4gfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBwcmV2ZW50T3ZlcmZsb3coX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIHZhciBfb3B0aW9ucyRtYWluQXhpcyA9IG9wdGlvbnMubWFpbkF4aXMsXG4gICAgICBjaGVja01haW5BeGlzID0gX29wdGlvbnMkbWFpbkF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRtYWluQXhpcyxcbiAgICAgIF9vcHRpb25zJGFsdEF4aXMgPSBvcHRpb25zLmFsdEF4aXMsXG4gICAgICBjaGVja0FsdEF4aXMgPSBfb3B0aW9ucyRhbHRBeGlzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJGFsdEF4aXMsXG4gICAgICBib3VuZGFyeSA9IG9wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBvcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5ID0gb3B0aW9ucy5hbHRCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmcgPSBvcHRpb25zLnBhZGRpbmcsXG4gICAgICBfb3B0aW9ucyR0ZXRoZXIgPSBvcHRpb25zLnRldGhlcixcbiAgICAgIHRldGhlciA9IF9vcHRpb25zJHRldGhlciA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHRldGhlcixcbiAgICAgIF9vcHRpb25zJHRldGhlck9mZnNldCA9IG9wdGlvbnMudGV0aGVyT2Zmc2V0LFxuICAgICAgdGV0aGVyT2Zmc2V0ID0gX29wdGlvbnMkdGV0aGVyT2Zmc2V0ID09PSB2b2lkIDAgPyAwIDogX29wdGlvbnMkdGV0aGVyT2Zmc2V0O1xuICB2YXIgb3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgIGFsdEJvdW5kYXJ5OiBhbHRCb3VuZGFyeVxuICB9KTtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24oc3RhdGUucGxhY2VtZW50KTtcbiAgdmFyIGlzQmFzZVBsYWNlbWVudCA9ICF2YXJpYXRpb247XG4gIHZhciBtYWluQXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KTtcbiAgdmFyIGFsdEF4aXMgPSBnZXRBbHRBeGlzKG1haW5BeGlzKTtcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHM7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIHRldGhlck9mZnNldFZhbHVlID0gdHlwZW9mIHRldGhlck9mZnNldCA9PT0gJ2Z1bmN0aW9uJyA/IHRldGhlck9mZnNldChPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZWN0cywge1xuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pKSA6IHRldGhlck9mZnNldDtcbiAgdmFyIGRhdGEgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgaWYgKCFwb3BwZXJPZmZzZXRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNoZWNrTWFpbkF4aXMgfHwgY2hlY2tBbHRBeGlzKSB7XG4gICAgdmFyIG1haW5TaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gICAgdmFyIGFsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gICAgdmFyIG9mZnNldCA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdO1xuICAgIHZhciBtaW4gPSBwb3BwZXJPZmZzZXRzW21haW5BeGlzXSArIG92ZXJmbG93W21haW5TaWRlXTtcbiAgICB2YXIgbWF4ID0gcG9wcGVyT2Zmc2V0c1ttYWluQXhpc10gLSBvdmVyZmxvd1thbHRTaWRlXTtcbiAgICB2YXIgYWRkaXRpdmUgPSB0ZXRoZXIgPyAtcG9wcGVyUmVjdFtsZW5dIC8gMiA6IDA7XG4gICAgdmFyIG1pbkxlbiA9IHZhcmlhdGlvbiA9PT0gc3RhcnQgPyByZWZlcmVuY2VSZWN0W2xlbl0gOiBwb3BwZXJSZWN0W2xlbl07XG4gICAgdmFyIG1heExlbiA9IHZhcmlhdGlvbiA9PT0gc3RhcnQgPyAtcG9wcGVyUmVjdFtsZW5dIDogLXJlZmVyZW5jZVJlY3RbbGVuXTsgLy8gV2UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcnJvdyBpbiB0aGUgY2FsY3VsYXRpb24gc28gdGhlIGFycm93IGRvZXNuJ3QgZ29cbiAgICAvLyBvdXRzaWRlIHRoZSByZWZlcmVuY2UgYm91bmRzXG5cbiAgICB2YXIgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3c7XG4gICAgdmFyIGFycm93UmVjdCA9IHRldGhlciAmJiBhcnJvd0VsZW1lbnQgPyBnZXRMYXlvdXRSZWN0KGFycm93RWxlbWVudCkgOiB7XG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMFxuICAgIH07XG4gICAgdmFyIGFycm93UGFkZGluZ09iamVjdCA9IHN0YXRlLm1vZGlmaWVyc0RhdGFbJ2Fycm93I3BlcnNpc3RlbnQnXSA/IHN0YXRlLm1vZGlmaWVyc0RhdGFbJ2Fycm93I3BlcnNpc3RlbnQnXS5wYWRkaW5nIDogZ2V0RnJlc2hTaWRlT2JqZWN0KCk7XG4gICAgdmFyIGFycm93UGFkZGluZ01pbiA9IGFycm93UGFkZGluZ09iamVjdFttYWluU2lkZV07XG4gICAgdmFyIGFycm93UGFkZGluZ01heCA9IGFycm93UGFkZGluZ09iamVjdFthbHRTaWRlXTsgLy8gSWYgdGhlIHJlZmVyZW5jZSBsZW5ndGggaXMgc21hbGxlciB0aGFuIHRoZSBhcnJvdyBsZW5ndGgsIHdlIGRvbid0IHdhbnRcbiAgICAvLyB0byBpbmNsdWRlIGl0cyBmdWxsIHNpemUgaW4gdGhlIGNhbGN1bGF0aW9uLiBJZiB0aGUgcmVmZXJlbmNlIGlzIHNtYWxsXG4gICAgLy8gYW5kIG5lYXIgdGhlIGVkZ2Ugb2YgYSBib3VuZGFyeSwgdGhlIHBvcHBlciBjYW4gb3ZlcmZsb3cgZXZlbiBpZiB0aGVcbiAgICAvLyByZWZlcmVuY2UgaXMgbm90IG92ZXJmbG93aW5nIGFzIHdlbGwgKGUuZy4gdmlydHVhbCBlbGVtZW50cyB3aXRoIG5vXG4gICAgLy8gd2lkdGggb3IgaGVpZ2h0KVxuXG4gICAgdmFyIGFycm93TGVuID0gd2l0aGluKDAsIHJlZmVyZW5jZVJlY3RbbGVuXSwgYXJyb3dSZWN0W2xlbl0pO1xuICAgIHZhciBtaW5PZmZzZXQgPSBpc0Jhc2VQbGFjZW1lbnQgPyByZWZlcmVuY2VSZWN0W2xlbl0gLyAyIC0gYWRkaXRpdmUgLSBhcnJvd0xlbiAtIGFycm93UGFkZGluZ01pbiAtIHRldGhlck9mZnNldFZhbHVlIDogbWluTGVuIC0gYXJyb3dMZW4gLSBhcnJvd1BhZGRpbmdNaW4gLSB0ZXRoZXJPZmZzZXRWYWx1ZTtcbiAgICB2YXIgbWF4T2Zmc2V0ID0gaXNCYXNlUGxhY2VtZW50ID8gLXJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgKyBhZGRpdGl2ZSArIGFycm93TGVuICsgYXJyb3dQYWRkaW5nTWF4ICsgdGV0aGVyT2Zmc2V0VmFsdWUgOiBtYXhMZW4gKyBhcnJvd0xlbiArIGFycm93UGFkZGluZ01heCArIHRldGhlck9mZnNldFZhbHVlO1xuICAgIHZhciBhcnJvd09mZnNldFBhcmVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93ICYmIGdldE9mZnNldFBhcmVudChzdGF0ZS5lbGVtZW50cy5hcnJvdyk7XG4gICAgdmFyIGNsaWVudE9mZnNldCA9IGFycm93T2Zmc2V0UGFyZW50ID8gbWFpbkF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudFRvcCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50TGVmdCB8fCAwIDogMDtcbiAgICB2YXIgb2Zmc2V0TW9kaWZpZXJWYWx1ZSA9IHN0YXRlLm1vZGlmaWVyc0RhdGEub2Zmc2V0ID8gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXRbc3RhdGUucGxhY2VtZW50XVttYWluQXhpc10gOiAwO1xuICAgIHZhciB0ZXRoZXJNaW4gPSBwb3BwZXJPZmZzZXRzW21haW5BeGlzXSArIG1pbk9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWUgLSBjbGllbnRPZmZzZXQ7XG4gICAgdmFyIHRldGhlck1heCA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdICsgbWF4T2Zmc2V0IC0gb2Zmc2V0TW9kaWZpZXJWYWx1ZTtcblxuICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICB2YXIgcHJldmVudGVkT2Zmc2V0ID0gd2l0aGluKHRldGhlciA/IG1hdGhNaW4obWluLCB0ZXRoZXJNaW4pIDogbWluLCBvZmZzZXQsIHRldGhlciA/IG1hdGhNYXgobWF4LCB0ZXRoZXJNYXgpIDogbWF4KTtcbiAgICAgIHBvcHBlck9mZnNldHNbbWFpbkF4aXNdID0gcHJldmVudGVkT2Zmc2V0O1xuICAgICAgZGF0YVttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQgLSBvZmZzZXQ7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgICAgdmFyIF9tYWluU2lkZSA9IG1haW5BeGlzID09PSAneCcgPyB0b3AgOiBsZWZ0O1xuXG4gICAgICB2YXIgX2FsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3gnID8gYm90dG9tIDogcmlnaHQ7XG5cbiAgICAgIHZhciBfb2Zmc2V0ID0gcG9wcGVyT2Zmc2V0c1thbHRBeGlzXTtcblxuICAgICAgdmFyIF9taW4gPSBfb2Zmc2V0ICsgb3ZlcmZsb3dbX21haW5TaWRlXTtcblxuICAgICAgdmFyIF9tYXggPSBfb2Zmc2V0IC0gb3ZlcmZsb3dbX2FsdFNpZGVdO1xuXG4gICAgICB2YXIgX3ByZXZlbnRlZE9mZnNldCA9IHdpdGhpbih0ZXRoZXIgPyBtYXRoTWluKF9taW4sIHRldGhlck1pbikgOiBfbWluLCBfb2Zmc2V0LCB0ZXRoZXIgPyBtYXRoTWF4KF9tYXgsIHRldGhlck1heCkgOiBfbWF4KTtcblxuICAgICAgcG9wcGVyT2Zmc2V0c1thbHRBeGlzXSA9IF9wcmV2ZW50ZWRPZmZzZXQ7XG4gICAgICBkYXRhW2FsdEF4aXNdID0gX3ByZXZlbnRlZE9mZnNldCAtIF9vZmZzZXQ7XG4gICAgfVxuICB9XG5cbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGRhdGE7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogcHJldmVudE92ZXJmbG93LFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ29mZnNldCddXG59OyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRIVE1MRWxlbWVudFNjcm9sbChlbGVtZW50KSB7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogZWxlbWVudC5zY3JvbGxMZWZ0LFxuICAgIHNjcm9sbFRvcDogZWxlbWVudC5zY3JvbGxUb3BcbiAgfTtcbn0iLCAiaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGwuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldEhUTUxFbGVtZW50U2Nyb2xsIGZyb20gXCIuL2dldEhUTUxFbGVtZW50U2Nyb2xsLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXROb2RlU2Nyb2xsKG5vZGUpIHtcbiAgaWYgKG5vZGUgPT09IGdldFdpbmRvdyhub2RlKSB8fCAhaXNIVE1MRWxlbWVudChub2RlKSkge1xuICAgIHJldHVybiBnZXRXaW5kb3dTY3JvbGwobm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGdldEhUTUxFbGVtZW50U2Nyb2xsKG5vZGUpO1xuICB9XG59IiwgImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZVNjcm9sbCBmcm9tIFwiLi9nZXROb2RlU2Nyb2xsLmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsQmFyWCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gXCIuL2lzU2Nyb2xsUGFyZW50LmpzXCI7XG5cbmZ1bmN0aW9uIGlzRWxlbWVudFNjYWxlZChlbGVtZW50KSB7XG4gIHZhciByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHNjYWxlWCA9IHJlY3Qud2lkdGggLyBlbGVtZW50Lm9mZnNldFdpZHRoIHx8IDE7XG4gIHZhciBzY2FsZVkgPSByZWN0LmhlaWdodCAvIGVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IDE7XG4gIHJldHVybiBzY2FsZVggIT09IDEgfHwgc2NhbGVZICE9PSAxO1xufSAvLyBSZXR1cm5zIHRoZSBjb21wb3NpdGUgcmVjdCBvZiBhbiBlbGVtZW50IHJlbGF0aXZlIHRvIGl0cyBvZmZzZXRQYXJlbnQuXG4vLyBDb21wb3NpdGUgbWVhbnMgaXQgdGFrZXMgaW50byBhY2NvdW50IHRyYW5zZm9ybXMgYXMgd2VsbCBhcyBsYXlvdXQuXG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q29tcG9zaXRlUmVjdChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCwgb2Zmc2V0UGFyZW50LCBpc0ZpeGVkKSB7XG4gIGlmIChpc0ZpeGVkID09PSB2b2lkIDApIHtcbiAgICBpc0ZpeGVkID0gZmFsc2U7XG4gIH1cblxuICB2YXIgaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIHZhciBvZmZzZXRQYXJlbnRJc1NjYWxlZCA9IGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJiBpc0VsZW1lbnRTY2FsZWQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIGRvY3VtZW50RWxlbWVudCA9IGdldERvY3VtZW50RWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICB2YXIgcmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCwgb2Zmc2V0UGFyZW50SXNTY2FsZWQpO1xuICB2YXIgc2Nyb2xsID0ge1xuICAgIHNjcm9sbExlZnQ6IDAsXG4gICAgc2Nyb2xsVG9wOiAwXG4gIH07XG4gIHZhciBvZmZzZXRzID0ge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xuXG4gIGlmIChpc09mZnNldFBhcmVudEFuRWxlbWVudCB8fCAhaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgJiYgIWlzRml4ZWQpIHtcbiAgICBpZiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSAhPT0gJ2JvZHknIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTA3OFxuICAgIGlzU2Nyb2xsUGFyZW50KGRvY3VtZW50RWxlbWVudCkpIHtcbiAgICAgIHNjcm9sbCA9IGdldE5vZGVTY3JvbGwob2Zmc2V0UGFyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpKSB7XG4gICAgICBvZmZzZXRzID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KG9mZnNldFBhcmVudCwgdHJ1ZSk7XG4gICAgICBvZmZzZXRzLnggKz0gb2Zmc2V0UGFyZW50LmNsaWVudExlZnQ7XG4gICAgICBvZmZzZXRzLnkgKz0gb2Zmc2V0UGFyZW50LmNsaWVudFRvcDtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50RWxlbWVudCkge1xuICAgICAgb2Zmc2V0cy54ID0gZ2V0V2luZG93U2Nyb2xsQmFyWChkb2N1bWVudEVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogcmVjdC5sZWZ0ICsgc2Nyb2xsLnNjcm9sbExlZnQgLSBvZmZzZXRzLngsXG4gICAgeTogcmVjdC50b3AgKyBzY3JvbGwuc2Nyb2xsVG9wIC0gb2Zmc2V0cy55LFxuICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgIGhlaWdodDogcmVjdC5oZWlnaHRcbiAgfTtcbn0iLCAiaW1wb3J0IHsgbW9kaWZpZXJQaGFzZXMgfSBmcm9tIFwiLi4vZW51bXMuanNcIjsgLy8gc291cmNlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80OTg3NTI1NVxuXG5mdW5jdGlvbiBvcmRlcihtb2RpZmllcnMpIHtcbiAgdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAgdmFyIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgbW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgbWFwLnNldChtb2RpZmllci5uYW1lLCBtb2RpZmllcik7XG4gIH0pOyAvLyBPbiB2aXNpdGluZyBvYmplY3QsIGNoZWNrIGZvciBpdHMgZGVwZW5kZW5jaWVzIGFuZCB2aXNpdCB0aGVtIHJlY3Vyc2l2ZWx5XG5cbiAgZnVuY3Rpb24gc29ydChtb2RpZmllcikge1xuICAgIHZpc2l0ZWQuYWRkKG1vZGlmaWVyLm5hbWUpO1xuICAgIHZhciByZXF1aXJlcyA9IFtdLmNvbmNhdChtb2RpZmllci5yZXF1aXJlcyB8fCBbXSwgbW9kaWZpZXIucmVxdWlyZXNJZkV4aXN0cyB8fCBbXSk7XG4gICAgcmVxdWlyZXMuZm9yRWFjaChmdW5jdGlvbiAoZGVwKSB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKGRlcCkpIHtcbiAgICAgICAgdmFyIGRlcE1vZGlmaWVyID0gbWFwLmdldChkZXApO1xuXG4gICAgICAgIGlmIChkZXBNb2RpZmllcikge1xuICAgICAgICAgIHNvcnQoZGVwTW9kaWZpZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmVzdWx0LnB1c2gobW9kaWZpZXIpO1xuICB9XG5cbiAgbW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgaWYgKCF2aXNpdGVkLmhhcyhtb2RpZmllci5uYW1lKSkge1xuICAgICAgLy8gY2hlY2sgZm9yIHZpc2l0ZWQgb2JqZWN0XG4gICAgICBzb3J0KG1vZGlmaWVyKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvcmRlck1vZGlmaWVycyhtb2RpZmllcnMpIHtcbiAgLy8gb3JkZXIgYmFzZWQgb24gZGVwZW5kZW5jaWVzXG4gIHZhciBvcmRlcmVkTW9kaWZpZXJzID0gb3JkZXIobW9kaWZpZXJzKTsgLy8gb3JkZXIgYmFzZWQgb24gcGhhc2VcblxuICByZXR1cm4gbW9kaWZpZXJQaGFzZXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBoYXNlKSB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQob3JkZXJlZE1vZGlmaWVycy5maWx0ZXIoZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgICByZXR1cm4gbW9kaWZpZXIucGhhc2UgPT09IHBoYXNlO1xuICAgIH0pKTtcbiAgfSwgW10pO1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWJvdW5jZShmbikge1xuICB2YXIgcGVuZGluZztcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgIHBlbmRpbmcgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBwZW5kaW5nID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJlc29sdmUoZm4oKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBlbmRpbmc7XG4gIH07XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZvcm1hdChzdHIpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuIFtdLmNvbmNhdChhcmdzKS5yZWR1Y2UoZnVuY3Rpb24gKHAsIGMpIHtcbiAgICByZXR1cm4gcC5yZXBsYWNlKC8lcy8sIGMpO1xuICB9LCBzdHIpO1xufSIsICJpbXBvcnQgZm9ybWF0IGZyb20gXCIuL2Zvcm1hdC5qc1wiO1xuaW1wb3J0IHsgbW9kaWZpZXJQaGFzZXMgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbnZhciBJTlZBTElEX01PRElGSUVSX0VSUk9SID0gJ1BvcHBlcjogbW9kaWZpZXIgXCIlc1wiIHByb3ZpZGVkIGFuIGludmFsaWQgJXMgcHJvcGVydHksIGV4cGVjdGVkICVzIGJ1dCBnb3QgJXMnO1xudmFyIE1JU1NJTkdfREVQRU5ERU5DWV9FUlJPUiA9ICdQb3BwZXI6IG1vZGlmaWVyIFwiJXNcIiByZXF1aXJlcyBcIiVzXCIsIGJ1dCBcIiVzXCIgbW9kaWZpZXIgaXMgbm90IGF2YWlsYWJsZSc7XG52YXIgVkFMSURfUFJPUEVSVElFUyA9IFsnbmFtZScsICdlbmFibGVkJywgJ3BoYXNlJywgJ2ZuJywgJ2VmZmVjdCcsICdyZXF1aXJlcycsICdvcHRpb25zJ107XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZU1vZGlmaWVycyhtb2RpZmllcnMpIHtcbiAgbW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgW10uY29uY2F0KE9iamVjdC5rZXlzKG1vZGlmaWVyKSwgVkFMSURfUFJPUEVSVElFUykgLy8gSUUxMS1jb21wYXRpYmxlIHJlcGxhY2VtZW50IGZvciBgbmV3IFNldChpdGVyYWJsZSlgXG4gICAgLmZpbHRlcihmdW5jdGlvbiAodmFsdWUsIGluZGV4LCBzZWxmKSB7XG4gICAgICByZXR1cm4gc2VsZi5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXg7XG4gICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlICduYW1lJzpcbiAgICAgICAgICBpZiAodHlwZW9mIG1vZGlmaWVyLm5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBTdHJpbmcobW9kaWZpZXIubmFtZSksICdcIm5hbWVcIicsICdcInN0cmluZ1wiJywgXCJcXFwiXCIgKyBTdHJpbmcobW9kaWZpZXIubmFtZSkgKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2VuYWJsZWQnOlxuICAgICAgICAgIGlmICh0eXBlb2YgbW9kaWZpZXIuZW5hYmxlZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJlbmFibGVkXCInLCAnXCJib29sZWFuXCInLCBcIlxcXCJcIiArIFN0cmluZyhtb2RpZmllci5lbmFibGVkKSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAncGhhc2UnOlxuICAgICAgICAgIGlmIChtb2RpZmllclBoYXNlcy5pbmRleE9mKG1vZGlmaWVyLnBoYXNlKSA8IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0KElOVkFMSURfTU9ESUZJRVJfRVJST1IsIG1vZGlmaWVyLm5hbWUsICdcInBoYXNlXCInLCBcImVpdGhlciBcIiArIG1vZGlmaWVyUGhhc2VzLmpvaW4oJywgJyksIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLnBoYXNlKSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZm4nOlxuICAgICAgICAgIGlmICh0eXBlb2YgbW9kaWZpZXIuZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0KElOVkFMSURfTU9ESUZJRVJfRVJST1IsIG1vZGlmaWVyLm5hbWUsICdcImZuXCInLCAnXCJmdW5jdGlvblwiJywgXCJcXFwiXCIgKyBTdHJpbmcobW9kaWZpZXIuZm4pICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdlZmZlY3QnOlxuICAgICAgICAgIGlmIChtb2RpZmllci5lZmZlY3QgIT0gbnVsbCAmJiB0eXBlb2YgbW9kaWZpZXIuZWZmZWN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJlZmZlY3RcIicsICdcImZ1bmN0aW9uXCInLCBcIlxcXCJcIiArIFN0cmluZyhtb2RpZmllci5mbikgKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3JlcXVpcmVzJzpcbiAgICAgICAgICBpZiAobW9kaWZpZXIucmVxdWlyZXMgIT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShtb2RpZmllci5yZXF1aXJlcykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0KElOVkFMSURfTU9ESUZJRVJfRVJST1IsIG1vZGlmaWVyLm5hbWUsICdcInJlcXVpcmVzXCInLCAnXCJhcnJheVwiJywgXCJcXFwiXCIgKyBTdHJpbmcobW9kaWZpZXIucmVxdWlyZXMpICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdyZXF1aXJlc0lmRXhpc3RzJzpcbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobW9kaWZpZXIucmVxdWlyZXNJZkV4aXN0cykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0KElOVkFMSURfTU9ESUZJRVJfRVJST1IsIG1vZGlmaWVyLm5hbWUsICdcInJlcXVpcmVzSWZFeGlzdHNcIicsICdcImFycmF5XCInLCBcIlxcXCJcIiArIFN0cmluZyhtb2RpZmllci5yZXF1aXJlc0lmRXhpc3RzKSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnb3B0aW9ucyc6XG4gICAgICAgIGNhc2UgJ2RhdGEnOlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIlBvcHBlckpTOiBhbiBpbnZhbGlkIHByb3BlcnR5IGhhcyBiZWVuIHByb3ZpZGVkIHRvIHRoZSBcXFwiXCIgKyBtb2RpZmllci5uYW1lICsgXCJcXFwiIG1vZGlmaWVyLCB2YWxpZCBwcm9wZXJ0aWVzIGFyZSBcIiArIFZBTElEX1BST1BFUlRJRVMubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcXFwiXCIgKyBzICsgXCJcXFwiXCI7XG4gICAgICAgICAgfSkuam9pbignLCAnKSArIFwiOyBidXQgXFxcIlwiICsga2V5ICsgXCJcXFwiIHdhcyBwcm92aWRlZC5cIik7XG4gICAgICB9XG5cbiAgICAgIG1vZGlmaWVyLnJlcXVpcmVzICYmIG1vZGlmaWVyLnJlcXVpcmVzLmZvckVhY2goZnVuY3Rpb24gKHJlcXVpcmVtZW50KSB7XG4gICAgICAgIGlmIChtb2RpZmllcnMuZmluZChmdW5jdGlvbiAobW9kKSB7XG4gICAgICAgICAgcmV0dXJuIG1vZC5uYW1lID09PSByZXF1aXJlbWVudDtcbiAgICAgICAgfSkgPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0KE1JU1NJTkdfREVQRU5ERU5DWV9FUlJPUiwgU3RyaW5nKG1vZGlmaWVyLm5hbWUpLCByZXF1aXJlbWVudCwgcmVxdWlyZW1lbnQpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1bmlxdWVCeShhcnIsIGZuKSB7XG4gIHZhciBpZGVudGlmaWVycyA9IG5ldyBTZXQoKTtcbiAgcmV0dXJuIGFyci5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICB2YXIgaWRlbnRpZmllciA9IGZuKGl0ZW0pO1xuXG4gICAgaWYgKCFpZGVudGlmaWVycy5oYXMoaWRlbnRpZmllcikpIHtcbiAgICAgIGlkZW50aWZpZXJzLmFkZChpZGVudGlmaWVyKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlQnlOYW1lKG1vZGlmaWVycykge1xuICB2YXIgbWVyZ2VkID0gbW9kaWZpZXJzLnJlZHVjZShmdW5jdGlvbiAobWVyZ2VkLCBjdXJyZW50KSB7XG4gICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkW2N1cnJlbnQubmFtZV07XG4gICAgbWVyZ2VkW2N1cnJlbnQubmFtZV0gPSBleGlzdGluZyA/IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLCBjdXJyZW50LCB7XG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZy5vcHRpb25zLCBjdXJyZW50Lm9wdGlvbnMpLFxuICAgICAgZGF0YTogT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmcuZGF0YSwgY3VycmVudC5kYXRhKVxuICAgIH0pIDogY3VycmVudDtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9LCB7fSk7IC8vIElFMTEgZG9lcyBub3Qgc3VwcG9ydCBPYmplY3QudmFsdWVzXG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1lcmdlZCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gbWVyZ2VkW2tleV07XG4gIH0pO1xufSIsICJpbXBvcnQgZ2V0Q29tcG9zaXRlUmVjdCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0Q29tcG9zaXRlUmVjdC5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBsaXN0U2Nyb2xsUGFyZW50cyBmcm9tIFwiLi9kb20tdXRpbHMvbGlzdFNjcm9sbFBhcmVudHMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZG9tLXV0aWxzL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCBvcmRlck1vZGlmaWVycyBmcm9tIFwiLi91dGlscy9vcmRlck1vZGlmaWVycy5qc1wiO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gXCIuL3V0aWxzL2RlYm91bmNlLmpzXCI7XG5pbXBvcnQgdmFsaWRhdGVNb2RpZmllcnMgZnJvbSBcIi4vdXRpbHMvdmFsaWRhdGVNb2RpZmllcnMuanNcIjtcbmltcG9ydCB1bmlxdWVCeSBmcm9tIFwiLi91dGlscy91bmlxdWVCeS5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IG1lcmdlQnlOYW1lIGZyb20gXCIuL3V0aWxzL21lcmdlQnlOYW1lLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCB7IGlzRWxlbWVudCB9IGZyb20gXCIuL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgeyBhdXRvIH0gZnJvbSBcIi4vZW51bXMuanNcIjtcbnZhciBJTlZBTElEX0VMRU1FTlRfRVJST1IgPSAnUG9wcGVyOiBJbnZhbGlkIHJlZmVyZW5jZSBvciBwb3BwZXIgYXJndW1lbnQgcHJvdmlkZWQuIFRoZXkgbXVzdCBiZSBlaXRoZXIgYSBET00gZWxlbWVudCBvciB2aXJ0dWFsIGVsZW1lbnQuJztcbnZhciBJTkZJTklURV9MT09QX0VSUk9SID0gJ1BvcHBlcjogQW4gaW5maW5pdGUgbG9vcCBpbiB0aGUgbW9kaWZpZXJzIGN5Y2xlIGhhcyBiZWVuIGRldGVjdGVkISBUaGUgY3ljbGUgaGFzIGJlZW4gaW50ZXJydXB0ZWQgdG8gcHJldmVudCBhIGJyb3dzZXIgY3Jhc2guJztcbnZhciBERUZBVUxUX09QVElPTlMgPSB7XG4gIHBsYWNlbWVudDogJ2JvdHRvbScsXG4gIG1vZGlmaWVyczogW10sXG4gIHN0cmF0ZWd5OiAnYWJzb2x1dGUnXG59O1xuXG5mdW5jdGlvbiBhcmVWYWxpZEVsZW1lbnRzKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuICFhcmdzLnNvbWUoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gIShlbGVtZW50ICYmIHR5cGVvZiBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCA9PT0gJ2Z1bmN0aW9uJyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9wcGVyR2VuZXJhdG9yKGdlbmVyYXRvck9wdGlvbnMpIHtcbiAgaWYgKGdlbmVyYXRvck9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIGdlbmVyYXRvck9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBfZ2VuZXJhdG9yT3B0aW9ucyA9IGdlbmVyYXRvck9wdGlvbnMsXG4gICAgICBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYgPSBfZ2VuZXJhdG9yT3B0aW9ucy5kZWZhdWx0TW9kaWZpZXJzLFxuICAgICAgZGVmYXVsdE1vZGlmaWVycyA9IF9nZW5lcmF0b3JPcHRpb25zJGRlZiA9PT0gdm9pZCAwID8gW10gOiBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYsXG4gICAgICBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyID0gX2dlbmVyYXRvck9wdGlvbnMuZGVmYXVsdE9wdGlvbnMsXG4gICAgICBkZWZhdWx0T3B0aW9ucyA9IF9nZW5lcmF0b3JPcHRpb25zJGRlZjIgPT09IHZvaWQgMCA/IERFRkFVTFRfT1BUSU9OUyA6IF9nZW5lcmF0b3JPcHRpb25zJGRlZjI7XG4gIHJldHVybiBmdW5jdGlvbiBjcmVhdGVQb3BwZXIocmVmZXJlbmNlLCBwb3BwZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0gZGVmYXVsdE9wdGlvbnM7XG4gICAgfVxuXG4gICAgdmFyIHN0YXRlID0ge1xuICAgICAgcGxhY2VtZW50OiAnYm90dG9tJyxcbiAgICAgIG9yZGVyZWRNb2RpZmllcnM6IFtdLFxuICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9PUFRJT05TLCBkZWZhdWx0T3B0aW9ucyksXG4gICAgICBtb2RpZmllcnNEYXRhOiB7fSxcbiAgICAgIGVsZW1lbnRzOiB7XG4gICAgICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlLFxuICAgICAgICBwb3BwZXI6IHBvcHBlclxuICAgICAgfSxcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgc3R5bGVzOiB7fVxuICAgIH07XG4gICAgdmFyIGVmZmVjdENsZWFudXBGbnMgPSBbXTtcbiAgICB2YXIgaXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB2YXIgaW5zdGFuY2UgPSB7XG4gICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICBzZXRPcHRpb25zOiBmdW5jdGlvbiBzZXRPcHRpb25zKHNldE9wdGlvbnNBY3Rpb24pIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygc2V0T3B0aW9uc0FjdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IHNldE9wdGlvbnNBY3Rpb24oc3RhdGUub3B0aW9ucykgOiBzZXRPcHRpb25zQWN0aW9uO1xuICAgICAgICBjbGVhbnVwTW9kaWZpZXJFZmZlY3RzKCk7XG4gICAgICAgIHN0YXRlLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0T3B0aW9ucywgc3RhdGUub3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIHN0YXRlLnNjcm9sbFBhcmVudHMgPSB7XG4gICAgICAgICAgcmVmZXJlbmNlOiBpc0VsZW1lbnQocmVmZXJlbmNlKSA/IGxpc3RTY3JvbGxQYXJlbnRzKHJlZmVyZW5jZSkgOiByZWZlcmVuY2UuY29udGV4dEVsZW1lbnQgPyBsaXN0U2Nyb2xsUGFyZW50cyhyZWZlcmVuY2UuY29udGV4dEVsZW1lbnQpIDogW10sXG4gICAgICAgICAgcG9wcGVyOiBsaXN0U2Nyb2xsUGFyZW50cyhwb3BwZXIpXG4gICAgICAgIH07IC8vIE9yZGVycyB0aGUgbW9kaWZpZXJzIGJhc2VkIG9uIHRoZWlyIGRlcGVuZGVuY2llcyBhbmQgYHBoYXNlYFxuICAgICAgICAvLyBwcm9wZXJ0aWVzXG5cbiAgICAgICAgdmFyIG9yZGVyZWRNb2RpZmllcnMgPSBvcmRlck1vZGlmaWVycyhtZXJnZUJ5TmFtZShbXS5jb25jYXQoZGVmYXVsdE1vZGlmaWVycywgc3RhdGUub3B0aW9ucy5tb2RpZmllcnMpKSk7IC8vIFN0cmlwIG91dCBkaXNhYmxlZCBtb2RpZmllcnNcblxuICAgICAgICBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzID0gb3JkZXJlZE1vZGlmaWVycy5maWx0ZXIoZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgICByZXR1cm4gbS5lbmFibGVkO1xuICAgICAgICB9KTsgLy8gVmFsaWRhdGUgdGhlIHByb3ZpZGVkIG1vZGlmaWVycyBzbyB0aGF0IHRoZSBjb25zdW1lciB3aWxsIGdldCB3YXJuZWRcbiAgICAgICAgLy8gaWYgb25lIG9mIHRoZSBtb2RpZmllcnMgaXMgaW52YWxpZCBmb3IgYW55IHJlYXNvblxuXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgICB2YXIgbW9kaWZpZXJzID0gdW5pcXVlQnkoW10uY29uY2F0KG9yZGVyZWRNb2RpZmllcnMsIHN0YXRlLm9wdGlvbnMubW9kaWZpZXJzKSwgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgICAgIHZhciBuYW1lID0gX3JlZi5uYW1lO1xuICAgICAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFsaWRhdGVNb2RpZmllcnMobW9kaWZpZXJzKTtcblxuICAgICAgICAgIGlmIChnZXRCYXNlUGxhY2VtZW50KHN0YXRlLm9wdGlvbnMucGxhY2VtZW50KSA9PT0gYXV0bykge1xuICAgICAgICAgICAgdmFyIGZsaXBNb2RpZmllciA9IHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZmluZChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgICAgICAgdmFyIG5hbWUgPSBfcmVmMi5uYW1lO1xuICAgICAgICAgICAgICByZXR1cm4gbmFtZSA9PT0gJ2ZsaXAnO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghZmxpcE1vZGlmaWVyKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoWydQb3BwZXI6IFwiYXV0b1wiIHBsYWNlbWVudHMgcmVxdWlyZSB0aGUgXCJmbGlwXCIgbW9kaWZpZXIgYmUnLCAncHJlc2VudCBhbmQgZW5hYmxlZCB0byB3b3JrLiddLmpvaW4oJyAnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9nZXRDb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShwb3BwZXIpLFxuICAgICAgICAgICAgICBtYXJnaW5Ub3AgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5tYXJnaW5Ub3AsXG4gICAgICAgICAgICAgIG1hcmdpblJpZ2h0ID0gX2dldENvbXB1dGVkU3R5bGUubWFyZ2luUmlnaHQsXG4gICAgICAgICAgICAgIG1hcmdpbkJvdHRvbSA9IF9nZXRDb21wdXRlZFN0eWxlLm1hcmdpbkJvdHRvbSxcbiAgICAgICAgICAgICAgbWFyZ2luTGVmdCA9IF9nZXRDb21wdXRlZFN0eWxlLm1hcmdpbkxlZnQ7IC8vIFdlIG5vIGxvbmdlciB0YWtlIGludG8gYWNjb3VudCBgbWFyZ2luc2Agb24gdGhlIHBvcHBlciwgYW5kIGl0IGNhblxuICAgICAgICAgIC8vIGNhdXNlIGJ1Z3Mgd2l0aCBwb3NpdGlvbmluZywgc28gd2UnbGwgd2FybiB0aGUgY29uc3VtZXJcblxuXG4gICAgICAgICAgaWYgKFttYXJnaW5Ub3AsIG1hcmdpblJpZ2h0LCBtYXJnaW5Cb3R0b20sIG1hcmdpbkxlZnRdLnNvbWUoZnVuY3Rpb24gKG1hcmdpbikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQobWFyZ2luKTtcbiAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFsnUG9wcGVyOiBDU1MgXCJtYXJnaW5cIiBzdHlsZXMgY2Fubm90IGJlIHVzZWQgdG8gYXBwbHkgcGFkZGluZycsICdiZXR3ZWVuIHRoZSBwb3BwZXIgYW5kIGl0cyByZWZlcmVuY2UgZWxlbWVudCBvciBib3VuZGFyeS4nLCAnVG8gcmVwbGljYXRlIG1hcmdpbiwgdXNlIHRoZSBgb2Zmc2V0YCBtb2RpZmllciwgYXMgd2VsbCBhcycsICd0aGUgYHBhZGRpbmdgIG9wdGlvbiBpbiB0aGUgYHByZXZlbnRPdmVyZmxvd2AgYW5kIGBmbGlwYCcsICdtb2RpZmllcnMuJ10uam9pbignICcpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBydW5Nb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgfSxcbiAgICAgIC8vIFN5bmMgdXBkYXRlIFx1MjAxMyBpdCB3aWxsIGFsd2F5cyBiZSBleGVjdXRlZCwgZXZlbiBpZiBub3QgbmVjZXNzYXJ5LiBUaGlzXG4gICAgICAvLyBpcyB1c2VmdWwgZm9yIGxvdyBmcmVxdWVuY3kgdXBkYXRlcyB3aGVyZSBzeW5jIGJlaGF2aW9yIHNpbXBsaWZpZXMgdGhlXG4gICAgICAvLyBsb2dpYy5cbiAgICAgIC8vIEZvciBoaWdoIGZyZXF1ZW5jeSB1cGRhdGVzIChlLmcuIGByZXNpemVgIGFuZCBgc2Nyb2xsYCBldmVudHMpLCBhbHdheXNcbiAgICAgIC8vIHByZWZlciB0aGUgYXN5bmMgUG9wcGVyI3VwZGF0ZSBtZXRob2RcbiAgICAgIGZvcmNlVXBkYXRlOiBmdW5jdGlvbiBmb3JjZVVwZGF0ZSgpIHtcbiAgICAgICAgaWYgKGlzRGVzdHJveWVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9zdGF0ZSRlbGVtZW50cyA9IHN0YXRlLmVsZW1lbnRzLFxuICAgICAgICAgICAgcmVmZXJlbmNlID0gX3N0YXRlJGVsZW1lbnRzLnJlZmVyZW5jZSxcbiAgICAgICAgICAgIHBvcHBlciA9IF9zdGF0ZSRlbGVtZW50cy5wb3BwZXI7IC8vIERvbid0IHByb2NlZWQgaWYgYHJlZmVyZW5jZWAgb3IgYHBvcHBlcmAgYXJlIG5vdCB2YWxpZCBlbGVtZW50c1xuICAgICAgICAvLyBhbnltb3JlXG5cbiAgICAgICAgaWYgKCFhcmVWYWxpZEVsZW1lbnRzKHJlZmVyZW5jZSwgcG9wcGVyKSkge1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoSU5WQUxJRF9FTEVNRU5UX0VSUk9SKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gLy8gU3RvcmUgdGhlIHJlZmVyZW5jZSBhbmQgcG9wcGVyIHJlY3RzIHRvIGJlIHJlYWQgYnkgbW9kaWZpZXJzXG5cblxuICAgICAgICBzdGF0ZS5yZWN0cyA9IHtcbiAgICAgICAgICByZWZlcmVuY2U6IGdldENvbXBvc2l0ZVJlY3QocmVmZXJlbmNlLCBnZXRPZmZzZXRQYXJlbnQocG9wcGVyKSwgc3RhdGUub3B0aW9ucy5zdHJhdGVneSA9PT0gJ2ZpeGVkJyksXG4gICAgICAgICAgcG9wcGVyOiBnZXRMYXlvdXRSZWN0KHBvcHBlcilcbiAgICAgICAgfTsgLy8gTW9kaWZpZXJzIGhhdmUgdGhlIGFiaWxpdHkgdG8gcmVzZXQgdGhlIGN1cnJlbnQgdXBkYXRlIGN5Y2xlLiBUaGVcbiAgICAgICAgLy8gbW9zdCBjb21tb24gdXNlIGNhc2UgZm9yIHRoaXMgaXMgdGhlIGBmbGlwYCBtb2RpZmllciBjaGFuZ2luZyB0aGVcbiAgICAgICAgLy8gcGxhY2VtZW50LCB3aGljaCB0aGVuIG5lZWRzIHRvIHJlLXJ1biBhbGwgdGhlIG1vZGlmaWVycywgYmVjYXVzZSB0aGVcbiAgICAgICAgLy8gbG9naWMgd2FzIHByZXZpb3VzbHkgcmFuIGZvciB0aGUgcHJldmlvdXMgcGxhY2VtZW50IGFuZCBpcyB0aGVyZWZvcmVcbiAgICAgICAgLy8gc3RhbGUvaW5jb3JyZWN0XG5cbiAgICAgICAgc3RhdGUucmVzZXQgPSBmYWxzZTtcbiAgICAgICAgc3RhdGUucGxhY2VtZW50ID0gc3RhdGUub3B0aW9ucy5wbGFjZW1lbnQ7IC8vIE9uIGVhY2ggdXBkYXRlIGN5Y2xlLCB0aGUgYG1vZGlmaWVyc0RhdGFgIHByb3BlcnR5IGZvciBlYWNoIG1vZGlmaWVyXG4gICAgICAgIC8vIGlzIGZpbGxlZCB3aXRoIHRoZSBpbml0aWFsIGRhdGEgc3BlY2lmaWVkIGJ5IHRoZSBtb2RpZmllci4gVGhpcyBtZWFuc1xuICAgICAgICAvLyBpdCBkb2Vzbid0IHBlcnNpc3QgYW5kIGlzIGZyZXNoIG9uIGVhY2ggdXBkYXRlLlxuICAgICAgICAvLyBUbyBlbnN1cmUgcGVyc2lzdGVudCBkYXRhLCB1c2UgYCR7bmFtZX0jcGVyc2lzdGVudGBcblxuICAgICAgICBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgICAgICAgcmV0dXJuIHN0YXRlLm1vZGlmaWVyc0RhdGFbbW9kaWZpZXIubmFtZV0gPSBPYmplY3QuYXNzaWduKHt9LCBtb2RpZmllci5kYXRhKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBfX2RlYnVnX2xvb3BzX18gPSAwO1xuXG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgICAgIF9fZGVidWdfbG9vcHNfXyArPSAxO1xuXG4gICAgICAgICAgICBpZiAoX19kZWJ1Z19sb29wc19fID4gMTAwKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoSU5GSU5JVEVfTE9PUF9FUlJPUik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzdGF0ZS5yZXNldCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgc3RhdGUucmVzZXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX3N0YXRlJG9yZGVyZWRNb2RpZmllID0gc3RhdGUub3JkZXJlZE1vZGlmaWVyc1tpbmRleF0sXG4gICAgICAgICAgICAgIGZuID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllLmZuLFxuICAgICAgICAgICAgICBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllLm9wdGlvbnMsXG4gICAgICAgICAgICAgIF9vcHRpb25zID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllMiA9PT0gdm9pZCAwID8ge30gOiBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyLFxuICAgICAgICAgICAgICBuYW1lID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllLm5hbWU7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IGZuKHtcbiAgICAgICAgICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgICAgICAgICBvcHRpb25zOiBfb3B0aW9ucyxcbiAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlXG4gICAgICAgICAgICB9KSB8fCBzdGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBBc3luYyBhbmQgb3B0aW1pc3RpY2FsbHkgb3B0aW1pemVkIHVwZGF0ZSBcdTIwMTMgaXQgd2lsbCBub3QgYmUgZXhlY3V0ZWQgaWZcbiAgICAgIC8vIG5vdCBuZWNlc3NhcnkgKGRlYm91bmNlZCB0byBydW4gYXQgbW9zdCBvbmNlLXBlci10aWNrKVxuICAgICAgdXBkYXRlOiBkZWJvdW5jZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIGluc3RhbmNlLmZvcmNlVXBkYXRlKCk7XG4gICAgICAgICAgcmVzb2x2ZShzdGF0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICBjbGVhbnVwTW9kaWZpZXJFZmZlY3RzKCk7XG4gICAgICAgIGlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKCFhcmVWYWxpZEVsZW1lbnRzKHJlZmVyZW5jZSwgcG9wcGVyKSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICBjb25zb2xlLmVycm9yKElOVkFMSURfRUxFTUVOVF9FUlJPUik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZS5zZXRPcHRpb25zKG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICBpZiAoIWlzRGVzdHJveWVkICYmIG9wdGlvbnMub25GaXJzdFVwZGF0ZSkge1xuICAgICAgICBvcHRpb25zLm9uRmlyc3RVcGRhdGUoc3RhdGUpO1xuICAgICAgfVxuICAgIH0pOyAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byBleGVjdXRlIGFyYml0cmFyeSBjb2RlIGJlZm9yZSB0aGUgZmlyc3RcbiAgICAvLyB1cGRhdGUgY3ljbGUgcnVucy4gVGhleSB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSB1cGRhdGVcbiAgICAvLyBjeWNsZS4gVGhpcyBpcyB1c2VmdWwgd2hlbiBhIG1vZGlmaWVyIGFkZHMgc29tZSBwZXJzaXN0ZW50IGRhdGEgdGhhdFxuICAgIC8vIG90aGVyIG1vZGlmaWVycyBuZWVkIHRvIHVzZSwgYnV0IHRoZSBtb2RpZmllciBpcyBydW4gYWZ0ZXIgdGhlIGRlcGVuZGVudFxuICAgIC8vIG9uZS5cblxuICAgIGZ1bmN0aW9uIHJ1bk1vZGlmaWVyRWZmZWN0cygpIHtcbiAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICAgICAgdmFyIG5hbWUgPSBfcmVmMy5uYW1lLFxuICAgICAgICAgICAgX3JlZjMkb3B0aW9ucyA9IF9yZWYzLm9wdGlvbnMsXG4gICAgICAgICAgICBvcHRpb25zID0gX3JlZjMkb3B0aW9ucyA9PT0gdm9pZCAwID8ge30gOiBfcmVmMyRvcHRpb25zLFxuICAgICAgICAgICAgZWZmZWN0ID0gX3JlZjMuZWZmZWN0O1xuXG4gICAgICAgIGlmICh0eXBlb2YgZWZmZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFyIGNsZWFudXBGbiA9IGVmZmVjdCh7XG4gICAgICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlLFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdmFyIG5vb3BGbiA9IGZ1bmN0aW9uIG5vb3BGbigpIHt9O1xuXG4gICAgICAgICAgZWZmZWN0Q2xlYW51cEZucy5wdXNoKGNsZWFudXBGbiB8fCBub29wRm4pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhbnVwTW9kaWZpZXJFZmZlY3RzKCkge1xuICAgICAgZWZmZWN0Q2xlYW51cEZucy5mb3JFYWNoKGZ1bmN0aW9uIChmbikge1xuICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgIH0pO1xuICAgICAgZWZmZWN0Q2xlYW51cEZucyA9IFtdO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfTtcbn1cbmV4cG9ydCB2YXIgY3JlYXRlUG9wcGVyID0gLyojX19QVVJFX18qL3BvcHBlckdlbmVyYXRvcigpOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGRldGVjdE92ZXJmbG93IH07IiwgImltcG9ydCB7IHBvcHBlckdlbmVyYXRvciwgZGV0ZWN0T3ZlcmZsb3cgfSBmcm9tIFwiLi9jcmVhdGVQb3BwZXIuanNcIjtcbmltcG9ydCBldmVudExpc3RlbmVycyBmcm9tIFwiLi9tb2RpZmllcnMvZXZlbnRMaXN0ZW5lcnMuanNcIjtcbmltcG9ydCBwb3BwZXJPZmZzZXRzIGZyb20gXCIuL21vZGlmaWVycy9wb3BwZXJPZmZzZXRzLmpzXCI7XG5pbXBvcnQgY29tcHV0ZVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvY29tcHV0ZVN0eWxlcy5qc1wiO1xuaW1wb3J0IGFwcGx5U3R5bGVzIGZyb20gXCIuL21vZGlmaWVycy9hcHBseVN0eWxlcy5qc1wiO1xudmFyIGRlZmF1bHRNb2RpZmllcnMgPSBbZXZlbnRMaXN0ZW5lcnMsIHBvcHBlck9mZnNldHMsIGNvbXB1dGVTdHlsZXMsIGFwcGx5U3R5bGVzXTtcbnZhciBjcmVhdGVQb3BwZXIgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKHtcbiAgZGVmYXVsdE1vZGlmaWVyczogZGVmYXVsdE1vZGlmaWVyc1xufSk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgY3JlYXRlUG9wcGVyLCBwb3BwZXJHZW5lcmF0b3IsIGRlZmF1bHRNb2RpZmllcnMsIGRldGVjdE92ZXJmbG93IH07IiwgImltcG9ydCB7IHBvcHBlckdlbmVyYXRvciwgZGV0ZWN0T3ZlcmZsb3cgfSBmcm9tIFwiLi9jcmVhdGVQb3BwZXIuanNcIjtcbmltcG9ydCBldmVudExpc3RlbmVycyBmcm9tIFwiLi9tb2RpZmllcnMvZXZlbnRMaXN0ZW5lcnMuanNcIjtcbmltcG9ydCBwb3BwZXJPZmZzZXRzIGZyb20gXCIuL21vZGlmaWVycy9wb3BwZXJPZmZzZXRzLmpzXCI7XG5pbXBvcnQgY29tcHV0ZVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvY29tcHV0ZVN0eWxlcy5qc1wiO1xuaW1wb3J0IGFwcGx5U3R5bGVzIGZyb20gXCIuL21vZGlmaWVycy9hcHBseVN0eWxlcy5qc1wiO1xuaW1wb3J0IG9mZnNldCBmcm9tIFwiLi9tb2RpZmllcnMvb2Zmc2V0LmpzXCI7XG5pbXBvcnQgZmxpcCBmcm9tIFwiLi9tb2RpZmllcnMvZmxpcC5qc1wiO1xuaW1wb3J0IHByZXZlbnRPdmVyZmxvdyBmcm9tIFwiLi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgYXJyb3cgZnJvbSBcIi4vbW9kaWZpZXJzL2Fycm93LmpzXCI7XG5pbXBvcnQgaGlkZSBmcm9tIFwiLi9tb2RpZmllcnMvaGlkZS5qc1wiO1xudmFyIGRlZmF1bHRNb2RpZmllcnMgPSBbZXZlbnRMaXN0ZW5lcnMsIHBvcHBlck9mZnNldHMsIGNvbXB1dGVTdHlsZXMsIGFwcGx5U3R5bGVzLCBvZmZzZXQsIGZsaXAsIHByZXZlbnRPdmVyZmxvdywgYXJyb3csIGhpZGVdO1xudmFyIGNyZWF0ZVBvcHBlciA9IC8qI19fUFVSRV9fKi9wb3BwZXJHZW5lcmF0b3Ioe1xuICBkZWZhdWx0TW9kaWZpZXJzOiBkZWZhdWx0TW9kaWZpZXJzXG59KTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIsIHBvcHBlckdlbmVyYXRvciwgZGVmYXVsdE1vZGlmaWVycywgZGV0ZWN0T3ZlcmZsb3cgfTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIgYXMgY3JlYXRlUG9wcGVyTGl0ZSB9IGZyb20gXCIuL3BvcHBlci1saXRlLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0ICogZnJvbSBcIi4vbW9kaWZpZXJzL2luZGV4LmpzXCI7IiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMS4zKTogdXRpbC9pbmRleC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmNvbnN0IE1BWF9VSUQgPSAxMDAwMDAwXG5jb25zdCBNSUxMSVNFQ09ORFNfTVVMVElQTElFUiA9IDEwMDBcbmNvbnN0IFRSQU5TSVRJT05fRU5EID0gJ3RyYW5zaXRpb25lbmQnXG5cbi8vIFNob3V0b3V0IEFuZ3VzQ3JvbGwgKGh0dHBzOi8vZ29vLmdsL3B4d1FHcClcbmNvbnN0IHRvVHlwZSA9IG9iaiA9PiB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gYCR7b2JqfWBcbiAgfVxuXG4gIHJldHVybiB7fS50b1N0cmluZy5jYWxsKG9iaikubWF0Y2goL1xccyhbYS16XSspL2kpWzFdLnRvTG93ZXJDYXNlKClcbn1cblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogUHVibGljIFV0aWwgQXBpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmNvbnN0IGdldFVJRCA9IHByZWZpeCA9PiB7XG4gIGRvIHtcbiAgICBwcmVmaXggKz0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogTUFYX1VJRClcbiAgfSB3aGlsZSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocHJlZml4KSlcblxuICByZXR1cm4gcHJlZml4XG59XG5cbmNvbnN0IGdldFNlbGVjdG9yID0gZWxlbWVudCA9PiB7XG4gIGxldCBzZWxlY3RvciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLXRhcmdldCcpXG5cbiAgaWYgKCFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gJyMnKSB7XG4gICAgbGV0IGhyZWZBdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKVxuXG4gICAgLy8gVGhlIG9ubHkgdmFsaWQgY29udGVudCB0aGF0IGNvdWxkIGRvdWJsZSBhcyBhIHNlbGVjdG9yIGFyZSBJRHMgb3IgY2xhc3NlcyxcbiAgICAvLyBzbyBldmVyeXRoaW5nIHN0YXJ0aW5nIHdpdGggYCNgIG9yIGAuYC4gSWYgYSBcInJlYWxcIiBVUkwgaXMgdXNlZCBhcyB0aGUgc2VsZWN0b3IsXG4gICAgLy8gYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JgIHdpbGwgcmlnaHRmdWxseSBjb21wbGFpbiBpdCBpcyBpbnZhbGlkLlxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzMyMjczXG4gICAgaWYgKCFocmVmQXR0ciB8fCAoIWhyZWZBdHRyLmluY2x1ZGVzKCcjJykgJiYgIWhyZWZBdHRyLnN0YXJ0c1dpdGgoJy4nKSkpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgLy8gSnVzdCBpbiBjYXNlIHNvbWUgQ01TIHB1dHMgb3V0IGEgZnVsbCBVUkwgd2l0aCB0aGUgYW5jaG9yIGFwcGVuZGVkXG4gICAgaWYgKGhyZWZBdHRyLmluY2x1ZGVzKCcjJykgJiYgIWhyZWZBdHRyLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgaHJlZkF0dHIgPSBgIyR7aHJlZkF0dHIuc3BsaXQoJyMnKVsxXX1gXG4gICAgfVxuXG4gICAgc2VsZWN0b3IgPSBocmVmQXR0ciAmJiBocmVmQXR0ciAhPT0gJyMnID8gaHJlZkF0dHIudHJpbSgpIDogbnVsbFxuICB9XG5cbiAgcmV0dXJuIHNlbGVjdG9yXG59XG5cbmNvbnN0IGdldFNlbGVjdG9yRnJvbUVsZW1lbnQgPSBlbGVtZW50ID0+IHtcbiAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KVxuXG4gIGlmIChzZWxlY3Rvcikge1xuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSA/IHNlbGVjdG9yIDogbnVsbFxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuY29uc3QgZ2V0RWxlbWVudEZyb21TZWxlY3RvciA9IGVsZW1lbnQgPT4ge1xuICBjb25zdCBzZWxlY3RvciA9IGdldFNlbGVjdG9yKGVsZW1lbnQpXG5cbiAgcmV0dXJuIHNlbGVjdG9yID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgOiBudWxsXG59XG5cbmNvbnN0IGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50ID0gZWxlbWVudCA9PiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiAwXG4gIH1cblxuICAvLyBHZXQgdHJhbnNpdGlvbi1kdXJhdGlvbiBvZiB0aGUgZWxlbWVudFxuICBsZXQgeyB0cmFuc2l0aW9uRHVyYXRpb24sIHRyYW5zaXRpb25EZWxheSB9ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcblxuICBjb25zdCBmbG9hdFRyYW5zaXRpb25EdXJhdGlvbiA9IE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EdXJhdGlvbilcbiAgY29uc3QgZmxvYXRUcmFuc2l0aW9uRGVsYXkgPSBOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRGVsYXkpXG5cbiAgLy8gUmV0dXJuIDAgaWYgZWxlbWVudCBvciB0cmFuc2l0aW9uIGR1cmF0aW9uIGlzIG5vdCBmb3VuZFxuICBpZiAoIWZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uICYmICFmbG9hdFRyYW5zaXRpb25EZWxheSkge1xuICAgIHJldHVybiAwXG4gIH1cblxuICAvLyBJZiBtdWx0aXBsZSBkdXJhdGlvbnMgYXJlIGRlZmluZWQsIHRha2UgdGhlIGZpcnN0XG4gIHRyYW5zaXRpb25EdXJhdGlvbiA9IHRyYW5zaXRpb25EdXJhdGlvbi5zcGxpdCgnLCcpWzBdXG4gIHRyYW5zaXRpb25EZWxheSA9IHRyYW5zaXRpb25EZWxheS5zcGxpdCgnLCcpWzBdXG5cbiAgcmV0dXJuIChOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRHVyYXRpb24pICsgTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkRlbGF5KSkgKiBNSUxMSVNFQ09ORFNfTVVMVElQTElFUlxufVxuXG5jb25zdCB0cmlnZ2VyVHJhbnNpdGlvbkVuZCA9IGVsZW1lbnQgPT4ge1xuICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFRSQU5TSVRJT05fRU5EKSlcbn1cblxuY29uc3QgaXNFbGVtZW50ID0gb2JqID0+IHtcbiAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqLmpxdWVyeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvYmogPSBvYmpbMF1cbiAgfVxuXG4gIHJldHVybiB0eXBlb2Ygb2JqLm5vZGVUeXBlICE9PSAndW5kZWZpbmVkJ1xufVxuXG5jb25zdCBnZXRFbGVtZW50ID0gb2JqID0+IHtcbiAgaWYgKGlzRWxlbWVudChvYmopKSB7IC8vIGl0J3MgYSBqUXVlcnkgb2JqZWN0IG9yIGEgbm9kZSBlbGVtZW50XG4gICAgcmV0dXJuIG9iai5qcXVlcnkgPyBvYmpbMF0gOiBvYmpcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyAmJiBvYmoubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG9iailcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmNvbnN0IHR5cGVDaGVja0NvbmZpZyA9IChjb21wb25lbnROYW1lLCBjb25maWcsIGNvbmZpZ1R5cGVzKSA9PiB7XG4gIE9iamVjdC5rZXlzKGNvbmZpZ1R5cGVzKS5mb3JFYWNoKHByb3BlcnR5ID0+IHtcbiAgICBjb25zdCBleHBlY3RlZFR5cGVzID0gY29uZmlnVHlwZXNbcHJvcGVydHldXG4gICAgY29uc3QgdmFsdWUgPSBjb25maWdbcHJvcGVydHldXG4gICAgY29uc3QgdmFsdWVUeXBlID0gdmFsdWUgJiYgaXNFbGVtZW50KHZhbHVlKSA/ICdlbGVtZW50JyA6IHRvVHlwZSh2YWx1ZSlcblxuICAgIGlmICghbmV3IFJlZ0V4cChleHBlY3RlZFR5cGVzKS50ZXN0KHZhbHVlVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGAke2NvbXBvbmVudE5hbWUudG9VcHBlckNhc2UoKX06IE9wdGlvbiBcIiR7cHJvcGVydHl9XCIgcHJvdmlkZWQgdHlwZSBcIiR7dmFsdWVUeXBlfVwiIGJ1dCBleHBlY3RlZCB0eXBlIFwiJHtleHBlY3RlZFR5cGVzfVwiLmBcbiAgICAgIClcbiAgICB9XG4gIH0pXG59XG5cbmNvbnN0IGlzVmlzaWJsZSA9IGVsZW1lbnQgPT4ge1xuICBpZiAoIWlzRWxlbWVudChlbGVtZW50KSB8fCBlbGVtZW50LmdldENsaWVudFJlY3RzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCd2aXNpYmlsaXR5JykgPT09ICd2aXNpYmxlJ1xufVxuXG5jb25zdCBpc0Rpc2FibGVkID0gZWxlbWVudCA9PiB7XG4gIGlmICghZWxlbWVudCB8fCBlbGVtZW50Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc2FibGVkJykpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiBlbGVtZW50LmRpc2FibGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBlbGVtZW50LmRpc2FibGVkXG4gIH1cblxuICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgIT09ICdmYWxzZSdcbn1cblxuY29uc3QgZmluZFNoYWRvd1Jvb3QgPSBlbGVtZW50ID0+IHtcbiAgaWYgKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXR0YWNoU2hhZG93KSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIENhbiBmaW5kIHRoZSBzaGFkb3cgcm9vdCBvdGhlcndpc2UgaXQnbGwgcmV0dXJuIHRoZSBkb2N1bWVudFxuICBpZiAodHlwZW9mIGVsZW1lbnQuZ2V0Um9vdE5vZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCByb290ID0gZWxlbWVudC5nZXRSb290Tm9kZSgpXG4gICAgcmV0dXJuIHJvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290ID8gcm9vdCA6IG51bGxcbiAgfVxuXG4gIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgIHJldHVybiBlbGVtZW50XG4gIH1cblxuICAvLyB3aGVuIHdlIGRvbid0IGZpbmQgYSBzaGFkb3cgcm9vdFxuICBpZiAoIWVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4gZmluZFNoYWRvd1Jvb3QoZWxlbWVudC5wYXJlbnROb2RlKVxufVxuXG5jb25zdCBub29wID0gKCkgPT4ge31cblxuLyoqXG4gKiBUcmljayB0byByZXN0YXJ0IGFuIGVsZW1lbnQncyBhbmltYXRpb25cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJuIHZvaWRcbiAqXG4gKiBAc2VlIGh0dHBzOi8vd3d3LmNoYXJpc3RoZW8uaW8vYmxvZy8yMDIxLzAyL3Jlc3RhcnQtYS1jc3MtYW5pbWF0aW9uLXdpdGgtamF2YXNjcmlwdC8jcmVzdGFydGluZy1hLWNzcy1hbmltYXRpb25cbiAqL1xuY29uc3QgcmVmbG93ID0gZWxlbWVudCA9PiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcbiAgZWxlbWVudC5vZmZzZXRIZWlnaHRcbn1cblxuY29uc3QgZ2V0alF1ZXJ5ID0gKCkgPT4ge1xuICBjb25zdCB7IGpRdWVyeSB9ID0gd2luZG93XG5cbiAgaWYgKGpRdWVyeSAmJiAhZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoJ2RhdGEtYnMtbm8tanF1ZXJ5JykpIHtcbiAgICByZXR1cm4galF1ZXJ5XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5jb25zdCBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzID0gW11cblxuY29uc3Qgb25ET01Db250ZW50TG9hZGVkID0gY2FsbGJhY2sgPT4ge1xuICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgLy8gYWRkIGxpc3RlbmVyIG9uIHRoZSBmaXJzdCBjYWxsIHdoZW4gdGhlIGRvY3VtZW50IGlzIGluIGxvYWRpbmcgc3RhdGVcbiAgICBpZiAoIURPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuICAgICAgICBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzLmZvckVhY2goY2FsbGJhY2sgPT4gY2FsbGJhY2soKSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgRE9NQ29udGVudExvYWRlZENhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKVxuICB9IGVsc2Uge1xuICAgIGNhbGxiYWNrKClcbiAgfVxufVxuXG5jb25zdCBpc1JUTCA9ICgpID0+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kaXIgPT09ICdydGwnXG5cbmNvbnN0IGRlZmluZUpRdWVyeVBsdWdpbiA9IHBsdWdpbiA9PiB7XG4gIG9uRE9NQ29udGVudExvYWRlZCgoKSA9PiB7XG4gICAgY29uc3QgJCA9IGdldGpRdWVyeSgpXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCQpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBwbHVnaW4uTkFNRVxuICAgICAgY29uc3QgSlFVRVJZX05PX0NPTkZMSUNUID0gJC5mbltuYW1lXVxuICAgICAgJC5mbltuYW1lXSA9IHBsdWdpbi5qUXVlcnlJbnRlcmZhY2VcbiAgICAgICQuZm5bbmFtZV0uQ29uc3RydWN0b3IgPSBwbHVnaW5cbiAgICAgICQuZm5bbmFtZV0ubm9Db25mbGljdCA9ICgpID0+IHtcbiAgICAgICAgJC5mbltuYW1lXSA9IEpRVUVSWV9OT19DT05GTElDVFxuICAgICAgICByZXR1cm4gcGx1Z2luLmpRdWVyeUludGVyZmFjZVxuICAgICAgfVxuICAgIH1cbiAgfSlcbn1cblxuY29uc3QgZXhlY3V0ZSA9IGNhbGxiYWNrID0+IHtcbiAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrKClcbiAgfVxufVxuXG5jb25zdCBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uID0gKGNhbGxiYWNrLCB0cmFuc2l0aW9uRWxlbWVudCwgd2FpdEZvclRyYW5zaXRpb24gPSB0cnVlKSA9PiB7XG4gIGlmICghd2FpdEZvclRyYW5zaXRpb24pIHtcbiAgICBleGVjdXRlKGNhbGxiYWNrKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgZHVyYXRpb25QYWRkaW5nID0gNVxuICBjb25zdCBlbXVsYXRlZER1cmF0aW9uID0gZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodHJhbnNpdGlvbkVsZW1lbnQpICsgZHVyYXRpb25QYWRkaW5nXG5cbiAgbGV0IGNhbGxlZCA9IGZhbHNlXG5cbiAgY29uc3QgaGFuZGxlciA9ICh7IHRhcmdldCB9KSA9PiB7XG4gICAgaWYgKHRhcmdldCAhPT0gdHJhbnNpdGlvbkVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNhbGxlZCA9IHRydWVcbiAgICB0cmFuc2l0aW9uRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFRSQU5TSVRJT05fRU5ELCBoYW5kbGVyKVxuICAgIGV4ZWN1dGUoY2FsbGJhY2spXG4gIH1cblxuICB0cmFuc2l0aW9uRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFRSQU5TSVRJT05fRU5ELCBoYW5kbGVyKVxuICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgdHJpZ2dlclRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkVsZW1lbnQpXG4gICAgfVxuICB9LCBlbXVsYXRlZER1cmF0aW9uKVxufVxuXG4vKipcbiAqIFJldHVybiB0aGUgcHJldmlvdXMvbmV4dCBlbGVtZW50IG9mIGEgbGlzdC5cbiAqXG4gKiBAcGFyYW0ge2FycmF5fSBsaXN0ICAgIFRoZSBsaXN0IG9mIGVsZW1lbnRzXG4gKiBAcGFyYW0gYWN0aXZlRWxlbWVudCAgIFRoZSBhY3RpdmUgZWxlbWVudFxuICogQHBhcmFtIHNob3VsZEdldE5leHQgICBDaG9vc2UgdG8gZ2V0IG5leHQgb3IgcHJldmlvdXMgZWxlbWVudFxuICogQHBhcmFtIGlzQ3ljbGVBbGxvd2VkXG4gKiBAcmV0dXJuIHtFbGVtZW50fGVsZW19IFRoZSBwcm9wZXIgZWxlbWVudFxuICovXG5jb25zdCBnZXROZXh0QWN0aXZlRWxlbWVudCA9IChsaXN0LCBhY3RpdmVFbGVtZW50LCBzaG91bGRHZXROZXh0LCBpc0N5Y2xlQWxsb3dlZCkgPT4ge1xuICBsZXQgaW5kZXggPSBsaXN0LmluZGV4T2YoYWN0aXZlRWxlbWVudClcblxuICAvLyBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbGlzdCByZXR1cm4gYW4gZWxlbWVudCBkZXBlbmRpbmcgb24gdGhlIGRpcmVjdGlvbiBhbmQgaWYgY3ljbGUgaXMgYWxsb3dlZFxuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIGxpc3RbIXNob3VsZEdldE5leHQgJiYgaXNDeWNsZUFsbG93ZWQgPyBsaXN0Lmxlbmd0aCAtIDEgOiAwXVxuICB9XG5cbiAgY29uc3QgbGlzdExlbmd0aCA9IGxpc3QubGVuZ3RoXG5cbiAgaW5kZXggKz0gc2hvdWxkR2V0TmV4dCA/IDEgOiAtMVxuXG4gIGlmIChpc0N5Y2xlQWxsb3dlZCkge1xuICAgIGluZGV4ID0gKGluZGV4ICsgbGlzdExlbmd0aCkgJSBsaXN0TGVuZ3RoXG4gIH1cblxuICByZXR1cm4gbGlzdFtNYXRoLm1heCgwLCBNYXRoLm1pbihpbmRleCwgbGlzdExlbmd0aCAtIDEpKV1cbn1cblxuZXhwb3J0IHtcbiAgZ2V0RWxlbWVudCxcbiAgZ2V0VUlELFxuICBnZXRTZWxlY3RvckZyb21FbGVtZW50LFxuICBnZXRFbGVtZW50RnJvbVNlbGVjdG9yLFxuICBnZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCxcbiAgdHJpZ2dlclRyYW5zaXRpb25FbmQsXG4gIGlzRWxlbWVudCxcbiAgdHlwZUNoZWNrQ29uZmlnLFxuICBpc1Zpc2libGUsXG4gIGlzRGlzYWJsZWQsXG4gIGZpbmRTaGFkb3dSb290LFxuICBub29wLFxuICBnZXROZXh0QWN0aXZlRWxlbWVudCxcbiAgcmVmbG93LFxuICBnZXRqUXVlcnksXG4gIG9uRE9NQ29udGVudExvYWRlZCxcbiAgaXNSVEwsXG4gIGRlZmluZUpRdWVyeVBsdWdpbixcbiAgZXhlY3V0ZSxcbiAgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvblxufVxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMS4zKTogZG9tL2V2ZW50LWhhbmRsZXIuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgeyBnZXRqUXVlcnkgfSBmcm9tICcuLi91dGlsL2luZGV4J1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29uc3RhbnRzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jb25zdCBuYW1lc3BhY2VSZWdleCA9IC9bXi5dKig/PVxcLi4qKVxcLnwuKi9cbmNvbnN0IHN0cmlwTmFtZVJlZ2V4ID0gL1xcLi4qL1xuY29uc3Qgc3RyaXBVaWRSZWdleCA9IC86OlxcZCskL1xuY29uc3QgZXZlbnRSZWdpc3RyeSA9IHt9IC8vIEV2ZW50cyBzdG9yYWdlXG5sZXQgdWlkRXZlbnQgPSAxXG5jb25zdCBjdXN0b21FdmVudHMgPSB7XG4gIG1vdXNlZW50ZXI6ICdtb3VzZW92ZXInLFxuICBtb3VzZWxlYXZlOiAnbW91c2VvdXQnXG59XG5jb25zdCBjdXN0b21FdmVudHNSZWdleCA9IC9eKG1vdXNlZW50ZXJ8bW91c2VsZWF2ZSkvaVxuY29uc3QgbmF0aXZlRXZlbnRzID0gbmV3IFNldChbXG4gICdjbGljaycsXG4gICdkYmxjbGljaycsXG4gICdtb3VzZXVwJyxcbiAgJ21vdXNlZG93bicsXG4gICdjb250ZXh0bWVudScsXG4gICdtb3VzZXdoZWVsJyxcbiAgJ0RPTU1vdXNlU2Nyb2xsJyxcbiAgJ21vdXNlb3ZlcicsXG4gICdtb3VzZW91dCcsXG4gICdtb3VzZW1vdmUnLFxuICAnc2VsZWN0c3RhcnQnLFxuICAnc2VsZWN0ZW5kJyxcbiAgJ2tleWRvd24nLFxuICAna2V5cHJlc3MnLFxuICAna2V5dXAnLFxuICAnb3JpZW50YXRpb25jaGFuZ2UnLFxuICAndG91Y2hzdGFydCcsXG4gICd0b3VjaG1vdmUnLFxuICAndG91Y2hlbmQnLFxuICAndG91Y2hjYW5jZWwnLFxuICAncG9pbnRlcmRvd24nLFxuICAncG9pbnRlcm1vdmUnLFxuICAncG9pbnRlcnVwJyxcbiAgJ3BvaW50ZXJsZWF2ZScsXG4gICdwb2ludGVyY2FuY2VsJyxcbiAgJ2dlc3R1cmVzdGFydCcsXG4gICdnZXN0dXJlY2hhbmdlJyxcbiAgJ2dlc3R1cmVlbmQnLFxuICAnZm9jdXMnLFxuICAnYmx1cicsXG4gICdjaGFuZ2UnLFxuICAncmVzZXQnLFxuICAnc2VsZWN0JyxcbiAgJ3N1Ym1pdCcsXG4gICdmb2N1c2luJyxcbiAgJ2ZvY3Vzb3V0JyxcbiAgJ2xvYWQnLFxuICAndW5sb2FkJyxcbiAgJ2JlZm9yZXVubG9hZCcsXG4gICdyZXNpemUnLFxuICAnbW92ZScsXG4gICdET01Db250ZW50TG9hZGVkJyxcbiAgJ3JlYWR5c3RhdGVjaGFuZ2UnLFxuICAnZXJyb3InLFxuICAnYWJvcnQnLFxuICAnc2Nyb2xsJ1xuXSlcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFByaXZhdGUgbWV0aG9kc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuZnVuY3Rpb24gZ2V0VWlkRXZlbnQoZWxlbWVudCwgdWlkKSB7XG4gIHJldHVybiAodWlkICYmIGAke3VpZH06OiR7dWlkRXZlbnQrK31gKSB8fCBlbGVtZW50LnVpZEV2ZW50IHx8IHVpZEV2ZW50Kytcbn1cblxuZnVuY3Rpb24gZ2V0RXZlbnQoZWxlbWVudCkge1xuICBjb25zdCB1aWQgPSBnZXRVaWRFdmVudChlbGVtZW50KVxuXG4gIGVsZW1lbnQudWlkRXZlbnQgPSB1aWRcbiAgZXZlbnRSZWdpc3RyeVt1aWRdID0gZXZlbnRSZWdpc3RyeVt1aWRdIHx8IHt9XG5cbiAgcmV0dXJuIGV2ZW50UmVnaXN0cnlbdWlkXVxufVxuXG5mdW5jdGlvbiBib290c3RyYXBIYW5kbGVyKGVsZW1lbnQsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7XG4gICAgZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSBlbGVtZW50XG5cbiAgICBpZiAoaGFuZGxlci5vbmVPZmYpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgZXZlbnQudHlwZSwgZm4pXG4gICAgfVxuXG4gICAgcmV0dXJuIGZuLmFwcGx5KGVsZW1lbnQsIFtldmVudF0pXG4gIH1cbn1cblxuZnVuY3Rpb24gYm9vdHN0cmFwRGVsZWdhdGlvbkhhbmRsZXIoZWxlbWVudCwgc2VsZWN0b3IsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7XG4gICAgY29uc3QgZG9tRWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG5cbiAgICBmb3IgKGxldCB7IHRhcmdldCB9ID0gZXZlbnQ7IHRhcmdldCAmJiB0YXJnZXQgIT09IHRoaXM7IHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlKSB7XG4gICAgICBmb3IgKGxldCBpID0gZG9tRWxlbWVudHMubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgIGlmIChkb21FbGVtZW50c1tpXSA9PT0gdGFyZ2V0KSB7XG4gICAgICAgICAgZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSB0YXJnZXRcblxuICAgICAgICAgIGlmIChoYW5kbGVyLm9uZU9mZikge1xuICAgICAgICAgICAgRXZlbnRIYW5kbGVyLm9mZihlbGVtZW50LCBldmVudC50eXBlLCBzZWxlY3RvciwgZm4pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRhcmdldCwgW2V2ZW50XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRvIHBsZWFzZSBFU0xpbnRcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRIYW5kbGVyKGV2ZW50cywgaGFuZGxlciwgZGVsZWdhdGlvblNlbGVjdG9yID0gbnVsbCkge1xuICBjb25zdCB1aWRFdmVudExpc3QgPSBPYmplY3Qua2V5cyhldmVudHMpXG5cbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHVpZEV2ZW50TGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IGV2ZW50ID0gZXZlbnRzW3VpZEV2ZW50TGlzdFtpXV1cblxuICAgIGlmIChldmVudC5vcmlnaW5hbEhhbmRsZXIgPT09IGhhbmRsZXIgJiYgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yID09PSBkZWxlZ2F0aW9uU2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiBldmVudFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhcmFtcyhvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZuKSB7XG4gIGNvbnN0IGRlbGVnYXRpb24gPSB0eXBlb2YgaGFuZGxlciA9PT0gJ3N0cmluZydcbiAgY29uc3Qgb3JpZ2luYWxIYW5kbGVyID0gZGVsZWdhdGlvbiA/IGRlbGVnYXRpb25GbiA6IGhhbmRsZXJcblxuICBsZXQgdHlwZUV2ZW50ID0gZ2V0VHlwZUV2ZW50KG9yaWdpbmFsVHlwZUV2ZW50KVxuICBjb25zdCBpc05hdGl2ZSA9IG5hdGl2ZUV2ZW50cy5oYXModHlwZUV2ZW50KVxuXG4gIGlmICghaXNOYXRpdmUpIHtcbiAgICB0eXBlRXZlbnQgPSBvcmlnaW5hbFR5cGVFdmVudFxuICB9XG5cbiAgcmV0dXJuIFtkZWxlZ2F0aW9uLCBvcmlnaW5hbEhhbmRsZXIsIHR5cGVFdmVudF1cbn1cblxuZnVuY3Rpb24gYWRkSGFuZGxlcihlbGVtZW50LCBvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZuLCBvbmVPZmYpIHtcbiAgaWYgKHR5cGVvZiBvcmlnaW5hbFR5cGVFdmVudCAhPT0gJ3N0cmluZycgfHwgIWVsZW1lbnQpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmICghaGFuZGxlcikge1xuICAgIGhhbmRsZXIgPSBkZWxlZ2F0aW9uRm5cbiAgICBkZWxlZ2F0aW9uRm4gPSBudWxsXG4gIH1cblxuICAvLyBpbiBjYXNlIG9mIG1vdXNlZW50ZXIgb3IgbW91c2VsZWF2ZSB3cmFwIHRoZSBoYW5kbGVyIHdpdGhpbiBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGZvciBpdHMgRE9NIHBvc2l0aW9uXG4gIC8vIHRoaXMgcHJldmVudHMgdGhlIGhhbmRsZXIgZnJvbSBiZWluZyBkaXNwYXRjaGVkIHRoZSBzYW1lIHdheSBhcyBtb3VzZW92ZXIgb3IgbW91c2VvdXQgZG9lc1xuICBpZiAoY3VzdG9tRXZlbnRzUmVnZXgudGVzdChvcmlnaW5hbFR5cGVFdmVudCkpIHtcbiAgICBjb25zdCB3cmFwRm4gPSBmbiA9PiB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmICghZXZlbnQucmVsYXRlZFRhcmdldCB8fCAoZXZlbnQucmVsYXRlZFRhcmdldCAhPT0gZXZlbnQuZGVsZWdhdGVUYXJnZXQgJiYgIWV2ZW50LmRlbGVnYXRlVGFyZ2V0LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKSkge1xuICAgICAgICAgIHJldHVybiBmbi5jYWxsKHRoaXMsIGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRlbGVnYXRpb25Gbikge1xuICAgICAgZGVsZWdhdGlvbkZuID0gd3JhcEZuKGRlbGVnYXRpb25GbilcbiAgICB9IGVsc2Uge1xuICAgICAgaGFuZGxlciA9IHdyYXBGbihoYW5kbGVyKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFtkZWxlZ2F0aW9uLCBvcmlnaW5hbEhhbmRsZXIsIHR5cGVFdmVudF0gPSBub3JtYWxpemVQYXJhbXMob3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GbilcbiAgY29uc3QgZXZlbnRzID0gZ2V0RXZlbnQoZWxlbWVudClcbiAgY29uc3QgaGFuZGxlcnMgPSBldmVudHNbdHlwZUV2ZW50XSB8fCAoZXZlbnRzW3R5cGVFdmVudF0gPSB7fSlcbiAgY29uc3QgcHJldmlvdXNGbiA9IGZpbmRIYW5kbGVyKGhhbmRsZXJzLCBvcmlnaW5hbEhhbmRsZXIsIGRlbGVnYXRpb24gPyBoYW5kbGVyIDogbnVsbClcblxuICBpZiAocHJldmlvdXNGbikge1xuICAgIHByZXZpb3VzRm4ub25lT2ZmID0gcHJldmlvdXNGbi5vbmVPZmYgJiYgb25lT2ZmXG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHVpZCA9IGdldFVpZEV2ZW50KG9yaWdpbmFsSGFuZGxlciwgb3JpZ2luYWxUeXBlRXZlbnQucmVwbGFjZShuYW1lc3BhY2VSZWdleCwgJycpKVxuICBjb25zdCBmbiA9IGRlbGVnYXRpb24gP1xuICAgIGJvb3RzdHJhcERlbGVnYXRpb25IYW5kbGVyKGVsZW1lbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GbikgOlxuICAgIGJvb3RzdHJhcEhhbmRsZXIoZWxlbWVudCwgaGFuZGxlcilcblxuICBmbi5kZWxlZ2F0aW9uU2VsZWN0b3IgPSBkZWxlZ2F0aW9uID8gaGFuZGxlciA6IG51bGxcbiAgZm4ub3JpZ2luYWxIYW5kbGVyID0gb3JpZ2luYWxIYW5kbGVyXG4gIGZuLm9uZU9mZiA9IG9uZU9mZlxuICBmbi51aWRFdmVudCA9IHVpZFxuICBoYW5kbGVyc1t1aWRdID0gZm5cblxuICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZUV2ZW50LCBmbiwgZGVsZWdhdGlvbilcbn1cblxuZnVuY3Rpb24gcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvblNlbGVjdG9yKSB7XG4gIGNvbnN0IGZuID0gZmluZEhhbmRsZXIoZXZlbnRzW3R5cGVFdmVudF0sIGhhbmRsZXIsIGRlbGVnYXRpb25TZWxlY3RvcilcblxuICBpZiAoIWZuKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZUV2ZW50LCBmbiwgQm9vbGVhbihkZWxlZ2F0aW9uU2VsZWN0b3IpKVxuICBkZWxldGUgZXZlbnRzW3R5cGVFdmVudF1bZm4udWlkRXZlbnRdXG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5hbWVzcGFjZWRIYW5kbGVycyhlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgbmFtZXNwYWNlKSB7XG4gIGNvbnN0IHN0b3JlRWxlbWVudEV2ZW50ID0gZXZlbnRzW3R5cGVFdmVudF0gfHwge31cblxuICBPYmplY3Qua2V5cyhzdG9yZUVsZW1lbnRFdmVudCkuZm9yRWFjaChoYW5kbGVyS2V5ID0+IHtcbiAgICBpZiAoaGFuZGxlcktleS5pbmNsdWRlcyhuYW1lc3BhY2UpKSB7XG4gICAgICBjb25zdCBldmVudCA9IHN0b3JlRWxlbWVudEV2ZW50W2hhbmRsZXJLZXldXG5cbiAgICAgIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIGV2ZW50Lm9yaWdpbmFsSGFuZGxlciwgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gZ2V0VHlwZUV2ZW50KGV2ZW50KSB7XG4gIC8vIGFsbG93IHRvIGdldCB0aGUgbmF0aXZlIGV2ZW50cyBmcm9tIG5hbWVzcGFjZWQgZXZlbnRzICgnY2xpY2suYnMuYnV0dG9uJyAtLT4gJ2NsaWNrJylcbiAgZXZlbnQgPSBldmVudC5yZXBsYWNlKHN0cmlwTmFtZVJlZ2V4LCAnJylcbiAgcmV0dXJuIGN1c3RvbUV2ZW50c1tldmVudF0gfHwgZXZlbnRcbn1cblxuY29uc3QgRXZlbnRIYW5kbGVyID0ge1xuICBvbihlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZuKSB7XG4gICAgYWRkSGFuZGxlcihlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZuLCBmYWxzZSlcbiAgfSxcblxuICBvbmUoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25Gbikge1xuICAgIGFkZEhhbmRsZXIoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GbiwgdHJ1ZSlcbiAgfSxcblxuICBvZmYoZWxlbWVudCwgb3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25Gbikge1xuICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxUeXBlRXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBbZGVsZWdhdGlvbiwgb3JpZ2luYWxIYW5kbGVyLCB0eXBlRXZlbnRdID0gbm9ybWFsaXplUGFyYW1zKG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRm4pXG4gICAgY29uc3QgaW5OYW1lc3BhY2UgPSB0eXBlRXZlbnQgIT09IG9yaWdpbmFsVHlwZUV2ZW50XG4gICAgY29uc3QgZXZlbnRzID0gZ2V0RXZlbnQoZWxlbWVudClcbiAgICBjb25zdCBpc05hbWVzcGFjZSA9IG9yaWdpbmFsVHlwZUV2ZW50LnN0YXJ0c1dpdGgoJy4nKVxuXG4gICAgaWYgKHR5cGVvZiBvcmlnaW5hbEhhbmRsZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBTaW1wbGVzdCBjYXNlOiBoYW5kbGVyIGlzIHBhc3NlZCwgcmVtb3ZlIHRoYXQgbGlzdGVuZXIgT05MWS5cbiAgICAgIGlmICghZXZlbnRzIHx8ICFldmVudHNbdHlwZUV2ZW50XSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgb3JpZ2luYWxIYW5kbGVyLCBkZWxlZ2F0aW9uID8gaGFuZGxlciA6IG51bGwpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaXNOYW1lc3BhY2UpIHtcbiAgICAgIE9iamVjdC5rZXlzKGV2ZW50cykuZm9yRWFjaChlbGVtZW50RXZlbnQgPT4ge1xuICAgICAgICByZW1vdmVOYW1lc3BhY2VkSGFuZGxlcnMoZWxlbWVudCwgZXZlbnRzLCBlbGVtZW50RXZlbnQsIG9yaWdpbmFsVHlwZUV2ZW50LnNsaWNlKDEpKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yZUVsZW1lbnRFdmVudCA9IGV2ZW50c1t0eXBlRXZlbnRdIHx8IHt9XG4gICAgT2JqZWN0LmtleXMoc3RvcmVFbGVtZW50RXZlbnQpLmZvckVhY2goa2V5SGFuZGxlcnMgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlcktleSA9IGtleUhhbmRsZXJzLnJlcGxhY2Uoc3RyaXBVaWRSZWdleCwgJycpXG5cbiAgICAgIGlmICghaW5OYW1lc3BhY2UgfHwgb3JpZ2luYWxUeXBlRXZlbnQuaW5jbHVkZXMoaGFuZGxlcktleSkpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBzdG9yZUVsZW1lbnRFdmVudFtrZXlIYW5kbGVyc11cblxuICAgICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBldmVudC5vcmlnaW5hbEhhbmRsZXIsIGV2ZW50LmRlbGVnYXRpb25TZWxlY3RvcilcbiAgICAgIH1cbiAgICB9KVxuICB9LFxuXG4gIHRyaWdnZXIoZWxlbWVudCwgZXZlbnQsIGFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIGV2ZW50ICE9PSAnc3RyaW5nJyB8fCAhZWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBjb25zdCAkID0gZ2V0alF1ZXJ5KClcbiAgICBjb25zdCB0eXBlRXZlbnQgPSBnZXRUeXBlRXZlbnQoZXZlbnQpXG4gICAgY29uc3QgaW5OYW1lc3BhY2UgPSBldmVudCAhPT0gdHlwZUV2ZW50XG4gICAgY29uc3QgaXNOYXRpdmUgPSBuYXRpdmVFdmVudHMuaGFzKHR5cGVFdmVudClcblxuICAgIGxldCBqUXVlcnlFdmVudFxuICAgIGxldCBidWJibGVzID0gdHJ1ZVxuICAgIGxldCBuYXRpdmVEaXNwYXRjaCA9IHRydWVcbiAgICBsZXQgZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlXG4gICAgbGV0IGV2dCA9IG51bGxcblxuICAgIGlmIChpbk5hbWVzcGFjZSAmJiAkKSB7XG4gICAgICBqUXVlcnlFdmVudCA9ICQuRXZlbnQoZXZlbnQsIGFyZ3MpXG5cbiAgICAgICQoZWxlbWVudCkudHJpZ2dlcihqUXVlcnlFdmVudClcbiAgICAgIGJ1YmJsZXMgPSAhalF1ZXJ5RXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKVxuICAgICAgbmF0aXZlRGlzcGF0Y2ggPSAhalF1ZXJ5RXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKVxuICAgICAgZGVmYXVsdFByZXZlbnRlZCA9IGpRdWVyeUV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpXG4gICAgfVxuXG4gICAgaWYgKGlzTmF0aXZlKSB7XG4gICAgICBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnSFRNTEV2ZW50cycpXG4gICAgICBldnQuaW5pdEV2ZW50KHR5cGVFdmVudCwgYnViYmxlcywgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50LCB7XG4gICAgICAgIGJ1YmJsZXMsXG4gICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gbWVyZ2UgY3VzdG9tIGluZm9ybWF0aW9uIGluIG91ciBldmVudFxuICAgIGlmICh0eXBlb2YgYXJncyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIE9iamVjdC5rZXlzKGFyZ3MpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV2dCwga2V5LCB7XG4gICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3Nba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgfVxuXG4gICAgaWYgKG5hdGl2ZURpc3BhdGNoKSB7XG4gICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KVxuICAgIH1cblxuICAgIGlmIChldnQuZGVmYXVsdFByZXZlbnRlZCAmJiB0eXBlb2YgalF1ZXJ5RXZlbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBqUXVlcnlFdmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgfVxuXG4gICAgcmV0dXJuIGV2dFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEV2ZW50SGFuZGxlclxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMS4zKTogZG9tL2RhdGEuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29uc3RhbnRzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jb25zdCBlbGVtZW50TWFwID0gbmV3IE1hcCgpXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc2V0KGVsZW1lbnQsIGtleSwgaW5zdGFuY2UpIHtcbiAgICBpZiAoIWVsZW1lbnRNYXAuaGFzKGVsZW1lbnQpKSB7XG4gICAgICBlbGVtZW50TWFwLnNldChlbGVtZW50LCBuZXcgTWFwKCkpXG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFuY2VNYXAgPSBlbGVtZW50TWFwLmdldChlbGVtZW50KVxuXG4gICAgLy8gbWFrZSBpdCBjbGVhciB3ZSBvbmx5IHdhbnQgb25lIGluc3RhbmNlIHBlciBlbGVtZW50XG4gICAgLy8gY2FuIGJlIHJlbW92ZWQgbGF0ZXIgd2hlbiBtdWx0aXBsZSBrZXkvaW5zdGFuY2VzIGFyZSBmaW5lIHRvIGJlIHVzZWRcbiAgICBpZiAoIWluc3RhbmNlTWFwLmhhcyhrZXkpICYmIGluc3RhbmNlTWFwLnNpemUgIT09IDApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmVycm9yKGBCb290c3RyYXAgZG9lc24ndCBhbGxvdyBtb3JlIHRoYW4gb25lIGluc3RhbmNlIHBlciBlbGVtZW50LiBCb3VuZCBpbnN0YW5jZTogJHtBcnJheS5mcm9tKGluc3RhbmNlTWFwLmtleXMoKSlbMF19LmApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpbnN0YW5jZU1hcC5zZXQoa2V5LCBpbnN0YW5jZSlcbiAgfSxcblxuICBnZXQoZWxlbWVudCwga2V5KSB7XG4gICAgaWYgKGVsZW1lbnRNYXAuaGFzKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gZWxlbWVudE1hcC5nZXQoZWxlbWVudCkuZ2V0KGtleSkgfHwgbnVsbFxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH0sXG5cbiAgcmVtb3ZlKGVsZW1lbnQsIGtleSkge1xuICAgIGlmICghZWxlbWVudE1hcC5oYXMoZWxlbWVudCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbmNlTWFwID0gZWxlbWVudE1hcC5nZXQoZWxlbWVudClcblxuICAgIGluc3RhbmNlTWFwLmRlbGV0ZShrZXkpXG5cbiAgICAvLyBmcmVlIHVwIGVsZW1lbnQgcmVmZXJlbmNlcyBpZiB0aGVyZSBhcmUgbm8gaW5zdGFuY2VzIGxlZnQgZm9yIGFuIGVsZW1lbnRcbiAgICBpZiAoaW5zdGFuY2VNYXAuc2l6ZSA9PT0gMCkge1xuICAgICAgZWxlbWVudE1hcC5kZWxldGUoZWxlbWVudClcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY1LjEuMyk6IGJhc2UtY29tcG9uZW50LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IERhdGEgZnJvbSAnLi9kb20vZGF0YSdcbmltcG9ydCB7XG4gIGV4ZWN1dGVBZnRlclRyYW5zaXRpb24sXG4gIGdldEVsZW1lbnRcbn0gZnJvbSAnLi91dGlsL2luZGV4J1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyJ1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29uc3RhbnRzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jb25zdCBWRVJTSU9OID0gJzUuMS4zJ1xuXG5jbGFzcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCkge1xuICAgIGVsZW1lbnQgPSBnZXRFbGVtZW50KGVsZW1lbnQpXG5cbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50XG4gICAgRGF0YS5zZXQodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSwgdGhpcylcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgRGF0YS5yZW1vdmUodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSlcbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuRVZFTlRfS0VZKVxuXG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykuZm9yRWFjaChwcm9wZXJ0eU5hbWUgPT4ge1xuICAgICAgdGhpc1twcm9wZXJ0eU5hbWVdID0gbnVsbFxuICAgIH0pXG4gIH1cblxuICBfcXVldWVDYWxsYmFjayhjYWxsYmFjaywgZWxlbWVudCwgaXNBbmltYXRlZCA9IHRydWUpIHtcbiAgICBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uKGNhbGxiYWNrLCBlbGVtZW50LCBpc0FuaW1hdGVkKVxuICB9XG5cbiAgLyoqIFN0YXRpYyAqL1xuXG4gIHN0YXRpYyBnZXRJbnN0YW5jZShlbGVtZW50KSB7XG4gICAgcmV0dXJuIERhdGEuZ2V0KGdldEVsZW1lbnQoZWxlbWVudCksIHRoaXMuREFUQV9LRVkpXG4gIH1cblxuICBzdGF0aWMgZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50LCBjb25maWcgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmdldEluc3RhbmNlKGVsZW1lbnQpIHx8IG5ldyB0aGlzKGVsZW1lbnQsIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDogbnVsbClcbiAgfVxuXG4gIHN0YXRpYyBnZXQgVkVSU0lPTigpIHtcbiAgICByZXR1cm4gVkVSU0lPTlxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignWW91IGhhdmUgdG8gaW1wbGVtZW50IHRoZSBzdGF0aWMgbWV0aG9kIFwiTkFNRVwiLCBmb3IgZWFjaCBjb21wb25lbnQhJylcbiAgfVxuXG4gIHN0YXRpYyBnZXQgREFUQV9LRVkoKSB7XG4gICAgcmV0dXJuIGBicy4ke3RoaXMuTkFNRX1gXG4gIH1cblxuICBzdGF0aWMgZ2V0IEVWRU5UX0tFWSgpIHtcbiAgICByZXR1cm4gYC4ke3RoaXMuREFUQV9LRVl9YFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJhc2VDb21wb25lbnRcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY1LjEuMyk6IHV0aWwvY29tcG9uZW50LWZ1bmN0aW9ucy5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi4vZG9tL2V2ZW50LWhhbmRsZXInXG5pbXBvcnQgeyBnZXRFbGVtZW50RnJvbVNlbGVjdG9yLCBpc0Rpc2FibGVkIH0gZnJvbSAnLi9pbmRleCdcblxuY29uc3QgZW5hYmxlRGlzbWlzc1RyaWdnZXIgPSAoY29tcG9uZW50LCBtZXRob2QgPSAnaGlkZScpID0+IHtcbiAgY29uc3QgY2xpY2tFdmVudCA9IGBjbGljay5kaXNtaXNzJHtjb21wb25lbnQuRVZFTlRfS0VZfWBcbiAgY29uc3QgbmFtZSA9IGNvbXBvbmVudC5OQU1FXG5cbiAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBjbGlja0V2ZW50LCBgW2RhdGEtYnMtZGlzbWlzcz1cIiR7bmFtZX1cIl1gLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoWydBJywgJ0FSRUEnXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgfVxuXG4gICAgaWYgKGlzRGlzYWJsZWQodGhpcykpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldCA9IGdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcykgfHwgdGhpcy5jbG9zZXN0KGAuJHtuYW1lfWApXG4gICAgY29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnQuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpXG5cbiAgICAvLyBNZXRob2QgYXJndW1lbnQgaXMgbGVmdCwgZm9yIEFsZXJ0IGFuZCBvbmx5LCBhcyBpdCBkb2Vzbid0IGltcGxlbWVudCB0aGUgJ2hpZGUnIG1ldGhvZFxuICAgIGluc3RhbmNlW21ldGhvZF0oKVxuICB9KVxufVxuXG5leHBvcnQge1xuICBlbmFibGVEaXNtaXNzVHJpZ2dlclxufVxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMS4zKTogYWxlcnQuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgeyBkZWZpbmVKUXVlcnlQbHVnaW4gfSBmcm9tICcuL3V0aWwvaW5kZXgnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXInXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50J1xuaW1wb3J0IHsgZW5hYmxlRGlzbWlzc1RyaWdnZXIgfSBmcm9tICcuL3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucydcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvbnN0YW50c1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuY29uc3QgTkFNRSA9ICdhbGVydCdcbmNvbnN0IERBVEFfS0VZID0gJ2JzLmFsZXJ0J1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcblxuY29uc3QgRVZFTlRfQ0xPU0UgPSBgY2xvc2Uke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9DTE9TRUQgPSBgY2xvc2VkJHtFVkVOVF9LRVl9YFxuY29uc3QgQ0xBU1NfTkFNRV9GQURFID0gJ2ZhZGUnXG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENsYXNzIERlZmluaXRpb25cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmNsYXNzIEFsZXJ0IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIC8vIEdldHRlcnNcblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuXG4gIGNsb3NlKCkge1xuICAgIGNvbnN0IGNsb3NlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9DTE9TRSlcblxuICAgIGlmIChjbG9zZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG5cbiAgICBjb25zdCBpc0FuaW1hdGVkID0gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFKVxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4gdGhpcy5fZGVzdHJveUVsZW1lbnQoKSwgdGhpcy5fZWxlbWVudCwgaXNBbmltYXRlZClcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2Rlc3Ryb3lFbGVtZW50KCkge1xuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKClcbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9DTE9TRUQpXG4gICAgdGhpcy5kaXNwb3NlKClcbiAgfVxuXG4gIC8vIFN0YXRpY1xuXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gQWxlcnQuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXSh0aGlzKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIERhdGEgQXBpIGltcGxlbWVudGF0aW9uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5lbmFibGVEaXNtaXNzVHJpZ2dlcihBbGVydCwgJ2Nsb3NlJylcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIGpRdWVyeVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBhZGQgLkFsZXJ0IHRvIGpRdWVyeSBvbmx5IGlmIGpRdWVyeSBpcyBwcmVzZW50XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKEFsZXJ0KVxuXG5leHBvcnQgZGVmYXVsdCBBbGVydFxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMS4zKTogYnV0dG9uLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IHsgZGVmaW5lSlF1ZXJ5UGx1Z2luIH0gZnJvbSAnLi91dGlsL2luZGV4J1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyJ1xuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudCdcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvbnN0YW50c1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuY29uc3QgTkFNRSA9ICdidXR0b24nXG5jb25zdCBEQVRBX0tFWSA9ICdicy5idXR0b24nXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcblxuY29uc3QgQ0xBU1NfTkFNRV9BQ1RJVkUgPSAnYWN0aXZlJ1xuXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS1icy10b2dnbGU9XCJidXR0b25cIl0nXG5cbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ2xhc3MgRGVmaW5pdGlvblxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuY2xhc3MgQnV0dG9uIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIC8vIEdldHRlcnNcblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuXG4gIHRvZ2dsZSgpIHtcbiAgICAvLyBUb2dnbGUgY2xhc3MgYW5kIHN5bmMgdGhlIGBhcmlhLXByZXNzZWRgIGF0dHJpYnV0ZSB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGAudG9nZ2xlKClgIG1ldGhvZFxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoQ0xBU1NfTkFNRV9BQ1RJVkUpKVxuICB9XG5cbiAgLy8gU3RhdGljXG5cbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBCdXR0b24uZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKVxuXG4gICAgICBpZiAoY29uZmlnID09PSAndG9nZ2xlJykge1xuICAgICAgICBkYXRhW2NvbmZpZ10oKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIERhdGEgQXBpIGltcGxlbWVudGF0aW9uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZXZlbnQgPT4ge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgY29uc3QgYnV0dG9uID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoU0VMRUNUT1JfREFUQV9UT0dHTEUpXG4gIGNvbnN0IGRhdGEgPSBCdXR0b24uZ2V0T3JDcmVhdGVJbnN0YW5jZShidXR0b24pXG5cbiAgZGF0YS50b2dnbGUoKVxufSlcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIGpRdWVyeVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBhZGQgLkJ1dHRvbiB0byBqUXVlcnkgb25seSBpZiBqUXVlcnkgaXMgcHJlc2VudFxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihCdXR0b24pXG5cbmV4cG9ydCBkZWZhdWx0IEJ1dHRvblxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMS4zKTogZG9tL21hbmlwdWxhdG9yLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuZnVuY3Rpb24gbm9ybWFsaXplRGF0YSh2YWwpIHtcbiAgaWYgKHZhbCA9PT0gJ3RydWUnKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmICh2YWwgPT09ICdmYWxzZScpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmICh2YWwgPT09IE51bWJlcih2YWwpLnRvU3RyaW5nKCkpIHtcbiAgICByZXR1cm4gTnVtYmVyKHZhbClcbiAgfVxuXG4gIGlmICh2YWwgPT09ICcnIHx8IHZhbCA9PT0gJ251bGwnKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRGF0YUtleShrZXkpIHtcbiAgcmV0dXJuIGtleS5yZXBsYWNlKC9bQS1aXS9nLCBjaHIgPT4gYC0ke2Noci50b0xvd2VyQ2FzZSgpfWApXG59XG5cbmNvbnN0IE1hbmlwdWxhdG9yID0ge1xuICBzZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIGtleSwgdmFsdWUpIHtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShgZGF0YS1icy0ke25vcm1hbGl6ZURhdGFLZXkoa2V5KX1gLCB2YWx1ZSlcbiAgfSxcblxuICByZW1vdmVEYXRhQXR0cmlidXRlKGVsZW1lbnQsIGtleSkge1xuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWApXG4gIH0sXG5cbiAgZ2V0RGF0YUF0dHJpYnV0ZXMoZWxlbWVudCkge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHt9XG5cbiAgICBPYmplY3Qua2V5cyhlbGVtZW50LmRhdGFzZXQpXG4gICAgICAuZmlsdGVyKGtleSA9PiBrZXkuc3RhcnRzV2l0aCgnYnMnKSlcbiAgICAgIC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGxldCBwdXJlS2V5ID0ga2V5LnJlcGxhY2UoL15icy8sICcnKVxuICAgICAgICBwdXJlS2V5ID0gcHVyZUtleS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHB1cmVLZXkuc2xpY2UoMSwgcHVyZUtleS5sZW5ndGgpXG4gICAgICAgIGF0dHJpYnV0ZXNbcHVyZUtleV0gPSBub3JtYWxpemVEYXRhKGVsZW1lbnQuZGF0YXNldFtrZXldKVxuICAgICAgfSlcblxuICAgIHJldHVybiBhdHRyaWJ1dGVzXG4gIH0sXG5cbiAgZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBrZXkpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplRGF0YShlbGVtZW50LmdldEF0dHJpYnV0ZShgZGF0YS1icy0ke25vcm1hbGl6ZURhdGFLZXkoa2V5KX1gKSlcbiAgfSxcblxuICBvZmZzZXQoZWxlbWVudCkge1xuICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG5cbiAgICByZXR1cm4ge1xuICAgICAgdG9wOiByZWN0LnRvcCArIHdpbmRvdy5wYWdlWU9mZnNldCxcbiAgICAgIGxlZnQ6IHJlY3QubGVmdCArIHdpbmRvdy5wYWdlWE9mZnNldFxuICAgIH1cbiAgfSxcblxuICBwb3NpdGlvbihlbGVtZW50KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvcDogZWxlbWVudC5vZmZzZXRUb3AsXG4gICAgICBsZWZ0OiBlbGVtZW50Lm9mZnNldExlZnRcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWFuaXB1bGF0b3JcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY1LjEuMyk6IGRvbS9zZWxlY3Rvci1lbmdpbmUuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29uc3RhbnRzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgeyBpc0Rpc2FibGVkLCBpc1Zpc2libGUgfSBmcm9tICcuLi91dGlsL2luZGV4J1xuXG5jb25zdCBOT0RFX1RFWFQgPSAzXG5cbmNvbnN0IFNlbGVjdG9yRW5naW5lID0ge1xuICBmaW5kKHNlbGVjdG9yLCBlbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdCguLi5FbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpKVxuICB9LFxuXG4gIGZpbmRPbmUoc2VsZWN0b3IsIGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICByZXR1cm4gRWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3Rvci5jYWxsKGVsZW1lbnQsIHNlbGVjdG9yKVxuICB9LFxuXG4gIGNoaWxkcmVuKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdCguLi5lbGVtZW50LmNoaWxkcmVuKVxuICAgICAgLmZpbHRlcihjaGlsZCA9PiBjaGlsZC5tYXRjaGVzKHNlbGVjdG9yKSlcbiAgfSxcblxuICBwYXJlbnRzKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgY29uc3QgcGFyZW50cyA9IFtdXG5cbiAgICBsZXQgYW5jZXN0b3IgPSBlbGVtZW50LnBhcmVudE5vZGVcblxuICAgIHdoaWxlIChhbmNlc3RvciAmJiBhbmNlc3Rvci5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgYW5jZXN0b3Iubm9kZVR5cGUgIT09IE5PREVfVEVYVCkge1xuICAgICAgaWYgKGFuY2VzdG9yLm1hdGNoZXMoc2VsZWN0b3IpKSB7XG4gICAgICAgIHBhcmVudHMucHVzaChhbmNlc3RvcilcbiAgICAgIH1cblxuICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnROb2RlXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudHNcbiAgfSxcblxuICBwcmV2KGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgbGV0IHByZXZpb3VzID0gZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXG5cbiAgICB3aGlsZSAocHJldmlvdXMpIHtcbiAgICAgIGlmIChwcmV2aW91cy5tYXRjaGVzKHNlbGVjdG9yKSkge1xuICAgICAgICByZXR1cm4gW3ByZXZpb3VzXVxuICAgICAgfVxuXG4gICAgICBwcmV2aW91cyA9IHByZXZpb3VzLnByZXZpb3VzRWxlbWVudFNpYmxpbmdcbiAgICB9XG5cbiAgICByZXR1cm4gW11cbiAgfSxcblxuICBuZXh0KGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgbGV0IG5leHQgPSBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZ1xuXG4gICAgd2hpbGUgKG5leHQpIHtcbiAgICAgIGlmIChuZXh0Lm1hdGNoZXMoc2VsZWN0b3IpKSB7XG4gICAgICAgIHJldHVybiBbbmV4dF1cbiAgICAgIH1cblxuICAgICAgbmV4dCA9IG5leHQubmV4dEVsZW1lbnRTaWJsaW5nXG4gICAgfVxuXG4gICAgcmV0dXJuIFtdXG4gIH0sXG5cbiAgZm9jdXNhYmxlQ2hpbGRyZW4oZWxlbWVudCkge1xuICAgIGNvbnN0IGZvY3VzYWJsZXMgPSBbXG4gICAgICAnYScsXG4gICAgICAnYnV0dG9uJyxcbiAgICAgICdpbnB1dCcsXG4gICAgICAndGV4dGFyZWEnLFxuICAgICAgJ3NlbGVjdCcsXG4gICAgICAnZGV0YWlscycsXG4gICAgICAnW3RhYmluZGV4XScsXG4gICAgICAnW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0nXG4gICAgXS5tYXAoc2VsZWN0b3IgPT4gYCR7c2VsZWN0b3J9Om5vdChbdGFiaW5kZXhePVwiLVwiXSlgKS5qb2luKCcsICcpXG5cbiAgICByZXR1cm4gdGhpcy5maW5kKGZvY3VzYWJsZXMsIGVsZW1lbnQpLmZpbHRlcihlbCA9PiAhaXNEaXNhYmxlZChlbCkgJiYgaXNWaXNpYmxlKGVsKSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTZWxlY3RvckVuZ2luZVxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMS4zKTogY2Fyb3VzZWwuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sXG4gIGdldEVsZW1lbnRGcm9tU2VsZWN0b3IsXG4gIGlzUlRMLFxuICBpc1Zpc2libGUsXG4gIGdldE5leHRBY3RpdmVFbGVtZW50LFxuICByZWZsb3csXG4gIHRyaWdnZXJUcmFuc2l0aW9uRW5kLFxuICB0eXBlQ2hlY2tDb25maWdcbn0gZnJvbSAnLi91dGlsL2luZGV4J1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyJ1xuaW1wb3J0IE1hbmlwdWxhdG9yIGZyb20gJy4vZG9tL21hbmlwdWxhdG9yJ1xuaW1wb3J0IFNlbGVjdG9yRW5naW5lIGZyb20gJy4vZG9tL3NlbGVjdG9yLWVuZ2luZSdcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQnXG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb25zdGFudHNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmNvbnN0IE5BTUUgPSAnY2Fyb3VzZWwnXG5jb25zdCBEQVRBX0tFWSA9ICdicy5jYXJvdXNlbCdcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5jb25zdCBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJ1xuXG5jb25zdCBBUlJPV19MRUZUX0tFWSA9ICdBcnJvd0xlZnQnXG5jb25zdCBBUlJPV19SSUdIVF9LRVkgPSAnQXJyb3dSaWdodCdcbmNvbnN0IFRPVUNIRVZFTlRfQ09NUEFUX1dBSVQgPSA1MDAgLy8gVGltZSBmb3IgbW91c2UgY29tcGF0IGV2ZW50cyB0byBmaXJlIGFmdGVyIHRvdWNoXG5jb25zdCBTV0lQRV9USFJFU0hPTEQgPSA0MFxuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBpbnRlcnZhbDogNTAwMCxcbiAga2V5Ym9hcmQ6IHRydWUsXG4gIHNsaWRlOiBmYWxzZSxcbiAgcGF1c2U6ICdob3ZlcicsXG4gIHdyYXA6IHRydWUsXG4gIHRvdWNoOiB0cnVlXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBpbnRlcnZhbDogJyhudW1iZXJ8Ym9vbGVhbiknLFxuICBrZXlib2FyZDogJ2Jvb2xlYW4nLFxuICBzbGlkZTogJyhib29sZWFufHN0cmluZyknLFxuICBwYXVzZTogJyhzdHJpbmd8Ym9vbGVhbiknLFxuICB3cmFwOiAnYm9vbGVhbicsXG4gIHRvdWNoOiAnYm9vbGVhbidcbn1cblxuY29uc3QgT1JERVJfTkVYVCA9ICduZXh0J1xuY29uc3QgT1JERVJfUFJFViA9ICdwcmV2J1xuY29uc3QgRElSRUNUSU9OX0xFRlQgPSAnbGVmdCdcbmNvbnN0IERJUkVDVElPTl9SSUdIVCA9ICdyaWdodCdcblxuY29uc3QgS0VZX1RPX0RJUkVDVElPTiA9IHtcbiAgW0FSUk9XX0xFRlRfS0VZXTogRElSRUNUSU9OX1JJR0hULFxuICBbQVJST1dfUklHSFRfS0VZXTogRElSRUNUSU9OX0xFRlRcbn1cblxuY29uc3QgRVZFTlRfU0xJREUgPSBgc2xpZGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TTElEID0gYHNsaWQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9LRVlET1dOID0gYGtleWRvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9NT1VTRUVOVEVSID0gYG1vdXNlZW50ZXIke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9NT1VTRUxFQVZFID0gYG1vdXNlbGVhdmUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9UT1VDSFNUQVJUID0gYHRvdWNoc3RhcnQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9UT1VDSE1PVkUgPSBgdG91Y2htb3ZlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfVE9VQ0hFTkQgPSBgdG91Y2hlbmQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9QT0lOVEVSRE9XTiA9IGBwb2ludGVyZG93biR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1BPSU5URVJVUCA9IGBwb2ludGVydXAke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9EUkFHX1NUQVJUID0gYGRyYWdzdGFydCR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0xPQURfREFUQV9BUEkgPSBgbG9hZCR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuXG5jb25zdCBDTEFTU19OQU1FX0NBUk9VU0VMID0gJ2Nhcm91c2VsJ1xuY29uc3QgQ0xBU1NfTkFNRV9BQ1RJVkUgPSAnYWN0aXZlJ1xuY29uc3QgQ0xBU1NfTkFNRV9TTElERSA9ICdzbGlkZSdcbmNvbnN0IENMQVNTX05BTUVfRU5EID0gJ2Nhcm91c2VsLWl0ZW0tZW5kJ1xuY29uc3QgQ0xBU1NfTkFNRV9TVEFSVCA9ICdjYXJvdXNlbC1pdGVtLXN0YXJ0J1xuY29uc3QgQ0xBU1NfTkFNRV9ORVhUID0gJ2Nhcm91c2VsLWl0ZW0tbmV4dCdcbmNvbnN0IENMQVNTX05BTUVfUFJFViA9ICdjYXJvdXNlbC1pdGVtLXByZXYnXG5jb25zdCBDTEFTU19OQU1FX1BPSU5URVJfRVZFTlQgPSAncG9pbnRlci1ldmVudCdcblxuY29uc3QgU0VMRUNUT1JfQUNUSVZFID0gJy5hY3RpdmUnXG5jb25zdCBTRUxFQ1RPUl9BQ1RJVkVfSVRFTSA9ICcuYWN0aXZlLmNhcm91c2VsLWl0ZW0nXG5jb25zdCBTRUxFQ1RPUl9JVEVNID0gJy5jYXJvdXNlbC1pdGVtJ1xuY29uc3QgU0VMRUNUT1JfSVRFTV9JTUcgPSAnLmNhcm91c2VsLWl0ZW0gaW1nJ1xuY29uc3QgU0VMRUNUT1JfTkVYVF9QUkVWID0gJy5jYXJvdXNlbC1pdGVtLW5leHQsIC5jYXJvdXNlbC1pdGVtLXByZXYnXG5jb25zdCBTRUxFQ1RPUl9JTkRJQ0FUT1JTID0gJy5jYXJvdXNlbC1pbmRpY2F0b3JzJ1xuY29uc3QgU0VMRUNUT1JfSU5ESUNBVE9SID0gJ1tkYXRhLWJzLXRhcmdldF0nXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1NMSURFID0gJ1tkYXRhLWJzLXNsaWRlXSwgW2RhdGEtYnMtc2xpZGUtdG9dJ1xuY29uc3QgU0VMRUNUT1JfREFUQV9SSURFID0gJ1tkYXRhLWJzLXJpZGU9XCJjYXJvdXNlbFwiXSdcblxuY29uc3QgUE9JTlRFUl9UWVBFX1RPVUNIID0gJ3RvdWNoJ1xuY29uc3QgUE9JTlRFUl9UWVBFX1BFTiA9ICdwZW4nXG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDbGFzcyBEZWZpbml0aW9uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuY2xhc3MgQ2Fyb3VzZWwgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudClcblxuICAgIHRoaXMuX2l0ZW1zID0gbnVsbFxuICAgIHRoaXMuX2ludGVydmFsID0gbnVsbFxuICAgIHRoaXMuX2FjdGl2ZUVsZW1lbnQgPSBudWxsXG4gICAgdGhpcy5faXNQYXVzZWQgPSBmYWxzZVxuICAgIHRoaXMuX2lzU2xpZGluZyA9IGZhbHNlXG4gICAgdGhpcy50b3VjaFRpbWVvdXQgPSBudWxsXG4gICAgdGhpcy50b3VjaFN0YXJ0WCA9IDBcbiAgICB0aGlzLnRvdWNoRGVsdGFYID0gMFxuXG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZylcbiAgICB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfSU5ESUNBVE9SUywgdGhpcy5fZWxlbWVudClcbiAgICB0aGlzLl90b3VjaFN1cHBvcnRlZCA9ICdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwXG4gICAgdGhpcy5fcG9pbnRlckV2ZW50ID0gQm9vbGVhbih3aW5kb3cuUG9pbnRlckV2ZW50KVxuXG4gICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcblxuICBuZXh0KCkge1xuICAgIHRoaXMuX3NsaWRlKE9SREVSX05FWFQpXG4gIH1cblxuICBuZXh0V2hlblZpc2libGUoKSB7XG4gICAgLy8gRG9uJ3QgY2FsbCBuZXh0IHdoZW4gdGhlIHBhZ2UgaXNuJ3QgdmlzaWJsZVxuICAgIC8vIG9yIHRoZSBjYXJvdXNlbCBvciBpdHMgcGFyZW50IGlzbid0IHZpc2libGVcbiAgICBpZiAoIWRvY3VtZW50LmhpZGRlbiAmJiBpc1Zpc2libGUodGhpcy5fZWxlbWVudCkpIHtcbiAgICAgIHRoaXMubmV4dCgpXG4gICAgfVxuICB9XG5cbiAgcHJldigpIHtcbiAgICB0aGlzLl9zbGlkZShPUkRFUl9QUkVWKVxuICB9XG5cbiAgcGF1c2UoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICB0aGlzLl9pc1BhdXNlZCA9IHRydWVcbiAgICB9XG5cbiAgICBpZiAoU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9ORVhUX1BSRVYsIHRoaXMuX2VsZW1lbnQpKSB7XG4gICAgICB0cmlnZ2VyVHJhbnNpdGlvbkVuZCh0aGlzLl9lbGVtZW50KVxuICAgICAgdGhpcy5jeWNsZSh0cnVlKVxuICAgIH1cblxuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5faW50ZXJ2YWwpXG4gICAgdGhpcy5faW50ZXJ2YWwgPSBudWxsXG4gIH1cblxuICBjeWNsZShldmVudCkge1xuICAgIGlmICghZXZlbnQpIHtcbiAgICAgIHRoaXMuX2lzUGF1c2VkID0gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodGhpcy5faW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5faW50ZXJ2YWwpXG4gICAgICB0aGlzLl9pbnRlcnZhbCA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29uZmlnICYmIHRoaXMuX2NvbmZpZy5pbnRlcnZhbCAmJiAhdGhpcy5faXNQYXVzZWQpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZUludGVydmFsKClcblxuICAgICAgdGhpcy5faW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChcbiAgICAgICAgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA/IHRoaXMubmV4dFdoZW5WaXNpYmxlIDogdGhpcy5uZXh0KS5iaW5kKHRoaXMpLFxuICAgICAgICB0aGlzLl9jb25maWcuaW50ZXJ2YWxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICB0byhpbmRleCkge1xuICAgIHRoaXMuX2FjdGl2ZUVsZW1lbnQgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0FDVElWRV9JVEVNLCB0aGlzLl9lbGVtZW50KVxuICAgIGNvbnN0IGFjdGl2ZUluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4KHRoaXMuX2FjdGl2ZUVsZW1lbnQpXG5cbiAgICBpZiAoaW5kZXggPiB0aGlzLl9pdGVtcy5sZW5ndGggLSAxIHx8IGluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzU2xpZGluZykge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uZSh0aGlzLl9lbGVtZW50LCBFVkVOVF9TTElELCAoKSA9PiB0aGlzLnRvKGluZGV4KSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChhY3RpdmVJbmRleCA9PT0gaW5kZXgpIHtcbiAgICAgIHRoaXMucGF1c2UoKVxuICAgICAgdGhpcy5jeWNsZSgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBvcmRlciA9IGluZGV4ID4gYWN0aXZlSW5kZXggP1xuICAgICAgT1JERVJfTkVYVCA6XG4gICAgICBPUkRFUl9QUkVWXG5cbiAgICB0aGlzLl9zbGlkZShvcmRlciwgdGhpcy5faXRlbXNbaW5kZXhdKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuXG4gIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uZmlnID0ge1xuICAgICAgLi4uRGVmYXVsdCxcbiAgICAgIC4uLk1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQpLFxuICAgICAgLi4uKHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDoge30pXG4gICAgfVxuICAgIHR5cGVDaGVja0NvbmZpZyhOQU1FLCBjb25maWcsIERlZmF1bHRUeXBlKVxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9oYW5kbGVTd2lwZSgpIHtcbiAgICBjb25zdCBhYnNEZWx0YXggPSBNYXRoLmFicyh0aGlzLnRvdWNoRGVsdGFYKVxuXG4gICAgaWYgKGFic0RlbHRheCA8PSBTV0lQRV9USFJFU0hPTEQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGFic0RlbHRheCAvIHRoaXMudG91Y2hEZWx0YVhcblxuICAgIHRoaXMudG91Y2hEZWx0YVggPSAwXG5cbiAgICBpZiAoIWRpcmVjdGlvbikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fc2xpZGUoZGlyZWN0aW9uID4gMCA/IERJUkVDVElPTl9SSUdIVCA6IERJUkVDVElPTl9MRUZUKVxuICB9XG5cbiAgX2FkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIGlmICh0aGlzLl9jb25maWcua2V5Ym9hcmQpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlET1dOLCBldmVudCA9PiB0aGlzLl9rZXlkb3duKGV2ZW50KSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29uZmlnLnBhdXNlID09PSAnaG92ZXInKSB7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VFTlRFUiwgZXZlbnQgPT4gdGhpcy5wYXVzZShldmVudCkpXG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VMRUFWRSwgZXZlbnQgPT4gdGhpcy5jeWNsZShldmVudCkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy50b3VjaCAmJiB0aGlzLl90b3VjaFN1cHBvcnRlZCkge1xuICAgICAgdGhpcy5fYWRkVG91Y2hFdmVudExpc3RlbmVycygpXG4gICAgfVxuICB9XG5cbiAgX2FkZFRvdWNoRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3QgaGFzUG9pbnRlclBlblRvdWNoID0gZXZlbnQgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuX3BvaW50ZXJFdmVudCAmJlxuICAgICAgICAoZXZlbnQucG9pbnRlclR5cGUgPT09IFBPSU5URVJfVFlQRV9QRU4gfHwgZXZlbnQucG9pbnRlclR5cGUgPT09IFBPSU5URVJfVFlQRV9UT1VDSClcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydCA9IGV2ZW50ID0+IHtcbiAgICAgIGlmIChoYXNQb2ludGVyUGVuVG91Y2goZXZlbnQpKSB7XG4gICAgICAgIHRoaXMudG91Y2hTdGFydFggPSBldmVudC5jbGllbnRYXG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLl9wb2ludGVyRXZlbnQpIHtcbiAgICAgICAgdGhpcy50b3VjaFN0YXJ0WCA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1vdmUgPSBldmVudCA9PiB7XG4gICAgICAvLyBlbnN1cmUgc3dpcGluZyB3aXRoIG9uZSB0b3VjaCBhbmQgbm90IHBpbmNoaW5nXG4gICAgICB0aGlzLnRvdWNoRGVsdGFYID0gZXZlbnQudG91Y2hlcyAmJiBldmVudC50b3VjaGVzLmxlbmd0aCA+IDEgP1xuICAgICAgICAwIDpcbiAgICAgICAgZXZlbnQudG91Y2hlc1swXS5jbGllbnRYIC0gdGhpcy50b3VjaFN0YXJ0WFxuICAgIH1cblxuICAgIGNvbnN0IGVuZCA9IGV2ZW50ID0+IHtcbiAgICAgIGlmIChoYXNQb2ludGVyUGVuVG91Y2goZXZlbnQpKSB7XG4gICAgICAgIHRoaXMudG91Y2hEZWx0YVggPSBldmVudC5jbGllbnRYIC0gdGhpcy50b3VjaFN0YXJ0WFxuICAgICAgfVxuXG4gICAgICB0aGlzLl9oYW5kbGVTd2lwZSgpXG4gICAgICBpZiAodGhpcy5fY29uZmlnLnBhdXNlID09PSAnaG92ZXInKSB7XG4gICAgICAgIC8vIElmIGl0J3MgYSB0b3VjaC1lbmFibGVkIGRldmljZSwgbW91c2VlbnRlci9sZWF2ZSBhcmUgZmlyZWQgYXNcbiAgICAgICAgLy8gcGFydCBvZiB0aGUgbW91c2UgY29tcGF0aWJpbGl0eSBldmVudHMgb24gZmlyc3QgdGFwIC0gdGhlIGNhcm91c2VsXG4gICAgICAgIC8vIHdvdWxkIHN0b3AgY3ljbGluZyB1bnRpbCB1c2VyIHRhcHBlZCBvdXQgb2YgaXQ7XG4gICAgICAgIC8vIGhlcmUsIHdlIGxpc3RlbiBmb3IgdG91Y2hlbmQsIGV4cGxpY2l0bHkgcGF1c2UgdGhlIGNhcm91c2VsXG4gICAgICAgIC8vIChhcyBpZiBpdCdzIHRoZSBzZWNvbmQgdGltZSB3ZSB0YXAgb24gaXQsIG1vdXNlZW50ZXIgY29tcGF0IGV2ZW50XG4gICAgICAgIC8vIGlzIE5PVCBmaXJlZCkgYW5kIGFmdGVyIGEgdGltZW91dCAodG8gYWxsb3cgZm9yIG1vdXNlIGNvbXBhdGliaWxpdHlcbiAgICAgICAgLy8gZXZlbnRzIHRvIGZpcmUpIHdlIGV4cGxpY2l0bHkgcmVzdGFydCBjeWNsaW5nXG5cbiAgICAgICAgdGhpcy5wYXVzZSgpXG4gICAgICAgIGlmICh0aGlzLnRvdWNoVGltZW91dCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvdWNoVGltZW91dClcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudG91Y2hUaW1lb3V0ID0gc2V0VGltZW91dChldmVudCA9PiB0aGlzLmN5Y2xlKGV2ZW50KSwgVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCArIHRoaXMuX2NvbmZpZy5pbnRlcnZhbClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0lURU1fSU1HLCB0aGlzLl9lbGVtZW50KS5mb3JFYWNoKGl0ZW1JbWcgPT4ge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKGl0ZW1JbWcsIEVWRU5UX0RSQUdfU1RBUlQsIGV2ZW50ID0+IGV2ZW50LnByZXZlbnREZWZhdWx0KCkpXG4gICAgfSlcblxuICAgIGlmICh0aGlzLl9wb2ludGVyRXZlbnQpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9QT0lOVEVSRE9XTiwgZXZlbnQgPT4gc3RhcnQoZXZlbnQpKVxuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1BPSU5URVJVUCwgZXZlbnQgPT4gZW5kKGV2ZW50KSlcblxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfUE9JTlRFUl9FVkVOVClcbiAgICB9IGVsc2Uge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1RPVUNIU1RBUlQsIGV2ZW50ID0+IHN0YXJ0KGV2ZW50KSlcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9UT1VDSE1PVkUsIGV2ZW50ID0+IG1vdmUoZXZlbnQpKVxuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1RPVUNIRU5ELCBldmVudCA9PiBlbmQoZXZlbnQpKVxuICAgIH1cbiAgfVxuXG4gIF9rZXlkb3duKGV2ZW50KSB7XG4gICAgaWYgKC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoZXZlbnQudGFyZ2V0LnRhZ05hbWUpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBkaXJlY3Rpb24gPSBLRVlfVE9fRElSRUNUSU9OW2V2ZW50LmtleV1cbiAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICB0aGlzLl9zbGlkZShkaXJlY3Rpb24pXG4gICAgfVxuICB9XG5cbiAgX2dldEl0ZW1JbmRleChlbGVtZW50KSB7XG4gICAgdGhpcy5faXRlbXMgPSBlbGVtZW50ICYmIGVsZW1lbnQucGFyZW50Tm9kZSA/XG4gICAgICBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0lURU0sIGVsZW1lbnQucGFyZW50Tm9kZSkgOlxuICAgICAgW11cblxuICAgIHJldHVybiB0aGlzLl9pdGVtcy5pbmRleE9mKGVsZW1lbnQpXG4gIH1cblxuICBfZ2V0SXRlbUJ5T3JkZXIob3JkZXIsIGFjdGl2ZUVsZW1lbnQpIHtcbiAgICBjb25zdCBpc05leHQgPSBvcmRlciA9PT0gT1JERVJfTkVYVFxuICAgIHJldHVybiBnZXROZXh0QWN0aXZlRWxlbWVudCh0aGlzLl9pdGVtcywgYWN0aXZlRWxlbWVudCwgaXNOZXh0LCB0aGlzLl9jb25maWcud3JhcClcbiAgfVxuXG4gIF90cmlnZ2VyU2xpZGVFdmVudChyZWxhdGVkVGFyZ2V0LCBldmVudERpcmVjdGlvbk5hbWUpIHtcbiAgICBjb25zdCB0YXJnZXRJbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleChyZWxhdGVkVGFyZ2V0KVxuICAgIGNvbnN0IGZyb21JbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleChTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0FDVElWRV9JVEVNLCB0aGlzLl9lbGVtZW50KSlcblxuICAgIHJldHVybiBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TTElERSwge1xuICAgICAgcmVsYXRlZFRhcmdldCxcbiAgICAgIGRpcmVjdGlvbjogZXZlbnREaXJlY3Rpb25OYW1lLFxuICAgICAgZnJvbTogZnJvbUluZGV4LFxuICAgICAgdG86IHRhcmdldEluZGV4XG4gICAgfSlcbiAgfVxuXG4gIF9zZXRBY3RpdmVJbmRpY2F0b3JFbGVtZW50KGVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5faW5kaWNhdG9yc0VsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGFjdGl2ZUluZGljYXRvciA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfQUNUSVZFLCB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudClcblxuICAgICAgYWN0aXZlSW5kaWNhdG9yLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgICBhY3RpdmVJbmRpY2F0b3IucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnKVxuXG4gICAgICBjb25zdCBpbmRpY2F0b3JzID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9JTkRJQ0FUT1IsIHRoaXMuX2luZGljYXRvcnNFbGVtZW50KVxuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljYXRvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKE51bWJlci5wYXJzZUludChpbmRpY2F0b3JzW2ldLmdldEF0dHJpYnV0ZSgnZGF0YS1icy1zbGlkZS10bycpLCAxMCkgPT09IHRoaXMuX2dldEl0ZW1JbmRleChlbGVtZW50KSkge1xuICAgICAgICAgIGluZGljYXRvcnNbaV0uY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSlcbiAgICAgICAgICBpbmRpY2F0b3JzW2ldLnNldEF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50JywgJ3RydWUnKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfdXBkYXRlSW50ZXJ2YWwoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2FjdGl2ZUVsZW1lbnQgfHwgU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9BQ1RJVkVfSVRFTSwgdGhpcy5fZWxlbWVudClcblxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudEludGVydmFsID0gTnVtYmVyLnBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLWludGVydmFsJyksIDEwKVxuXG4gICAgaWYgKGVsZW1lbnRJbnRlcnZhbCkge1xuICAgICAgdGhpcy5fY29uZmlnLmRlZmF1bHRJbnRlcnZhbCA9IHRoaXMuX2NvbmZpZy5kZWZhdWx0SW50ZXJ2YWwgfHwgdGhpcy5fY29uZmlnLmludGVydmFsXG4gICAgICB0aGlzLl9jb25maWcuaW50ZXJ2YWwgPSBlbGVtZW50SW50ZXJ2YWxcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY29uZmlnLmludGVydmFsID0gdGhpcy5fY29uZmlnLmRlZmF1bHRJbnRlcnZhbCB8fCB0aGlzLl9jb25maWcuaW50ZXJ2YWxcbiAgICB9XG4gIH1cblxuICBfc2xpZGUoZGlyZWN0aW9uT3JPcmRlciwgZWxlbWVudCkge1xuICAgIGNvbnN0IG9yZGVyID0gdGhpcy5fZGlyZWN0aW9uVG9PcmRlcihkaXJlY3Rpb25Pck9yZGVyKVxuICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0FDVElWRV9JVEVNLCB0aGlzLl9lbGVtZW50KVxuICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnRJbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleChhY3RpdmVFbGVtZW50KVxuICAgIGNvbnN0IG5leHRFbGVtZW50ID0gZWxlbWVudCB8fCB0aGlzLl9nZXRJdGVtQnlPcmRlcihvcmRlciwgYWN0aXZlRWxlbWVudClcblxuICAgIGNvbnN0IG5leHRFbGVtZW50SW5kZXggPSB0aGlzLl9nZXRJdGVtSW5kZXgobmV4dEVsZW1lbnQpXG4gICAgY29uc3QgaXNDeWNsaW5nID0gQm9vbGVhbih0aGlzLl9pbnRlcnZhbClcblxuICAgIGNvbnN0IGlzTmV4dCA9IG9yZGVyID09PSBPUkRFUl9ORVhUXG4gICAgY29uc3QgZGlyZWN0aW9uYWxDbGFzc05hbWUgPSBpc05leHQgPyBDTEFTU19OQU1FX1NUQVJUIDogQ0xBU1NfTkFNRV9FTkRcbiAgICBjb25zdCBvcmRlckNsYXNzTmFtZSA9IGlzTmV4dCA/IENMQVNTX05BTUVfTkVYVCA6IENMQVNTX05BTUVfUFJFVlxuICAgIGNvbnN0IGV2ZW50RGlyZWN0aW9uTmFtZSA9IHRoaXMuX29yZGVyVG9EaXJlY3Rpb24ob3JkZXIpXG5cbiAgICBpZiAobmV4dEVsZW1lbnQgJiYgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfQUNUSVZFKSkge1xuICAgICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2VcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9pc1NsaWRpbmcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNsaWRlRXZlbnQgPSB0aGlzLl90cmlnZ2VyU2xpZGVFdmVudChuZXh0RWxlbWVudCwgZXZlbnREaXJlY3Rpb25OYW1lKVxuICAgIGlmIChzbGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghYWN0aXZlRWxlbWVudCB8fCAhbmV4dEVsZW1lbnQpIHtcbiAgICAgIC8vIFNvbWUgd2VpcmRuZXNzIGlzIGhhcHBlbmluZywgc28gd2UgYmFpbFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5faXNTbGlkaW5nID0gdHJ1ZVxuXG4gICAgaWYgKGlzQ3ljbGluZykge1xuICAgICAgdGhpcy5wYXVzZSgpXG4gICAgfVxuXG4gICAgdGhpcy5fc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudChuZXh0RWxlbWVudClcbiAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gbmV4dEVsZW1lbnRcblxuICAgIGNvbnN0IHRyaWdnZXJTbGlkRXZlbnQgPSAoKSA9PiB7XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TTElELCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IG5leHRFbGVtZW50LFxuICAgICAgICBkaXJlY3Rpb246IGV2ZW50RGlyZWN0aW9uTmFtZSxcbiAgICAgICAgZnJvbTogYWN0aXZlRWxlbWVudEluZGV4LFxuICAgICAgICB0bzogbmV4dEVsZW1lbnRJbmRleFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TTElERSkpIHtcbiAgICAgIG5leHRFbGVtZW50LmNsYXNzTGlzdC5hZGQob3JkZXJDbGFzc05hbWUpXG5cbiAgICAgIHJlZmxvdyhuZXh0RWxlbWVudClcblxuICAgICAgYWN0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGRpcmVjdGlvbmFsQ2xhc3NOYW1lKVxuICAgICAgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmFkZChkaXJlY3Rpb25hbENsYXNzTmFtZSlcblxuICAgICAgY29uc3QgY29tcGxldGVDYWxsQmFjayA9ICgpID0+IHtcbiAgICAgICAgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShkaXJlY3Rpb25hbENsYXNzTmFtZSwgb3JkZXJDbGFzc05hbWUpXG4gICAgICAgIG5leHRFbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpXG5cbiAgICAgICAgYWN0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFLCBvcmRlckNsYXNzTmFtZSwgZGlyZWN0aW9uYWxDbGFzc05hbWUpXG5cbiAgICAgICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2VcblxuICAgICAgICBzZXRUaW1lb3V0KHRyaWdnZXJTbGlkRXZlbnQsIDApXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGVDYWxsQmFjaywgYWN0aXZlRWxlbWVudCwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFKVxuICAgICAgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSlcblxuICAgICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2VcbiAgICAgIHRyaWdnZXJTbGlkRXZlbnQoKVxuICAgIH1cblxuICAgIGlmIChpc0N5Y2xpbmcpIHtcbiAgICAgIHRoaXMuY3ljbGUoKVxuICAgIH1cbiAgfVxuXG4gIF9kaXJlY3Rpb25Ub09yZGVyKGRpcmVjdGlvbikge1xuICAgIGlmICghW0RJUkVDVElPTl9SSUdIVCwgRElSRUNUSU9OX0xFRlRdLmluY2x1ZGVzKGRpcmVjdGlvbikpIHtcbiAgICAgIHJldHVybiBkaXJlY3Rpb25cbiAgICB9XG5cbiAgICBpZiAoaXNSVEwoKSkge1xuICAgICAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gRElSRUNUSU9OX0xFRlQgPyBPUkRFUl9QUkVWIDogT1JERVJfTkVYVFxuICAgIH1cblxuICAgIHJldHVybiBkaXJlY3Rpb24gPT09IERJUkVDVElPTl9MRUZUID8gT1JERVJfTkVYVCA6IE9SREVSX1BSRVZcbiAgfVxuXG4gIF9vcmRlclRvRGlyZWN0aW9uKG9yZGVyKSB7XG4gICAgaWYgKCFbT1JERVJfTkVYVCwgT1JERVJfUFJFVl0uaW5jbHVkZXMob3JkZXIpKSB7XG4gICAgICByZXR1cm4gb3JkZXJcbiAgICB9XG5cbiAgICBpZiAoaXNSVEwoKSkge1xuICAgICAgcmV0dXJuIG9yZGVyID09PSBPUkRFUl9QUkVWID8gRElSRUNUSU9OX0xFRlQgOiBESVJFQ1RJT05fUklHSFRcbiAgICB9XG5cbiAgICByZXR1cm4gb3JkZXIgPT09IE9SREVSX1BSRVYgPyBESVJFQ1RJT05fUklHSFQgOiBESVJFQ1RJT05fTEVGVFxuICB9XG5cbiAgLy8gU3RhdGljXG5cbiAgc3RhdGljIGNhcm91c2VsSW50ZXJmYWNlKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIGNvbnN0IGRhdGEgPSBDYXJvdXNlbC5nZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQsIGNvbmZpZylcblxuICAgIGxldCB7IF9jb25maWcgfSA9IGRhdGFcbiAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIF9jb25maWcgPSB7XG4gICAgICAgIC4uLl9jb25maWcsXG4gICAgICAgIC4uLmNvbmZpZ1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbiA9IHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnID8gY29uZmlnIDogX2NvbmZpZy5zbGlkZVxuXG4gICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdudW1iZXInKSB7XG4gICAgICBkYXRhLnRvKGNvbmZpZylcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhY3Rpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodHlwZW9mIGRhdGFbYWN0aW9uXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHthY3Rpb259XCJgKVxuICAgICAgfVxuXG4gICAgICBkYXRhW2FjdGlvbl0oKVxuICAgIH0gZWxzZSBpZiAoX2NvbmZpZy5pbnRlcnZhbCAmJiBfY29uZmlnLnJpZGUpIHtcbiAgICAgIGRhdGEucGF1c2UoKVxuICAgICAgZGF0YS5jeWNsZSgpXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIENhcm91c2VsLmNhcm91c2VsSW50ZXJmYWNlKHRoaXMsIGNvbmZpZylcbiAgICB9KVxuICB9XG5cbiAgc3RhdGljIGRhdGFBcGlDbGlja0hhbmRsZXIoZXZlbnQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBnZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpXG5cbiAgICBpZiAoIXRhcmdldCB8fCAhdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0NBUk9VU0VMKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgLi4uTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZXModGFyZ2V0KSxcbiAgICAgIC4uLk1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGVzKHRoaXMpXG4gICAgfVxuICAgIGNvbnN0IHNsaWRlSW5kZXggPSB0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1icy1zbGlkZS10bycpXG5cbiAgICBpZiAoc2xpZGVJbmRleCkge1xuICAgICAgY29uZmlnLmludGVydmFsID0gZmFsc2VcbiAgICB9XG5cbiAgICBDYXJvdXNlbC5jYXJvdXNlbEludGVyZmFjZSh0YXJnZXQsIGNvbmZpZylcblxuICAgIGlmIChzbGlkZUluZGV4KSB7XG4gICAgICBDYXJvdXNlbC5nZXRJbnN0YW5jZSh0YXJnZXQpLnRvKHNsaWRlSW5kZXgpXG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICB9XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBEYXRhIEFwaSBpbXBsZW1lbnRhdGlvblxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9TTElERSwgQ2Fyb3VzZWwuZGF0YUFwaUNsaWNrSGFuZGxlcilcblxuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfTE9BRF9EQVRBX0FQSSwgKCkgPT4ge1xuICBjb25zdCBjYXJvdXNlbHMgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfUklERSlcblxuICBmb3IgKGxldCBpID0gMCwgbGVuID0gY2Fyb3VzZWxzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgQ2Fyb3VzZWwuY2Fyb3VzZWxJbnRlcmZhY2UoY2Fyb3VzZWxzW2ldLCBDYXJvdXNlbC5nZXRJbnN0YW5jZShjYXJvdXNlbHNbaV0pKVxuICB9XG59KVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogalF1ZXJ5XG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIGFkZCAuQ2Fyb3VzZWwgdG8galF1ZXJ5IG9ubHkgaWYgalF1ZXJ5IGlzIHByZXNlbnRcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oQ2Fyb3VzZWwpXG5cbmV4cG9ydCBkZWZhdWx0IENhcm91c2VsXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NS4xLjMpOiBjb2xsYXBzZS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCB7XG4gIGRlZmluZUpRdWVyeVBsdWdpbixcbiAgZ2V0RWxlbWVudCxcbiAgZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCxcbiAgZ2V0RWxlbWVudEZyb21TZWxlY3RvcixcbiAgcmVmbG93LFxuICB0eXBlQ2hlY2tDb25maWdcbn0gZnJvbSAnLi91dGlsL2luZGV4J1xuaW1wb3J0IERhdGEgZnJvbSAnLi9kb20vZGF0YSdcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlcidcbmltcG9ydCBNYW5pcHVsYXRvciBmcm9tICcuL2RvbS9tYW5pcHVsYXRvcidcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUnXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50J1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29uc3RhbnRzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jb25zdCBOQU1FID0gJ2NvbGxhcHNlJ1xuY29uc3QgREFUQV9LRVkgPSAnYnMuY29sbGFwc2UnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgdG9nZ2xlOiB0cnVlLFxuICBwYXJlbnQ6IG51bGxcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIHRvZ2dsZTogJ2Jvb2xlYW4nLFxuICBwYXJlbnQ6ICcobnVsbHxlbGVtZW50KSdcbn1cblxuY29uc3QgRVZFTlRfU0hPVyA9IGBzaG93JHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfU0hPV04gPSBgc2hvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURFID0gYGhpZGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURERU4gPSBgaGlkZGVuJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBgY2xpY2ske0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5cbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuY29uc3QgQ0xBU1NfTkFNRV9DT0xMQVBTRSA9ICdjb2xsYXBzZSdcbmNvbnN0IENMQVNTX05BTUVfQ09MTEFQU0lORyA9ICdjb2xsYXBzaW5nJ1xuY29uc3QgQ0xBU1NfTkFNRV9DT0xMQVBTRUQgPSAnY29sbGFwc2VkJ1xuY29uc3QgQ0xBU1NfTkFNRV9ERUVQRVJfQ0hJTERSRU4gPSBgOnNjb3BlIC4ke0NMQVNTX05BTUVfQ09MTEFQU0V9IC4ke0NMQVNTX05BTUVfQ09MTEFQU0V9YFxuY29uc3QgQ0xBU1NfTkFNRV9IT1JJWk9OVEFMID0gJ2NvbGxhcHNlLWhvcml6b250YWwnXG5cbmNvbnN0IFdJRFRIID0gJ3dpZHRoJ1xuY29uc3QgSEVJR0hUID0gJ2hlaWdodCdcblxuY29uc3QgU0VMRUNUT1JfQUNUSVZFUyA9ICcuY29sbGFwc2Uuc2hvdywgLmNvbGxhcHNlLmNvbGxhcHNpbmcnXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS1icy10b2dnbGU9XCJjb2xsYXBzZVwiXSdcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENsYXNzIERlZmluaXRpb25cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmNsYXNzIENvbGxhcHNlIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKGVsZW1lbnQpXG5cbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZVxuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpXG4gICAgdGhpcy5fdHJpZ2dlckFycmF5ID0gW11cblxuICAgIGNvbnN0IHRvZ2dsZUxpc3QgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfVE9HR0xFKVxuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRvZ2dsZUxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGVsZW0gPSB0b2dnbGVMaXN0W2ldXG4gICAgICBjb25zdCBzZWxlY3RvciA9IGdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbSlcbiAgICAgIGNvbnN0IGZpbHRlckVsZW1lbnQgPSBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yKVxuICAgICAgICAuZmlsdGVyKGZvdW5kRWxlbSA9PiBmb3VuZEVsZW0gPT09IHRoaXMuX2VsZW1lbnQpXG5cbiAgICAgIGlmIChzZWxlY3RvciAhPT0gbnVsbCAmJiBmaWx0ZXJFbGVtZW50Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9zZWxlY3RvciA9IHNlbGVjdG9yXG4gICAgICAgIHRoaXMuX3RyaWdnZXJBcnJheS5wdXNoKGVsZW0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5faW5pdGlhbGl6ZUNoaWxkcmVuKClcblxuICAgIGlmICghdGhpcy5fY29uZmlnLnBhcmVudCkge1xuICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuX3RyaWdnZXJBcnJheSwgdGhpcy5faXNTaG93bigpKVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jb25maWcudG9nZ2xlKSB7XG4gICAgICB0aGlzLnRvZ2dsZSgpXG4gICAgfVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcblxuICB0b2dnbGUoKSB7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgdGhpcy5oaWRlKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93KClcbiAgICB9XG4gIH1cblxuICBzaG93KCkge1xuICAgIGlmICh0aGlzLl9pc1RyYW5zaXRpb25pbmcgfHwgdGhpcy5faXNTaG93bigpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsZXQgYWN0aXZlcyA9IFtdXG4gICAgbGV0IGFjdGl2ZXNEYXRhXG5cbiAgICBpZiAodGhpcy5fY29uZmlnLnBhcmVudCkge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBTZWxlY3RvckVuZ2luZS5maW5kKENMQVNTX05BTUVfREVFUEVSX0NISUxEUkVOLCB0aGlzLl9jb25maWcucGFyZW50KVxuICAgICAgYWN0aXZlcyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfQUNUSVZFUywgdGhpcy5fY29uZmlnLnBhcmVudCkuZmlsdGVyKGVsZW0gPT4gIWNoaWxkcmVuLmluY2x1ZGVzKGVsZW0pKSAvLyByZW1vdmUgY2hpbGRyZW4gaWYgZ3JlYXRlciBkZXB0aFxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUodGhpcy5fc2VsZWN0b3IpXG4gICAgaWYgKGFjdGl2ZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB0ZW1wQWN0aXZlRGF0YSA9IGFjdGl2ZXMuZmluZChlbGVtID0+IGNvbnRhaW5lciAhPT0gZWxlbSlcbiAgICAgIGFjdGl2ZXNEYXRhID0gdGVtcEFjdGl2ZURhdGEgPyBDb2xsYXBzZS5nZXRJbnN0YW5jZSh0ZW1wQWN0aXZlRGF0YSkgOiBudWxsXG5cbiAgICAgIGlmIChhY3RpdmVzRGF0YSAmJiBhY3RpdmVzRGF0YS5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XKVxuICAgIGlmIChzdGFydEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGFjdGl2ZXMuZm9yRWFjaChlbGVtQWN0aXZlID0+IHtcbiAgICAgIGlmIChjb250YWluZXIgIT09IGVsZW1BY3RpdmUpIHtcbiAgICAgICAgQ29sbGFwc2UuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtQWN0aXZlLCB7IHRvZ2dsZTogZmFsc2UgfSkuaGlkZSgpXG4gICAgICB9XG5cbiAgICAgIGlmICghYWN0aXZlc0RhdGEpIHtcbiAgICAgICAgRGF0YS5zZXQoZWxlbUFjdGl2ZSwgREFUQV9LRVksIG51bGwpXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IGRpbWVuc2lvbiA9IHRoaXMuX2dldERpbWVuc2lvbigpXG5cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9DT0xMQVBTRSlcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKVxuXG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gMFxuXG4gICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuX3RyaWdnZXJBcnJheSwgdHJ1ZSlcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlXG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlXG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0NPTExBUFNJTkcpXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTRSwgQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSAnJ1xuXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XTilcbiAgICB9XG5cbiAgICBjb25zdCBjYXBpdGFsaXplZERpbWVuc2lvbiA9IGRpbWVuc2lvblswXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKDEpXG4gICAgY29uc3Qgc2Nyb2xsU2l6ZSA9IGBzY3JvbGwke2NhcGl0YWxpemVkRGltZW5zaW9ufWBcblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMuX2VsZW1lbnQsIHRydWUpXG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gYCR7dGhpcy5fZWxlbWVudFtzY3JvbGxTaXplXX1weGBcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgaWYgKHRoaXMuX2lzVHJhbnNpdGlvbmluZyB8fCAhdGhpcy5faXNTaG93bigpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzdGFydEV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSlcbiAgICBpZiAoc3RhcnRFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBkaW1lbnNpb24gPSB0aGlzLl9nZXREaW1lbnNpb24oKVxuXG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gYCR7dGhpcy5fZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtkaW1lbnNpb25dfXB4YFxuXG4gICAgcmVmbG93KHRoaXMuX2VsZW1lbnQpXG5cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKVxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0NPTExBUFNFLCBDTEFTU19OQU1FX1NIT1cpXG5cbiAgICBjb25zdCB0cmlnZ2VyQXJyYXlMZW5ndGggPSB0aGlzLl90cmlnZ2VyQXJyYXkubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmlnZ2VyQXJyYXlMZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdHJpZ2dlciA9IHRoaXMuX3RyaWdnZXJBcnJheVtpXVxuICAgICAgY29uc3QgZWxlbSA9IGdldEVsZW1lbnRGcm9tU2VsZWN0b3IodHJpZ2dlcilcblxuICAgICAgaWYgKGVsZW0gJiYgIXRoaXMuX2lzU2hvd24oZWxlbSkpIHtcbiAgICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKFt0cmlnZ2VyXSwgZmFsc2UpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZVxuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZVxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0lORylcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0NPTExBUFNFKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElEREVOKVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9ICcnXG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLl9lbGVtZW50LCB0cnVlKVxuICB9XG5cbiAgX2lzU2hvd24oZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQpIHtcbiAgICByZXR1cm4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuXG4gIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uZmlnID0ge1xuICAgICAgLi4uRGVmYXVsdCxcbiAgICAgIC4uLk1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQpLFxuICAgICAgLi4uY29uZmlnXG4gICAgfVxuICAgIGNvbmZpZy50b2dnbGUgPSBCb29sZWFuKGNvbmZpZy50b2dnbGUpIC8vIENvZXJjZSBzdHJpbmcgdmFsdWVzXG4gICAgY29uZmlnLnBhcmVudCA9IGdldEVsZW1lbnQoY29uZmlnLnBhcmVudClcbiAgICB0eXBlQ2hlY2tDb25maWcoTkFNRSwgY29uZmlnLCBEZWZhdWx0VHlwZSlcbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfZ2V0RGltZW5zaW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0hPUklaT05UQUwpID8gV0lEVEggOiBIRUlHSFRcbiAgfVxuXG4gIF9pbml0aWFsaXplQ2hpbGRyZW4oKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcucGFyZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZHJlbiA9IFNlbGVjdG9yRW5naW5lLmZpbmQoQ0xBU1NfTkFNRV9ERUVQRVJfQ0hJTERSRU4sIHRoaXMuX2NvbmZpZy5wYXJlbnQpXG4gICAgU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgdGhpcy5fY29uZmlnLnBhcmVudCkuZmlsdGVyKGVsZW0gPT4gIWNoaWxkcmVuLmluY2x1ZGVzKGVsZW0pKVxuICAgICAgLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gZ2V0RWxlbWVudEZyb21TZWxlY3RvcihlbGVtZW50KVxuXG4gICAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhbZWxlbWVudF0sIHRoaXMuX2lzU2hvd24oc2VsZWN0ZWQpKVxuICAgICAgICB9XG4gICAgICB9KVxuICB9XG5cbiAgX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyh0cmlnZ2VyQXJyYXksIGlzT3Blbikge1xuICAgIGlmICghdHJpZ2dlckFycmF5Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJpZ2dlckFycmF5LmZvckVhY2goZWxlbSA9PiB7XG4gICAgICBpZiAoaXNPcGVuKSB7XG4gICAgICAgIGVsZW0uY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0NPTExBUFNFRClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW0uY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0NPTExBUFNFRClcbiAgICAgIH1cblxuICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBpc09wZW4pXG4gICAgfSlcbiAgfVxuXG4gIC8vIFN0YXRpY1xuXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBfY29uZmlnID0ge31cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJyAmJiAvc2hvd3xoaWRlLy50ZXN0KGNvbmZpZykpIHtcbiAgICAgICAgX2NvbmZpZy50b2dnbGUgPSBmYWxzZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhID0gQ29sbGFwc2UuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBfY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgICB9XG5cbiAgICAgICAgZGF0YVtjb25maWddKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBEYXRhIEFwaSBpbXBsZW1lbnRhdGlvblxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICAvLyBwcmV2ZW50RGVmYXVsdCBvbmx5IGZvciA8YT4gZWxlbWVudHMgKHdoaWNoIGNoYW5nZSB0aGUgVVJMKSBub3QgaW5zaWRlIHRoZSBjb2xsYXBzaWJsZSBlbGVtZW50XG4gIGlmIChldmVudC50YXJnZXQudGFnTmFtZSA9PT0gJ0EnIHx8IChldmVudC5kZWxlZ2F0ZVRhcmdldCAmJiBldmVudC5kZWxlZ2F0ZVRhcmdldC50YWdOYW1lID09PSAnQScpKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICB9XG5cbiAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvckZyb21FbGVtZW50KHRoaXMpXG4gIGNvbnN0IHNlbGVjdG9yRWxlbWVudHMgPSBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yKVxuXG4gIHNlbGVjdG9yRWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICBDb2xsYXBzZS5nZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQsIHsgdG9nZ2xlOiBmYWxzZSB9KS50b2dnbGUoKVxuICB9KVxufSlcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIGpRdWVyeVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBhZGQgLkNvbGxhcHNlIHRvIGpRdWVyeSBvbmx5IGlmIGpRdWVyeSBpcyBwcmVzZW50XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKENvbGxhcHNlKVxuXG5leHBvcnQgZGVmYXVsdCBDb2xsYXBzZVxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMS4zKTogZHJvcGRvd24uanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgKiBhcyBQb3BwZXIgZnJvbSAnQHBvcHBlcmpzL2NvcmUnXG5cbmltcG9ydCB7XG4gIGRlZmluZUpRdWVyeVBsdWdpbixcbiAgZ2V0RWxlbWVudCxcbiAgZ2V0RWxlbWVudEZyb21TZWxlY3RvcixcbiAgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQsXG4gIGlzRGlzYWJsZWQsXG4gIGlzRWxlbWVudCxcbiAgaXNSVEwsXG4gIGlzVmlzaWJsZSxcbiAgbm9vcCxcbiAgdHlwZUNoZWNrQ29uZmlnXG59IGZyb20gJy4vdXRpbC9pbmRleCdcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlcidcbmltcG9ydCBNYW5pcHVsYXRvciBmcm9tICcuL2RvbS9tYW5pcHVsYXRvcidcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUnXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50J1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29uc3RhbnRzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jb25zdCBOQU1FID0gJ2Ryb3Bkb3duJ1xuY29uc3QgREFUQV9LRVkgPSAnYnMuZHJvcGRvd24nXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcblxuY29uc3QgRVNDQVBFX0tFWSA9ICdFc2NhcGUnXG5jb25zdCBTUEFDRV9LRVkgPSAnU3BhY2UnXG5jb25zdCBUQUJfS0VZID0gJ1RhYidcbmNvbnN0IEFSUk9XX1VQX0tFWSA9ICdBcnJvd1VwJ1xuY29uc3QgQVJST1dfRE9XTl9LRVkgPSAnQXJyb3dEb3duJ1xuY29uc3QgUklHSFRfTU9VU0VfQlVUVE9OID0gMiAvLyBNb3VzZUV2ZW50LmJ1dHRvbiB2YWx1ZSBmb3IgdGhlIHNlY29uZGFyeSBidXR0b24sIHVzdWFsbHkgdGhlIHJpZ2h0IGJ1dHRvblxuXG5jb25zdCBSRUdFWFBfS0VZRE9XTiA9IG5ldyBSZWdFeHAoYCR7QVJST1dfVVBfS0VZfXwke0FSUk9XX0RPV05fS0VZfXwke0VTQ0FQRV9LRVl9YClcblxuY29uc3QgRVZFTlRfSElERSA9IGBoaWRlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElEREVOID0gYGhpZGRlbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1dOID0gYHNob3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBgY2xpY2ske0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5jb25zdCBFVkVOVF9LRVlET1dOX0RBVEFfQVBJID0gYGtleWRvd24ke0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5jb25zdCBFVkVOVF9LRVlVUF9EQVRBX0FQSSA9IGBrZXl1cCR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcblxuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBDTEFTU19OQU1FX0RST1BVUCA9ICdkcm9wdXAnXG5jb25zdCBDTEFTU19OQU1FX0RST1BFTkQgPSAnZHJvcGVuZCdcbmNvbnN0IENMQVNTX05BTUVfRFJPUFNUQVJUID0gJ2Ryb3BzdGFydCdcbmNvbnN0IENMQVNTX05BTUVfTkFWQkFSID0gJ25hdmJhcidcblxuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIl0nXG5jb25zdCBTRUxFQ1RPUl9NRU5VID0gJy5kcm9wZG93bi1tZW51J1xuY29uc3QgU0VMRUNUT1JfTkFWQkFSX05BViA9ICcubmF2YmFyLW5hdidcbmNvbnN0IFNFTEVDVE9SX1ZJU0lCTEVfSVRFTVMgPSAnLmRyb3Bkb3duLW1lbnUgLmRyb3Bkb3duLWl0ZW06bm90KC5kaXNhYmxlZCk6bm90KDpkaXNhYmxlZCknXG5cbmNvbnN0IFBMQUNFTUVOVF9UT1AgPSBpc1JUTCgpID8gJ3RvcC1lbmQnIDogJ3RvcC1zdGFydCdcbmNvbnN0IFBMQUNFTUVOVF9UT1BFTkQgPSBpc1JUTCgpID8gJ3RvcC1zdGFydCcgOiAndG9wLWVuZCdcbmNvbnN0IFBMQUNFTUVOVF9CT1RUT00gPSBpc1JUTCgpID8gJ2JvdHRvbS1lbmQnIDogJ2JvdHRvbS1zdGFydCdcbmNvbnN0IFBMQUNFTUVOVF9CT1RUT01FTkQgPSBpc1JUTCgpID8gJ2JvdHRvbS1zdGFydCcgOiAnYm90dG9tLWVuZCdcbmNvbnN0IFBMQUNFTUVOVF9SSUdIVCA9IGlzUlRMKCkgPyAnbGVmdC1zdGFydCcgOiAncmlnaHQtc3RhcnQnXG5jb25zdCBQTEFDRU1FTlRfTEVGVCA9IGlzUlRMKCkgPyAncmlnaHQtc3RhcnQnIDogJ2xlZnQtc3RhcnQnXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIG9mZnNldDogWzAsIDJdLFxuICBib3VuZGFyeTogJ2NsaXBwaW5nUGFyZW50cycsXG4gIHJlZmVyZW5jZTogJ3RvZ2dsZScsXG4gIGRpc3BsYXk6ICdkeW5hbWljJyxcbiAgcG9wcGVyQ29uZmlnOiBudWxsLFxuICBhdXRvQ2xvc2U6IHRydWVcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIG9mZnNldDogJyhhcnJheXxzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgYm91bmRhcnk6ICcoc3RyaW5nfGVsZW1lbnQpJyxcbiAgcmVmZXJlbmNlOiAnKHN0cmluZ3xlbGVtZW50fG9iamVjdCknLFxuICBkaXNwbGF5OiAnc3RyaW5nJyxcbiAgcG9wcGVyQ29uZmlnOiAnKG51bGx8b2JqZWN0fGZ1bmN0aW9uKScsXG4gIGF1dG9DbG9zZTogJyhib29sZWFufHN0cmluZyknXG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDbGFzcyBEZWZpbml0aW9uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jbGFzcyBEcm9wZG93biBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50KVxuXG4gICAgdGhpcy5fcG9wcGVyID0gbnVsbFxuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpXG4gICAgdGhpcy5fbWVudSA9IHRoaXMuX2dldE1lbnVFbGVtZW50KClcbiAgICB0aGlzLl9pbk5hdmJhciA9IHRoaXMuX2RldGVjdE5hdmJhcigpXG4gIH1cblxuICAvLyBHZXR0ZXJzXG5cbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcblxuICB0b2dnbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU2hvd24oKSA/IHRoaXMuaGlkZSgpIDogdGhpcy5zaG93KClcbiAgfVxuXG4gIHNob3coKSB7XG4gICAgaWYgKGlzRGlzYWJsZWQodGhpcy5fZWxlbWVudCkgfHwgdGhpcy5faXNTaG93bih0aGlzLl9tZW51KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IHtcbiAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRoaXMuX2VsZW1lbnRcbiAgICB9XG5cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XLCByZWxhdGVkVGFyZ2V0KVxuXG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnQgPSBEcm9wZG93bi5nZXRQYXJlbnRGcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KVxuICAgIC8vIFRvdGFsbHkgZGlzYWJsZSBQb3BwZXIgZm9yIERyb3Bkb3ducyBpbiBOYXZiYXJcbiAgICBpZiAodGhpcy5faW5OYXZiYXIpIHtcbiAgICAgIE1hbmlwdWxhdG9yLnNldERhdGFBdHRyaWJ1dGUodGhpcy5fbWVudSwgJ3BvcHBlcicsICdub25lJylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wcGVyKHBhcmVudClcbiAgICB9XG5cbiAgICAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgYWRkIGV4dHJhXG4gICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB0byB0aGUgYm9keSdzIGltbWVkaWF0ZSBjaGlsZHJlbjtcbiAgICAvLyBvbmx5IG5lZWRlZCBiZWNhdXNlIG9mIGJyb2tlbiBldmVudCBkZWxlZ2F0aW9uIG9uIGlPU1xuICAgIC8vIGh0dHBzOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxNC8wMi9tb3VzZV9ldmVudF9idWIuaHRtbFxuICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiZcbiAgICAgICFwYXJlbnQuY2xvc2VzdChTRUxFQ1RPUl9OQVZCQVJfTkFWKSkge1xuICAgICAgW10uY29uY2F0KC4uLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pXG4gICAgICAgIC5mb3JFYWNoKGVsZW0gPT4gRXZlbnRIYW5kbGVyLm9uKGVsZW0sICdtb3VzZW92ZXInLCBub29wKSlcbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50LmZvY3VzKClcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIHRydWUpXG5cbiAgICB0aGlzLl9tZW51LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1cpXG4gICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04sIHJlbGF0ZWRUYXJnZXQpXG4gIH1cblxuICBoaWRlKCkge1xuICAgIGlmIChpc0Rpc2FibGVkKHRoaXMuX2VsZW1lbnQpIHx8ICF0aGlzLl9pc1Nob3duKHRoaXMuX21lbnUpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0ge1xuICAgICAgcmVsYXRlZFRhcmdldDogdGhpcy5fZWxlbWVudFxuICAgIH1cblxuICAgIHRoaXMuX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpXG4gICAgfVxuXG4gICAgc3VwZXIuZGlzcG9zZSgpXG4gIH1cblxuICB1cGRhdGUoKSB7XG4gICAgdGhpcy5faW5OYXZiYXIgPSB0aGlzLl9kZXRlY3ROYXZiYXIoKVxuICAgIGlmICh0aGlzLl9wb3BwZXIpIHtcbiAgICAgIHRoaXMuX3BvcHBlci51cGRhdGUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIFByaXZhdGVcblxuICBfY29tcGxldGVIaWRlKHJlbGF0ZWRUYXJnZXQpIHtcbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFLCByZWxhdGVkVGFyZ2V0KVxuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIHJlbW92ZSB0aGUgZXh0cmFcbiAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHdlIGFkZGVkIGZvciBpT1Mgc3VwcG9ydFxuICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKVxuICAgICAgICAuZm9yRWFjaChlbGVtID0+IEV2ZW50SGFuZGxlci5vZmYoZWxlbSwgJ21vdXNlb3ZlcicsIG5vb3ApKVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9wb3BwZXIpIHtcbiAgICAgIHRoaXMuX3BvcHBlci5kZXN0cm95KClcbiAgICB9XG5cbiAgICB0aGlzLl9tZW51LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XKVxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKVxuICAgIE1hbmlwdWxhdG9yLnJlbW92ZURhdGFBdHRyaWJ1dGUodGhpcy5fbWVudSwgJ3BvcHBlcicpXG4gICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElEREVOLCByZWxhdGVkVGFyZ2V0KVxuICB9XG5cbiAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICBjb25maWcgPSB7XG4gICAgICAuLi50aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHQsXG4gICAgICAuLi5NYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlcyh0aGlzLl9lbGVtZW50KSxcbiAgICAgIC4uLmNvbmZpZ1xuICAgIH1cblxuICAgIHR5cGVDaGVja0NvbmZpZyhOQU1FLCBjb25maWcsIHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpXG5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy5yZWZlcmVuY2UgPT09ICdvYmplY3QnICYmICFpc0VsZW1lbnQoY29uZmlnLnJlZmVyZW5jZSkgJiZcbiAgICAgIHR5cGVvZiBjb25maWcucmVmZXJlbmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAhPT0gJ2Z1bmN0aW9uJ1xuICAgICkge1xuICAgICAgLy8gUG9wcGVyIHZpcnR1YWwgZWxlbWVudHMgcmVxdWlyZSBhIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBtZXRob2RcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7TkFNRS50b1VwcGVyQ2FzZSgpfTogT3B0aW9uIFwicmVmZXJlbmNlXCIgcHJvdmlkZWQgdHlwZSBcIm9iamVjdFwiIHdpdGhvdXQgYSByZXF1aXJlZCBcImdldEJvdW5kaW5nQ2xpZW50UmVjdFwiIG1ldGhvZC5gKVxuICAgIH1cblxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9jcmVhdGVQb3BwZXIocGFyZW50KSB7XG4gICAgaWYgKHR5cGVvZiBQb3BwZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb290c3RyYXBcXCdzIGRyb3Bkb3ducyByZXF1aXJlIFBvcHBlciAoaHR0cHM6Ly9wb3BwZXIuanMub3JnKScpXG4gICAgfVxuXG4gICAgbGV0IHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9lbGVtZW50XG5cbiAgICBpZiAodGhpcy5fY29uZmlnLnJlZmVyZW5jZSA9PT0gJ3BhcmVudCcpIHtcbiAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSBwYXJlbnRcbiAgICB9IGVsc2UgaWYgKGlzRWxlbWVudCh0aGlzLl9jb25maWcucmVmZXJlbmNlKSkge1xuICAgICAgcmVmZXJlbmNlRWxlbWVudCA9IGdldEVsZW1lbnQodGhpcy5fY29uZmlnLnJlZmVyZW5jZSlcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLl9jb25maWcucmVmZXJlbmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgcmVmZXJlbmNlRWxlbWVudCA9IHRoaXMuX2NvbmZpZy5yZWZlcmVuY2VcbiAgICB9XG5cbiAgICBjb25zdCBwb3BwZXJDb25maWcgPSB0aGlzLl9nZXRQb3BwZXJDb25maWcoKVxuICAgIGNvbnN0IGlzRGlzcGxheVN0YXRpYyA9IHBvcHBlckNvbmZpZy5tb2RpZmllcnMuZmluZChtb2RpZmllciA9PiBtb2RpZmllci5uYW1lID09PSAnYXBwbHlTdHlsZXMnICYmIG1vZGlmaWVyLmVuYWJsZWQgPT09IGZhbHNlKVxuXG4gICAgdGhpcy5fcG9wcGVyID0gUG9wcGVyLmNyZWF0ZVBvcHBlcihyZWZlcmVuY2VFbGVtZW50LCB0aGlzLl9tZW51LCBwb3BwZXJDb25maWcpXG5cbiAgICBpZiAoaXNEaXNwbGF5U3RhdGljKSB7XG4gICAgICBNYW5pcHVsYXRvci5zZXREYXRhQXR0cmlidXRlKHRoaXMuX21lbnUsICdwb3BwZXInLCAnc3RhdGljJylcbiAgICB9XG4gIH1cblxuICBfaXNTaG93bihlbGVtZW50ID0gdGhpcy5fZWxlbWVudCkge1xuICAgIHJldHVybiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1cpXG4gIH1cblxuICBfZ2V0TWVudUVsZW1lbnQoKSB7XG4gICAgcmV0dXJuIFNlbGVjdG9yRW5naW5lLm5leHQodGhpcy5fZWxlbWVudCwgU0VMRUNUT1JfTUVOVSlbMF1cbiAgfVxuXG4gIF9nZXRQbGFjZW1lbnQoKSB7XG4gICAgY29uc3QgcGFyZW50RHJvcGRvd24gPSB0aGlzLl9lbGVtZW50LnBhcmVudE5vZGVcblxuICAgIGlmIChwYXJlbnREcm9wZG93bi5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QRU5EKSkge1xuICAgICAgcmV0dXJuIFBMQUNFTUVOVF9SSUdIVFxuICAgIH1cblxuICAgIGlmIChwYXJlbnREcm9wZG93bi5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QU1RBUlQpKSB7XG4gICAgICByZXR1cm4gUExBQ0VNRU5UX0xFRlRcbiAgICB9XG5cbiAgICAvLyBXZSBuZWVkIHRvIHRyaW0gdGhlIHZhbHVlIGJlY2F1c2UgY3VzdG9tIHByb3BlcnRpZXMgY2FuIGFsc28gaW5jbHVkZSBzcGFjZXNcbiAgICBjb25zdCBpc0VuZCA9IGdldENvbXB1dGVkU3R5bGUodGhpcy5fbWVudSkuZ2V0UHJvcGVydHlWYWx1ZSgnLS1icy1wb3NpdGlvbicpLnRyaW0oKSA9PT0gJ2VuZCdcblxuICAgIGlmIChwYXJlbnREcm9wZG93bi5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QVVApKSB7XG4gICAgICByZXR1cm4gaXNFbmQgPyBQTEFDRU1FTlRfVE9QRU5EIDogUExBQ0VNRU5UX1RPUFxuICAgIH1cblxuICAgIHJldHVybiBpc0VuZCA/IFBMQUNFTUVOVF9CT1RUT01FTkQgOiBQTEFDRU1FTlRfQk9UVE9NXG4gIH1cblxuICBfZGV0ZWN0TmF2YmFyKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50LmNsb3Nlc3QoYC4ke0NMQVNTX05BTUVfTkFWQkFSfWApICE9PSBudWxsXG4gIH1cblxuICBfZ2V0T2Zmc2V0KCkge1xuICAgIGNvbnN0IHsgb2Zmc2V0IH0gPSB0aGlzLl9jb25maWdcblxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG9mZnNldC5zcGxpdCgnLCcpLm1hcCh2YWwgPT4gTnVtYmVyLnBhcnNlSW50KHZhbCwgMTApKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcG9wcGVyRGF0YSA9PiBvZmZzZXQocG9wcGVyRGF0YSwgdGhpcy5fZWxlbWVudClcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0XG4gIH1cblxuICBfZ2V0UG9wcGVyQ29uZmlnKCkge1xuICAgIGNvbnN0IGRlZmF1bHRCc1BvcHBlckNvbmZpZyA9IHtcbiAgICAgIHBsYWNlbWVudDogdGhpcy5fZ2V0UGxhY2VtZW50KCksXG4gICAgICBtb2RpZmllcnM6IFt7XG4gICAgICAgIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgYm91bmRhcnk6IHRoaXMuX2NvbmZpZy5ib3VuZGFyeVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnb2Zmc2V0JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG9mZnNldDogdGhpcy5fZ2V0T2Zmc2V0KClcbiAgICAgICAgfVxuICAgICAgfV1cbiAgICB9XG5cbiAgICAvLyBEaXNhYmxlIFBvcHBlciBpZiB3ZSBoYXZlIGEgc3RhdGljIGRpc3BsYXlcbiAgICBpZiAodGhpcy5fY29uZmlnLmRpc3BsYXkgPT09ICdzdGF0aWMnKSB7XG4gICAgICBkZWZhdWx0QnNQb3BwZXJDb25maWcubW9kaWZpZXJzID0gW3tcbiAgICAgICAgbmFtZTogJ2FwcGx5U3R5bGVzJyxcbiAgICAgICAgZW5hYmxlZDogZmFsc2VcbiAgICAgIH1dXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZmF1bHRCc1BvcHBlckNvbmZpZyxcbiAgICAgIC4uLih0eXBlb2YgdGhpcy5fY29uZmlnLnBvcHBlckNvbmZpZyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMuX2NvbmZpZy5wb3BwZXJDb25maWcoZGVmYXVsdEJzUG9wcGVyQ29uZmlnKSA6IHRoaXMuX2NvbmZpZy5wb3BwZXJDb25maWcpXG4gICAgfVxuICB9XG5cbiAgX3NlbGVjdE1lbnVJdGVtKHsga2V5LCB0YXJnZXQgfSkge1xuICAgIGNvbnN0IGl0ZW1zID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9WSVNJQkxFX0lURU1TLCB0aGlzLl9tZW51KS5maWx0ZXIoaXNWaXNpYmxlKVxuXG4gICAgaWYgKCFpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGlmIHRhcmdldCBpc24ndCBpbmNsdWRlZCBpbiBpdGVtcyAoZS5nLiB3aGVuIGV4cGFuZGluZyB0aGUgZHJvcGRvd24pXG4gICAgLy8gYWxsb3cgY3ljbGluZyB0byBnZXQgdGhlIGxhc3QgaXRlbSBpbiBjYXNlIGtleSBlcXVhbHMgQVJST1dfVVBfS0VZXG4gICAgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQoaXRlbXMsIHRhcmdldCwga2V5ID09PSBBUlJPV19ET1dOX0tFWSwgIWl0ZW1zLmluY2x1ZGVzKHRhcmdldCkpLmZvY3VzKClcbiAgfVxuXG4gIC8vIFN0YXRpY1xuXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gRHJvcGRvd24uZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgIH1cblxuICAgICAgZGF0YVtjb25maWddKClcbiAgICB9KVxuICB9XG5cbiAgc3RhdGljIGNsZWFyTWVudXMoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQgJiYgKGV2ZW50LmJ1dHRvbiA9PT0gUklHSFRfTU9VU0VfQlVUVE9OIHx8IChldmVudC50eXBlID09PSAna2V5dXAnICYmIGV2ZW50LmtleSAhPT0gVEFCX0tFWSkpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB0b2dnbGVzID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9EQVRBX1RPR0dMRSlcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0b2dnbGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gRHJvcGRvd24uZ2V0SW5zdGFuY2UodG9nZ2xlc1tpXSlcbiAgICAgIGlmICghY29udGV4dCB8fCBjb250ZXh0Ll9jb25maWcuYXV0b0Nsb3NlID09PSBmYWxzZSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoIWNvbnRleHQuX2lzU2hvd24oKSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0ge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiBjb250ZXh0Ll9lbGVtZW50XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBjb25zdCBjb21wb3NlZFBhdGggPSBldmVudC5jb21wb3NlZFBhdGgoKVxuICAgICAgICBjb25zdCBpc01lbnVUYXJnZXQgPSBjb21wb3NlZFBhdGguaW5jbHVkZXMoY29udGV4dC5fbWVudSlcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbXBvc2VkUGF0aC5pbmNsdWRlcyhjb250ZXh0Ll9lbGVtZW50KSB8fFxuICAgICAgICAgIChjb250ZXh0Ll9jb25maWcuYXV0b0Nsb3NlID09PSAnaW5zaWRlJyAmJiAhaXNNZW51VGFyZ2V0KSB8fFxuICAgICAgICAgIChjb250ZXh0Ll9jb25maWcuYXV0b0Nsb3NlID09PSAnb3V0c2lkZScgJiYgaXNNZW51VGFyZ2V0KVxuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGFiIG5hdmlnYXRpb24gdGhyb3VnaCB0aGUgZHJvcGRvd24gbWVudSBvciBldmVudHMgZnJvbSBjb250YWluZWQgaW5wdXRzIHNob3VsZG4ndCBjbG9zZSB0aGUgbWVudVxuICAgICAgICBpZiAoY29udGV4dC5fbWVudS5jb250YWlucyhldmVudC50YXJnZXQpICYmICgoZXZlbnQudHlwZSA9PT0gJ2tleXVwJyAmJiBldmVudC5rZXkgPT09IFRBQl9LRVkpIHx8IC9pbnB1dHxzZWxlY3R8b3B0aW9ufHRleHRhcmVhfGZvcm0vaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKSkpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgICAgICByZWxhdGVkVGFyZ2V0LmNsaWNrRXZlbnQgPSBldmVudFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQuX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRQYXJlbnRGcm9tRWxlbWVudChlbGVtZW50KSB7XG4gICAgcmV0dXJuIGdldEVsZW1lbnRGcm9tU2VsZWN0b3IoZWxlbWVudCkgfHwgZWxlbWVudC5wYXJlbnROb2RlXG4gIH1cblxuICBzdGF0aWMgZGF0YUFwaUtleWRvd25IYW5kbGVyKGV2ZW50KSB7XG4gICAgLy8gSWYgbm90IGlucHV0L3RleHRhcmVhOlxuICAgIC8vICAtIEFuZCBub3QgYSBrZXkgaW4gUkVHRVhQX0tFWURPV04gPT4gbm90IGEgZHJvcGRvd24gY29tbWFuZFxuICAgIC8vIElmIGlucHV0L3RleHRhcmVhOlxuICAgIC8vICAtIElmIHNwYWNlIGtleSA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG4gICAgLy8gIC0gSWYga2V5IGlzIG90aGVyIHRoYW4gZXNjYXBlXG4gICAgLy8gICAgLSBJZiBrZXkgaXMgbm90IHVwIG9yIGRvd24gPT4gbm90IGEgZHJvcGRvd24gY29tbWFuZFxuICAgIC8vICAgIC0gSWYgdHJpZ2dlciBpbnNpZGUgdGhlIG1lbnUgPT4gbm90IGEgZHJvcGRvd24gY29tbWFuZFxuICAgIGlmICgvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKSA/XG4gICAgICBldmVudC5rZXkgPT09IFNQQUNFX0tFWSB8fCAoZXZlbnQua2V5ICE9PSBFU0NBUEVfS0VZICYmXG4gICAgICAoKGV2ZW50LmtleSAhPT0gQVJST1dfRE9XTl9LRVkgJiYgZXZlbnQua2V5ICE9PSBBUlJPV19VUF9LRVkpIHx8XG4gICAgICAgIGV2ZW50LnRhcmdldC5jbG9zZXN0KFNFTEVDVE9SX01FTlUpKSkgOlxuICAgICAgIVJFR0VYUF9LRVlET1dOLnRlc3QoZXZlbnQua2V5KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaXNBY3RpdmUgPSB0aGlzLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1cpXG5cbiAgICBpZiAoIWlzQWN0aXZlICYmIGV2ZW50LmtleSA9PT0gRVNDQVBFX0tFWSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG5cbiAgICBpZiAoaXNEaXNhYmxlZCh0aGlzKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZ2V0VG9nZ2xlQnV0dG9uID0gdGhpcy5tYXRjaGVzKFNFTEVDVE9SX0RBVEFfVE9HR0xFKSA/IHRoaXMgOiBTZWxlY3RvckVuZ2luZS5wcmV2KHRoaXMsIFNFTEVDVE9SX0RBVEFfVE9HR0xFKVswXVxuICAgIGNvbnN0IGluc3RhbmNlID0gRHJvcGRvd24uZ2V0T3JDcmVhdGVJbnN0YW5jZShnZXRUb2dnbGVCdXR0b24pXG5cbiAgICBpZiAoZXZlbnQua2V5ID09PSBFU0NBUEVfS0VZKSB7XG4gICAgICBpbnN0YW5jZS5oaWRlKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChldmVudC5rZXkgPT09IEFSUk9XX1VQX0tFWSB8fCBldmVudC5rZXkgPT09IEFSUk9XX0RPV05fS0VZKSB7XG4gICAgICBpZiAoIWlzQWN0aXZlKSB7XG4gICAgICAgIGluc3RhbmNlLnNob3coKVxuICAgICAgfVxuXG4gICAgICBpbnN0YW5jZS5fc2VsZWN0TWVudUl0ZW0oZXZlbnQpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIWlzQWN0aXZlIHx8IGV2ZW50LmtleSA9PT0gU1BBQ0VfS0VZKSB7XG4gICAgICBEcm9wZG93bi5jbGVhck1lbnVzKClcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIERhdGEgQXBpIGltcGxlbWVudGF0aW9uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWURPV05fREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBEcm9wZG93bi5kYXRhQXBpS2V5ZG93bkhhbmRsZXIpXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWURPV05fREFUQV9BUEksIFNFTEVDVE9SX01FTlUsIERyb3Bkb3duLmRhdGFBcGlLZXlkb3duSGFuZGxlcilcbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIERyb3Bkb3duLmNsZWFyTWVudXMpXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWVVQX0RBVEFfQVBJLCBEcm9wZG93bi5jbGVhck1lbnVzKVxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIERyb3Bkb3duLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcykudG9nZ2xlKClcbn0pXG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBqUXVlcnlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogYWRkIC5Ecm9wZG93biB0byBqUXVlcnkgb25seSBpZiBqUXVlcnkgaXMgcHJlc2VudFxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihEcm9wZG93bilcblxuZXhwb3J0IGRlZmF1bHQgRHJvcGRvd25cbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY1LjEuMyk6IHV0aWwvc2Nyb2xsQmFyLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IFNlbGVjdG9yRW5naW5lIGZyb20gJy4uL2RvbS9zZWxlY3Rvci1lbmdpbmUnXG5pbXBvcnQgTWFuaXB1bGF0b3IgZnJvbSAnLi4vZG9tL21hbmlwdWxhdG9yJ1xuaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSAnLi9pbmRleCdcblxuY29uc3QgU0VMRUNUT1JfRklYRURfQ09OVEVOVCA9ICcuZml4ZWQtdG9wLCAuZml4ZWQtYm90dG9tLCAuaXMtZml4ZWQsIC5zdGlja3ktdG9wJ1xuY29uc3QgU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQgPSAnLnN0aWNreS10b3AnXG5cbmNsYXNzIFNjcm9sbEJhckhlbHBlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2VsZW1lbnQgPSBkb2N1bWVudC5ib2R5XG4gIH1cblxuICBnZXRXaWR0aCgpIHtcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2lubmVyV2lkdGgjdXNhZ2Vfbm90ZXNcbiAgICBjb25zdCBkb2N1bWVudFdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoXG4gICAgcmV0dXJuIE1hdGguYWJzKHdpbmRvdy5pbm5lcldpZHRoIC0gZG9jdW1lbnRXaWR0aClcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLmdldFdpZHRoKClcbiAgICB0aGlzLl9kaXNhYmxlT3ZlckZsb3coKVxuICAgIC8vIGdpdmUgcGFkZGluZyB0byBlbGVtZW50IHRvIGJhbGFuY2UgdGhlIGhpZGRlbiBzY3JvbGxiYXIgd2lkdGhcbiAgICB0aGlzLl9zZXRFbGVtZW50QXR0cmlidXRlcyh0aGlzLl9lbGVtZW50LCAncGFkZGluZ1JpZ2h0JywgY2FsY3VsYXRlZFZhbHVlID0+IGNhbGN1bGF0ZWRWYWx1ZSArIHdpZHRoKVxuICAgIC8vIHRyaWNrOiBXZSBhZGp1c3QgcG9zaXRpdmUgcGFkZGluZ1JpZ2h0IGFuZCBuZWdhdGl2ZSBtYXJnaW5SaWdodCB0byBzdGlja3ktdG9wIGVsZW1lbnRzIHRvIGtlZXAgc2hvd2luZyBmdWxsd2lkdGhcbiAgICB0aGlzLl9zZXRFbGVtZW50QXR0cmlidXRlcyhTRUxFQ1RPUl9GSVhFRF9DT05URU5ULCAncGFkZGluZ1JpZ2h0JywgY2FsY3VsYXRlZFZhbHVlID0+IGNhbGN1bGF0ZWRWYWx1ZSArIHdpZHRoKVxuICAgIHRoaXMuX3NldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX1NUSUNLWV9DT05URU5ULCAnbWFyZ2luUmlnaHQnLCBjYWxjdWxhdGVkVmFsdWUgPT4gY2FsY3VsYXRlZFZhbHVlIC0gd2lkdGgpXG4gIH1cblxuICBfZGlzYWJsZU92ZXJGbG93KCkge1xuICAgIHRoaXMuX3NhdmVJbml0aWFsQXR0cmlidXRlKHRoaXMuX2VsZW1lbnQsICdvdmVyZmxvdycpXG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nXG4gIH1cblxuICBfc2V0RWxlbWVudEF0dHJpYnV0ZXMoc2VsZWN0b3IsIHN0eWxlUHJvcCwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBzY3JvbGxiYXJXaWR0aCA9IHRoaXMuZ2V0V2lkdGgoKVxuICAgIGNvbnN0IG1hbmlwdWxhdGlvbkNhbGxCYWNrID0gZWxlbWVudCA9PiB7XG4gICAgICBpZiAoZWxlbWVudCAhPT0gdGhpcy5fZWxlbWVudCAmJiB3aW5kb3cuaW5uZXJXaWR0aCA+IGVsZW1lbnQuY2xpZW50V2lkdGggKyBzY3JvbGxiYXJXaWR0aCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdGhpcy5fc2F2ZUluaXRpYWxBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wKVxuICAgICAgY29uc3QgY2FsY3VsYXRlZFZhbHVlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudClbc3R5bGVQcm9wXVxuICAgICAgZWxlbWVudC5zdHlsZVtzdHlsZVByb3BdID0gYCR7Y2FsbGJhY2soTnVtYmVyLnBhcnNlRmxvYXQoY2FsY3VsYXRlZFZhbHVlKSl9cHhgXG4gICAgfVxuXG4gICAgdGhpcy5fYXBwbHlNYW5pcHVsYXRpb25DYWxsYmFjayhzZWxlY3RvciwgbWFuaXB1bGF0aW9uQ2FsbEJhY2spXG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsICdvdmVyZmxvdycpXG4gICAgdGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyh0aGlzLl9lbGVtZW50LCAncGFkZGluZ1JpZ2h0JylcbiAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX0ZJWEVEX0NPTlRFTlQsICdwYWRkaW5nUmlnaHQnKVxuICAgIHRoaXMuX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQsICdtYXJnaW5SaWdodCcpXG4gIH1cblxuICBfc2F2ZUluaXRpYWxBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wKSB7XG4gICAgY29uc3QgYWN0dWFsVmFsdWUgPSBlbGVtZW50LnN0eWxlW3N0eWxlUHJvcF1cbiAgICBpZiAoYWN0dWFsVmFsdWUpIHtcbiAgICAgIE1hbmlwdWxhdG9yLnNldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wLCBhY3R1YWxWYWx1ZSlcbiAgICB9XG4gIH1cblxuICBfcmVzZXRFbGVtZW50QXR0cmlidXRlcyhzZWxlY3Rvciwgc3R5bGVQcm9wKSB7XG4gICAgY29uc3QgbWFuaXB1bGF0aW9uQ2FsbEJhY2sgPSBlbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3ApXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBlbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KHN0eWxlUHJvcClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE1hbmlwdWxhdG9yLnJlbW92ZURhdGFBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wKVxuICAgICAgICBlbGVtZW50LnN0eWxlW3N0eWxlUHJvcF0gPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2FwcGx5TWFuaXB1bGF0aW9uQ2FsbGJhY2soc2VsZWN0b3IsIG1hbmlwdWxhdGlvbkNhbGxCYWNrKVxuICB9XG5cbiAgX2FwcGx5TWFuaXB1bGF0aW9uQ2FsbGJhY2soc2VsZWN0b3IsIGNhbGxCYWNrKSB7XG4gICAgaWYgKGlzRWxlbWVudChzZWxlY3RvcikpIHtcbiAgICAgIGNhbGxCYWNrKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yLCB0aGlzLl9lbGVtZW50KS5mb3JFYWNoKGNhbGxCYWNrKVxuICAgIH1cbiAgfVxuXG4gIGlzT3ZlcmZsb3dpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0V2lkdGgoKSA+IDBcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTY3JvbGxCYXJIZWxwZXJcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY1LjEuMyk6IHV0aWwvYmFja2Ryb3AuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4uL2RvbS9ldmVudC1oYW5kbGVyJ1xuaW1wb3J0IHsgZXhlY3V0ZSwgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbiwgZ2V0RWxlbWVudCwgcmVmbG93LCB0eXBlQ2hlY2tDb25maWcgfSBmcm9tICcuL2luZGV4J1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBjbGFzc05hbWU6ICdtb2RhbC1iYWNrZHJvcCcsXG4gIGlzVmlzaWJsZTogdHJ1ZSwgLy8gaWYgZmFsc2UsIHdlIHVzZSB0aGUgYmFja2Ryb3AgaGVscGVyIHdpdGhvdXQgYWRkaW5nIGFueSBlbGVtZW50IHRvIHRoZSBkb21cbiAgaXNBbmltYXRlZDogZmFsc2UsXG4gIHJvb3RFbGVtZW50OiAnYm9keScsIC8vIGdpdmUgdGhlIGNob2ljZSB0byBwbGFjZSBiYWNrZHJvcCB1bmRlciBkaWZmZXJlbnQgZWxlbWVudHNcbiAgY2xpY2tDYWxsYmFjazogbnVsbFxufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgY2xhc3NOYW1lOiAnc3RyaW5nJyxcbiAgaXNWaXNpYmxlOiAnYm9vbGVhbicsXG4gIGlzQW5pbWF0ZWQ6ICdib29sZWFuJyxcbiAgcm9vdEVsZW1lbnQ6ICcoZWxlbWVudHxzdHJpbmcpJyxcbiAgY2xpY2tDYWxsYmFjazogJyhmdW5jdGlvbnxudWxsKSdcbn1cbmNvbnN0IE5BTUUgPSAnYmFja2Ryb3AnXG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSdcbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuXG5jb25zdCBFVkVOVF9NT1VTRURPV04gPSBgbW91c2Vkb3duLmJzLiR7TkFNRX1gXG5cbmNsYXNzIEJhY2tkcm9wIHtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZylcbiAgICB0aGlzLl9pc0FwcGVuZGVkID0gZmFsc2VcbiAgICB0aGlzLl9lbGVtZW50ID0gbnVsbFxuICB9XG5cbiAgc2hvdyhjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5fY29uZmlnLmlzVmlzaWJsZSkge1xuICAgICAgZXhlY3V0ZShjYWxsYmFjaylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2FwcGVuZCgpXG5cbiAgICBpZiAodGhpcy5fY29uZmlnLmlzQW5pbWF0ZWQpIHtcbiAgICAgIHJlZmxvdyh0aGlzLl9nZXRFbGVtZW50KCkpXG4gICAgfVxuXG4gICAgdGhpcy5fZ2V0RWxlbWVudCgpLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgdGhpcy5fZW11bGF0ZUFuaW1hdGlvbigoKSA9PiB7XG4gICAgICBleGVjdXRlKGNhbGxiYWNrKVxuICAgIH0pXG4gIH1cblxuICBoaWRlKGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuaXNWaXNpYmxlKSB7XG4gICAgICBleGVjdXRlKGNhbGxiYWNrKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZ2V0RWxlbWVudCgpLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgdGhpcy5fZW11bGF0ZUFuaW1hdGlvbigoKSA9PiB7XG4gICAgICB0aGlzLmRpc3Bvc2UoKVxuICAgICAgZXhlY3V0ZShjYWxsYmFjaylcbiAgICB9KVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuXG4gIF9nZXRFbGVtZW50KCkge1xuICAgIGlmICghdGhpcy5fZWxlbWVudCkge1xuICAgICAgY29uc3QgYmFja2Ryb3AgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgICAgYmFja2Ryb3AuY2xhc3NOYW1lID0gdGhpcy5fY29uZmlnLmNsYXNzTmFtZVxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5pc0FuaW1hdGVkKSB7XG4gICAgICAgIGJhY2tkcm9wLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9GQURFKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9lbGVtZW50ID0gYmFja2Ryb3BcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudFxuICB9XG5cbiAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICBjb25maWcgPSB7XG4gICAgICAuLi5EZWZhdWx0LFxuICAgICAgLi4uKHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDoge30pXG4gICAgfVxuXG4gICAgLy8gdXNlIGdldEVsZW1lbnQoKSB3aXRoIHRoZSBkZWZhdWx0IFwiYm9keVwiIHRvIGdldCBhIGZyZXNoIEVsZW1lbnQgb24gZWFjaCBpbnN0YW50aWF0aW9uXG4gICAgY29uZmlnLnJvb3RFbGVtZW50ID0gZ2V0RWxlbWVudChjb25maWcucm9vdEVsZW1lbnQpXG4gICAgdHlwZUNoZWNrQ29uZmlnKE5BTUUsIGNvbmZpZywgRGVmYXVsdFR5cGUpXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2FwcGVuZCgpIHtcbiAgICBpZiAodGhpcy5faXNBcHBlbmRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fY29uZmlnLnJvb3RFbGVtZW50LmFwcGVuZCh0aGlzLl9nZXRFbGVtZW50KCkpXG5cbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZ2V0RWxlbWVudCgpLCBFVkVOVF9NT1VTRURPV04sICgpID0+IHtcbiAgICAgIGV4ZWN1dGUodGhpcy5fY29uZmlnLmNsaWNrQ2FsbGJhY2spXG4gICAgfSlcblxuICAgIHRoaXMuX2lzQXBwZW5kZWQgPSB0cnVlXG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIGlmICghdGhpcy5faXNBcHBlbmRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRURPV04pXG5cbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZSgpXG4gICAgdGhpcy5faXNBcHBlbmRlZCA9IGZhbHNlXG4gIH1cblxuICBfZW11bGF0ZUFuaW1hdGlvbihjYWxsYmFjaykge1xuICAgIGV4ZWN1dGVBZnRlclRyYW5zaXRpb24oY2FsbGJhY2ssIHRoaXMuX2dldEVsZW1lbnQoKSwgdGhpcy5fY29uZmlnLmlzQW5pbWF0ZWQpXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQmFja2Ryb3BcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY1LjEuMyk6IHV0aWwvZm9jdXN0cmFwLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuLi9kb20vZXZlbnQtaGFuZGxlcidcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuLi9kb20vc2VsZWN0b3ItZW5naW5lJ1xuaW1wb3J0IHsgdHlwZUNoZWNrQ29uZmlnIH0gZnJvbSAnLi9pbmRleCdcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgdHJhcEVsZW1lbnQ6IG51bGwsIC8vIFRoZSBlbGVtZW50IHRvIHRyYXAgZm9jdXMgaW5zaWRlIG9mXG4gIGF1dG9mb2N1czogdHJ1ZVxufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgdHJhcEVsZW1lbnQ6ICdlbGVtZW50JyxcbiAgYXV0b2ZvY3VzOiAnYm9vbGVhbidcbn1cblxuY29uc3QgTkFNRSA9ICdmb2N1c3RyYXAnXG5jb25zdCBEQVRBX0tFWSA9ICdicy5mb2N1c3RyYXAnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgRVZFTlRfRk9DVVNJTiA9IGBmb2N1c2luJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfS0VZRE9XTl9UQUIgPSBga2V5ZG93bi50YWIke0VWRU5UX0tFWX1gXG5cbmNvbnN0IFRBQl9LRVkgPSAnVGFiJ1xuY29uc3QgVEFCX05BVl9GT1JXQVJEID0gJ2ZvcndhcmQnXG5jb25zdCBUQUJfTkFWX0JBQ0tXQVJEID0gJ2JhY2t3YXJkJ1xuXG5jbGFzcyBGb2N1c1RyYXAge1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKVxuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2VcbiAgICB0aGlzLl9sYXN0VGFiTmF2RGlyZWN0aW9uID0gbnVsbFxuICB9XG5cbiAgYWN0aXZhdGUoKSB7XG4gICAgY29uc3QgeyB0cmFwRWxlbWVudCwgYXV0b2ZvY3VzIH0gPSB0aGlzLl9jb25maWdcblxuICAgIGlmICh0aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGF1dG9mb2N1cykge1xuICAgICAgdHJhcEVsZW1lbnQuZm9jdXMoKVxuICAgIH1cblxuICAgIEV2ZW50SGFuZGxlci5vZmYoZG9jdW1lbnQsIEVWRU5UX0tFWSkgLy8gZ3VhcmQgYWdhaW5zdCBpbmZpbml0ZSBmb2N1cyBsb29wXG4gICAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9GT0NVU0lOLCBldmVudCA9PiB0aGlzLl9oYW5kbGVGb2N1c2luKGV2ZW50KSlcbiAgICBFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWURPV05fVEFCLCBldmVudCA9PiB0aGlzLl9oYW5kbGVLZXlkb3duKGV2ZW50KSlcblxuICAgIHRoaXMuX2lzQWN0aXZlID0gdHJ1ZVxuICB9XG5cbiAgZGVhY3RpdmF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlXG4gICAgRXZlbnRIYW5kbGVyLm9mZihkb2N1bWVudCwgRVZFTlRfS0VZKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuXG4gIF9oYW5kbGVGb2N1c2luKGV2ZW50KSB7XG4gICAgY29uc3QgeyB0YXJnZXQgfSA9IGV2ZW50XG4gICAgY29uc3QgeyB0cmFwRWxlbWVudCB9ID0gdGhpcy5fY29uZmlnXG5cbiAgICBpZiAodGFyZ2V0ID09PSBkb2N1bWVudCB8fCB0YXJnZXQgPT09IHRyYXBFbGVtZW50IHx8IHRyYXBFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRzID0gU2VsZWN0b3JFbmdpbmUuZm9jdXNhYmxlQ2hpbGRyZW4odHJhcEVsZW1lbnQpXG5cbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0cmFwRWxlbWVudC5mb2N1cygpXG4gICAgfSBlbHNlIGlmICh0aGlzLl9sYXN0VGFiTmF2RGlyZWN0aW9uID09PSBUQUJfTkFWX0JBQ0tXQVJEKSB7XG4gICAgICBlbGVtZW50c1tlbGVtZW50cy5sZW5ndGggLSAxXS5mb2N1cygpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnRzWzBdLmZvY3VzKClcbiAgICB9XG4gIH1cblxuICBfaGFuZGxlS2V5ZG93bihldmVudCkge1xuICAgIGlmIChldmVudC5rZXkgIT09IFRBQl9LRVkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2xhc3RUYWJOYXZEaXJlY3Rpb24gPSBldmVudC5zaGlmdEtleSA/IFRBQl9OQVZfQkFDS1dBUkQgOiBUQUJfTkFWX0ZPUldBUkRcbiAgfVxuXG4gIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uZmlnID0ge1xuICAgICAgLi4uRGVmYXVsdCxcbiAgICAgIC4uLih0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IHt9KVxuICAgIH1cbiAgICB0eXBlQ2hlY2tDb25maWcoTkFNRSwgY29uZmlnLCBEZWZhdWx0VHlwZSlcbiAgICByZXR1cm4gY29uZmlnXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRm9jdXNUcmFwXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NS4xLjMpOiBtb2RhbC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCB7XG4gIGRlZmluZUpRdWVyeVBsdWdpbixcbiAgZ2V0RWxlbWVudEZyb21TZWxlY3RvcixcbiAgaXNSVEwsXG4gIGlzVmlzaWJsZSxcbiAgcmVmbG93LFxuICB0eXBlQ2hlY2tDb25maWdcbn0gZnJvbSAnLi91dGlsL2luZGV4J1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyJ1xuaW1wb3J0IE1hbmlwdWxhdG9yIGZyb20gJy4vZG9tL21hbmlwdWxhdG9yJ1xuaW1wb3J0IFNlbGVjdG9yRW5naW5lIGZyb20gJy4vZG9tL3NlbGVjdG9yLWVuZ2luZSdcbmltcG9ydCBTY3JvbGxCYXJIZWxwZXIgZnJvbSAnLi91dGlsL3Njcm9sbGJhcidcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQnXG5pbXBvcnQgQmFja2Ryb3AgZnJvbSAnLi91dGlsL2JhY2tkcm9wJ1xuaW1wb3J0IEZvY3VzVHJhcCBmcm9tICcuL3V0aWwvZm9jdXN0cmFwJ1xuaW1wb3J0IHsgZW5hYmxlRGlzbWlzc1RyaWdnZXIgfSBmcm9tICcuL3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucydcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvbnN0YW50c1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuY29uc3QgTkFNRSA9ICdtb2RhbCdcbmNvbnN0IERBVEFfS0VZID0gJ2JzLm1vZGFsJ1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcbmNvbnN0IERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknXG5jb25zdCBFU0NBUEVfS0VZID0gJ0VzY2FwZSdcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgYmFja2Ryb3A6IHRydWUsXG4gIGtleWJvYXJkOiB0cnVlLFxuICBmb2N1czogdHJ1ZVxufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgYmFja2Ryb3A6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAga2V5Ym9hcmQ6ICdib29sZWFuJyxcbiAgZm9jdXM6ICdib29sZWFuJ1xufVxuXG5jb25zdCBFVkVOVF9ISURFID0gYGhpZGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURFX1BSRVZFTlRFRCA9IGBoaWRlUHJldmVudGVkJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElEREVOID0gYGhpZGRlbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1dOID0gYHNob3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfUkVTSVpFID0gYHJlc2l6ZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RJU01JU1MgPSBgY2xpY2suZGlzbWlzcyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0tFWURPV05fRElTTUlTUyA9IGBrZXlkb3duLmRpc21pc3Mke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9NT1VTRVVQX0RJU01JU1MgPSBgbW91c2V1cC5kaXNtaXNzJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfTU9VU0VET1dOX0RJU01JU1MgPSBgbW91c2Vkb3duLmRpc21pc3Mke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcblxuY29uc3QgQ0xBU1NfTkFNRV9PUEVOID0gJ21vZGFsLW9wZW4nXG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSdcbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuY29uc3QgQ0xBU1NfTkFNRV9TVEFUSUMgPSAnbW9kYWwtc3RhdGljJ1xuXG5jb25zdCBPUEVOX1NFTEVDVE9SID0gJy5tb2RhbC5zaG93J1xuY29uc3QgU0VMRUNUT1JfRElBTE9HID0gJy5tb2RhbC1kaWFsb2cnXG5jb25zdCBTRUxFQ1RPUl9NT0RBTF9CT0RZID0gJy5tb2RhbC1ib2R5J1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIl0nXG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDbGFzcyBEZWZpbml0aW9uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jbGFzcyBNb2RhbCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50KVxuXG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZylcbiAgICB0aGlzLl9kaWFsb2cgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0RJQUxPRywgdGhpcy5fZWxlbWVudClcbiAgICB0aGlzLl9iYWNrZHJvcCA9IHRoaXMuX2luaXRpYWxpemVCYWNrRHJvcCgpXG4gICAgdGhpcy5fZm9jdXN0cmFwID0gdGhpcy5faW5pdGlhbGl6ZUZvY3VzVHJhcCgpXG4gICAgdGhpcy5faXNTaG93biA9IGZhbHNlXG4gICAgdGhpcy5faWdub3JlQmFja2Ryb3BDbGljayA9IGZhbHNlXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2VcbiAgICB0aGlzLl9zY3JvbGxCYXIgPSBuZXcgU2Nyb2xsQmFySGVscGVyKClcbiAgfVxuXG4gIC8vIEdldHRlcnNcblxuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG5cbiAgdG9nZ2xlKHJlbGF0ZWRUYXJnZXQpIHtcbiAgICByZXR1cm4gdGhpcy5faXNTaG93biA/IHRoaXMuaGlkZSgpIDogdGhpcy5zaG93KHJlbGF0ZWRUYXJnZXQpXG4gIH1cblxuICBzaG93KHJlbGF0ZWRUYXJnZXQpIHtcbiAgICBpZiAodGhpcy5faXNTaG93biB8fCB0aGlzLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1csIHtcbiAgICAgIHJlbGF0ZWRUYXJnZXRcbiAgICB9KVxuXG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9pc1Nob3duID0gdHJ1ZVxuXG4gICAgaWYgKHRoaXMuX2lzQW5pbWF0ZWQoKSkge1xuICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZVxuICAgIH1cblxuICAgIHRoaXMuX3Njcm9sbEJhci5oaWRlKClcblxuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX09QRU4pXG5cbiAgICB0aGlzLl9hZGp1c3REaWFsb2coKVxuXG4gICAgdGhpcy5fc2V0RXNjYXBlRXZlbnQoKVxuICAgIHRoaXMuX3NldFJlc2l6ZUV2ZW50KClcblxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9kaWFsb2csIEVWRU5UX01PVVNFRE9XTl9ESVNNSVNTLCAoKSA9PiB7XG4gICAgICBFdmVudEhhbmRsZXIub25lKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFVVBfRElTTUlTUywgZXZlbnQgPT4ge1xuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLl9lbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy5faWdub3JlQmFja2Ryb3BDbGljayA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgdGhpcy5fc2hvd0JhY2tkcm9wKCgpID0+IHRoaXMuX3Nob3dFbGVtZW50KHJlbGF0ZWRUYXJnZXQpKVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzU2hvd24gfHwgdGhpcy5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFKVxuXG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9pc1Nob3duID0gZmFsc2VcbiAgICBjb25zdCBpc0FuaW1hdGVkID0gdGhpcy5faXNBbmltYXRlZCgpXG5cbiAgICBpZiAoaXNBbmltYXRlZCkge1xuICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZVxuICAgIH1cblxuICAgIHRoaXMuX3NldEVzY2FwZUV2ZW50KClcbiAgICB0aGlzLl9zZXRSZXNpemVFdmVudCgpXG5cbiAgICB0aGlzLl9mb2N1c3RyYXAuZGVhY3RpdmF0ZSgpXG5cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9lbGVtZW50LCBFVkVOVF9DTElDS19ESVNNSVNTKVxuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZGlhbG9nLCBFVkVOVF9NT1VTRURPV05fRElTTUlTUylcblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4gdGhpcy5faGlkZU1vZGFsKCksIHRoaXMuX2VsZW1lbnQsIGlzQW5pbWF0ZWQpXG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIFt3aW5kb3csIHRoaXMuX2RpYWxvZ11cbiAgICAgIC5mb3JFYWNoKGh0bWxFbGVtZW50ID0+IEV2ZW50SGFuZGxlci5vZmYoaHRtbEVsZW1lbnQsIEVWRU5UX0tFWSkpXG5cbiAgICB0aGlzLl9iYWNrZHJvcC5kaXNwb3NlKClcbiAgICB0aGlzLl9mb2N1c3RyYXAuZGVhY3RpdmF0ZSgpXG4gICAgc3VwZXIuZGlzcG9zZSgpXG4gIH1cblxuICBoYW5kbGVVcGRhdGUoKSB7XG4gICAgdGhpcy5fYWRqdXN0RGlhbG9nKClcbiAgfVxuXG4gIC8vIFByaXZhdGVcblxuICBfaW5pdGlhbGl6ZUJhY2tEcm9wKCkge1xuICAgIHJldHVybiBuZXcgQmFja2Ryb3Aoe1xuICAgICAgaXNWaXNpYmxlOiBCb29sZWFuKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCksIC8vICdzdGF0aWMnIG9wdGlvbiB3aWxsIGJlIHRyYW5zbGF0ZWQgdG8gdHJ1ZSwgYW5kIGJvb2xlYW5zIHdpbGwga2VlcCB0aGVpciB2YWx1ZVxuICAgICAgaXNBbmltYXRlZDogdGhpcy5faXNBbmltYXRlZCgpXG4gICAgfSlcbiAgfVxuXG4gIF9pbml0aWFsaXplRm9jdXNUcmFwKCkge1xuICAgIHJldHVybiBuZXcgRm9jdXNUcmFwKHtcbiAgICAgIHRyYXBFbGVtZW50OiB0aGlzLl9lbGVtZW50XG4gICAgfSlcbiAgfVxuXG4gIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uZmlnID0ge1xuICAgICAgLi4uRGVmYXVsdCxcbiAgICAgIC4uLk1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQpLFxuICAgICAgLi4uKHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDoge30pXG4gICAgfVxuICAgIHR5cGVDaGVja0NvbmZpZyhOQU1FLCBjb25maWcsIERlZmF1bHRUeXBlKVxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9zaG93RWxlbWVudChyZWxhdGVkVGFyZ2V0KSB7XG4gICAgY29uc3QgaXNBbmltYXRlZCA9IHRoaXMuX2lzQW5pbWF0ZWQoKVxuICAgIGNvbnN0IG1vZGFsQm9keSA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfTU9EQUxfQk9EWSwgdGhpcy5fZGlhbG9nKVxuXG4gICAgaWYgKCF0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUgfHwgdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgLy8gRG9uJ3QgbW92ZSBtb2RhbCdzIERPTSBwb3NpdGlvblxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQodGhpcy5fZWxlbWVudClcbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snXG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJylcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1tb2RhbCcsIHRydWUpXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnZGlhbG9nJylcbiAgICB0aGlzLl9lbGVtZW50LnNjcm9sbFRvcCA9IDBcblxuICAgIGlmIChtb2RhbEJvZHkpIHtcbiAgICAgIG1vZGFsQm9keS5zY3JvbGxUb3AgPSAwXG4gICAgfVxuXG4gICAgaWYgKGlzQW5pbWF0ZWQpIHtcbiAgICAgIHJlZmxvdyh0aGlzLl9lbGVtZW50KVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1cpXG5cbiAgICBjb25zdCB0cmFuc2l0aW9uQ29tcGxldGUgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fY29uZmlnLmZvY3VzKSB7XG4gICAgICAgIHRoaXMuX2ZvY3VzdHJhcC5hY3RpdmF0ZSgpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XTiwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0XG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2sodHJhbnNpdGlvbkNvbXBsZXRlLCB0aGlzLl9kaWFsb2csIGlzQW5pbWF0ZWQpXG4gIH1cblxuICBfc2V0RXNjYXBlRXZlbnQoKSB7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24pIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlET1dOX0RJU01JU1MsIGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5rZXlib2FyZCAmJiBldmVudC5rZXkgPT09IEVTQ0FQRV9LRVkpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgdGhpcy5oaWRlKClcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5fY29uZmlnLmtleWJvYXJkICYmIGV2ZW50LmtleSA9PT0gRVNDQVBFX0tFWSkge1xuICAgICAgICAgIHRoaXMuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWURPV05fRElTTUlTUylcbiAgICB9XG4gIH1cblxuICBfc2V0UmVzaXplRXZlbnQoKSB7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24pIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih3aW5kb3csIEVWRU5UX1JFU0laRSwgKCkgPT4gdGhpcy5fYWRqdXN0RGlhbG9nKCkpXG4gICAgfSBlbHNlIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vZmYod2luZG93LCBFVkVOVF9SRVNJWkUpXG4gICAgfVxuICB9XG5cbiAgX2hpZGVNb2RhbCgpIHtcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCB0cnVlKVxuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLW1vZGFsJylcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgncm9sZScpXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2VcbiAgICB0aGlzLl9iYWNrZHJvcC5oaWRlKCgpID0+IHtcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX09QRU4pXG4gICAgICB0aGlzLl9yZXNldEFkanVzdG1lbnRzKClcbiAgICAgIHRoaXMuX3Njcm9sbEJhci5yZXNldCgpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4pXG4gICAgfSlcbiAgfVxuXG4gIF9zaG93QmFja2Ryb3AoY2FsbGJhY2spIHtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfQ0xJQ0tfRElTTUlTUywgZXZlbnQgPT4ge1xuICAgICAgaWYgKHRoaXMuX2lnbm9yZUJhY2tkcm9wQ2xpY2spIHtcbiAgICAgICAgdGhpcy5faWdub3JlQmFja2Ryb3BDbGljayA9IGZhbHNlXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSBldmVudC5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmJhY2tkcm9wID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCA9PT0gJ3N0YXRpYycpIHtcbiAgICAgICAgdGhpcy5fdHJpZ2dlckJhY2tkcm9wVHJhbnNpdGlvbigpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHRoaXMuX2JhY2tkcm9wLnNob3coY2FsbGJhY2spXG4gIH1cblxuICBfaXNBbmltYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFKVxuICB9XG5cbiAgX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKSB7XG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERV9QUkVWRU5URUQpXG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB7IGNsYXNzTGlzdCwgc2Nyb2xsSGVpZ2h0LCBzdHlsZSB9ID0gdGhpcy5fZWxlbWVudFxuICAgIGNvbnN0IGlzTW9kYWxPdmVyZmxvd2luZyA9IHNjcm9sbEhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHRcblxuICAgIC8vIHJldHVybiBpZiB0aGUgZm9sbG93aW5nIGJhY2tncm91bmQgdHJhbnNpdGlvbiBoYXNuJ3QgeWV0IGNvbXBsZXRlZFxuICAgIGlmICgoIWlzTW9kYWxPdmVyZmxvd2luZyAmJiBzdHlsZS5vdmVyZmxvd1kgPT09ICdoaWRkZW4nKSB8fCBjbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TVEFUSUMpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIWlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgc3R5bGUub3ZlcmZsb3dZID0gJ2hpZGRlbidcbiAgICB9XG5cbiAgICBjbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU1RBVElDKVxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NUQVRJQylcbiAgICAgIGlmICghaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICAgIHN0eWxlLm92ZXJmbG93WSA9ICcnXG4gICAgICAgIH0sIHRoaXMuX2RpYWxvZylcbiAgICAgIH1cbiAgICB9LCB0aGlzLl9kaWFsb2cpXG5cbiAgICB0aGlzLl9lbGVtZW50LmZvY3VzKClcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gdGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIHRvIGhhbmRsZSBvdmVyZmxvd2luZyBtb2RhbHNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIF9hZGp1c3REaWFsb2coKSB7XG4gICAgY29uc3QgaXNNb2RhbE92ZXJmbG93aW5nID0gdGhpcy5fZWxlbWVudC5zY3JvbGxIZWlnaHQgPiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0XG4gICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB0aGlzLl9zY3JvbGxCYXIuZ2V0V2lkdGgoKVxuICAgIGNvbnN0IGlzQm9keU92ZXJmbG93aW5nID0gc2Nyb2xsYmFyV2lkdGggPiAwXG5cbiAgICBpZiAoKCFpc0JvZHlPdmVyZmxvd2luZyAmJiBpc01vZGFsT3ZlcmZsb3dpbmcgJiYgIWlzUlRMKCkpIHx8IChpc0JvZHlPdmVyZmxvd2luZyAmJiAhaXNNb2RhbE92ZXJmbG93aW5nICYmIGlzUlRMKCkpKSB7XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdMZWZ0ID0gYCR7c2Nyb2xsYmFyV2lkdGh9cHhgXG4gICAgfVxuXG4gICAgaWYgKChpc0JvZHlPdmVyZmxvd2luZyAmJiAhaXNNb2RhbE92ZXJmbG93aW5nICYmICFpc1JUTCgpKSB8fCAoIWlzQm9keU92ZXJmbG93aW5nICYmIGlzTW9kYWxPdmVyZmxvd2luZyAmJiBpc1JUTCgpKSkge1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSBgJHtzY3JvbGxiYXJXaWR0aH1weGBcbiAgICB9XG4gIH1cblxuICBfcmVzZXRBZGp1c3RtZW50cygpIHtcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdMZWZ0ID0gJydcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodCA9ICcnXG4gIH1cblxuICAvLyBTdGF0aWNcblxuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZywgcmVsYXRlZFRhcmdldCkge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IE1vZGFsLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXShyZWxhdGVkVGFyZ2V0KVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIERhdGEgQXBpIGltcGxlbWVudGF0aW9uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGNvbnN0IHRhcmdldCA9IGdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcylcblxuICBpZiAoWydBJywgJ0FSRUEnXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICB9XG5cbiAgRXZlbnRIYW5kbGVyLm9uZSh0YXJnZXQsIEVWRU5UX1NIT1csIHNob3dFdmVudCA9PiB7XG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAvLyBvbmx5IHJlZ2lzdGVyIGZvY3VzIHJlc3RvcmVyIGlmIG1vZGFsIHdpbGwgYWN0dWFsbHkgZ2V0IHNob3duXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBFdmVudEhhbmRsZXIub25lKHRhcmdldCwgRVZFTlRfSElEREVOLCAoKSA9PiB7XG4gICAgICBpZiAoaXNWaXNpYmxlKHRoaXMpKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKVxuICAgICAgfVxuICAgIH0pXG4gIH0pXG5cbiAgLy8gYXZvaWQgY29uZmxpY3Qgd2hlbiBjbGlja2luZyBtb2RkYWwgdG9nZ2xlciB3aGlsZSBhbm90aGVyIG9uZSBpcyBvcGVuXG4gIGNvbnN0IGFsbFJlYWR5T3BlbiA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoT1BFTl9TRUxFQ1RPUilcbiAgaWYgKGFsbFJlYWR5T3Blbikge1xuICAgIE1vZGFsLmdldEluc3RhbmNlKGFsbFJlYWR5T3BlbikuaGlkZSgpXG4gIH1cblxuICBjb25zdCBkYXRhID0gTW9kYWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpXG5cbiAgZGF0YS50b2dnbGUodGhpcylcbn0pXG5cbmVuYWJsZURpc21pc3NUcmlnZ2VyKE1vZGFsKVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogalF1ZXJ5XG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIGFkZCAuTW9kYWwgdG8galF1ZXJ5IG9ubHkgaWYgalF1ZXJ5IGlzIHByZXNlbnRcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oTW9kYWwpXG5cbmV4cG9ydCBkZWZhdWx0IE1vZGFsXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NS4xLjMpOiBvZmZjYW52YXMuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sXG4gIGdldEVsZW1lbnRGcm9tU2VsZWN0b3IsXG4gIGlzRGlzYWJsZWQsXG4gIGlzVmlzaWJsZSxcbiAgdHlwZUNoZWNrQ29uZmlnXG59IGZyb20gJy4vdXRpbC9pbmRleCdcbmltcG9ydCBTY3JvbGxCYXJIZWxwZXIgZnJvbSAnLi91dGlsL3Njcm9sbGJhcidcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlcidcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lJ1xuaW1wb3J0IE1hbmlwdWxhdG9yIGZyb20gJy4vZG9tL21hbmlwdWxhdG9yJ1xuaW1wb3J0IEJhY2tkcm9wIGZyb20gJy4vdXRpbC9iYWNrZHJvcCdcbmltcG9ydCBGb2N1c1RyYXAgZnJvbSAnLi91dGlsL2ZvY3VzdHJhcCdcbmltcG9ydCB7IGVuYWJsZURpc21pc3NUcmlnZ2VyIH0gZnJvbSAnLi91dGlsL2NvbXBvbmVudC1mdW5jdGlvbnMnXG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb25zdGFudHNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmNvbnN0IE5BTUUgPSAnb2ZmY2FudmFzJ1xuY29uc3QgREFUQV9LRVkgPSAnYnMub2ZmY2FudmFzJ1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcbmNvbnN0IERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknXG5jb25zdCBFVkVOVF9MT0FEX0RBVEFfQVBJID0gYGxvYWQke0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5jb25zdCBFU0NBUEVfS0VZID0gJ0VzY2FwZSdcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgYmFja2Ryb3A6IHRydWUsXG4gIGtleWJvYXJkOiB0cnVlLFxuICBzY3JvbGw6IGZhbHNlXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBiYWNrZHJvcDogJ2Jvb2xlYW4nLFxuICBrZXlib2FyZDogJ2Jvb2xlYW4nLFxuICBzY3JvbGw6ICdib29sZWFuJ1xufVxuXG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcbmNvbnN0IENMQVNTX05BTUVfQkFDS0RST1AgPSAnb2ZmY2FudmFzLWJhY2tkcm9wJ1xuY29uc3QgT1BFTl9TRUxFQ1RPUiA9ICcub2ZmY2FudmFzLnNob3cnXG5cbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1dOID0gYHNob3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElERSA9IGBoaWRlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElEREVOID0gYGhpZGRlbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuY29uc3QgRVZFTlRfS0VZRE9XTl9ESVNNSVNTID0gYGtleWRvd24uZGlzbWlzcyR7RVZFTlRfS0VZfWBcblxuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwib2ZmY2FudmFzXCJdJ1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ2xhc3MgRGVmaW5pdGlvblxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuY2xhc3MgT2ZmY2FudmFzIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKGVsZW1lbnQpXG5cbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKVxuICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZVxuICAgIHRoaXMuX2JhY2tkcm9wID0gdGhpcy5faW5pdGlhbGl6ZUJhY2tEcm9wKClcbiAgICB0aGlzLl9mb2N1c3RyYXAgPSB0aGlzLl9pbml0aWFsaXplRm9jdXNUcmFwKClcbiAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpXG4gIH1cblxuICAvLyBHZXR0ZXJzXG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIC8vIFB1YmxpY1xuXG4gIHRvZ2dsZShyZWxhdGVkVGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU2hvd24gPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdyhyZWxhdGVkVGFyZ2V0KVxuICB9XG5cbiAgc2hvdyhyZWxhdGVkVGFyZ2V0KSB7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1csIHsgcmVsYXRlZFRhcmdldCB9KVxuXG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9pc1Nob3duID0gdHJ1ZVxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJ1xuXG4gICAgdGhpcy5fYmFja2Ryb3Auc2hvdygpXG5cbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5zY3JvbGwpIHtcbiAgICAgIG5ldyBTY3JvbGxCYXJIZWxwZXIoKS5oaWRlKClcbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKVxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLW1vZGFsJywgdHJ1ZSlcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdkaWFsb2cnKVxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1cpXG5cbiAgICBjb25zdCBjb21wbGV0ZUNhbGxCYWNrID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9jb25maWcuc2Nyb2xsKSB7XG4gICAgICAgIHRoaXMuX2ZvY3VzdHJhcC5hY3RpdmF0ZSgpXG4gICAgICB9XG5cbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1dOLCB7IHJlbGF0ZWRUYXJnZXQgfSlcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlQ2FsbEJhY2ssIHRoaXMuX2VsZW1lbnQsIHRydWUpXG4gIH1cblxuICBoaWRlKCkge1xuICAgIGlmICghdGhpcy5faXNTaG93bikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSlcblxuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKVxuICAgIHRoaXMuX2VsZW1lbnQuYmx1cigpXG4gICAgdGhpcy5faXNTaG93biA9IGZhbHNlXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcbiAgICB0aGlzLl9iYWNrZHJvcC5oaWRlKClcblxuICAgIGNvbnN0IGNvbXBsZXRlQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCB0cnVlKVxuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnKVxuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JvbGUnKVxuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbidcblxuICAgICAgaWYgKCF0aGlzLl9jb25maWcuc2Nyb2xsKSB7XG4gICAgICAgIG5ldyBTY3JvbGxCYXJIZWxwZXIoKS5yZXNldCgpXG4gICAgICB9XG5cbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJRERFTilcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlQ2FsbGJhY2ssIHRoaXMuX2VsZW1lbnQsIHRydWUpXG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuX2JhY2tkcm9wLmRpc3Bvc2UoKVxuICAgIHRoaXMuX2ZvY3VzdHJhcC5kZWFjdGl2YXRlKClcbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIC8vIFByaXZhdGVcblxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IHtcbiAgICAgIC4uLkRlZmF1bHQsXG4gICAgICAuLi5NYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlcyh0aGlzLl9lbGVtZW50KSxcbiAgICAgIC4uLih0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IHt9KVxuICAgIH1cbiAgICB0eXBlQ2hlY2tDb25maWcoTkFNRSwgY29uZmlnLCBEZWZhdWx0VHlwZSlcbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfaW5pdGlhbGl6ZUJhY2tEcm9wKCkge1xuICAgIHJldHVybiBuZXcgQmFja2Ryb3Aoe1xuICAgICAgY2xhc3NOYW1lOiBDTEFTU19OQU1FX0JBQ0tEUk9QLFxuICAgICAgaXNWaXNpYmxlOiB0aGlzLl9jb25maWcuYmFja2Ryb3AsXG4gICAgICBpc0FuaW1hdGVkOiB0cnVlLFxuICAgICAgcm9vdEVsZW1lbnQ6IHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZSxcbiAgICAgIGNsaWNrQ2FsbGJhY2s6ICgpID0+IHRoaXMuaGlkZSgpXG4gICAgfSlcbiAgfVxuXG4gIF9pbml0aWFsaXplRm9jdXNUcmFwKCkge1xuICAgIHJldHVybiBuZXcgRm9jdXNUcmFwKHtcbiAgICAgIHRyYXBFbGVtZW50OiB0aGlzLl9lbGVtZW50XG4gICAgfSlcbiAgfVxuXG4gIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTl9ESVNNSVNTLCBldmVudCA9PiB7XG4gICAgICBpZiAodGhpcy5fY29uZmlnLmtleWJvYXJkICYmIGV2ZW50LmtleSA9PT0gRVNDQVBFX0tFWSkge1xuICAgICAgICB0aGlzLmhpZGUoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvLyBTdGF0aWNcblxuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IE9mZmNhbnZhcy5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YVtjb25maWddID09PSB1bmRlZmluZWQgfHwgY29uZmlnLnN0YXJ0c1dpdGgoJ18nKSB8fCBjb25maWcgPT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgfVxuXG4gICAgICBkYXRhW2NvbmZpZ10odGhpcylcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBEYXRhIEFwaSBpbXBsZW1lbnRhdGlvblxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICBjb25zdCB0YXJnZXQgPSBnZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpXG5cbiAgaWYgKFsnQScsICdBUkVBJ10uaW5jbHVkZXModGhpcy50YWdOYW1lKSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgfVxuXG4gIGlmIChpc0Rpc2FibGVkKHRoaXMpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBFdmVudEhhbmRsZXIub25lKHRhcmdldCwgRVZFTlRfSElEREVOLCAoKSA9PiB7XG4gICAgLy8gZm9jdXMgb24gdHJpZ2dlciB3aGVuIGl0IGlzIGNsb3NlZFxuICAgIGlmIChpc1Zpc2libGUodGhpcykpIHtcbiAgICAgIHRoaXMuZm9jdXMoKVxuICAgIH1cbiAgfSlcblxuICAvLyBhdm9pZCBjb25mbGljdCB3aGVuIGNsaWNraW5nIGEgdG9nZ2xlciBvZiBhbiBvZmZjYW52YXMsIHdoaWxlIGFub3RoZXIgaXMgb3BlblxuICBjb25zdCBhbGxSZWFkeU9wZW4gPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKE9QRU5fU0VMRUNUT1IpXG4gIGlmIChhbGxSZWFkeU9wZW4gJiYgYWxsUmVhZHlPcGVuICE9PSB0YXJnZXQpIHtcbiAgICBPZmZjYW52YXMuZ2V0SW5zdGFuY2UoYWxsUmVhZHlPcGVuKS5oaWRlKClcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSBPZmZjYW52YXMuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpXG4gIGRhdGEudG9nZ2xlKHRoaXMpXG59KVxuXG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9MT0FEX0RBVEFfQVBJLCAoKSA9PlxuICBTZWxlY3RvckVuZ2luZS5maW5kKE9QRU5fU0VMRUNUT1IpLmZvckVhY2goZWwgPT4gT2ZmY2FudmFzLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWwpLnNob3coKSlcbilcblxuZW5hYmxlRGlzbWlzc1RyaWdnZXIoT2ZmY2FudmFzKVxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIGpRdWVyeVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKE9mZmNhbnZhcylcblxuZXhwb3J0IGRlZmF1bHQgT2ZmY2FudmFzXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NS4xLjMpOiB1dGlsL3Nhbml0aXplci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmNvbnN0IHVyaUF0dHJpYnV0ZXMgPSBuZXcgU2V0KFtcbiAgJ2JhY2tncm91bmQnLFxuICAnY2l0ZScsXG4gICdocmVmJyxcbiAgJ2l0ZW10eXBlJyxcbiAgJ2xvbmdkZXNjJyxcbiAgJ3Bvc3RlcicsXG4gICdzcmMnLFxuICAneGxpbms6aHJlZidcbl0pXG5cbmNvbnN0IEFSSUFfQVRUUklCVVRFX1BBVFRFUk4gPSAvXmFyaWEtW1xcdy1dKiQvaVxuXG4vKipcbiAqIEEgcGF0dGVybiB0aGF0IHJlY29nbml6ZXMgYSBjb21tb25seSB1c2VmdWwgc3Vic2V0IG9mIFVSTHMgdGhhdCBhcmUgc2FmZS5cbiAqXG4gKiBTaG91dG91dCB0byBBbmd1bGFyIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi8xMi4yLngvcGFja2FnZXMvY29yZS9zcmMvc2FuaXRpemF0aW9uL3VybF9zYW5pdGl6ZXIudHNcbiAqL1xuY29uc3QgU0FGRV9VUkxfUEFUVEVSTiA9IC9eKD86KD86aHR0cHM/fG1haWx0b3xmdHB8dGVsfGZpbGV8c21zKTp8W14jJi86P10qKD86WyMvP118JCkpL2lcblxuLyoqXG4gKiBBIHBhdHRlcm4gdGhhdCBtYXRjaGVzIHNhZmUgZGF0YSBVUkxzLiBPbmx5IG1hdGNoZXMgaW1hZ2UsIHZpZGVvIGFuZCBhdWRpbyB0eXBlcy5cbiAqXG4gKiBTaG91dG91dCB0byBBbmd1bGFyIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi8xMi4yLngvcGFja2FnZXMvY29yZS9zcmMvc2FuaXRpemF0aW9uL3VybF9zYW5pdGl6ZXIudHNcbiAqL1xuY29uc3QgREFUQV9VUkxfUEFUVEVSTiA9IC9eZGF0YTooPzppbWFnZVxcLyg/OmJtcHxnaWZ8anBlZ3xqcGd8cG5nfHRpZmZ8d2VicCl8dmlkZW9cXC8oPzptcGVnfG1wNHxvZ2d8d2VibSl8YXVkaW9cXC8oPzptcDN8b2dhfG9nZ3xvcHVzKSk7YmFzZTY0LFtcXGQrL2Etel0rPSokL2lcblxuY29uc3QgYWxsb3dlZEF0dHJpYnV0ZSA9IChhdHRyaWJ1dGUsIGFsbG93ZWRBdHRyaWJ1dGVMaXN0KSA9PiB7XG4gIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKVxuXG4gIGlmIChhbGxvd2VkQXR0cmlidXRlTGlzdC5pbmNsdWRlcyhhdHRyaWJ1dGVOYW1lKSkge1xuICAgIGlmICh1cmlBdHRyaWJ1dGVzLmhhcyhhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgcmV0dXJuIEJvb2xlYW4oU0FGRV9VUkxfUEFUVEVSTi50ZXN0KGF0dHJpYnV0ZS5ub2RlVmFsdWUpIHx8IERBVEFfVVJMX1BBVFRFUk4udGVzdChhdHRyaWJ1dGUubm9kZVZhbHVlKSlcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgY29uc3QgcmVnRXhwID0gYWxsb3dlZEF0dHJpYnV0ZUxpc3QuZmlsdGVyKGF0dHJpYnV0ZVJlZ2V4ID0+IGF0dHJpYnV0ZVJlZ2V4IGluc3RhbmNlb2YgUmVnRXhwKVxuXG4gIC8vIENoZWNrIGlmIGEgcmVndWxhciBleHByZXNzaW9uIHZhbGlkYXRlcyB0aGUgYXR0cmlidXRlLlxuICBmb3IgKGxldCBpID0gMCwgbGVuID0gcmVnRXhwLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKHJlZ0V4cFtpXS50ZXN0KGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgRGVmYXVsdEFsbG93bGlzdCA9IHtcbiAgLy8gR2xvYmFsIGF0dHJpYnV0ZXMgYWxsb3dlZCBvbiBhbnkgc3VwcGxpZWQgZWxlbWVudCBiZWxvdy5cbiAgJyonOiBbJ2NsYXNzJywgJ2RpcicsICdpZCcsICdsYW5nJywgJ3JvbGUnLCBBUklBX0FUVFJJQlVURV9QQVRURVJOXSxcbiAgYTogWyd0YXJnZXQnLCAnaHJlZicsICd0aXRsZScsICdyZWwnXSxcbiAgYXJlYTogW10sXG4gIGI6IFtdLFxuICBicjogW10sXG4gIGNvbDogW10sXG4gIGNvZGU6IFtdLFxuICBkaXY6IFtdLFxuICBlbTogW10sXG4gIGhyOiBbXSxcbiAgaDE6IFtdLFxuICBoMjogW10sXG4gIGgzOiBbXSxcbiAgaDQ6IFtdLFxuICBoNTogW10sXG4gIGg2OiBbXSxcbiAgaTogW10sXG4gIGltZzogWydzcmMnLCAnc3Jjc2V0JywgJ2FsdCcsICd0aXRsZScsICd3aWR0aCcsICdoZWlnaHQnXSxcbiAgbGk6IFtdLFxuICBvbDogW10sXG4gIHA6IFtdLFxuICBwcmU6IFtdLFxuICBzOiBbXSxcbiAgc21hbGw6IFtdLFxuICBzcGFuOiBbXSxcbiAgc3ViOiBbXSxcbiAgc3VwOiBbXSxcbiAgc3Ryb25nOiBbXSxcbiAgdTogW10sXG4gIHVsOiBbXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVIdG1sKHVuc2FmZUh0bWwsIGFsbG93TGlzdCwgc2FuaXRpemVGbikge1xuICBpZiAoIXVuc2FmZUh0bWwubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuc2FmZUh0bWxcbiAgfVxuXG4gIGlmIChzYW5pdGl6ZUZuICYmIHR5cGVvZiBzYW5pdGl6ZUZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHNhbml0aXplRm4odW5zYWZlSHRtbClcbiAgfVxuXG4gIGNvbnN0IGRvbVBhcnNlciA9IG5ldyB3aW5kb3cuRE9NUGFyc2VyKClcbiAgY29uc3QgY3JlYXRlZERvY3VtZW50ID0gZG9tUGFyc2VyLnBhcnNlRnJvbVN0cmluZyh1bnNhZmVIdG1sLCAndGV4dC9odG1sJylcbiAgY29uc3QgZWxlbWVudHMgPSBbXS5jb25jYXQoLi4uY3JlYXRlZERvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvckFsbCgnKicpKVxuXG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXVxuICAgIGNvbnN0IGVsZW1lbnROYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXG5cbiAgICBpZiAoIU9iamVjdC5rZXlzKGFsbG93TGlzdCkuaW5jbHVkZXMoZWxlbWVudE5hbWUpKSB7XG4gICAgICBlbGVtZW50LnJlbW92ZSgpXG5cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgYXR0cmlidXRlTGlzdCA9IFtdLmNvbmNhdCguLi5lbGVtZW50LmF0dHJpYnV0ZXMpXG4gICAgY29uc3QgYWxsb3dlZEF0dHJpYnV0ZXMgPSBbXS5jb25jYXQoYWxsb3dMaXN0WycqJ10gfHwgW10sIGFsbG93TGlzdFtlbGVtZW50TmFtZV0gfHwgW10pXG5cbiAgICBhdHRyaWJ1dGVMaXN0LmZvckVhY2goYXR0cmlidXRlID0+IHtcbiAgICAgIGlmICghYWxsb3dlZEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGFsbG93ZWRBdHRyaWJ1dGVzKSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUubm9kZU5hbWUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVkRG9jdW1lbnQuYm9keS5pbm5lckhUTUxcbn1cbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY1LjEuMyk6IHRvb2x0aXAuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgKiBhcyBQb3BwZXIgZnJvbSAnQHBvcHBlcmpzL2NvcmUnXG5cbmltcG9ydCB7XG4gIGRlZmluZUpRdWVyeVBsdWdpbixcbiAgZmluZFNoYWRvd1Jvb3QsXG4gIGdldEVsZW1lbnQsXG4gIGdldFVJRCxcbiAgaXNFbGVtZW50LFxuICBpc1JUTCxcbiAgbm9vcCxcbiAgdHlwZUNoZWNrQ29uZmlnXG59IGZyb20gJy4vdXRpbC9pbmRleCdcbmltcG9ydCB7IERlZmF1bHRBbGxvd2xpc3QsIHNhbml0aXplSHRtbCB9IGZyb20gJy4vdXRpbC9zYW5pdGl6ZXInXG5pbXBvcnQgRGF0YSBmcm9tICcuL2RvbS9kYXRhJ1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyJ1xuaW1wb3J0IE1hbmlwdWxhdG9yIGZyb20gJy4vZG9tL21hbmlwdWxhdG9yJ1xuaW1wb3J0IFNlbGVjdG9yRW5naW5lIGZyb20gJy4vZG9tL3NlbGVjdG9yLWVuZ2luZSdcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQnXG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb25zdGFudHNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmNvbnN0IE5BTUUgPSAndG9vbHRpcCdcbmNvbnN0IERBVEFfS0VZID0gJ2JzLnRvb2x0aXAnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgQ0xBU1NfUFJFRklYID0gJ2JzLXRvb2x0aXAnXG5jb25zdCBESVNBTExPV0VEX0FUVFJJQlVURVMgPSBuZXcgU2V0KFsnc2FuaXRpemUnLCAnYWxsb3dMaXN0JywgJ3Nhbml0aXplRm4nXSlcblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGFuaW1hdGlvbjogJ2Jvb2xlYW4nLFxuICB0ZW1wbGF0ZTogJ3N0cmluZycsXG4gIHRpdGxlOiAnKHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9uKScsXG4gIHRyaWdnZXI6ICdzdHJpbmcnLFxuICBkZWxheTogJyhudW1iZXJ8b2JqZWN0KScsXG4gIGh0bWw6ICdib29sZWFuJyxcbiAgc2VsZWN0b3I6ICcoc3RyaW5nfGJvb2xlYW4pJyxcbiAgcGxhY2VtZW50OiAnKHN0cmluZ3xmdW5jdGlvbiknLFxuICBvZmZzZXQ6ICcoYXJyYXl8c3RyaW5nfGZ1bmN0aW9uKScsXG4gIGNvbnRhaW5lcjogJyhzdHJpbmd8ZWxlbWVudHxib29sZWFuKScsXG4gIGZhbGxiYWNrUGxhY2VtZW50czogJ2FycmF5JyxcbiAgYm91bmRhcnk6ICcoc3RyaW5nfGVsZW1lbnQpJyxcbiAgY3VzdG9tQ2xhc3M6ICcoc3RyaW5nfGZ1bmN0aW9uKScsXG4gIHNhbml0aXplOiAnYm9vbGVhbicsXG4gIHNhbml0aXplRm46ICcobnVsbHxmdW5jdGlvbiknLFxuICBhbGxvd0xpc3Q6ICdvYmplY3QnLFxuICBwb3BwZXJDb25maWc6ICcobnVsbHxvYmplY3R8ZnVuY3Rpb24pJ1xufVxuXG5jb25zdCBBdHRhY2htZW50TWFwID0ge1xuICBBVVRPOiAnYXV0bycsXG4gIFRPUDogJ3RvcCcsXG4gIFJJR0hUOiBpc1JUTCgpID8gJ2xlZnQnIDogJ3JpZ2h0JyxcbiAgQk9UVE9NOiAnYm90dG9tJyxcbiAgTEVGVDogaXNSVEwoKSA/ICdyaWdodCcgOiAnbGVmdCdcbn1cblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgYW5pbWF0aW9uOiB0cnVlLFxuICB0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9XCJ0b29sdGlwXCIgcm9sZT1cInRvb2x0aXBcIj4nICtcbiAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJ0b29sdGlwLWFycm93XCI+PC9kaXY+JyArXG4gICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwidG9vbHRpcC1pbm5lclwiPjwvZGl2PicgK1xuICAgICAgICAgICAgJzwvZGl2PicsXG4gIHRyaWdnZXI6ICdob3ZlciBmb2N1cycsXG4gIHRpdGxlOiAnJyxcbiAgZGVsYXk6IDAsXG4gIGh0bWw6IGZhbHNlLFxuICBzZWxlY3RvcjogZmFsc2UsXG4gIHBsYWNlbWVudDogJ3RvcCcsXG4gIG9mZnNldDogWzAsIDBdLFxuICBjb250YWluZXI6IGZhbHNlLFxuICBmYWxsYmFja1BsYWNlbWVudHM6IFsndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0J10sXG4gIGJvdW5kYXJ5OiAnY2xpcHBpbmdQYXJlbnRzJyxcbiAgY3VzdG9tQ2xhc3M6ICcnLFxuICBzYW5pdGl6ZTogdHJ1ZSxcbiAgc2FuaXRpemVGbjogbnVsbCxcbiAgYWxsb3dMaXN0OiBEZWZhdWx0QWxsb3dsaXN0LFxuICBwb3BwZXJDb25maWc6IG51bGxcbn1cblxuY29uc3QgRXZlbnQgPSB7XG4gIEhJREU6IGBoaWRlJHtFVkVOVF9LRVl9YCxcbiAgSElEREVOOiBgaGlkZGVuJHtFVkVOVF9LRVl9YCxcbiAgU0hPVzogYHNob3cke0VWRU5UX0tFWX1gLFxuICBTSE9XTjogYHNob3duJHtFVkVOVF9LRVl9YCxcbiAgSU5TRVJURUQ6IGBpbnNlcnRlZCR7RVZFTlRfS0VZfWAsXG4gIENMSUNLOiBgY2xpY2ske0VWRU5UX0tFWX1gLFxuICBGT0NVU0lOOiBgZm9jdXNpbiR7RVZFTlRfS0VZfWAsXG4gIEZPQ1VTT1VUOiBgZm9jdXNvdXQke0VWRU5UX0tFWX1gLFxuICBNT1VTRUVOVEVSOiBgbW91c2VlbnRlciR7RVZFTlRfS0VZfWAsXG4gIE1PVVNFTEVBVkU6IGBtb3VzZWxlYXZlJHtFVkVOVF9LRVl9YFxufVxuXG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSdcbmNvbnN0IENMQVNTX05BTUVfTU9EQUwgPSAnbW9kYWwnXG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcblxuY29uc3QgSE9WRVJfU1RBVEVfU0hPVyA9ICdzaG93J1xuY29uc3QgSE9WRVJfU1RBVEVfT1VUID0gJ291dCdcblxuY29uc3QgU0VMRUNUT1JfVE9PTFRJUF9JTk5FUiA9ICcudG9vbHRpcC1pbm5lcidcbmNvbnN0IFNFTEVDVE9SX01PREFMID0gYC4ke0NMQVNTX05BTUVfTU9EQUx9YFxuXG5jb25zdCBFVkVOVF9NT0RBTF9ISURFID0gJ2hpZGUuYnMubW9kYWwnXG5cbmNvbnN0IFRSSUdHRVJfSE9WRVIgPSAnaG92ZXInXG5jb25zdCBUUklHR0VSX0ZPQ1VTID0gJ2ZvY3VzJ1xuY29uc3QgVFJJR0dFUl9DTElDSyA9ICdjbGljaydcbmNvbnN0IFRSSUdHRVJfTUFOVUFMID0gJ21hbnVhbCdcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENsYXNzIERlZmluaXRpb25cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmNsYXNzIFRvb2x0aXAgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgaWYgKHR5cGVvZiBQb3BwZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb290c3RyYXBcXCdzIHRvb2x0aXBzIHJlcXVpcmUgUG9wcGVyIChodHRwczovL3BvcHBlci5qcy5vcmcpJylcbiAgICB9XG5cbiAgICBzdXBlcihlbGVtZW50KVxuXG4gICAgLy8gcHJpdmF0ZVxuICAgIHRoaXMuX2lzRW5hYmxlZCA9IHRydWVcbiAgICB0aGlzLl90aW1lb3V0ID0gMFxuICAgIHRoaXMuX2hvdmVyU3RhdGUgPSAnJ1xuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXIgPSB7fVxuICAgIHRoaXMuX3BvcHBlciA9IG51bGxcblxuICAgIC8vIFByb3RlY3RlZFxuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpXG4gICAgdGhpcy50aXAgPSBudWxsXG5cbiAgICB0aGlzLl9zZXRMaXN0ZW5lcnMoKVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICBzdGF0aWMgZ2V0IEV2ZW50KCkge1xuICAgIHJldHVybiBFdmVudFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuXG4gIGVuYWJsZSgpIHtcbiAgICB0aGlzLl9pc0VuYWJsZWQgPSB0cnVlXG4gIH1cblxuICBkaXNhYmxlKCkge1xuICAgIHRoaXMuX2lzRW5hYmxlZCA9IGZhbHNlXG4gIH1cblxuICB0b2dnbGVFbmFibGVkKCkge1xuICAgIHRoaXMuX2lzRW5hYmxlZCA9ICF0aGlzLl9pc0VuYWJsZWRcbiAgfVxuXG4gIHRvZ2dsZShldmVudCkge1xuICAgIGlmICghdGhpcy5faXNFbmFibGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9pbml0aWFsaXplT25EZWxlZ2F0ZWRUYXJnZXQoZXZlbnQpXG5cbiAgICAgIGNvbnRleHQuX2FjdGl2ZVRyaWdnZXIuY2xpY2sgPSAhY29udGV4dC5fYWN0aXZlVHJpZ2dlci5jbGlja1xuXG4gICAgICBpZiAoY29udGV4dC5faXNXaXRoQWN0aXZlVHJpZ2dlcigpKSB7XG4gICAgICAgIGNvbnRleHQuX2VudGVyKG51bGwsIGNvbnRleHQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZXh0Ll9sZWF2ZShudWxsLCBjb250ZXh0KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5nZXRUaXBFbGVtZW50KCkuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU0hPVykpIHtcbiAgICAgICAgdGhpcy5fbGVhdmUobnVsbCwgdGhpcylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2VudGVyKG51bGwsIHRoaXMpXG4gICAgfVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dClcblxuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX01PREFMKSwgRVZFTlRfTU9EQUxfSElERSwgdGhpcy5faGlkZU1vZGFsSGFuZGxlcilcblxuICAgIGlmICh0aGlzLnRpcCkge1xuICAgICAgdGhpcy50aXAucmVtb3ZlKClcbiAgICB9XG5cbiAgICB0aGlzLl9kaXNwb3NlUG9wcGVyKClcbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIHNob3coKSB7XG4gICAgaWYgKHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSB1c2Ugc2hvdyBvbiB2aXNpYmxlIGVsZW1lbnRzJylcbiAgICB9XG5cbiAgICBpZiAoISh0aGlzLmlzV2l0aENvbnRlbnQoKSAmJiB0aGlzLl9pc0VuYWJsZWQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkV2ZW50LlNIT1cpXG4gICAgY29uc3Qgc2hhZG93Um9vdCA9IGZpbmRTaGFkb3dSb290KHRoaXMuX2VsZW1lbnQpXG4gICAgY29uc3QgaXNJblRoZURvbSA9IHNoYWRvd1Jvb3QgPT09IG51bGwgP1xuICAgICAgdGhpcy5fZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb250YWlucyh0aGlzLl9lbGVtZW50KSA6XG4gICAgICBzaGFkb3dSb290LmNvbnRhaW5zKHRoaXMuX2VsZW1lbnQpXG5cbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgfHwgIWlzSW5UaGVEb20pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIEEgdHJpY2sgdG8gcmVjcmVhdGUgYSB0b29sdGlwIGluIGNhc2UgYSBuZXcgdGl0bGUgaXMgZ2l2ZW4gYnkgdXNpbmcgdGhlIE5PVCBkb2N1bWVudGVkIGBkYXRhLWJzLW9yaWdpbmFsLXRpdGxlYFxuICAgIC8vIFRoaXMgd2lsbCBiZSByZW1vdmVkIGxhdGVyIGluIGZhdm9yIG9mIGEgYHNldENvbnRlbnRgIG1ldGhvZFxuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yLk5BTUUgPT09ICd0b29sdGlwJyAmJiB0aGlzLnRpcCAmJiB0aGlzLmdldFRpdGxlKCkgIT09IHRoaXMudGlwLnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfVE9PTFRJUF9JTk5FUikuaW5uZXJIVE1MKSB7XG4gICAgICB0aGlzLl9kaXNwb3NlUG9wcGVyKClcbiAgICAgIHRoaXMudGlwLnJlbW92ZSgpXG4gICAgICB0aGlzLnRpcCA9IG51bGxcbiAgICB9XG5cbiAgICBjb25zdCB0aXAgPSB0aGlzLmdldFRpcEVsZW1lbnQoKVxuICAgIGNvbnN0IHRpcElkID0gZ2V0VUlEKHRoaXMuY29uc3RydWN0b3IuTkFNRSlcblxuICAgIHRpcC5zZXRBdHRyaWJ1dGUoJ2lkJywgdGlwSWQpXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCB0aXBJZClcblxuICAgIGlmICh0aGlzLl9jb25maWcuYW5pbWF0aW9uKSB7XG4gICAgICB0aXAuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0ZBREUpXG4gICAgfVxuXG4gICAgY29uc3QgcGxhY2VtZW50ID0gdHlwZW9mIHRoaXMuX2NvbmZpZy5wbGFjZW1lbnQgPT09ICdmdW5jdGlvbicgP1xuICAgICAgdGhpcy5fY29uZmlnLnBsYWNlbWVudC5jYWxsKHRoaXMsIHRpcCwgdGhpcy5fZWxlbWVudCkgOlxuICAgICAgdGhpcy5fY29uZmlnLnBsYWNlbWVudFxuXG4gICAgY29uc3QgYXR0YWNobWVudCA9IHRoaXMuX2dldEF0dGFjaG1lbnQocGxhY2VtZW50KVxuICAgIHRoaXMuX2FkZEF0dGFjaG1lbnRDbGFzcyhhdHRhY2htZW50KVxuXG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHRoaXMuX2NvbmZpZ1xuICAgIERhdGEuc2V0KHRpcCwgdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSwgdGhpcylcblxuICAgIGlmICghdGhpcy5fZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb250YWlucyh0aGlzLnRpcCkpIHtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmQodGlwKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5JTlNFUlRFRClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIudXBkYXRlKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcG9wcGVyID0gUG9wcGVyLmNyZWF0ZVBvcHBlcih0aGlzLl9lbGVtZW50LCB0aXAsIHRoaXMuX2dldFBvcHBlckNvbmZpZyhhdHRhY2htZW50KSlcbiAgICB9XG5cbiAgICB0aXAuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1cpXG5cbiAgICBjb25zdCBjdXN0b21DbGFzcyA9IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy5jdXN0b21DbGFzcylcbiAgICBpZiAoY3VzdG9tQ2xhc3MpIHtcbiAgICAgIHRpcC5jbGFzc0xpc3QuYWRkKC4uLmN1c3RvbUNsYXNzLnNwbGl0KCcgJykpXG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIGFkZCBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgdG8gdGhlIGJvZHkncyBpbW1lZGlhdGUgY2hpbGRyZW47XG4gICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTQvMDIvbW91c2VfZXZlbnRfYnViLmh0bWxcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBbXS5jb25jYXQoLi4uZG9jdW1lbnQuYm9keS5jaGlsZHJlbikuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgRXZlbnRIYW5kbGVyLm9uKGVsZW1lbnQsICdtb3VzZW92ZXInLCBub29wKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHByZXZIb3ZlclN0YXRlID0gdGhpcy5faG92ZXJTdGF0ZVxuXG4gICAgICB0aGlzLl9ob3ZlclN0YXRlID0gbnVsbFxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5TSE9XTilcblxuICAgICAgaWYgKHByZXZIb3ZlclN0YXRlID09PSBIT1ZFUl9TVEFURV9PVVQpIHtcbiAgICAgICAgdGhpcy5fbGVhdmUobnVsbCwgdGhpcylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpc0FuaW1hdGVkID0gdGhpcy50aXAuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSlcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLnRpcCwgaXNBbmltYXRlZClcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLl9wb3BwZXIpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHRpcCA9IHRoaXMuZ2V0VGlwRWxlbWVudCgpXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5faXNXaXRoQWN0aXZlVHJpZ2dlcigpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5faG92ZXJTdGF0ZSAhPT0gSE9WRVJfU1RBVEVfU0hPVykge1xuICAgICAgICB0aXAucmVtb3ZlKClcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY2xlYW5UaXBDbGFzcygpXG4gICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkV2ZW50LkhJRERFTilcblxuICAgICAgdGhpcy5fZGlzcG9zZVBvcHBlcigpXG4gICAgfVxuXG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5ISURFKVxuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGlwLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIHJlbW92ZSB0aGUgZXh0cmFcbiAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHdlIGFkZGVkIGZvciBpT1Mgc3VwcG9ydFxuICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKVxuICAgICAgICAuZm9yRWFjaChlbGVtZW50ID0+IEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApKVxuICAgIH1cblxuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9DTElDS10gPSBmYWxzZVxuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9GT0NVU10gPSBmYWxzZVxuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9IT1ZFUl0gPSBmYWxzZVxuXG4gICAgY29uc3QgaXNBbmltYXRlZCA9IHRoaXMudGlwLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUpXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy50aXAsIGlzQW5pbWF0ZWQpXG4gICAgdGhpcy5faG92ZXJTdGF0ZSA9ICcnXG4gIH1cblxuICB1cGRhdGUoKSB7XG4gICAgaWYgKHRoaXMuX3BvcHBlciAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fcG9wcGVyLnVwZGF0ZSgpXG4gICAgfVxuICB9XG5cbiAgLy8gUHJvdGVjdGVkXG5cbiAgaXNXaXRoQ29udGVudCgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLmdldFRpdGxlKCkpXG4gIH1cblxuICBnZXRUaXBFbGVtZW50KCkge1xuICAgIGlmICh0aGlzLnRpcCkge1xuICAgICAgcmV0dXJuIHRoaXMudGlwXG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgZWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLl9jb25maWcudGVtcGxhdGVcblxuICAgIGNvbnN0IHRpcCA9IGVsZW1lbnQuY2hpbGRyZW5bMF1cbiAgICB0aGlzLnNldENvbnRlbnQodGlwKVxuICAgIHRpcC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfRkFERSwgQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgdGhpcy50aXAgPSB0aXBcbiAgICByZXR1cm4gdGhpcy50aXBcbiAgfVxuXG4gIHNldENvbnRlbnQodGlwKSB7XG4gICAgdGhpcy5fc2FuaXRpemVBbmRTZXRDb250ZW50KHRpcCwgdGhpcy5nZXRUaXRsZSgpLCBTRUxFQ1RPUl9UT09MVElQX0lOTkVSKVxuICB9XG5cbiAgX3Nhbml0aXplQW5kU2V0Q29udGVudCh0ZW1wbGF0ZSwgY29udGVudCwgc2VsZWN0b3IpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZUVsZW1lbnQgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKHNlbGVjdG9yLCB0ZW1wbGF0ZSlcblxuICAgIGlmICghY29udGVudCAmJiB0ZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICAgIHRlbXBsYXRlRWxlbWVudC5yZW1vdmUoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gd2UgdXNlIGFwcGVuZCBmb3IgaHRtbCBvYmplY3RzIHRvIG1haW50YWluIGpzIGV2ZW50c1xuICAgIHRoaXMuc2V0RWxlbWVudENvbnRlbnQodGVtcGxhdGVFbGVtZW50LCBjb250ZW50KVxuICB9XG5cbiAgc2V0RWxlbWVudENvbnRlbnQoZWxlbWVudCwgY29udGVudCkge1xuICAgIGlmIChlbGVtZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaXNFbGVtZW50KGNvbnRlbnQpKSB7XG4gICAgICBjb250ZW50ID0gZ2V0RWxlbWVudChjb250ZW50KVxuXG4gICAgICAvLyBjb250ZW50IGlzIGEgRE9NIG5vZGUgb3IgYSBqUXVlcnlcbiAgICAgIGlmICh0aGlzLl9jb25maWcuaHRtbCkge1xuICAgICAgICBpZiAoY29udGVudC5wYXJlbnROb2RlICE9PSBlbGVtZW50KSB7XG4gICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSAnJ1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kKGNvbnRlbnQpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSBjb250ZW50LnRleHRDb250ZW50XG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jb25maWcuaHRtbCkge1xuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5zYW5pdGl6ZSkge1xuICAgICAgICBjb250ZW50ID0gc2FuaXRpemVIdG1sKGNvbnRlbnQsIHRoaXMuX2NvbmZpZy5hbGxvd0xpc3QsIHRoaXMuX2NvbmZpZy5zYW5pdGl6ZUZuKVxuICAgICAgfVxuXG4gICAgICBlbGVtZW50LmlubmVySFRNTCA9IGNvbnRlbnRcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IGNvbnRlbnRcbiAgICB9XG4gIH1cblxuICBnZXRUaXRsZSgpIHtcbiAgICBjb25zdCB0aXRsZSA9IHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJykgfHwgdGhpcy5fY29uZmlnLnRpdGxlXG5cbiAgICByZXR1cm4gdGhpcy5fcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24odGl0bGUpXG4gIH1cblxuICB1cGRhdGVBdHRhY2htZW50KGF0dGFjaG1lbnQpIHtcbiAgICBpZiAoYXR0YWNobWVudCA9PT0gJ3JpZ2h0Jykge1xuICAgICAgcmV0dXJuICdlbmQnXG4gICAgfVxuXG4gICAgaWYgKGF0dGFjaG1lbnQgPT09ICdsZWZ0Jykge1xuICAgICAgcmV0dXJuICdzdGFydCdcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0YWNobWVudFxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuXG4gIF9pbml0aWFsaXplT25EZWxlZ2F0ZWRUYXJnZXQoZXZlbnQsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gY29udGV4dCB8fCB0aGlzLmNvbnN0cnVjdG9yLmdldE9yQ3JlYXRlSW5zdGFuY2UoZXZlbnQuZGVsZWdhdGVUYXJnZXQsIHRoaXMuX2dldERlbGVnYXRlQ29uZmlnKCkpXG4gIH1cblxuICBfZ2V0T2Zmc2V0KCkge1xuICAgIGNvbnN0IHsgb2Zmc2V0IH0gPSB0aGlzLl9jb25maWdcblxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG9mZnNldC5zcGxpdCgnLCcpLm1hcCh2YWwgPT4gTnVtYmVyLnBhcnNlSW50KHZhbCwgMTApKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcG9wcGVyRGF0YSA9PiBvZmZzZXQocG9wcGVyRGF0YSwgdGhpcy5fZWxlbWVudClcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0XG4gIH1cblxuICBfcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24oY29udGVudCkge1xuICAgIHJldHVybiB0eXBlb2YgY29udGVudCA9PT0gJ2Z1bmN0aW9uJyA/IGNvbnRlbnQuY2FsbCh0aGlzLl9lbGVtZW50KSA6IGNvbnRlbnRcbiAgfVxuXG4gIF9nZXRQb3BwZXJDb25maWcoYXR0YWNobWVudCkge1xuICAgIGNvbnN0IGRlZmF1bHRCc1BvcHBlckNvbmZpZyA9IHtcbiAgICAgIHBsYWNlbWVudDogYXR0YWNobWVudCxcbiAgICAgIG1vZGlmaWVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2ZsaXAnLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGZhbGxiYWNrUGxhY2VtZW50czogdGhpcy5fY29uZmlnLmZhbGxiYWNrUGxhY2VtZW50c1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdvZmZzZXQnLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIG9mZnNldDogdGhpcy5fZ2V0T2Zmc2V0KClcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBib3VuZGFyeTogdGhpcy5fY29uZmlnLmJvdW5kYXJ5XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2Fycm93JyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBlbGVtZW50OiBgLiR7dGhpcy5jb25zdHJ1Y3Rvci5OQU1FfS1hcnJvd2BcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnb25DaGFuZ2UnLFxuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgcGhhc2U6ICdhZnRlcldyaXRlJyxcbiAgICAgICAgICBmbjogZGF0YSA9PiB0aGlzLl9oYW5kbGVQb3BwZXJQbGFjZW1lbnRDaGFuZ2UoZGF0YSlcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIG9uRmlyc3RVcGRhdGU6IGRhdGEgPT4ge1xuICAgICAgICBpZiAoZGF0YS5vcHRpb25zLnBsYWNlbWVudCAhPT0gZGF0YS5wbGFjZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLl9oYW5kbGVQb3BwZXJQbGFjZW1lbnRDaGFuZ2UoZGF0YSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWZhdWx0QnNQb3BwZXJDb25maWcsXG4gICAgICAuLi4odHlwZW9mIHRoaXMuX2NvbmZpZy5wb3BwZXJDb25maWcgPT09ICdmdW5jdGlvbicgPyB0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnKGRlZmF1bHRCc1BvcHBlckNvbmZpZykgOiB0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIF9hZGRBdHRhY2htZW50Q2xhc3MoYXR0YWNobWVudCkge1xuICAgIHRoaXMuZ2V0VGlwRWxlbWVudCgpLmNsYXNzTGlzdC5hZGQoYCR7dGhpcy5fZ2V0QmFzaWNDbGFzc1ByZWZpeCgpfS0ke3RoaXMudXBkYXRlQXR0YWNobWVudChhdHRhY2htZW50KX1gKVxuICB9XG5cbiAgX2dldEF0dGFjaG1lbnQocGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIEF0dGFjaG1lbnRNYXBbcGxhY2VtZW50LnRvVXBwZXJDYXNlKCldXG4gIH1cblxuICBfc2V0TGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHRyaWdnZXJzID0gdGhpcy5fY29uZmlnLnRyaWdnZXIuc3BsaXQoJyAnKVxuXG4gICAgdHJpZ2dlcnMuZm9yRWFjaCh0cmlnZ2VyID0+IHtcbiAgICAgIGlmICh0cmlnZ2VyID09PSAnY2xpY2snKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkV2ZW50LkNMSUNLLCB0aGlzLl9jb25maWcuc2VsZWN0b3IsIGV2ZW50ID0+IHRoaXMudG9nZ2xlKGV2ZW50KSlcbiAgICAgIH0gZWxzZSBpZiAodHJpZ2dlciAhPT0gVFJJR0dFUl9NQU5VQUwpIHtcbiAgICAgICAgY29uc3QgZXZlbnRJbiA9IHRyaWdnZXIgPT09IFRSSUdHRVJfSE9WRVIgP1xuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IuRXZlbnQuTU9VU0VFTlRFUiA6XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5GT0NVU0lOXG4gICAgICAgIGNvbnN0IGV2ZW50T3V0ID0gdHJpZ2dlciA9PT0gVFJJR0dFUl9IT1ZFUiA/XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5NT1VTRUxFQVZFIDpcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLkV2ZW50LkZPQ1VTT1VUXG5cbiAgICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIGV2ZW50SW4sIHRoaXMuX2NvbmZpZy5zZWxlY3RvciwgZXZlbnQgPT4gdGhpcy5fZW50ZXIoZXZlbnQpKVxuICAgICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgZXZlbnRPdXQsIHRoaXMuX2NvbmZpZy5zZWxlY3RvciwgZXZlbnQgPT4gdGhpcy5fbGVhdmUoZXZlbnQpKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLl9oaWRlTW9kYWxIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2VsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5oaWRlKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX01PREFMKSwgRVZFTlRfTU9EQUxfSElERSwgdGhpcy5faGlkZU1vZGFsSGFuZGxlcilcblxuICAgIGlmICh0aGlzLl9jb25maWcuc2VsZWN0b3IpIHtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IHtcbiAgICAgICAgLi4udGhpcy5fY29uZmlnLFxuICAgICAgICB0cmlnZ2VyOiAnbWFudWFsJyxcbiAgICAgICAgc2VsZWN0b3I6ICcnXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2ZpeFRpdGxlKClcbiAgICB9XG4gIH1cblxuICBfZml4VGl0bGUoKSB7XG4gICAgY29uc3QgdGl0bGUgPSB0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgndGl0bGUnKVxuICAgIGNvbnN0IG9yaWdpbmFsVGl0bGVUeXBlID0gdHlwZW9mIHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJylcblxuICAgIGlmICh0aXRsZSB8fCBvcmlnaW5hbFRpdGxlVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJywgdGl0bGUgfHwgJycpXG4gICAgICBpZiAodGl0bGUgJiYgIXRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJykgJiYgIXRoaXMuX2VsZW1lbnQudGV4dENvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0aXRsZSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJycpXG4gICAgfVxuICB9XG5cbiAgX2VudGVyKGV2ZW50LCBjb250ZXh0KSB7XG4gICAgY29udGV4dCA9IHRoaXMuX2luaXRpYWxpemVPbkRlbGVnYXRlZFRhcmdldChldmVudCwgY29udGV4dClcblxuICAgIGlmIChldmVudCkge1xuICAgICAgY29udGV4dC5fYWN0aXZlVHJpZ2dlcltcbiAgICAgICAgZXZlbnQudHlwZSA9PT0gJ2ZvY3VzaW4nID8gVFJJR0dFUl9GT0NVUyA6IFRSSUdHRVJfSE9WRVJcbiAgICAgIF0gPSB0cnVlXG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQuZ2V0VGlwRWxlbWVudCgpLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1cpIHx8IGNvbnRleHQuX2hvdmVyU3RhdGUgPT09IEhPVkVSX1NUQVRFX1NIT1cpIHtcbiAgICAgIGNvbnRleHQuX2hvdmVyU3RhdGUgPSBIT1ZFUl9TVEFURV9TSE9XXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjbGVhclRpbWVvdXQoY29udGV4dC5fdGltZW91dClcblxuICAgIGNvbnRleHQuX2hvdmVyU3RhdGUgPSBIT1ZFUl9TVEFURV9TSE9XXG5cbiAgICBpZiAoIWNvbnRleHQuX2NvbmZpZy5kZWxheSB8fCAhY29udGV4dC5fY29uZmlnLmRlbGF5LnNob3cpIHtcbiAgICAgIGNvbnRleHQuc2hvdygpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb250ZXh0Ll90aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoY29udGV4dC5faG92ZXJTdGF0ZSA9PT0gSE9WRVJfU1RBVEVfU0hPVykge1xuICAgICAgICBjb250ZXh0LnNob3coKVxuICAgICAgfVxuICAgIH0sIGNvbnRleHQuX2NvbmZpZy5kZWxheS5zaG93KVxuICB9XG5cbiAgX2xlYXZlKGV2ZW50LCBjb250ZXh0KSB7XG4gICAgY29udGV4dCA9IHRoaXMuX2luaXRpYWxpemVPbkRlbGVnYXRlZFRhcmdldChldmVudCwgY29udGV4dClcblxuICAgIGlmIChldmVudCkge1xuICAgICAgY29udGV4dC5fYWN0aXZlVHJpZ2dlcltcbiAgICAgICAgZXZlbnQudHlwZSA9PT0gJ2ZvY3Vzb3V0JyA/IFRSSUdHRVJfRk9DVVMgOiBUUklHR0VSX0hPVkVSXG4gICAgICBdID0gY29udGV4dC5fZWxlbWVudC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KVxuICAgIH1cblxuICAgIGlmIChjb250ZXh0Ll9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNsZWFyVGltZW91dChjb250ZXh0Ll90aW1lb3V0KVxuXG4gICAgY29udGV4dC5faG92ZXJTdGF0ZSA9IEhPVkVSX1NUQVRFX09VVFxuXG4gICAgaWYgKCFjb250ZXh0Ll9jb25maWcuZGVsYXkgfHwgIWNvbnRleHQuX2NvbmZpZy5kZWxheS5oaWRlKSB7XG4gICAgICBjb250ZXh0LmhpZGUoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29udGV4dC5fdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKGNvbnRleHQuX2hvdmVyU3RhdGUgPT09IEhPVkVSX1NUQVRFX09VVCkge1xuICAgICAgICBjb250ZXh0LmhpZGUoKVxuICAgICAgfVxuICAgIH0sIGNvbnRleHQuX2NvbmZpZy5kZWxheS5oaWRlKVxuICB9XG5cbiAgX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKSB7XG4gICAgZm9yIChjb25zdCB0cmlnZ2VyIGluIHRoaXMuX2FjdGl2ZVRyaWdnZXIpIHtcbiAgICAgIGlmICh0aGlzLl9hY3RpdmVUcmlnZ2VyW3RyaWdnZXJdKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbnN0IGRhdGFBdHRyaWJ1dGVzID0gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZXModGhpcy5fZWxlbWVudClcblxuICAgIE9iamVjdC5rZXlzKGRhdGFBdHRyaWJ1dGVzKS5mb3JFYWNoKGRhdGFBdHRyID0+IHtcbiAgICAgIGlmIChESVNBTExPV0VEX0FUVFJJQlVURVMuaGFzKGRhdGFBdHRyKSkge1xuICAgICAgICBkZWxldGUgZGF0YUF0dHJpYnV0ZXNbZGF0YUF0dHJdXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuY29uc3RydWN0b3IuRGVmYXVsdCxcbiAgICAgIC4uLmRhdGFBdHRyaWJ1dGVzLFxuICAgICAgLi4uKHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmIGNvbmZpZyA/IGNvbmZpZyA6IHt9KVxuICAgIH1cblxuICAgIGNvbmZpZy5jb250YWluZXIgPSBjb25maWcuY29udGFpbmVyID09PSBmYWxzZSA/IGRvY3VtZW50LmJvZHkgOiBnZXRFbGVtZW50KGNvbmZpZy5jb250YWluZXIpXG5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy5kZWxheSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbmZpZy5kZWxheSA9IHtcbiAgICAgICAgc2hvdzogY29uZmlnLmRlbGF5LFxuICAgICAgICBoaWRlOiBjb25maWcuZGVsYXlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy50aXRsZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbmZpZy50aXRsZSA9IGNvbmZpZy50aXRsZS50b1N0cmluZygpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb25maWcuY29udGVudCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbmZpZy5jb250ZW50ID0gY29uZmlnLmNvbnRlbnQudG9TdHJpbmcoKVxuICAgIH1cblxuICAgIHR5cGVDaGVja0NvbmZpZyhOQU1FLCBjb25maWcsIHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpXG5cbiAgICBpZiAoY29uZmlnLnNhbml0aXplKSB7XG4gICAgICBjb25maWcudGVtcGxhdGUgPSBzYW5pdGl6ZUh0bWwoY29uZmlnLnRlbXBsYXRlLCBjb25maWcuYWxsb3dMaXN0LCBjb25maWcuc2FuaXRpemVGbilcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfZ2V0RGVsZWdhdGVDb25maWcoKSB7XG4gICAgY29uc3QgY29uZmlnID0ge31cblxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuX2NvbmZpZykge1xuICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFtrZXldICE9PSB0aGlzLl9jb25maWdba2V5XSkge1xuICAgICAgICBjb25maWdba2V5XSA9IHRoaXMuX2NvbmZpZ1trZXldXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW4gdGhlIGZ1dHVyZSBjYW4gYmUgcmVwbGFjZWQgd2l0aDpcbiAgICAvLyBjb25zdCBrZXlzV2l0aERpZmZlcmVudFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuX2NvbmZpZykuZmlsdGVyKGVudHJ5ID0+IHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFtlbnRyeVswXV0gIT09IHRoaXMuX2NvbmZpZ1tlbnRyeVswXV0pXG4gICAgLy8gYE9iamVjdC5mcm9tRW50cmllcyhrZXlzV2l0aERpZmZlcmVudFZhbHVlcylgXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2NsZWFuVGlwQ2xhc3MoKSB7XG4gICAgY29uc3QgdGlwID0gdGhpcy5nZXRUaXBFbGVtZW50KClcbiAgICBjb25zdCBiYXNpY0NsYXNzUHJlZml4UmVnZXggPSBuZXcgUmVnRXhwKGAoXnxcXFxccykke3RoaXMuX2dldEJhc2ljQ2xhc3NQcmVmaXgoKX1cXFxcUytgLCAnZycpXG4gICAgY29uc3QgdGFiQ2xhc3MgPSB0aXAuZ2V0QXR0cmlidXRlKCdjbGFzcycpLm1hdGNoKGJhc2ljQ2xhc3NQcmVmaXhSZWdleClcbiAgICBpZiAodGFiQ2xhc3MgIT09IG51bGwgJiYgdGFiQ2xhc3MubGVuZ3RoID4gMCkge1xuICAgICAgdGFiQ2xhc3MubWFwKHRva2VuID0+IHRva2VuLnRyaW0oKSlcbiAgICAgICAgLmZvckVhY2godENsYXNzID0+IHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRDbGFzcykpXG4gICAgfVxuICB9XG5cbiAgX2dldEJhc2ljQ2xhc3NQcmVmaXgoKSB7XG4gICAgcmV0dXJuIENMQVNTX1BSRUZJWFxuICB9XG5cbiAgX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZShwb3BwZXJEYXRhKSB7XG4gICAgY29uc3QgeyBzdGF0ZSB9ID0gcG9wcGVyRGF0YVxuXG4gICAgaWYgKCFzdGF0ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy50aXAgPSBzdGF0ZS5lbGVtZW50cy5wb3BwZXJcbiAgICB0aGlzLl9jbGVhblRpcENsYXNzKClcbiAgICB0aGlzLl9hZGRBdHRhY2htZW50Q2xhc3ModGhpcy5fZ2V0QXR0YWNobWVudChzdGF0ZS5wbGFjZW1lbnQpKVxuICB9XG5cbiAgX2Rpc3Bvc2VQb3BwZXIoKSB7XG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLmRlc3Ryb3koKVxuICAgICAgdGhpcy5fcG9wcGVyID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXRpY1xuXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gVG9vbHRpcC5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogalF1ZXJ5XG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIGFkZCAuVG9vbHRpcCB0byBqUXVlcnkgb25seSBpZiBqUXVlcnkgaXMgcHJlc2VudFxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihUb29sdGlwKVxuXG5leHBvcnQgZGVmYXVsdCBUb29sdGlwXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NS4xLjMpOiBwb3BvdmVyLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IHsgZGVmaW5lSlF1ZXJ5UGx1Z2luIH0gZnJvbSAnLi91dGlsL2luZGV4J1xuaW1wb3J0IFRvb2x0aXAgZnJvbSAnLi90b29sdGlwJ1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29uc3RhbnRzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jb25zdCBOQU1FID0gJ3BvcG92ZXInXG5jb25zdCBEQVRBX0tFWSA9ICdicy5wb3BvdmVyJ1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcbmNvbnN0IENMQVNTX1BSRUZJWCA9ICdicy1wb3BvdmVyJ1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICAuLi5Ub29sdGlwLkRlZmF1bHQsXG4gIHBsYWNlbWVudDogJ3JpZ2h0JyxcbiAgb2Zmc2V0OiBbMCwgOF0sXG4gIHRyaWdnZXI6ICdjbGljaycsXG4gIGNvbnRlbnQ6ICcnLFxuICB0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9XCJwb3BvdmVyXCIgcm9sZT1cInRvb2x0aXBcIj4nICtcbiAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJwb3BvdmVyLWFycm93XCI+PC9kaXY+JyArXG4gICAgICAgICAgICAgICc8aDMgY2xhc3M9XCJwb3BvdmVyLWhlYWRlclwiPjwvaDM+JyArXG4gICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwicG9wb3Zlci1ib2R5XCI+PC9kaXY+JyArXG4gICAgICAgICAgICAnPC9kaXY+J1xufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgLi4uVG9vbHRpcC5EZWZhdWx0VHlwZSxcbiAgY29udGVudDogJyhzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbiknXG59XG5cbmNvbnN0IEV2ZW50ID0ge1xuICBISURFOiBgaGlkZSR7RVZFTlRfS0VZfWAsXG4gIEhJRERFTjogYGhpZGRlbiR7RVZFTlRfS0VZfWAsXG4gIFNIT1c6IGBzaG93JHtFVkVOVF9LRVl9YCxcbiAgU0hPV046IGBzaG93biR7RVZFTlRfS0VZfWAsXG4gIElOU0VSVEVEOiBgaW5zZXJ0ZWQke0VWRU5UX0tFWX1gLFxuICBDTElDSzogYGNsaWNrJHtFVkVOVF9LRVl9YCxcbiAgRk9DVVNJTjogYGZvY3VzaW4ke0VWRU5UX0tFWX1gLFxuICBGT0NVU09VVDogYGZvY3Vzb3V0JHtFVkVOVF9LRVl9YCxcbiAgTU9VU0VFTlRFUjogYG1vdXNlZW50ZXIke0VWRU5UX0tFWX1gLFxuICBNT1VTRUxFQVZFOiBgbW91c2VsZWF2ZSR7RVZFTlRfS0VZfWBcbn1cblxuY29uc3QgU0VMRUNUT1JfVElUTEUgPSAnLnBvcG92ZXItaGVhZGVyJ1xuY29uc3QgU0VMRUNUT1JfQ09OVEVOVCA9ICcucG9wb3Zlci1ib2R5J1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ2xhc3MgRGVmaW5pdGlvblxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuY2xhc3MgUG9wb3ZlciBleHRlbmRzIFRvb2x0aXAge1xuICAvLyBHZXR0ZXJzXG5cbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRXZlbnQoKSB7XG4gICAgcmV0dXJuIEV2ZW50XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgLy8gT3ZlcnJpZGVzXG5cbiAgaXNXaXRoQ29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRUaXRsZSgpIHx8IHRoaXMuX2dldENvbnRlbnQoKVxuICB9XG5cbiAgc2V0Q29udGVudCh0aXApIHtcbiAgICB0aGlzLl9zYW5pdGl6ZUFuZFNldENvbnRlbnQodGlwLCB0aGlzLmdldFRpdGxlKCksIFNFTEVDVE9SX1RJVExFKVxuICAgIHRoaXMuX3Nhbml0aXplQW5kU2V0Q29udGVudCh0aXAsIHRoaXMuX2dldENvbnRlbnQoKSwgU0VMRUNUT1JfQ09OVEVOVClcbiAgfVxuXG4gIC8vIFByaXZhdGVcblxuICBfZ2V0Q29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24odGhpcy5fY29uZmlnLmNvbnRlbnQpXG4gIH1cblxuICBfZ2V0QmFzaWNDbGFzc1ByZWZpeCgpIHtcbiAgICByZXR1cm4gQ0xBU1NfUFJFRklYXG4gIH1cblxuICAvLyBTdGF0aWNcblxuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFBvcG92ZXIuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICAgIH1cblxuICAgICAgICBkYXRhW2NvbmZpZ10oKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIGpRdWVyeVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBhZGQgLlBvcG92ZXIgdG8galF1ZXJ5IG9ubHkgaWYgalF1ZXJ5IGlzIHByZXNlbnRcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oUG9wb3ZlcilcblxuZXhwb3J0IGRlZmF1bHQgUG9wb3ZlclxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMS4zKTogc2Nyb2xsc3B5LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IHtcbiAgZGVmaW5lSlF1ZXJ5UGx1Z2luLFxuICBnZXRFbGVtZW50LFxuICBnZXRTZWxlY3RvckZyb21FbGVtZW50LFxuICB0eXBlQ2hlY2tDb25maWdcbn0gZnJvbSAnLi91dGlsL2luZGV4J1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyJ1xuaW1wb3J0IE1hbmlwdWxhdG9yIGZyb20gJy4vZG9tL21hbmlwdWxhdG9yJ1xuaW1wb3J0IFNlbGVjdG9yRW5naW5lIGZyb20gJy4vZG9tL3NlbGVjdG9yLWVuZ2luZSdcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQnXG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb25zdGFudHNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmNvbnN0IE5BTUUgPSAnc2Nyb2xsc3B5J1xuY29uc3QgREFUQV9LRVkgPSAnYnMuc2Nyb2xsc3B5J1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcbmNvbnN0IERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIG9mZnNldDogMTAsXG4gIG1ldGhvZDogJ2F1dG8nLFxuICB0YXJnZXQ6ICcnXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBvZmZzZXQ6ICdudW1iZXInLFxuICBtZXRob2Q6ICdzdHJpbmcnLFxuICB0YXJnZXQ6ICcoc3RyaW5nfGVsZW1lbnQpJ1xufVxuXG5jb25zdCBFVkVOVF9BQ1RJVkFURSA9IGBhY3RpdmF0ZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NDUk9MTCA9IGBzY3JvbGwke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9MT0FEX0RBVEFfQVBJID0gYGxvYWQke0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5cbmNvbnN0IENMQVNTX05BTUVfRFJPUERPV05fSVRFTSA9ICdkcm9wZG93bi1pdGVtJ1xuY29uc3QgQ0xBU1NfTkFNRV9BQ1RJVkUgPSAnYWN0aXZlJ1xuXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1NQWSA9ICdbZGF0YS1icy1zcHk9XCJzY3JvbGxcIl0nXG5jb25zdCBTRUxFQ1RPUl9OQVZfTElTVF9HUk9VUCA9ICcubmF2LCAubGlzdC1ncm91cCdcbmNvbnN0IFNFTEVDVE9SX05BVl9MSU5LUyA9ICcubmF2LWxpbmsnXG5jb25zdCBTRUxFQ1RPUl9OQVZfSVRFTVMgPSAnLm5hdi1pdGVtJ1xuY29uc3QgU0VMRUNUT1JfTElTVF9JVEVNUyA9ICcubGlzdC1ncm91cC1pdGVtJ1xuY29uc3QgU0VMRUNUT1JfTElOS19JVEVNUyA9IGAke1NFTEVDVE9SX05BVl9MSU5LU30sICR7U0VMRUNUT1JfTElTVF9JVEVNU30sIC4ke0NMQVNTX05BTUVfRFJPUERPV05fSVRFTX1gXG5jb25zdCBTRUxFQ1RPUl9EUk9QRE9XTiA9ICcuZHJvcGRvd24nXG5jb25zdCBTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUgPSAnLmRyb3Bkb3duLXRvZ2dsZSdcblxuY29uc3QgTUVUSE9EX09GRlNFVCA9ICdvZmZzZXQnXG5jb25zdCBNRVRIT0RfUE9TSVRJT04gPSAncG9zaXRpb24nXG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDbGFzcyBEZWZpbml0aW9uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jbGFzcyBTY3JvbGxTcHkgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudClcbiAgICB0aGlzLl9zY3JvbGxFbGVtZW50ID0gdGhpcy5fZWxlbWVudC50YWdOYW1lID09PSAnQk9EWScgPyB3aW5kb3cgOiB0aGlzLl9lbGVtZW50XG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZylcbiAgICB0aGlzLl9vZmZzZXRzID0gW11cbiAgICB0aGlzLl90YXJnZXRzID0gW11cbiAgICB0aGlzLl9hY3RpdmVUYXJnZXQgPSBudWxsXG4gICAgdGhpcy5fc2Nyb2xsSGVpZ2h0ID0gMFxuXG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX3Njcm9sbEVsZW1lbnQsIEVWRU5UX1NDUk9MTCwgKCkgPT4gdGhpcy5fcHJvY2VzcygpKVxuXG4gICAgdGhpcy5yZWZyZXNoKClcbiAgICB0aGlzLl9wcm9jZXNzKClcbiAgfVxuXG4gIC8vIEdldHRlcnNcblxuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG5cbiAgcmVmcmVzaCgpIHtcbiAgICBjb25zdCBhdXRvTWV0aG9kID0gdGhpcy5fc2Nyb2xsRWxlbWVudCA9PT0gdGhpcy5fc2Nyb2xsRWxlbWVudC53aW5kb3cgP1xuICAgICAgTUVUSE9EX09GRlNFVCA6XG4gICAgICBNRVRIT0RfUE9TSVRJT05cblxuICAgIGNvbnN0IG9mZnNldE1ldGhvZCA9IHRoaXMuX2NvbmZpZy5tZXRob2QgPT09ICdhdXRvJyA/XG4gICAgICBhdXRvTWV0aG9kIDpcbiAgICAgIHRoaXMuX2NvbmZpZy5tZXRob2RcblxuICAgIGNvbnN0IG9mZnNldEJhc2UgPSBvZmZzZXRNZXRob2QgPT09IE1FVEhPRF9QT1NJVElPTiA/XG4gICAgICB0aGlzLl9nZXRTY3JvbGxUb3AoKSA6XG4gICAgICAwXG5cbiAgICB0aGlzLl9vZmZzZXRzID0gW11cbiAgICB0aGlzLl90YXJnZXRzID0gW11cbiAgICB0aGlzLl9zY3JvbGxIZWlnaHQgPSB0aGlzLl9nZXRTY3JvbGxIZWlnaHQoKVxuXG4gICAgY29uc3QgdGFyZ2V0cyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfTElOS19JVEVNUywgdGhpcy5fY29uZmlnLnRhcmdldClcblxuICAgIHRhcmdldHMubWFwKGVsZW1lbnQgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0U2VsZWN0b3IgPSBnZXRTZWxlY3RvckZyb21FbGVtZW50KGVsZW1lbnQpXG4gICAgICBjb25zdCB0YXJnZXQgPSB0YXJnZXRTZWxlY3RvciA/IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUodGFyZ2V0U2VsZWN0b3IpIDogbnVsbFxuXG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldEJDUiA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICBpZiAodGFyZ2V0QkNSLndpZHRoIHx8IHRhcmdldEJDUi5oZWlnaHQpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgTWFuaXB1bGF0b3Jbb2Zmc2V0TWV0aG9kXSh0YXJnZXQpLnRvcCArIG9mZnNldEJhc2UsXG4gICAgICAgICAgICB0YXJnZXRTZWxlY3RvclxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0pXG4gICAgICAuZmlsdGVyKGl0ZW0gPT4gaXRlbSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBhWzBdIC0gYlswXSlcbiAgICAgIC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICB0aGlzLl9vZmZzZXRzLnB1c2goaXRlbVswXSlcbiAgICAgICAgdGhpcy5fdGFyZ2V0cy5wdXNoKGl0ZW1bMV0pXG4gICAgICB9KVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX3Njcm9sbEVsZW1lbnQsIEVWRU5UX0tFWSlcbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIC8vIFByaXZhdGVcblxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IHtcbiAgICAgIC4uLkRlZmF1bHQsXG4gICAgICAuLi5NYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlcyh0aGlzLl9lbGVtZW50KSxcbiAgICAgIC4uLih0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWcgPyBjb25maWcgOiB7fSlcbiAgICB9XG5cbiAgICBjb25maWcudGFyZ2V0ID0gZ2V0RWxlbWVudChjb25maWcudGFyZ2V0KSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRcblxuICAgIHR5cGVDaGVja0NvbmZpZyhOQU1FLCBjb25maWcsIERlZmF1bHRUeXBlKVxuXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2dldFNjcm9sbFRvcCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2Nyb2xsRWxlbWVudCA9PT0gd2luZG93ID9cbiAgICAgIHRoaXMuX3Njcm9sbEVsZW1lbnQucGFnZVlPZmZzZXQgOlxuICAgICAgdGhpcy5fc2Nyb2xsRWxlbWVudC5zY3JvbGxUb3BcbiAgfVxuXG4gIF9nZXRTY3JvbGxIZWlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IHx8IE1hdGgubWF4KFxuICAgICAgZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQsXG4gICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0XG4gICAgKVxuICB9XG5cbiAgX2dldE9mZnNldEhlaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2Nyb2xsRWxlbWVudCA9PT0gd2luZG93ID9cbiAgICAgIHdpbmRvdy5pbm5lckhlaWdodCA6XG4gICAgICB0aGlzLl9zY3JvbGxFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICB9XG5cbiAgX3Byb2Nlc3MoKSB7XG4gICAgY29uc3Qgc2Nyb2xsVG9wID0gdGhpcy5fZ2V0U2Nyb2xsVG9wKCkgKyB0aGlzLl9jb25maWcub2Zmc2V0XG4gICAgY29uc3Qgc2Nyb2xsSGVpZ2h0ID0gdGhpcy5fZ2V0U2Nyb2xsSGVpZ2h0KClcbiAgICBjb25zdCBtYXhTY3JvbGwgPSB0aGlzLl9jb25maWcub2Zmc2V0ICsgc2Nyb2xsSGVpZ2h0IC0gdGhpcy5fZ2V0T2Zmc2V0SGVpZ2h0KClcblxuICAgIGlmICh0aGlzLl9zY3JvbGxIZWlnaHQgIT09IHNjcm9sbEhlaWdodCkge1xuICAgICAgdGhpcy5yZWZyZXNoKClcbiAgICB9XG5cbiAgICBpZiAoc2Nyb2xsVG9wID49IG1heFNjcm9sbCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5fdGFyZ2V0c1t0aGlzLl90YXJnZXRzLmxlbmd0aCAtIDFdXG5cbiAgICAgIGlmICh0aGlzLl9hY3RpdmVUYXJnZXQgIT09IHRhcmdldCkge1xuICAgICAgICB0aGlzLl9hY3RpdmF0ZSh0YXJnZXQpXG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9hY3RpdmVUYXJnZXQgJiYgc2Nyb2xsVG9wIDwgdGhpcy5fb2Zmc2V0c1swXSAmJiB0aGlzLl9vZmZzZXRzWzBdID4gMCkge1xuICAgICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gbnVsbFxuICAgICAgdGhpcy5fY2xlYXIoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IHRoaXMuX29mZnNldHMubGVuZ3RoOyBpLS07KSB7XG4gICAgICBjb25zdCBpc0FjdGl2ZVRhcmdldCA9IHRoaXMuX2FjdGl2ZVRhcmdldCAhPT0gdGhpcy5fdGFyZ2V0c1tpXSAmJlxuICAgICAgICAgIHNjcm9sbFRvcCA+PSB0aGlzLl9vZmZzZXRzW2ldICYmXG4gICAgICAgICAgKHR5cGVvZiB0aGlzLl9vZmZzZXRzW2kgKyAxXSA9PT0gJ3VuZGVmaW5lZCcgfHwgc2Nyb2xsVG9wIDwgdGhpcy5fb2Zmc2V0c1tpICsgMV0pXG5cbiAgICAgIGlmIChpc0FjdGl2ZVRhcmdldCkge1xuICAgICAgICB0aGlzLl9hY3RpdmF0ZSh0aGlzLl90YXJnZXRzW2ldKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9hY3RpdmF0ZSh0YXJnZXQpIHtcbiAgICB0aGlzLl9hY3RpdmVUYXJnZXQgPSB0YXJnZXRcblxuICAgIHRoaXMuX2NsZWFyKClcblxuICAgIGNvbnN0IHF1ZXJpZXMgPSBTRUxFQ1RPUl9MSU5LX0lURU1TLnNwbGl0KCcsJylcbiAgICAgIC5tYXAoc2VsZWN0b3IgPT4gYCR7c2VsZWN0b3J9W2RhdGEtYnMtdGFyZ2V0PVwiJHt0YXJnZXR9XCJdLCR7c2VsZWN0b3J9W2hyZWY9XCIke3RhcmdldH1cIl1gKVxuXG4gICAgY29uc3QgbGluayA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUocXVlcmllcy5qb2luKCcsJyksIHRoaXMuX2NvbmZpZy50YXJnZXQpXG5cbiAgICBsaW5rLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgaWYgKGxpbmsuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUERPV05fSVRFTSkpIHtcbiAgICAgIFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFLCBsaW5rLmNsb3Nlc3QoU0VMRUNUT1JfRFJPUERPV04pKVxuICAgICAgICAuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSlcbiAgICB9IGVsc2Uge1xuICAgICAgU2VsZWN0b3JFbmdpbmUucGFyZW50cyhsaW5rLCBTRUxFQ1RPUl9OQVZfTElTVF9HUk9VUClcbiAgICAgICAgLmZvckVhY2gobGlzdEdyb3VwID0+IHtcbiAgICAgICAgICAvLyBTZXQgdHJpZ2dlcmVkIGxpbmtzIHBhcmVudHMgYXMgYWN0aXZlXG4gICAgICAgICAgLy8gV2l0aCBib3RoIDx1bD4gYW5kIDxuYXY+IG1hcmt1cCBhIHBhcmVudCBpcyB0aGUgcHJldmlvdXMgc2libGluZyBvZiBhbnkgbmF2IGFuY2VzdG9yXG4gICAgICAgICAgU2VsZWN0b3JFbmdpbmUucHJldihsaXN0R3JvdXAsIGAke1NFTEVDVE9SX05BVl9MSU5LU30sICR7U0VMRUNUT1JfTElTVF9JVEVNU31gKVxuICAgICAgICAgICAgLmZvckVhY2goaXRlbSA9PiBpdGVtLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpKVxuXG4gICAgICAgICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZSB3aGVuIC5uYXYtbGluayBpcyBpbnNpZGUgLm5hdi1pdGVtXG4gICAgICAgICAgU2VsZWN0b3JFbmdpbmUucHJldihsaXN0R3JvdXAsIFNFTEVDVE9SX05BVl9JVEVNUylcbiAgICAgICAgICAgIC5mb3JFYWNoKG5hdkl0ZW0gPT4ge1xuICAgICAgICAgICAgICBTZWxlY3RvckVuZ2luZS5jaGlsZHJlbihuYXZJdGVtLCBTRUxFQ1RPUl9OQVZfTElOS1MpXG4gICAgICAgICAgICAgICAgLmZvckVhY2goaXRlbSA9PiBpdGVtLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9zY3JvbGxFbGVtZW50LCBFVkVOVF9BQ1RJVkFURSwge1xuICAgICAgcmVsYXRlZFRhcmdldDogdGFyZ2V0XG4gICAgfSlcbiAgfVxuXG4gIF9jbGVhcigpIHtcbiAgICBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0xJTktfSVRFTVMsIHRoaXMuX2NvbmZpZy50YXJnZXQpXG4gICAgICAuZmlsdGVyKG5vZGUgPT4gbm9kZS5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9BQ1RJVkUpKVxuICAgICAgLmZvckVhY2gobm9kZSA9PiBub2RlLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9BQ1RJVkUpKVxuICB9XG5cbiAgLy8gU3RhdGljXG5cbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBTY3JvbGxTcHkuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgIH1cblxuICAgICAgZGF0YVtjb25maWddKClcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBEYXRhIEFwaSBpbXBsZW1lbnRhdGlvblxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfTE9BRF9EQVRBX0FQSSwgKCkgPT4ge1xuICBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfU1BZKVxuICAgIC5mb3JFYWNoKHNweSA9PiBuZXcgU2Nyb2xsU3B5KHNweSkpXG59KVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogalF1ZXJ5XG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIGFkZCAuU2Nyb2xsU3B5IHRvIGpRdWVyeSBvbmx5IGlmIGpRdWVyeSBpcyBwcmVzZW50XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFNjcm9sbFNweSlcblxuZXhwb3J0IGRlZmF1bHQgU2Nyb2xsU3B5XG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NS4xLjMpOiB0YWIuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sXG4gIGdldEVsZW1lbnRGcm9tU2VsZWN0b3IsXG4gIGlzRGlzYWJsZWQsXG4gIHJlZmxvd1xufSBmcm9tICcuL3V0aWwvaW5kZXgnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXInXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lJ1xuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudCdcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvbnN0YW50c1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuY29uc3QgTkFNRSA9ICd0YWInXG5jb25zdCBEQVRBX0tFWSA9ICdicy50YWInXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcblxuY29uc3QgRVZFTlRfSElERSA9IGBoaWRlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElEREVOID0gYGhpZGRlbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1dOID0gYHNob3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBgY2xpY2ske0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5cbmNvbnN0IENMQVNTX05BTUVfRFJPUERPV05fTUVOVSA9ICdkcm9wZG93bi1tZW51J1xuY29uc3QgQ0xBU1NfTkFNRV9BQ1RJVkUgPSAnYWN0aXZlJ1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFID0gJ2ZhZGUnXG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcblxuY29uc3QgU0VMRUNUT1JfRFJPUERPV04gPSAnLmRyb3Bkb3duJ1xuY29uc3QgU0VMRUNUT1JfTkFWX0xJU1RfR1JPVVAgPSAnLm5hdiwgLmxpc3QtZ3JvdXAnXG5jb25zdCBTRUxFQ1RPUl9BQ1RJVkUgPSAnLmFjdGl2ZSdcbmNvbnN0IFNFTEVDVE9SX0FDVElWRV9VTCA9ICc6c2NvcGUgPiBsaSA+IC5hY3RpdmUnXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS1icy10b2dnbGU9XCJ0YWJcIl0sIFtkYXRhLWJzLXRvZ2dsZT1cInBpbGxcIl0sIFtkYXRhLWJzLXRvZ2dsZT1cImxpc3RcIl0nXG5jb25zdCBTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUgPSAnLmRyb3Bkb3duLXRvZ2dsZSdcbmNvbnN0IFNFTEVDVE9SX0RST1BET1dOX0FDVElWRV9DSElMRCA9ICc6c2NvcGUgPiAuZHJvcGRvd24tbWVudSAuYWN0aXZlJ1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ2xhc3MgRGVmaW5pdGlvblxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuY2xhc3MgVGFiIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIC8vIEdldHRlcnNcblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuXG4gIHNob3coKSB7XG4gICAgaWYgKCh0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUgJiZcbiAgICAgIHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiZcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfQUNUSVZFKSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxldCBwcmV2aW91c1xuICAgIGNvbnN0IHRhcmdldCA9IGdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcy5fZWxlbWVudClcbiAgICBjb25zdCBsaXN0RWxlbWVudCA9IHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9OQVZfTElTVF9HUk9VUClcblxuICAgIGlmIChsaXN0RWxlbWVudCkge1xuICAgICAgY29uc3QgaXRlbVNlbGVjdG9yID0gbGlzdEVsZW1lbnQubm9kZU5hbWUgPT09ICdVTCcgfHwgbGlzdEVsZW1lbnQubm9kZU5hbWUgPT09ICdPTCcgPyBTRUxFQ1RPUl9BQ1RJVkVfVUwgOiBTRUxFQ1RPUl9BQ1RJVkVcbiAgICAgIHByZXZpb3VzID0gU2VsZWN0b3JFbmdpbmUuZmluZChpdGVtU2VsZWN0b3IsIGxpc3RFbGVtZW50KVxuICAgICAgcHJldmlvdXMgPSBwcmV2aW91c1twcmV2aW91cy5sZW5ndGggLSAxXVxuICAgIH1cblxuICAgIGNvbnN0IGhpZGVFdmVudCA9IHByZXZpb3VzID9cbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHByZXZpb3VzLCBFVkVOVF9ISURFLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRoaXMuX2VsZW1lbnRcbiAgICAgIH0pIDpcbiAgICAgIG51bGxcblxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1csIHtcbiAgICAgIHJlbGF0ZWRUYXJnZXQ6IHByZXZpb3VzXG4gICAgfSlcblxuICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCB8fCAoaGlkZUV2ZW50ICE9PSBudWxsICYmIGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fYWN0aXZhdGUodGhpcy5fZWxlbWVudCwgbGlzdEVsZW1lbnQpXG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHByZXZpb3VzLCBFVkVOVF9ISURERU4sIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogdGhpcy5fZWxlbWVudFxuICAgICAgfSlcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1dOLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHByZXZpb3VzXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIHRoaXMuX2FjdGl2YXRlKHRhcmdldCwgdGFyZ2V0LnBhcmVudE5vZGUsIGNvbXBsZXRlKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb21wbGV0ZSgpXG4gICAgfVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuXG4gIF9hY3RpdmF0ZShlbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgYWN0aXZlRWxlbWVudHMgPSBjb250YWluZXIgJiYgKGNvbnRhaW5lci5ub2RlTmFtZSA9PT0gJ1VMJyB8fCBjb250YWluZXIubm9kZU5hbWUgPT09ICdPTCcpID9cbiAgICAgIFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfQUNUSVZFX1VMLCBjb250YWluZXIpIDpcbiAgICAgIFNlbGVjdG9yRW5naW5lLmNoaWxkcmVuKGNvbnRhaW5lciwgU0VMRUNUT1JfQUNUSVZFKVxuXG4gICAgY29uc3QgYWN0aXZlID0gYWN0aXZlRWxlbWVudHNbMF1cbiAgICBjb25zdCBpc1RyYW5zaXRpb25pbmcgPSBjYWxsYmFjayAmJiAoYWN0aXZlICYmIGFjdGl2ZS5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFKSlcblxuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4gdGhpcy5fdHJhbnNpdGlvbkNvbXBsZXRlKGVsZW1lbnQsIGFjdGl2ZSwgY2FsbGJhY2spXG5cbiAgICBpZiAoYWN0aXZlICYmIGlzVHJhbnNpdGlvbmluZykge1xuICAgICAgYWN0aXZlLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XKVxuICAgICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgZWxlbWVudCwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29tcGxldGUoKVxuICAgIH1cbiAgfVxuXG4gIF90cmFuc2l0aW9uQ29tcGxldGUoZWxlbWVudCwgYWN0aXZlLCBjYWxsYmFjaykge1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIGFjdGl2ZS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFKVxuXG4gICAgICBjb25zdCBkcm9wZG93bkNoaWxkID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9EUk9QRE9XTl9BQ1RJVkVfQ0hJTEQsIGFjdGl2ZS5wYXJlbnROb2RlKVxuXG4gICAgICBpZiAoZHJvcGRvd25DaGlsZCkge1xuICAgICAgICBkcm9wZG93bkNoaWxkLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgICB9XG5cbiAgICAgIGlmIChhY3RpdmUuZ2V0QXR0cmlidXRlKCdyb2xlJykgPT09ICd0YWInKSB7XG4gICAgICAgIGFjdGl2ZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCBmYWxzZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdyb2xlJykgPT09ICd0YWInKSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIHRydWUpXG4gICAgfVxuXG4gICAgcmVmbG93KGVsZW1lbnQpXG5cbiAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFKSkge1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcbiAgICB9XG5cbiAgICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlXG4gICAgaWYgKHBhcmVudCAmJiBwYXJlbnQubm9kZU5hbWUgPT09ICdMSScpIHtcbiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlXG4gICAgfVxuXG4gICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUERPV05fTUVOVSkpIHtcbiAgICAgIGNvbnN0IGRyb3Bkb3duRWxlbWVudCA9IGVsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9EUk9QRE9XTilcblxuICAgICAgaWYgKGRyb3Bkb3duRWxlbWVudCkge1xuICAgICAgICBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSwgZHJvcGRvd25FbGVtZW50KVxuICAgICAgICAgIC5mb3JFYWNoKGRyb3Bkb3duID0+IGRyb3Bkb3duLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpKVxuICAgICAgfVxuXG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIHRydWUpXG4gICAgfVxuXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjaygpXG4gICAgfVxuICB9XG5cbiAgLy8gU3RhdGljXG5cbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBUYWIuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgICB9XG5cbiAgICAgICAgZGF0YVtjb25maWddKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBEYXRhIEFwaSBpbXBsZW1lbnRhdGlvblxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICBpZiAoWydBJywgJ0FSRUEnXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICB9XG5cbiAgaWYgKGlzRGlzYWJsZWQodGhpcykpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSBUYWIuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKVxuICBkYXRhLnNob3coKVxufSlcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIGpRdWVyeVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBhZGQgLlRhYiB0byBqUXVlcnkgb25seSBpZiBqUXVlcnkgaXMgcHJlc2VudFxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihUYWIpXG5cbmV4cG9ydCBkZWZhdWx0IFRhYlxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMS4zKTogdG9hc3QuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sXG4gIHJlZmxvdyxcbiAgdHlwZUNoZWNrQ29uZmlnXG59IGZyb20gJy4vdXRpbC9pbmRleCdcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlcidcbmltcG9ydCBNYW5pcHVsYXRvciBmcm9tICcuL2RvbS9tYW5pcHVsYXRvcidcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQnXG5pbXBvcnQgeyBlbmFibGVEaXNtaXNzVHJpZ2dlciB9IGZyb20gJy4vdXRpbC9jb21wb25lbnQtZnVuY3Rpb25zJ1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29uc3RhbnRzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jb25zdCBOQU1FID0gJ3RvYXN0J1xuY29uc3QgREFUQV9LRVkgPSAnYnMudG9hc3QnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuXG5jb25zdCBFVkVOVF9NT1VTRU9WRVIgPSBgbW91c2VvdmVyJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfTU9VU0VPVVQgPSBgbW91c2VvdXQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9GT0NVU0lOID0gYGZvY3VzaW4ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9GT0NVU09VVCA9IGBmb2N1c291dCR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJRERFTiA9IGBoaWRkZW4ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XID0gYHNob3cke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWBcblxuY29uc3QgQ0xBU1NfTkFNRV9GQURFID0gJ2ZhZGUnXG5jb25zdCBDTEFTU19OQU1FX0hJREUgPSAnaGlkZScgLy8gQGRlcHJlY2F0ZWQgLSBrZXB0IGhlcmUgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XSU5HID0gJ3Nob3dpbmcnXG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBhbmltYXRpb246ICdib29sZWFuJyxcbiAgYXV0b2hpZGU6ICdib29sZWFuJyxcbiAgZGVsYXk6ICdudW1iZXInXG59XG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGFuaW1hdGlvbjogdHJ1ZSxcbiAgYXV0b2hpZGU6IHRydWUsXG4gIGRlbGF5OiA1MDAwXG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDbGFzcyBEZWZpbml0aW9uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jbGFzcyBUb2FzdCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50KVxuXG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZylcbiAgICB0aGlzLl90aW1lb3V0ID0gbnVsbFxuICAgIHRoaXMuX2hhc01vdXNlSW50ZXJhY3Rpb24gPSBmYWxzZVxuICAgIHRoaXMuX2hhc0tleWJvYXJkSW50ZXJhY3Rpb24gPSBmYWxzZVxuICAgIHRoaXMuX3NldExpc3RlbmVycygpXG4gIH1cblxuICAvLyBHZXR0ZXJzXG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcblxuICBzaG93KCkge1xuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1cpXG5cbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2NsZWFyVGltZW91dCgpXG5cbiAgICBpZiAodGhpcy5fY29uZmlnLmFuaW1hdGlvbikge1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfRkFERSlcbiAgICB9XG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkcpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XTilcblxuICAgICAgdGhpcy5fbWF5YmVTY2hlZHVsZUhpZGUoKVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0hJREUpIC8vIEBkZXByZWNhdGVkXG4gICAgcmVmbG93KHRoaXMuX2VsZW1lbnQpXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XSU5HKVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy5fZWxlbWVudCwgdGhpcy5fY29uZmlnLmFuaW1hdGlvbilcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1cpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFKVxuXG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0hJREUpIC8vIEBkZXByZWNhdGVkXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XSU5HKVxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJRERFTilcbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XSU5HKVxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMuX2VsZW1lbnQsIHRoaXMuX2NvbmZpZy5hbmltYXRpb24pXG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuX2NsZWFyVGltZW91dCgpXG5cbiAgICBpZiAodGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XKSkge1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcbiAgICB9XG5cbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIC8vIFByaXZhdGVcblxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IHtcbiAgICAgIC4uLkRlZmF1bHQsXG4gICAgICAuLi5NYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlcyh0aGlzLl9lbGVtZW50KSxcbiAgICAgIC4uLih0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWcgPyBjb25maWcgOiB7fSlcbiAgICB9XG5cbiAgICB0eXBlQ2hlY2tDb25maWcoTkFNRSwgY29uZmlnLCB0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRUeXBlKVxuXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX21heWJlU2NoZWR1bGVIaWRlKCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnLmF1dG9oaWRlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5faGFzTW91c2VJbnRlcmFjdGlvbiB8fCB0aGlzLl9oYXNLZXlib2FyZEludGVyYWN0aW9uKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmhpZGUoKVxuICAgIH0sIHRoaXMuX2NvbmZpZy5kZWxheSlcbiAgfVxuXG4gIF9vbkludGVyYWN0aW9uKGV2ZW50LCBpc0ludGVyYWN0aW5nKSB7XG4gICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgICAgY2FzZSAnbW91c2VvdXQnOlxuICAgICAgICB0aGlzLl9oYXNNb3VzZUludGVyYWN0aW9uID0gaXNJbnRlcmFjdGluZ1xuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnZm9jdXNpbic6XG4gICAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICAgIHRoaXMuX2hhc0tleWJvYXJkSW50ZXJhY3Rpb24gPSBpc0ludGVyYWN0aW5nXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVha1xuICAgIH1cblxuICAgIGlmIChpc0ludGVyYWN0aW5nKSB7XG4gICAgICB0aGlzLl9jbGVhclRpbWVvdXQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgbmV4dEVsZW1lbnQgPSBldmVudC5yZWxhdGVkVGFyZ2V0XG4gICAgaWYgKHRoaXMuX2VsZW1lbnQgPT09IG5leHRFbGVtZW50IHx8IHRoaXMuX2VsZW1lbnQuY29udGFpbnMobmV4dEVsZW1lbnQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9tYXliZVNjaGVkdWxlSGlkZSgpXG4gIH1cblxuICBfc2V0TGlzdGVuZXJzKCkge1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRU9WRVIsIGV2ZW50ID0+IHRoaXMuX29uSW50ZXJhY3Rpb24oZXZlbnQsIHRydWUpKVxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRU9VVCwgZXZlbnQgPT4gdGhpcy5fb25JbnRlcmFjdGlvbihldmVudCwgZmFsc2UpKVxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9GT0NVU0lOLCBldmVudCA9PiB0aGlzLl9vbkludGVyYWN0aW9uKGV2ZW50LCB0cnVlKSlcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfRk9DVVNPVVQsIGV2ZW50ID0+IHRoaXMuX29uSW50ZXJhY3Rpb24oZXZlbnQsIGZhbHNlKSlcbiAgfVxuXG4gIF9jbGVhclRpbWVvdXQoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpXG4gICAgdGhpcy5fdGltZW91dCA9IG51bGxcbiAgfVxuXG4gIC8vIFN0YXRpY1xuXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gVG9hc3QuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICAgIH1cblxuICAgICAgICBkYXRhW2NvbmZpZ10odGhpcylcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbmVuYWJsZURpc21pc3NUcmlnZ2VyKFRvYXN0KVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogalF1ZXJ5XG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIGFkZCAuVG9hc3QgdG8galF1ZXJ5IG9ubHkgaWYgalF1ZXJ5IGlzIHByZXNlbnRcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oVG9hc3QpXG5cbmV4cG9ydCBkZWZhdWx0IFRvYXN0XG4iLCAiaW1wb3J0ICQgZnJvbSBcImpxdWVyeVwiXG5cbiQoZnVuY3Rpb24gKCkge1xuICAkKFwic2VsZWN0LnRyZWVcIikuY2hhbmdlKGZ1bmN0aW9uICgpIHtcbiAgICBkb2N1bWVudC5sb2NhdGlvbiA9IHRoaXMudmFsdWU7XG4gIH0pO1xufSk7XG4iLCAiaW1wb3J0ICQgZnJvbSBcImpxdWVyeVwiO1xuaW1wb3J0IGtteF9jb2xvcnMgZnJvbSBcIi4va214X2NvbG9yc1wiO1xuXG5mdW5jdGlvbiBnZXRSYW5kb21JbnQobWF4KSB7XG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBtYXgpO1xufVxuXG4kKGZ1bmN0aW9uKCkge1xuICBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICBjb25zdCBpID0gZ2V0UmFuZG9tSW50KGtteF9jb2xvcnMuaW5kZXgubGVuZ3RoKTtcbiAgICBjb25zdCBuYW1lID0ga214X2NvbG9ycy5pbmRleFtpXTtcbiAgICBjb25zdCBjb2xvciA9IGtteF9jb2xvcnNbbmFtZV07XG4gICAgY29uc3QgeCA9IChnZXRSYW5kb21JbnQoOTkpIC0gNDgpICogMC4wMDI7XG4gICAgJChcImFcIikuY3NzKFwidGV4dC1zaGFkb3dcIiwgXCIwIDAgMFwiKTtcbiAgICAkKFwiYTpob3ZlclwiKS5jc3MoXCJ0ZXh0LXNoYWRvd1wiLCB4ICsgXCJlbSAwIDAgXCIgKyBjb2xvcik7XG4gIH0sIDIwMCk7XG59KTtcbiIsICJjb25zdCBrbXhfY29sb3JzID0ge1xuICBcImtteC1ibGFja1wiOiAgIFwiIzFlMWYxZFwiLFxuICBcImtteC1ibHVlXCI6ICAgIFwiIzVhNjBmOVwiLFxuICBcImtteC1ibHVlMVwiOiAgIFwiIzZmNzJmOVwiLFxuICBcImtteC1ibHVlMlwiOiAgIFwiIzljOTlmZFwiLFxuICBcImtteC1ibHVlM1wiOiAgIFwiIzVhNjBmOVwiLFxuICBcImtteC1ibHVlNFwiOiAgIFwiIzZmNzJmOVwiLFxuICBcImtteC1ibHVlNVwiOiAgIFwiIzljOTlmZFwiLFxuICBcImluZGV4XCI6IFtcbiAgICBcImtteC1ibGFja1wiLFxuICAgIFwia214LWJsdWVcIixcbiAgICBcImtteC1ibHVlMVwiLFxuICAgIFwia214LWJsdWUyXCIsXG4gICAgXCJrbXgtYmx1ZTNcIixcbiAgICBcImtteC1ibHVlNFwiLFxuICAgIFwia214LWJsdWU1XCIsXG4gICAgXCJrbXgtY3lhblwiLFxuICAgIFwia214LWN5YW4xXCIsXG4gICAgXCJrbXgtZ3JlZW5cIixcbiAgICBcImtteC1ncmVlbjFcIixcbiAgICBcImtteC1vcmFuZ2VcIixcbiAgICBcImtteC1vcmFuZ2UxXCIsXG4gICAgXCJrbXgtb3JhbmdlMlwiLFxuICAgIFwia214LXBpbmtcIixcbiAgICBcImtteC13aGl0ZVwiLFxuICAgIFwia214LXdoaXRlMVwiLFxuICAgIFwia214LXdoaXRlMlwiLFxuICAgIFwia214LXllbGxvd1wiLFxuICAgIFwia214LXllbGxvdzFcIixcbiAgICBcImtteC15ZWxsb3cyXCIsXG4gICAgXCJrbXgteWVsbG93M1wiXG4gIF0sXG4gIFwia214LWN5YW5cIjogICAgXCIjZDRmM2Y2XCIsXG4gIFwia214LWN5YW4xXCI6ICAgXCIjZDRmM2Y2XCIsXG4gIFwia214LWdyZWVuXCI6ICAgXCIjYzRlZDNhXCIsXG4gIFwia214LWdyZWVuMVwiOiAgXCIjYzRlZDNhXCIsXG4gIFwia214LW9yYW5nZVwiOiAgXCIjZjg2ODFjXCIsXG4gIFwia214LW9yYW5nZTFcIjogXCIjZmE3NzM0XCIsXG4gIFwia214LW9yYW5nZTJcIjogXCIjZmZhNTMyXCIsXG4gIFwia214LXBpbmtcIjogICAgXCIjZmM5ZWY5XCIsXG4gIFwia214LXdoaXRlXCI6ICAgXCIjZjVmOGY0XCIsXG4gIFwia214LXdoaXRlMVwiOiAgXCIjZmZmOWYyXCIsXG4gIFwia214LXdoaXRlMlwiOiAgXCIjZmZmZmZmXCIsXG4gIFwia214LXllbGxvd1wiOiAgXCIjZWNmZTQ5XCIsXG4gIFwia214LXllbGxvdzFcIjogXCIjZmZmNDNlXCIsXG4gIFwia214LXllbGxvdzJcIjogIFwiI2VjZmU0OVwiLFxuICBcImtteC15ZWxsb3czXCI6IFwiI2ZmZjQzZVwiXG59O1xuZXhwb3J0IGRlZmF1bHQga214X2NvbG9ycztcbiIsICJcInVzZSBzdHJpY3RcIjtcblxuKGZ1bmN0aW9uKCkge1xuICB2YXIgUG9seWZpbGxFdmVudCA9IGV2ZW50Q29uc3RydWN0b3IoKTtcblxuICBmdW5jdGlvbiBldmVudENvbnN0cnVjdG9yKCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB3aW5kb3cuQ3VzdG9tRXZlbnQ7XG4gICAgLy8gSUU8PTkgU3VwcG9ydFxuICAgIGZ1bmN0aW9uIEN1c3RvbUV2ZW50KGV2ZW50LCBwYXJhbXMpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7YnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IGZhbHNlLCBkZXRhaWw6IHVuZGVmaW5lZH07XG4gICAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7XG4gICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50LCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUsIHBhcmFtcy5kZXRhaWwpO1xuICAgICAgcmV0dXJuIGV2dDtcbiAgICB9XG4gICAgQ3VzdG9tRXZlbnQucHJvdG90eXBlID0gd2luZG93LkV2ZW50LnByb3RvdHlwZTtcbiAgICByZXR1cm4gQ3VzdG9tRXZlbnQ7XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZEhpZGRlbklucHV0KG5hbWUsIHZhbHVlKSB7XG4gICAgdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgIGlucHV0LnR5cGUgPSBcImhpZGRlblwiO1xuICAgIGlucHV0Lm5hbWUgPSBuYW1lO1xuICAgIGlucHV0LnZhbHVlID0gdmFsdWU7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlQ2xpY2soZWxlbWVudCwgdGFyZ2V0TW9kaWZpZXJLZXkpIHtcbiAgICB2YXIgdG8gPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtdG9cIiksXG4gICAgICAgIG1ldGhvZCA9IGJ1aWxkSGlkZGVuSW5wdXQoXCJfbWV0aG9kXCIsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1tZXRob2RcIikpLFxuICAgICAgICBjc3JmID0gYnVpbGRIaWRkZW5JbnB1dChcIl9jc3JmX3Rva2VuXCIsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1jc3JmXCIpKSxcbiAgICAgICAgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJmb3JtXCIpLFxuICAgICAgICB0YXJnZXQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInRhcmdldFwiKTtcblxuICAgIGZvcm0ubWV0aG9kID0gKGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1tZXRob2RcIikgPT09IFwiZ2V0XCIpID8gXCJnZXRcIiA6IFwicG9zdFwiO1xuICAgIGZvcm0uYWN0aW9uID0gdG87XG4gICAgZm9ybS5zdHlsZS5kaXNwbGF5ID0gXCJoaWRkZW5cIjtcblxuICAgIGlmICh0YXJnZXQpIGZvcm0udGFyZ2V0ID0gdGFyZ2V0O1xuICAgIGVsc2UgaWYgKHRhcmdldE1vZGlmaWVyS2V5KSBmb3JtLnRhcmdldCA9IFwiX2JsYW5rXCI7XG5cbiAgICBmb3JtLmFwcGVuZENoaWxkKGNzcmYpO1xuICAgIGZvcm0uYXBwZW5kQ2hpbGQobWV0aG9kKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGZvcm0pO1xuICAgIGZvcm0uc3VibWl0KCk7XG4gIH1cblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWxlbWVudCA9IGUudGFyZ2V0O1xuICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcblxuICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKSB7XG4gICAgICB2YXIgcGhvZW5peExpbmtFdmVudCA9IG5ldyBQb2x5ZmlsbEV2ZW50KCdwaG9lbml4LmxpbmsuY2xpY2snLCB7XG4gICAgICAgIFwiYnViYmxlc1wiOiB0cnVlLCBcImNhbmNlbGFibGVcIjogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIGlmICghZWxlbWVudC5kaXNwYXRjaEV2ZW50KHBob2VuaXhMaW5rRXZlbnQpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLW1ldGhvZFwiKSkge1xuICAgICAgICBoYW5kbGVDbGljayhlbGVtZW50LCBlLm1ldGFLZXkgfHwgZS5zaGlmdEtleSk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIGZhbHNlKTtcblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncGhvZW5peC5saW5rLmNsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgbWVzc2FnZSA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZShcImRhdGEtY29uZmlybVwiKTtcbiAgICBpZihtZXNzYWdlICYmICF3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSwgZmFsc2UpO1xufSkoKTtcbiIsICIvLyB3cmFwcyB2YWx1ZSBpbiBjbG9zdXJlIG9yIHJldHVybnMgY2xvc3VyZVxuZXhwb3J0IGxldCBjbG9zdXJlID0gKHZhbHVlKSA9PiB7XG4gIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKXtcbiAgICByZXR1cm4gdmFsdWVcbiAgfSBlbHNlIHtcbiAgICBsZXQgY2xvc3VyZSA9IGZ1bmN0aW9uICgpeyByZXR1cm4gdmFsdWUgfVxuICAgIHJldHVybiBjbG9zdXJlXG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgZ2xvYmFsU2VsZiA9IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IG51bGxcbmV4cG9ydCBjb25zdCBwaHhXaW5kb3cgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogbnVsbFxuZXhwb3J0IGNvbnN0IGdsb2JhbCA9IGdsb2JhbFNlbGYgfHwgcGh4V2luZG93IHx8IHRoaXNcbmV4cG9ydCBjb25zdCBERUZBVUxUX1ZTTiA9IFwiMi4wLjBcIlxuZXhwb3J0IGNvbnN0IFNPQ0tFVF9TVEFURVMgPSB7Y29ubmVjdGluZzogMCwgb3BlbjogMSwgY2xvc2luZzogMiwgY2xvc2VkOiAzfVxuZXhwb3J0IGNvbnN0IERFRkFVTFRfVElNRU9VVCA9IDEwMDAwXG5leHBvcnQgY29uc3QgV1NfQ0xPU0VfTk9STUFMID0gMTAwMFxuZXhwb3J0IGNvbnN0IENIQU5ORUxfU1RBVEVTID0ge1xuICBjbG9zZWQ6IFwiY2xvc2VkXCIsXG4gIGVycm9yZWQ6IFwiZXJyb3JlZFwiLFxuICBqb2luZWQ6IFwiam9pbmVkXCIsXG4gIGpvaW5pbmc6IFwiam9pbmluZ1wiLFxuICBsZWF2aW5nOiBcImxlYXZpbmdcIixcbn1cbmV4cG9ydCBjb25zdCBDSEFOTkVMX0VWRU5UUyA9IHtcbiAgY2xvc2U6IFwicGh4X2Nsb3NlXCIsXG4gIGVycm9yOiBcInBoeF9lcnJvclwiLFxuICBqb2luOiBcInBoeF9qb2luXCIsXG4gIHJlcGx5OiBcInBoeF9yZXBseVwiLFxuICBsZWF2ZTogXCJwaHhfbGVhdmVcIlxufVxuXG5leHBvcnQgY29uc3QgVFJBTlNQT1JUUyA9IHtcbiAgbG9uZ3BvbGw6IFwibG9uZ3BvbGxcIixcbiAgd2Vic29ja2V0OiBcIndlYnNvY2tldFwiXG59XG5leHBvcnQgY29uc3QgWEhSX1NUQVRFUyA9IHtcbiAgY29tcGxldGU6IDRcbn1cbiIsICIvKipcbiAqIEluaXRpYWxpemVzIHRoZSBQdXNoXG4gKiBAcGFyYW0ge0NoYW5uZWx9IGNoYW5uZWwgLSBUaGUgQ2hhbm5lbFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50IC0gVGhlIGV2ZW50LCBmb3IgZXhhbXBsZSBgXCJwaHhfam9pblwiYFxuICogQHBhcmFtIHtPYmplY3R9IHBheWxvYWQgLSBUaGUgcGF5bG9hZCwgZm9yIGV4YW1wbGUgYHt1c2VyX2lkOiAxMjN9YFxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgLSBUaGUgcHVzaCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQdXNoIHtcbiAgY29uc3RydWN0b3IoY2hhbm5lbCwgZXZlbnQsIHBheWxvYWQsIHRpbWVvdXQpe1xuICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWxcbiAgICB0aGlzLmV2ZW50ID0gZXZlbnRcbiAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkIHx8IGZ1bmN0aW9uICgpeyByZXR1cm4ge30gfVxuICAgIHRoaXMucmVjZWl2ZWRSZXNwID0gbnVsbFxuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXRcbiAgICB0aGlzLnRpbWVvdXRUaW1lciA9IG51bGxcbiAgICB0aGlzLnJlY0hvb2tzID0gW11cbiAgICB0aGlzLnNlbnQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0XG4gICAqL1xuICByZXNlbmQodGltZW91dCl7XG4gICAgdGhpcy50aW1lb3V0ID0gdGltZW91dFxuICAgIHRoaXMucmVzZXQoKVxuICAgIHRoaXMuc2VuZCgpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICovXG4gIHNlbmQoKXtcbiAgICBpZih0aGlzLmhhc1JlY2VpdmVkKFwidGltZW91dFwiKSl7IHJldHVybiB9XG4gICAgdGhpcy5zdGFydFRpbWVvdXQoKVxuICAgIHRoaXMuc2VudCA9IHRydWVcbiAgICB0aGlzLmNoYW5uZWwuc29ja2V0LnB1c2goe1xuICAgICAgdG9waWM6IHRoaXMuY2hhbm5lbC50b3BpYyxcbiAgICAgIGV2ZW50OiB0aGlzLmV2ZW50LFxuICAgICAgcGF5bG9hZDogdGhpcy5wYXlsb2FkKCksXG4gICAgICByZWY6IHRoaXMucmVmLFxuICAgICAgam9pbl9yZWY6IHRoaXMuY2hhbm5lbC5qb2luUmVmKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gc3RhdHVzXG4gICAqIEBwYXJhbSB7Kn0gY2FsbGJhY2tcbiAgICovXG4gIHJlY2VpdmUoc3RhdHVzLCBjYWxsYmFjayl7XG4gICAgaWYodGhpcy5oYXNSZWNlaXZlZChzdGF0dXMpKXtcbiAgICAgIGNhbGxiYWNrKHRoaXMucmVjZWl2ZWRSZXNwLnJlc3BvbnNlKVxuICAgIH1cblxuICAgIHRoaXMucmVjSG9va3MucHVzaCh7c3RhdHVzLCBjYWxsYmFja30pXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVzZXQoKXtcbiAgICB0aGlzLmNhbmNlbFJlZkV2ZW50KClcbiAgICB0aGlzLnJlZiA9IG51bGxcbiAgICB0aGlzLnJlZkV2ZW50ID0gbnVsbFxuICAgIHRoaXMucmVjZWl2ZWRSZXNwID0gbnVsbFxuICAgIHRoaXMuc2VudCA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG1hdGNoUmVjZWl2ZSh7c3RhdHVzLCByZXNwb25zZSwgX3JlZn0pe1xuICAgIHRoaXMucmVjSG9va3MuZmlsdGVyKGggPT4gaC5zdGF0dXMgPT09IHN0YXR1cylcbiAgICAgIC5mb3JFYWNoKGggPT4gaC5jYWxsYmFjayhyZXNwb25zZSkpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNhbmNlbFJlZkV2ZW50KCl7XG4gICAgaWYoIXRoaXMucmVmRXZlbnQpeyByZXR1cm4gfVxuICAgIHRoaXMuY2hhbm5lbC5vZmYodGhpcy5yZWZFdmVudClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2FuY2VsVGltZW91dCgpe1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRUaW1lcilcbiAgICB0aGlzLnRpbWVvdXRUaW1lciA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3RhcnRUaW1lb3V0KCl7XG4gICAgaWYodGhpcy50aW1lb3V0VGltZXIpeyB0aGlzLmNhbmNlbFRpbWVvdXQoKSB9XG4gICAgdGhpcy5yZWYgPSB0aGlzLmNoYW5uZWwuc29ja2V0Lm1ha2VSZWYoKVxuICAgIHRoaXMucmVmRXZlbnQgPSB0aGlzLmNoYW5uZWwucmVwbHlFdmVudE5hbWUodGhpcy5yZWYpXG5cbiAgICB0aGlzLmNoYW5uZWwub24odGhpcy5yZWZFdmVudCwgcGF5bG9hZCA9PiB7XG4gICAgICB0aGlzLmNhbmNlbFJlZkV2ZW50KClcbiAgICAgIHRoaXMuY2FuY2VsVGltZW91dCgpXG4gICAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IHBheWxvYWRcbiAgICAgIHRoaXMubWF0Y2hSZWNlaXZlKHBheWxvYWQpXG4gICAgfSlcblxuICAgIHRoaXMudGltZW91dFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRyaWdnZXIoXCJ0aW1lb3V0XCIsIHt9KVxuICAgIH0sIHRoaXMudGltZW91dClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaGFzUmVjZWl2ZWQoc3RhdHVzKXtcbiAgICByZXR1cm4gdGhpcy5yZWNlaXZlZFJlc3AgJiYgdGhpcy5yZWNlaXZlZFJlc3Auc3RhdHVzID09PSBzdGF0dXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdHJpZ2dlcihzdGF0dXMsIHJlc3BvbnNlKXtcbiAgICB0aGlzLmNoYW5uZWwudHJpZ2dlcih0aGlzLnJlZkV2ZW50LCB7c3RhdHVzLCByZXNwb25zZX0pXG4gIH1cbn1cbiIsICIvKipcbiAqXG4gKiBDcmVhdGVzIGEgdGltZXIgdGhhdCBhY2NlcHRzIGEgYHRpbWVyQ2FsY2AgZnVuY3Rpb24gdG8gcGVyZm9ybVxuICogY2FsY3VsYXRlZCB0aW1lb3V0IHJldHJpZXMsIHN1Y2ggYXMgZXhwb25lbnRpYWwgYmFja29mZi5cbiAqXG4gKiBAZXhhbXBsZVxuICogbGV0IHJlY29ubmVjdFRpbWVyID0gbmV3IFRpbWVyKCgpID0+IHRoaXMuY29ubmVjdCgpLCBmdW5jdGlvbih0cmllcyl7XG4gKiAgIHJldHVybiBbMTAwMCwgNTAwMCwgMTAwMDBdW3RyaWVzIC0gMV0gfHwgMTAwMDBcbiAqIH0pXG4gKiByZWNvbm5lY3RUaW1lci5zY2hlZHVsZVRpbWVvdXQoKSAvLyBmaXJlcyBhZnRlciAxMDAwXG4gKiByZWNvbm5lY3RUaW1lci5zY2hlZHVsZVRpbWVvdXQoKSAvLyBmaXJlcyBhZnRlciA1MDAwXG4gKiByZWNvbm5lY3RUaW1lci5yZXNldCgpXG4gKiByZWNvbm5lY3RUaW1lci5zY2hlZHVsZVRpbWVvdXQoKSAvLyBmaXJlcyBhZnRlciAxMDAwXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRpbWVyQ2FsY1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaW1lciB7XG4gIGNvbnN0cnVjdG9yKGNhbGxiYWNrLCB0aW1lckNhbGMpe1xuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMudGltZXJDYWxjID0gdGltZXJDYWxjXG4gICAgdGhpcy50aW1lciA9IG51bGxcbiAgICB0aGlzLnRyaWVzID0gMFxuICB9XG5cbiAgcmVzZXQoKXtcbiAgICB0aGlzLnRyaWVzID0gMFxuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKVxuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbHMgYW55IHByZXZpb3VzIHNjaGVkdWxlVGltZW91dCBhbmQgc2NoZWR1bGVzIGNhbGxiYWNrXG4gICAqL1xuICBzY2hlZHVsZVRpbWVvdXQoKXtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcilcblxuICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudHJpZXMgPSB0aGlzLnRyaWVzICsgMVxuICAgICAgdGhpcy5jYWxsYmFjaygpXG4gICAgfSwgdGhpcy50aW1lckNhbGModGhpcy50cmllcyArIDEpKVxuICB9XG59XG4iLCAiaW1wb3J0IHtjbG9zdXJlfSBmcm9tIFwiLi91dGlsc1wiXG5pbXBvcnQge1xuICBDSEFOTkVMX0VWRU5UUyxcbiAgQ0hBTk5FTF9TVEFURVMsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCBQdXNoIGZyb20gXCIuL3B1c2hcIlxuaW1wb3J0IFRpbWVyIGZyb20gXCIuL3RpbWVyXCJcblxuLyoqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRvcGljXG4gKiBAcGFyYW0geyhPYmplY3R8ZnVuY3Rpb24pfSBwYXJhbXNcbiAqIEBwYXJhbSB7U29ja2V0fSBzb2NrZXRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2hhbm5lbCB7XG4gIGNvbnN0cnVjdG9yKHRvcGljLCBwYXJhbXMsIHNvY2tldCl7XG4gICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmNsb3NlZFxuICAgIHRoaXMudG9waWMgPSB0b3BpY1xuICAgIHRoaXMucGFyYW1zID0gY2xvc3VyZShwYXJhbXMgfHwge30pXG4gICAgdGhpcy5zb2NrZXQgPSBzb2NrZXRcbiAgICB0aGlzLmJpbmRpbmdzID0gW11cbiAgICB0aGlzLmJpbmRpbmdSZWYgPSAwXG4gICAgdGhpcy50aW1lb3V0ID0gdGhpcy5zb2NrZXQudGltZW91dFxuICAgIHRoaXMuam9pbmVkT25jZSA9IGZhbHNlXG4gICAgdGhpcy5qb2luUHVzaCA9IG5ldyBQdXNoKHRoaXMsIENIQU5ORUxfRVZFTlRTLmpvaW4sIHRoaXMucGFyYW1zLCB0aGlzLnRpbWVvdXQpXG4gICAgdGhpcy5wdXNoQnVmZmVyID0gW11cbiAgICB0aGlzLnN0YXRlQ2hhbmdlUmVmcyA9IFtdXG5cbiAgICB0aGlzLnJlam9pblRpbWVyID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgIGlmKHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkpeyB0aGlzLnJlam9pbigpIH1cbiAgICB9LCB0aGlzLnNvY2tldC5yZWpvaW5BZnRlck1zKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VSZWZzLnB1c2godGhpcy5zb2NrZXQub25FcnJvcigoKSA9PiB0aGlzLnJlam9pblRpbWVyLnJlc2V0KCkpKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VSZWZzLnB1c2godGhpcy5zb2NrZXQub25PcGVuKCgpID0+IHtcbiAgICAgIHRoaXMucmVqb2luVGltZXIucmVzZXQoKVxuICAgICAgaWYodGhpcy5pc0Vycm9yZWQoKSl7IHRoaXMucmVqb2luKCkgfVxuICAgIH0pXG4gICAgKVxuICAgIHRoaXMuam9pblB1c2gucmVjZWl2ZShcIm9rXCIsICgpID0+IHtcbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5qb2luZWRcbiAgICAgIHRoaXMucmVqb2luVGltZXIucmVzZXQoKVxuICAgICAgdGhpcy5wdXNoQnVmZmVyLmZvckVhY2gocHVzaEV2ZW50ID0+IHB1c2hFdmVudC5zZW5kKCkpXG4gICAgICB0aGlzLnB1c2hCdWZmZXIgPSBbXVxuICAgIH0pXG4gICAgdGhpcy5qb2luUHVzaC5yZWNlaXZlKFwiZXJyb3JcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmVycm9yZWRcbiAgICAgIGlmKHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkpeyB0aGlzLnJlam9pblRpbWVyLnNjaGVkdWxlVGltZW91dCgpIH1cbiAgICB9KVxuICAgIHRoaXMub25DbG9zZSgoKSA9PiB7XG4gICAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KClcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIGBjbG9zZSAke3RoaXMudG9waWN9ICR7dGhpcy5qb2luUmVmKCl9YClcbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5jbG9zZWRcbiAgICAgIHRoaXMuc29ja2V0LnJlbW92ZSh0aGlzKVxuICAgIH0pXG4gICAgdGhpcy5vbkVycm9yKHJlYXNvbiA9PiB7XG4gICAgICBpZih0aGlzLnNvY2tldC5oYXNMb2dnZXIoKSkgdGhpcy5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLCBgZXJyb3IgJHt0aGlzLnRvcGljfWAsIHJlYXNvbilcbiAgICAgIGlmKHRoaXMuaXNKb2luaW5nKCkpeyB0aGlzLmpvaW5QdXNoLnJlc2V0KCkgfVxuICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmVycm9yZWRcbiAgICAgIGlmKHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkpeyB0aGlzLnJlam9pblRpbWVyLnNjaGVkdWxlVGltZW91dCgpIH1cbiAgICB9KVxuICAgIHRoaXMuam9pblB1c2gucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT4ge1xuICAgICAgaWYodGhpcy5zb2NrZXQuaGFzTG9nZ2VyKCkpIHRoaXMuc29ja2V0LmxvZyhcImNoYW5uZWxcIiwgYHRpbWVvdXQgJHt0aGlzLnRvcGljfSAoJHt0aGlzLmpvaW5SZWYoKX0pYCwgdGhpcy5qb2luUHVzaC50aW1lb3V0KVxuICAgICAgbGV0IGxlYXZlUHVzaCA9IG5ldyBQdXNoKHRoaXMsIENIQU5ORUxfRVZFTlRTLmxlYXZlLCBjbG9zdXJlKHt9KSwgdGhpcy50aW1lb3V0KVxuICAgICAgbGVhdmVQdXNoLnNlbmQoKVxuICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmVycm9yZWRcbiAgICAgIHRoaXMuam9pblB1c2gucmVzZXQoKVxuICAgICAgaWYodGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKSl7IHRoaXMucmVqb2luVGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgfVxuICAgIH0pXG4gICAgdGhpcy5vbihDSEFOTkVMX0VWRU5UUy5yZXBseSwgKHBheWxvYWQsIHJlZikgPT4ge1xuICAgICAgdGhpcy50cmlnZ2VyKHRoaXMucmVwbHlFdmVudE5hbWUocmVmKSwgcGF5bG9hZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEpvaW4gdGhlIGNoYW5uZWxcbiAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aW1lb3V0XG4gICAqIEByZXR1cm5zIHtQdXNofVxuICAgKi9cbiAgam9pbih0aW1lb3V0ID0gdGhpcy50aW1lb3V0KXtcbiAgICBpZih0aGlzLmpvaW5lZE9uY2Upe1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJpZWQgdG8gam9pbiBtdWx0aXBsZSB0aW1lcy4gJ2pvaW4nIGNhbiBvbmx5IGJlIGNhbGxlZCBhIHNpbmdsZSB0aW1lIHBlciBjaGFubmVsIGluc3RhbmNlXCIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXRcbiAgICAgIHRoaXMuam9pbmVkT25jZSA9IHRydWVcbiAgICAgIHRoaXMucmVqb2luKClcbiAgICAgIHJldHVybiB0aGlzLmpvaW5QdXNoXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhvb2sgaW50byBjaGFubmVsIGNsb3NlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbkNsb3NlKGNhbGxiYWNrKXtcbiAgICB0aGlzLm9uKENIQU5ORUxfRVZFTlRTLmNsb3NlLCBjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBIb29rIGludG8gY2hhbm5lbCBlcnJvcnNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uRXJyb3IoY2FsbGJhY2spe1xuICAgIHJldHVybiB0aGlzLm9uKENIQU5ORUxfRVZFTlRTLmVycm9yLCByZWFzb24gPT4gY2FsbGJhY2socmVhc29uKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIG9uIGNoYW5uZWwgZXZlbnRzXG4gICAqXG4gICAqIFN1YnNjcmlwdGlvbiByZXR1cm5zIGEgcmVmIGNvdW50ZXIsIHdoaWNoIGNhbiBiZSB1c2VkIGxhdGVyIHRvXG4gICAqIHVuc3Vic2NyaWJlIHRoZSBleGFjdCBldmVudCBsaXN0ZW5lclxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCByZWYxID0gY2hhbm5lbC5vbihcImV2ZW50XCIsIGRvX3N0dWZmKVxuICAgKiBjb25zdCByZWYyID0gY2hhbm5lbC5vbihcImV2ZW50XCIsIGRvX290aGVyX3N0dWZmKVxuICAgKiBjaGFubmVsLm9mZihcImV2ZW50XCIsIHJlZjEpXG4gICAqIC8vIFNpbmNlIHVuc3Vic2NyaXB0aW9uLCBkb19zdHVmZiB3b24ndCBmaXJlLFxuICAgKiAvLyB3aGlsZSBkb19vdGhlcl9zdHVmZiB3aWxsIGtlZXAgZmlyaW5nIG9uIHRoZSBcImV2ZW50XCJcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIHtpbnRlZ2VyfSByZWZcbiAgICovXG4gIG9uKGV2ZW50LCBjYWxsYmFjayl7XG4gICAgbGV0IHJlZiA9IHRoaXMuYmluZGluZ1JlZisrXG4gICAgdGhpcy5iaW5kaW5ncy5wdXNoKHtldmVudCwgcmVmLCBjYWxsYmFja30pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlcyBvZmYgb2YgY2hhbm5lbCBldmVudHNcbiAgICpcbiAgICogVXNlIHRoZSByZWYgcmV0dXJuZWQgZnJvbSBhIGNoYW5uZWwub24oKSB0byB1bnN1YnNjcmliZSBvbmVcbiAgICogaGFuZGxlciwgb3IgcGFzcyBub3RoaW5nIGZvciB0aGUgcmVmIHRvIHVuc3Vic2NyaWJlIGFsbFxuICAgKiBoYW5kbGVycyBmb3IgdGhlIGdpdmVuIGV2ZW50LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBVbnN1YnNjcmliZSB0aGUgZG9fc3R1ZmYgaGFuZGxlclxuICAgKiBjb25zdCByZWYxID0gY2hhbm5lbC5vbihcImV2ZW50XCIsIGRvX3N0dWZmKVxuICAgKiBjaGFubmVsLm9mZihcImV2ZW50XCIsIHJlZjEpXG4gICAqXG4gICAqIC8vIFVuc3Vic2NyaWJlIGFsbCBoYW5kbGVycyBmcm9tIGV2ZW50XG4gICAqIGNoYW5uZWwub2ZmKFwiZXZlbnRcIilcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gcmVmXG4gICAqL1xuICBvZmYoZXZlbnQsIHJlZil7XG4gICAgdGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuZmlsdGVyKChiaW5kKSA9PiB7XG4gICAgICByZXR1cm4gIShiaW5kLmV2ZW50ID09PSBldmVudCAmJiAodHlwZW9mIHJlZiA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWYgPT09IGJpbmQucmVmKSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjYW5QdXNoKCl7IHJldHVybiB0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpICYmIHRoaXMuaXNKb2luZWQoKSB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgbWVzc2FnZSBgZXZlbnRgIHRvIHBob2VuaXggd2l0aCB0aGUgcGF5bG9hZCBgcGF5bG9hZGAuXG4gICAqIFBob2VuaXggcmVjZWl2ZXMgdGhpcyBpbiB0aGUgYGhhbmRsZV9pbihldmVudCwgcGF5bG9hZCwgc29ja2V0KWBcbiAgICogZnVuY3Rpb24uIGlmIHBob2VuaXggcmVwbGllcyBvciBpdCB0aW1lcyBvdXQgKGRlZmF1bHQgMTAwMDBtcyksXG4gICAqIHRoZW4gb3B0aW9uYWxseSB0aGUgcmVwbHkgY2FuIGJlIHJlY2VpdmVkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjaGFubmVsLnB1c2goXCJldmVudFwiKVxuICAgKiAgIC5yZWNlaXZlKFwib2tcIiwgcGF5bG9hZCA9PiBjb25zb2xlLmxvZyhcInBob2VuaXggcmVwbGllZDpcIiwgcGF5bG9hZCkpXG4gICAqICAgLnJlY2VpdmUoXCJlcnJvclwiLCBlcnIgPT4gY29uc29sZS5sb2coXCJwaG9lbml4IGVycm9yZWRcIiwgZXJyKSlcbiAgICogICAucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT4gY29uc29sZS5sb2coXCJ0aW1lZCBvdXQgcHVzaGluZ1wiKSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICogQHJldHVybnMge1B1c2h9XG4gICAqL1xuICBwdXNoKGV2ZW50LCBwYXlsb2FkLCB0aW1lb3V0ID0gdGhpcy50aW1lb3V0KXtcbiAgICBwYXlsb2FkID0gcGF5bG9hZCB8fCB7fVxuICAgIGlmKCF0aGlzLmpvaW5lZE9uY2Upe1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB0cmllZCB0byBwdXNoICcke2V2ZW50fScgdG8gJyR7dGhpcy50b3BpY30nIGJlZm9yZSBqb2luaW5nLiBVc2UgY2hhbm5lbC5qb2luKCkgYmVmb3JlIHB1c2hpbmcgZXZlbnRzYClcbiAgICB9XG4gICAgbGV0IHB1c2hFdmVudCA9IG5ldyBQdXNoKHRoaXMsIGV2ZW50LCBmdW5jdGlvbiAoKXsgcmV0dXJuIHBheWxvYWQgfSwgdGltZW91dClcbiAgICBpZih0aGlzLmNhblB1c2goKSl7XG4gICAgICBwdXNoRXZlbnQuc2VuZCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHB1c2hFdmVudC5zdGFydFRpbWVvdXQoKVxuICAgICAgdGhpcy5wdXNoQnVmZmVyLnB1c2gocHVzaEV2ZW50KVxuICAgIH1cblxuICAgIHJldHVybiBwdXNoRXZlbnRcbiAgfVxuXG4gIC8qKiBMZWF2ZXMgdGhlIGNoYW5uZWxcbiAgICpcbiAgICogVW5zdWJzY3JpYmVzIGZyb20gc2VydmVyIGV2ZW50cywgYW5kXG4gICAqIGluc3RydWN0cyBjaGFubmVsIHRvIHRlcm1pbmF0ZSBvbiBzZXJ2ZXJcbiAgICpcbiAgICogVHJpZ2dlcnMgb25DbG9zZSgpIGhvb2tzXG4gICAqXG4gICAqIFRvIHJlY2VpdmUgbGVhdmUgYWNrbm93bGVkZ2VtZW50cywgdXNlIHRoZSBgcmVjZWl2ZWBcbiAgICogaG9vayB0byBiaW5kIHRvIHRoZSBzZXJ2ZXIgYWNrLCBpZTpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY2hhbm5lbC5sZWF2ZSgpLnJlY2VpdmUoXCJva1wiLCAoKSA9PiBhbGVydChcImxlZnQhXCIpIClcbiAgICpcbiAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aW1lb3V0XG4gICAqIEByZXR1cm5zIHtQdXNofVxuICAgKi9cbiAgbGVhdmUodGltZW91dCA9IHRoaXMudGltZW91dCl7XG4gICAgdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpXG4gICAgdGhpcy5qb2luUHVzaC5jYW5jZWxUaW1lb3V0KClcblxuICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5sZWF2aW5nXG4gICAgbGV0IG9uQ2xvc2UgPSAoKSA9PiB7XG4gICAgICBpZih0aGlzLnNvY2tldC5oYXNMb2dnZXIoKSkgdGhpcy5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLCBgbGVhdmUgJHt0aGlzLnRvcGljfWApXG4gICAgICB0aGlzLnRyaWdnZXIoQ0hBTk5FTF9FVkVOVFMuY2xvc2UsIFwibGVhdmVcIilcbiAgICB9XG4gICAgbGV0IGxlYXZlUHVzaCA9IG5ldyBQdXNoKHRoaXMsIENIQU5ORUxfRVZFTlRTLmxlYXZlLCBjbG9zdXJlKHt9KSwgdGltZW91dClcbiAgICBsZWF2ZVB1c2gucmVjZWl2ZShcIm9rXCIsICgpID0+IG9uQ2xvc2UoKSlcbiAgICAgIC5yZWNlaXZlKFwidGltZW91dFwiLCAoKSA9PiBvbkNsb3NlKCkpXG4gICAgbGVhdmVQdXNoLnNlbmQoKVxuICAgIGlmKCF0aGlzLmNhblB1c2goKSl7IGxlYXZlUHVzaC50cmlnZ2VyKFwib2tcIiwge30pIH1cblxuICAgIHJldHVybiBsZWF2ZVB1c2hcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkYWJsZSBtZXNzYWdlIGhvb2tcbiAgICpcbiAgICogUmVjZWl2ZXMgYWxsIGV2ZW50cyBmb3Igc3BlY2lhbGl6ZWQgbWVzc2FnZSBoYW5kbGluZ1xuICAgKiBiZWZvcmUgZGlzcGF0Y2hpbmcgdG8gdGhlIGNoYW5uZWwgY2FsbGJhY2tzLlxuICAgKlxuICAgKiBNdXN0IHJldHVybiB0aGUgcGF5bG9hZCwgbW9kaWZpZWQgb3IgdW5tb2RpZmllZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IHBheWxvYWRcbiAgICogQHBhcmFtIHtpbnRlZ2VyfSByZWZcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIG9uTWVzc2FnZShfZXZlbnQsIHBheWxvYWQsIF9yZWYpeyByZXR1cm4gcGF5bG9hZCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc01lbWJlcih0b3BpYywgZXZlbnQsIHBheWxvYWQsIGpvaW5SZWYpe1xuICAgIGlmKHRoaXMudG9waWMgIT09IHRvcGljKXsgcmV0dXJuIGZhbHNlIH1cblxuICAgIGlmKGpvaW5SZWYgJiYgam9pblJlZiAhPT0gdGhpcy5qb2luUmVmKCkpe1xuICAgICAgaWYodGhpcy5zb2NrZXQuaGFzTG9nZ2VyKCkpIHRoaXMuc29ja2V0LmxvZyhcImNoYW5uZWxcIiwgXCJkcm9wcGluZyBvdXRkYXRlZCBtZXNzYWdlXCIsIHt0b3BpYywgZXZlbnQsIHBheWxvYWQsIGpvaW5SZWZ9KVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBqb2luUmVmKCl7IHJldHVybiB0aGlzLmpvaW5QdXNoLnJlZiB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZWpvaW4odGltZW91dCA9IHRoaXMudGltZW91dCl7XG4gICAgaWYodGhpcy5pc0xlYXZpbmcoKSl7IHJldHVybiB9XG4gICAgdGhpcy5zb2NrZXQubGVhdmVPcGVuVG9waWModGhpcy50b3BpYylcbiAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuam9pbmluZ1xuICAgIHRoaXMuam9pblB1c2gucmVzZW5kKHRpbWVvdXQpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRyaWdnZXIoZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pblJlZil7XG4gICAgbGV0IGhhbmRsZWRQYXlsb2FkID0gdGhpcy5vbk1lc3NhZ2UoZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pblJlZilcbiAgICBpZihwYXlsb2FkICYmICFoYW5kbGVkUGF5bG9hZCl7IHRocm93IG5ldyBFcnJvcihcImNoYW5uZWwgb25NZXNzYWdlIGNhbGxiYWNrcyBtdXN0IHJldHVybiB0aGUgcGF5bG9hZCwgbW9kaWZpZWQgb3IgdW5tb2RpZmllZFwiKSB9XG5cbiAgICBsZXQgZXZlbnRCaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuZmlsdGVyKGJpbmQgPT4gYmluZC5ldmVudCA9PT0gZXZlbnQpXG5cbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgZXZlbnRCaW5kaW5ncy5sZW5ndGg7IGkrKyl7XG4gICAgICBsZXQgYmluZCA9IGV2ZW50QmluZGluZ3NbaV1cbiAgICAgIGJpbmQuY2FsbGJhY2soaGFuZGxlZFBheWxvYWQsIHJlZiwgam9pblJlZiB8fCB0aGlzLmpvaW5SZWYoKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlcGx5RXZlbnROYW1lKHJlZil7IHJldHVybiBgY2hhbl9yZXBseV8ke3JlZn1gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzQ2xvc2VkKCl7IHJldHVybiB0aGlzLnN0YXRlID09PSBDSEFOTkVMX1NUQVRFUy5jbG9zZWQgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaXNFcnJvcmVkKCl7IHJldHVybiB0aGlzLnN0YXRlID09PSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzSm9pbmVkKCl7IHJldHVybiB0aGlzLnN0YXRlID09PSBDSEFOTkVMX1NUQVRFUy5qb2luZWQgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaXNKb2luaW5nKCl7IHJldHVybiB0aGlzLnN0YXRlID09PSBDSEFOTkVMX1NUQVRFUy5qb2luaW5nIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzTGVhdmluZygpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMubGVhdmluZyB9XG59XG4iLCAiaW1wb3J0IHtcbiAgZ2xvYmFsLFxuICBYSFJfU1RBVEVTXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFqYXgge1xuXG4gIHN0YXRpYyByZXF1ZXN0KG1ldGhvZCwgZW5kUG9pbnQsIGFjY2VwdCwgYm9keSwgdGltZW91dCwgb250aW1lb3V0LCBjYWxsYmFjayl7XG4gICAgaWYoZ2xvYmFsLlhEb21haW5SZXF1ZXN0KXtcbiAgICAgIGxldCByZXEgPSBuZXcgZ2xvYmFsLlhEb21haW5SZXF1ZXN0KCkgLy8gSUU4LCBJRTlcbiAgICAgIHRoaXMueGRvbWFpblJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcmVxID0gbmV3IGdsb2JhbC5YTUxIdHRwUmVxdWVzdCgpIC8vIElFNyssIEZpcmVmb3gsIENocm9tZSwgT3BlcmEsIFNhZmFyaVxuICAgICAgdGhpcy54aHJSZXF1ZXN0KHJlcSwgbWV0aG9kLCBlbmRQb2ludCwgYWNjZXB0LCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB4ZG9tYWluUmVxdWVzdChyZXEsIG1ldGhvZCwgZW5kUG9pbnQsIGJvZHksIHRpbWVvdXQsIG9udGltZW91dCwgY2FsbGJhY2spe1xuICAgIHJlcS50aW1lb3V0ID0gdGltZW91dFxuICAgIHJlcS5vcGVuKG1ldGhvZCwgZW5kUG9pbnQpXG4gICAgcmVxLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGxldCByZXNwb25zZSA9IHRoaXMucGFyc2VKU09OKHJlcS5yZXNwb25zZVRleHQpXG4gICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhyZXNwb25zZSlcbiAgICB9XG4gICAgaWYob250aW1lb3V0KXsgcmVxLm9udGltZW91dCA9IG9udGltZW91dCB9XG5cbiAgICAvLyBXb3JrIGFyb3VuZCBidWcgaW4gSUU5IHRoYXQgcmVxdWlyZXMgYW4gYXR0YWNoZWQgb25wcm9ncmVzcyBoYW5kbGVyXG4gICAgcmVxLm9ucHJvZ3Jlc3MgPSAoKSA9PiB7IH1cblxuICAgIHJlcS5zZW5kKGJvZHkpXG4gIH1cblxuICBzdGF0aWMgeGhyUmVxdWVzdChyZXEsIG1ldGhvZCwgZW5kUG9pbnQsIGFjY2VwdCwgYm9keSwgdGltZW91dCwgb250aW1lb3V0LCBjYWxsYmFjayl7XG4gICAgcmVxLm9wZW4obWV0aG9kLCBlbmRQb2ludCwgdHJ1ZSlcbiAgICByZXEudGltZW91dCA9IHRpbWVvdXRcbiAgICByZXEuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBhY2NlcHQpXG4gICAgcmVxLm9uZXJyb3IgPSAoKSA9PiB7IGNhbGxiYWNrICYmIGNhbGxiYWNrKG51bGwpIH1cbiAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge1xuICAgICAgaWYocmVxLnJlYWR5U3RhdGUgPT09IFhIUl9TVEFURVMuY29tcGxldGUgJiYgY2FsbGJhY2spe1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSB0aGlzLnBhcnNlSlNPTihyZXEucmVzcG9uc2VUZXh0KVxuICAgICAgICBjYWxsYmFjayhyZXNwb25zZSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYob250aW1lb3V0KXsgcmVxLm9udGltZW91dCA9IG9udGltZW91dCB9XG5cbiAgICByZXEuc2VuZChib2R5KVxuICB9XG5cbiAgc3RhdGljIHBhcnNlSlNPTihyZXNwKXtcbiAgICBpZighcmVzcCB8fCByZXNwID09PSBcIlwiKXsgcmV0dXJuIG51bGwgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3ApXG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICBjb25zb2xlICYmIGNvbnNvbGUubG9nKFwiZmFpbGVkIHRvIHBhcnNlIEpTT04gcmVzcG9uc2VcIiwgcmVzcClcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHNlcmlhbGl6ZShvYmosIHBhcmVudEtleSl7XG4gICAgbGV0IHF1ZXJ5U3RyID0gW11cbiAgICBmb3IodmFyIGtleSBpbiBvYmope1xuICAgICAgaWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpeyBjb250aW51ZSB9XG4gICAgICBsZXQgcGFyYW1LZXkgPSBwYXJlbnRLZXkgPyBgJHtwYXJlbnRLZXl9WyR7a2V5fV1gIDoga2V5XG4gICAgICBsZXQgcGFyYW1WYWwgPSBvYmpba2V5XVxuICAgICAgaWYodHlwZW9mIHBhcmFtVmFsID09PSBcIm9iamVjdFwiKXtcbiAgICAgICAgcXVlcnlTdHIucHVzaCh0aGlzLnNlcmlhbGl6ZShwYXJhbVZhbCwgcGFyYW1LZXkpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcnlTdHIucHVzaChlbmNvZGVVUklDb21wb25lbnQocGFyYW1LZXkpICsgXCI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQocGFyYW1WYWwpKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcXVlcnlTdHIuam9pbihcIiZcIilcbiAgfVxuXG4gIHN0YXRpYyBhcHBlbmRQYXJhbXModXJsLCBwYXJhbXMpe1xuICAgIGlmKE9iamVjdC5rZXlzKHBhcmFtcykubGVuZ3RoID09PSAwKXsgcmV0dXJuIHVybCB9XG5cbiAgICBsZXQgcHJlZml4ID0gdXJsLm1hdGNoKC9cXD8vKSA/IFwiJlwiIDogXCI/XCJcbiAgICByZXR1cm4gYCR7dXJsfSR7cHJlZml4fSR7dGhpcy5zZXJpYWxpemUocGFyYW1zKX1gXG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBTT0NLRVRfU1RBVEVTLFxuICBUUkFOU1BPUlRTXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCBBamF4IGZyb20gXCIuL2FqYXhcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb25nUG9sbCB7XG5cbiAgY29uc3RydWN0b3IoZW5kUG9pbnQpe1xuICAgIHRoaXMuZW5kUG9pbnQgPSBudWxsXG4gICAgdGhpcy50b2tlbiA9IG51bGxcbiAgICB0aGlzLnNraXBIZWFydGJlYXQgPSB0cnVlXG4gICAgdGhpcy5vbm9wZW4gPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgdGhpcy5vbmVycm9yID0gZnVuY3Rpb24gKCl7IH0gLy8gbm9vcFxuICAgIHRoaXMub25tZXNzYWdlID0gZnVuY3Rpb24gKCl7IH0gLy8gbm9vcFxuICAgIHRoaXMub25jbG9zZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICB0aGlzLnBvbGxFbmRwb2ludCA9IHRoaXMubm9ybWFsaXplRW5kcG9pbnQoZW5kUG9pbnQpXG4gICAgdGhpcy5yZWFkeVN0YXRlID0gU09DS0VUX1NUQVRFUy5jb25uZWN0aW5nXG5cbiAgICB0aGlzLnBvbGwoKVxuICB9XG5cbiAgbm9ybWFsaXplRW5kcG9pbnQoZW5kUG9pbnQpe1xuICAgIHJldHVybiAoZW5kUG9pbnRcbiAgICAgIC5yZXBsYWNlKFwid3M6Ly9cIiwgXCJodHRwOi8vXCIpXG4gICAgICAucmVwbGFjZShcIndzczovL1wiLCBcImh0dHBzOi8vXCIpXG4gICAgICAucmVwbGFjZShuZXcgUmVnRXhwKFwiKC4qKVxcL1wiICsgVFJBTlNQT1JUUy53ZWJzb2NrZXQpLCBcIiQxL1wiICsgVFJBTlNQT1JUUy5sb25ncG9sbCkpXG4gIH1cblxuICBlbmRwb2ludFVSTCgpe1xuICAgIHJldHVybiBBamF4LmFwcGVuZFBhcmFtcyh0aGlzLnBvbGxFbmRwb2ludCwge3Rva2VuOiB0aGlzLnRva2VufSlcbiAgfVxuXG4gIGNsb3NlQW5kUmV0cnkoKXtcbiAgICB0aGlzLmNsb3NlKClcbiAgICB0aGlzLnJlYWR5U3RhdGUgPSBTT0NLRVRfU1RBVEVTLmNvbm5lY3RpbmdcbiAgfVxuXG4gIG9udGltZW91dCgpe1xuICAgIHRoaXMub25lcnJvcihcInRpbWVvdXRcIilcbiAgICB0aGlzLmNsb3NlQW5kUmV0cnkoKVxuICB9XG5cbiAgcG9sbCgpe1xuICAgIGlmKCEodGhpcy5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLm9wZW4gfHwgdGhpcy5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLmNvbm5lY3RpbmcpKXsgcmV0dXJuIH1cblxuICAgIEFqYXgucmVxdWVzdChcIkdFVFwiLCB0aGlzLmVuZHBvaW50VVJMKCksIFwiYXBwbGljYXRpb24vanNvblwiLCBudWxsLCB0aGlzLnRpbWVvdXQsIHRoaXMub250aW1lb3V0LmJpbmQodGhpcyksIChyZXNwKSA9PiB7XG4gICAgICBpZihyZXNwKXtcbiAgICAgICAgdmFyIHtzdGF0dXMsIHRva2VuLCBtZXNzYWdlc30gPSByZXNwXG4gICAgICAgIHRoaXMudG9rZW4gPSB0b2tlblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdHVzID0gMFxuICAgICAgfVxuXG4gICAgICBzd2l0Y2goc3RhdHVzKXtcbiAgICAgICAgY2FzZSAyMDA6XG4gICAgICAgICAgbWVzc2FnZXMuZm9yRWFjaChtc2cgPT4ge1xuICAgICAgICAgICAgLy8gVGFza3MgYXJlIHdoYXQgdGhpbmdzIGxpa2UgZXZlbnQgaGFuZGxlcnMsIHNldFRpbWVvdXQgY2FsbGJhY2tzLFxuICAgICAgICAgICAgLy8gcHJvbWlzZSByZXNvbHZlcyBhbmQgbW9yZSBhcmUgcnVuIHdpdGhpbi5cbiAgICAgICAgICAgIC8vIEluIG1vZGVybiBicm93c2VycywgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQga2luZHMgb2YgdGFza3MsXG4gICAgICAgICAgICAvLyBtaWNyb3Rhc2tzIGFuZCBtYWNyb3Rhc2tzLlxuICAgICAgICAgICAgLy8gTWljcm90YXNrcyBhcmUgbWFpbmx5IHVzZWQgZm9yIFByb21pc2VzLCB3aGlsZSBtYWNyb3Rhc2tzIGFyZVxuICAgICAgICAgICAgLy8gdXNlZCBmb3IgZXZlcnl0aGluZyBlbHNlLlxuICAgICAgICAgICAgLy8gTWljcm90YXNrcyBhbHdheXMgaGF2ZSBwcmlvcml0eSBvdmVyIG1hY3JvdGFza3MuIElmIHRoZSBKUyBlbmdpbmVcbiAgICAgICAgICAgIC8vIGlzIGxvb2tpbmcgZm9yIGEgdGFzayB0byBydW4sIGl0IHdpbGwgYWx3YXlzIHRyeSB0byBlbXB0eSB0aGVcbiAgICAgICAgICAgIC8vIG1pY3JvdGFzayBxdWV1ZSBiZWZvcmUgYXR0ZW1wdGluZyB0byBydW4gYW55dGhpbmcgZnJvbSB0aGVcbiAgICAgICAgICAgIC8vIG1hY3JvdGFzayBxdWV1ZS5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBGb3IgdGhlIFdlYlNvY2tldCB0cmFuc3BvcnQsIG1lc3NhZ2VzIGFsd2F5cyBhcnJpdmUgaW4gdGhlaXIgb3duXG4gICAgICAgICAgICAvLyBldmVudC4gVGhpcyBtZWFucyB0aGF0IGlmIGFueSBwcm9taXNlcyBhcmUgcmVzb2x2ZWQgZnJvbSB3aXRoaW4sXG4gICAgICAgICAgICAvLyB0aGVpciBjYWxsYmFja3Mgd2lsbCBhbHdheXMgZmluaXNoIGV4ZWN1dGlvbiBieSB0aGUgdGltZSB0aGVcbiAgICAgICAgICAgIC8vIG5leHQgbWVzc2FnZSBldmVudCBoYW5kbGVyIGlzIHJ1bi5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBJbiBvcmRlciB0byBlbXVsYXRlIHRoaXMgYmVoYXZpb3VyLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBlYWNoXG4gICAgICAgICAgICAvLyBvbm1lc3NhZ2UgaGFuZGxlciBpcyBydW4gd2l0aGluIGl0J3Mgb3duIG1hY3JvdGFzay5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm9ubWVzc2FnZSh7ZGF0YTogbXNnfSlcbiAgICAgICAgICAgIH0sIDApXG4gICAgICAgICAgfSlcbiAgICAgICAgICB0aGlzLnBvbGwoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjA0OlxuICAgICAgICAgIHRoaXMucG9sbCgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0MTA6XG4gICAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gU09DS0VUX1NUQVRFUy5vcGVuXG4gICAgICAgICAgdGhpcy5vbm9wZW4oKVxuICAgICAgICAgIHRoaXMucG9sbCgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0MDM6XG4gICAgICAgICAgdGhpcy5vbmVycm9yKClcbiAgICAgICAgICB0aGlzLmNsb3NlKClcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgIGNhc2UgNTAwOlxuICAgICAgICAgIHRoaXMub25lcnJvcigpXG4gICAgICAgICAgdGhpcy5jbG9zZUFuZFJldHJ5KClcbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoYHVuaGFuZGxlZCBwb2xsIHN0YXR1cyAke3N0YXR1c31gKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBzZW5kKGJvZHkpe1xuICAgIEFqYXgucmVxdWVzdChcIlBPU1RcIiwgdGhpcy5lbmRwb2ludFVSTCgpLCBcImFwcGxpY2F0aW9uL2pzb25cIiwgYm9keSwgdGhpcy50aW1lb3V0LCB0aGlzLm9uZXJyb3IuYmluZCh0aGlzLCBcInRpbWVvdXRcIiksIChyZXNwKSA9PiB7XG4gICAgICBpZighcmVzcCB8fCByZXNwLnN0YXR1cyAhPT0gMjAwKXtcbiAgICAgICAgdGhpcy5vbmVycm9yKHJlc3AgJiYgcmVzcC5zdGF0dXMpXG4gICAgICAgIHRoaXMuY2xvc2VBbmRSZXRyeSgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGNsb3NlKF9jb2RlLCBfcmVhc29uKXtcbiAgICB0aGlzLnJlYWR5U3RhdGUgPSBTT0NLRVRfU1RBVEVTLmNsb3NlZFxuICAgIHRoaXMub25jbG9zZSgpXG4gIH1cbn1cbiIsICIvKipcbiAqIEluaXRpYWxpemVzIHRoZSBQcmVzZW5jZVxuICogQHBhcmFtIHtDaGFubmVsfSBjaGFubmVsIC0gVGhlIENoYW5uZWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gVGhlIG9wdGlvbnMsXG4gKiAgICAgICAgZm9yIGV4YW1wbGUgYHtldmVudHM6IHtzdGF0ZTogXCJzdGF0ZVwiLCBkaWZmOiBcImRpZmZcIn19YFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcmVzZW5jZSB7XG5cbiAgY29uc3RydWN0b3IoY2hhbm5lbCwgb3B0cyA9IHt9KXtcbiAgICBsZXQgZXZlbnRzID0gb3B0cy5ldmVudHMgfHwge3N0YXRlOiBcInByZXNlbmNlX3N0YXRlXCIsIGRpZmY6IFwicHJlc2VuY2VfZGlmZlwifVxuICAgIHRoaXMuc3RhdGUgPSB7fVxuICAgIHRoaXMucGVuZGluZ0RpZmZzID0gW11cbiAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsXG4gICAgdGhpcy5qb2luUmVmID0gbnVsbFxuICAgIHRoaXMuY2FsbGVyID0ge1xuICAgICAgb25Kb2luOiBmdW5jdGlvbiAoKXsgfSxcbiAgICAgIG9uTGVhdmU6IGZ1bmN0aW9uICgpeyB9LFxuICAgICAgb25TeW5jOiBmdW5jdGlvbiAoKXsgfVxuICAgIH1cblxuICAgIHRoaXMuY2hhbm5lbC5vbihldmVudHMuc3RhdGUsIG5ld1N0YXRlID0+IHtcbiAgICAgIGxldCB7b25Kb2luLCBvbkxlYXZlLCBvblN5bmN9ID0gdGhpcy5jYWxsZXJcblxuICAgICAgdGhpcy5qb2luUmVmID0gdGhpcy5jaGFubmVsLmpvaW5SZWYoKVxuICAgICAgdGhpcy5zdGF0ZSA9IFByZXNlbmNlLnN5bmNTdGF0ZSh0aGlzLnN0YXRlLCBuZXdTdGF0ZSwgb25Kb2luLCBvbkxlYXZlKVxuXG4gICAgICB0aGlzLnBlbmRpbmdEaWZmcy5mb3JFYWNoKGRpZmYgPT4ge1xuICAgICAgICB0aGlzLnN0YXRlID0gUHJlc2VuY2Uuc3luY0RpZmYodGhpcy5zdGF0ZSwgZGlmZiwgb25Kb2luLCBvbkxlYXZlKVxuICAgICAgfSlcbiAgICAgIHRoaXMucGVuZGluZ0RpZmZzID0gW11cbiAgICAgIG9uU3luYygpXG4gICAgfSlcblxuICAgIHRoaXMuY2hhbm5lbC5vbihldmVudHMuZGlmZiwgZGlmZiA9PiB7XG4gICAgICBsZXQge29uSm9pbiwgb25MZWF2ZSwgb25TeW5jfSA9IHRoaXMuY2FsbGVyXG5cbiAgICAgIGlmKHRoaXMuaW5QZW5kaW5nU3luY1N0YXRlKCkpe1xuICAgICAgICB0aGlzLnBlbmRpbmdEaWZmcy5wdXNoKGRpZmYpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXRlID0gUHJlc2VuY2Uuc3luY0RpZmYodGhpcy5zdGF0ZSwgZGlmZiwgb25Kb2luLCBvbkxlYXZlKVxuICAgICAgICBvblN5bmMoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBvbkpvaW4oY2FsbGJhY2speyB0aGlzLmNhbGxlci5vbkpvaW4gPSBjYWxsYmFjayB9XG5cbiAgb25MZWF2ZShjYWxsYmFjayl7IHRoaXMuY2FsbGVyLm9uTGVhdmUgPSBjYWxsYmFjayB9XG5cbiAgb25TeW5jKGNhbGxiYWNrKXsgdGhpcy5jYWxsZXIub25TeW5jID0gY2FsbGJhY2sgfVxuXG4gIGxpc3QoYnkpeyByZXR1cm4gUHJlc2VuY2UubGlzdCh0aGlzLnN0YXRlLCBieSkgfVxuXG4gIGluUGVuZGluZ1N5bmNTdGF0ZSgpe1xuICAgIHJldHVybiAhdGhpcy5qb2luUmVmIHx8ICh0aGlzLmpvaW5SZWYgIT09IHRoaXMuY2hhbm5lbC5qb2luUmVmKCkpXG4gIH1cblxuICAvLyBsb3dlci1sZXZlbCBwdWJsaWMgc3RhdGljIEFQSVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHN5bmMgdGhlIGxpc3Qgb2YgcHJlc2VuY2VzIG9uIHRoZSBzZXJ2ZXJcbiAgICogd2l0aCB0aGUgY2xpZW50J3Mgc3RhdGUuIEFuIG9wdGlvbmFsIGBvbkpvaW5gIGFuZCBgb25MZWF2ZWAgY2FsbGJhY2sgY2FuXG4gICAqIGJlIHByb3ZpZGVkIHRvIHJlYWN0IHRvIGNoYW5nZXMgaW4gdGhlIGNsaWVudCdzIGxvY2FsIHByZXNlbmNlcyBhY3Jvc3NcbiAgICogZGlzY29ubmVjdHMgYW5kIHJlY29ubmVjdHMgd2l0aCB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJlc2VuY2V9XG4gICAqL1xuICBzdGF0aWMgc3luY1N0YXRlKGN1cnJlbnRTdGF0ZSwgbmV3U3RhdGUsIG9uSm9pbiwgb25MZWF2ZSl7XG4gICAgbGV0IHN0YXRlID0gdGhpcy5jbG9uZShjdXJyZW50U3RhdGUpXG4gICAgbGV0IGpvaW5zID0ge31cbiAgICBsZXQgbGVhdmVzID0ge31cblxuICAgIHRoaXMubWFwKHN0YXRlLCAoa2V5LCBwcmVzZW5jZSkgPT4ge1xuICAgICAgaWYoIW5ld1N0YXRlW2tleV0pe1xuICAgICAgICBsZWF2ZXNba2V5XSA9IHByZXNlbmNlXG4gICAgICB9XG4gICAgfSlcbiAgICB0aGlzLm1hcChuZXdTdGF0ZSwgKGtleSwgbmV3UHJlc2VuY2UpID0+IHtcbiAgICAgIGxldCBjdXJyZW50UHJlc2VuY2UgPSBzdGF0ZVtrZXldXG4gICAgICBpZihjdXJyZW50UHJlc2VuY2Upe1xuICAgICAgICBsZXQgbmV3UmVmcyA9IG5ld1ByZXNlbmNlLm1ldGFzLm1hcChtID0+IG0ucGh4X3JlZilcbiAgICAgICAgbGV0IGN1clJlZnMgPSBjdXJyZW50UHJlc2VuY2UubWV0YXMubWFwKG0gPT4gbS5waHhfcmVmKVxuICAgICAgICBsZXQgam9pbmVkTWV0YXMgPSBuZXdQcmVzZW5jZS5tZXRhcy5maWx0ZXIobSA9PiBjdXJSZWZzLmluZGV4T2YobS5waHhfcmVmKSA8IDApXG4gICAgICAgIGxldCBsZWZ0TWV0YXMgPSBjdXJyZW50UHJlc2VuY2UubWV0YXMuZmlsdGVyKG0gPT4gbmV3UmVmcy5pbmRleE9mKG0ucGh4X3JlZikgPCAwKVxuICAgICAgICBpZihqb2luZWRNZXRhcy5sZW5ndGggPiAwKXtcbiAgICAgICAgICBqb2luc1trZXldID0gbmV3UHJlc2VuY2VcbiAgICAgICAgICBqb2luc1trZXldLm1ldGFzID0gam9pbmVkTWV0YXNcbiAgICAgICAgfVxuICAgICAgICBpZihsZWZ0TWV0YXMubGVuZ3RoID4gMCl7XG4gICAgICAgICAgbGVhdmVzW2tleV0gPSB0aGlzLmNsb25lKGN1cnJlbnRQcmVzZW5jZSlcbiAgICAgICAgICBsZWF2ZXNba2V5XS5tZXRhcyA9IGxlZnRNZXRhc1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqb2luc1trZXldID0gbmV3UHJlc2VuY2VcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiB0aGlzLnN5bmNEaWZmKHN0YXRlLCB7am9pbnM6IGpvaW5zLCBsZWF2ZXM6IGxlYXZlc30sIG9uSm9pbiwgb25MZWF2ZSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBVc2VkIHRvIHN5bmMgYSBkaWZmIG9mIHByZXNlbmNlIGpvaW4gYW5kIGxlYXZlXG4gICAqIGV2ZW50cyBmcm9tIHRoZSBzZXJ2ZXIsIGFzIHRoZXkgaGFwcGVuLiBMaWtlIGBzeW5jU3RhdGVgLCBgc3luY0RpZmZgXG4gICAqIGFjY2VwdHMgb3B0aW9uYWwgYG9uSm9pbmAgYW5kIGBvbkxlYXZlYCBjYWxsYmFja3MgdG8gcmVhY3QgdG8gYSB1c2VyXG4gICAqIGpvaW5pbmcgb3IgbGVhdmluZyBmcm9tIGEgZGV2aWNlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJlc2VuY2V9XG4gICAqL1xuICBzdGF0aWMgc3luY0RpZmYoc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSl7XG4gICAgbGV0IHtqb2lucywgbGVhdmVzfSA9IHRoaXMuY2xvbmUoZGlmZilcbiAgICBpZighb25Kb2luKXsgb25Kb2luID0gZnVuY3Rpb24gKCl7IH0gfVxuICAgIGlmKCFvbkxlYXZlKXsgb25MZWF2ZSA9IGZ1bmN0aW9uICgpeyB9IH1cblxuICAgIHRoaXMubWFwKGpvaW5zLCAoa2V5LCBuZXdQcmVzZW5jZSkgPT4ge1xuICAgICAgbGV0IGN1cnJlbnRQcmVzZW5jZSA9IHN0YXRlW2tleV1cbiAgICAgIHN0YXRlW2tleV0gPSB0aGlzLmNsb25lKG5ld1ByZXNlbmNlKVxuICAgICAgaWYoY3VycmVudFByZXNlbmNlKXtcbiAgICAgICAgbGV0IGpvaW5lZFJlZnMgPSBzdGF0ZVtrZXldLm1ldGFzLm1hcChtID0+IG0ucGh4X3JlZilcbiAgICAgICAgbGV0IGN1ck1ldGFzID0gY3VycmVudFByZXNlbmNlLm1ldGFzLmZpbHRlcihtID0+IGpvaW5lZFJlZnMuaW5kZXhPZihtLnBoeF9yZWYpIDwgMClcbiAgICAgICAgc3RhdGVba2V5XS5tZXRhcy51bnNoaWZ0KC4uLmN1ck1ldGFzKVxuICAgICAgfVxuICAgICAgb25Kb2luKGtleSwgY3VycmVudFByZXNlbmNlLCBuZXdQcmVzZW5jZSlcbiAgICB9KVxuICAgIHRoaXMubWFwKGxlYXZlcywgKGtleSwgbGVmdFByZXNlbmNlKSA9PiB7XG4gICAgICBsZXQgY3VycmVudFByZXNlbmNlID0gc3RhdGVba2V5XVxuICAgICAgaWYoIWN1cnJlbnRQcmVzZW5jZSl7IHJldHVybiB9XG4gICAgICBsZXQgcmVmc1RvUmVtb3ZlID0gbGVmdFByZXNlbmNlLm1ldGFzLm1hcChtID0+IG0ucGh4X3JlZilcbiAgICAgIGN1cnJlbnRQcmVzZW5jZS5tZXRhcyA9IGN1cnJlbnRQcmVzZW5jZS5tZXRhcy5maWx0ZXIocCA9PiB7XG4gICAgICAgIHJldHVybiByZWZzVG9SZW1vdmUuaW5kZXhPZihwLnBoeF9yZWYpIDwgMFxuICAgICAgfSlcbiAgICAgIG9uTGVhdmUoa2V5LCBjdXJyZW50UHJlc2VuY2UsIGxlZnRQcmVzZW5jZSlcbiAgICAgIGlmKGN1cnJlbnRQcmVzZW5jZS5tZXRhcy5sZW5ndGggPT09IDApe1xuICAgICAgICBkZWxldGUgc3RhdGVba2V5XVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHN0YXRlXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJlc2VuY2VzLCB3aXRoIHNlbGVjdGVkIG1ldGFkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJlc2VuY2VzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNob29zZXJcbiAgICpcbiAgICogQHJldHVybnMge1ByZXNlbmNlfVxuICAgKi9cbiAgc3RhdGljIGxpc3QocHJlc2VuY2VzLCBjaG9vc2VyKXtcbiAgICBpZighY2hvb3Nlcil7IGNob29zZXIgPSBmdW5jdGlvbiAoa2V5LCBwcmVzKXsgcmV0dXJuIHByZXMgfSB9XG5cbiAgICByZXR1cm4gdGhpcy5tYXAocHJlc2VuY2VzLCAoa2V5LCBwcmVzZW5jZSkgPT4ge1xuICAgICAgcmV0dXJuIGNob29zZXIoa2V5LCBwcmVzZW5jZSlcbiAgICB9KVxuICB9XG5cbiAgLy8gcHJpdmF0ZVxuXG4gIHN0YXRpYyBtYXAob2JqLCBmdW5jKXtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKS5tYXAoa2V5ID0+IGZ1bmMoa2V5LCBvYmpba2V5XSkpXG4gIH1cblxuICBzdGF0aWMgY2xvbmUob2JqKXsgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSkgfVxufVxuIiwgIi8qIFRoZSBkZWZhdWx0IHNlcmlhbGl6ZXIgZm9yIGVuY29kaW5nIGFuZCBkZWNvZGluZyBtZXNzYWdlcyAqL1xuaW1wb3J0IHtcbiAgQ0hBTk5FTF9FVkVOVFNcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuZXhwb3J0IGRlZmF1bHQge1xuICBIRUFERVJfTEVOR1RIOiAxLFxuICBNRVRBX0xFTkdUSDogNCxcbiAgS0lORFM6IHtwdXNoOiAwLCByZXBseTogMSwgYnJvYWRjYXN0OiAyfSxcblxuICBlbmNvZGUobXNnLCBjYWxsYmFjayl7XG4gICAgaWYobXNnLnBheWxvYWQuY29uc3RydWN0b3IgPT09IEFycmF5QnVmZmVyKXtcbiAgICAgIHJldHVybiBjYWxsYmFjayh0aGlzLmJpbmFyeUVuY29kZShtc2cpKVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcGF5bG9hZCA9IFttc2cuam9pbl9yZWYsIG1zZy5yZWYsIG1zZy50b3BpYywgbXNnLmV2ZW50LCBtc2cucGF5bG9hZF1cbiAgICAgIHJldHVybiBjYWxsYmFjayhKU09OLnN0cmluZ2lmeShwYXlsb2FkKSlcbiAgICB9XG4gIH0sXG5cbiAgZGVjb2RlKHJhd1BheWxvYWQsIGNhbGxiYWNrKXtcbiAgICBpZihyYXdQYXlsb2FkLmNvbnN0cnVjdG9yID09PSBBcnJheUJ1ZmZlcil7XG4gICAgICByZXR1cm4gY2FsbGJhY2sodGhpcy5iaW5hcnlEZWNvZGUocmF3UGF5bG9hZCkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBbam9pbl9yZWYsIHJlZiwgdG9waWMsIGV2ZW50LCBwYXlsb2FkXSA9IEpTT04ucGFyc2UocmF3UGF5bG9hZClcbiAgICAgIHJldHVybiBjYWxsYmFjayh7am9pbl9yZWYsIHJlZiwgdG9waWMsIGV2ZW50LCBwYXlsb2FkfSlcbiAgICB9XG4gIH0sXG5cbiAgLy8gcHJpdmF0ZVxuXG4gIGJpbmFyeUVuY29kZShtZXNzYWdlKXtcbiAgICBsZXQge2pvaW5fcmVmLCByZWYsIGV2ZW50LCB0b3BpYywgcGF5bG9hZH0gPSBtZXNzYWdlXG4gICAgbGV0IG1ldGFMZW5ndGggPSB0aGlzLk1FVEFfTEVOR1RIICsgam9pbl9yZWYubGVuZ3RoICsgcmVmLmxlbmd0aCArIHRvcGljLmxlbmd0aCArIGV2ZW50Lmxlbmd0aFxuICAgIGxldCBoZWFkZXIgPSBuZXcgQXJyYXlCdWZmZXIodGhpcy5IRUFERVJfTEVOR1RIICsgbWV0YUxlbmd0aClcbiAgICBsZXQgdmlldyA9IG5ldyBEYXRhVmlldyhoZWFkZXIpXG4gICAgbGV0IG9mZnNldCA9IDBcblxuICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIHRoaXMuS0lORFMucHVzaCkgLy8ga2luZFxuICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGpvaW5fcmVmLmxlbmd0aClcbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCByZWYubGVuZ3RoKVxuICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIHRvcGljLmxlbmd0aClcbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBldmVudC5sZW5ndGgpXG4gICAgQXJyYXkuZnJvbShqb2luX3JlZiwgY2hhciA9PiB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBjaGFyLmNoYXJDb2RlQXQoMCkpKVxuICAgIEFycmF5LmZyb20ocmVmLCBjaGFyID0+IHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGNoYXIuY2hhckNvZGVBdCgwKSkpXG4gICAgQXJyYXkuZnJvbSh0b3BpYywgY2hhciA9PiB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBjaGFyLmNoYXJDb2RlQXQoMCkpKVxuICAgIEFycmF5LmZyb20oZXZlbnQsIGNoYXIgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSlcblxuICAgIHZhciBjb21iaW5lZCA9IG5ldyBVaW50OEFycmF5KGhlYWRlci5ieXRlTGVuZ3RoICsgcGF5bG9hZC5ieXRlTGVuZ3RoKVxuICAgIGNvbWJpbmVkLnNldChuZXcgVWludDhBcnJheShoZWFkZXIpLCAwKVxuICAgIGNvbWJpbmVkLnNldChuZXcgVWludDhBcnJheShwYXlsb2FkKSwgaGVhZGVyLmJ5dGVMZW5ndGgpXG5cbiAgICByZXR1cm4gY29tYmluZWQuYnVmZmVyXG4gIH0sXG5cbiAgYmluYXJ5RGVjb2RlKGJ1ZmZlcil7XG4gICAgbGV0IHZpZXcgPSBuZXcgRGF0YVZpZXcoYnVmZmVyKVxuICAgIGxldCBraW5kID0gdmlldy5nZXRVaW50OCgwKVxuICAgIGxldCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKClcbiAgICBzd2l0Y2goa2luZCl7XG4gICAgICBjYXNlIHRoaXMuS0lORFMucHVzaDogcmV0dXJuIHRoaXMuZGVjb2RlUHVzaChidWZmZXIsIHZpZXcsIGRlY29kZXIpXG4gICAgICBjYXNlIHRoaXMuS0lORFMucmVwbHk6IHJldHVybiB0aGlzLmRlY29kZVJlcGx5KGJ1ZmZlciwgdmlldywgZGVjb2RlcilcbiAgICAgIGNhc2UgdGhpcy5LSU5EUy5icm9hZGNhc3Q6IHJldHVybiB0aGlzLmRlY29kZUJyb2FkY2FzdChidWZmZXIsIHZpZXcsIGRlY29kZXIpXG4gICAgfVxuICB9LFxuXG4gIGRlY29kZVB1c2goYnVmZmVyLCB2aWV3LCBkZWNvZGVyKXtcbiAgICBsZXQgam9pblJlZlNpemUgPSB2aWV3LmdldFVpbnQ4KDEpXG4gICAgbGV0IHRvcGljU2l6ZSA9IHZpZXcuZ2V0VWludDgoMilcbiAgICBsZXQgZXZlbnRTaXplID0gdmlldy5nZXRVaW50OCgzKVxuICAgIGxldCBvZmZzZXQgPSB0aGlzLkhFQURFUl9MRU5HVEggKyB0aGlzLk1FVEFfTEVOR1RIIC0gMSAvLyBwdXNoZXMgaGF2ZSBubyByZWZcbiAgICBsZXQgam9pblJlZiA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGpvaW5SZWZTaXplKSlcbiAgICBvZmZzZXQgPSBvZmZzZXQgKyBqb2luUmVmU2l6ZVxuICAgIGxldCB0b3BpYyA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIHRvcGljU2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgdG9waWNTaXplXG4gICAgbGV0IGV2ZW50ID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgZXZlbnRTaXplKSlcbiAgICBvZmZzZXQgPSBvZmZzZXQgKyBldmVudFNpemVcbiAgICBsZXQgZGF0YSA9IGJ1ZmZlci5zbGljZShvZmZzZXQsIGJ1ZmZlci5ieXRlTGVuZ3RoKVxuICAgIHJldHVybiB7am9pbl9yZWY6IGpvaW5SZWYsIHJlZjogbnVsbCwgdG9waWM6IHRvcGljLCBldmVudDogZXZlbnQsIHBheWxvYWQ6IGRhdGF9XG4gIH0sXG5cbiAgZGVjb2RlUmVwbHkoYnVmZmVyLCB2aWV3LCBkZWNvZGVyKXtcbiAgICBsZXQgam9pblJlZlNpemUgPSB2aWV3LmdldFVpbnQ4KDEpXG4gICAgbGV0IHJlZlNpemUgPSB2aWV3LmdldFVpbnQ4KDIpXG4gICAgbGV0IHRvcGljU2l6ZSA9IHZpZXcuZ2V0VWludDgoMylcbiAgICBsZXQgZXZlbnRTaXplID0gdmlldy5nZXRVaW50OCg0KVxuICAgIGxldCBvZmZzZXQgPSB0aGlzLkhFQURFUl9MRU5HVEggKyB0aGlzLk1FVEFfTEVOR1RIXG4gICAgbGV0IGpvaW5SZWYgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBqb2luUmVmU2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgam9pblJlZlNpemVcbiAgICBsZXQgcmVmID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgcmVmU2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgcmVmU2l6ZVxuICAgIGxldCB0b3BpYyA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIHRvcGljU2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgdG9waWNTaXplXG4gICAgbGV0IGV2ZW50ID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgZXZlbnRTaXplKSlcbiAgICBvZmZzZXQgPSBvZmZzZXQgKyBldmVudFNpemVcbiAgICBsZXQgZGF0YSA9IGJ1ZmZlci5zbGljZShvZmZzZXQsIGJ1ZmZlci5ieXRlTGVuZ3RoKVxuICAgIGxldCBwYXlsb2FkID0ge3N0YXR1czogZXZlbnQsIHJlc3BvbnNlOiBkYXRhfVxuICAgIHJldHVybiB7am9pbl9yZWY6IGpvaW5SZWYsIHJlZjogcmVmLCB0b3BpYzogdG9waWMsIGV2ZW50OiBDSEFOTkVMX0VWRU5UUy5yZXBseSwgcGF5bG9hZDogcGF5bG9hZH1cbiAgfSxcblxuICBkZWNvZGVCcm9hZGNhc3QoYnVmZmVyLCB2aWV3LCBkZWNvZGVyKXtcbiAgICBsZXQgdG9waWNTaXplID0gdmlldy5nZXRVaW50OCgxKVxuICAgIGxldCBldmVudFNpemUgPSB2aWV3LmdldFVpbnQ4KDIpXG4gICAgbGV0IG9mZnNldCA9IHRoaXMuSEVBREVSX0xFTkdUSCArIDJcbiAgICBsZXQgdG9waWMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyB0b3BpY1NpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZVxuICAgIGxldCBldmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGV2ZW50U2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgZXZlbnRTaXplXG4gICAgbGV0IGRhdGEgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcblxuICAgIHJldHVybiB7am9pbl9yZWY6IG51bGwsIHJlZjogbnVsbCwgdG9waWM6IHRvcGljLCBldmVudDogZXZlbnQsIHBheWxvYWQ6IGRhdGF9XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBnbG9iYWwsXG4gIHBoeFdpbmRvdyxcbiAgQ0hBTk5FTF9FVkVOVFMsXG4gIERFRkFVTFRfVElNRU9VVCxcbiAgREVGQVVMVF9WU04sXG4gIFNPQ0tFVF9TVEFURVMsXG4gIFRSQU5TUE9SVFMsXG4gIFdTX0NMT1NFX05PUk1BTFxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQge1xuICBjbG9zdXJlXG59IGZyb20gXCIuL3V0aWxzXCJcblxuaW1wb3J0IEFqYXggZnJvbSBcIi4vYWpheFwiXG5pbXBvcnQgQ2hhbm5lbCBmcm9tIFwiLi9jaGFubmVsXCJcbmltcG9ydCBMb25nUG9sbCBmcm9tIFwiLi9sb25ncG9sbFwiXG5pbXBvcnQgU2VyaWFsaXplciBmcm9tIFwiLi9zZXJpYWxpemVyXCJcbmltcG9ydCBUaW1lciBmcm9tIFwiLi90aW1lclwiXG5cbi8qKiBJbml0aWFsaXplcyB0aGUgU29ja2V0ICpcbiAqXG4gKiBGb3IgSUU4IHN1cHBvcnQgdXNlIGFuIEVTNS1zaGltIChodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW0pXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuZFBvaW50IC0gVGhlIHN0cmluZyBXZWJTb2NrZXQgZW5kcG9pbnQsIGllLCBgXCJ3czovL2V4YW1wbGUuY29tL3NvY2tldFwiYCxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgXCJ3c3M6Ly9leGFtcGxlLmNvbVwiYFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcIi9zb2NrZXRcImAgKGluaGVyaXRlZCBob3N0ICYgcHJvdG9jb2wpXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHNdIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMudHJhbnNwb3J0XSAtIFRoZSBXZWJzb2NrZXQgVHJhbnNwb3J0LCBmb3IgZXhhbXBsZSBXZWJTb2NrZXQgb3IgUGhvZW5peC5Mb25nUG9sbC5cbiAqXG4gKiBEZWZhdWx0cyB0byBXZWJTb2NrZXQgd2l0aCBhdXRvbWF0aWMgTG9uZ1BvbGwgZmFsbGJhY2suXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5lbmNvZGVdIC0gVGhlIGZ1bmN0aW9uIHRvIGVuY29kZSBvdXRnb2luZyBtZXNzYWdlcy5cbiAqXG4gKiBEZWZhdWx0cyB0byBKU09OIGVuY29kZXIuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMuZGVjb2RlXSAtIFRoZSBmdW5jdGlvbiB0byBkZWNvZGUgaW5jb21pbmcgbWVzc2FnZXMuXG4gKlxuICogRGVmYXVsdHMgdG8gSlNPTjpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAocGF5bG9hZCwgY2FsbGJhY2spID0+IGNhbGxiYWNrKEpTT04ucGFyc2UocGF5bG9hZCkpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMudGltZW91dF0gLSBUaGUgZGVmYXVsdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byB0cmlnZ2VyIHB1c2ggdGltZW91dHMuXG4gKlxuICogRGVmYXVsdHMgYERFRkFVTFRfVElNRU9VVGBcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5oZWFydGJlYXRJbnRlcnZhbE1zXSAtIFRoZSBtaWxsaXNlYyBpbnRlcnZhbCB0byBzZW5kIGEgaGVhcnRiZWF0IG1lc3NhZ2VcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5yZWNvbm5lY3RBZnRlck1zXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG1pbGxzZWNcbiAqIHNvY2tldCByZWNvbm5lY3QgaW50ZXJ2YWwuXG4gKlxuICogRGVmYXVsdHMgdG8gc3RlcHBlZCBiYWNrb2ZmIG9mOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGZ1bmN0aW9uKHRyaWVzKXtcbiAqICAgcmV0dXJuIFsxMCwgNTAsIDEwMCwgMTUwLCAyMDAsIDI1MCwgNTAwLCAxMDAwLCAyMDAwXVt0cmllcyAtIDFdIHx8IDUwMDBcbiAqIH1cbiAqIGBgYGBcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMucmVqb2luQWZ0ZXJNc10gLSBUaGUgb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBtaWxsc2VjXG4gKiByZWpvaW4gaW50ZXJ2YWwgZm9yIGluZGl2aWR1YWwgY2hhbm5lbHMuXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogZnVuY3Rpb24odHJpZXMpe1xuICogICByZXR1cm4gWzEwMDAsIDIwMDAsIDUwMDBdW3RyaWVzIC0gMV0gfHwgMTAwMDBcbiAqIH1cbiAqIGBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5sb2dnZXJdIC0gVGhlIG9wdGlvbmFsIGZ1bmN0aW9uIGZvciBzcGVjaWFsaXplZCBsb2dnaW5nLCBpZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBmdW5jdGlvbihraW5kLCBtc2csIGRhdGEpIHtcbiAqICAgY29uc29sZS5sb2coYCR7a2luZH06ICR7bXNnfWAsIGRhdGEpXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMubG9uZ3BvbGxlclRpbWVvdXRdIC0gVGhlIG1heGltdW0gdGltZW91dCBvZiBhIGxvbmcgcG9sbCBBSkFYIHJlcXVlc3QuXG4gKlxuICogRGVmYXVsdHMgdG8gMjBzIChkb3VibGUgdGhlIHNlcnZlciBsb25nIHBvbGwgdGltZXIpLlxuICpcbiAqIEBwYXJhbSB7KE9iamVjdHxmdW5jdGlvbil9IFtvcHRzLnBhcmFtc10gLSBUaGUgb3B0aW9uYWwgcGFyYW1zIHRvIHBhc3Mgd2hlbiBjb25uZWN0aW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuYmluYXJ5VHlwZV0gLSBUaGUgYmluYXJ5IHR5cGUgdG8gdXNlIGZvciBiaW5hcnkgV2ViU29ja2V0IGZyYW1lcy5cbiAqXG4gKiBEZWZhdWx0cyB0byBcImFycmF5YnVmZmVyXCJcbiAqXG4gKiBAcGFyYW0ge3Zzbn0gW29wdHMudnNuXSAtIFRoZSBzZXJpYWxpemVyJ3MgcHJvdG9jb2wgdmVyc2lvbiB0byBzZW5kIG9uIGNvbm5lY3QuXG4gKlxuICogRGVmYXVsdHMgdG8gREVGQVVMVF9WU04uXG4qL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU29ja2V0IHtcbiAgY29uc3RydWN0b3IoZW5kUG9pbnQsIG9wdHMgPSB7fSl7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcyA9IHtvcGVuOiBbXSwgY2xvc2U6IFtdLCBlcnJvcjogW10sIG1lc3NhZ2U6IFtdfVxuICAgIHRoaXMuY2hhbm5lbHMgPSBbXVxuICAgIHRoaXMuc2VuZEJ1ZmZlciA9IFtdXG4gICAgdGhpcy5yZWYgPSAwXG4gICAgdGhpcy50aW1lb3V0ID0gb3B0cy50aW1lb3V0IHx8IERFRkFVTFRfVElNRU9VVFxuICAgIHRoaXMudHJhbnNwb3J0ID0gb3B0cy50cmFuc3BvcnQgfHwgZ2xvYmFsLldlYlNvY2tldCB8fCBMb25nUG9sbFxuICAgIHRoaXMuZXN0YWJsaXNoZWRDb25uZWN0aW9ucyA9IDBcbiAgICB0aGlzLmRlZmF1bHRFbmNvZGVyID0gU2VyaWFsaXplci5lbmNvZGUuYmluZChTZXJpYWxpemVyKVxuICAgIHRoaXMuZGVmYXVsdERlY29kZXIgPSBTZXJpYWxpemVyLmRlY29kZS5iaW5kKFNlcmlhbGl6ZXIpXG4gICAgdGhpcy5jbG9zZVdhc0NsZWFuID0gZmFsc2VcbiAgICB0aGlzLmJpbmFyeVR5cGUgPSBvcHRzLmJpbmFyeVR5cGUgfHwgXCJhcnJheWJ1ZmZlclwiXG4gICAgdGhpcy5jb25uZWN0Q2xvY2sgPSAxXG4gICAgaWYodGhpcy50cmFuc3BvcnQgIT09IExvbmdQb2xsKXtcbiAgICAgIHRoaXMuZW5jb2RlID0gb3B0cy5lbmNvZGUgfHwgdGhpcy5kZWZhdWx0RW5jb2RlclxuICAgICAgdGhpcy5kZWNvZGUgPSBvcHRzLmRlY29kZSB8fCB0aGlzLmRlZmF1bHREZWNvZGVyXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW5jb2RlID0gdGhpcy5kZWZhdWx0RW5jb2RlclxuICAgICAgdGhpcy5kZWNvZGUgPSB0aGlzLmRlZmF1bHREZWNvZGVyXG4gICAgfVxuICAgIGxldCBhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID0gbnVsbFxuICAgIGlmKHBoeFdpbmRvdyAmJiBwaHhXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcil7XG4gICAgICBwaHhXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIF9lID0+IHtcbiAgICAgICAgaWYodGhpcy5jb25uKXtcbiAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKVxuICAgICAgICAgIGF3YWl0aW5nQ29ubmVjdGlvbk9uUGFnZVNob3cgPSB0aGlzLmNvbm5lY3RDbG9ja1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgcGh4V2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlc2hvd1wiLCBfZSA9PiB7XG4gICAgICAgIGlmKGF3YWl0aW5nQ29ubmVjdGlvbk9uUGFnZVNob3cgPT09IHRoaXMuY29ubmVjdENsb2NrKXtcbiAgICAgICAgICBhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID0gbnVsbFxuICAgICAgICAgIHRoaXMuY29ubmVjdCgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcyA9IG9wdHMuaGVhcnRiZWF0SW50ZXJ2YWxNcyB8fCAzMDAwMFxuICAgIHRoaXMucmVqb2luQWZ0ZXJNcyA9ICh0cmllcykgPT4ge1xuICAgICAgaWYob3B0cy5yZWpvaW5BZnRlck1zKXtcbiAgICAgICAgcmV0dXJuIG9wdHMucmVqb2luQWZ0ZXJNcyh0cmllcylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbMTAwMCwgMjAwMCwgNTAwMF1bdHJpZXMgLSAxXSB8fCAxMDAwMFxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlY29ubmVjdEFmdGVyTXMgPSAodHJpZXMpID0+IHtcbiAgICAgIGlmKG9wdHMucmVjb25uZWN0QWZ0ZXJNcyl7XG4gICAgICAgIHJldHVybiBvcHRzLnJlY29ubmVjdEFmdGVyTXModHJpZXMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gWzEwLCA1MCwgMTAwLCAxNTAsIDIwMCwgMjUwLCA1MDAsIDEwMDAsIDIwMDBdW3RyaWVzIC0gMV0gfHwgNTAwMFxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxvZ2dlciA9IG9wdHMubG9nZ2VyIHx8IG51bGxcbiAgICB0aGlzLmxvbmdwb2xsZXJUaW1lb3V0ID0gb3B0cy5sb25ncG9sbGVyVGltZW91dCB8fCAyMDAwMFxuICAgIHRoaXMucGFyYW1zID0gY2xvc3VyZShvcHRzLnBhcmFtcyB8fCB7fSlcbiAgICB0aGlzLmVuZFBvaW50ID0gYCR7ZW5kUG9pbnR9LyR7VFJBTlNQT1JUUy53ZWJzb2NrZXR9YFxuICAgIHRoaXMudnNuID0gb3B0cy52c24gfHwgREVGQVVMVF9WU05cbiAgICB0aGlzLmhlYXJ0YmVhdFRpbWVyID0gbnVsbFxuICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgIHRoaXMudGVhcmRvd24oKCkgPT4gdGhpcy5jb25uZWN0KCkpXG4gICAgfSwgdGhpcy5yZWNvbm5lY3RBZnRlck1zKVxuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIGFuZCByZXBsYWNlcyB0aGUgYWN0aXZlIHRyYW5zcG9ydFxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBuZXdUcmFuc3BvcnQgLSBUaGUgbmV3IHRyYW5zcG9ydCBjbGFzcyB0byBpbnN0YW50aWF0ZVxuICAgKlxuICAgKi9cbiAgcmVwbGFjZVRyYW5zcG9ydChuZXdUcmFuc3BvcnQpe1xuICAgIHRoaXMuZGlzY29ubmVjdCgpXG4gICAgdGhpcy50cmFuc3BvcnQgPSBuZXdUcmFuc3BvcnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzb2NrZXQgcHJvdG9jb2xcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHByb3RvY29sKCl7IHJldHVybiBsb2NhdGlvbi5wcm90b2NvbC5tYXRjaCgvXmh0dHBzLykgPyBcIndzc1wiIDogXCJ3c1wiIH1cblxuICAvKipcbiAgICogVGhlIGZ1bGx5IHF1YWxpZmVkIHNvY2tldCB1cmxcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGVuZFBvaW50VVJMKCl7XG4gICAgbGV0IHVyaSA9IEFqYXguYXBwZW5kUGFyYW1zKFxuICAgICAgQWpheC5hcHBlbmRQYXJhbXModGhpcy5lbmRQb2ludCwgdGhpcy5wYXJhbXMoKSksIHt2c246IHRoaXMudnNufSlcbiAgICBpZih1cmkuY2hhckF0KDApICE9PSBcIi9cIil7IHJldHVybiB1cmkgfVxuICAgIGlmKHVyaS5jaGFyQXQoMSkgPT09IFwiL1wiKXsgcmV0dXJuIGAke3RoaXMucHJvdG9jb2woKX06JHt1cml9YCB9XG5cbiAgICByZXR1cm4gYCR7dGhpcy5wcm90b2NvbCgpfTovLyR7bG9jYXRpb24uaG9zdH0ke3VyaX1gXG4gIH1cblxuICAvKipcbiAgICogRGlzY29ubmVjdHMgdGhlIHNvY2tldFxuICAgKlxuICAgKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Nsb3NlRXZlbnQjU3RhdHVzX2NvZGVzIGZvciB2YWxpZCBzdGF0dXMgY29kZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gT3B0aW9uYWwgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIGFmdGVyIHNvY2tldCBpcyBkaXNjb25uZWN0ZWQuXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gY29kZSAtIEEgc3RhdHVzIGNvZGUgZm9yIGRpc2Nvbm5lY3Rpb24gKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIEEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIHRvIGRpc2Nvbm5lY3QuIChPcHRpb25hbClcbiAgICovXG4gIGRpc2Nvbm5lY3QoY2FsbGJhY2ssIGNvZGUsIHJlYXNvbil7XG4gICAgdGhpcy5jb25uZWN0Q2xvY2srK1xuICAgIHRoaXMuY2xvc2VXYXNDbGVhbiA9IHRydWVcbiAgICB0aGlzLnJlY29ubmVjdFRpbWVyLnJlc2V0KClcbiAgICB0aGlzLnRlYXJkb3duKGNhbGxiYWNrLCBjb2RlLCByZWFzb24pXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIFRoZSBwYXJhbXMgdG8gc2VuZCB3aGVuIGNvbm5lY3RpbmcsIGZvciBleGFtcGxlIGB7dXNlcl9pZDogdXNlclRva2VufWBcbiAgICpcbiAgICogUGFzc2luZyBwYXJhbXMgdG8gY29ubmVjdCBpcyBkZXByZWNhdGVkOyBwYXNzIHRoZW0gaW4gdGhlIFNvY2tldCBjb25zdHJ1Y3RvciBpbnN0ZWFkOlxuICAgKiBgbmV3IFNvY2tldChcIi9zb2NrZXRcIiwge3BhcmFtczoge3VzZXJfaWQ6IHVzZXJUb2tlbn19KWAuXG4gICAqL1xuICBjb25uZWN0KHBhcmFtcyl7XG4gICAgdGhpcy5jb25uZWN0Q2xvY2srK1xuICAgIGlmKHBhcmFtcyl7XG4gICAgICBjb25zb2xlICYmIGNvbnNvbGUubG9nKFwicGFzc2luZyBwYXJhbXMgdG8gY29ubmVjdCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkIHBhc3MgOnBhcmFtcyB0byB0aGUgU29ja2V0IGNvbnN0cnVjdG9yXCIpXG4gICAgICB0aGlzLnBhcmFtcyA9IGNsb3N1cmUocGFyYW1zKVxuICAgIH1cbiAgICBpZih0aGlzLmNvbm4peyByZXR1cm4gfVxuICAgIHRoaXMuY2xvc2VXYXNDbGVhbiA9IGZhbHNlXG4gICAgdGhpcy5jb25uID0gbmV3IHRoaXMudHJhbnNwb3J0KHRoaXMuZW5kUG9pbnRVUkwoKSlcbiAgICB0aGlzLmNvbm4uYmluYXJ5VHlwZSA9IHRoaXMuYmluYXJ5VHlwZVxuICAgIHRoaXMuY29ubi50aW1lb3V0ID0gdGhpcy5sb25ncG9sbGVyVGltZW91dFxuICAgIHRoaXMuY29ubi5vbm9wZW4gPSAoKSA9PiB0aGlzLm9uQ29ubk9wZW4oKVxuICAgIHRoaXMuY29ubi5vbmVycm9yID0gZXJyb3IgPT4gdGhpcy5vbkNvbm5FcnJvcihlcnJvcilcbiAgICB0aGlzLmNvbm4ub25tZXNzYWdlID0gZXZlbnQgPT4gdGhpcy5vbkNvbm5NZXNzYWdlKGV2ZW50KVxuICAgIHRoaXMuY29ubi5vbmNsb3NlID0gZXZlbnQgPT4gdGhpcy5vbkNvbm5DbG9zZShldmVudClcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIHRoZSBtZXNzYWdlLiBPdmVycmlkZSBgdGhpcy5sb2dnZXJgIGZvciBzcGVjaWFsaXplZCBsb2dnaW5nLiBub29wcyBieSBkZWZhdWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBraW5kXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtc2dcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICovXG4gIGxvZyhraW5kLCBtc2csIGRhdGEpeyB0aGlzLmxvZ2dlcihraW5kLCBtc2csIGRhdGEpIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGEgbG9nZ2VyIGhhcyBiZWVuIHNldCBvbiB0aGlzIHNvY2tldC5cbiAgICovXG4gIGhhc0xvZ2dlcigpeyByZXR1cm4gdGhpcy5sb2dnZXIgIT09IG51bGwgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgY2FsbGJhY2tzIGZvciBjb25uZWN0aW9uIG9wZW4gZXZlbnRzXG4gICAqXG4gICAqIEBleGFtcGxlIHNvY2tldC5vbk9wZW4oZnVuY3Rpb24oKXsgY29uc29sZS5pbmZvKFwidGhlIHNvY2tldCB3YXMgb3BlbmVkXCIpIH0pXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbk9wZW4oY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3Mub3Blbi5wdXNoKFtyZWYsIGNhbGxiYWNrXSlcbiAgICByZXR1cm4gcmVmXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGNhbGxiYWNrcyBmb3IgY29ubmVjdGlvbiBjbG9zZSBldmVudHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uQ2xvc2UoY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuY2xvc2UucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBjYWxsYmFja3MgZm9yIGNvbm5lY3Rpb24gZXJyb3IgZXZlbnRzXG4gICAqXG4gICAqIEBleGFtcGxlIHNvY2tldC5vbkVycm9yKGZ1bmN0aW9uKGVycm9yKXsgYWxlcnQoXCJBbiBlcnJvciBvY2N1cnJlZFwiKSB9KVxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25FcnJvcihjYWxsYmFjayl7XG4gICAgbGV0IHJlZiA9IHRoaXMubWFrZVJlZigpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5lcnJvci5wdXNoKFtyZWYsIGNhbGxiYWNrXSlcbiAgICByZXR1cm4gcmVmXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGNhbGxiYWNrcyBmb3IgY29ubmVjdGlvbiBtZXNzYWdlIGV2ZW50c1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25NZXNzYWdlKGNhbGxiYWNrKXtcbiAgICBsZXQgcmVmID0gdGhpcy5tYWtlUmVmKClcbiAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm1lc3NhZ2UucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBvbkNvbm5PcGVuKCl7XG4gICAgaWYodGhpcy5oYXNMb2dnZXIoKSkgdGhpcy5sb2coXCJ0cmFuc3BvcnRcIiwgYGNvbm5lY3RlZCB0byAke3RoaXMuZW5kUG9pbnRVUkwoKX1gKVxuICAgIHRoaXMuY2xvc2VXYXNDbGVhbiA9IGZhbHNlXG4gICAgdGhpcy5lc3RhYmxpc2hlZENvbm5lY3Rpb25zKytcbiAgICB0aGlzLmZsdXNoU2VuZEJ1ZmZlcigpXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lci5yZXNldCgpXG4gICAgdGhpcy5yZXNldEhlYXJ0YmVhdCgpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5vcGVuLmZvckVhY2goKFssIGNhbGxiYWNrXSkgPT4gY2FsbGJhY2soKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBoZWFydGJlYXRUaW1lb3V0KCl7XG4gICAgaWYodGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmKXtcbiAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpeyB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImhlYXJ0YmVhdCB0aW1lb3V0LiBBdHRlbXB0aW5nIHRvIHJlLWVzdGFibGlzaCBjb25uZWN0aW9uXCIpIH1cbiAgICAgIHRoaXMuYWJub3JtYWxDbG9zZShcImhlYXJ0YmVhdCB0aW1lb3V0XCIpXG4gICAgfVxuICB9XG5cbiAgcmVzZXRIZWFydGJlYXQoKXtcbiAgICBpZih0aGlzLmNvbm4gJiYgdGhpcy5jb25uLnNraXBIZWFydGJlYXQpeyByZXR1cm4gfVxuICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICBjbGVhclRpbWVvdXQodGhpcy5oZWFydGJlYXRUaW1lcilcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VuZEhlYXJ0YmVhdCgpLCB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMpXG4gIH1cblxuICB0ZWFyZG93bihjYWxsYmFjaywgY29kZSwgcmVhc29uKXtcbiAgICBpZighdGhpcy5jb25uKXtcbiAgICAgIHJldHVybiBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gICAgfVxuXG4gICAgdGhpcy53YWl0Rm9yQnVmZmVyRG9uZSgoKSA9PiB7XG4gICAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgICBpZihjb2RlKXsgdGhpcy5jb25uLmNsb3NlKGNvZGUsIHJlYXNvbiB8fCBcIlwiKSB9IGVsc2UgeyB0aGlzLmNvbm4uY2xvc2UoKSB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMud2FpdEZvclNvY2tldENsb3NlZCgoKSA9PiB7XG4gICAgICAgIGlmKHRoaXMuY29ubil7XG4gICAgICAgICAgdGhpcy5jb25uLm9uY2xvc2UgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgICAgICAgdGhpcy5jb25uID0gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgd2FpdEZvckJ1ZmZlckRvbmUoY2FsbGJhY2ssIHRyaWVzID0gMSl7XG4gICAgaWYodHJpZXMgPT09IDUgfHwgIXRoaXMuY29ubiB8fCAhdGhpcy5jb25uLmJ1ZmZlcmVkQW1vdW50KXtcbiAgICAgIGNhbGxiYWNrKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy53YWl0Rm9yQnVmZmVyRG9uZShjYWxsYmFjaywgdHJpZXMgKyAxKVxuICAgIH0sIDE1MCAqIHRyaWVzKVxuICB9XG5cbiAgd2FpdEZvclNvY2tldENsb3NlZChjYWxsYmFjaywgdHJpZXMgPSAxKXtcbiAgICBpZih0cmllcyA9PT0gNSB8fCAhdGhpcy5jb25uIHx8IHRoaXMuY29ubi5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLmNsb3NlZCl7XG4gICAgICBjYWxsYmFjaygpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMud2FpdEZvclNvY2tldENsb3NlZChjYWxsYmFjaywgdHJpZXMgKyAxKVxuICAgIH0sIDE1MCAqIHRyaWVzKVxuICB9XG5cbiAgb25Db25uQ2xvc2UoZXZlbnQpe1xuICAgIGxldCBjbG9zZUNvZGUgPSBldmVudCAmJiBldmVudC5jb2RlXG4gICAgaWYodGhpcy5oYXNMb2dnZXIoKSkgdGhpcy5sb2coXCJ0cmFuc3BvcnRcIiwgXCJjbG9zZVwiLCBldmVudClcbiAgICB0aGlzLnRyaWdnZXJDaGFuRXJyb3IoKVxuICAgIGNsZWFyVGltZW91dCh0aGlzLmhlYXJ0YmVhdFRpbWVyKVxuICAgIGlmKCF0aGlzLmNsb3NlV2FzQ2xlYW4gJiYgY2xvc2VDb2RlICE9PSAxMDAwKXtcbiAgICAgIHRoaXMucmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KClcbiAgICB9XG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5jbG9zZS5mb3JFYWNoKChbLCBjYWxsYmFja10pID0+IGNhbGxiYWNrKGV2ZW50KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25Db25uRXJyb3IoZXJyb3Ipe1xuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGVycm9yKVxuICAgIGxldCB0cmFuc3BvcnRCZWZvcmUgPSB0aGlzLnRyYW5zcG9ydFxuICAgIGxldCBlc3RhYmxpc2hlZEJlZm9yZSA9IHRoaXMuZXN0YWJsaXNoZWRDb25uZWN0aW9uc1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuZXJyb3IuZm9yRWFjaCgoWywgY2FsbGJhY2tdKSA9PiB7XG4gICAgICBjYWxsYmFjayhlcnJvciwgdHJhbnNwb3J0QmVmb3JlLCBlc3RhYmxpc2hlZEJlZm9yZSlcbiAgICB9KVxuICAgIGlmKHRyYW5zcG9ydEJlZm9yZSA9PT0gdGhpcy50cmFuc3BvcnQgfHwgZXN0YWJsaXNoZWRCZWZvcmUgPiAwKXtcbiAgICAgIHRoaXMudHJpZ2dlckNoYW5FcnJvcigpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmlnZ2VyQ2hhbkVycm9yKCl7XG4gICAgdGhpcy5jaGFubmVscy5mb3JFYWNoKGNoYW5uZWwgPT4ge1xuICAgICAgaWYoIShjaGFubmVsLmlzRXJyb3JlZCgpIHx8IGNoYW5uZWwuaXNMZWF2aW5nKCkgfHwgY2hhbm5lbC5pc0Nsb3NlZCgpKSl7XG4gICAgICAgIGNoYW5uZWwudHJpZ2dlcihDSEFOTkVMX0VWRU5UUy5lcnJvcilcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBjb25uZWN0aW9uU3RhdGUoKXtcbiAgICBzd2l0Y2godGhpcy5jb25uICYmIHRoaXMuY29ubi5yZWFkeVN0YXRlKXtcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5jb25uZWN0aW5nOiByZXR1cm4gXCJjb25uZWN0aW5nXCJcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5vcGVuOiByZXR1cm4gXCJvcGVuXCJcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5jbG9zaW5nOiByZXR1cm4gXCJjbG9zaW5nXCJcbiAgICAgIGRlZmF1bHQ6IHJldHVybiBcImNsb3NlZFwiXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNDb25uZWN0ZWQoKXsgcmV0dXJuIHRoaXMuY29ubmVjdGlvblN0YXRlKCkgPT09IFwib3BlblwiIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICpcbiAgICogQHBhcmFtIHtDaGFubmVsfVxuICAgKi9cbiAgcmVtb3ZlKGNoYW5uZWwpe1xuICAgIHRoaXMub2ZmKGNoYW5uZWwuc3RhdGVDaGFuZ2VSZWZzKVxuICAgIHRoaXMuY2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzLmZpbHRlcihjID0+IGMuam9pblJlZigpICE9PSBjaGFubmVsLmpvaW5SZWYoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGBvbk9wZW5gLCBgb25DbG9zZWAsIGBvbkVycm9yLGAgYW5kIGBvbk1lc3NhZ2VgIHJlZ2lzdHJhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7cmVmc30gLSBsaXN0IG9mIHJlZnMgcmV0dXJuZWQgYnkgY2FsbHMgdG9cbiAgICogICAgICAgICAgICAgICAgIGBvbk9wZW5gLCBgb25DbG9zZWAsIGBvbkVycm9yLGAgYW5kIGBvbk1lc3NhZ2VgXG4gICAqL1xuICBvZmYocmVmcyl7XG4gICAgZm9yKGxldCBrZXkgaW4gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcyl7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzW2tleV0gPSB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzW2tleV0uZmlsdGVyKChbcmVmXSkgPT4ge1xuICAgICAgICByZXR1cm4gcmVmcy5pbmRleE9mKHJlZikgPT09IC0xXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZXMgYSBuZXcgY2hhbm5lbCBmb3IgdGhlIGdpdmVuIHRvcGljXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b3BpY1xuICAgKiBAcGFyYW0ge09iamVjdH0gY2hhblBhcmFtcyAtIFBhcmFtZXRlcnMgZm9yIHRoZSBjaGFubmVsXG4gICAqIEByZXR1cm5zIHtDaGFubmVsfVxuICAgKi9cbiAgY2hhbm5lbCh0b3BpYywgY2hhblBhcmFtcyA9IHt9KXtcbiAgICBsZXQgY2hhbiA9IG5ldyBDaGFubmVsKHRvcGljLCBjaGFuUGFyYW1zLCB0aGlzKVxuICAgIHRoaXMuY2hhbm5lbHMucHVzaChjaGFuKVxuICAgIHJldHVybiBjaGFuXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICovXG4gIHB1c2goZGF0YSl7XG4gICAgaWYodGhpcy5oYXNMb2dnZXIoKSl7XG4gICAgICBsZXQge3RvcGljLCBldmVudCwgcGF5bG9hZCwgcmVmLCBqb2luX3JlZn0gPSBkYXRhXG4gICAgICB0aGlzLmxvZyhcInB1c2hcIiwgYCR7dG9waWN9ICR7ZXZlbnR9ICgke2pvaW5fcmVmfSwgJHtyZWZ9KWAsIHBheWxvYWQpXG4gICAgfVxuXG4gICAgaWYodGhpcy5pc0Nvbm5lY3RlZCgpKXtcbiAgICAgIHRoaXMuZW5jb2RlKGRhdGEsIHJlc3VsdCA9PiB0aGlzLmNvbm4uc2VuZChyZXN1bHQpKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbmRCdWZmZXIucHVzaCgoKSA9PiB0aGlzLmVuY29kZShkYXRhLCByZXN1bHQgPT4gdGhpcy5jb25uLnNlbmQocmVzdWx0KSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgbmV4dCBtZXNzYWdlIHJlZiwgYWNjb3VudGluZyBmb3Igb3ZlcmZsb3dzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBtYWtlUmVmKCl7XG4gICAgbGV0IG5ld1JlZiA9IHRoaXMucmVmICsgMVxuICAgIGlmKG5ld1JlZiA9PT0gdGhpcy5yZWYpeyB0aGlzLnJlZiA9IDAgfSBlbHNlIHsgdGhpcy5yZWYgPSBuZXdSZWYgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVmLnRvU3RyaW5nKClcbiAgfVxuXG4gIHNlbmRIZWFydGJlYXQoKXtcbiAgICBpZih0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYgJiYgIXRoaXMuaXNDb25uZWN0ZWQoKSl7IHJldHVybiB9XG4gICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gdGhpcy5tYWtlUmVmKClcbiAgICB0aGlzLnB1c2goe3RvcGljOiBcInBob2VuaXhcIiwgZXZlbnQ6IFwiaGVhcnRiZWF0XCIsIHBheWxvYWQ6IHt9LCByZWY6IHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZn0pXG4gICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5oZWFydGJlYXRUaW1lb3V0KCksIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcylcbiAgfVxuXG4gIGFibm9ybWFsQ2xvc2UocmVhc29uKXtcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgIGlmKHRoaXMuaXNDb25uZWN0ZWQoKSl7IHRoaXMuY29ubi5jbG9zZShXU19DTE9TRV9OT1JNQUwsIHJlYXNvbikgfVxuICB9XG5cbiAgZmx1c2hTZW5kQnVmZmVyKCl7XG4gICAgaWYodGhpcy5pc0Nvbm5lY3RlZCgpICYmIHRoaXMuc2VuZEJ1ZmZlci5sZW5ndGggPiAwKXtcbiAgICAgIHRoaXMuc2VuZEJ1ZmZlci5mb3JFYWNoKGNhbGxiYWNrID0+IGNhbGxiYWNrKCkpXG4gICAgICB0aGlzLnNlbmRCdWZmZXIgPSBbXVxuICAgIH1cbiAgfVxuXG4gIG9uQ29ubk1lc3NhZ2UocmF3TWVzc2FnZSl7XG4gICAgdGhpcy5kZWNvZGUocmF3TWVzc2FnZS5kYXRhLCBtc2cgPT4ge1xuICAgICAgbGV0IHt0b3BpYywgZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWZ9ID0gbXNnXG4gICAgICBpZihyZWYgJiYgcmVmID09PSB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYpe1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5oZWFydGJlYXRUaW1lcilcbiAgICAgICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gbnVsbFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VuZEhlYXJ0YmVhdCgpLCB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMpXG4gICAgICB9XG5cbiAgICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwicmVjZWl2ZVwiLCBgJHtwYXlsb2FkLnN0YXR1cyB8fCBcIlwifSAke3RvcGljfSAke2V2ZW50fSAke3JlZiAmJiBcIihcIiArIHJlZiArIFwiKVwiIHx8IFwiXCJ9YCwgcGF5bG9hZClcblxuICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHRoaXMuY2hhbm5lbHMubGVuZ3RoOyBpKyspe1xuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5jaGFubmVsc1tpXVxuICAgICAgICBpZighY2hhbm5lbC5pc01lbWJlcih0b3BpYywgZXZlbnQsIHBheWxvYWQsIGpvaW5fcmVmKSl7IGNvbnRpbnVlIH1cbiAgICAgICAgY2hhbm5lbC50cmlnZ2VyKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5fcmVmKVxuICAgICAgfVxuXG4gICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5tZXNzYWdlLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgbGV0IFssIGNhbGxiYWNrXSA9IHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MubWVzc2FnZVtpXVxuICAgICAgICBjYWxsYmFjayhtc2cpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGxlYXZlT3BlblRvcGljKHRvcGljKXtcbiAgICBsZXQgZHVwQ2hhbm5lbCA9IHRoaXMuY2hhbm5lbHMuZmluZChjID0+IGMudG9waWMgPT09IHRvcGljICYmIChjLmlzSm9pbmVkKCkgfHwgYy5pc0pvaW5pbmcoKSkpXG4gICAgaWYoZHVwQ2hhbm5lbCl7XG4gICAgICBpZih0aGlzLmhhc0xvZ2dlcigpKSB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBgbGVhdmluZyBkdXBsaWNhdGUgdG9waWMgXCIke3RvcGljfVwiYClcbiAgICAgIGR1cENoYW5uZWwubGVhdmUoKVxuICAgIH1cbiAgfVxufVxuIiwgIlxuZXhwb3J0IGNvbnN0IENPTlNFQ1VUSVZFX1JFTE9BRFMgPSBcImNvbnNlY3V0aXZlLXJlbG9hZHNcIlxuZXhwb3J0IGNvbnN0IE1BWF9SRUxPQURTID0gMTBcbmV4cG9ydCBjb25zdCBSRUxPQURfSklUVEVSX01JTiA9IDEwMDBcbmV4cG9ydCBjb25zdCBSRUxPQURfSklUVEVSX01BWCA9IDMwMDBcbmV4cG9ydCBjb25zdCBGQUlMU0FGRV9KSVRURVIgPSAzMDAwMFxuZXhwb3J0IGNvbnN0IFBIWF9FVkVOVF9DTEFTU0VTID0gW1xuICBcInBoeC1jbGljay1sb2FkaW5nXCIsIFwicGh4LWNoYW5nZS1sb2FkaW5nXCIsIFwicGh4LXN1Ym1pdC1sb2FkaW5nXCIsXG4gIFwicGh4LWtleWRvd24tbG9hZGluZ1wiLCBcInBoeC1rZXl1cC1sb2FkaW5nXCIsIFwicGh4LWJsdXItbG9hZGluZ1wiLCBcInBoeC1mb2N1cy1sb2FkaW5nXCJcbl1cbmV4cG9ydCBjb25zdCBQSFhfQ09NUE9ORU5UID0gXCJkYXRhLXBoeC1jb21wb25lbnRcIlxuZXhwb3J0IGNvbnN0IFBIWF9MSVZFX0xJTksgPSBcImRhdGEtcGh4LWxpbmtcIlxuZXhwb3J0IGNvbnN0IFBIWF9UUkFDS19TVEFUSUMgPSBcInRyYWNrLXN0YXRpY1wiXG5leHBvcnQgY29uc3QgUEhYX0xJTktfU1RBVEUgPSBcImRhdGEtcGh4LWxpbmstc3RhdGVcIlxuZXhwb3J0IGNvbnN0IFBIWF9SRUYgPSBcImRhdGEtcGh4LXJlZlwiXG5leHBvcnQgY29uc3QgUEhYX1JFRl9TUkMgPSBcImRhdGEtcGh4LXJlZi1zcmNcIlxuZXhwb3J0IGNvbnN0IFBIWF9UUkFDS19VUExPQURTID0gXCJ0cmFjay11cGxvYWRzXCJcbmV4cG9ydCBjb25zdCBQSFhfVVBMT0FEX1JFRiA9IFwiZGF0YS1waHgtdXBsb2FkLXJlZlwiXG5leHBvcnQgY29uc3QgUEhYX1BSRUZMSUdIVEVEX1JFRlMgPSBcImRhdGEtcGh4LXByZWZsaWdodGVkLXJlZnNcIlxuZXhwb3J0IGNvbnN0IFBIWF9ET05FX1JFRlMgPSBcImRhdGEtcGh4LWRvbmUtcmVmc1wiXG5leHBvcnQgY29uc3QgUEhYX0RST1BfVEFSR0VUID0gXCJkcm9wLXRhcmdldFwiXG5leHBvcnQgY29uc3QgUEhYX0FDVElWRV9FTlRSWV9SRUZTID0gXCJkYXRhLXBoeC1hY3RpdmUtcmVmc1wiXG5leHBvcnQgY29uc3QgUEhYX0xJVkVfRklMRV9VUERBVEVEID0gXCJwaHg6bGl2ZS1maWxlOnVwZGF0ZWRcIlxuZXhwb3J0IGNvbnN0IFBIWF9TS0lQID0gXCJkYXRhLXBoeC1za2lwXCJcbmV4cG9ydCBjb25zdCBQSFhfUFJVTkUgPSBcImRhdGEtcGh4LXBydW5lXCJcbmV4cG9ydCBjb25zdCBQSFhfUEFHRV9MT0FESU5HID0gXCJwYWdlLWxvYWRpbmdcIlxuZXhwb3J0IGNvbnN0IFBIWF9DT05ORUNURURfQ0xBU1MgPSBcInBoeC1jb25uZWN0ZWRcIlxuZXhwb3J0IGNvbnN0IFBIWF9ESVNDT05ORUNURURfQ0xBU1MgPSBcInBoeC1sb2FkaW5nXCJcbmV4cG9ydCBjb25zdCBQSFhfTk9fRkVFREJBQ0tfQ0xBU1MgPSBcInBoeC1uby1mZWVkYmFja1wiXG5leHBvcnQgY29uc3QgUEhYX0VSUk9SX0NMQVNTID0gXCJwaHgtZXJyb3JcIlxuZXhwb3J0IGNvbnN0IFBIWF9QQVJFTlRfSUQgPSBcImRhdGEtcGh4LXBhcmVudC1pZFwiXG5leHBvcnQgY29uc3QgUEhYX01BSU4gPSBcImRhdGEtcGh4LW1haW5cIlxuZXhwb3J0IGNvbnN0IFBIWF9ST09UX0lEID0gXCJkYXRhLXBoeC1yb290LWlkXCJcbmV4cG9ydCBjb25zdCBQSFhfVFJJR0dFUl9BQ1RJT04gPSBcInRyaWdnZXItYWN0aW9uXCJcbmV4cG9ydCBjb25zdCBQSFhfRkVFREJBQ0tfRk9SID0gXCJmZWVkYmFjay1mb3JcIlxuZXhwb3J0IGNvbnN0IFBIWF9IQVNfRk9DVVNFRCA9IFwicGh4LWhhcy1mb2N1c2VkXCJcbmV4cG9ydCBjb25zdCBGT0NVU0FCTEVfSU5QVVRTID0gW1widGV4dFwiLCBcInRleHRhcmVhXCIsIFwibnVtYmVyXCIsIFwiZW1haWxcIiwgXCJwYXNzd29yZFwiLCBcInNlYXJjaFwiLCBcInRlbFwiLCBcInVybFwiLCBcImRhdGVcIiwgXCJ0aW1lXCIsIFwiZGF0ZXRpbWUtbG9jYWxcIiwgXCJjb2xvclwiLCBcInJhbmdlXCJdXG5leHBvcnQgY29uc3QgQ0hFQ0tBQkxFX0lOUFVUUyA9IFtcImNoZWNrYm94XCIsIFwicmFkaW9cIl1cbmV4cG9ydCBjb25zdCBQSFhfSEFTX1NVQk1JVFRFRCA9IFwicGh4LWhhcy1zdWJtaXR0ZWRcIlxuZXhwb3J0IGNvbnN0IFBIWF9TRVNTSU9OID0gXCJkYXRhLXBoeC1zZXNzaW9uXCJcbmV4cG9ydCBjb25zdCBQSFhfVklFV19TRUxFQ1RPUiA9IGBbJHtQSFhfU0VTU0lPTn1dYFxuZXhwb3J0IGNvbnN0IFBIWF9TVElDS1kgPSBcImRhdGEtcGh4LXN0aWNreVwiXG5leHBvcnQgY29uc3QgUEhYX1NUQVRJQyA9IFwiZGF0YS1waHgtc3RhdGljXCJcbmV4cG9ydCBjb25zdCBQSFhfUkVBRE9OTFkgPSBcImRhdGEtcGh4LXJlYWRvbmx5XCJcbmV4cG9ydCBjb25zdCBQSFhfRElTQUJMRUQgPSBcImRhdGEtcGh4LWRpc2FibGVkXCJcbmV4cG9ydCBjb25zdCBQSFhfRElTQUJMRV9XSVRIID0gXCJkaXNhYmxlLXdpdGhcIlxuZXhwb3J0IGNvbnN0IFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSA9IFwiZGF0YS1waHgtZGlzYWJsZS13aXRoLXJlc3RvcmVcIlxuZXhwb3J0IGNvbnN0IFBIWF9IT09LID0gXCJob29rXCJcbmV4cG9ydCBjb25zdCBQSFhfREVCT1VOQ0UgPSBcImRlYm91bmNlXCJcbmV4cG9ydCBjb25zdCBQSFhfVEhST1RUTEUgPSBcInRocm90dGxlXCJcbmV4cG9ydCBjb25zdCBQSFhfVVBEQVRFID0gXCJ1cGRhdGVcIlxuZXhwb3J0IGNvbnN0IFBIWF9LRVkgPSBcImtleVwiXG5leHBvcnQgY29uc3QgUEhYX1BSSVZBVEUgPSBcInBoeFByaXZhdGVcIlxuZXhwb3J0IGNvbnN0IFBIWF9BVVRPX1JFQ09WRVIgPSBcImF1dG8tcmVjb3ZlclwiXG5leHBvcnQgY29uc3QgUEhYX0xWX0RFQlVHID0gXCJwaHg6bGl2ZS1zb2NrZXQ6ZGVidWdcIlxuZXhwb3J0IGNvbnN0IFBIWF9MVl9QUk9GSUxFID0gXCJwaHg6bGl2ZS1zb2NrZXQ6cHJvZmlsaW5nXCJcbmV4cG9ydCBjb25zdCBQSFhfTFZfTEFURU5DWV9TSU0gPSBcInBoeDpsaXZlLXNvY2tldDpsYXRlbmN5LXNpbVwiXG5leHBvcnQgY29uc3QgUEhYX1BST0dSRVNTID0gXCJwcm9ncmVzc1wiXG5leHBvcnQgY29uc3QgTE9BREVSX1RJTUVPVVQgPSAxXG5leHBvcnQgY29uc3QgQkVGT1JFX1VOTE9BRF9MT0FERVJfVElNRU9VVCA9IDIwMFxuZXhwb3J0IGNvbnN0IEJJTkRJTkdfUFJFRklYID0gXCJwaHgtXCJcbmV4cG9ydCBjb25zdCBQVVNIX1RJTUVPVVQgPSAzMDAwMFxuZXhwb3J0IGNvbnN0IExJTktfSEVBREVSID0gXCJ4LXJlcXVlc3RlZC13aXRoXCJcbmV4cG9ydCBjb25zdCBSRVNQT05TRV9VUkxfSEVBREVSID0gXCJ4LXJlc3BvbnNlLXVybFwiXG5leHBvcnQgY29uc3QgREVCT1VOQ0VfVFJJR0dFUiA9IFwiZGVib3VuY2UtdHJpZ2dlclwiXG5leHBvcnQgY29uc3QgVEhST1RUTEVEID0gXCJ0aHJvdHRsZWRcIlxuZXhwb3J0IGNvbnN0IERFQk9VTkNFX1BSRVZfS0VZID0gXCJkZWJvdW5jZS1wcmV2LWtleVwiXG5leHBvcnQgY29uc3QgREVGQVVMVFMgPSB7XG4gIGRlYm91bmNlOiAzMDAsXG4gIHRocm90dGxlOiAzMDBcbn1cblxuLy8gUmVuZGVyZWRcbmV4cG9ydCBjb25zdCBEWU5BTUlDUyA9IFwiZFwiXG5leHBvcnQgY29uc3QgU1RBVElDID0gXCJzXCJcbmV4cG9ydCBjb25zdCBDT01QT05FTlRTID0gXCJjXCJcbmV4cG9ydCBjb25zdCBFVkVOVFMgPSBcImVcIlxuZXhwb3J0IGNvbnN0IFJFUExZID0gXCJyXCJcbmV4cG9ydCBjb25zdCBUSVRMRSA9IFwidFwiXG5leHBvcnQgY29uc3QgVEVNUExBVEVTID0gXCJwXCJcbiIsICJpbXBvcnQge1xuICBsb2dFcnJvclxufSBmcm9tIFwiLi91dGlsc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVudHJ5VXBsb2FkZXIge1xuICBjb25zdHJ1Y3RvcihlbnRyeSwgY2h1bmtTaXplLCBsaXZlU29ja2V0KXtcbiAgICB0aGlzLmxpdmVTb2NrZXQgPSBsaXZlU29ja2V0XG4gICAgdGhpcy5lbnRyeSA9IGVudHJ5XG4gICAgdGhpcy5vZmZzZXQgPSAwXG4gICAgdGhpcy5jaHVua1NpemUgPSBjaHVua1NpemVcbiAgICB0aGlzLmNodW5rVGltZXIgPSBudWxsXG4gICAgdGhpcy51cGxvYWRDaGFubmVsID0gbGl2ZVNvY2tldC5jaGFubmVsKGBsdnU6JHtlbnRyeS5yZWZ9YCwge3Rva2VuOiBlbnRyeS5tZXRhZGF0YSgpfSlcbiAgfVxuXG4gIGVycm9yKHJlYXNvbil7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuY2h1bmtUaW1lcilcbiAgICB0aGlzLnVwbG9hZENoYW5uZWwubGVhdmUoKVxuICAgIHRoaXMuZW50cnkuZXJyb3IocmVhc29uKVxuICB9XG5cbiAgdXBsb2FkKCl7XG4gICAgdGhpcy51cGxvYWRDaGFubmVsLm9uRXJyb3IocmVhc29uID0+IHRoaXMuZXJyb3IocmVhc29uKSlcbiAgICB0aGlzLnVwbG9hZENoYW5uZWwuam9pbigpXG4gICAgICAucmVjZWl2ZShcIm9rXCIsIF9kYXRhID0+IHRoaXMucmVhZE5leHRDaHVuaygpKVxuICAgICAgLnJlY2VpdmUoXCJlcnJvclwiLCByZWFzb24gPT4gdGhpcy5lcnJvcihyZWFzb24pKVxuICB9XG5cbiAgaXNEb25lKCl7IHJldHVybiB0aGlzLm9mZnNldCA+PSB0aGlzLmVudHJ5LmZpbGUuc2l6ZSB9XG5cbiAgcmVhZE5leHRDaHVuaygpe1xuICAgIGxldCByZWFkZXIgPSBuZXcgd2luZG93LkZpbGVSZWFkZXIoKVxuICAgIGxldCBibG9iID0gdGhpcy5lbnRyeS5maWxlLnNsaWNlKHRoaXMub2Zmc2V0LCB0aGlzLmNodW5rU2l6ZSArIHRoaXMub2Zmc2V0KVxuICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgaWYoZS50YXJnZXQuZXJyb3IgPT09IG51bGwpe1xuICAgICAgICB0aGlzLm9mZnNldCArPSBlLnRhcmdldC5yZXN1bHQuYnl0ZUxlbmd0aFxuICAgICAgICB0aGlzLnB1c2hDaHVuayhlLnRhcmdldC5yZXN1bHQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbG9nRXJyb3IoXCJSZWFkIGVycm9yOiBcIiArIGUudGFyZ2V0LmVycm9yKVxuICAgICAgfVxuICAgIH1cbiAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYilcbiAgfVxuXG4gIHB1c2hDaHVuayhjaHVuayl7XG4gICAgaWYoIXRoaXMudXBsb2FkQ2hhbm5lbC5pc0pvaW5lZCgpKXsgcmV0dXJuIH1cbiAgICB0aGlzLnVwbG9hZENoYW5uZWwucHVzaChcImNodW5rXCIsIGNodW5rKVxuICAgICAgLnJlY2VpdmUoXCJva1wiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZW50cnkucHJvZ3Jlc3MoKHRoaXMub2Zmc2V0IC8gdGhpcy5lbnRyeS5maWxlLnNpemUpICogMTAwKVxuICAgICAgICBpZighdGhpcy5pc0RvbmUoKSl7XG4gICAgICAgICAgdGhpcy5jaHVua1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlYWROZXh0Q2h1bmsoKSwgdGhpcy5saXZlU29ja2V0LmdldExhdGVuY3lTaW0oKSB8fCAwKVxuICAgICAgICB9XG4gICAgICB9KVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgUEhYX1ZJRVdfU0VMRUNUT1Jcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IEVudHJ5VXBsb2FkZXIgZnJvbSBcIi4vZW50cnlfdXBsb2FkZXJcIlxuXG5leHBvcnQgbGV0IGxvZ0Vycm9yID0gKG1zZywgb2JqKSA9PiBjb25zb2xlLmVycm9yICYmIGNvbnNvbGUuZXJyb3IobXNnLCBvYmopXG5cbmV4cG9ydCBsZXQgaXNDaWQgPSAoY2lkKSA9PiB7XG4gIGxldCB0eXBlID0gdHlwZW9mKGNpZClcbiAgcmV0dXJuIHR5cGUgPT09IFwibnVtYmVyXCIgfHwgKHR5cGUgPT09IFwic3RyaW5nXCIgJiYgL14oMHxbMS05XVxcZCopJC8udGVzdChjaWQpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0RHVwbGljYXRlSWRzKCl7XG4gIGxldCBpZHMgPSBuZXcgU2V0KClcbiAgbGV0IGVsZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIipbaWRdXCIpXG4gIGZvcihsZXQgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXtcbiAgICBpZihpZHMuaGFzKGVsZW1zW2ldLmlkKSl7XG4gICAgICBjb25zb2xlLmVycm9yKGBNdWx0aXBsZSBJRHMgZGV0ZWN0ZWQ6ICR7ZWxlbXNbaV0uaWR9LiBFbnN1cmUgdW5pcXVlIGVsZW1lbnQgaWRzLmApXG4gICAgfSBlbHNlIHtcbiAgICAgIGlkcy5hZGQoZWxlbXNbaV0uaWQpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBsZXQgZGVidWcgPSAodmlldywga2luZCwgbXNnLCBvYmopID0+IHtcbiAgaWYodmlldy5saXZlU29ja2V0LmlzRGVidWdFbmFibGVkKCkpe1xuICAgIGNvbnNvbGUubG9nKGAke3ZpZXcuaWR9ICR7a2luZH06ICR7bXNnfSAtIGAsIG9iailcbiAgfVxufVxuXG4vLyB3cmFwcyB2YWx1ZSBpbiBjbG9zdXJlIG9yIHJldHVybnMgY2xvc3VyZVxuZXhwb3J0IGxldCBjbG9zdXJlID0gKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gXCJmdW5jdGlvblwiID8gdmFsIDogZnVuY3Rpb24gKCl7IHJldHVybiB2YWwgfVxuXG5leHBvcnQgbGV0IGNsb25lID0gKG9iaikgPT4geyByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKSB9XG5cbmV4cG9ydCBsZXQgY2xvc2VzdFBoeEJpbmRpbmcgPSAoZWwsIGJpbmRpbmcsIGJvcmRlckVsKSA9PiB7XG4gIGRvIHtcbiAgICBpZihlbC5tYXRjaGVzKGBbJHtiaW5kaW5nfV1gKSl7IHJldHVybiBlbCB9XG4gICAgZWwgPSBlbC5wYXJlbnRFbGVtZW50IHx8IGVsLnBhcmVudE5vZGVcbiAgfSB3aGlsZShlbCAhPT0gbnVsbCAmJiBlbC5ub2RlVHlwZSA9PT0gMSAmJiAhKChib3JkZXJFbCAmJiBib3JkZXJFbC5pc1NhbWVOb2RlKGVsKSkgfHwgZWwubWF0Y2hlcyhQSFhfVklFV19TRUxFQ1RPUikpKVxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgbGV0IGlzT2JqZWN0ID0gKG9iaikgPT4ge1xuICByZXR1cm4gb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiYgIShvYmogaW5zdGFuY2VvZiBBcnJheSlcbn1cblxuZXhwb3J0IGxldCBpc0VxdWFsT2JqID0gKG9iajEsIG9iajIpID0+IEpTT04uc3RyaW5naWZ5KG9iajEpID09PSBKU09OLnN0cmluZ2lmeShvYmoyKVxuXG5leHBvcnQgbGV0IGlzRW1wdHkgPSAob2JqKSA9PiB7XG4gIGZvcihsZXQgeCBpbiBvYmopeyByZXR1cm4gZmFsc2UgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgbGV0IG1heWJlID0gKGVsLCBjYWxsYmFjaykgPT4gZWwgJiYgY2FsbGJhY2soZWwpXG5cbmV4cG9ydCBsZXQgY2hhbm5lbFVwbG9hZGVyID0gZnVuY3Rpb24gKGVudHJpZXMsIG9uRXJyb3IsIHJlc3AsIGxpdmVTb2NrZXQpe1xuICBlbnRyaWVzLmZvckVhY2goZW50cnkgPT4ge1xuICAgIGxldCBlbnRyeVVwbG9hZGVyID0gbmV3IEVudHJ5VXBsb2FkZXIoZW50cnksIHJlc3AuY29uZmlnLmNodW5rX3NpemUsIGxpdmVTb2NrZXQpXG4gICAgZW50cnlVcGxvYWRlci51cGxvYWQoKVxuICB9KVxufVxuIiwgImxldCBCcm93c2VyID0ge1xuICBjYW5QdXNoU3RhdGUoKXsgcmV0dXJuICh0eXBlb2YgKGhpc3RvcnkucHVzaFN0YXRlKSAhPT0gXCJ1bmRlZmluZWRcIikgfSxcblxuICBkcm9wTG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSl7XG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMubG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpKVxuICB9LFxuXG4gIHVwZGF0ZUxvY2FsKGxvY2FsU3RvcmFnZSwgbmFtZXNwYWNlLCBzdWJrZXksIGluaXRpYWwsIGZ1bmMpe1xuICAgIGxldCBjdXJyZW50ID0gdGhpcy5nZXRMb2NhbChsb2NhbFN0b3JhZ2UsIG5hbWVzcGFjZSwgc3Via2V5KVxuICAgIGxldCBrZXkgPSB0aGlzLmxvY2FsS2V5KG5hbWVzcGFjZSwgc3Via2V5KVxuICAgIGxldCBuZXdWYWwgPSBjdXJyZW50ID09PSBudWxsID8gaW5pdGlhbCA6IGZ1bmMoY3VycmVudClcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KG5ld1ZhbCkpXG4gICAgcmV0dXJuIG5ld1ZhbFxuICB9LFxuXG4gIGdldExvY2FsKGxvY2FsU3RvcmFnZSwgbmFtZXNwYWNlLCBzdWJrZXkpe1xuICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpKSlcbiAgfSxcblxuICB1cGRhdGVDdXJyZW50U3RhdGUoY2FsbGJhY2spe1xuICAgIGlmKCF0aGlzLmNhblB1c2hTdGF0ZSgpKXsgcmV0dXJuIH1cbiAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZShjYWxsYmFjayhoaXN0b3J5LnN0YXRlIHx8IHt9KSwgXCJcIiwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gIH0sXG5cbiAgcHVzaFN0YXRlKGtpbmQsIG1ldGEsIHRvKXtcbiAgICBpZih0aGlzLmNhblB1c2hTdGF0ZSgpKXtcbiAgICAgIGlmKHRvICE9PSB3aW5kb3cubG9jYXRpb24uaHJlZil7XG4gICAgICAgIGlmKG1ldGEudHlwZSA9PSBcInJlZGlyZWN0XCIgJiYgbWV0YS5zY3JvbGwpe1xuICAgICAgICAgIC8vIElmIHdlJ3JlIHJlZGlyZWN0aW5nIHN0b3JlIHRoZSBjdXJyZW50IHNjcm9sbFkgZm9yIHRoZSBjdXJyZW50IGhpc3Rvcnkgc3RhdGUuXG4gICAgICAgICAgbGV0IGN1cnJlbnRTdGF0ZSA9IGhpc3Rvcnkuc3RhdGUgfHwge31cbiAgICAgICAgICBjdXJyZW50U3RhdGUuc2Nyb2xsID0gbWV0YS5zY3JvbGxcbiAgICAgICAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZShjdXJyZW50U3RhdGUsIFwiXCIsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKVxuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIG1ldGEuc2Nyb2xsIC8vIE9ubHkgc3RvcmUgdGhlIHNjcm9sbCBpbiB0aGUgcmVkaXJlY3QgY2FzZS5cbiAgICAgICAgaGlzdG9yeVtraW5kICsgXCJTdGF0ZVwiXShtZXRhLCBcIlwiLCB0byB8fCBudWxsKSAvLyBJRSB3aWxsIGNvZXJjZSB1bmRlZmluZWQgdG8gc3RyaW5nXG4gICAgICAgIGxldCBoYXNoRWwgPSB0aGlzLmdldEhhc2hUYXJnZXRFbCh3aW5kb3cubG9jYXRpb24uaGFzaClcblxuICAgICAgICBpZihoYXNoRWwpe1xuICAgICAgICAgIGhhc2hFbC5zY3JvbGxJbnRvVmlldygpXG4gICAgICAgIH0gZWxzZSBpZihtZXRhLnR5cGUgPT09IFwicmVkaXJlY3RcIil7XG4gICAgICAgICAgd2luZG93LnNjcm9sbCgwLCAwKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVkaXJlY3QodG8pXG4gICAgfVxuICB9LFxuXG4gIHNldENvb2tpZShuYW1lLCB2YWx1ZSl7XG4gICAgZG9jdW1lbnQuY29va2llID0gYCR7bmFtZX09JHt2YWx1ZX1gXG4gIH0sXG5cbiAgZ2V0Q29va2llKG5hbWUpe1xuICAgIHJldHVybiBkb2N1bWVudC5jb29raWUucmVwbGFjZShuZXcgUmVnRXhwKGAoPzooPzpefC4qO1xccyopJHtuYW1lfVxccypcXD1cXHMqKFteO10qKS4qJCl8Xi4qJGApLCBcIiQxXCIpXG4gIH0sXG5cbiAgcmVkaXJlY3QodG9VUkwsIGZsYXNoKXtcbiAgICBpZihmbGFzaCl7IEJyb3dzZXIuc2V0Q29va2llKFwiX19waG9lbml4X2ZsYXNoX19cIiwgZmxhc2ggKyBcIjsgbWF4LWFnZT02MDAwMDsgcGF0aD0vXCIpIH1cbiAgICB3aW5kb3cubG9jYXRpb24gPSB0b1VSTFxuICB9LFxuXG4gIGxvY2FsS2V5KG5hbWVzcGFjZSwgc3Via2V5KXsgcmV0dXJuIGAke25hbWVzcGFjZX0tJHtzdWJrZXl9YCB9LFxuXG4gIGdldEhhc2hUYXJnZXRFbChtYXliZUhhc2gpe1xuICAgIGxldCBoYXNoID0gbWF5YmVIYXNoLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpXG4gICAgaWYoaGFzaCA9PT0gXCJcIil7IHJldHVybiB9XG4gICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGhhc2gpIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYGFbbmFtZT1cIiR7aGFzaH1cIl1gKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJyb3dzZXJcbiIsICJpbXBvcnQge1xuICBDSEVDS0FCTEVfSU5QVVRTLFxuICBERUJPVU5DRV9QUkVWX0tFWSxcbiAgREVCT1VOQ0VfVFJJR0dFUixcbiAgRk9DVVNBQkxFX0lOUFVUUyxcbiAgUEhYX0NPTVBPTkVOVCxcbiAgUEhYX0VWRU5UX0NMQVNTRVMsXG4gIFBIWF9IQVNfRk9DVVNFRCxcbiAgUEhYX0hBU19TVUJNSVRURUQsXG4gIFBIWF9NQUlOLFxuICBQSFhfTk9fRkVFREJBQ0tfQ0xBU1MsXG4gIFBIWF9QQVJFTlRfSUQsXG4gIFBIWF9QUklWQVRFLFxuICBQSFhfUkVGLFxuICBQSFhfUkVGX1NSQyxcbiAgUEhYX1JPT1RfSUQsXG4gIFBIWF9TRVNTSU9OLFxuICBQSFhfU1RBVElDLFxuICBQSFhfVVBMT0FEX1JFRixcbiAgUEhYX1ZJRVdfU0VMRUNUT1IsXG4gIFBIWF9TVElDS1ksXG4gIFRIUk9UVExFRFxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQge1xuICBsb2dFcnJvclxufSBmcm9tIFwiLi91dGlsc1wiXG5cbmxldCBET00gPSB7XG4gIGJ5SWQoaWQpeyByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpIHx8IGxvZ0Vycm9yKGBubyBpZCBmb3VuZCBmb3IgJHtpZH1gKSB9LFxuXG4gIHJlbW92ZUNsYXNzKGVsLCBjbGFzc05hbWUpe1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKVxuICAgIGlmKGVsLmNsYXNzTGlzdC5sZW5ndGggPT09IDApeyBlbC5yZW1vdmVBdHRyaWJ1dGUoXCJjbGFzc1wiKSB9XG4gIH0sXG5cbiAgYWxsKG5vZGUsIHF1ZXJ5LCBjYWxsYmFjayl7XG4gICAgaWYoIW5vZGUpeyByZXR1cm4gW10gfVxuICAgIGxldCBhcnJheSA9IEFycmF5LmZyb20obm9kZS5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KSlcbiAgICByZXR1cm4gY2FsbGJhY2sgPyBhcnJheS5mb3JFYWNoKGNhbGxiYWNrKSA6IGFycmF5XG4gIH0sXG5cbiAgY2hpbGROb2RlTGVuZ3RoKGh0bWwpe1xuICAgIGxldCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKVxuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGh0bWxcbiAgICByZXR1cm4gdGVtcGxhdGUuY29udGVudC5jaGlsZEVsZW1lbnRDb3VudFxuICB9LFxuXG4gIGlzVXBsb2FkSW5wdXQoZWwpeyByZXR1cm4gZWwudHlwZSA9PT0gXCJmaWxlXCIgJiYgZWwuZ2V0QXR0cmlidXRlKFBIWF9VUExPQURfUkVGKSAhPT0gbnVsbCB9LFxuXG4gIGZpbmRVcGxvYWRJbnB1dHMobm9kZSl7IHJldHVybiB0aGlzLmFsbChub2RlLCBgaW5wdXRbdHlwZT1cImZpbGVcIl1bJHtQSFhfVVBMT0FEX1JFRn1dYCkgfSxcblxuICBmaW5kQ29tcG9uZW50Tm9kZUxpc3Qobm9kZSwgY2lkKXtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJXaXRoaW5TYW1lTGl2ZVZpZXcodGhpcy5hbGwobm9kZSwgYFske1BIWF9DT01QT05FTlR9PVwiJHtjaWR9XCJdYCksIG5vZGUpXG4gIH0sXG5cbiAgaXNQaHhEZXN0cm95ZWQobm9kZSl7XG4gICAgcmV0dXJuIG5vZGUuaWQgJiYgRE9NLnByaXZhdGUobm9kZSwgXCJkZXN0cm95ZWRcIikgPyB0cnVlIDogZmFsc2VcbiAgfSxcblxuICBtYXJrUGh4Q2hpbGREZXN0cm95ZWQoZWwpe1xuICAgIGlmKHRoaXMuaXNQaHhDaGlsZChlbCkpeyBlbC5zZXRBdHRyaWJ1dGUoUEhYX1NFU1NJT04sIFwiXCIpIH1cbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIFwiZGVzdHJveWVkXCIsIHRydWUpXG4gIH0sXG5cbiAgZmluZFBoeENoaWxkcmVuSW5GcmFnbWVudChodG1sLCBwYXJlbnRJZCl7XG4gICAgbGV0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpXG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gaHRtbFxuICAgIHJldHVybiB0aGlzLmZpbmRQaHhDaGlsZHJlbih0ZW1wbGF0ZS5jb250ZW50LCBwYXJlbnRJZClcbiAgfSxcblxuICBpc0lnbm9yZWQoZWwsIHBoeFVwZGF0ZSl7XG4gICAgcmV0dXJuIChlbC5nZXRBdHRyaWJ1dGUocGh4VXBkYXRlKSB8fCBlbC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC11cGRhdGVcIikpID09PSBcImlnbm9yZVwiXG4gIH0sXG5cbiAgaXNQaHhVcGRhdGUoZWwsIHBoeFVwZGF0ZSwgdXBkYXRlVHlwZXMpe1xuICAgIHJldHVybiBlbC5nZXRBdHRyaWJ1dGUgJiYgdXBkYXRlVHlwZXMuaW5kZXhPZihlbC5nZXRBdHRyaWJ1dGUocGh4VXBkYXRlKSkgPj0gMFxuICB9LFxuXG4gIGZpbmRQaHhTdGlja3koZWwpeyByZXR1cm4gdGhpcy5hbGwoZWwsIGBbJHtQSFhfU1RJQ0tZfV1gKSB9LFxuXG4gIGZpbmRQaHhDaGlsZHJlbihlbCwgcGFyZW50SWQpe1xuICAgIHJldHVybiB0aGlzLmFsbChlbCwgYCR7UEhYX1ZJRVdfU0VMRUNUT1J9WyR7UEhYX1BBUkVOVF9JRH09XCIke3BhcmVudElkfVwiXWApXG4gIH0sXG5cbiAgZmluZFBhcmVudENJRHMobm9kZSwgY2lkcyl7XG4gICAgbGV0IGluaXRpYWwgPSBuZXcgU2V0KGNpZHMpXG4gICAgcmV0dXJuIGNpZHMucmVkdWNlKChhY2MsIGNpZCkgPT4ge1xuICAgICAgbGV0IHNlbGVjdG9yID0gYFske1BIWF9DT01QT05FTlR9PVwiJHtjaWR9XCJdIFske1BIWF9DT01QT05FTlR9XWBcblxuICAgICAgdGhpcy5maWx0ZXJXaXRoaW5TYW1lTGl2ZVZpZXcodGhpcy5hbGwobm9kZSwgc2VsZWN0b3IpLCBub2RlKVxuICAgICAgICAubWFwKGVsID0+IHBhcnNlSW50KGVsLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKSkpXG4gICAgICAgIC5mb3JFYWNoKGNoaWxkQ0lEID0+IGFjYy5kZWxldGUoY2hpbGRDSUQpKVxuXG4gICAgICByZXR1cm4gYWNjXG4gICAgfSwgaW5pdGlhbClcbiAgfSxcblxuICBmaWx0ZXJXaXRoaW5TYW1lTGl2ZVZpZXcobm9kZXMsIHBhcmVudCl7XG4gICAgaWYocGFyZW50LnF1ZXJ5U2VsZWN0b3IoUEhYX1ZJRVdfU0VMRUNUT1IpKXtcbiAgICAgIHJldHVybiBub2Rlcy5maWx0ZXIoZWwgPT4gdGhpcy53aXRoaW5TYW1lTGl2ZVZpZXcoZWwsIHBhcmVudCkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBub2Rlc1xuICAgIH1cbiAgfSxcblxuICB3aXRoaW5TYW1lTGl2ZVZpZXcobm9kZSwgcGFyZW50KXtcbiAgICB3aGlsZShub2RlID0gbm9kZS5wYXJlbnROb2RlKXtcbiAgICAgIGlmKG5vZGUuaXNTYW1lTm9kZShwYXJlbnQpKXsgcmV0dXJuIHRydWUgfVxuICAgICAgaWYobm9kZS5nZXRBdHRyaWJ1dGUoUEhYX1NFU1NJT04pICE9PSBudWxsKXsgcmV0dXJuIGZhbHNlIH1cbiAgICB9XG4gIH0sXG5cbiAgcHJpdmF0ZShlbCwga2V5KXsgcmV0dXJuIGVsW1BIWF9QUklWQVRFXSAmJiBlbFtQSFhfUFJJVkFURV1ba2V5XSB9LFxuXG4gIGRlbGV0ZVByaXZhdGUoZWwsIGtleSl7IGVsW1BIWF9QUklWQVRFXSAmJiBkZWxldGUgKGVsW1BIWF9QUklWQVRFXVtrZXldKSB9LFxuXG4gIHB1dFByaXZhdGUoZWwsIGtleSwgdmFsdWUpe1xuICAgIGlmKCFlbFtQSFhfUFJJVkFURV0peyBlbFtQSFhfUFJJVkFURV0gPSB7fSB9XG4gICAgZWxbUEhYX1BSSVZBVEVdW2tleV0gPSB2YWx1ZVxuICB9LFxuXG4gIHVwZGF0ZVByaXZhdGUoZWwsIGtleSwgZGVmYXVsdFZhbCwgdXBkYXRlRnVuYyl7XG4gICAgbGV0IGV4aXN0aW5nID0gdGhpcy5wcml2YXRlKGVsLCBrZXkpXG4gICAgaWYoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCl7XG4gICAgICB0aGlzLnB1dFByaXZhdGUoZWwsIGtleSwgdXBkYXRlRnVuYyhkZWZhdWx0VmFsKSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXRQcml2YXRlKGVsLCBrZXksIHVwZGF0ZUZ1bmMoZXhpc3RpbmcpKVxuICAgIH1cbiAgfSxcblxuICBjb3B5UHJpdmF0ZXModGFyZ2V0LCBzb3VyY2Upe1xuICAgIGlmKHNvdXJjZVtQSFhfUFJJVkFURV0pe1xuICAgICAgdGFyZ2V0W1BIWF9QUklWQVRFXSA9IHNvdXJjZVtQSFhfUFJJVkFURV1cbiAgICB9XG4gIH0sXG5cbiAgcHV0VGl0bGUoc3RyKXtcbiAgICBsZXQgdGl0bGVFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJ0aXRsZVwiKVxuICAgIGxldCB7cHJlZml4LCBzdWZmaXh9ID0gdGl0bGVFbC5kYXRhc2V0XG4gICAgZG9jdW1lbnQudGl0bGUgPSBgJHtwcmVmaXggfHwgXCJcIn0ke3N0cn0ke3N1ZmZpeCB8fCBcIlwifWBcbiAgfSxcblxuICBkZWJvdW5jZShlbCwgZXZlbnQsIHBoeERlYm91bmNlLCBkZWZhdWx0RGVib3VuY2UsIHBoeFRocm90dGxlLCBkZWZhdWx0VGhyb3R0bGUsIGNhbGxiYWNrKXtcbiAgICBsZXQgZGVib3VuY2UgPSBlbC5nZXRBdHRyaWJ1dGUocGh4RGVib3VuY2UpXG4gICAgbGV0IHRocm90dGxlID0gZWwuZ2V0QXR0cmlidXRlKHBoeFRocm90dGxlKVxuICAgIGlmKGRlYm91bmNlID09PSBcIlwiKXsgZGVib3VuY2UgPSBkZWZhdWx0RGVib3VuY2UgfVxuICAgIGlmKHRocm90dGxlID09PSBcIlwiKXsgdGhyb3R0bGUgPSBkZWZhdWx0VGhyb3R0bGUgfVxuICAgIGxldCB2YWx1ZSA9IGRlYm91bmNlIHx8IHRocm90dGxlXG4gICAgc3dpdGNoKHZhbHVlKXtcbiAgICAgIGNhc2UgbnVsbDogcmV0dXJuIGNhbGxiYWNrKClcblxuICAgICAgY2FzZSBcImJsdXJcIjpcbiAgICAgICAgaWYodGhpcy5vbmNlKGVsLCBcImRlYm91bmNlLWJsdXJcIikpe1xuICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsICgpID0+IGNhbGxiYWNrKCkpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGxldCB0aW1lb3V0ID0gcGFyc2VJbnQodmFsdWUpXG4gICAgICAgIGxldCB0cmlnZ2VyID0gKCkgPT4gdGhyb3R0bGUgPyB0aGlzLmRlbGV0ZVByaXZhdGUoZWwsIFRIUk9UVExFRCkgOiBjYWxsYmFjaygpXG4gICAgICAgIGxldCBjdXJyZW50Q3ljbGUgPSB0aGlzLmluY0N5Y2xlKGVsLCBERUJPVU5DRV9UUklHR0VSLCB0cmlnZ2VyKVxuICAgICAgICBpZihpc05hTih0aW1lb3V0KSl7IHJldHVybiBsb2dFcnJvcihgaW52YWxpZCB0aHJvdHRsZS9kZWJvdW5jZSB2YWx1ZTogJHt2YWx1ZX1gKSB9XG4gICAgICAgIGlmKHRocm90dGxlKXtcbiAgICAgICAgICBsZXQgbmV3S2V5RG93biA9IGZhbHNlXG4gICAgICAgICAgaWYoZXZlbnQudHlwZSA9PT0gXCJrZXlkb3duXCIpe1xuICAgICAgICAgICAgbGV0IHByZXZLZXkgPSB0aGlzLnByaXZhdGUoZWwsIERFQk9VTkNFX1BSRVZfS0VZKVxuICAgICAgICAgICAgdGhpcy5wdXRQcml2YXRlKGVsLCBERUJPVU5DRV9QUkVWX0tFWSwgZXZlbnQua2V5KVxuICAgICAgICAgICAgbmV3S2V5RG93biA9IHByZXZLZXkgIT09IGV2ZW50LmtleVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmKCFuZXdLZXlEb3duICYmIHRoaXMucHJpdmF0ZShlbCwgVEhST1RUTEVEKSl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICAgICAgdGhpcy5wdXRQcml2YXRlKGVsLCBUSFJPVFRMRUQsIHRydWUpXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudHJpZ2dlckN5Y2xlKGVsLCBERUJPVU5DRV9UUklHR0VSKSwgdGltZW91dClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnRyaWdnZXJDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUiwgY3VycmVudEN5Y2xlKSwgdGltZW91dClcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IGZvcm0gPSBlbC5mb3JtXG4gICAgICAgIGlmKGZvcm0gJiYgdGhpcy5vbmNlKGZvcm0sIFwiYmluZC1kZWJvdW5jZVwiKSl7XG4gICAgICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsICgpID0+IHtcbiAgICAgICAgICAgIEFycmF5LmZyb20oKG5ldyBGb3JtRGF0YShmb3JtKSkuZW50cmllcygpLCAoW25hbWVdKSA9PiB7XG4gICAgICAgICAgICAgIGxldCBpbnB1dCA9IGZvcm0ucXVlcnlTZWxlY3RvcihgW25hbWU9XCIke25hbWV9XCJdYClcbiAgICAgICAgICAgICAgdGhpcy5pbmNDeWNsZShpbnB1dCwgREVCT1VOQ0VfVFJJR0dFUilcbiAgICAgICAgICAgICAgdGhpcy5kZWxldGVQcml2YXRlKGlucHV0LCBUSFJPVFRMRUQpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5vbmNlKGVsLCBcImJpbmQtZGVib3VuY2VcIikpe1xuICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsICgpID0+IHRoaXMudHJpZ2dlckN5Y2xlKGVsLCBERUJPVU5DRV9UUklHR0VSKSlcbiAgICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB0cmlnZ2VyQ3ljbGUoZWwsIGtleSwgY3VycmVudEN5Y2xlKXtcbiAgICBsZXQgW2N5Y2xlLCB0cmlnZ2VyXSA9IHRoaXMucHJpdmF0ZShlbCwga2V5KVxuICAgIGlmKCFjdXJyZW50Q3ljbGUpeyBjdXJyZW50Q3ljbGUgPSBjeWNsZSB9XG4gICAgaWYoY3VycmVudEN5Y2xlID09PSBjeWNsZSl7XG4gICAgICB0aGlzLmluY0N5Y2xlKGVsLCBrZXkpXG4gICAgICB0cmlnZ2VyKClcbiAgICB9XG4gIH0sXG5cbiAgb25jZShlbCwga2V5KXtcbiAgICBpZih0aGlzLnByaXZhdGUoZWwsIGtleSkgPT09IHRydWUpeyByZXR1cm4gZmFsc2UgfVxuICAgIHRoaXMucHV0UHJpdmF0ZShlbCwga2V5LCB0cnVlKVxuICAgIHJldHVybiB0cnVlXG4gIH0sXG5cbiAgaW5jQ3ljbGUoZWwsIGtleSwgdHJpZ2dlciA9IGZ1bmN0aW9uICgpeyB9KXtcbiAgICBsZXQgW2N1cnJlbnRDeWNsZV0gPSB0aGlzLnByaXZhdGUoZWwsIGtleSkgfHwgWzAsIHRyaWdnZXJdXG4gICAgY3VycmVudEN5Y2xlKytcbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIGtleSwgW2N1cnJlbnRDeWNsZSwgdHJpZ2dlcl0pXG4gICAgcmV0dXJuIGN1cnJlbnRDeWNsZVxuICB9LFxuXG4gIGRpc2NhcmRFcnJvcihjb250YWluZXIsIGVsLCBwaHhGZWVkYmFja0Zvcil7XG4gICAgbGV0IGZpZWxkID0gZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShwaHhGZWVkYmFja0ZvcilcbiAgICAvLyBUT0RPOiBSZW1vdmUgaWQgbG9va3VwIGFmdGVyIHdlIHVwZGF0ZSBQaG9lbml4IHRvIHVzZSBpbnB1dF9uYW1lIGluc3RlYWQgb2YgaW5wdXRfaWRcbiAgICBsZXQgaW5wdXQgPSBmaWVsZCAmJiBjb250YWluZXIucXVlcnlTZWxlY3RvcihgW2lkPVwiJHtmaWVsZH1cIl0sIFtuYW1lPVwiJHtmaWVsZH1cIl1gKVxuICAgIGlmKCFpbnB1dCl7IHJldHVybiB9XG5cbiAgICBpZighKHRoaXMucHJpdmF0ZShpbnB1dCwgUEhYX0hBU19GT0NVU0VEKSB8fCB0aGlzLnByaXZhdGUoaW5wdXQuZm9ybSwgUEhYX0hBU19TVUJNSVRURUQpKSl7XG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKFBIWF9OT19GRUVEQkFDS19DTEFTUylcbiAgICB9XG4gIH0sXG5cbiAgc2hvd0Vycm9yKGlucHV0RWwsIHBoeEZlZWRiYWNrRm9yKXtcbiAgICBpZihpbnB1dEVsLmlkIHx8IGlucHV0RWwubmFtZSl7XG4gICAgICB0aGlzLmFsbChpbnB1dEVsLmZvcm0sIGBbJHtwaHhGZWVkYmFja0Zvcn09XCIke2lucHV0RWwuaWR9XCJdLCBbJHtwaHhGZWVkYmFja0Zvcn09XCIke2lucHV0RWwubmFtZX1cIl1gLCAoZWwpID0+IHtcbiAgICAgICAgdGhpcy5yZW1vdmVDbGFzcyhlbCwgUEhYX05PX0ZFRURCQUNLX0NMQVNTKVxuICAgICAgfSlcbiAgICB9XG4gIH0sXG5cbiAgaXNQaHhDaGlsZChub2RlKXtcbiAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoUEhYX1BBUkVOVF9JRClcbiAgfSxcblxuICBpc1BoeFN0aWNreShub2RlKXtcbiAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoUEhYX1NUSUNLWSkgIT09IG51bGxcbiAgfSxcblxuICBmaXJzdFBoeENoaWxkKGVsKXtcbiAgICByZXR1cm4gdGhpcy5pc1BoeENoaWxkKGVsKSA/IGVsIDogdGhpcy5hbGwoZWwsIGBbJHtQSFhfUEFSRU5UX0lEfV1gKVswXVxuICB9LFxuXG4gIGRpc3BhdGNoRXZlbnQodGFyZ2V0LCBldmVudFN0cmluZywgZGV0YWlsID0ge30pe1xuICAgIGxldCBldmVudCA9IG5ldyBDdXN0b21FdmVudChldmVudFN0cmluZywge2J1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGRldGFpbDogZGV0YWlsfSlcbiAgICB0YXJnZXQuZGlzcGF0Y2hFdmVudChldmVudClcbiAgfSxcblxuICBjbG9uZU5vZGUobm9kZSwgaHRtbCl7XG4gICAgaWYodHlwZW9mIChodG1sKSA9PT0gXCJ1bmRlZmluZWRcIil7XG4gICAgICByZXR1cm4gbm9kZS5jbG9uZU5vZGUodHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGNsb25lZCA9IG5vZGUuY2xvbmVOb2RlKGZhbHNlKVxuICAgICAgY2xvbmVkLmlubmVySFRNTCA9IGh0bWxcbiAgICAgIHJldHVybiBjbG9uZWRcbiAgICB9XG4gIH0sXG5cbiAgbWVyZ2VBdHRycyh0YXJnZXQsIHNvdXJjZSwgb3B0cyA9IHt9KXtcbiAgICBsZXQgZXhjbHVkZSA9IG9wdHMuZXhjbHVkZSB8fCBbXVxuICAgIGxldCBpc0lnbm9yZWQgPSBvcHRzLmlzSWdub3JlZFxuICAgIGxldCBzb3VyY2VBdHRycyA9IHNvdXJjZS5hdHRyaWJ1dGVzXG4gICAgZm9yKGxldCBpID0gc291cmNlQXR0cnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pe1xuICAgICAgbGV0IG5hbWUgPSBzb3VyY2VBdHRyc1tpXS5uYW1lXG4gICAgICBpZihleGNsdWRlLmluZGV4T2YobmFtZSkgPCAwKXsgdGFyZ2V0LnNldEF0dHJpYnV0ZShuYW1lLCBzb3VyY2UuZ2V0QXR0cmlidXRlKG5hbWUpKSB9XG4gICAgfVxuXG4gICAgbGV0IHRhcmdldEF0dHJzID0gdGFyZ2V0LmF0dHJpYnV0ZXNcbiAgICBmb3IobGV0IGkgPSB0YXJnZXRBdHRycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7XG4gICAgICBsZXQgbmFtZSA9IHRhcmdldEF0dHJzW2ldLm5hbWVcbiAgICAgIGlmKGlzSWdub3JlZCl7XG4gICAgICAgIGlmKG5hbWUuc3RhcnRzV2l0aChcImRhdGEtXCIpICYmICFzb3VyY2UuaGFzQXR0cmlidXRlKG5hbWUpKXsgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShuYW1lKSB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZighc291cmNlLmhhc0F0dHJpYnV0ZShuYW1lKSl7IHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUobmFtZSkgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXJnZUZvY3VzZWRJbnB1dCh0YXJnZXQsIHNvdXJjZSl7XG4gICAgLy8gc2tpcCBzZWxlY3RzIGJlY2F1c2UgRkYgd2lsbCByZXNldCBoaWdobGlnaHRlZCBpbmRleCBmb3IgYW55IHNldEF0dHJpYnV0ZVxuICAgIGlmKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQpKXsgRE9NLm1lcmdlQXR0cnModGFyZ2V0LCBzb3VyY2UsIHtleGNlcHQ6IFtcInZhbHVlXCJdfSkgfVxuICAgIGlmKHNvdXJjZS5yZWFkT25seSl7XG4gICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKFwicmVhZG9ubHlcIiwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShcInJlYWRvbmx5XCIpXG4gICAgfVxuICB9LFxuXG4gIGhhc1NlbGVjdGlvblJhbmdlKGVsKXtcbiAgICByZXR1cm4gZWwuc2V0U2VsZWN0aW9uUmFuZ2UgJiYgKGVsLnR5cGUgPT09IFwidGV4dFwiIHx8IGVsLnR5cGUgPT09IFwidGV4dGFyZWFcIilcbiAgfSxcblxuICByZXN0b3JlRm9jdXMoZm9jdXNlZCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCl7XG4gICAgaWYoIURPTS5pc1RleHR1YWxJbnB1dChmb2N1c2VkKSl7IHJldHVybiB9XG4gICAgbGV0IHdhc0ZvY3VzZWQgPSBmb2N1c2VkLm1hdGNoZXMoXCI6Zm9jdXNcIilcbiAgICBpZihmb2N1c2VkLnJlYWRPbmx5KXsgZm9jdXNlZC5ibHVyKCkgfVxuICAgIGlmKCF3YXNGb2N1c2VkKXsgZm9jdXNlZC5mb2N1cygpIH1cbiAgICBpZih0aGlzLmhhc1NlbGVjdGlvblJhbmdlKGZvY3VzZWQpKXtcbiAgICAgIGZvY3VzZWQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZClcbiAgICB9XG4gIH0sXG5cbiAgaXNGb3JtSW5wdXQoZWwpeyByZXR1cm4gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWEpJC9pLnRlc3QoZWwudGFnTmFtZSkgJiYgZWwudHlwZSAhPT0gXCJidXR0b25cIiB9LFxuXG4gIHN5bmNBdHRyc1RvUHJvcHMoZWwpe1xuICAgIGlmKGVsIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBDSEVDS0FCTEVfSU5QVVRTLmluZGV4T2YoZWwudHlwZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSA+PSAwKXtcbiAgICAgIGVsLmNoZWNrZWQgPSBlbC5nZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIpICE9PSBudWxsXG4gICAgfVxuICB9LFxuXG4gIGlzVGV4dHVhbElucHV0KGVsKXsgcmV0dXJuIEZPQ1VTQUJMRV9JTlBVVFMuaW5kZXhPZihlbC50eXBlKSA+PSAwIH0sXG5cbiAgaXNOb3dUcmlnZ2VyRm9ybUV4dGVybmFsKGVsLCBwaHhUcmlnZ2VyRXh0ZXJuYWwpe1xuICAgIHJldHVybiBlbC5nZXRBdHRyaWJ1dGUgJiYgZWwuZ2V0QXR0cmlidXRlKHBoeFRyaWdnZXJFeHRlcm5hbCkgIT09IG51bGxcbiAgfSxcblxuICBzeW5jUGVuZGluZ1JlZihmcm9tRWwsIHRvRWwsIGRpc2FibGVXaXRoKXtcbiAgICBsZXQgcmVmID0gZnJvbUVsLmdldEF0dHJpYnV0ZShQSFhfUkVGKVxuICAgIGlmKHJlZiA9PT0gbnVsbCl7IHJldHVybiB0cnVlIH1cbiAgICBsZXQgcmVmU3JjID0gZnJvbUVsLmdldEF0dHJpYnV0ZShQSFhfUkVGX1NSQylcblxuICAgIGlmKERPTS5pc0Zvcm1JbnB1dChmcm9tRWwpIHx8IGZyb21FbC5nZXRBdHRyaWJ1dGUoZGlzYWJsZVdpdGgpICE9PSBudWxsKXtcbiAgICAgIGlmKERPTS5pc1VwbG9hZElucHV0KGZyb21FbCkpeyBET00ubWVyZ2VBdHRycyhmcm9tRWwsIHRvRWwsIHtpc0lnbm9yZWQ6IHRydWV9KSB9XG4gICAgICBET00ucHV0UHJpdmF0ZShmcm9tRWwsIFBIWF9SRUYsIHRvRWwpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgUEhYX0VWRU5UX0NMQVNTRVMuZm9yRWFjaChjbGFzc05hbWUgPT4ge1xuICAgICAgICBmcm9tRWwuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkgJiYgdG9FbC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSlcbiAgICAgIH0pXG4gICAgICB0b0VsLnNldEF0dHJpYnV0ZShQSFhfUkVGLCByZWYpXG4gICAgICB0b0VsLnNldEF0dHJpYnV0ZShQSFhfUkVGX1NSQywgcmVmU3JjKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH0sXG5cbiAgY2xlYW5DaGlsZE5vZGVzKGNvbnRhaW5lciwgcGh4VXBkYXRlKXtcbiAgICBpZihET00uaXNQaHhVcGRhdGUoY29udGFpbmVyLCBwaHhVcGRhdGUsIFtcImFwcGVuZFwiLCBcInByZXBlbmRcIl0pKXtcbiAgICAgIGxldCB0b1JlbW92ZSA9IFtdXG4gICAgICBjb250YWluZXIuY2hpbGROb2Rlcy5mb3JFYWNoKGNoaWxkTm9kZSA9PiB7XG4gICAgICAgIGlmKCFjaGlsZE5vZGUuaWQpe1xuICAgICAgICAgIC8vIFNraXAgd2FybmluZyBpZiBpdCdzIGFuIGVtcHR5IHRleHQgbm9kZSAoZS5nLiBhIG5ldy1saW5lKVxuICAgICAgICAgIGxldCBpc0VtcHR5VGV4dE5vZGUgPSBjaGlsZE5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkTm9kZS5ub2RlVmFsdWUudHJpbSgpID09PSBcIlwiXG4gICAgICAgICAgaWYoIWlzRW1wdHlUZXh0Tm9kZSl7XG4gICAgICAgICAgICBsb2dFcnJvcihcIm9ubHkgSFRNTCBlbGVtZW50IHRhZ3Mgd2l0aCBhbiBpZCBhcmUgYWxsb3dlZCBpbnNpZGUgY29udGFpbmVycyB3aXRoIHBoeC11cGRhdGUuXFxuXFxuXCIgK1xuICAgICAgICAgICAgICBgcmVtb3ZpbmcgaWxsZWdhbCBub2RlOiBcIiR7KGNoaWxkTm9kZS5vdXRlckhUTUwgfHwgY2hpbGROb2RlLm5vZGVWYWx1ZSkudHJpbSgpfVwiXFxuXFxuYClcbiAgICAgICAgICB9XG4gICAgICAgICAgdG9SZW1vdmUucHVzaChjaGlsZE5vZGUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICB0b1JlbW92ZS5mb3JFYWNoKGNoaWxkTm9kZSA9PiBjaGlsZE5vZGUucmVtb3ZlKCkpXG4gICAgfVxuICB9LFxuXG4gIHJlcGxhY2VSb290Q29udGFpbmVyKGNvbnRhaW5lciwgdGFnTmFtZSwgYXR0cnMpe1xuICAgIGxldCByZXRhaW5lZEF0dHJzID0gbmV3IFNldChbXCJpZFwiLCBQSFhfU0VTU0lPTiwgUEhYX1NUQVRJQywgUEhYX01BSU4sIFBIWF9ST09UX0lEXSlcbiAgICBpZihjb250YWluZXIudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YWdOYW1lLnRvTG93ZXJDYXNlKCkpe1xuICAgICAgQXJyYXkuZnJvbShjb250YWluZXIuYXR0cmlidXRlcylcbiAgICAgICAgLmZpbHRlcihhdHRyID0+ICFyZXRhaW5lZEF0dHJzLmhhcyhhdHRyLm5hbWUudG9Mb3dlckNhc2UoKSkpXG4gICAgICAgIC5mb3JFYWNoKGF0dHIgPT4gY29udGFpbmVyLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5hbWUpKVxuXG4gICAgICBPYmplY3Qua2V5cyhhdHRycylcbiAgICAgICAgLmZpbHRlcihuYW1lID0+ICFyZXRhaW5lZEF0dHJzLmhhcyhuYW1lLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAuZm9yRWFjaChhdHRyID0+IGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoYXR0ciwgYXR0cnNbYXR0cl0pKVxuXG4gICAgICByZXR1cm4gY29udGFpbmVyXG5cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG5ld0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSlcbiAgICAgIE9iamVjdC5rZXlzKGF0dHJzKS5mb3JFYWNoKGF0dHIgPT4gbmV3Q29udGFpbmVyLnNldEF0dHJpYnV0ZShhdHRyLCBhdHRyc1thdHRyXSkpXG4gICAgICByZXRhaW5lZEF0dHJzLmZvckVhY2goYXR0ciA9PiBuZXdDb250YWluZXIuc2V0QXR0cmlidXRlKGF0dHIsIGNvbnRhaW5lci5nZXRBdHRyaWJ1dGUoYXR0cikpKVxuICAgICAgbmV3Q29udGFpbmVyLmlubmVySFRNTCA9IGNvbnRhaW5lci5pbm5lckhUTUxcbiAgICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChuZXdDb250YWluZXIpXG4gICAgICByZXR1cm4gbmV3Q29udGFpbmVyXG4gICAgfVxuICB9LFxuXG4gIGdldFN0aWNreShlbCwgbmFtZSwgZGVmYXVsdFZhbCl7XG4gICAgbGV0IG9wID0gKERPTS5wcml2YXRlKGVsLCBcInN0aWNreVwiKSB8fCBbXSkuZmluZCgoW2V4aXN0aW5nTmFtZSwgXSkgPT4gbmFtZSA9PT0gZXhpc3RpbmdOYW1lKVxuICAgIGlmKG9wKXtcbiAgICAgIGxldCBbX25hbWUsIF9vcCwgc3Rhc2hlZFJlc3VsdF0gPSBvcFxuICAgICAgcmV0dXJuIHN0YXNoZWRSZXN1bHRcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHR5cGVvZihkZWZhdWx0VmFsKSA9PT0gXCJmdW5jdGlvblwiID8gZGVmYXVsdFZhbCgpIDogZGVmYXVsdFZhbFxuICAgIH1cbiAgfSxcblxuICBkZWxldGVTdGlja3koZWwsIG5hbWUpe1xuICAgIHRoaXMudXBkYXRlUHJpdmF0ZShlbCwgXCJzdGlja3lcIiwgW10sIG9wcyA9PiB7XG4gICAgICByZXR1cm4gb3BzLmZpbHRlcigoW2V4aXN0aW5nTmFtZSwgX10pID0+IGV4aXN0aW5nTmFtZSAhPT0gbmFtZSlcbiAgICB9KVxuICB9LFxuXG4gIHB1dFN0aWNreShlbCwgbmFtZSwgb3Ape1xuICAgIGxldCBzdGFzaGVkUmVzdWx0ID0gb3AoZWwpXG4gICAgdGhpcy51cGRhdGVQcml2YXRlKGVsLCBcInN0aWNreVwiLCBbXSwgb3BzID0+IHtcbiAgICAgIGxldCBleGlzdGluZ0luZGV4ID0gb3BzLmZpbmRJbmRleCgoW2V4aXN0aW5nTmFtZSwgXSkgPT4gbmFtZSA9PT0gZXhpc3RpbmdOYW1lKVxuICAgICAgaWYoZXhpc3RpbmdJbmRleCA+PSAwKXtcbiAgICAgICAgb3BzW2V4aXN0aW5nSW5kZXhdID0gW25hbWUsIG9wLCBzdGFzaGVkUmVzdWx0XVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3BzLnB1c2goW25hbWUsIG9wLCBzdGFzaGVkUmVzdWx0XSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHNcbiAgICB9KVxuICB9LFxuXG4gIGFwcGx5U3RpY2t5T3BlcmF0aW9ucyhlbCl7XG4gICAgbGV0IG9wcyA9IERPTS5wcml2YXRlKGVsLCBcInN0aWNreVwiKVxuICAgIGlmKCFvcHMpeyByZXR1cm4gfVxuXG4gICAgb3BzLmZvckVhY2goKFtuYW1lLCBvcCwgX3N0YXNoZWRdKSA9PiB0aGlzLnB1dFN0aWNreShlbCwgbmFtZSwgb3ApKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IERPTVxuIiwgImltcG9ydCB7XG4gIFBIWF9BQ1RJVkVfRU5UUllfUkVGUyxcbiAgUEhYX0xJVkVfRklMRV9VUERBVEVELFxuICBQSFhfUFJFRkxJR0hURURfUkVGU1xufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQge1xuICBjaGFubmVsVXBsb2FkZXIsXG4gIGxvZ0Vycm9yXG59IGZyb20gXCIuL3V0aWxzXCJcblxuaW1wb3J0IExpdmVVcGxvYWRlciBmcm9tIFwiLi9saXZlX3VwbG9hZGVyXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXBsb2FkRW50cnkge1xuICBzdGF0aWMgaXNBY3RpdmUoZmlsZUVsLCBmaWxlKXtcbiAgICBsZXQgaXNOZXcgPSBmaWxlLl9waHhSZWYgPT09IHVuZGVmaW5lZFxuICAgIGxldCBhY3RpdmVSZWZzID0gZmlsZUVsLmdldEF0dHJpYnV0ZShQSFhfQUNUSVZFX0VOVFJZX1JFRlMpLnNwbGl0KFwiLFwiKVxuICAgIGxldCBpc0FjdGl2ZSA9IGFjdGl2ZVJlZnMuaW5kZXhPZihMaXZlVXBsb2FkZXIuZ2VuRmlsZVJlZihmaWxlKSkgPj0gMFxuICAgIHJldHVybiBmaWxlLnNpemUgPiAwICYmIChpc05ldyB8fCBpc0FjdGl2ZSlcbiAgfVxuXG4gIHN0YXRpYyBpc1ByZWZsaWdodGVkKGZpbGVFbCwgZmlsZSl7XG4gICAgbGV0IHByZWZsaWdodGVkUmVmcyA9IGZpbGVFbC5nZXRBdHRyaWJ1dGUoUEhYX1BSRUZMSUdIVEVEX1JFRlMpLnNwbGl0KFwiLFwiKVxuICAgIGxldCBpc1ByZWZsaWdodGVkID0gcHJlZmxpZ2h0ZWRSZWZzLmluZGV4T2YoTGl2ZVVwbG9hZGVyLmdlbkZpbGVSZWYoZmlsZSkpID49IDBcbiAgICByZXR1cm4gaXNQcmVmbGlnaHRlZCAmJiB0aGlzLmlzQWN0aXZlKGZpbGVFbCwgZmlsZSlcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGZpbGVFbCwgZmlsZSwgdmlldyl7XG4gICAgdGhpcy5yZWYgPSBMaXZlVXBsb2FkZXIuZ2VuRmlsZVJlZihmaWxlKVxuICAgIHRoaXMuZmlsZUVsID0gZmlsZUVsXG4gICAgdGhpcy5maWxlID0gZmlsZVxuICAgIHRoaXMudmlldyA9IHZpZXdcbiAgICB0aGlzLm1ldGEgPSBudWxsXG4gICAgdGhpcy5faXNDYW5jZWxsZWQgPSBmYWxzZVxuICAgIHRoaXMuX2lzRG9uZSA9IGZhbHNlXG4gICAgdGhpcy5fcHJvZ3Jlc3MgPSAwXG4gICAgdGhpcy5fbGFzdFByb2dyZXNzU2VudCA9IC0xXG4gICAgdGhpcy5fb25Eb25lID0gZnVuY3Rpb24gKCl7IH1cbiAgICB0aGlzLl9vbkVsVXBkYXRlZCA9IHRoaXMub25FbFVwZGF0ZWQuYmluZCh0aGlzKVxuICAgIHRoaXMuZmlsZUVsLmFkZEV2ZW50TGlzdGVuZXIoUEhYX0xJVkVfRklMRV9VUERBVEVELCB0aGlzLl9vbkVsVXBkYXRlZClcbiAgfVxuXG4gIG1ldGFkYXRhKCl7IHJldHVybiB0aGlzLm1ldGEgfVxuXG4gIHByb2dyZXNzKHByb2dyZXNzKXtcbiAgICB0aGlzLl9wcm9ncmVzcyA9IE1hdGguZmxvb3IocHJvZ3Jlc3MpXG4gICAgaWYodGhpcy5fcHJvZ3Jlc3MgPiB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50KXtcbiAgICAgIGlmKHRoaXMuX3Byb2dyZXNzID49IDEwMCl7XG4gICAgICAgIHRoaXMuX3Byb2dyZXNzID0gMTAwXG4gICAgICAgIHRoaXMuX2xhc3RQcm9ncmVzc1NlbnQgPSAxMDBcbiAgICAgICAgdGhpcy5faXNEb25lID0gdHJ1ZVxuICAgICAgICB0aGlzLnZpZXcucHVzaEZpbGVQcm9ncmVzcyh0aGlzLmZpbGVFbCwgdGhpcy5yZWYsIDEwMCwgKCkgPT4ge1xuICAgICAgICAgIExpdmVVcGxvYWRlci51bnRyYWNrRmlsZSh0aGlzLmZpbGVFbCwgdGhpcy5maWxlKVxuICAgICAgICAgIHRoaXMuX29uRG9uZSgpXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gdGhpcy5fcHJvZ3Jlc3NcbiAgICAgICAgdGhpcy52aWV3LnB1c2hGaWxlUHJvZ3Jlc3ModGhpcy5maWxlRWwsIHRoaXMucmVmLCB0aGlzLl9wcm9ncmVzcylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjYW5jZWwoKXtcbiAgICB0aGlzLl9pc0NhbmNlbGxlZCA9IHRydWVcbiAgICB0aGlzLl9pc0RvbmUgPSB0cnVlXG4gICAgdGhpcy5fb25Eb25lKClcbiAgfVxuXG4gIGlzRG9uZSgpeyByZXR1cm4gdGhpcy5faXNEb25lIH1cblxuICBlcnJvcihyZWFzb24gPSBcImZhaWxlZFwiKXtcbiAgICB0aGlzLnZpZXcucHVzaEZpbGVQcm9ncmVzcyh0aGlzLmZpbGVFbCwgdGhpcy5yZWYsIHtlcnJvcjogcmVhc29ufSlcbiAgICBMaXZlVXBsb2FkZXIuY2xlYXJGaWxlcyh0aGlzLmZpbGVFbClcbiAgfVxuXG4gIC8vcHJpdmF0ZVxuXG4gIG9uRG9uZShjYWxsYmFjayl7XG4gICAgdGhpcy5fb25Eb25lID0gKCkgPT4ge1xuICAgICAgdGhpcy5maWxlRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihQSFhfTElWRV9GSUxFX1VQREFURUQsIHRoaXMuX29uRWxVcGRhdGVkKVxuICAgICAgY2FsbGJhY2soKVxuICAgIH1cbiAgfVxuXG4gIG9uRWxVcGRhdGVkKCl7XG4gICAgbGV0IGFjdGl2ZVJlZnMgPSB0aGlzLmZpbGVFbC5nZXRBdHRyaWJ1dGUoUEhYX0FDVElWRV9FTlRSWV9SRUZTKS5zcGxpdChcIixcIilcbiAgICBpZihhY3RpdmVSZWZzLmluZGV4T2YodGhpcy5yZWYpID09PSAtMSl7IHRoaXMuY2FuY2VsKCkgfVxuICB9XG5cbiAgdG9QcmVmbGlnaHRQYXlsb2FkKCl7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhc3RfbW9kaWZpZWQ6IHRoaXMuZmlsZS5sYXN0TW9kaWZpZWQsXG4gICAgICBuYW1lOiB0aGlzLmZpbGUubmFtZSxcbiAgICAgIHNpemU6IHRoaXMuZmlsZS5zaXplLFxuICAgICAgdHlwZTogdGhpcy5maWxlLnR5cGUsXG4gICAgICByZWY6IHRoaXMucmVmXG4gICAgfVxuICB9XG5cbiAgdXBsb2FkZXIodXBsb2FkZXJzKXtcbiAgICBpZih0aGlzLm1ldGEudXBsb2FkZXIpe1xuICAgICAgbGV0IGNhbGxiYWNrID0gdXBsb2FkZXJzW3RoaXMubWV0YS51cGxvYWRlcl0gfHwgbG9nRXJyb3IoYG5vIHVwbG9hZGVyIGNvbmZpZ3VyZWQgZm9yICR7dGhpcy5tZXRhLnVwbG9hZGVyfWApXG4gICAgICByZXR1cm4ge25hbWU6IHRoaXMubWV0YS51cGxvYWRlciwgY2FsbGJhY2s6IGNhbGxiYWNrfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge25hbWU6IFwiY2hhbm5lbFwiLCBjYWxsYmFjazogY2hhbm5lbFVwbG9hZGVyfVxuICAgIH1cbiAgfVxuXG4gIHppcFBvc3RGbGlnaHQocmVzcCl7XG4gICAgdGhpcy5tZXRhID0gcmVzcC5lbnRyaWVzW3RoaXMucmVmXVxuICAgIGlmKCF0aGlzLm1ldGEpeyBsb2dFcnJvcihgbm8gcHJlZmxpZ2h0IHVwbG9hZCByZXNwb25zZSByZXR1cm5lZCB3aXRoIHJlZiAke3RoaXMucmVmfWAsIHtpbnB1dDogdGhpcy5maWxlRWwsIHJlc3BvbnNlOiByZXNwfSkgfVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgUEhYX0RPTkVfUkVGUyxcbiAgUEhYX1BSRUZMSUdIVEVEX1JFRlMsXG4gIFBIWF9VUExPQURfUkVGXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG59IGZyb20gXCIuL3V0aWxzXCJcblxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIlxuaW1wb3J0IFVwbG9hZEVudHJ5IGZyb20gXCIuL3VwbG9hZF9lbnRyeVwiXG5cbmxldCBsaXZlVXBsb2FkZXJGaWxlUmVmID0gMFxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXZlVXBsb2FkZXIge1xuICBzdGF0aWMgZ2VuRmlsZVJlZihmaWxlKXtcbiAgICBsZXQgcmVmID0gZmlsZS5fcGh4UmVmXG4gICAgaWYocmVmICE9PSB1bmRlZmluZWQpe1xuICAgICAgcmV0dXJuIHJlZlxuICAgIH0gZWxzZSB7XG4gICAgICBmaWxlLl9waHhSZWYgPSAobGl2ZVVwbG9hZGVyRmlsZVJlZisrKS50b1N0cmluZygpXG4gICAgICByZXR1cm4gZmlsZS5fcGh4UmVmXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldEVudHJ5RGF0YVVSTChpbnB1dEVsLCByZWYsIGNhbGxiYWNrKXtcbiAgICBsZXQgZmlsZSA9IHRoaXMuYWN0aXZlRmlsZXMoaW5wdXRFbCkuZmluZChmaWxlID0+IHRoaXMuZ2VuRmlsZVJlZihmaWxlKSA9PT0gcmVmKVxuICAgIGNhbGxiYWNrKFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSkpXG4gIH1cblxuICBzdGF0aWMgaGFzVXBsb2Fkc0luUHJvZ3Jlc3MoZm9ybUVsKXtcbiAgICBsZXQgYWN0aXZlID0gMFxuICAgIERPTS5maW5kVXBsb2FkSW5wdXRzKGZvcm1FbCkuZm9yRWFjaChpbnB1dCA9PiB7XG4gICAgICBpZihpbnB1dC5nZXRBdHRyaWJ1dGUoUEhYX1BSRUZMSUdIVEVEX1JFRlMpICE9PSBpbnB1dC5nZXRBdHRyaWJ1dGUoUEhYX0RPTkVfUkVGUykpe1xuICAgICAgICBhY3RpdmUrK1xuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIGFjdGl2ZSA+IDBcbiAgfVxuXG4gIHN0YXRpYyBzZXJpYWxpemVVcGxvYWRzKGlucHV0RWwpe1xuICAgIGxldCBmaWxlcyA9IHRoaXMuYWN0aXZlRmlsZXMoaW5wdXRFbClcbiAgICBsZXQgZmlsZURhdGEgPSB7fVxuICAgIGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICBsZXQgZW50cnkgPSB7cGF0aDogaW5wdXRFbC5uYW1lfVxuICAgICAgbGV0IHVwbG9hZFJlZiA9IGlucHV0RWwuZ2V0QXR0cmlidXRlKFBIWF9VUExPQURfUkVGKVxuICAgICAgZmlsZURhdGFbdXBsb2FkUmVmXSA9IGZpbGVEYXRhW3VwbG9hZFJlZl0gfHwgW11cbiAgICAgIGVudHJ5LnJlZiA9IHRoaXMuZ2VuRmlsZVJlZihmaWxlKVxuICAgICAgZW50cnkubmFtZSA9IGZpbGUubmFtZSB8fCBlbnRyeS5yZWZcbiAgICAgIGVudHJ5LnR5cGUgPSBmaWxlLnR5cGVcbiAgICAgIGVudHJ5LnNpemUgPSBmaWxlLnNpemVcbiAgICAgIGZpbGVEYXRhW3VwbG9hZFJlZl0ucHVzaChlbnRyeSlcbiAgICB9KVxuICAgIHJldHVybiBmaWxlRGF0YVxuICB9XG5cbiAgc3RhdGljIGNsZWFyRmlsZXMoaW5wdXRFbCl7XG4gICAgaW5wdXRFbC52YWx1ZSA9IG51bGxcbiAgICBpbnB1dEVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRilcbiAgICBET00ucHV0UHJpdmF0ZShpbnB1dEVsLCBcImZpbGVzXCIsIFtdKVxuICB9XG5cbiAgc3RhdGljIHVudHJhY2tGaWxlKGlucHV0RWwsIGZpbGUpe1xuICAgIERPTS5wdXRQcml2YXRlKGlucHV0RWwsIFwiZmlsZXNcIiwgRE9NLnByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiKS5maWx0ZXIoZiA9PiAhT2JqZWN0LmlzKGYsIGZpbGUpKSlcbiAgfVxuXG4gIHN0YXRpYyB0cmFja0ZpbGVzKGlucHV0RWwsIGZpbGVzKXtcbiAgICBpZihpbnB1dEVsLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpICE9PSBudWxsKXtcbiAgICAgIGxldCBuZXdGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+ICF0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpLmZpbmQoZiA9PiBPYmplY3QuaXMoZiwgZmlsZSkpKVxuICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpLmNvbmNhdChuZXdGaWxlcykpXG4gICAgICBpbnB1dEVsLnZhbHVlID0gbnVsbFxuICAgIH0gZWxzZSB7XG4gICAgICBET00ucHV0UHJpdmF0ZShpbnB1dEVsLCBcImZpbGVzXCIsIGZpbGVzKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhY3RpdmVGaWxlSW5wdXRzKGZvcm1FbCl7XG4gICAgbGV0IGZpbGVJbnB1dHMgPSBET00uZmluZFVwbG9hZElucHV0cyhmb3JtRWwpXG4gICAgcmV0dXJuIEFycmF5LmZyb20oZmlsZUlucHV0cykuZmlsdGVyKGVsID0+IGVsLmZpbGVzICYmIHRoaXMuYWN0aXZlRmlsZXMoZWwpLmxlbmd0aCA+IDApXG4gIH1cblxuICBzdGF0aWMgYWN0aXZlRmlsZXMoaW5wdXQpe1xuICAgIHJldHVybiAoRE9NLnByaXZhdGUoaW5wdXQsIFwiZmlsZXNcIikgfHwgW10pLmZpbHRlcihmID0+IFVwbG9hZEVudHJ5LmlzQWN0aXZlKGlucHV0LCBmKSlcbiAgfVxuXG4gIHN0YXRpYyBpbnB1dHNBd2FpdGluZ1ByZWZsaWdodChmb3JtRWwpe1xuICAgIGxldCBmaWxlSW5wdXRzID0gRE9NLmZpbmRVcGxvYWRJbnB1dHMoZm9ybUVsKVxuICAgIHJldHVybiBBcnJheS5mcm9tKGZpbGVJbnB1dHMpLmZpbHRlcihpbnB1dCA9PiB0aGlzLmZpbGVzQXdhaXRpbmdQcmVmbGlnaHQoaW5wdXQpLmxlbmd0aCA+IDApXG4gIH1cblxuICBzdGF0aWMgZmlsZXNBd2FpdGluZ1ByZWZsaWdodChpbnB1dCl7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlRmlsZXMoaW5wdXQpLmZpbHRlcihmID0+ICFVcGxvYWRFbnRyeS5pc1ByZWZsaWdodGVkKGlucHV0LCBmKSlcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGlucHV0RWwsIHZpZXcsIG9uQ29tcGxldGUpe1xuICAgIHRoaXMudmlldyA9IHZpZXdcbiAgICB0aGlzLm9uQ29tcGxldGUgPSBvbkNvbXBsZXRlXG4gICAgdGhpcy5fZW50cmllcyA9XG4gICAgICBBcnJheS5mcm9tKExpdmVVcGxvYWRlci5maWxlc0F3YWl0aW5nUHJlZmxpZ2h0KGlucHV0RWwpIHx8IFtdKVxuICAgICAgICAubWFwKGZpbGUgPT4gbmV3IFVwbG9hZEVudHJ5KGlucHV0RWwsIGZpbGUsIHZpZXcpKVxuXG4gICAgdGhpcy5udW1FbnRyaWVzSW5Qcm9ncmVzcyA9IHRoaXMuX2VudHJpZXMubGVuZ3RoXG4gIH1cblxuICBlbnRyaWVzKCl7IHJldHVybiB0aGlzLl9lbnRyaWVzIH1cblxuICBpbml0QWRhcHRlclVwbG9hZChyZXNwLCBvbkVycm9yLCBsaXZlU29ja2V0KXtcbiAgICB0aGlzLl9lbnRyaWVzID1cbiAgICAgIHRoaXMuX2VudHJpZXMubWFwKGVudHJ5ID0+IHtcbiAgICAgICAgZW50cnkuemlwUG9zdEZsaWdodChyZXNwKVxuICAgICAgICBlbnRyeS5vbkRvbmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MtLVxuICAgICAgICAgIGlmKHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MgPT09IDApeyB0aGlzLm9uQ29tcGxldGUoKSB9XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBlbnRyeVxuICAgICAgfSlcblxuICAgIGxldCBncm91cGVkRW50cmllcyA9IHRoaXMuX2VudHJpZXMucmVkdWNlKChhY2MsIGVudHJ5KSA9PiB7XG4gICAgICBsZXQge25hbWUsIGNhbGxiYWNrfSA9IGVudHJ5LnVwbG9hZGVyKGxpdmVTb2NrZXQudXBsb2FkZXJzKVxuICAgICAgYWNjW25hbWVdID0gYWNjW25hbWVdIHx8IHtjYWxsYmFjazogY2FsbGJhY2ssIGVudHJpZXM6IFtdfVxuICAgICAgYWNjW25hbWVdLmVudHJpZXMucHVzaChlbnRyeSlcbiAgICAgIHJldHVybiBhY2NcbiAgICB9LCB7fSlcblxuICAgIGZvcihsZXQgbmFtZSBpbiBncm91cGVkRW50cmllcyl7XG4gICAgICBsZXQge2NhbGxiYWNrLCBlbnRyaWVzfSA9IGdyb3VwZWRFbnRyaWVzW25hbWVdXG4gICAgICBjYWxsYmFjayhlbnRyaWVzLCBvbkVycm9yLCByZXNwLCBsaXZlU29ja2V0KVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7XG4gIFBIWF9BQ1RJVkVfRU5UUllfUkVGUyxcbiAgUEhYX0xJVkVfRklMRV9VUERBVEVELFxuICBQSFhfUFJFRkxJR0hURURfUkVGUyxcbiAgUEhYX1VQTE9BRF9SRUZcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IExpdmVVcGxvYWRlciBmcm9tIFwiLi9saXZlX3VwbG9hZGVyXCJcblxubGV0IEhvb2tzID0ge1xuICBMaXZlRmlsZVVwbG9hZDoge1xuICAgIGFjdGl2ZVJlZnMoKXsgcmV0dXJuIHRoaXMuZWwuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUykgfSxcblxuICAgIHByZWZsaWdodGVkUmVmcygpeyByZXR1cm4gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX1BSRUZMSUdIVEVEX1JFRlMpIH0sXG5cbiAgICBtb3VudGVkKCl7IHRoaXMucHJlZmxpZ2h0ZWRXYXMgPSB0aGlzLnByZWZsaWdodGVkUmVmcygpIH0sXG5cbiAgICB1cGRhdGVkKCl7XG4gICAgICBsZXQgbmV3UHJlZmxpZ2h0cyA9IHRoaXMucHJlZmxpZ2h0ZWRSZWZzKClcbiAgICAgIGlmKHRoaXMucHJlZmxpZ2h0ZWRXYXMgIT09IG5ld1ByZWZsaWdodHMpe1xuICAgICAgICB0aGlzLnByZWZsaWdodGVkV2FzID0gbmV3UHJlZmxpZ2h0c1xuICAgICAgICBpZihuZXdQcmVmbGlnaHRzID09PSBcIlwiKXtcbiAgICAgICAgICB0aGlzLl9fdmlldy5jYW5jZWxTdWJtaXQodGhpcy5lbC5mb3JtKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmKHRoaXMuYWN0aXZlUmVmcygpID09PSBcIlwiKXsgdGhpcy5lbC52YWx1ZSA9IG51bGwgfVxuICAgICAgdGhpcy5lbC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChQSFhfTElWRV9GSUxFX1VQREFURUQpKVxuICAgIH1cbiAgfSxcblxuICBMaXZlSW1nUHJldmlldzoge1xuICAgIG1vdW50ZWQoKXtcbiAgICAgIHRoaXMucmVmID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1lbnRyeS1yZWZcIilcbiAgICAgIHRoaXMuaW5wdXRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZWwuZ2V0QXR0cmlidXRlKFBIWF9VUExPQURfUkVGKSlcbiAgICAgIExpdmVVcGxvYWRlci5nZXRFbnRyeURhdGFVUkwodGhpcy5pbnB1dEVsLCB0aGlzLnJlZiwgdXJsID0+IHtcbiAgICAgICAgdGhpcy51cmwgPSB1cmxcbiAgICAgICAgdGhpcy5lbC5zcmMgPSB1cmxcbiAgICAgIH0pXG4gICAgfSxcbiAgICBkZXN0cm95ZWQoKXtcbiAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodGhpcy51cmwpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEhvb2tzXG4iLCAiaW1wb3J0IHtcbiAgbWF5YmVcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbVwiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERPTVBvc3RNb3JwaFJlc3RvcmVyIHtcbiAgY29uc3RydWN0b3IoY29udGFpbmVyQmVmb3JlLCBjb250YWluZXJBZnRlciwgdXBkYXRlVHlwZSl7XG4gICAgbGV0IGlkc0JlZm9yZSA9IG5ldyBTZXQoKVxuICAgIGxldCBpZHNBZnRlciA9IG5ldyBTZXQoWy4uLmNvbnRhaW5lckFmdGVyLmNoaWxkcmVuXS5tYXAoY2hpbGQgPT4gY2hpbGQuaWQpKVxuXG4gICAgbGV0IGVsZW1lbnRzVG9Nb2RpZnkgPSBbXVxuXG4gICAgQXJyYXkuZnJvbShjb250YWluZXJCZWZvcmUuY2hpbGRyZW4pLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgaWYoY2hpbGQuaWQpeyAvLyBhbGwgb2Ygb3VyIGNoaWxkcmVuIHNob3VsZCBiZSBlbGVtZW50cyB3aXRoIGlkc1xuICAgICAgICBpZHNCZWZvcmUuYWRkKGNoaWxkLmlkKVxuICAgICAgICBpZihpZHNBZnRlci5oYXMoY2hpbGQuaWQpKXtcbiAgICAgICAgICBsZXQgcHJldmlvdXNFbGVtZW50SWQgPSBjaGlsZC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nICYmIGNoaWxkLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuaWRcbiAgICAgICAgICBlbGVtZW50c1RvTW9kaWZ5LnB1c2goe2VsZW1lbnRJZDogY2hpbGQuaWQsIHByZXZpb3VzRWxlbWVudElkOiBwcmV2aW91c0VsZW1lbnRJZH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpcy5jb250YWluZXJJZCA9IGNvbnRhaW5lckFmdGVyLmlkXG4gICAgdGhpcy51cGRhdGVUeXBlID0gdXBkYXRlVHlwZVxuICAgIHRoaXMuZWxlbWVudHNUb01vZGlmeSA9IGVsZW1lbnRzVG9Nb2RpZnlcbiAgICB0aGlzLmVsZW1lbnRJZHNUb0FkZCA9IFsuLi5pZHNBZnRlcl0uZmlsdGVyKGlkID0+ICFpZHNCZWZvcmUuaGFzKGlkKSlcbiAgfVxuXG4gIC8vIFdlIGRvIHRoZSBmb2xsb3dpbmcgdG8gb3B0aW1pemUgYXBwZW5kL3ByZXBlbmQgb3BlcmF0aW9uczpcbiAgLy8gICAxKSBUcmFjayBpZHMgb2YgbW9kaWZpZWQgZWxlbWVudHMgJiBvZiBuZXcgZWxlbWVudHNcbiAgLy8gICAyKSBBbGwgdGhlIG1vZGlmaWVkIGVsZW1lbnRzIGFyZSBwdXQgYmFjayBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiBpbiB0aGUgRE9NIHRyZWVcbiAgLy8gICAgICBieSBzdG9yaW5nIHRoZSBpZCBvZiB0aGVpciBwcmV2aW91cyBzaWJsaW5nXG4gIC8vICAgMykgTmV3IGVsZW1lbnRzIGFyZSBnb2luZyB0byBiZSBwdXQgaW4gdGhlIHJpZ2h0IHBsYWNlIGJ5IG1vcnBoZG9tIGR1cmluZyBhcHBlbmQuXG4gIC8vICAgICAgRm9yIHByZXBlbmQsIHdlIG1vdmUgdGhlbSB0byB0aGUgZmlyc3QgcG9zaXRpb24gaW4gdGhlIGNvbnRhaW5lclxuICBwZXJmb3JtKCl7XG4gICAgbGV0IGNvbnRhaW5lciA9IERPTS5ieUlkKHRoaXMuY29udGFpbmVySWQpXG4gICAgdGhpcy5lbGVtZW50c1RvTW9kaWZ5LmZvckVhY2goZWxlbWVudFRvTW9kaWZ5ID0+IHtcbiAgICAgIGlmKGVsZW1lbnRUb01vZGlmeS5wcmV2aW91c0VsZW1lbnRJZCl7XG4gICAgICAgIG1heWJlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5wcmV2aW91c0VsZW1lbnRJZCksIHByZXZpb3VzRWxlbSA9PiB7XG4gICAgICAgICAgbWF5YmUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudFRvTW9kaWZ5LmVsZW1lbnRJZCksIGVsZW0gPT4ge1xuICAgICAgICAgICAgbGV0IGlzSW5SaWdodFBsYWNlID0gZWxlbS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nICYmIGVsZW0ucHJldmlvdXNFbGVtZW50U2libGluZy5pZCA9PSBwcmV2aW91c0VsZW0uaWRcbiAgICAgICAgICAgIGlmKCFpc0luUmlnaHRQbGFjZSl7XG4gICAgICAgICAgICAgIHByZXZpb3VzRWxlbS5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmVuZFwiLCBlbGVtKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBjb250YWluZXJcbiAgICAgICAgbWF5YmUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudFRvTW9kaWZ5LmVsZW1lbnRJZCksIGVsZW0gPT4ge1xuICAgICAgICAgIGxldCBpc0luUmlnaHRQbGFjZSA9IGVsZW0ucHJldmlvdXNFbGVtZW50U2libGluZyA9PSBudWxsXG4gICAgICAgICAgaWYoIWlzSW5SaWdodFBsYWNlKXtcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmJlZ2luXCIsIGVsZW0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBpZih0aGlzLnVwZGF0ZVR5cGUgPT0gXCJwcmVwZW5kXCIpe1xuICAgICAgdGhpcy5lbGVtZW50SWRzVG9BZGQucmV2ZXJzZSgpLmZvckVhY2goZWxlbUlkID0+IHtcbiAgICAgICAgbWF5YmUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbUlkKSwgZWxlbSA9PiBjb250YWluZXIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJiZWdpblwiLCBlbGVtKSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG4iLCAidmFyIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgPSAxMTtcblxuZnVuY3Rpb24gbW9ycGhBdHRycyhmcm9tTm9kZSwgdG9Ob2RlKSB7XG4gICAgdmFyIHRvTm9kZUF0dHJzID0gdG9Ob2RlLmF0dHJpYnV0ZXM7XG4gICAgdmFyIGF0dHI7XG4gICAgdmFyIGF0dHJOYW1lO1xuICAgIHZhciBhdHRyTmFtZXNwYWNlVVJJO1xuICAgIHZhciBhdHRyVmFsdWU7XG4gICAgdmFyIGZyb21WYWx1ZTtcblxuICAgIC8vIGRvY3VtZW50LWZyYWdtZW50cyBkb250IGhhdmUgYXR0cmlidXRlcyBzbyBsZXRzIG5vdCBkbyBhbnl0aGluZ1xuICAgIGlmICh0b05vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgfHwgZnJvbU5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgYXR0cmlidXRlcyBvbiBvcmlnaW5hbCBET00gZWxlbWVudFxuICAgIGZvciAodmFyIGkgPSB0b05vZGVBdHRycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBhdHRyID0gdG9Ob2RlQXR0cnNbaV07XG4gICAgICAgIGF0dHJOYW1lID0gYXR0ci5uYW1lO1xuICAgICAgICBhdHRyTmFtZXNwYWNlVVJJID0gYXR0ci5uYW1lc3BhY2VVUkk7XG4gICAgICAgIGF0dHJWYWx1ZSA9IGF0dHIudmFsdWU7XG5cbiAgICAgICAgaWYgKGF0dHJOYW1lc3BhY2VVUkkpIHtcbiAgICAgICAgICAgIGF0dHJOYW1lID0gYXR0ci5sb2NhbE5hbWUgfHwgYXR0ck5hbWU7XG4gICAgICAgICAgICBmcm9tVmFsdWUgPSBmcm9tTm9kZS5nZXRBdHRyaWJ1dGVOUyhhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChmcm9tVmFsdWUgIT09IGF0dHJWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChhdHRyLnByZWZpeCA9PT0gJ3htbG5zJyl7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lID0gYXR0ci5uYW1lOyAvLyBJdCdzIG5vdCBhbGxvd2VkIHRvIHNldCBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgWE1MTlMgbmFtZXNwYWNlIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgYHhtbG5zYCBwcmVmaXhcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZnJvbU5vZGUuc2V0QXR0cmlidXRlTlMoYXR0ck5hbWVzcGFjZVVSSSwgYXR0ck5hbWUsIGF0dHJWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmcm9tVmFsdWUgPSBmcm9tTm9kZS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuXG4gICAgICAgICAgICBpZiAoZnJvbVZhbHVlICE9PSBhdHRyVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBmcm9tTm9kZS5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIGF0dHJWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgYW55IGV4dHJhIGF0dHJpYnV0ZXMgZm91bmQgb24gdGhlIG9yaWdpbmFsIERPTSBlbGVtZW50IHRoYXRcbiAgICAvLyB3ZXJlbid0IGZvdW5kIG9uIHRoZSB0YXJnZXQgZWxlbWVudC5cbiAgICB2YXIgZnJvbU5vZGVBdHRycyA9IGZyb21Ob2RlLmF0dHJpYnV0ZXM7XG5cbiAgICBmb3IgKHZhciBkID0gZnJvbU5vZGVBdHRycy5sZW5ndGggLSAxOyBkID49IDA7IGQtLSkge1xuICAgICAgICBhdHRyID0gZnJvbU5vZGVBdHRyc1tkXTtcbiAgICAgICAgYXR0ck5hbWUgPSBhdHRyLm5hbWU7XG4gICAgICAgIGF0dHJOYW1lc3BhY2VVUkkgPSBhdHRyLm5hbWVzcGFjZVVSSTtcblxuICAgICAgICBpZiAoYXR0ck5hbWVzcGFjZVVSSSkge1xuICAgICAgICAgICAgYXR0ck5hbWUgPSBhdHRyLmxvY2FsTmFtZSB8fCBhdHRyTmFtZTtcblxuICAgICAgICAgICAgaWYgKCF0b05vZGUuaGFzQXR0cmlidXRlTlMoYXR0ck5hbWVzcGFjZVVSSSwgYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgZnJvbU5vZGUucmVtb3ZlQXR0cmlidXRlTlMoYXR0ck5hbWVzcGFjZVVSSSwgYXR0ck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0b05vZGUuaGFzQXR0cmlidXRlKGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICAgIGZyb21Ob2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbnZhciByYW5nZTsgLy8gQ3JlYXRlIGEgcmFuZ2Ugb2JqZWN0IGZvciBlZmZpY2VudGx5IHJlbmRlcmluZyBzdHJpbmdzIHRvIGVsZW1lbnRzLlxudmFyIE5TX1hIVE1MID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xuXG52YXIgZG9jID0gdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IGRvY3VtZW50O1xudmFyIEhBU19URU1QTEFURV9TVVBQT1JUID0gISFkb2MgJiYgJ2NvbnRlbnQnIGluIGRvYy5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xudmFyIEhBU19SQU5HRV9TVVBQT1JUID0gISFkb2MgJiYgZG9jLmNyZWF0ZVJhbmdlICYmICdjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQnIGluIGRvYy5jcmVhdGVSYW5nZSgpO1xuXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudEZyb21UZW1wbGF0ZShzdHIpIHtcbiAgICB2YXIgdGVtcGxhdGUgPSBkb2MuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBzdHI7XG4gICAgcmV0dXJuIHRlbXBsYXRlLmNvbnRlbnQuY2hpbGROb2Rlc1swXTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnRGcm9tUmFuZ2Uoc3RyKSB7XG4gICAgaWYgKCFyYW5nZSkge1xuICAgICAgICByYW5nZSA9IGRvYy5jcmVhdGVSYW5nZSgpO1xuICAgICAgICByYW5nZS5zZWxlY3ROb2RlKGRvYy5ib2R5KTtcbiAgICB9XG5cbiAgICB2YXIgZnJhZ21lbnQgPSByYW5nZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoc3RyKTtcbiAgICByZXR1cm4gZnJhZ21lbnQuY2hpbGROb2Rlc1swXTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnRGcm9tV3JhcChzdHIpIHtcbiAgICB2YXIgZnJhZ21lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgnYm9keScpO1xuICAgIGZyYWdtZW50LmlubmVySFRNTCA9IHN0cjtcbiAgICByZXR1cm4gZnJhZ21lbnQuY2hpbGROb2Rlc1swXTtcbn1cblxuLyoqXG4gKiBUaGlzIGlzIGFib3V0IHRoZSBzYW1lXG4gKiB2YXIgaHRtbCA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoc3RyLCAndGV4dC9odG1sJyk7XG4gKiByZXR1cm4gaHRtbC5ib2R5LmZpcnN0Q2hpbGQ7XG4gKlxuICogQG1ldGhvZCB0b0VsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqL1xuZnVuY3Rpb24gdG9FbGVtZW50KHN0cikge1xuICAgIHN0ciA9IHN0ci50cmltKCk7XG4gICAgaWYgKEhBU19URU1QTEFURV9TVVBQT1JUKSB7XG4gICAgICAvLyBhdm9pZCByZXN0cmljdGlvbnMgb24gY29udGVudCBmb3IgdGhpbmdzIGxpa2UgYDx0cj48dGg+SGk8L3RoPjwvdHI+YCB3aGljaFxuICAgICAgLy8gY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IGRvZXNuJ3Qgc3VwcG9ydFxuICAgICAgLy8gPHRlbXBsYXRlPiBzdXBwb3J0IG5vdCBhdmFpbGFibGUgaW4gSUVcbiAgICAgIHJldHVybiBjcmVhdGVGcmFnbWVudEZyb21UZW1wbGF0ZShzdHIpO1xuICAgIH0gZWxzZSBpZiAoSEFTX1JBTkdFX1NVUFBPUlQpIHtcbiAgICAgIHJldHVybiBjcmVhdGVGcmFnbWVudEZyb21SYW5nZShzdHIpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudEZyb21XcmFwKHN0cik7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHR3byBub2RlJ3MgbmFtZXMgYXJlIHRoZSBzYW1lLlxuICpcbiAqIE5PVEU6IFdlIGRvbid0IGJvdGhlciBjaGVja2luZyBgbmFtZXNwYWNlVVJJYCBiZWNhdXNlIHlvdSB3aWxsIG5ldmVyIGZpbmQgdHdvIEhUTUwgZWxlbWVudHMgd2l0aCB0aGUgc2FtZVxuICogICAgICAgbm9kZU5hbWUgYW5kIGRpZmZlcmVudCBuYW1lc3BhY2UgVVJJcy5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGFcbiAqIEBwYXJhbSB7RWxlbWVudH0gYiBUaGUgdGFyZ2V0IGVsZW1lbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVOb2RlTmFtZXMoZnJvbUVsLCB0b0VsKSB7XG4gICAgdmFyIGZyb21Ob2RlTmFtZSA9IGZyb21FbC5ub2RlTmFtZTtcbiAgICB2YXIgdG9Ob2RlTmFtZSA9IHRvRWwubm9kZU5hbWU7XG4gICAgdmFyIGZyb21Db2RlU3RhcnQsIHRvQ29kZVN0YXJ0O1xuXG4gICAgaWYgKGZyb21Ob2RlTmFtZSA9PT0gdG9Ob2RlTmFtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmcm9tQ29kZVN0YXJ0ID0gZnJvbU5vZGVOYW1lLmNoYXJDb2RlQXQoMCk7XG4gICAgdG9Db2RlU3RhcnQgPSB0b05vZGVOYW1lLmNoYXJDb2RlQXQoMCk7XG5cbiAgICAvLyBJZiB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgYSB2aXJ0dWFsIERPTSBub2RlIG9yIFNWRyBub2RlIHRoZW4gd2UgbWF5XG4gICAgLy8gbmVlZCB0byBub3JtYWxpemUgdGhlIHRhZyBuYW1lIGJlZm9yZSBjb21wYXJpbmcuIE5vcm1hbCBIVE1MIGVsZW1lbnRzIHRoYXQgYXJlXG4gICAgLy8gaW4gdGhlIFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiXG4gICAgLy8gYXJlIGNvbnZlcnRlZCB0byB1cHBlciBjYXNlXG4gICAgaWYgKGZyb21Db2RlU3RhcnQgPD0gOTAgJiYgdG9Db2RlU3RhcnQgPj0gOTcpIHsgLy8gZnJvbSBpcyB1cHBlciBhbmQgdG8gaXMgbG93ZXJcbiAgICAgICAgcmV0dXJuIGZyb21Ob2RlTmFtZSA9PT0gdG9Ob2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgIH0gZWxzZSBpZiAodG9Db2RlU3RhcnQgPD0gOTAgJiYgZnJvbUNvZGVTdGFydCA+PSA5NykgeyAvLyB0byBpcyB1cHBlciBhbmQgZnJvbSBpcyBsb3dlclxuICAgICAgICByZXR1cm4gdG9Ob2RlTmFtZSA9PT0gZnJvbU5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4gZWxlbWVudCwgb3B0aW9uYWxseSB3aXRoIGEga25vd24gbmFtZXNwYWNlIFVSSS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgZWxlbWVudCBuYW1lLCBlLmcuICdkaXYnIG9yICdzdmcnXG4gKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZVVSSV0gdGhlIGVsZW1lbnQncyBuYW1lc3BhY2UgVVJJLCBpLmUuIHRoZSB2YWx1ZSBvZlxuICogaXRzIGB4bWxuc2AgYXR0cmlidXRlIG9yIGl0cyBpbmZlcnJlZCBuYW1lc3BhY2UuXG4gKlxuICogQHJldHVybiB7RWxlbWVudH1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWxlbWVudE5TKG5hbWUsIG5hbWVzcGFjZVVSSSkge1xuICAgIHJldHVybiAhbmFtZXNwYWNlVVJJIHx8IG5hbWVzcGFjZVVSSSA9PT0gTlNfWEhUTUwgP1xuICAgICAgICBkb2MuY3JlYXRlRWxlbWVudChuYW1lKSA6XG4gICAgICAgIGRvYy5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCBuYW1lKTtcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIGNoaWxkcmVuIG9mIG9uZSBET00gZWxlbWVudCB0byBhbm90aGVyIERPTSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIG1vdmVDaGlsZHJlbihmcm9tRWwsIHRvRWwpIHtcbiAgICB2YXIgY3VyQ2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICB3aGlsZSAoY3VyQ2hpbGQpIHtcbiAgICAgICAgdmFyIG5leHRDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICB0b0VsLmFwcGVuZENoaWxkKGN1ckNoaWxkKTtcbiAgICAgICAgY3VyQ2hpbGQgPSBuZXh0Q2hpbGQ7XG4gICAgfVxuICAgIHJldHVybiB0b0VsO1xufVxuXG5mdW5jdGlvbiBzeW5jQm9vbGVhbkF0dHJQcm9wKGZyb21FbCwgdG9FbCwgbmFtZSkge1xuICAgIGlmIChmcm9tRWxbbmFtZV0gIT09IHRvRWxbbmFtZV0pIHtcbiAgICAgICAgZnJvbUVsW25hbWVdID0gdG9FbFtuYW1lXTtcbiAgICAgICAgaWYgKGZyb21FbFtuYW1lXSkge1xuICAgICAgICAgICAgZnJvbUVsLnNldEF0dHJpYnV0ZShuYW1lLCAnJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmcm9tRWwucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG52YXIgc3BlY2lhbEVsSGFuZGxlcnMgPSB7XG4gICAgT1BUSU9OOiBmdW5jdGlvbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgICAgdmFyIHBhcmVudE5vZGUgPSBmcm9tRWwucGFyZW50Tm9kZTtcbiAgICAgICAgaWYgKHBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnROYW1lID0gcGFyZW50Tm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHBhcmVudE5hbWUgPT09ICdPUFRHUk9VUCcpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIHBhcmVudE5hbWUgPSBwYXJlbnROb2RlICYmIHBhcmVudE5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJlbnROYW1lID09PSAnU0VMRUNUJyAmJiAhcGFyZW50Tm9kZS5oYXNBdHRyaWJ1dGUoJ211bHRpcGxlJykpIHtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbUVsLmhhc0F0dHJpYnV0ZSgnc2VsZWN0ZWQnKSAmJiAhdG9FbC5zZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBNUyBFZGdlIGJ1ZyB3aGVyZSB0aGUgJ3NlbGVjdGVkJyBhdHRyaWJ1dGUgY2FuIG9ubHkgYmVcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlZCBpZiBzZXQgdG8gYSBub24tZW1wdHkgdmFsdWU6XG4gICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vZW4tdXMvbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzEyMDg3Njc5L1xuICAgICAgICAgICAgICAgICAgICBmcm9tRWwuc2V0QXR0cmlidXRlKCdzZWxlY3RlZCcsICdzZWxlY3RlZCcpO1xuICAgICAgICAgICAgICAgICAgICBmcm9tRWwucmVtb3ZlQXR0cmlidXRlKCdzZWxlY3RlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIHJlc2V0IHNlbGVjdCBlbGVtZW50J3Mgc2VsZWN0ZWRJbmRleCB0byAtMSwgb3RoZXJ3aXNlIHNldHRpbmdcbiAgICAgICAgICAgICAgICAvLyBmcm9tRWwuc2VsZWN0ZWQgdXNpbmcgdGhlIHN5bmNCb29sZWFuQXR0clByb3AgYmVsb3cgaGFzIG5vIGVmZmVjdC5cbiAgICAgICAgICAgICAgICAvLyBUaGUgY29ycmVjdCBzZWxlY3RlZEluZGV4IHdpbGwgYmUgc2V0IGluIHRoZSBTRUxFQ1Qgc3BlY2lhbCBoYW5kbGVyIGJlbG93LlxuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN5bmNCb29sZWFuQXR0clByb3AoZnJvbUVsLCB0b0VsLCAnc2VsZWN0ZWQnKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFRoZSBcInZhbHVlXCIgYXR0cmlidXRlIGlzIHNwZWNpYWwgZm9yIHRoZSA8aW5wdXQ+IGVsZW1lbnQgc2luY2UgaXQgc2V0c1xuICAgICAqIHRoZSBpbml0aWFsIHZhbHVlLiBDaGFuZ2luZyB0aGUgXCJ2YWx1ZVwiIGF0dHJpYnV0ZSB3aXRob3V0IGNoYW5naW5nIHRoZVxuICAgICAqIFwidmFsdWVcIiBwcm9wZXJ0eSB3aWxsIGhhdmUgbm8gZWZmZWN0IHNpbmNlIGl0IGlzIG9ubHkgdXNlZCB0byB0aGUgc2V0IHRoZVxuICAgICAqIGluaXRpYWwgdmFsdWUuICBTaW1pbGFyIGZvciB0aGUgXCJjaGVja2VkXCIgYXR0cmlidXRlLCBhbmQgXCJkaXNhYmxlZFwiLlxuICAgICAqL1xuICAgIElOUFVUOiBmdW5jdGlvbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgICAgc3luY0Jvb2xlYW5BdHRyUHJvcChmcm9tRWwsIHRvRWwsICdjaGVja2VkJyk7XG4gICAgICAgIHN5bmNCb29sZWFuQXR0clByb3AoZnJvbUVsLCB0b0VsLCAnZGlzYWJsZWQnKTtcblxuICAgICAgICBpZiAoZnJvbUVsLnZhbHVlICE9PSB0b0VsLnZhbHVlKSB7XG4gICAgICAgICAgICBmcm9tRWwudmFsdWUgPSB0b0VsLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0b0VsLmhhc0F0dHJpYnV0ZSgndmFsdWUnKSkge1xuICAgICAgICAgICAgZnJvbUVsLnJlbW92ZUF0dHJpYnV0ZSgndmFsdWUnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBURVhUQVJFQTogZnVuY3Rpb24oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IHRvRWwudmFsdWU7XG4gICAgICAgIGlmIChmcm9tRWwudmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICBmcm9tRWwudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmaXJzdENoaWxkID0gZnJvbUVsLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmIChmaXJzdENoaWxkKSB7XG4gICAgICAgICAgICAvLyBOZWVkZWQgZm9yIElFLiBBcHBhcmVudGx5IElFIHNldHMgdGhlIHBsYWNlaG9sZGVyIGFzIHRoZVxuICAgICAgICAgICAgLy8gbm9kZSB2YWx1ZSBhbmQgdmlzZSB2ZXJzYS4gVGhpcyBpZ25vcmVzIGFuIGVtcHR5IHVwZGF0ZS5cbiAgICAgICAgICAgIHZhciBvbGRWYWx1ZSA9IGZpcnN0Q2hpbGQubm9kZVZhbHVlO1xuXG4gICAgICAgICAgICBpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgfHwgKCFuZXdWYWx1ZSAmJiBvbGRWYWx1ZSA9PSBmcm9tRWwucGxhY2Vob2xkZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmaXJzdENoaWxkLm5vZGVWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBTRUxFQ1Q6IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICBpZiAoIXRvRWwuaGFzQXR0cmlidXRlKCdtdWx0aXBsZScpKSB7XG4gICAgICAgICAgICB2YXIgc2VsZWN0ZWRJbmRleCA9IC0xO1xuICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBsb29wIHRocm91Z2ggY2hpbGRyZW4gb2YgZnJvbUVsLCBub3QgdG9FbCBzaW5jZSBub2RlcyBjYW4gYmUgbW92ZWRcbiAgICAgICAgICAgIC8vIGZyb20gdG9FbCB0byBmcm9tRWwgZGlyZWN0bHkgd2hlbiBtb3JwaGluZy5cbiAgICAgICAgICAgIC8vIEF0IHRoZSB0aW1lIHRoaXMgc3BlY2lhbCBoYW5kbGVyIGlzIGludm9rZWQsIGFsbCBjaGlsZHJlbiBoYXZlIGFscmVhZHkgYmVlbiBtb3JwaGVkXG4gICAgICAgICAgICAvLyBhbmQgYXBwZW5kZWQgdG8gLyByZW1vdmVkIGZyb20gZnJvbUVsLCBzbyB1c2luZyBmcm9tRWwgaGVyZSBpcyBzYWZlIGFuZCBjb3JyZWN0LlxuICAgICAgICAgICAgdmFyIGN1ckNoaWxkID0gZnJvbUVsLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICB2YXIgb3B0Z3JvdXA7XG4gICAgICAgICAgICB2YXIgbm9kZU5hbWU7XG4gICAgICAgICAgICB3aGlsZShjdXJDaGlsZCkge1xuICAgICAgICAgICAgICAgIG5vZGVOYW1lID0gY3VyQ2hpbGQubm9kZU5hbWUgJiYgY3VyQ2hpbGQubm9kZU5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdPUFRHUk9VUCcpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0Z3JvdXAgPSBjdXJDaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBvcHRncm91cC5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ09QVElPTicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGlsZC5oYXNBdHRyaWJ1dGUoJ3NlbGVjdGVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWN1ckNoaWxkICYmIG9wdGdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IG9wdGdyb3VwLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0Z3JvdXAgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmcm9tRWwuc2VsZWN0ZWRJbmRleCA9IHNlbGVjdGVkSW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG52YXIgRUxFTUVOVF9OT0RFID0gMTtcbnZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFJDEgPSAxMTtcbnZhciBURVhUX05PREUgPSAzO1xudmFyIENPTU1FTlRfTk9ERSA9IDg7XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiBkZWZhdWx0R2V0Tm9kZUtleShub2RlKSB7XG4gIGlmIChub2RlKSB7XG4gICAgICByZXR1cm4gKG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKCdpZCcpKSB8fCBub2RlLmlkO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vcnBoZG9tRmFjdG9yeShtb3JwaEF0dHJzKSB7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gbW9ycGhkb20oZnJvbU5vZGUsIHRvTm9kZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdG9Ob2RlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKGZyb21Ob2RlLm5vZGVOYW1lID09PSAnI2RvY3VtZW50JyB8fCBmcm9tTm9kZS5ub2RlTmFtZSA9PT0gJ0hUTUwnIHx8IGZyb21Ob2RlLm5vZGVOYW1lID09PSAnQk9EWScpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG9Ob2RlSHRtbCA9IHRvTm9kZTtcbiAgICAgICAgICAgICAgICB0b05vZGUgPSBkb2MuY3JlYXRlRWxlbWVudCgnaHRtbCcpO1xuICAgICAgICAgICAgICAgIHRvTm9kZS5pbm5lckhUTUwgPSB0b05vZGVIdG1sO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0b05vZGUgPSB0b0VsZW1lbnQodG9Ob2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBnZXROb2RlS2V5ID0gb3B0aW9ucy5nZXROb2RlS2V5IHx8IGRlZmF1bHRHZXROb2RlS2V5O1xuICAgICAgICB2YXIgb25CZWZvcmVOb2RlQWRkZWQgPSBvcHRpb25zLm9uQmVmb3JlTm9kZUFkZGVkIHx8IG5vb3A7XG4gICAgICAgIHZhciBvbk5vZGVBZGRlZCA9IG9wdGlvbnMub25Ob2RlQWRkZWQgfHwgbm9vcDtcbiAgICAgICAgdmFyIG9uQmVmb3JlRWxVcGRhdGVkID0gb3B0aW9ucy5vbkJlZm9yZUVsVXBkYXRlZCB8fCBub29wO1xuICAgICAgICB2YXIgb25FbFVwZGF0ZWQgPSBvcHRpb25zLm9uRWxVcGRhdGVkIHx8IG5vb3A7XG4gICAgICAgIHZhciBvbkJlZm9yZU5vZGVEaXNjYXJkZWQgPSBvcHRpb25zLm9uQmVmb3JlTm9kZURpc2NhcmRlZCB8fCBub29wO1xuICAgICAgICB2YXIgb25Ob2RlRGlzY2FyZGVkID0gb3B0aW9ucy5vbk5vZGVEaXNjYXJkZWQgfHwgbm9vcDtcbiAgICAgICAgdmFyIG9uQmVmb3JlRWxDaGlsZHJlblVwZGF0ZWQgPSBvcHRpb25zLm9uQmVmb3JlRWxDaGlsZHJlblVwZGF0ZWQgfHwgbm9vcDtcbiAgICAgICAgdmFyIGNoaWxkcmVuT25seSA9IG9wdGlvbnMuY2hpbGRyZW5Pbmx5ID09PSB0cnVlO1xuXG4gICAgICAgIC8vIFRoaXMgb2JqZWN0IGlzIHVzZWQgYXMgYSBsb29rdXAgdG8gcXVpY2tseSBmaW5kIGFsbCBrZXllZCBlbGVtZW50cyBpbiB0aGUgb3JpZ2luYWwgRE9NIHRyZWUuXG4gICAgICAgIHZhciBmcm9tTm9kZXNMb29rdXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB2YXIga2V5ZWRSZW1vdmFsTGlzdCA9IFtdO1xuXG4gICAgICAgIGZ1bmN0aW9uIGFkZEtleWVkUmVtb3ZhbChrZXkpIHtcbiAgICAgICAgICAgIGtleWVkUmVtb3ZhbExpc3QucHVzaChrZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gd2Fsa0Rpc2NhcmRlZENoaWxkTm9kZXMobm9kZSwgc2tpcEtleWVkTm9kZXMpIHtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY3VyQ2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1ckNoaWxkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2tpcEtleWVkTm9kZXMgJiYgKGtleSA9IGdldE5vZGVLZXkoY3VyQ2hpbGQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIHNraXBwaW5nIGtleWVkIG5vZGVzIHRoZW4gd2UgYWRkIHRoZSBrZXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGEgbGlzdCBzbyB0aGF0IGl0IGNhbiBiZSBoYW5kbGVkIGF0IHRoZSB2ZXJ5IGVuZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSByZXBvcnQgdGhlIG5vZGUgYXMgZGlzY2FyZGVkIGlmIGl0IGlzIG5vdCBrZXllZC4gV2UgZG8gdGhpcyBiZWNhdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCB0aGUgZW5kIHdlIGxvb3AgdGhyb3VnaCBhbGwga2V5ZWQgZWxlbWVudHMgdGhhdCB3ZXJlIHVubWF0Y2hlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gZGlzY2FyZCB0aGVtIGluIG9uZSBmaW5hbCBwYXNzLlxuICAgICAgICAgICAgICAgICAgICAgICAgb25Ob2RlRGlzY2FyZGVkKGN1ckNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGlsZC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa0Rpc2NhcmRlZENoaWxkTm9kZXMoY3VyQ2hpbGQsIHNraXBLZXllZE5vZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGN1ckNoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbW92ZXMgYSBET00gbm9kZSBvdXQgb2YgdGhlIG9yaWdpbmFsIERPTVxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gIHtOb2RlfSBub2RlIFRoZSBub2RlIHRvIHJlbW92ZVxuICAgICAgICAgKiBAcGFyYW0gIHtOb2RlfSBwYXJlbnROb2RlIFRoZSBub2RlcyBwYXJlbnRcbiAgICAgICAgICogQHBhcmFtICB7Qm9vbGVhbn0gc2tpcEtleWVkTm9kZXMgSWYgdHJ1ZSB0aGVuIGVsZW1lbnRzIHdpdGgga2V5cyB3aWxsIGJlIHNraXBwZWQgYW5kIG5vdCBkaXNjYXJkZWQuXG4gICAgICAgICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIHJlbW92ZU5vZGUobm9kZSwgcGFyZW50Tm9kZSwgc2tpcEtleWVkTm9kZXMpIHtcbiAgICAgICAgICAgIGlmIChvbkJlZm9yZU5vZGVEaXNjYXJkZWQobm9kZSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChub2RlKTtcbiAgICAgICAgICAgIHdhbGtEaXNjYXJkZWRDaGlsZE5vZGVzKG5vZGUsIHNraXBLZXllZE5vZGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC8vIFRyZWVXYWxrZXIgaW1wbGVtZW50YXRpb24gaXMgbm8gZmFzdGVyLCBidXQga2VlcGluZyB0aGlzIGFyb3VuZCBpbiBjYXNlIHRoaXMgY2hhbmdlcyBpbiB0aGUgZnV0dXJlXG4gICAgICAgIC8vIGZ1bmN0aW9uIGluZGV4VHJlZShyb290KSB7XG4gICAgICAgIC8vICAgICB2YXIgdHJlZVdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoXG4gICAgICAgIC8vICAgICAgICAgcm9vdCxcbiAgICAgICAgLy8gICAgICAgICBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICB2YXIgZWw7XG4gICAgICAgIC8vICAgICB3aGlsZSgoZWwgPSB0cmVlV2Fsa2VyLm5leHROb2RlKCkpKSB7XG4gICAgICAgIC8vICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoZWwpO1xuICAgICAgICAvLyAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgZnJvbU5vZGVzTG9va3VwW2tleV0gPSBlbDtcbiAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyAvLyBOb2RlSXRlcmF0b3IgaW1wbGVtZW50YXRpb24gaXMgbm8gZmFzdGVyLCBidXQga2VlcGluZyB0aGlzIGFyb3VuZCBpbiBjYXNlIHRoaXMgY2hhbmdlcyBpbiB0aGUgZnV0dXJlXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGZ1bmN0aW9uIGluZGV4VHJlZShub2RlKSB7XG4gICAgICAgIC8vICAgICB2YXIgbm9kZUl0ZXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKG5vZGUsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UKTtcbiAgICAgICAgLy8gICAgIHZhciBlbDtcbiAgICAgICAgLy8gICAgIHdoaWxlKChlbCA9IG5vZGVJdGVyYXRvci5uZXh0Tm9kZSgpKSkge1xuICAgICAgICAvLyAgICAgICAgIHZhciBrZXkgPSBnZXROb2RlS2V5KGVsKTtcbiAgICAgICAgLy8gICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgIC8vICAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gZWw7XG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgZnVuY3Rpb24gaW5kZXhUcmVlKG5vZGUpIHtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSQxKSB7XG4gICAgICAgICAgICAgICAgdmFyIGN1ckNoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gZ2V0Tm9kZUtleShjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gY3VyQ2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBXYWxrIHJlY3Vyc2l2ZWx5XG4gICAgICAgICAgICAgICAgICAgIGluZGV4VHJlZShjdXJDaGlsZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBjdXJDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleFRyZWUoZnJvbU5vZGUpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZU5vZGVBZGRlZChlbCkge1xuICAgICAgICAgICAgb25Ob2RlQWRkZWQoZWwpO1xuXG4gICAgICAgICAgICB2YXIgY3VyQ2hpbGQgPSBlbC5maXJzdENoaWxkO1xuICAgICAgICAgICAgd2hpbGUgKGN1ckNoaWxkKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5leHRTaWJsaW5nID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gZ2V0Tm9kZUtleShjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdW5tYXRjaGVkRnJvbUVsID0gZnJvbU5vZGVzTG9va3VwW2tleV07XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGZpbmQgYSBkdXBsaWNhdGUgI2lkIG5vZGUgaW4gY2FjaGUsIHJlcGxhY2UgYGVsYCB3aXRoIGNhY2hlIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIC8vIGFuZCBtb3JwaCBpdCB0byB0aGUgY2hpbGQgbm9kZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHVubWF0Y2hlZEZyb21FbCAmJiBjb21wYXJlTm9kZU5hbWVzKGN1ckNoaWxkLCB1bm1hdGNoZWRGcm9tRWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh1bm1hdGNoZWRGcm9tRWwsIGN1ckNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vcnBoRWwodW5tYXRjaGVkRnJvbUVsLCBjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1ckNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyByZWN1cnNpdmVseSBjYWxsIGZvciBjdXJDaGlsZCBhbmQgaXQncyBjaGlsZHJlbiB0byBzZWUgaWYgd2UgZmluZCBzb21ldGhpbmcgaW5cbiAgICAgICAgICAgICAgICAgIC8vIGZyb21Ob2Rlc0xvb2t1cFxuICAgICAgICAgICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1ckNoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IG5leHRTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gY2xlYW51cEZyb21FbChmcm9tRWwsIGN1ckZyb21Ob2RlQ2hpbGQsIGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAgICAgICAvLyBXZSBoYXZlIHByb2Nlc3NlZCBhbGwgb2YgdGhlIFwidG8gbm9kZXNcIi4gSWYgY3VyRnJvbU5vZGVDaGlsZCBpc1xuICAgICAgICAgICAgLy8gbm9uLW51bGwgdGhlbiB3ZSBzdGlsbCBoYXZlIHNvbWUgZnJvbSBub2RlcyBsZWZ0IG92ZXIgdGhhdCBuZWVkXG4gICAgICAgICAgICAvLyB0byBiZSByZW1vdmVkXG4gICAgICAgICAgICB3aGlsZSAoY3VyRnJvbU5vZGVDaGlsZCkge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tTmV4dFNpYmxpbmcgPSBjdXJGcm9tTm9kZUNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIGlmICgoY3VyRnJvbU5vZGVLZXkgPSBnZXROb2RlS2V5KGN1ckZyb21Ob2RlQ2hpbGQpKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgbm9kZSBpcyBrZXllZCBpdCBtaWdodCBiZSBtYXRjaGVkIHVwIGxhdGVyIHNvIHdlIGRlZmVyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVtb3ZhbCB0byBsYXRlclxuICAgICAgICAgICAgICAgICAgICBhZGRLZXllZFJlbW92YWwoY3VyRnJvbU5vZGVLZXkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IHdlIHNraXAgbmVzdGVkIGtleWVkIG5vZGVzIGZyb20gYmVpbmcgcmVtb3ZlZCBzaW5jZSB0aGVyZSBpc1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzdGlsbCBhIGNoYW5jZSB0aGV5IHdpbGwgYmUgbWF0Y2hlZCB1cCBsYXRlclxuICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKGN1ckZyb21Ob2RlQ2hpbGQsIGZyb21FbCwgdHJ1ZSAvKiBza2lwIGtleWVkIG5vZGVzICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG1vcnBoRWwoZnJvbUVsLCB0b0VsLCBjaGlsZHJlbk9ubHkpIHtcbiAgICAgICAgICAgIHZhciB0b0VsS2V5ID0gZ2V0Tm9kZUtleSh0b0VsKTtcblxuICAgICAgICAgICAgaWYgKHRvRWxLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBhbiBlbGVtZW50IHdpdGggYW4gSUQgaXMgYmVpbmcgbW9ycGhlZCB0aGVuIGl0IHdpbGwgYmUgaW4gdGhlIGZpbmFsXG4gICAgICAgICAgICAgICAgLy8gRE9NIHNvIGNsZWFyIGl0IG91dCBvZiB0aGUgc2F2ZWQgZWxlbWVudHMgY29sbGVjdGlvblxuICAgICAgICAgICAgICAgIGRlbGV0ZSBmcm9tTm9kZXNMb29rdXBbdG9FbEtleV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghY2hpbGRyZW5Pbmx5KSB7XG4gICAgICAgICAgICAgICAgLy8gb3B0aW9uYWxcbiAgICAgICAgICAgICAgICBpZiAob25CZWZvcmVFbFVwZGF0ZWQoZnJvbUVsLCB0b0VsKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBhdHRyaWJ1dGVzIG9uIG9yaWdpbmFsIERPTSBlbGVtZW50IGZpcnN0XG4gICAgICAgICAgICAgICAgbW9ycGhBdHRycyhmcm9tRWwsIHRvRWwpO1xuICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsXG4gICAgICAgICAgICAgICAgb25FbFVwZGF0ZWQoZnJvbUVsKTtcblxuICAgICAgICAgICAgICAgIGlmIChvbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkKGZyb21FbCwgdG9FbCkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmcm9tRWwubm9kZU5hbWUgIT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgICAgICAgbW9ycGhDaGlsZHJlbihmcm9tRWwsIHRvRWwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3BlY2lhbEVsSGFuZGxlcnMuVEVYVEFSRUEoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG1vcnBoQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgICAgICB2YXIgY3VyVG9Ob2RlQ2hpbGQgPSB0b0VsLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICB2YXIgY3VyRnJvbU5vZGVDaGlsZCA9IGZyb21FbC5maXJzdENoaWxkO1xuICAgICAgICAgICAgdmFyIGN1clRvTm9kZUtleTtcbiAgICAgICAgICAgIHZhciBjdXJGcm9tTm9kZUtleTtcblxuICAgICAgICAgICAgdmFyIGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgIHZhciB0b05leHRTaWJsaW5nO1xuICAgICAgICAgICAgdmFyIG1hdGNoaW5nRnJvbUVsO1xuXG4gICAgICAgICAgICAvLyB3YWxrIHRoZSBjaGlsZHJlblxuICAgICAgICAgICAgb3V0ZXI6IHdoaWxlIChjdXJUb05vZGVDaGlsZCkge1xuICAgICAgICAgICAgICAgIHRvTmV4dFNpYmxpbmcgPSBjdXJUb05vZGVDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICBjdXJUb05vZGVLZXkgPSBnZXROb2RlS2V5KGN1clRvTm9kZUNoaWxkKTtcblxuICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhlIGZyb21Ob2RlIGNoaWxkcmVuIGFsbCB0aGUgd2F5IHRocm91Z2hcbiAgICAgICAgICAgICAgICB3aGlsZSAoY3VyRnJvbU5vZGVDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tTmV4dFNpYmxpbmcgPSBjdXJGcm9tTm9kZUNoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJUb05vZGVDaGlsZC5pc1NhbWVOb2RlICYmIGN1clRvTm9kZUNoaWxkLmlzU2FtZU5vZGUoY3VyRnJvbU5vZGVDaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1clRvTm9kZUNoaWxkID0gdG9OZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJGcm9tTm9kZUNoaWxkKTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgY3VyRnJvbU5vZGVUeXBlID0gY3VyRnJvbU5vZGVDaGlsZC5ub2RlVHlwZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG1lYW5zIGlmIHRoZSBjdXJGcm9tTm9kZUNoaWxkIGRvZXNudCBoYXZlIGEgbWF0Y2ggd2l0aCB0aGUgY3VyVG9Ob2RlQ2hpbGRcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlzQ29tcGF0aWJsZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY3VyRnJvbU5vZGVUeXBlID09PSBjdXJUb05vZGVDaGlsZC5ub2RlVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckZyb21Ob2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQm90aCBub2RlcyBiZWluZyBjb21wYXJlZCBhcmUgRWxlbWVudCBub2Rlc1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1clRvTm9kZUtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IG5vZGUgaGFzIGEga2V5IHNvIHdlIHdhbnQgdG8gbWF0Y2ggaXQgdXAgd2l0aCB0aGUgY29ycmVjdCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBvcmlnaW5hbCBET00gdHJlZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVG9Ob2RlS2V5ICE9PSBjdXJGcm9tTm9kZUtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgRE9NIHRyZWUgZG9lcyBub3QgaGF2ZSBhIG1hdGNoaW5nIGtleSBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0J3MgY2hlY2sgb3VyIGxvb2t1cCB0byBzZWUgaWYgdGhlcmUgaXMgYSBtYXRjaGluZyBlbGVtZW50IGluIHRoZSBvcmlnaW5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRE9NIHRyZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobWF0Y2hpbmdGcm9tRWwgPSBmcm9tTm9kZXNMb29rdXBbY3VyVG9Ob2RlS2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbU5leHRTaWJsaW5nID09PSBtYXRjaGluZ0Zyb21FbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHNpbmdsZSBlbGVtZW50IHJlbW92YWxzLiBUbyBhdm9pZCByZW1vdmluZyB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRE9NIG5vZGUgb3V0IG9mIHRoZSB0cmVlIChzaW5jZSB0aGF0IGNhbiBicmVhayBDU1MgdHJhbnNpdGlvbnMsIGV0Yy4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3aWxsIGluc3RlYWQgZGlzY2FyZCB0aGUgY3VycmVudCBub2RlIGFuZCB3YWl0IHVudGlsIHRoZSBuZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0ZXJhdGlvbiB0byBwcm9wZXJseSBtYXRjaCB1cCB0aGUga2V5ZWQgdGFyZ2V0IGVsZW1lbnQgd2l0aCBpdHMgbWF0Y2hpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgdHJlZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBhdGlibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBhIG1hdGNoaW5nIGtleWVkIGVsZW1lbnQgc29tZXdoZXJlIGluIHRoZSBvcmlnaW5hbCBET00gdHJlZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0J3MgbW92ZSB0aGUgb3JpZ2luYWwgRE9NIG5vZGUgaW50byB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgbW9ycGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogV2UgdXNlIGluc2VydEJlZm9yZSBpbnN0ZWFkIG9mIHJlcGxhY2VDaGlsZCBiZWNhdXNlIHdlIHdhbnQgdG8gZ28gdGhyb3VnaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYHJlbW92ZU5vZGUoKWAgZnVuY3Rpb24gZm9yIHRoZSBub2RlIHRoYXQgaXMgYmVpbmcgZGlzY2FyZGVkIHNvIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGxpZmVjeWNsZSBob29rcyBhcmUgY29ycmVjdGx5IGludm9rZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUVsLmluc2VydEJlZm9yZShtYXRjaGluZ0Zyb21FbCwgY3VyRnJvbU5vZGVDaGlsZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbU5leHRTaWJsaW5nID0gY3VyRnJvbU5vZGVDaGlsZC5uZXh0U2libGluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBub2RlIGlzIGtleWVkIGl0IG1pZ2h0IGJlIG1hdGNoZWQgdXAgbGF0ZXIgc28gd2UgZGVmZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVtb3ZhbCB0byBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkS2V5ZWRSZW1vdmFsKGN1ckZyb21Ob2RlS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IHdlIHNraXAgbmVzdGVkIGtleWVkIG5vZGVzIGZyb20gYmVpbmcgcmVtb3ZlZCBzaW5jZSB0aGVyZSBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc3RpbGwgYSBjaGFuY2UgdGhleSB3aWxsIGJlIG1hdGNoZWQgdXAgbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUoY3VyRnJvbU5vZGVDaGlsZCwgZnJvbUVsLCB0cnVlIC8qIHNraXAga2V5ZWQgbm9kZXMgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IG1hdGNoaW5nRnJvbUVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGVzIGFyZSBub3QgY29tcGF0aWJsZSBzaW5jZSB0aGUgXCJ0b1wiIG5vZGUgaGFzIGEga2V5IGFuZCB0aGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vIG1hdGNoaW5nIGtleWVkIG5vZGUgaW4gdGhlIHNvdXJjZSB0cmVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBvcmlnaW5hbCBoYXMgYSBrZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gaXNDb21wYXRpYmxlICE9PSBmYWxzZSAmJiBjb21wYXJlTm9kZU5hbWVzKGN1ckZyb21Ob2RlQ2hpbGQsIGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb21wYXRpYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIGNvbXBhdGlibGUgRE9NIGVsZW1lbnRzIHNvIHRyYW5zZm9ybVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY3VycmVudCBcImZyb21cIiBub2RlIHRvIG1hdGNoIHRoZSBjdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhcmdldCBET00gbm9kZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTU9SUEhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9ycGhFbChjdXJGcm9tTm9kZUNoaWxkLCBjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1ckZyb21Ob2RlVHlwZSA9PT0gVEVYVF9OT0RFIHx8IGN1ckZyb21Ob2RlVHlwZSA9PSBDT01NRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCb3RoIG5vZGVzIGJlaW5nIGNvbXBhcmVkIGFyZSBUZXh0IG9yIENvbW1lbnQgbm9kZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBhdGlibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBseSB1cGRhdGUgbm9kZVZhbHVlIG9uIHRoZSBvcmlnaW5hbCBub2RlIHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB0ZXh0IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckZyb21Ob2RlQ2hpbGQubm9kZVZhbHVlICE9PSBjdXJUb05vZGVDaGlsZC5ub2RlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZC5ub2RlVmFsdWUgPSBjdXJUb05vZGVDaGlsZC5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb21wYXRpYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZHZhbmNlIGJvdGggdGhlIFwidG9cIiBjaGlsZCBhbmQgdGhlIFwiZnJvbVwiIGNoaWxkIHNpbmNlIHdlIGZvdW5kIGEgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgZWxzZSB0byBkbyBhcyB3ZSBhbHJlYWR5IHJlY3Vyc2l2ZWx5IGNhbGxlZCBtb3JwaENoaWxkcmVuIGFib3ZlXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJUb05vZGVDaGlsZCA9IHRvTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbU5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBObyBjb21wYXRpYmxlIG1hdGNoIHNvIHJlbW92ZSB0aGUgb2xkIG5vZGUgZnJvbSB0aGUgRE9NIGFuZCBjb250aW51ZSB0cnlpbmcgdG8gZmluZCBhXG4gICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoIGluIHRoZSBvcmlnaW5hbCBET00uIEhvd2V2ZXIsIHdlIG9ubHkgZG8gdGhpcyBpZiB0aGUgZnJvbSBub2RlIGlzIG5vdCBrZXllZFxuICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSBpdCBpcyBwb3NzaWJsZSB0aGF0IGEga2V5ZWQgbm9kZSBtaWdodCBtYXRjaCB1cCB3aXRoIGEgbm9kZSBzb21ld2hlcmUgZWxzZSBpbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gdGFyZ2V0IHRyZWUgYW5kIHdlIGRvbid0IHdhbnQgdG8gZGlzY2FyZCBpdCBqdXN0IHlldCBzaW5jZSBpdCBzdGlsbCBtaWdodCBmaW5kIGFcbiAgICAgICAgICAgICAgICAgICAgLy8gaG9tZSBpbiB0aGUgZmluYWwgRE9NIHRyZWUuIEFmdGVyIGV2ZXJ5dGhpbmcgaXMgZG9uZSB3ZSB3aWxsIHJlbW92ZSBhbnkga2V5ZWQgbm9kZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBkaWRuJ3QgZmluZCBhIGhvbWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgbm9kZSBpcyBrZXllZCBpdCBtaWdodCBiZSBtYXRjaGVkIHVwIGxhdGVyIHNvIHdlIGRlZmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHJlbW92YWwgdG8gbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChjdXJGcm9tTm9kZUtleSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiB3ZSBza2lwIG5lc3RlZCBrZXllZCBub2RlcyBmcm9tIGJlaW5nIHJlbW92ZWQgc2luY2UgdGhlcmUgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHN0aWxsIGEgY2hhbmNlIHRoZXkgd2lsbCBiZSBtYXRjaGVkIHVwIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKGN1ckZyb21Ob2RlQ2hpbGQsIGZyb21FbCwgdHJ1ZSAvKiBza2lwIGtleWVkIG5vZGVzICovKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfSAvLyBFTkQ6IHdoaWxlKGN1ckZyb21Ob2RlQ2hpbGQpIHt9XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBnb3QgdGhpcyBmYXIgdGhlbiB3ZSBkaWQgbm90IGZpbmQgYSBjYW5kaWRhdGUgbWF0Y2ggZm9yXG4gICAgICAgICAgICAgICAgLy8gb3VyIFwidG8gbm9kZVwiIGFuZCB3ZSBleGhhdXN0ZWQgYWxsIG9mIHRoZSBjaGlsZHJlbiBcImZyb21cIlxuICAgICAgICAgICAgICAgIC8vIG5vZGVzLiBUaGVyZWZvcmUsIHdlIHdpbGwganVzdCBhcHBlbmQgdGhlIGN1cnJlbnQgXCJ0b1wiIG5vZGVcbiAgICAgICAgICAgICAgICAvLyB0byB0aGUgZW5kXG4gICAgICAgICAgICAgICAgaWYgKGN1clRvTm9kZUtleSAmJiAobWF0Y2hpbmdGcm9tRWwgPSBmcm9tTm9kZXNMb29rdXBbY3VyVG9Ob2RlS2V5XSkgJiYgY29tcGFyZU5vZGVOYW1lcyhtYXRjaGluZ0Zyb21FbCwgY3VyVG9Ob2RlQ2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21FbC5hcHBlbmRDaGlsZChtYXRjaGluZ0Zyb21FbCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1PUlBIXG4gICAgICAgICAgICAgICAgICAgIG1vcnBoRWwobWF0Y2hpbmdGcm9tRWwsIGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb25CZWZvcmVOb2RlQWRkZWRSZXN1bHQgPSBvbkJlZm9yZU5vZGVBZGRlZChjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvbkJlZm9yZU5vZGVBZGRlZFJlc3VsdCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbkJlZm9yZU5vZGVBZGRlZFJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1clRvTm9kZUNoaWxkID0gb25CZWZvcmVOb2RlQWRkZWRSZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJUb05vZGVDaGlsZC5hY3R1YWxpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJUb05vZGVDaGlsZCA9IGN1clRvTm9kZUNoaWxkLmFjdHVhbGl6ZShmcm9tRWwub3duZXJEb2N1bWVudCB8fCBkb2MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUVsLmFwcGVuZENoaWxkKGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU5vZGVBZGRlZChjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjdXJUb05vZGVDaGlsZCA9IHRvTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2xlYW51cEZyb21FbChmcm9tRWwsIGN1ckZyb21Ob2RlQ2hpbGQsIGN1ckZyb21Ob2RlS2V5KTtcblxuICAgICAgICAgICAgdmFyIHNwZWNpYWxFbEhhbmRsZXIgPSBzcGVjaWFsRWxIYW5kbGVyc1tmcm9tRWwubm9kZU5hbWVdO1xuICAgICAgICAgICAgaWYgKHNwZWNpYWxFbEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICBzcGVjaWFsRWxIYW5kbGVyKGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gLy8gRU5EOiBtb3JwaENoaWxkcmVuKC4uLilcblxuICAgICAgICB2YXIgbW9ycGhlZE5vZGUgPSBmcm9tTm9kZTtcbiAgICAgICAgdmFyIG1vcnBoZWROb2RlVHlwZSA9IG1vcnBoZWROb2RlLm5vZGVUeXBlO1xuICAgICAgICB2YXIgdG9Ob2RlVHlwZSA9IHRvTm9kZS5ub2RlVHlwZTtcblxuICAgICAgICBpZiAoIWNoaWxkcmVuT25seSkge1xuICAgICAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGFyZSBnaXZlbiB0d28gRE9NIG5vZGVzIHRoYXQgYXJlIG5vdFxuICAgICAgICAgICAgLy8gY29tcGF0aWJsZSAoZS5nLiA8ZGl2PiAtLT4gPHNwYW4+IG9yIDxkaXY+IC0tPiBURVhUKVxuICAgICAgICAgICAgaWYgKG1vcnBoZWROb2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRvTm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbXBhcmVOb2RlTmFtZXMoZnJvbU5vZGUsIHRvTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChmcm9tTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb3JwaGVkTm9kZSA9IG1vdmVDaGlsZHJlbihmcm9tTm9kZSwgY3JlYXRlRWxlbWVudE5TKHRvTm9kZS5ub2RlTmFtZSwgdG9Ob2RlLm5hbWVzcGFjZVVSSSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gR29pbmcgZnJvbSBhbiBlbGVtZW50IG5vZGUgdG8gYSB0ZXh0IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgbW9ycGhlZE5vZGUgPSB0b05vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChtb3JwaGVkTm9kZVR5cGUgPT09IFRFWFRfTk9ERSB8fCBtb3JwaGVkTm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgeyAvLyBUZXh0IG9yIGNvbW1lbnQgbm9kZVxuICAgICAgICAgICAgICAgIGlmICh0b05vZGVUeXBlID09PSBtb3JwaGVkTm9kZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vcnBoZWROb2RlLm5vZGVWYWx1ZSAhPT0gdG9Ob2RlLm5vZGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9ycGhlZE5vZGUubm9kZVZhbHVlID0gdG9Ob2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb3JwaGVkTm9kZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBUZXh0IG5vZGUgdG8gc29tZXRoaW5nIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgbW9ycGhlZE5vZGUgPSB0b05vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vcnBoZWROb2RlID09PSB0b05vZGUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBcInRvIG5vZGVcIiB3YXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgXCJmcm9tIG5vZGVcIiBzbyB3ZSBoYWQgdG9cbiAgICAgICAgICAgIC8vIHRvc3Mgb3V0IHRoZSBcImZyb20gbm9kZVwiIGFuZCB1c2UgdGhlIFwidG8gbm9kZVwiXG4gICAgICAgICAgICBvbk5vZGVEaXNjYXJkZWQoZnJvbU5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRvTm9kZS5pc1NhbWVOb2RlICYmIHRvTm9kZS5pc1NhbWVOb2RlKG1vcnBoZWROb2RlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbW9ycGhFbChtb3JwaGVkTm9kZSwgdG9Ob2RlLCBjaGlsZHJlbk9ubHkpO1xuXG4gICAgICAgICAgICAvLyBXZSBub3cgbmVlZCB0byBsb29wIG92ZXIgYW55IGtleWVkIG5vZGVzIHRoYXQgbWlnaHQgbmVlZCB0byBiZVxuICAgICAgICAgICAgLy8gcmVtb3ZlZC4gV2Ugb25seSBkbyB0aGUgcmVtb3ZhbCBpZiB3ZSBrbm93IHRoYXQgdGhlIGtleWVkIG5vZGVcbiAgICAgICAgICAgIC8vIG5ldmVyIGZvdW5kIGEgbWF0Y2guIFdoZW4gYSBrZXllZCBub2RlIGlzIG1hdGNoZWQgdXAgd2UgcmVtb3ZlXG4gICAgICAgICAgICAvLyBpdCBvdXQgb2YgZnJvbU5vZGVzTG9va3VwIGFuZCB3ZSB1c2UgZnJvbU5vZGVzTG9va3VwIHRvIGRldGVybWluZVxuICAgICAgICAgICAgLy8gaWYgYSBrZXllZCBub2RlIGhhcyBiZWVuIG1hdGNoZWQgdXAgb3Igbm90XG4gICAgICAgICAgICBpZiAoa2V5ZWRSZW1vdmFsTGlzdCkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGk9MCwgbGVuPWtleWVkUmVtb3ZhbExpc3QubGVuZ3RoOyBpPGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbFRvUmVtb3ZlID0gZnJvbU5vZGVzTG9va3VwW2tleWVkUmVtb3ZhbExpc3RbaV1dO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxUb1JlbW92ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTm9kZShlbFRvUmVtb3ZlLCBlbFRvUmVtb3ZlLnBhcmVudE5vZGUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY2hpbGRyZW5Pbmx5ICYmIG1vcnBoZWROb2RlICE9PSBmcm9tTm9kZSAmJiBmcm9tTm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBpZiAobW9ycGhlZE5vZGUuYWN0dWFsaXplKSB7XG4gICAgICAgICAgICAgICAgbW9ycGhlZE5vZGUgPSBtb3JwaGVkTm9kZS5hY3R1YWxpemUoZnJvbU5vZGUub3duZXJEb2N1bWVudCB8fCBkb2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgd2UgaGFkIHRvIHN3YXAgb3V0IHRoZSBmcm9tIG5vZGUgd2l0aCBhIG5ldyBub2RlIGJlY2F1c2UgdGhlIG9sZFxuICAgICAgICAgICAgLy8gbm9kZSB3YXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgdGFyZ2V0IG5vZGUgdGhlbiB3ZSBuZWVkIHRvXG4gICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBvbGQgRE9NIG5vZGUgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlLiBUaGlzIGlzIG9ubHlcbiAgICAgICAgICAgIC8vIHBvc3NpYmxlIGlmIHRoZSBvcmlnaW5hbCBET00gbm9kZSB3YXMgcGFydCBvZiBhIERPTSB0cmVlIHdoaWNoXG4gICAgICAgICAgICAvLyB3ZSBrbm93IGlzIHRoZSBjYXNlIGlmIGl0IGhhcyBhIHBhcmVudCBub2RlLlxuICAgICAgICAgICAgZnJvbU5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobW9ycGhlZE5vZGUsIGZyb21Ob2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtb3JwaGVkTm9kZTtcbiAgICB9O1xufVxuXG52YXIgbW9ycGhkb20gPSBtb3JwaGRvbUZhY3RvcnkobW9ycGhBdHRycyk7XG5cbmV4cG9ydCBkZWZhdWx0IG1vcnBoZG9tO1xuIiwgImltcG9ydCB7XG4gIFBIWF9DT01QT05FTlQsXG4gIFBIWF9ESVNBQkxFX1dJVEgsXG4gIFBIWF9GRUVEQkFDS19GT1IsXG4gIFBIWF9QUlVORSxcbiAgUEhYX1JPT1RfSUQsXG4gIFBIWF9TRVNTSU9OLFxuICBQSFhfU0tJUCxcbiAgUEhYX1NUQVRJQyxcbiAgUEhYX1RSSUdHRVJfQUNUSU9OLFxuICBQSFhfVVBEQVRFXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGRldGVjdER1cGxpY2F0ZUlkcyxcbiAgaXNDaWRcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbVwiXG5pbXBvcnQgRE9NUG9zdE1vcnBoUmVzdG9yZXIgZnJvbSBcIi4vZG9tX3Bvc3RfbW9ycGhfcmVzdG9yZXJcIlxuaW1wb3J0IG1vcnBoZG9tIGZyb20gXCJtb3JwaGRvbVwiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERPTVBhdGNoIHtcbiAgc3RhdGljIHBhdGNoRWwoZnJvbUVsLCB0b0VsLCBhY3RpdmVFbGVtZW50KXtcbiAgICBtb3JwaGRvbShmcm9tRWwsIHRvRWwsIHtcbiAgICAgIGNoaWxkcmVuT25seTogZmFsc2UsXG4gICAgICBvbkJlZm9yZUVsVXBkYXRlZDogKGZyb21FbCwgdG9FbCkgPT4ge1xuICAgICAgICBpZihhY3RpdmVFbGVtZW50ICYmIGFjdGl2ZUVsZW1lbnQuaXNTYW1lTm9kZShmcm9tRWwpICYmIERPTS5pc0Zvcm1JbnB1dChmcm9tRWwpKXtcbiAgICAgICAgICBET00ubWVyZ2VGb2N1c2VkSW5wdXQoZnJvbUVsLCB0b0VsKVxuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHZpZXcsIGNvbnRhaW5lciwgaWQsIGh0bWwsIHRhcmdldENJRCl7XG4gICAgdGhpcy52aWV3ID0gdmlld1xuICAgIHRoaXMubGl2ZVNvY2tldCA9IHZpZXcubGl2ZVNvY2tldFxuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyXG4gICAgdGhpcy5pZCA9IGlkXG4gICAgdGhpcy5yb290SUQgPSB2aWV3LnJvb3QuaWRcbiAgICB0aGlzLmh0bWwgPSBodG1sXG4gICAgdGhpcy50YXJnZXRDSUQgPSB0YXJnZXRDSURcbiAgICB0aGlzLmNpZFBhdGNoID0gaXNDaWQodGhpcy50YXJnZXRDSUQpXG4gICAgdGhpcy5jYWxsYmFja3MgPSB7XG4gICAgICBiZWZvcmVhZGRlZDogW10sIGJlZm9yZXVwZGF0ZWQ6IFtdLCBiZWZvcmVwaHhDaGlsZEFkZGVkOiBbXSxcbiAgICAgIGFmdGVyYWRkZWQ6IFtdLCBhZnRlcnVwZGF0ZWQ6IFtdLCBhZnRlcmRpc2NhcmRlZDogW10sIGFmdGVycGh4Q2hpbGRBZGRlZDogW10sXG4gICAgICBhZnRlcnRyYW5zaXRpb25zRGlzY2FyZGVkOiBbXVxuICAgIH1cbiAgfVxuXG4gIGJlZm9yZShraW5kLCBjYWxsYmFjayl7IHRoaXMuY2FsbGJhY2tzW2BiZWZvcmUke2tpbmR9YF0ucHVzaChjYWxsYmFjaykgfVxuICBhZnRlcihraW5kLCBjYWxsYmFjayl7IHRoaXMuY2FsbGJhY2tzW2BhZnRlciR7a2luZH1gXS5wdXNoKGNhbGxiYWNrKSB9XG5cbiAgdHJhY2tCZWZvcmUoa2luZCwgLi4uYXJncyl7XG4gICAgdGhpcy5jYWxsYmFja3NbYGJlZm9yZSR7a2luZH1gXS5mb3JFYWNoKGNhbGxiYWNrID0+IGNhbGxiYWNrKC4uLmFyZ3MpKVxuICB9XG5cbiAgdHJhY2tBZnRlcihraW5kLCAuLi5hcmdzKXtcbiAgICB0aGlzLmNhbGxiYWNrc1tgYWZ0ZXIke2tpbmR9YF0uZm9yRWFjaChjYWxsYmFjayA9PiBjYWxsYmFjayguLi5hcmdzKSlcbiAgfVxuXG4gIG1hcmtQcnVuYWJsZUNvbnRlbnRGb3JSZW1vdmFsKCl7XG4gICAgRE9NLmFsbCh0aGlzLmNvbnRhaW5lciwgXCJbcGh4LXVwZGF0ZT1hcHBlbmRdID4gKiwgW3BoeC11cGRhdGU9cHJlcGVuZF0gPiAqXCIsIGVsID0+IHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfUFJVTkUsIFwiXCIpXG4gICAgfSlcbiAgfVxuXG4gIHBlcmZvcm0oKXtcbiAgICBsZXQge3ZpZXcsIGxpdmVTb2NrZXQsIGNvbnRhaW5lciwgaHRtbH0gPSB0aGlzXG4gICAgbGV0IHRhcmdldENvbnRhaW5lciA9IHRoaXMuaXNDSURQYXRjaCgpID8gdGhpcy50YXJnZXRDSURDb250YWluZXIoaHRtbCkgOiBjb250YWluZXJcbiAgICBpZih0aGlzLmlzQ0lEUGF0Y2goKSAmJiAhdGFyZ2V0Q29udGFpbmVyKXsgcmV0dXJuIH1cblxuICAgIGxldCBmb2N1c2VkID0gbGl2ZVNvY2tldC5nZXRBY3RpdmVFbGVtZW50KClcbiAgICBsZXQge3NlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmR9ID0gZm9jdXNlZCAmJiBET00uaGFzU2VsZWN0aW9uUmFuZ2UoZm9jdXNlZCkgPyBmb2N1c2VkIDoge31cbiAgICBsZXQgcGh4VXBkYXRlID0gbGl2ZVNvY2tldC5iaW5kaW5nKFBIWF9VUERBVEUpXG4gICAgbGV0IHBoeEZlZWRiYWNrRm9yID0gbGl2ZVNvY2tldC5iaW5kaW5nKFBIWF9GRUVEQkFDS19GT1IpXG4gICAgbGV0IGRpc2FibGVXaXRoID0gbGl2ZVNvY2tldC5iaW5kaW5nKFBIWF9ESVNBQkxFX1dJVEgpXG4gICAgbGV0IHBoeFRyaWdnZXJFeHRlcm5hbCA9IGxpdmVTb2NrZXQuYmluZGluZyhQSFhfVFJJR0dFUl9BQ1RJT04pXG4gICAgbGV0IHBoeFJlbW92ZSA9IGxpdmVTb2NrZXQuYmluZGluZyhcInJlbW92ZVwiKVxuICAgIGxldCBhZGRlZCA9IFtdXG4gICAgbGV0IHVwZGF0ZXMgPSBbXVxuICAgIGxldCBhcHBlbmRQcmVwZW5kVXBkYXRlcyA9IFtdXG4gICAgbGV0IHBlbmRpbmdSZW1vdmVzID0gW11cbiAgICBsZXQgZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkID0gbnVsbFxuXG4gICAgbGV0IGRpZmZIVE1MID0gbGl2ZVNvY2tldC50aW1lKFwicHJlbW9ycGggY29udGFpbmVyIHByZXBcIiwgKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGREaWZmSFRNTChjb250YWluZXIsIGh0bWwsIHBoeFVwZGF0ZSwgdGFyZ2V0Q29udGFpbmVyKVxuICAgIH0pXG5cbiAgICB0aGlzLnRyYWNrQmVmb3JlKFwiYWRkZWRcIiwgY29udGFpbmVyKVxuICAgIHRoaXMudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsIGNvbnRhaW5lciwgY29udGFpbmVyKVxuXG4gICAgbGl2ZVNvY2tldC50aW1lKFwibW9ycGhkb21cIiwgKCkgPT4ge1xuICAgICAgbW9ycGhkb20odGFyZ2V0Q29udGFpbmVyLCBkaWZmSFRNTCwge1xuICAgICAgICBjaGlsZHJlbk9ubHk6IHRhcmdldENvbnRhaW5lci5nZXRBdHRyaWJ1dGUoUEhYX0NPTVBPTkVOVCkgPT09IG51bGwsXG4gICAgICAgIGdldE5vZGVLZXk6IChub2RlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIERPTS5pc1BoeERlc3Ryb3llZChub2RlKSA/IG51bGwgOiBub2RlLmlkXG4gICAgICAgIH0sXG4gICAgICAgIG9uQmVmb3JlTm9kZUFkZGVkOiAoZWwpID0+IHtcbiAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwiYWRkZWRcIiwgZWwpXG4gICAgICAgICAgcmV0dXJuIGVsXG4gICAgICAgIH0sXG4gICAgICAgIG9uTm9kZUFkZGVkOiAoZWwpID0+IHtcbiAgICAgICAgICAvLyBoYWNrIHRvIGZpeCBTYWZhcmkgaGFuZGxpbmcgb2YgaW1nIHNyY3NldCBhbmQgdmlkZW8gdGFnc1xuICAgICAgICAgIGlmKGVsIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCAmJiBlbC5zcmNzZXQpe1xuICAgICAgICAgICAgZWwuc3Jjc2V0ID0gZWwuc3Jjc2V0XG4gICAgICAgICAgfSBlbHNlIGlmKGVsIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCAmJiBlbC5hdXRvcGxheSl7XG4gICAgICAgICAgICBlbC5wbGF5KClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoRE9NLmlzTm93VHJpZ2dlckZvcm1FeHRlcm5hbChlbCwgcGh4VHJpZ2dlckV4dGVybmFsKSl7XG4gICAgICAgICAgICBleHRlcm5hbEZvcm1UcmlnZ2VyZWQgPSBlbFxuICAgICAgICAgIH1cbiAgICAgICAgICAvL2lucHV0IGhhbmRsaW5nXG4gICAgICAgICAgRE9NLmRpc2NhcmRFcnJvcih0YXJnZXRDb250YWluZXIsIGVsLCBwaHhGZWVkYmFja0ZvcilcbiAgICAgICAgICAvLyBuZXN0ZWQgdmlldyBoYW5kbGluZ1xuICAgICAgICAgIGlmKChET00uaXNQaHhDaGlsZChlbCkgJiYgdmlldy5vd25zRWxlbWVudChlbCkpIHx8IERPTS5pc1BoeFN0aWNreShlbCkgJiYgdmlldy5vd25zRWxlbWVudChlbC5wYXJlbnROb2RlKSl7XG4gICAgICAgICAgICB0aGlzLnRyYWNrQWZ0ZXIoXCJwaHhDaGlsZEFkZGVkXCIsIGVsKVxuICAgICAgICAgIH1cbiAgICAgICAgICBhZGRlZC5wdXNoKGVsKVxuICAgICAgICB9LFxuICAgICAgICBvbk5vZGVEaXNjYXJkZWQ6IChlbCkgPT4ge1xuICAgICAgICAgIC8vIG5lc3RlZCB2aWV3IGhhbmRsaW5nXG4gICAgICAgICAgaWYoRE9NLmlzUGh4Q2hpbGQoZWwpIHx8IERPTS5pc1BoeFN0aWNreShlbCkpeyBsaXZlU29ja2V0LmRlc3Ryb3lWaWV3QnlFbChlbCkgfVxuICAgICAgICAgIHRoaXMudHJhY2tBZnRlcihcImRpc2NhcmRlZFwiLCBlbClcbiAgICAgICAgfSxcbiAgICAgICAgb25CZWZvcmVOb2RlRGlzY2FyZGVkOiAoZWwpID0+IHtcbiAgICAgICAgICBpZihlbC5nZXRBdHRyaWJ1dGUgJiYgZWwuZ2V0QXR0cmlidXRlKFBIWF9QUlVORSkgIT09IG51bGwpeyByZXR1cm4gdHJ1ZSB9XG4gICAgICAgICAgaWYoZWwucGFyZW50Tm9kZSAhPT0gbnVsbCAmJiBET00uaXNQaHhVcGRhdGUoZWwucGFyZW50Tm9kZSwgcGh4VXBkYXRlLCBbXCJhcHBlbmRcIiwgXCJwcmVwZW5kXCJdKSAmJiBlbC5pZCl7IHJldHVybiBmYWxzZSB9XG4gICAgICAgICAgaWYoZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShwaHhSZW1vdmUpKXtcbiAgICAgICAgICAgIHBlbmRpbmdSZW1vdmVzLnB1c2goZWwpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYodGhpcy5za2lwQ0lEU2libGluZyhlbCkpeyByZXR1cm4gZmFsc2UgfVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIG9uRWxVcGRhdGVkOiAoZWwpID0+IHtcbiAgICAgICAgICBpZihET00uaXNOb3dUcmlnZ2VyRm9ybUV4dGVybmFsKGVsLCBwaHhUcmlnZ2VyRXh0ZXJuYWwpKXtcbiAgICAgICAgICAgIGV4dGVybmFsRm9ybVRyaWdnZXJlZCA9IGVsXG4gICAgICAgICAgfVxuICAgICAgICAgIHVwZGF0ZXMucHVzaChlbClcbiAgICAgICAgfSxcbiAgICAgICAgb25CZWZvcmVFbFVwZGF0ZWQ6IChmcm9tRWwsIHRvRWwpID0+IHtcbiAgICAgICAgICBET00uY2xlYW5DaGlsZE5vZGVzKHRvRWwsIHBoeFVwZGF0ZSlcbiAgICAgICAgICBpZih0aGlzLnNraXBDSURTaWJsaW5nKHRvRWwpKXsgcmV0dXJuIGZhbHNlIH1cbiAgICAgICAgICBpZihET00uaXNQaHhTdGlja3koZnJvbUVsKSl7IHJldHVybiBmYWxzZSB9XG4gICAgICAgICAgaWYoRE9NLmlzSWdub3JlZChmcm9tRWwsIHBoeFVwZGF0ZSkpe1xuICAgICAgICAgICAgdGhpcy50cmFja0JlZm9yZShcInVwZGF0ZWRcIiwgZnJvbUVsLCB0b0VsKVxuICAgICAgICAgICAgRE9NLm1lcmdlQXR0cnMoZnJvbUVsLCB0b0VsLCB7aXNJZ25vcmVkOiB0cnVlfSlcbiAgICAgICAgICAgIHVwZGF0ZXMucHVzaChmcm9tRWwpXG4gICAgICAgICAgICBET00uYXBwbHlTdGlja3lPcGVyYXRpb25zKGZyb21FbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZihmcm9tRWwudHlwZSA9PT0gXCJudW1iZXJcIiAmJiAoZnJvbUVsLnZhbGlkaXR5ICYmIGZyb21FbC52YWxpZGl0eS5iYWRJbnB1dCkpeyByZXR1cm4gZmFsc2UgfVxuICAgICAgICAgIGlmKCFET00uc3luY1BlbmRpbmdSZWYoZnJvbUVsLCB0b0VsLCBkaXNhYmxlV2l0aCkpe1xuICAgICAgICAgICAgaWYoRE9NLmlzVXBsb2FkSW5wdXQoZnJvbUVsKSl7XG4gICAgICAgICAgICAgIHRoaXMudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsIGZyb21FbCwgdG9FbClcbiAgICAgICAgICAgICAgdXBkYXRlcy5wdXNoKGZyb21FbClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIERPTS5hcHBseVN0aWNreU9wZXJhdGlvbnMoZnJvbUVsKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICAgICAgICBpZihET00uaXNQaHhDaGlsZCh0b0VsKSl7XG4gICAgICAgICAgICBsZXQgcHJldlNlc3Npb24gPSBmcm9tRWwuZ2V0QXR0cmlidXRlKFBIWF9TRVNTSU9OKVxuICAgICAgICAgICAgRE9NLm1lcmdlQXR0cnMoZnJvbUVsLCB0b0VsLCB7ZXhjbHVkZTogW1BIWF9TVEFUSUNdfSlcbiAgICAgICAgICAgIGlmKHByZXZTZXNzaW9uICE9PSBcIlwiKXsgZnJvbUVsLnNldEF0dHJpYnV0ZShQSFhfU0VTU0lPTiwgcHJldlNlc3Npb24pIH1cbiAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdElEKVxuICAgICAgICAgICAgRE9NLmFwcGx5U3RpY2t5T3BlcmF0aW9ucyhmcm9tRWwpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBpbnB1dCBoYW5kbGluZ1xuICAgICAgICAgIERPTS5jb3B5UHJpdmF0ZXModG9FbCwgZnJvbUVsKVxuICAgICAgICAgIERPTS5kaXNjYXJkRXJyb3IodGFyZ2V0Q29udGFpbmVyLCB0b0VsLCBwaHhGZWVkYmFja0ZvcilcblxuICAgICAgICAgIGxldCBpc0ZvY3VzZWRGb3JtRWwgPSBmb2N1c2VkICYmIGZyb21FbC5pc1NhbWVOb2RlKGZvY3VzZWQpICYmIERPTS5pc0Zvcm1JbnB1dChmcm9tRWwpXG4gICAgICAgICAgaWYoaXNGb2N1c2VkRm9ybUVsKXtcbiAgICAgICAgICAgIHRoaXMudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsIGZyb21FbCwgdG9FbClcbiAgICAgICAgICAgIERPTS5tZXJnZUZvY3VzZWRJbnB1dChmcm9tRWwsIHRvRWwpXG4gICAgICAgICAgICBET00uc3luY0F0dHJzVG9Qcm9wcyhmcm9tRWwpXG4gICAgICAgICAgICB1cGRhdGVzLnB1c2goZnJvbUVsKVxuICAgICAgICAgICAgRE9NLmFwcGx5U3RpY2t5T3BlcmF0aW9ucyhmcm9tRWwpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYoRE9NLmlzUGh4VXBkYXRlKHRvRWwsIHBoeFVwZGF0ZSwgW1wiYXBwZW5kXCIsIFwicHJlcGVuZFwiXSkpe1xuICAgICAgICAgICAgICBhcHBlbmRQcmVwZW5kVXBkYXRlcy5wdXNoKG5ldyBET01Qb3N0TW9ycGhSZXN0b3Jlcihmcm9tRWwsIHRvRWwsIHRvRWwuZ2V0QXR0cmlidXRlKHBoeFVwZGF0ZSkpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgRE9NLnN5bmNBdHRyc1RvUHJvcHModG9FbClcbiAgICAgICAgICAgIERPTS5hcHBseVN0aWNreU9wZXJhdGlvbnModG9FbClcbiAgICAgICAgICAgIHRoaXMudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsIGZyb21FbCwgdG9FbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpZihsaXZlU29ja2V0LmlzRGVidWdFbmFibGVkKCkpeyBkZXRlY3REdXBsaWNhdGVJZHMoKSB9XG5cbiAgICBpZihhcHBlbmRQcmVwZW5kVXBkYXRlcy5sZW5ndGggPiAwKXtcbiAgICAgIGxpdmVTb2NrZXQudGltZShcInBvc3QtbW9ycGggYXBwZW5kL3ByZXBlbmQgcmVzdG9yYXRpb25cIiwgKCkgPT4ge1xuICAgICAgICBhcHBlbmRQcmVwZW5kVXBkYXRlcy5mb3JFYWNoKHVwZGF0ZSA9PiB1cGRhdGUucGVyZm9ybSgpKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBsaXZlU29ja2V0LnNpbGVuY2VFdmVudHMoKCkgPT4gRE9NLnJlc3RvcmVGb2N1cyhmb2N1c2VkLCBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKSlcbiAgICBET00uZGlzcGF0Y2hFdmVudChkb2N1bWVudCwgXCJwaHg6dXBkYXRlXCIpXG4gICAgYWRkZWQuZm9yRWFjaChlbCA9PiB0aGlzLnRyYWNrQWZ0ZXIoXCJhZGRlZFwiLCBlbCkpXG4gICAgdXBkYXRlcy5mb3JFYWNoKGVsID0+IHRoaXMudHJhY2tBZnRlcihcInVwZGF0ZWRcIiwgZWwpKVxuXG4gICAgaWYocGVuZGluZ1JlbW92ZXMubGVuZ3RoID4gMCl7XG4gICAgICBsaXZlU29ja2V0LnRyYW5zaXRpb25SZW1vdmVzKHBlbmRpbmdSZW1vdmVzKVxuICAgICAgbGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgcGVuZGluZ1JlbW92ZXMuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgbGV0IGNoaWxkID0gRE9NLmZpcnN0UGh4Q2hpbGQoZWwpXG4gICAgICAgICAgaWYoY2hpbGQpeyBsaXZlU29ja2V0LmRlc3Ryb3lWaWV3QnlFbChjaGlsZCkgfVxuICAgICAgICAgIGVsLnJlbW92ZSgpXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMudHJhY2tBZnRlcihcInRyYW5zaXRpb25zRGlzY2FyZGVkXCIsIHBlbmRpbmdSZW1vdmVzKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZihleHRlcm5hbEZvcm1UcmlnZ2VyZWQpe1xuICAgICAgbGl2ZVNvY2tldC5kaXNjb25uZWN0KClcbiAgICAgIGV4dGVybmFsRm9ybVRyaWdnZXJlZC5zdWJtaXQoKVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaXNDSURQYXRjaCgpeyByZXR1cm4gdGhpcy5jaWRQYXRjaCB9XG5cbiAgc2tpcENJRFNpYmxpbmcoZWwpe1xuICAgIHJldHVybiBlbC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgZWwuZ2V0QXR0cmlidXRlKFBIWF9TS0lQKSAhPT0gbnVsbFxuICB9XG5cbiAgdGFyZ2V0Q0lEQ29udGFpbmVyKGh0bWwpe1xuICAgIGlmKCF0aGlzLmlzQ0lEUGF0Y2goKSl7IHJldHVybiB9XG4gICAgbGV0IFtmaXJzdCwgLi4ucmVzdF0gPSBET00uZmluZENvbXBvbmVudE5vZGVMaXN0KHRoaXMuY29udGFpbmVyLCB0aGlzLnRhcmdldENJRClcbiAgICBpZihyZXN0Lmxlbmd0aCA9PT0gMCAmJiBET00uY2hpbGROb2RlTGVuZ3RoKGh0bWwpID09PSAxKXtcbiAgICAgIHJldHVybiBmaXJzdFxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmlyc3QgJiYgZmlyc3QucGFyZW50Tm9kZVxuICAgIH1cbiAgfVxuXG4gIC8vIGJ1aWxkcyBIVE1MIGZvciBtb3JwaGRvbSBwYXRjaFxuICAvLyAtIGZvciBmdWxsIHBhdGNoZXMgb2YgTGl2ZVZpZXcgb3IgYSBjb21wb25lbnQgd2l0aCBhIHNpbmdsZVxuICAvLyAgIHJvb3Qgbm9kZSwgc2ltcGx5IHJldHVybnMgdGhlIEhUTUxcbiAgLy8gLSBmb3IgcGF0Y2hlcyBvZiBhIGNvbXBvbmVudCB3aXRoIG11bHRpcGxlIHJvb3Qgbm9kZXMsIHRoZVxuICAvLyAgIHBhcmVudCBub2RlIGJlY29tZXMgdGhlIHRhcmdldCBjb250YWluZXIgYW5kIG5vbi1jb21wb25lbnRcbiAgLy8gICBzaWJsaW5ncyBhcmUgbWFya2VkIGFzIHNraXAuXG4gIGJ1aWxkRGlmZkhUTUwoY29udGFpbmVyLCBodG1sLCBwaHhVcGRhdGUsIHRhcmdldENvbnRhaW5lcil7XG4gICAgbGV0IGlzQ0lEUGF0Y2ggPSB0aGlzLmlzQ0lEUGF0Y2goKVxuICAgIGxldCBpc0NJRFdpdGhTaW5nbGVSb290ID0gaXNDSURQYXRjaCAmJiB0YXJnZXRDb250YWluZXIuZ2V0QXR0cmlidXRlKFBIWF9DT01QT05FTlQpID09PSB0aGlzLnRhcmdldENJRC50b1N0cmluZygpXG4gICAgaWYoIWlzQ0lEUGF0Y2ggfHwgaXNDSURXaXRoU2luZ2xlUm9vdCl7XG4gICAgICByZXR1cm4gaHRtbFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb21wb25lbnQgcGF0Y2ggd2l0aCBtdWx0aXBsZSBDSUQgcm9vdHNcbiAgICAgIGxldCBkaWZmQ29udGFpbmVyID0gbnVsbFxuICAgICAgbGV0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpXG4gICAgICBkaWZmQ29udGFpbmVyID0gRE9NLmNsb25lTm9kZSh0YXJnZXRDb250YWluZXIpXG4gICAgICBsZXQgW2ZpcnN0Q29tcG9uZW50LCAuLi5yZXN0XSA9IERPTS5maW5kQ29tcG9uZW50Tm9kZUxpc3QoZGlmZkNvbnRhaW5lciwgdGhpcy50YXJnZXRDSUQpXG4gICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sXG4gICAgICByZXN0LmZvckVhY2goZWwgPT4gZWwucmVtb3ZlKCkpXG4gICAgICBBcnJheS5mcm9tKGRpZmZDb250YWluZXIuY2hpbGROb2RlcykuZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgIC8vIHdlIGNhbiBvbmx5IHNraXAgdHJhY2thYmxlIG5vZGVzIHdpdGggYW4gSURcbiAgICAgICAgaWYoY2hpbGQuaWQgJiYgY2hpbGQubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGNoaWxkLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKSAhPT0gdGhpcy50YXJnZXRDSUQudG9TdHJpbmcoKSl7XG4gICAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKFBIWF9TS0lQLCBcIlwiKVxuICAgICAgICAgIGNoaWxkLmlubmVySFRNTCA9IFwiXCJcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIEFycmF5LmZyb20odGVtcGxhdGUuY29udGVudC5jaGlsZE5vZGVzKS5mb3JFYWNoKGVsID0+IGRpZmZDb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsLCBmaXJzdENvbXBvbmVudCkpXG4gICAgICBmaXJzdENvbXBvbmVudC5yZW1vdmUoKVxuICAgICAgcmV0dXJuIGRpZmZDb250YWluZXIub3V0ZXJIVE1MXG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgQ09NUE9ORU5UUyxcbiAgRFlOQU1JQ1MsXG4gIFRFTVBMQVRFUyxcbiAgRVZFTlRTLFxuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfU0tJUCxcbiAgUkVQTFksXG4gIFNUQVRJQyxcbiAgVElUTEVcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IHtcbiAgaXNPYmplY3QsXG4gIGxvZ0Vycm9yLFxuICBpc0NpZCxcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZW5kZXJlZCB7XG4gIHN0YXRpYyBleHRyYWN0KGRpZmYpe1xuICAgIGxldCB7W1JFUExZXTogcmVwbHksIFtFVkVOVFNdOiBldmVudHMsIFtUSVRMRV06IHRpdGxlfSA9IGRpZmZcbiAgICBkZWxldGUgZGlmZltSRVBMWV1cbiAgICBkZWxldGUgZGlmZltFVkVOVFNdXG4gICAgZGVsZXRlIGRpZmZbVElUTEVdXG4gICAgcmV0dXJuIHtkaWZmLCB0aXRsZSwgcmVwbHk6IHJlcGx5IHx8IG51bGwsIGV2ZW50czogZXZlbnRzIHx8IFtdfVxuICB9XG5cbiAgY29uc3RydWN0b3Iodmlld0lkLCByZW5kZXJlZCl7XG4gICAgdGhpcy52aWV3SWQgPSB2aWV3SWRcbiAgICB0aGlzLnJlbmRlcmVkID0ge31cbiAgICB0aGlzLm1lcmdlRGlmZihyZW5kZXJlZClcbiAgfVxuXG4gIHBhcmVudFZpZXdJZCgpeyByZXR1cm4gdGhpcy52aWV3SWQgfVxuXG4gIHRvU3RyaW5nKG9ubHlDaWRzKXtcbiAgICByZXR1cm4gdGhpcy5yZWN1cnNpdmVUb1N0cmluZyh0aGlzLnJlbmRlcmVkLCB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdLCBvbmx5Q2lkcylcbiAgfVxuXG4gIHJlY3Vyc2l2ZVRvU3RyaW5nKHJlbmRlcmVkLCBjb21wb25lbnRzID0gcmVuZGVyZWRbQ09NUE9ORU5UU10sIG9ubHlDaWRzKXtcbiAgICBvbmx5Q2lkcyA9IG9ubHlDaWRzID8gbmV3IFNldChvbmx5Q2lkcykgOiBudWxsXG4gICAgbGV0IG91dHB1dCA9IHtidWZmZXI6IFwiXCIsIGNvbXBvbmVudHM6IGNvbXBvbmVudHMsIG9ubHlDaWRzOiBvbmx5Q2lkc31cbiAgICB0aGlzLnRvT3V0cHV0QnVmZmVyKHJlbmRlcmVkLCBudWxsLCBvdXRwdXQpXG4gICAgcmV0dXJuIG91dHB1dC5idWZmZXJcbiAgfVxuXG4gIGNvbXBvbmVudENJRHMoZGlmZil7IHJldHVybiBPYmplY3Qua2V5cyhkaWZmW0NPTVBPTkVOVFNdIHx8IHt9KS5tYXAoaSA9PiBwYXJzZUludChpKSkgfVxuXG4gIGlzQ29tcG9uZW50T25seURpZmYoZGlmZil7XG4gICAgaWYoIWRpZmZbQ09NUE9ORU5UU10peyByZXR1cm4gZmFsc2UgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhkaWZmKS5sZW5ndGggPT09IDFcbiAgfVxuXG4gIGdldENvbXBvbmVudChkaWZmLCBjaWQpeyByZXR1cm4gZGlmZltDT01QT05FTlRTXVtjaWRdIH1cblxuICBtZXJnZURpZmYoZGlmZil7XG4gICAgbGV0IG5ld2MgPSBkaWZmW0NPTVBPTkVOVFNdXG4gICAgbGV0IGNhY2hlID0ge31cbiAgICBkZWxldGUgZGlmZltDT01QT05FTlRTXVxuICAgIHRoaXMucmVuZGVyZWQgPSB0aGlzLm11dGFibGVNZXJnZSh0aGlzLnJlbmRlcmVkLCBkaWZmKVxuICAgIHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU10gPSB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdIHx8IHt9XG5cbiAgICBpZihuZXdjKXtcbiAgICAgIGxldCBvbGRjID0gdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXVxuXG4gICAgICBmb3IobGV0IGNpZCBpbiBuZXdjKXtcbiAgICAgICAgbmV3Y1tjaWRdID0gdGhpcy5jYWNoZWRGaW5kQ29tcG9uZW50KGNpZCwgbmV3Y1tjaWRdLCBvbGRjLCBuZXdjLCBjYWNoZSlcbiAgICAgIH1cblxuICAgICAgZm9yKGxldCBjaWQgaW4gbmV3Yyl7IG9sZGNbY2lkXSA9IG5ld2NbY2lkXSB9XG4gICAgICBkaWZmW0NPTVBPTkVOVFNdID0gbmV3Y1xuICAgIH1cbiAgfVxuXG4gIGNhY2hlZEZpbmRDb21wb25lbnQoY2lkLCBjZGlmZiwgb2xkYywgbmV3YywgY2FjaGUpe1xuICAgIGlmKGNhY2hlW2NpZF0pe1xuICAgICAgcmV0dXJuIGNhY2hlW2NpZF1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG5kaWZmLCBzdGF0LCBzY2lkID0gY2RpZmZbU1RBVElDXVxuXG4gICAgICBpZihpc0NpZChzY2lkKSl7XG4gICAgICAgIGxldCB0ZGlmZlxuXG4gICAgICAgIGlmKHNjaWQgPiAwKXtcbiAgICAgICAgICB0ZGlmZiA9IHRoaXMuY2FjaGVkRmluZENvbXBvbmVudChzY2lkLCBuZXdjW3NjaWRdLCBvbGRjLCBuZXdjLCBjYWNoZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZGlmZiA9IG9sZGNbLXNjaWRdXG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ID0gdGRpZmZbU1RBVElDXVxuICAgICAgICBuZGlmZiA9IHRoaXMuY2xvbmVNZXJnZSh0ZGlmZiwgY2RpZmYpXG4gICAgICAgIG5kaWZmW1NUQVRJQ10gPSBzdGF0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZGlmZiA9IGNkaWZmW1NUQVRJQ10gIT09IHVuZGVmaW5lZCA/IGNkaWZmIDogdGhpcy5jbG9uZU1lcmdlKG9sZGNbY2lkXSB8fCB7fSwgY2RpZmYpXG4gICAgICB9XG5cbiAgICAgIGNhY2hlW2NpZF0gPSBuZGlmZlxuICAgICAgcmV0dXJuIG5kaWZmXG4gICAgfVxuICB9XG5cbiAgbXV0YWJsZU1lcmdlKHRhcmdldCwgc291cmNlKXtcbiAgICBpZihzb3VyY2VbU1RBVElDXSAhPT0gdW5kZWZpbmVkKXtcbiAgICAgIHJldHVybiBzb3VyY2VcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kb011dGFibGVNZXJnZSh0YXJnZXQsIHNvdXJjZSlcbiAgICAgIHJldHVybiB0YXJnZXRcbiAgICB9XG4gIH1cblxuICBkb011dGFibGVNZXJnZSh0YXJnZXQsIHNvdXJjZSl7XG4gICAgZm9yKGxldCBrZXkgaW4gc291cmNlKXtcbiAgICAgIGxldCB2YWwgPSBzb3VyY2Vba2V5XVxuICAgICAgbGV0IHRhcmdldFZhbCA9IHRhcmdldFtrZXldXG4gICAgICBpZihpc09iamVjdCh2YWwpICYmIHZhbFtTVEFUSUNdID09PSB1bmRlZmluZWQgJiYgaXNPYmplY3QodGFyZ2V0VmFsKSl7XG4gICAgICAgIHRoaXMuZG9NdXRhYmxlTWVyZ2UodGFyZ2V0VmFsLCB2YWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHZhbFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNsb25lTWVyZ2UodGFyZ2V0LCBzb3VyY2Upe1xuICAgIGxldCBtZXJnZWQgPSB7Li4udGFyZ2V0LCAuLi5zb3VyY2V9XG4gICAgZm9yKGxldCBrZXkgaW4gbWVyZ2VkKXtcbiAgICAgIGxldCB2YWwgPSBzb3VyY2Vba2V5XVxuICAgICAgbGV0IHRhcmdldFZhbCA9IHRhcmdldFtrZXldXG4gICAgICBpZihpc09iamVjdCh2YWwpICYmIHZhbFtTVEFUSUNdID09PSB1bmRlZmluZWQgJiYgaXNPYmplY3QodGFyZ2V0VmFsKSl7XG4gICAgICAgIG1lcmdlZFtrZXldID0gdGhpcy5jbG9uZU1lcmdlKHRhcmdldFZhbCwgdmFsKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VkXG4gIH1cblxuICBjb21wb25lbnRUb1N0cmluZyhjaWQpeyByZXR1cm4gdGhpcy5yZWN1cnNpdmVDSURUb1N0cmluZyh0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdLCBjaWQpIH1cblxuICBwcnVuZUNJRHMoY2lkcyl7XG4gICAgY2lkcy5mb3JFYWNoKGNpZCA9PiBkZWxldGUgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXVtjaWRdKVxuICB9XG5cbiAgLy8gcHJpdmF0ZVxuXG4gIGdldCgpeyByZXR1cm4gdGhpcy5yZW5kZXJlZCB9XG5cbiAgaXNOZXdGaW5nZXJwcmludChkaWZmID0ge30peyByZXR1cm4gISFkaWZmW1NUQVRJQ10gfVxuXG4gIHRlbXBsYXRlU3RhdGljKHBhcnQsIHRlbXBsYXRlcyl7XG4gICAgaWYodHlwZW9mIChwYXJ0KSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmV0dXJuIHRlbXBsYXRlc1twYXJ0XVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcGFydFxuICAgIH1cbiAgfVxuXG4gIHRvT3V0cHV0QnVmZmVyKHJlbmRlcmVkLCB0ZW1wbGF0ZXMsIG91dHB1dCl7XG4gICAgaWYocmVuZGVyZWRbRFlOQU1JQ1NdKXsgcmV0dXJuIHRoaXMuY29tcHJlaGVuc2lvblRvQnVmZmVyKHJlbmRlcmVkLCB0ZW1wbGF0ZXMsIG91dHB1dCkgfVxuICAgIGxldCB7W1NUQVRJQ106IHN0YXRpY3N9ID0gcmVuZGVyZWRcbiAgICBzdGF0aWNzID0gdGhpcy50ZW1wbGF0ZVN0YXRpYyhzdGF0aWNzLCB0ZW1wbGF0ZXMpXG5cbiAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3NbMF1cbiAgICBmb3IobGV0IGkgPSAxOyBpIDwgc3RhdGljcy5sZW5ndGg7IGkrKyl7XG4gICAgICB0aGlzLmR5bmFtaWNUb0J1ZmZlcihyZW5kZXJlZFtpIC0gMV0sIHRlbXBsYXRlcywgb3V0cHV0KVxuICAgICAgb3V0cHV0LmJ1ZmZlciArPSBzdGF0aWNzW2ldXG4gICAgfVxuICB9XG5cbiAgY29tcHJlaGVuc2lvblRvQnVmZmVyKHJlbmRlcmVkLCB0ZW1wbGF0ZXMsIG91dHB1dCl7XG4gICAgbGV0IHtbRFlOQU1JQ1NdOiBkeW5hbWljcywgW1NUQVRJQ106IHN0YXRpY3N9ID0gcmVuZGVyZWRcbiAgICBzdGF0aWNzID0gdGhpcy50ZW1wbGF0ZVN0YXRpYyhzdGF0aWNzLCB0ZW1wbGF0ZXMpXG4gICAgbGV0IGNvbXBUZW1wbGF0ZXMgPSB0ZW1wbGF0ZXMgfHwgcmVuZGVyZWRbVEVNUExBVEVTXVxuXG4gICAgZm9yKGxldCBkID0gMDsgZCA8IGR5bmFtaWNzLmxlbmd0aDsgZCsrKXtcbiAgICAgIGxldCBkeW5hbWljID0gZHluYW1pY3NbZF1cbiAgICAgIG91dHB1dC5idWZmZXIgKz0gc3RhdGljc1swXVxuICAgICAgZm9yKGxldCBpID0gMTsgaSA8IHN0YXRpY3MubGVuZ3RoOyBpKyspe1xuICAgICAgICB0aGlzLmR5bmFtaWNUb0J1ZmZlcihkeW5hbWljW2kgLSAxXSwgY29tcFRlbXBsYXRlcywgb3V0cHV0KVxuICAgICAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3NbaV1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkeW5hbWljVG9CdWZmZXIocmVuZGVyZWQsIHRlbXBsYXRlcywgb3V0cHV0KXtcbiAgICBpZih0eXBlb2YgKHJlbmRlcmVkKSA9PT0gXCJudW1iZXJcIil7XG4gICAgICBvdXRwdXQuYnVmZmVyICs9IHRoaXMucmVjdXJzaXZlQ0lEVG9TdHJpbmcob3V0cHV0LmNvbXBvbmVudHMsIHJlbmRlcmVkLCBvdXRwdXQub25seUNpZHMpXG4gICAgfSBlbHNlIGlmKGlzT2JqZWN0KHJlbmRlcmVkKSl7XG4gICAgICB0aGlzLnRvT3V0cHV0QnVmZmVyKHJlbmRlcmVkLCB0ZW1wbGF0ZXMsIG91dHB1dClcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LmJ1ZmZlciArPSByZW5kZXJlZFxuICAgIH1cbiAgfVxuXG4gIHJlY3Vyc2l2ZUNJRFRvU3RyaW5nKGNvbXBvbmVudHMsIGNpZCwgb25seUNpZHMpe1xuICAgIGxldCBjb21wb25lbnQgPSBjb21wb25lbnRzW2NpZF0gfHwgbG9nRXJyb3IoYG5vIGNvbXBvbmVudCBmb3IgQ0lEICR7Y2lkfWAsIGNvbXBvbmVudHMpXG4gICAgbGV0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpXG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gdGhpcy5yZWN1cnNpdmVUb1N0cmluZyhjb21wb25lbnQsIGNvbXBvbmVudHMsIG9ubHlDaWRzKVxuICAgIGxldCBjb250YWluZXIgPSB0ZW1wbGF0ZS5jb250ZW50XG4gICAgbGV0IHNraXAgPSBvbmx5Q2lkcyAmJiAhb25seUNpZHMuaGFzKGNpZClcblxuICAgIGxldCBbaGFzQ2hpbGROb2RlcywgaGFzQ2hpbGRDb21wb25lbnRzXSA9XG4gICAgICBBcnJheS5mcm9tKGNvbnRhaW5lci5jaGlsZE5vZGVzKS5yZWR1Y2UoKFtoYXNOb2RlcywgaGFzQ29tcG9uZW50c10sIGNoaWxkLCBpKSA9PiB7XG4gICAgICAgIGlmKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSl7XG4gICAgICAgICAgaWYoY2hpbGQuZ2V0QXR0cmlidXRlKFBIWF9DT01QT05FTlQpKXtcbiAgICAgICAgICAgIHJldHVybiBbaGFzTm9kZXMsIHRydWVdXG4gICAgICAgICAgfVxuICAgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5ULCBjaWQpXG4gICAgICAgICAgaWYoIWNoaWxkLmlkKXsgY2hpbGQuaWQgPSBgJHt0aGlzLnBhcmVudFZpZXdJZCgpfS0ke2NpZH0tJHtpfWAgfVxuICAgICAgICAgIGlmKHNraXApe1xuICAgICAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKFBIWF9TS0lQLCBcIlwiKVxuICAgICAgICAgICAgY2hpbGQuaW5uZXJIVE1MID0gXCJcIlxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gW3RydWUsIGhhc0NvbXBvbmVudHNdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYoY2hpbGQubm9kZVZhbHVlLnRyaW0oKSAhPT0gXCJcIil7XG4gICAgICAgICAgICBsb2dFcnJvcihcIm9ubHkgSFRNTCBlbGVtZW50IHRhZ3MgYXJlIGFsbG93ZWQgYXQgdGhlIHJvb3Qgb2YgY29tcG9uZW50cy5cXG5cXG5cIiArXG4gICAgICAgICAgICAgIGBnb3Q6IFwiJHtjaGlsZC5ub2RlVmFsdWUudHJpbSgpfVwiXFxuXFxuYCArXG4gICAgICAgICAgICAgIFwid2l0aGluOlxcblwiLCB0ZW1wbGF0ZS5pbm5lckhUTUwudHJpbSgpKVxuICAgICAgICAgICAgY2hpbGQucmVwbGFjZVdpdGgodGhpcy5jcmVhdGVTcGFuKGNoaWxkLm5vZGVWYWx1ZSwgY2lkKSlcbiAgICAgICAgICAgIHJldHVybiBbdHJ1ZSwgaGFzQ29tcG9uZW50c11cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hpbGQucmVtb3ZlKClcbiAgICAgICAgICAgIHJldHVybiBbaGFzTm9kZXMsIGhhc0NvbXBvbmVudHNdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBbZmFsc2UsIGZhbHNlXSlcblxuICAgIGlmKCFoYXNDaGlsZE5vZGVzICYmICFoYXNDaGlsZENvbXBvbmVudHMpe1xuICAgICAgbG9nRXJyb3IoXCJleHBlY3RlZCBhdCBsZWFzdCBvbmUgSFRNTCBlbGVtZW50IHRhZyBpbnNpZGUgYSBjb21wb25lbnQsIGJ1dCB0aGUgY29tcG9uZW50IGlzIGVtcHR5OlxcblwiLFxuICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwudHJpbSgpKVxuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU3BhbihcIlwiLCBjaWQpLm91dGVySFRNTFxuICAgIH0gZWxzZSBpZighaGFzQ2hpbGROb2RlcyAmJiBoYXNDaGlsZENvbXBvbmVudHMpe1xuICAgICAgbG9nRXJyb3IoXCJleHBlY3RlZCBhdCBsZWFzdCBvbmUgSFRNTCBlbGVtZW50IHRhZyBkaXJlY3RseSBpbnNpZGUgYSBjb21wb25lbnQsIGJ1dCBvbmx5IHN1YmNvbXBvbmVudHMgd2VyZSBmb3VuZC4gQSBjb21wb25lbnQgbXVzdCByZW5kZXIgYXQgbGVhc3Qgb25lIEhUTUwgdGFnIGRpcmVjdGx5IGluc2lkZSBpdHNlbGYuXCIsXG4gICAgICAgIHRlbXBsYXRlLmlubmVySFRNTC50cmltKCkpXG4gICAgICByZXR1cm4gdGVtcGxhdGUuaW5uZXJIVE1MXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0ZW1wbGF0ZS5pbm5lckhUTUxcbiAgICB9XG4gIH1cblxuICBjcmVhdGVTcGFuKHRleHQsIGNpZCl7XG4gICAgbGV0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKVxuICAgIHNwYW4uaW5uZXJUZXh0ID0gdGV4dFxuICAgIHNwYW4uc2V0QXR0cmlidXRlKFBIWF9DT01QT05FTlQsIGNpZClcbiAgICByZXR1cm4gc3BhblxuICB9XG59XG4iLCAibGV0IHZpZXdIb29rSUQgPSAxXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWaWV3SG9vayB7XG4gIHN0YXRpYyBtYWtlSUQoKXsgcmV0dXJuIHZpZXdIb29rSUQrKyB9XG4gIHN0YXRpYyBlbGVtZW50SUQoZWwpeyByZXR1cm4gZWwucGh4SG9va0lkIH1cblxuICBjb25zdHJ1Y3Rvcih2aWV3LCBlbCwgY2FsbGJhY2tzKXtcbiAgICB0aGlzLl9fdmlldyA9IHZpZXdcbiAgICB0aGlzLl9fbGl2ZVNvY2tldCA9IHZpZXcubGl2ZVNvY2tldFxuICAgIHRoaXMuX19jYWxsYmFja3MgPSBjYWxsYmFja3NcbiAgICB0aGlzLl9fbGlzdGVuZXJzID0gbmV3IFNldCgpXG4gICAgdGhpcy5fX2lzRGlzY29ubmVjdGVkID0gZmFsc2VcbiAgICB0aGlzLmVsID0gZWxcbiAgICB0aGlzLmVsLnBoeEhvb2tJZCA9IHRoaXMuY29uc3RydWN0b3IubWFrZUlEKClcbiAgICBmb3IobGV0IGtleSBpbiB0aGlzLl9fY2FsbGJhY2tzKXsgdGhpc1trZXldID0gdGhpcy5fX2NhbGxiYWNrc1trZXldIH1cbiAgfVxuXG4gIF9fbW91bnRlZCgpeyB0aGlzLm1vdW50ZWQgJiYgdGhpcy5tb3VudGVkKCkgfVxuICBfX3VwZGF0ZWQoKXsgdGhpcy51cGRhdGVkICYmIHRoaXMudXBkYXRlZCgpIH1cbiAgX19iZWZvcmVVcGRhdGUoKXsgdGhpcy5iZWZvcmVVcGRhdGUgJiYgdGhpcy5iZWZvcmVVcGRhdGUoKSB9XG4gIF9fZGVzdHJveWVkKCl7IHRoaXMuZGVzdHJveWVkICYmIHRoaXMuZGVzdHJveWVkKCkgfVxuICBfX3JlY29ubmVjdGVkKCl7XG4gICAgaWYodGhpcy5fX2lzRGlzY29ubmVjdGVkKXtcbiAgICAgIHRoaXMuX19pc0Rpc2Nvbm5lY3RlZCA9IGZhbHNlXG4gICAgICB0aGlzLnJlY29ubmVjdGVkICYmIHRoaXMucmVjb25uZWN0ZWQoKVxuICAgIH1cbiAgfVxuICBfX2Rpc2Nvbm5lY3RlZCgpe1xuICAgIHRoaXMuX19pc0Rpc2Nvbm5lY3RlZCA9IHRydWVcbiAgICB0aGlzLmRpc2Nvbm5lY3RlZCAmJiB0aGlzLmRpc2Nvbm5lY3RlZCgpXG4gIH1cblxuICBwdXNoRXZlbnQoZXZlbnQsIHBheWxvYWQgPSB7fSwgb25SZXBseSA9IGZ1bmN0aW9uICgpeyB9KXtcbiAgICByZXR1cm4gdGhpcy5fX3ZpZXcucHVzaEhvb2tFdmVudChudWxsLCBldmVudCwgcGF5bG9hZCwgb25SZXBseSlcbiAgfVxuXG4gIHB1c2hFdmVudFRvKHBoeFRhcmdldCwgZXZlbnQsIHBheWxvYWQgPSB7fSwgb25SZXBseSA9IGZ1bmN0aW9uICgpeyB9KXtcbiAgICByZXR1cm4gdGhpcy5fX3ZpZXcud2l0aGluVGFyZ2V0cyhwaHhUYXJnZXQsICh2aWV3LCB0YXJnZXRDdHgpID0+IHtcbiAgICAgIHJldHVybiB2aWV3LnB1c2hIb29rRXZlbnQodGFyZ2V0Q3R4LCBldmVudCwgcGF5bG9hZCwgb25SZXBseSlcbiAgICB9KVxuICB9XG5cbiAgaGFuZGxlRXZlbnQoZXZlbnQsIGNhbGxiYWNrKXtcbiAgICBsZXQgY2FsbGJhY2tSZWYgPSAoY3VzdG9tRXZlbnQsIGJ5cGFzcykgPT4gYnlwYXNzID8gZXZlbnQgOiBjYWxsYmFjayhjdXN0b21FdmVudC5kZXRhaWwpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoYHBoeDoke2V2ZW50fWAsIGNhbGxiYWNrUmVmKVxuICAgIHRoaXMuX19saXN0ZW5lcnMuYWRkKGNhbGxiYWNrUmVmKVxuICAgIHJldHVybiBjYWxsYmFja1JlZlxuICB9XG5cbiAgcmVtb3ZlSGFuZGxlRXZlbnQoY2FsbGJhY2tSZWYpe1xuICAgIGxldCBldmVudCA9IGNhbGxiYWNrUmVmKG51bGwsIHRydWUpXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoYHBoeDoke2V2ZW50fWAsIGNhbGxiYWNrUmVmKVxuICAgIHRoaXMuX19saXN0ZW5lcnMuZGVsZXRlKGNhbGxiYWNrUmVmKVxuICB9XG5cbiAgdXBsb2FkKG5hbWUsIGZpbGVzKXtcbiAgICByZXR1cm4gdGhpcy5fX3ZpZXcuZGlzcGF0Y2hVcGxvYWRzKG5hbWUsIGZpbGVzKVxuICB9XG5cbiAgdXBsb2FkVG8ocGh4VGFyZ2V0LCBuYW1lLCBmaWxlcyl7XG4gICAgcmV0dXJuIHRoaXMuX192aWV3LndpdGhpblRhcmdldHMocGh4VGFyZ2V0LCB2aWV3ID0+IHZpZXcuZGlzcGF0Y2hVcGxvYWRzKG5hbWUsIGZpbGVzKSlcbiAgfVxuXG4gIF9fY2xlYW51cF9fKCl7XG4gICAgdGhpcy5fX2xpc3RlbmVycy5mb3JFYWNoKGNhbGxiYWNrUmVmID0+IHRoaXMucmVtb3ZlSGFuZGxlRXZlbnQoY2FsbGJhY2tSZWYpKVxuICB9XG59XG4iLCAiaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIlxuXG5sZXQgSlMgPSB7XG4gIGV4ZWMoZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGRlZmF1bHRzKXtcbiAgICBsZXQgW2RlZmF1bHRLaW5kLCBkZWZhdWx0QXJnc10gPSBkZWZhdWx0cyB8fCBbbnVsbCwge31dXG4gICAgbGV0IGNvbW1hbmRzID0gcGh4RXZlbnQuY2hhckF0KDApID09PSBcIltcIiA/XG4gICAgICBKU09OLnBhcnNlKHBoeEV2ZW50KSA6IFtbZGVmYXVsdEtpbmQsIGRlZmF1bHRBcmdzXV1cblxuICAgIGNvbW1hbmRzLmZvckVhY2goKFtraW5kLCBhcmdzXSkgPT4ge1xuICAgICAgaWYoa2luZCA9PT0gZGVmYXVsdEtpbmQgJiYgZGVmYXVsdEFyZ3MuZGF0YSl7XG4gICAgICAgIGFyZ3MuZGF0YSA9IE9iamVjdC5hc3NpZ24oYXJncy5kYXRhIHx8IHt9LCBkZWZhdWx0QXJncy5kYXRhKVxuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXJUb0Vscyhzb3VyY2VFbCwgYXJncykuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgIHRoaXNbYGV4ZWNfJHtraW5kfWBdKGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCwgYXJncylcbiAgICAgIH0pXG4gICAgfSlcbiAgfSxcblxuICBpc1Zpc2libGUoZWwpe1xuICAgIHJldHVybiAhIShlbC5vZmZzZXRXaWR0aCB8fCBlbC5vZmZzZXRIZWlnaHQgfHwgZWwuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPiAwKVxuICB9LFxuXG4gIC8vIHByaXZhdGVcblxuICAvLyBjb21tYW5kc1xuXG4gIGV4ZWNfZGlzcGF0Y2goZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7dG8sIGV2ZW50LCBkZXRhaWx9KXtcbiAgICBET00uZGlzcGF0Y2hFdmVudChlbCwgZXZlbnQsIGRldGFpbClcbiAgfSxcblxuICBleGVjX3B1c2goZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCBhcmdzKXtcbiAgICBsZXQge2V2ZW50LCBkYXRhLCB0YXJnZXQsIHBhZ2VfbG9hZGluZywgbG9hZGluZywgdmFsdWV9ID0gYXJnc1xuICAgIGxldCBwdXNoT3B0cyA9IHtsb2FkaW5nLCB2YWx1ZSwgdGFyZ2V0LCBwYWdlX2xvYWRpbmc6ICEhcGFnZV9sb2FkaW5nfVxuICAgIGxldCB0YXJnZXRTcmMgPSBldmVudFR5cGUgPT09IFwiY2hhbmdlXCIgPyBzb3VyY2VFbC5mb3JtIDogc291cmNlRWxcbiAgICBsZXQgcGh4VGFyZ2V0ID0gdGFyZ2V0IHx8IHRhcmdldFNyYy5nZXRBdHRyaWJ1dGUodmlldy5iaW5kaW5nKFwidGFyZ2V0XCIpKSB8fCB0YXJnZXRTcmNcbiAgICB2aWV3LndpdGhpblRhcmdldHMocGh4VGFyZ2V0LCAodGFyZ2V0VmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICBpZihldmVudFR5cGUgPT09IFwiY2hhbmdlXCIpe1xuICAgICAgICBsZXQge25ld0NpZCwgX3RhcmdldCwgY2FsbGJhY2t9ID0gYXJnc1xuICAgICAgICBpZihfdGFyZ2V0KXsgcHVzaE9wdHMuX3RhcmdldCA9IF90YXJnZXQgfVxuICAgICAgICB0YXJnZXRWaWV3LnB1c2hJbnB1dChzb3VyY2VFbCwgdGFyZ2V0Q3R4LCBuZXdDaWQsIGV2ZW50IHx8IHBoeEV2ZW50LCBwdXNoT3B0cywgY2FsbGJhY2spXG4gICAgICB9IGVsc2UgaWYoZXZlbnRUeXBlID09PSBcInN1Ym1pdFwiKXtcbiAgICAgICAgdGFyZ2V0Vmlldy5zdWJtaXRGb3JtKHNvdXJjZUVsLCB0YXJnZXRDdHgsIGV2ZW50IHx8IHBoeEV2ZW50LCBwdXNoT3B0cylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFZpZXcucHVzaEV2ZW50KGV2ZW50VHlwZSwgc291cmNlRWwsIHRhcmdldEN0eCwgZXZlbnQgfHwgcGh4RXZlbnQsIGRhdGEsIHB1c2hPcHRzKVxuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgZXhlY19hZGRfY2xhc3MoZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7bmFtZXMsIHRyYW5zaXRpb24sIHRpbWV9KXtcbiAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgbmFtZXMsIFtdLCB0cmFuc2l0aW9uLCB0aW1lLCB2aWV3KVxuICB9LFxuXG4gIGV4ZWNfcmVtb3ZlX2NsYXNzKGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCwge25hbWVzLCB0cmFuc2l0aW9uLCB0aW1lfSl7XG4gICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIFtdLCBuYW1lcywgdHJhbnNpdGlvbiwgdGltZSwgdmlldylcbiAgfSxcblxuICBleGVjX3RyYW5zaXRpb24oZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7dGltZSwgdHJhbnNpdGlvbn0pe1xuICAgIGxldCBbdHJhbnNpdGlvbl9zdGFydCwgcnVubmluZywgdHJhbnNpdGlvbl9lbmRdID0gdHJhbnNpdGlvblxuICAgIGxldCBvblN0YXJ0ID0gKCkgPT4gdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIHRyYW5zaXRpb25fc3RhcnQuY29uY2F0KHJ1bm5pbmcpLCBbXSlcbiAgICBsZXQgb25Eb25lID0gKCkgPT4gdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIHRyYW5zaXRpb25fZW5kLCB0cmFuc2l0aW9uX3N0YXJ0LmNvbmNhdChydW5uaW5nKSlcbiAgICB2aWV3LnRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25Eb25lKVxuICB9LFxuXG4gIGV4ZWNfdG9nZ2xlKGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCwge2Rpc3BsYXksIGlucywgb3V0cywgdGltZX0pe1xuICAgIHRoaXMudG9nZ2xlKGV2ZW50VHlwZSwgdmlldywgZWwsIGRpc3BsYXksIGlucywgb3V0cywgdGltZSlcbiAgfSxcblxuICBleGVjX3Nob3coZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7ZGlzcGxheSwgdHJhbnNpdGlvbiwgdGltZX0pe1xuICAgIHRoaXMuc2hvdyhldmVudFR5cGUsIHZpZXcsIGVsLCBkaXNwbGF5LCB0cmFuc2l0aW9uLCB0aW1lKVxuICB9LFxuXG4gIGV4ZWNfaGlkZShldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHtkaXNwbGF5LCB0cmFuc2l0aW9uLCB0aW1lfSl7XG4gICAgdGhpcy5oaWRlKGV2ZW50VHlwZSwgdmlldywgZWwsIGRpc3BsYXksIHRyYW5zaXRpb24sIHRpbWUpXG4gIH0sXG5cbiAgZXhlY19zZXRfYXR0cihldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHthdHRyOiBbYXR0ciwgdmFsXX0pe1xuICAgIHRoaXMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW1thdHRyLCB2YWxdXSwgW10pXG4gIH0sXG5cbiAgZXhlY19yZW1vdmVfYXR0cihldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHthdHRyfSl7XG4gICAgdGhpcy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbXSwgW2F0dHJdKVxuICB9LFxuXG4gIC8vIHV0aWxzIGZvciBjb21tYW5kc1xuXG4gIHNob3coZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgdHJhbnNpdGlvbiwgdGltZSl7XG4gICAgaWYoIXRoaXMuaXNWaXNpYmxlKGVsKSl7XG4gICAgICB0aGlzLnRvZ2dsZShldmVudFR5cGUsIHZpZXcsIGVsLCBkaXNwbGF5LCB0cmFuc2l0aW9uLCBudWxsLCB0aW1lKVxuICAgIH1cbiAgfSxcblxuICBoaWRlKGV2ZW50VHlwZSwgdmlldywgZWwsIGRpc3BsYXksIHRyYW5zaXRpb24sIHRpbWUpe1xuICAgIGlmKHRoaXMuaXNWaXNpYmxlKGVsKSl7XG4gICAgICB0aGlzLnRvZ2dsZShldmVudFR5cGUsIHZpZXcsIGVsLCBkaXNwbGF5LCBudWxsLCB0cmFuc2l0aW9uLCB0aW1lKVxuICAgIH1cbiAgfSxcblxuICB0b2dnbGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgaW5zLCBvdXRzLCB0aW1lKXtcbiAgICBsZXQgW2luQ2xhc3NlcywgaW5TdGFydENsYXNzZXMsIGluRW5kQ2xhc3Nlc10gPSBpbnMgfHwgW1tdLCBbXSwgW11dXG4gICAgbGV0IFtvdXRDbGFzc2VzLCBvdXRTdGFydENsYXNzZXMsIG91dEVuZENsYXNzZXNdID0gb3V0cyB8fCBbW10sIFtdLCBbXV1cbiAgICBpZihpbkNsYXNzZXMubGVuZ3RoID4gMCB8fCBvdXRDbGFzc2VzLmxlbmd0aCA+IDApe1xuICAgICAgaWYodGhpcy5pc1Zpc2libGUoZWwpKXtcbiAgICAgICAgbGV0IG9uU3RhcnQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIG91dFN0YXJ0Q2xhc3NlcywgaW5DbGFzc2VzLmNvbmNhdChpblN0YXJ0Q2xhc3NlcykuY29uY2F0KGluRW5kQ2xhc3NlcykpXG4gICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgb3V0Q2xhc3NlcywgW10pXG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBvdXRFbmRDbGFzc2VzLCBvdXRTdGFydENsYXNzZXMpKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6aGlkZS1zdGFydFwiKSlcbiAgICAgICAgdmlldy50cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgW10sIG91dENsYXNzZXMuY29uY2F0KG91dEVuZENsYXNzZXMpKVxuICAgICAgICAgIERPTS5wdXRTdGlja3koZWwsIFwidG9nZ2xlXCIsIGN1cnJlbnRFbCA9PiBjdXJyZW50RWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiKVxuICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OmhpZGUtZW5kXCIpKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYoZXZlbnRUeXBlID09PSBcInJlbW92ZVwiKXsgcmV0dXJuIH1cbiAgICAgICAgbGV0IG9uU3RhcnQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIGluU3RhcnRDbGFzc2VzLCBvdXRDbGFzc2VzLmNvbmNhdChvdXRTdGFydENsYXNzZXMpLmNvbmNhdChvdXRFbmRDbGFzc2VzKSlcbiAgICAgICAgICBET00ucHV0U3RpY2t5KGVsLCBcInRvZ2dsZVwiLCBjdXJyZW50RWwgPT4gY3VycmVudEVsLnN0eWxlLmRpc3BsYXkgPSAoZGlzcGxheSB8fCBcImJsb2NrXCIpKVxuICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIGluQ2xhc3NlcywgW10pXG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBpbkVuZENsYXNzZXMsIGluU3RhcnRDbGFzc2VzKSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OnNob3ctc3RhcnRcIikpXG4gICAgICAgIHZpZXcudHJhbnNpdGlvbih0aW1lLCBvblN0YXJ0LCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIFtdLCBpbkNsYXNzZXMuY29uY2F0KGluRW5kQ2xhc3NlcykpXG4gICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6c2hvdy1lbmRcIikpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKHRoaXMuaXNWaXNpYmxlKGVsKSl7XG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OmhpZGUtc3RhcnRcIikpXG4gICAgICAgICAgRE9NLnB1dFN0aWNreShlbCwgXCJ0b2dnbGVcIiwgY3VycmVudEVsID0+IGN1cnJlbnRFbC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCIpXG4gICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6aGlkZS1lbmRcIikpXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LXN0YXJ0XCIpKVxuICAgICAgICAgIERPTS5wdXRTdGlja3koZWwsIFwidG9nZ2xlXCIsIGN1cnJlbnRFbCA9PiBjdXJyZW50RWwuc3R5bGUuZGlzcGxheSA9IGRpc3BsYXkgfHwgXCJibG9ja1wiKVxuICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OnNob3ctZW5kXCIpKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBhZGRPclJlbW92ZUNsYXNzZXMoZWwsIGFkZHMsIHJlbW92ZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcpe1xuICAgIGxldCBbdHJhbnNpdGlvbl9ydW4sIHRyYW5zaXRpb25fc3RhcnQsIHRyYW5zaXRpb25fZW5kXSA9IHRyYW5zaXRpb24gfHwgW1tdLCBbXSwgW11dXG4gICAgaWYodHJhbnNpdGlvbl9ydW4ubGVuZ3RoID4gMCl7XG4gICAgICBsZXQgb25TdGFydCA9ICgpID0+IHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCB0cmFuc2l0aW9uX3N0YXJ0LmNvbmNhdCh0cmFuc2l0aW9uX3J1biksIFtdKVxuICAgICAgbGV0IG9uRG9uZSA9ICgpID0+IHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBhZGRzLmNvbmNhdCh0cmFuc2l0aW9uX2VuZCksIHJlbW92ZXMuY29uY2F0KHRyYW5zaXRpb25fcnVuKS5jb25jYXQodHJhbnNpdGlvbl9zdGFydCkpXG4gICAgICByZXR1cm4gdmlldy50cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSlcbiAgICB9XG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBsZXQgW3ByZXZBZGRzLCBwcmV2UmVtb3Zlc10gPSBET00uZ2V0U3RpY2t5KGVsLCBcImNsYXNzZXNcIiwgW1tdLCBbXV0pXG4gICAgICBsZXQga2VlcEFkZHMgPSBhZGRzLmZpbHRlcihuYW1lID0+IHByZXZBZGRzLmluZGV4T2YobmFtZSkgPCAwICYmICFlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSkpXG4gICAgICBsZXQga2VlcFJlbW92ZXMgPSByZW1vdmVzLmZpbHRlcihuYW1lID0+IHByZXZSZW1vdmVzLmluZGV4T2YobmFtZSkgPCAwICYmIGVsLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKSlcbiAgICAgIGxldCBuZXdBZGRzID0gcHJldkFkZHMuZmlsdGVyKG5hbWUgPT4gcmVtb3Zlcy5pbmRleE9mKG5hbWUpIDwgMCkuY29uY2F0KGtlZXBBZGRzKVxuICAgICAgbGV0IG5ld1JlbW92ZXMgPSBwcmV2UmVtb3Zlcy5maWx0ZXIobmFtZSA9PiBhZGRzLmluZGV4T2YobmFtZSkgPCAwKS5jb25jYXQoa2VlcFJlbW92ZXMpXG5cbiAgICAgIERPTS5wdXRTdGlja3koZWwsIFwiY2xhc3Nlc1wiLCBjdXJyZW50RWwgPT4ge1xuICAgICAgICBjdXJyZW50RWwuY2xhc3NMaXN0LnJlbW92ZSguLi5uZXdSZW1vdmVzKVxuICAgICAgICBjdXJyZW50RWwuY2xhc3NMaXN0LmFkZCguLi5uZXdBZGRzKVxuICAgICAgICByZXR1cm4gW25ld0FkZHMsIG5ld1JlbW92ZXNdXG4gICAgICB9KVxuICAgIH0pXG4gIH0sXG5cbiAgc2V0T3JSZW1vdmVBdHRycyhlbCwgc2V0cywgcmVtb3Zlcyl7XG4gICAgbGV0IFtwcmV2U2V0cywgcHJldlJlbW92ZXNdID0gRE9NLmdldFN0aWNreShlbCwgXCJhdHRyc1wiLCBbW10sIFtdXSlcbiAgICBsZXQga2VlcFNldHMgPSBzZXRzLmZpbHRlcigoW2F0dHIsIF92YWxdKSA9PiAhdGhpcy5oYXNTZXQocHJldlNldHMsIGF0dHIpICYmICFlbC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShhdHRyKSlcbiAgICBsZXQga2VlcFJlbW92ZXMgPSByZW1vdmVzLmZpbHRlcihhdHRyID0+IHByZXZSZW1vdmVzLmluZGV4T2YoYXR0cikgPCAwICYmIGVsLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGF0dHIpKVxuICAgIGxldCBuZXdTZXRzID0gcHJldlNldHMuZmlsdGVyKChbYXR0ciwgX3ZhbF0pID0+IHJlbW92ZXMuaW5kZXhPZihhdHRyKSA8IDApLmNvbmNhdChrZWVwU2V0cylcbiAgICBsZXQgbmV3UmVtb3ZlcyA9IHByZXZSZW1vdmVzLmZpbHRlcihhdHRyID0+ICF0aGlzLmhhc1NldChzZXRzLCBhdHRyKSkuY29uY2F0KGtlZXBSZW1vdmVzKVxuXG4gICAgRE9NLnB1dFN0aWNreShlbCwgXCJhdHRyc1wiLCBjdXJyZW50RWwgPT4ge1xuICAgICAgbmV3UmVtb3Zlcy5mb3JFYWNoKGF0dHIgPT4gY3VycmVudEVsLnJlbW92ZUF0dHJpYnV0ZShhdHRyKSlcbiAgICAgIG5ld1NldHMuZm9yRWFjaCgoW2F0dHIsIHZhbF0pID0+IGN1cnJlbnRFbC5zZXRBdHRyaWJ1dGUoYXR0ciwgdmFsKSlcbiAgICAgIHJldHVybiBbbmV3U2V0cywgbmV3UmVtb3Zlc11cbiAgICB9KVxuICB9LFxuXG4gIGhhc1NldChzZXRzLCBuYW1lU2VhcmNoKXsgcmV0dXJuIHNldHMuZmluZCgoW25hbWUsIHZhbF0pID0+IG5hbWUgPT09IG5hbWVTZWFyY2gpIH0sXG5cbiAgaGFzQWxsQ2xhc3NlcyhlbCwgY2xhc3Nlcyl7IHJldHVybiBjbGFzc2VzLmV2ZXJ5KG5hbWUgPT4gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKG5hbWUpKSB9LFxuXG4gIGlzVG9nZ2xlZE91dChlbCwgb3V0Q2xhc3Nlcyl7XG4gICAgcmV0dXJuICF0aGlzLmlzVmlzaWJsZShlbCkgfHwgdGhpcy5oYXNBbGxDbGFzc2VzKGVsLCBvdXRDbGFzc2VzKVxuICB9LFxuXG4gIGZpbHRlclRvRWxzKHNvdXJjZUVsLCB7dG99KXtcbiAgICByZXR1cm4gdG8gPyBET00uYWxsKGRvY3VtZW50LCB0bykgOiBbc291cmNlRWxdXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSlNcbiIsICJpbXBvcnQge1xuICBCRUZPUkVfVU5MT0FEX0xPQURFUl9USU1FT1VULFxuICBDSEVDS0FCTEVfSU5QVVRTLFxuICBDT05TRUNVVElWRV9SRUxPQURTLFxuICBQSFhfQVVUT19SRUNPVkVSLFxuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfQ09OTkVDVEVEX0NMQVNTLFxuICBQSFhfRElTQUJMRV9XSVRILFxuICBQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUsXG4gIFBIWF9ESVNBQkxFRCxcbiAgUEhYX0RJU0NPTk5FQ1RFRF9DTEFTUyxcbiAgUEhYX0VWRU5UX0NMQVNTRVMsXG4gIFBIWF9FUlJPUl9DTEFTUyxcbiAgUEhYX0ZFRURCQUNLX0ZPUixcbiAgUEhYX0hBU19TVUJNSVRURUQsXG4gIFBIWF9IT09LLFxuICBQSFhfUEFHRV9MT0FESU5HLFxuICBQSFhfUEFSRU5UX0lELFxuICBQSFhfUFJPR1JFU1MsXG4gIFBIWF9SRUFET05MWSxcbiAgUEhYX1JFRixcbiAgUEhYX1JFRl9TUkMsXG4gIFBIWF9ST09UX0lELFxuICBQSFhfU0VTU0lPTixcbiAgUEhYX1NUQVRJQyxcbiAgUEhYX1RSQUNLX1NUQVRJQyxcbiAgUEhYX1RSQUNLX1VQTE9BRFMsXG4gIFBIWF9VUERBVEUsXG4gIFBIWF9VUExPQURfUkVGLFxuICBQSFhfVklFV19TRUxFQ1RPUixcbiAgUFVTSF9USU1FT1VULFxuICBQSFhfTUFJTixcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IHtcbiAgY2xvbmUsXG4gIGNsb3Nlc3RQaHhCaW5kaW5nLFxuICBpc0VtcHR5LFxuICBpc0VxdWFsT2JqLFxuICBsb2dFcnJvcixcbiAgbWF5YmUsXG4gIGlzQ2lkLFxufSBmcm9tIFwiLi91dGlsc1wiXG5cbmltcG9ydCBCcm93c2VyIGZyb20gXCIuL2Jyb3dzZXJcIlxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIlxuaW1wb3J0IERPTVBhdGNoIGZyb20gXCIuL2RvbV9wYXRjaFwiXG5pbXBvcnQgTGl2ZVVwbG9hZGVyIGZyb20gXCIuL2xpdmVfdXBsb2FkZXJcIlxuaW1wb3J0IFJlbmRlcmVkIGZyb20gXCIuL3JlbmRlcmVkXCJcbmltcG9ydCBWaWV3SG9vayBmcm9tIFwiLi92aWV3X2hvb2tcIlxuaW1wb3J0IEpTIGZyb20gXCIuL2pzXCJcblxubGV0IHNlcmlhbGl6ZUZvcm0gPSAoZm9ybSwgbWV0YSA9IHt9KSA9PiB7XG4gIGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKVxuICBsZXQgdG9SZW1vdmUgPSBbXVxuXG4gIGZvcm1EYXRhLmZvckVhY2goKHZhbCwga2V5LCBfaW5kZXgpID0+IHtcbiAgICBpZih2YWwgaW5zdGFuY2VvZiBGaWxlKXsgdG9SZW1vdmUucHVzaChrZXkpIH1cbiAgfSlcblxuICAvLyBDbGVhbnVwIGFmdGVyIGJ1aWxkaW5nIGZpbGVEYXRhXG4gIHRvUmVtb3ZlLmZvckVhY2goa2V5ID0+IGZvcm1EYXRhLmRlbGV0ZShrZXkpKVxuXG4gIGxldCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKClcbiAgZm9yKGxldCBba2V5LCB2YWxdIG9mIGZvcm1EYXRhLmVudHJpZXMoKSl7IHBhcmFtcy5hcHBlbmQoa2V5LCB2YWwpIH1cbiAgZm9yKGxldCBtZXRhS2V5IGluIG1ldGEpeyBwYXJhbXMuYXBwZW5kKG1ldGFLZXksIG1ldGFbbWV0YUtleV0pIH1cblxuICByZXR1cm4gcGFyYW1zLnRvU3RyaW5nKClcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlldyB7XG4gIGNvbnN0cnVjdG9yKGVsLCBsaXZlU29ja2V0LCBwYXJlbnRWaWV3LCBmbGFzaCl7XG4gICAgdGhpcy5saXZlU29ja2V0ID0gbGl2ZVNvY2tldFxuICAgIHRoaXMuZmxhc2ggPSBmbGFzaFxuICAgIHRoaXMucGFyZW50ID0gcGFyZW50Vmlld1xuICAgIHRoaXMucm9vdCA9IHBhcmVudFZpZXcgPyBwYXJlbnRWaWV3LnJvb3QgOiB0aGlzXG4gICAgdGhpcy5lbCA9IGVsXG4gICAgdGhpcy5pZCA9IHRoaXMuZWwuaWRcbiAgICB0aGlzLnJlZiA9IDBcbiAgICB0aGlzLmNoaWxkSm9pbnMgPSAwXG4gICAgdGhpcy5sb2FkZXJUaW1lciA9IG51bGxcbiAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gICAgdGhpcy5wcnVuaW5nQ0lEcyA9IFtdXG4gICAgdGhpcy5yZWRpcmVjdCA9IGZhbHNlXG4gICAgdGhpcy5ocmVmID0gbnVsbFxuICAgIHRoaXMuam9pbkNvdW50ID0gdGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC5qb2luQ291bnQgLSAxIDogMFxuICAgIHRoaXMuam9pblBlbmRpbmcgPSB0cnVlXG4gICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZVxuICAgIHRoaXMuam9pbkNhbGxiYWNrID0gZnVuY3Rpb24ob25Eb25lKXsgb25Eb25lICYmIG9uRG9uZSgpIH1cbiAgICB0aGlzLnN0b3BDYWxsYmFjayA9IGZ1bmN0aW9uKCl7IH1cbiAgICB0aGlzLnBlbmRpbmdKb2luT3BzID0gdGhpcy5wYXJlbnQgPyBudWxsIDogW11cbiAgICB0aGlzLnZpZXdIb29rcyA9IHt9XG4gICAgdGhpcy51cGxvYWRlcnMgPSB7fVxuICAgIHRoaXMuZm9ybVN1Ym1pdHMgPSBbXVxuICAgIHRoaXMuY2hpbGRyZW4gPSB0aGlzLnBhcmVudCA/IG51bGwgOiB7fVxuICAgIHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLmlkXSA9IHt9XG4gICAgdGhpcy5jaGFubmVsID0gdGhpcy5saXZlU29ja2V0LmNoYW5uZWwoYGx2OiR7dGhpcy5pZH1gLCAoKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWRpcmVjdDogdGhpcy5yZWRpcmVjdCA/IHRoaXMuaHJlZiA6IHVuZGVmaW5lZCxcbiAgICAgICAgdXJsOiB0aGlzLnJlZGlyZWN0ID8gdW5kZWZpbmVkIDogdGhpcy5ocmVmIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgcGFyYW1zOiB0aGlzLmNvbm5lY3RQYXJhbXMoKSxcbiAgICAgICAgc2Vzc2lvbjogdGhpcy5nZXRTZXNzaW9uKCksXG4gICAgICAgIHN0YXRpYzogdGhpcy5nZXRTdGF0aWMoKSxcbiAgICAgICAgZmxhc2g6IHRoaXMuZmxhc2hcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMuc2hvd0xvYWRlcih0aGlzLmxpdmVTb2NrZXQubG9hZGVyVGltZW91dClcbiAgICB0aGlzLmJpbmRDaGFubmVsKClcbiAgfVxuXG4gIHNldEhyZWYoaHJlZil7IHRoaXMuaHJlZiA9IGhyZWYgfVxuXG4gIHNldFJlZGlyZWN0KGhyZWYpe1xuICAgIHRoaXMucmVkaXJlY3QgPSB0cnVlXG4gICAgdGhpcy5ocmVmID0gaHJlZlxuICB9XG5cbiAgaXNNYWluKCl7IHJldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfTUFJTikgIT09IG51bGwgfVxuXG4gIGNvbm5lY3RQYXJhbXMoKXtcbiAgICBsZXQgcGFyYW1zID0gdGhpcy5saXZlU29ja2V0LnBhcmFtcyh0aGlzLmVsKVxuICAgIGxldCBtYW5pZmVzdCA9XG4gICAgICBET00uYWxsKGRvY3VtZW50LCBgWyR7dGhpcy5iaW5kaW5nKFBIWF9UUkFDS19TVEFUSUMpfV1gKVxuICAgICAgICAubWFwKG5vZGUgPT4gbm9kZS5zcmMgfHwgbm9kZS5ocmVmKS5maWx0ZXIodXJsID0+IHR5cGVvZiAodXJsKSA9PT0gXCJzdHJpbmdcIilcblxuICAgIGlmKG1hbmlmZXN0Lmxlbmd0aCA+IDApeyBwYXJhbXNbXCJfdHJhY2tfc3RhdGljXCJdID0gbWFuaWZlc3QgfVxuICAgIHBhcmFtc1tcIl9tb3VudHNcIl0gPSB0aGlzLmpvaW5Db3VudFxuXG4gICAgcmV0dXJuIHBhcmFtc1xuICB9XG5cbiAgaXNDb25uZWN0ZWQoKXsgcmV0dXJuIHRoaXMuY2hhbm5lbC5jYW5QdXNoKCkgfVxuXG4gIGdldFNlc3Npb24oKXsgcmV0dXJuIHRoaXMuZWwuZ2V0QXR0cmlidXRlKFBIWF9TRVNTSU9OKSB9XG5cbiAgZ2V0U3RhdGljKCl7XG4gICAgbGV0IHZhbCA9IHRoaXMuZWwuZ2V0QXR0cmlidXRlKFBIWF9TVEFUSUMpXG4gICAgcmV0dXJuIHZhbCA9PT0gXCJcIiA/IG51bGwgOiB2YWxcbiAgfVxuXG4gIGRlc3Ryb3koY2FsbGJhY2sgPSBmdW5jdGlvbiAoKXsgfSl7XG4gICAgdGhpcy5kZXN0cm95QWxsQ2hpbGRyZW4oKVxuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZVxuICAgIGRlbGV0ZSB0aGlzLnJvb3QuY2hpbGRyZW5bdGhpcy5pZF1cbiAgICBpZih0aGlzLnBhcmVudCl7IGRlbGV0ZSB0aGlzLnJvb3QuY2hpbGRyZW5bdGhpcy5wYXJlbnQuaWRdW3RoaXMuaWRdIH1cbiAgICBjbGVhclRpbWVvdXQodGhpcy5sb2FkZXJUaW1lcilcbiAgICBsZXQgb25GaW5pc2hlZCA9ICgpID0+IHtcbiAgICAgIGNhbGxiYWNrKClcbiAgICAgIGZvcihsZXQgaWQgaW4gdGhpcy52aWV3SG9va3Mpe1xuICAgICAgICB0aGlzLmRlc3Ryb3lIb29rKHRoaXMudmlld0hvb2tzW2lkXSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBET00ubWFya1BoeENoaWxkRGVzdHJveWVkKHRoaXMuZWwpXG5cbiAgICB0aGlzLmxvZyhcImRlc3Ryb3llZFwiLCAoKSA9PiBbXCJ0aGUgY2hpbGQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwYXJlbnRcIl0pXG4gICAgdGhpcy5jaGFubmVsLmxlYXZlKClcbiAgICAgIC5yZWNlaXZlKFwib2tcIiwgb25GaW5pc2hlZClcbiAgICAgIC5yZWNlaXZlKFwiZXJyb3JcIiwgb25GaW5pc2hlZClcbiAgICAgIC5yZWNlaXZlKFwidGltZW91dFwiLCBvbkZpbmlzaGVkKVxuICB9XG5cbiAgc2V0Q29udGFpbmVyQ2xhc3NlcyguLi5jbGFzc2VzKXtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICBQSFhfQ09OTkVDVEVEX0NMQVNTLFxuICAgICAgUEhYX0RJU0NPTk5FQ1RFRF9DTEFTUyxcbiAgICAgIFBIWF9FUlJPUl9DTEFTU1xuICAgIClcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoLi4uY2xhc3NlcylcbiAgfVxuXG4gIHNob3dMb2FkZXIodGltZW91dCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMubG9hZGVyVGltZXIpXG4gICAgaWYodGltZW91dCl7XG4gICAgICB0aGlzLmxvYWRlclRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnNob3dMb2FkZXIoKSwgdGltZW91dClcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yKGxldCBpZCBpbiB0aGlzLnZpZXdIb29rcyl7IHRoaXMudmlld0hvb2tzW2lkXS5fX2Rpc2Nvbm5lY3RlZCgpIH1cbiAgICAgIHRoaXMuc2V0Q29udGFpbmVyQ2xhc3NlcyhQSFhfRElTQ09OTkVDVEVEX0NMQVNTKVxuICAgIH1cbiAgfVxuXG4gIGhpZGVMb2FkZXIoKXtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5sb2FkZXJUaW1lcilcbiAgICB0aGlzLnNldENvbnRhaW5lckNsYXNzZXMoUEhYX0NPTk5FQ1RFRF9DTEFTUylcbiAgfVxuXG4gIHRyaWdnZXJSZWNvbm5lY3RlZCgpe1xuICAgIGZvcihsZXQgaWQgaW4gdGhpcy52aWV3SG9va3MpeyB0aGlzLnZpZXdIb29rc1tpZF0uX19yZWNvbm5lY3RlZCgpIH1cbiAgfVxuXG4gIGxvZyhraW5kLCBtc2dDYWxsYmFjayl7XG4gICAgdGhpcy5saXZlU29ja2V0LmxvZyh0aGlzLCBraW5kLCBtc2dDYWxsYmFjaylcbiAgfVxuXG4gIHRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25Eb25lID0gZnVuY3Rpb24oKXt9KXtcbiAgICB0aGlzLmxpdmVTb2NrZXQudHJhbnNpdGlvbih0aW1lLCBvblN0YXJ0LCBvbkRvbmUpXG4gIH1cblxuICB3aXRoaW5UYXJnZXRzKHBoeFRhcmdldCwgY2FsbGJhY2spe1xuICAgIGlmKHBoeFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IHBoeFRhcmdldCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpe1xuICAgICAgcmV0dXJuIHRoaXMubGl2ZVNvY2tldC5vd25lcihwaHhUYXJnZXQsIHZpZXcgPT4gY2FsbGJhY2sodmlldywgcGh4VGFyZ2V0KSlcbiAgICB9XG5cbiAgICBpZihpc0NpZChwaHhUYXJnZXQpKXtcbiAgICAgIGxldCB0YXJnZXRzID0gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdCh0aGlzLmVsLCBwaHhUYXJnZXQpXG4gICAgICBpZih0YXJnZXRzLmxlbmd0aCA9PT0gMCl7XG4gICAgICAgIGxvZ0Vycm9yKGBubyBjb21wb25lbnQgZm91bmQgbWF0Y2hpbmcgcGh4LXRhcmdldCBvZiAke3BoeFRhcmdldH1gKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2sodGhpcywgcGFyc2VJbnQocGh4VGFyZ2V0KSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHRhcmdldHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocGh4VGFyZ2V0KSlcbiAgICAgIGlmKHRhcmdldHMubGVuZ3RoID09PSAwKXsgbG9nRXJyb3IoYG5vdGhpbmcgZm91bmQgbWF0Y2hpbmcgdGhlIHBoeC10YXJnZXQgc2VsZWN0b3IgXCIke3BoeFRhcmdldH1cImApIH1cbiAgICAgIHRhcmdldHMuZm9yRWFjaCh0YXJnZXQgPT4gdGhpcy5saXZlU29ja2V0Lm93bmVyKHRhcmdldCwgdmlldyA9PiBjYWxsYmFjayh2aWV3LCB0YXJnZXQpKSlcbiAgICB9XG4gIH1cblxuICBhcHBseURpZmYodHlwZSwgcmF3RGlmZiwgY2FsbGJhY2spe1xuICAgIHRoaXMubG9nKHR5cGUsICgpID0+IFtcIlwiLCBjbG9uZShyYXdEaWZmKV0pXG4gICAgbGV0IHtkaWZmLCByZXBseSwgZXZlbnRzLCB0aXRsZX0gPSBSZW5kZXJlZC5leHRyYWN0KHJhd0RpZmYpXG4gICAgaWYodGl0bGUpeyBET00ucHV0VGl0bGUodGl0bGUpIH1cblxuICAgIGNhbGxiYWNrKHtkaWZmLCByZXBseSwgZXZlbnRzfSlcbiAgICByZXR1cm4gcmVwbHlcbiAgfVxuXG4gIG9uSm9pbihyZXNwKXtcbiAgICBsZXQge3JlbmRlcmVkLCBjb250YWluZXJ9ID0gcmVzcFxuICAgIGlmKGNvbnRhaW5lcil7XG4gICAgICBsZXQgW3RhZywgYXR0cnNdID0gY29udGFpbmVyXG4gICAgICB0aGlzLmVsID0gRE9NLnJlcGxhY2VSb290Q29udGFpbmVyKHRoaXMuZWwsIHRhZywgYXR0cnMpXG4gICAgfVxuICAgIHRoaXMuY2hpbGRKb2lucyA9IDBcbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gdHJ1ZVxuICAgIHRoaXMuZmxhc2ggPSBudWxsXG5cbiAgICBCcm93c2VyLmRyb3BMb2NhbCh0aGlzLmxpdmVTb2NrZXQubG9jYWxTdG9yYWdlLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsIENPTlNFQ1VUSVZFX1JFTE9BRFMpXG4gICAgdGhpcy5hcHBseURpZmYoXCJtb3VudFwiLCByZW5kZXJlZCwgKHtkaWZmLCBldmVudHN9KSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVkID0gbmV3IFJlbmRlcmVkKHRoaXMuaWQsIGRpZmYpXG4gICAgICBsZXQgaHRtbCA9IHRoaXMucmVuZGVyQ29udGFpbmVyKG51bGwsIFwiam9pblwiKVxuICAgICAgdGhpcy5kcm9wUGVuZGluZ1JlZnMoKVxuICAgICAgbGV0IGZvcm1zID0gdGhpcy5mb3Jtc0ZvclJlY292ZXJ5KGh0bWwpXG4gICAgICB0aGlzLmpvaW5Db3VudCsrXG5cbiAgICAgIGlmKGZvcm1zLmxlbmd0aCA+IDApe1xuICAgICAgICBmb3Jtcy5mb3JFYWNoKChbZm9ybSwgbmV3Rm9ybSwgbmV3Q2lkXSwgaSkgPT4ge1xuICAgICAgICAgIHRoaXMucHVzaEZvcm1SZWNvdmVyeShmb3JtLCBuZXdDaWQsIHJlc3AgPT4ge1xuICAgICAgICAgICAgaWYoaSA9PT0gZm9ybXMubGVuZ3RoIC0gMSl7XG4gICAgICAgICAgICAgIHRoaXMub25Kb2luQ29tcGxldGUocmVzcCwgaHRtbCwgZXZlbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uSm9pbkNvbXBsZXRlKHJlc3AsIGh0bWwsIGV2ZW50cylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZHJvcFBlbmRpbmdSZWZzKCl7XG4gICAgRE9NLmFsbChkb2N1bWVudCwgYFske1BIWF9SRUZfU1JDfT1cIiR7dGhpcy5pZH1cIl1bJHtQSFhfUkVGfV1gLCBlbCA9PiB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFRilcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfUkVGX1NSQylcbiAgICB9KVxuICB9XG5cbiAgb25Kb2luQ29tcGxldGUoe2xpdmVfcGF0Y2h9LCBodG1sLCBldmVudHMpe1xuICAgIC8vIEluIG9yZGVyIHRvIHByb3ZpZGUgYSBiZXR0ZXIgZXhwZXJpZW5jZSwgd2Ugd2FudCB0byBqb2luXG4gICAgLy8gYWxsIExpdmVWaWV3cyBmaXJzdCBhbmQgb25seSB0aGVuIGFwcGx5IHRoZWlyIHBhdGNoZXMuXG4gICAgaWYodGhpcy5qb2luQ291bnQgPiAxIHx8ICh0aGlzLnBhcmVudCAmJiAhdGhpcy5wYXJlbnQuaXNKb2luUGVuZGluZygpKSl7XG4gICAgICByZXR1cm4gdGhpcy5hcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBldmVudHMpXG4gICAgfVxuXG4gICAgLy8gT25lIGRvd25zaWRlIG9mIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCB3ZSBuZWVkIHRvIGZpbmQgcGh4Q2hpbGRyZW5cbiAgICAvLyBpbiB0aGUgaHRtbCBmcmFnbWVudCwgaW5zdGVhZCBvZiBkaXJlY3RseSBvbiB0aGUgRE9NLiBUaGUgZnJhZ21lbnRcbiAgICAvLyBhbHNvIGRvZXMgbm90IGluY2x1ZGUgUEhYX1NUQVRJQywgc28gd2UgbmVlZCB0byBjb3B5IGl0IG92ZXIgZnJvbVxuICAgIC8vIHRoZSBET00uXG4gICAgbGV0IG5ld0NoaWxkcmVuID0gRE9NLmZpbmRQaHhDaGlsZHJlbkluRnJhZ21lbnQoaHRtbCwgdGhpcy5pZCkuZmlsdGVyKHRvRWwgPT4ge1xuICAgICAgbGV0IGZyb21FbCA9IHRvRWwuaWQgJiYgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKGBbaWQ9XCIke3RvRWwuaWR9XCJdYClcbiAgICAgIGxldCBwaHhTdGF0aWMgPSBmcm9tRWwgJiYgZnJvbUVsLmdldEF0dHJpYnV0ZShQSFhfU1RBVElDKVxuICAgICAgaWYocGh4U3RhdGljKXsgdG9FbC5zZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQywgcGh4U3RhdGljKSB9XG4gICAgICByZXR1cm4gdGhpcy5qb2luQ2hpbGQodG9FbClcbiAgICB9KVxuXG4gICAgaWYobmV3Q2hpbGRyZW4ubGVuZ3RoID09PSAwKXtcbiAgICAgIGlmKHRoaXMucGFyZW50KXtcbiAgICAgICAgdGhpcy5yb290LnBlbmRpbmdKb2luT3BzLnB1c2goW3RoaXMsICgpID0+IHRoaXMuYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgZXZlbnRzKV0pXG4gICAgICAgIHRoaXMucGFyZW50LmFja0pvaW4odGhpcylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25BbGxDaGlsZEpvaW5zQ29tcGxldGUoKVxuICAgICAgICB0aGlzLmFwcGx5Sm9pblBhdGNoKGxpdmVfcGF0Y2gsIGh0bWwsIGV2ZW50cylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb290LnBlbmRpbmdKb2luT3BzLnB1c2goW3RoaXMsICgpID0+IHRoaXMuYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgZXZlbnRzKV0pXG4gICAgfVxuICB9XG5cbiAgYXR0YWNoVHJ1ZURvY0VsKCl7XG4gICAgdGhpcy5lbCA9IERPTS5ieUlkKHRoaXMuaWQpXG4gICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdC5pZClcbiAgfVxuXG4gIGFwcGx5Sm9pblBhdGNoKGxpdmVfcGF0Y2gsIGh0bWwsIGV2ZW50cyl7XG4gICAgdGhpcy5hdHRhY2hUcnVlRG9jRWwoKVxuICAgIGxldCBwYXRjaCA9IG5ldyBET01QYXRjaCh0aGlzLCB0aGlzLmVsLCB0aGlzLmlkLCBodG1sLCBudWxsKVxuICAgIHBhdGNoLm1hcmtQcnVuYWJsZUNvbnRlbnRGb3JSZW1vdmFsKClcbiAgICB0aGlzLnBlcmZvcm1QYXRjaChwYXRjaCwgZmFsc2UpXG4gICAgdGhpcy5qb2luTmV3Q2hpbGRyZW4oKVxuICAgIERPTS5hbGwodGhpcy5lbCwgYFske3RoaXMuYmluZGluZyhQSFhfSE9PSyl9XSwgW2RhdGEtcGh4LSR7UEhYX0hPT0t9XWAsIGhvb2tFbCA9PiB7XG4gICAgICBsZXQgaG9vayA9IHRoaXMuYWRkSG9vayhob29rRWwpXG4gICAgICBpZihob29rKXsgaG9vay5fX21vdW50ZWQoKSB9XG4gICAgfSlcblxuICAgIHRoaXMuam9pblBlbmRpbmcgPSBmYWxzZVxuICAgIHRoaXMubGl2ZVNvY2tldC5kaXNwYXRjaEV2ZW50cyhldmVudHMpXG4gICAgdGhpcy5hcHBseVBlbmRpbmdVcGRhdGVzKClcblxuICAgIGlmKGxpdmVfcGF0Y2gpe1xuICAgICAgbGV0IHtraW5kLCB0b30gPSBsaXZlX3BhdGNoXG4gICAgICB0aGlzLmxpdmVTb2NrZXQuaGlzdG9yeVBhdGNoKHRvLCBraW5kKVxuICAgIH1cbiAgICB0aGlzLmhpZGVMb2FkZXIoKVxuICAgIGlmKHRoaXMuam9pbkNvdW50ID4gMSl7IHRoaXMudHJpZ2dlclJlY29ubmVjdGVkKCkgfVxuICAgIHRoaXMuc3RvcENhbGxiYWNrKClcbiAgfVxuXG4gIHRyaWdnZXJCZWZvcmVVcGRhdGVIb29rKGZyb21FbCwgdG9FbCl7XG4gICAgdGhpcy5saXZlU29ja2V0LnRyaWdnZXJET00oXCJvbkJlZm9yZUVsVXBkYXRlZFwiLCBbZnJvbUVsLCB0b0VsXSlcbiAgICBsZXQgaG9vayA9IHRoaXMuZ2V0SG9vayhmcm9tRWwpXG4gICAgbGV0IGlzSWdub3JlZCA9IGhvb2sgJiYgRE9NLmlzSWdub3JlZChmcm9tRWwsIHRoaXMuYmluZGluZyhQSFhfVVBEQVRFKSlcbiAgICBpZihob29rICYmICFmcm9tRWwuaXNFcXVhbE5vZGUodG9FbCkgJiYgIShpc0lnbm9yZWQgJiYgaXNFcXVhbE9iaihmcm9tRWwuZGF0YXNldCwgdG9FbC5kYXRhc2V0KSkpe1xuICAgICAgaG9vay5fX2JlZm9yZVVwZGF0ZSgpXG4gICAgICByZXR1cm4gaG9va1xuICAgIH1cbiAgfVxuXG4gIHBlcmZvcm1QYXRjaChwYXRjaCwgcHJ1bmVDaWRzKXtcbiAgICBsZXQgcmVtb3ZlZEVscyA9IFtdXG4gICAgbGV0IHBoeENoaWxkcmVuQWRkZWQgPSBmYWxzZVxuICAgIGxldCB1cGRhdGVkSG9va0lkcyA9IG5ldyBTZXQoKVxuXG4gICAgcGF0Y2guYWZ0ZXIoXCJhZGRlZFwiLCBlbCA9PiB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQudHJpZ2dlckRPTShcIm9uTm9kZUFkZGVkXCIsIFtlbF0pXG5cbiAgICAgIGxldCBuZXdIb29rID0gdGhpcy5hZGRIb29rKGVsKVxuICAgICAgaWYobmV3SG9vayl7IG5ld0hvb2suX19tb3VudGVkKCkgfVxuICAgIH0pXG5cbiAgICBwYXRjaC5hZnRlcihcInBoeENoaWxkQWRkZWRcIiwgZWwgPT4ge1xuICAgICAgaWYoRE9NLmlzUGh4U3RpY2t5KGVsKSl7XG4gICAgICAgIHRoaXMubGl2ZVNvY2tldC5qb2luUm9vdFZpZXdzKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBoeENoaWxkcmVuQWRkZWQgPSB0cnVlXG4gICAgICB9XG4gICAgfSlcblxuICAgIHBhdGNoLmJlZm9yZShcInVwZGF0ZWRcIiwgKGZyb21FbCwgdG9FbCkgPT4ge1xuICAgICAgbGV0IGhvb2sgPSB0aGlzLnRyaWdnZXJCZWZvcmVVcGRhdGVIb29rKGZyb21FbCwgdG9FbClcbiAgICAgIGlmKGhvb2speyB1cGRhdGVkSG9va0lkcy5hZGQoZnJvbUVsLmlkKSB9XG4gICAgfSlcblxuICAgIHBhdGNoLmFmdGVyKFwidXBkYXRlZFwiLCBlbCA9PiB7XG4gICAgICBpZih1cGRhdGVkSG9va0lkcy5oYXMoZWwuaWQpKXsgdGhpcy5nZXRIb29rKGVsKS5fX3VwZGF0ZWQoKSB9XG4gICAgfSlcblxuICAgIHBhdGNoLmFmdGVyKFwiZGlzY2FyZGVkXCIsIChlbCkgPT4ge1xuICAgICAgaWYoZWwubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKXsgcmVtb3ZlZEVscy5wdXNoKGVsKSB9XG4gICAgfSlcblxuICAgIHBhdGNoLmFmdGVyKFwidHJhbnNpdGlvbnNEaXNjYXJkZWRcIiwgZWxzID0+IHRoaXMuYWZ0ZXJFbGVtZW50c1JlbW92ZWQoZWxzLCBwcnVuZUNpZHMpKVxuICAgIHBhdGNoLnBlcmZvcm0oKVxuICAgIHRoaXMuYWZ0ZXJFbGVtZW50c1JlbW92ZWQocmVtb3ZlZEVscywgcHJ1bmVDaWRzKVxuXG4gICAgcmV0dXJuIHBoeENoaWxkcmVuQWRkZWRcbiAgfVxuXG4gIGFmdGVyRWxlbWVudHNSZW1vdmVkKGVsZW1lbnRzLCBwcnVuZUNpZHMpe1xuICAgIGxldCBkZXN0cm95ZWRDSURzID0gW11cbiAgICBlbGVtZW50cy5mb3JFYWNoKHBhcmVudCA9PiB7XG4gICAgICBsZXQgY29tcG9uZW50cyA9IERPTS5hbGwocGFyZW50LCBgWyR7UEhYX0NPTVBPTkVOVH1dYClcbiAgICAgICAgY29tcG9uZW50cy5jb25jYXQocGFyZW50KS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgbGV0IGNpZCA9IHRoaXMuY29tcG9uZW50SUQoZWwpXG4gICAgICAgIGlmKGlzQ2lkKGNpZCkgJiYgZGVzdHJveWVkQ0lEcy5pbmRleE9mKGNpZCkgPT09IC0xKXsgZGVzdHJveWVkQ0lEcy5wdXNoKGNpZCkgfVxuICAgICAgICBsZXQgaG9vayA9IHRoaXMuZ2V0SG9vayhlbClcbiAgICAgICAgaG9vayAmJiB0aGlzLmRlc3Ryb3lIb29rKGhvb2spXG4gICAgICB9KVxuICAgIH0pXG4gICAgLy8gV2Ugc2hvdWxkIG5vdCBwcnVuZUNpZHMgb24gam9pbnMuIE90aGVyd2lzZSwgaW4gY2FzZSBvZlxuICAgIC8vIHJlam9pbnMsIHdlIG1heSBub3RpZnkgY2lkcyB0aGF0IG5vIGxvbmdlciBiZWxvbmcgdG8gdGhlXG4gICAgLy8gY3VycmVudCBMaXZlVmlldyB0byBiZSByZW1vdmVkLlxuICAgIGlmKHBydW5lQ2lkcyl7XG4gICAgICB0aGlzLm1heWJlUHVzaENvbXBvbmVudHNEZXN0cm95ZWQoZGVzdHJveWVkQ0lEcylcbiAgICB9XG4gIH1cblxuICBqb2luTmV3Q2hpbGRyZW4oKXtcbiAgICBET00uZmluZFBoeENoaWxkcmVuKHRoaXMuZWwsIHRoaXMuaWQpLmZvckVhY2goZWwgPT4gdGhpcy5qb2luQ2hpbGQoZWwpKVxuICB9XG5cbiAgZ2V0Q2hpbGRCeUlkKGlkKXsgcmV0dXJuIHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLmlkXVtpZF0gfVxuXG4gIGdldERlc2NlbmRlbnRCeUVsKGVsKXtcbiAgICBpZihlbC5pZCA9PT0gdGhpcy5pZCl7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbltlbC5nZXRBdHRyaWJ1dGUoUEhYX1BBUkVOVF9JRCldW2VsLmlkXVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3lEZXNjZW5kZW50KGlkKXtcbiAgICBmb3IobGV0IHBhcmVudElkIGluIHRoaXMucm9vdC5jaGlsZHJlbil7XG4gICAgICBmb3IobGV0IGNoaWxkSWQgaW4gdGhpcy5yb290LmNoaWxkcmVuW3BhcmVudElkXSl7XG4gICAgICAgIGlmKGNoaWxkSWQgPT09IGlkKXsgcmV0dXJuIHRoaXMucm9vdC5jaGlsZHJlbltwYXJlbnRJZF1bY2hpbGRJZF0uZGVzdHJveSgpIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBqb2luQ2hpbGQoZWwpe1xuICAgIGxldCBjaGlsZCA9IHRoaXMuZ2V0Q2hpbGRCeUlkKGVsLmlkKVxuICAgIGlmKCFjaGlsZCl7XG4gICAgICBsZXQgdmlldyA9IG5ldyBWaWV3KGVsLCB0aGlzLmxpdmVTb2NrZXQsIHRoaXMpXG4gICAgICB0aGlzLnJvb3QuY2hpbGRyZW5bdGhpcy5pZF1bdmlldy5pZF0gPSB2aWV3XG4gICAgICB2aWV3LmpvaW4oKVxuICAgICAgdGhpcy5jaGlsZEpvaW5zKytcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgaXNKb2luUGVuZGluZygpeyByZXR1cm4gdGhpcy5qb2luUGVuZGluZyB9XG5cbiAgYWNrSm9pbihfY2hpbGQpe1xuICAgIHRoaXMuY2hpbGRKb2lucy0tXG5cbiAgICBpZih0aGlzLmNoaWxkSm9pbnMgPT09IDApe1xuICAgICAgaWYodGhpcy5wYXJlbnQpe1xuICAgICAgICB0aGlzLnBhcmVudC5hY2tKb2luKHRoaXMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uQWxsQ2hpbGRKb2luc0NvbXBsZXRlKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkFsbENoaWxkSm9pbnNDb21wbGV0ZSgpe1xuICAgIHRoaXMuam9pbkNhbGxiYWNrKCgpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ0pvaW5PcHMuZm9yRWFjaCgoW3ZpZXcsIG9wXSkgPT4ge1xuICAgICAgICBpZighdmlldy5pc0Rlc3Ryb3llZCgpKXsgb3AoKSB9XG4gICAgICB9KVxuICAgICAgdGhpcy5wZW5kaW5nSm9pbk9wcyA9IFtdXG4gICAgfSlcbiAgfVxuXG4gIHVwZGF0ZShkaWZmLCBldmVudHMpe1xuICAgIGlmKHRoaXMuaXNKb2luUGVuZGluZygpIHx8IHRoaXMubGl2ZVNvY2tldC5oYXNQZW5kaW5nTGluaygpKXtcbiAgICAgIHJldHVybiB0aGlzLnBlbmRpbmdEaWZmcy5wdXNoKHtkaWZmLCBldmVudHN9KVxuICAgIH1cblxuICAgIHRoaXMucmVuZGVyZWQubWVyZ2VEaWZmKGRpZmYpXG4gICAgbGV0IHBoeENoaWxkcmVuQWRkZWQgPSBmYWxzZVxuXG4gICAgLy8gV2hlbiB0aGUgZGlmZiBvbmx5IGNvbnRhaW5zIGNvbXBvbmVudCBkaWZmcywgdGhlbiB3YWxrIGNvbXBvbmVudHNcbiAgICAvLyBhbmQgcGF0Y2ggb25seSB0aGUgcGFyZW50IGNvbXBvbmVudCBjb250YWluZXJzIGZvdW5kIGluIHRoZSBkaWZmLlxuICAgIC8vIE90aGVyd2lzZSwgcGF0Y2ggZW50aXJlIExWIGNvbnRhaW5lci5cbiAgICBpZih0aGlzLnJlbmRlcmVkLmlzQ29tcG9uZW50T25seURpZmYoZGlmZikpe1xuICAgICAgdGhpcy5saXZlU29ja2V0LnRpbWUoXCJjb21wb25lbnQgcGF0Y2ggY29tcGxldGVcIiwgKCkgPT4ge1xuICAgICAgICBsZXQgcGFyZW50Q2lkcyA9IERPTS5maW5kUGFyZW50Q0lEcyh0aGlzLmVsLCB0aGlzLnJlbmRlcmVkLmNvbXBvbmVudENJRHMoZGlmZikpXG4gICAgICAgIHBhcmVudENpZHMuZm9yRWFjaChwYXJlbnRDSUQgPT4ge1xuICAgICAgICAgIGlmKHRoaXMuY29tcG9uZW50UGF0Y2godGhpcy5yZW5kZXJlZC5nZXRDb21wb25lbnQoZGlmZiwgcGFyZW50Q0lEKSwgcGFyZW50Q0lEKSl7IHBoeENoaWxkcmVuQWRkZWQgPSB0cnVlIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmKCFpc0VtcHR5KGRpZmYpKXtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC50aW1lKFwiZnVsbCBwYXRjaCBjb21wbGV0ZVwiLCAoKSA9PiB7XG4gICAgICAgIGxldCBodG1sID0gdGhpcy5yZW5kZXJDb250YWluZXIoZGlmZiwgXCJ1cGRhdGVcIilcbiAgICAgICAgbGV0IHBhdGNoID0gbmV3IERPTVBhdGNoKHRoaXMsIHRoaXMuZWwsIHRoaXMuaWQsIGh0bWwsIG51bGwpXG4gICAgICAgIHBoeENoaWxkcmVuQWRkZWQgPSB0aGlzLnBlcmZvcm1QYXRjaChwYXRjaCwgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5saXZlU29ja2V0LmRpc3BhdGNoRXZlbnRzKGV2ZW50cylcbiAgICBpZihwaHhDaGlsZHJlbkFkZGVkKXsgdGhpcy5qb2luTmV3Q2hpbGRyZW4oKSB9XG4gIH1cblxuICByZW5kZXJDb250YWluZXIoZGlmZiwga2luZCl7XG4gICAgcmV0dXJuIHRoaXMubGl2ZVNvY2tldC50aW1lKGB0b1N0cmluZyBkaWZmICgke2tpbmR9KWAsICgpID0+IHtcbiAgICAgIGxldCB0YWcgPSB0aGlzLmVsLnRhZ05hbWVcbiAgICAgIC8vIERvbid0IHNraXAgYW55IGNvbXBvbmVudCBpbiB0aGUgZGlmZiBub3IgYW55IG1hcmtlZCBhcyBwcnVuZWRcbiAgICAgIC8vIChhcyB0aGV5IG1heSBoYXZlIGJlZW4gYWRkZWQgYmFjaylcbiAgICAgIGxldCBjaWRzID0gZGlmZiA/IHRoaXMucmVuZGVyZWQuY29tcG9uZW50Q0lEcyhkaWZmKS5jb25jYXQodGhpcy5wcnVuaW5nQ0lEcykgOiBudWxsXG4gICAgICBsZXQgaHRtbCA9IHRoaXMucmVuZGVyZWQudG9TdHJpbmcoY2lkcylcbiAgICAgIHJldHVybiBgPCR7dGFnfT4ke2h0bWx9PC8ke3RhZ30+YFxuICAgIH0pXG4gIH1cblxuICBjb21wb25lbnRQYXRjaChkaWZmLCBjaWQpe1xuICAgIGlmKGlzRW1wdHkoZGlmZikpIHJldHVybiBmYWxzZVxuICAgIGxldCBodG1sID0gdGhpcy5yZW5kZXJlZC5jb21wb25lbnRUb1N0cmluZyhjaWQpXG4gICAgbGV0IHBhdGNoID0gbmV3IERPTVBhdGNoKHRoaXMsIHRoaXMuZWwsIHRoaXMuaWQsIGh0bWwsIGNpZClcbiAgICBsZXQgY2hpbGRyZW5BZGRlZCA9IHRoaXMucGVyZm9ybVBhdGNoKHBhdGNoLCB0cnVlKVxuICAgIHJldHVybiBjaGlsZHJlbkFkZGVkXG4gIH1cblxuICBnZXRIb29rKGVsKXsgcmV0dXJuIHRoaXMudmlld0hvb2tzW1ZpZXdIb29rLmVsZW1lbnRJRChlbCldIH1cblxuICBhZGRIb29rKGVsKXtcbiAgICBpZihWaWV3SG9vay5lbGVtZW50SUQoZWwpIHx8ICFlbC5nZXRBdHRyaWJ1dGUpeyByZXR1cm4gfVxuICAgIGxldCBob29rTmFtZSA9IGVsLmdldEF0dHJpYnV0ZShgZGF0YS1waHgtJHtQSFhfSE9PS31gKSB8fCBlbC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9IT09LKSlcbiAgICBpZihob29rTmFtZSAmJiAhdGhpcy5vd25zRWxlbWVudChlbCkpeyByZXR1cm4gfVxuICAgIGxldCBjYWxsYmFja3MgPSB0aGlzLmxpdmVTb2NrZXQuZ2V0SG9va0NhbGxiYWNrcyhob29rTmFtZSlcblxuICAgIGlmKGNhbGxiYWNrcyl7XG4gICAgICBpZighZWwuaWQpeyBsb2dFcnJvcihgbm8gRE9NIElEIGZvciBob29rIFwiJHtob29rTmFtZX1cIi4gSG9va3MgcmVxdWlyZSBhIHVuaXF1ZSBJRCBvbiBlYWNoIGVsZW1lbnQuYCwgZWwpIH1cbiAgICAgIGxldCBob29rID0gbmV3IFZpZXdIb29rKHRoaXMsIGVsLCBjYWxsYmFja3MpXG4gICAgICB0aGlzLnZpZXdIb29rc1tWaWV3SG9vay5lbGVtZW50SUQoaG9vay5lbCldID0gaG9va1xuICAgICAgcmV0dXJuIGhvb2tcbiAgICB9IGVsc2UgaWYoaG9va05hbWUgIT09IG51bGwpe1xuICAgICAgbG9nRXJyb3IoYHVua25vd24gaG9vayBmb3VuZCBmb3IgXCIke2hvb2tOYW1lfVwiYCwgZWwpXG4gICAgfVxuICB9XG5cbiAgZGVzdHJveUhvb2soaG9vayl7XG4gICAgaG9vay5fX2Rlc3Ryb3llZCgpXG4gICAgaG9vay5fX2NsZWFudXBfXygpXG4gICAgZGVsZXRlIHRoaXMudmlld0hvb2tzW1ZpZXdIb29rLmVsZW1lbnRJRChob29rLmVsKV1cbiAgfVxuXG4gIGFwcGx5UGVuZGluZ1VwZGF0ZXMoKXtcbiAgICB0aGlzLnBlbmRpbmdEaWZmcy5mb3JFYWNoKCh7ZGlmZiwgZXZlbnRzfSkgPT4gdGhpcy51cGRhdGUoZGlmZiwgZXZlbnRzKSlcbiAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gIH1cblxuICBvbkNoYW5uZWwoZXZlbnQsIGNiKXtcbiAgICB0aGlzLmxpdmVTb2NrZXQub25DaGFubmVsKHRoaXMuY2hhbm5lbCwgZXZlbnQsIHJlc3AgPT4ge1xuICAgICAgaWYodGhpcy5pc0pvaW5QZW5kaW5nKCkpe1xuICAgICAgICB0aGlzLnJvb3QucGVuZGluZ0pvaW5PcHMucHVzaChbdGhpcywgKCkgPT4gY2IocmVzcCldKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LnJlcXVlc3RET01VcGRhdGUoKCkgPT4gY2IocmVzcCkpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGJpbmRDaGFubmVsKCl7XG4gICAgLy8gVGhlIGRpZmYgZXZlbnQgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIHJlZ3VsYXIgdXBkYXRlIG9wZXJhdGlvbnMuXG4gICAgLy8gQWxsIG90aGVyIG9wZXJhdGlvbnMgYXJlIHF1ZXVlZCB0byBiZSBhcHBsaWVkIG9ubHkgYWZ0ZXIgam9pbi5cbiAgICB0aGlzLmxpdmVTb2NrZXQub25DaGFubmVsKHRoaXMuY2hhbm5lbCwgXCJkaWZmXCIsIChyYXdEaWZmKSA9PiB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuYXBwbHlEaWZmKFwidXBkYXRlXCIsIHJhd0RpZmYsICh7ZGlmZiwgZXZlbnRzfSkgPT4gdGhpcy51cGRhdGUoZGlmZiwgZXZlbnRzKSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0aGlzLm9uQ2hhbm5lbChcInJlZGlyZWN0XCIsICh7dG8sIGZsYXNofSkgPT4gdGhpcy5vblJlZGlyZWN0KHt0bywgZmxhc2h9KSlcbiAgICB0aGlzLm9uQ2hhbm5lbChcImxpdmVfcGF0Y2hcIiwgKHJlZGlyKSA9PiB0aGlzLm9uTGl2ZVBhdGNoKHJlZGlyKSlcbiAgICB0aGlzLm9uQ2hhbm5lbChcImxpdmVfcmVkaXJlY3RcIiwgKHJlZGlyKSA9PiB0aGlzLm9uTGl2ZVJlZGlyZWN0KHJlZGlyKSlcbiAgICB0aGlzLmNoYW5uZWwub25FcnJvcihyZWFzb24gPT4gdGhpcy5vbkVycm9yKHJlYXNvbikpXG4gICAgdGhpcy5jaGFubmVsLm9uQ2xvc2UocmVhc29uID0+IHRoaXMub25DbG9zZShyZWFzb24pKVxuICB9XG5cbiAgZGVzdHJveUFsbENoaWxkcmVuKCl7XG4gICAgZm9yKGxldCBpZCBpbiB0aGlzLnJvb3QuY2hpbGRyZW5bdGhpcy5pZF0pe1xuICAgICAgdGhpcy5nZXRDaGlsZEJ5SWQoaWQpLmRlc3Ryb3koKVxuICAgIH1cbiAgfVxuXG4gIG9uTGl2ZVJlZGlyZWN0KHJlZGlyKXtcbiAgICBsZXQge3RvLCBraW5kLCBmbGFzaH0gPSByZWRpclxuICAgIGxldCB1cmwgPSB0aGlzLmV4cGFuZFVSTCh0bylcbiAgICB0aGlzLmxpdmVTb2NrZXQuaGlzdG9yeVJlZGlyZWN0KHVybCwga2luZCwgZmxhc2gpXG4gIH1cblxuICBvbkxpdmVQYXRjaChyZWRpcil7XG4gICAgbGV0IHt0bywga2luZH0gPSByZWRpclxuICAgIHRoaXMuaHJlZiA9IHRoaXMuZXhwYW5kVVJMKHRvKVxuICAgIHRoaXMubGl2ZVNvY2tldC5oaXN0b3J5UGF0Y2godG8sIGtpbmQpXG4gIH1cblxuICBleHBhbmRVUkwodG8pe1xuICAgIHJldHVybiB0by5zdGFydHNXaXRoKFwiL1wiKSA/IGAke3dpbmRvdy5sb2NhdGlvbi5wcm90b2NvbH0vLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9JHt0b31gIDogdG9cbiAgfVxuXG4gIG9uUmVkaXJlY3Qoe3RvLCBmbGFzaH0peyB0aGlzLmxpdmVTb2NrZXQucmVkaXJlY3QodG8sIGZsYXNoKSB9XG5cbiAgaXNEZXN0cm95ZWQoKXsgcmV0dXJuIHRoaXMuZGVzdHJveWVkIH1cblxuICBqb2luKGNhbGxiYWNrKXtcbiAgICBpZih0aGlzLmlzTWFpbigpKXtcbiAgICAgIHRoaXMuc3RvcENhbGxiYWNrID0gdGhpcy5saXZlU29ja2V0LndpdGhQYWdlTG9hZGluZyh7dG86IHRoaXMuaHJlZiwga2luZDogXCJpbml0aWFsXCJ9KVxuICAgIH1cbiAgICB0aGlzLmpvaW5DYWxsYmFjayA9IChvbkRvbmUpID0+IHtcbiAgICAgIG9uRG9uZSA9IG9uRG9uZSB8fCBmdW5jdGlvbigpe31cbiAgICAgIGNhbGxiYWNrID8gY2FsbGJhY2sodGhpcy5qb2luQ291bnQsIG9uRG9uZSkgOiBvbkRvbmUoKVxuICAgIH1cbiAgICB0aGlzLmxpdmVTb2NrZXQud3JhcFB1c2godGhpcywge3RpbWVvdXQ6IGZhbHNlfSwgKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY2hhbm5lbC5qb2luKClcbiAgICAgICAgLnJlY2VpdmUoXCJva1wiLCBkYXRhID0+IHtcbiAgICAgICAgICBpZighdGhpcy5pc0Rlc3Ryb3llZCgpKXtcbiAgICAgICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHRoaXMub25Kb2luKGRhdGEpKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLnJlY2VpdmUoXCJlcnJvclwiLCByZXNwID0+ICF0aGlzLmlzRGVzdHJveWVkKCkgJiYgdGhpcy5vbkpvaW5FcnJvcihyZXNwKSlcbiAgICAgICAgLnJlY2VpdmUoXCJ0aW1lb3V0XCIsICgpID0+ICF0aGlzLmlzRGVzdHJveWVkKCkgJiYgdGhpcy5vbkpvaW5FcnJvcih7cmVhc29uOiBcInRpbWVvdXRcIn0pKVxuICAgIH0pXG4gIH1cblxuICBvbkpvaW5FcnJvcihyZXNwKXtcbiAgICBpZihyZXNwLnJlYXNvbiA9PT0gXCJ1bmF1dGhvcml6ZWRcIiB8fCByZXNwLnJlYXNvbiA9PT0gXCJzdGFsZVwiKXtcbiAgICAgIHRoaXMubG9nKFwiZXJyb3JcIiwgKCkgPT4gW1widW5hdXRob3JpemVkIGxpdmVfcmVkaXJlY3QuIEZhbGxpbmcgYmFjayB0byBwYWdlIHJlcXVlc3RcIiwgcmVzcF0pXG4gICAgICByZXR1cm4gdGhpcy5vblJlZGlyZWN0KHt0bzogdGhpcy5ocmVmfSlcbiAgICB9XG4gICAgaWYocmVzcC5yZWRpcmVjdCB8fCByZXNwLmxpdmVfcmVkaXJlY3Qpe1xuICAgICAgdGhpcy5qb2luUGVuZGluZyA9IGZhbHNlXG4gICAgICB0aGlzLmNoYW5uZWwubGVhdmUoKVxuICAgIH1cbiAgICBpZihyZXNwLnJlZGlyZWN0KXsgcmV0dXJuIHRoaXMub25SZWRpcmVjdChyZXNwLnJlZGlyZWN0KSB9XG4gICAgaWYocmVzcC5saXZlX3JlZGlyZWN0KXsgcmV0dXJuIHRoaXMub25MaXZlUmVkaXJlY3QocmVzcC5saXZlX3JlZGlyZWN0KSB9XG4gICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXCJ1bmFibGUgdG8gam9pblwiLCByZXNwXSlcbiAgICByZXR1cm4gdGhpcy5saXZlU29ja2V0LnJlbG9hZFdpdGhKaXR0ZXIodGhpcylcbiAgfVxuXG4gIG9uQ2xvc2UocmVhc29uKXtcbiAgICBpZih0aGlzLmlzRGVzdHJveWVkKCkpeyByZXR1cm4gfVxuICAgIGlmKCh0aGlzLmlzSm9pblBlbmRpbmcoKSAmJiBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgIT09IFwiaGlkZGVuXCIpIHx8XG4gICAgICAodGhpcy5saXZlU29ja2V0Lmhhc1BlbmRpbmdMaW5rKCkgJiYgcmVhc29uICE9PSBcImxlYXZlXCIpKXtcblxuICAgICAgcmV0dXJuIHRoaXMubGl2ZVNvY2tldC5yZWxvYWRXaXRoSml0dGVyKHRoaXMpXG4gICAgfVxuICAgIHRoaXMuZGVzdHJveUFsbENoaWxkcmVuKClcbiAgICB0aGlzLmxpdmVTb2NrZXQuZHJvcEFjdGl2ZUVsZW1lbnQodGhpcylcbiAgICAvLyBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGNhbiBiZSBudWxsIGluIEludGVybmV0IEV4cGxvcmVyIDExXG4gICAgaWYoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCl7IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1cigpIH1cbiAgICBpZih0aGlzLmxpdmVTb2NrZXQuaXNVbmxvYWRlZCgpKXtcbiAgICAgIHRoaXMuc2hvd0xvYWRlcihCRUZPUkVfVU5MT0FEX0xPQURFUl9USU1FT1VUKVxuICAgIH1cbiAgfVxuXG4gIG9uRXJyb3IocmVhc29uKXtcbiAgICB0aGlzLm9uQ2xvc2UocmVhc29uKVxuICAgIHRoaXMubG9nKFwiZXJyb3JcIiwgKCkgPT4gW1widmlldyBjcmFzaGVkXCIsIHJlYXNvbl0pXG4gICAgaWYoIXRoaXMubGl2ZVNvY2tldC5pc1VubG9hZGVkKCkpeyB0aGlzLmRpc3BsYXlFcnJvcigpIH1cbiAgfVxuXG4gIGRpc3BsYXlFcnJvcigpe1xuICAgIGlmKHRoaXMuaXNNYWluKCkpeyBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLCB7dG86IHRoaXMuaHJlZiwga2luZDogXCJlcnJvclwifSkgfVxuICAgIHRoaXMuc2hvd0xvYWRlcigpXG4gICAgdGhpcy5zZXRDb250YWluZXJDbGFzc2VzKFBIWF9ESVNDT05ORUNURURfQ0xBU1MsIFBIWF9FUlJPUl9DTEFTUylcbiAgfVxuXG4gIHB1c2hXaXRoUmVwbHkocmVmR2VuZXJhdG9yLCBldmVudCwgcGF5bG9hZCwgb25SZXBseSA9IGZ1bmN0aW9uICgpeyB9KXtcbiAgICBpZighdGhpcy5pc0Nvbm5lY3RlZCgpKXsgcmV0dXJuIH1cblxuICAgIGxldCBbcmVmLCBbZWxdLCBvcHRzXSA9IHJlZkdlbmVyYXRvciA/IHJlZkdlbmVyYXRvcigpIDogW251bGwsIFtdLCB7fV1cbiAgICBsZXQgb25Mb2FkaW5nRG9uZSA9IGZ1bmN0aW9uKCl7IH1cbiAgICBpZihvcHRzLnBhZ2VfbG9hZGluZyB8fCAoZWwgJiYgKGVsLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX1BBR0VfTE9BRElORykpICE9PSBudWxsKSkpe1xuICAgICAgb25Mb2FkaW5nRG9uZSA9IHRoaXMubGl2ZVNvY2tldC53aXRoUGFnZUxvYWRpbmcoe2tpbmQ6IFwiZWxlbWVudFwiLCB0YXJnZXQ6IGVsfSlcbiAgICB9XG5cbiAgICBpZih0eXBlb2YgKHBheWxvYWQuY2lkKSAhPT0gXCJudW1iZXJcIil7IGRlbGV0ZSBwYXlsb2FkLmNpZCB9XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMubGl2ZVNvY2tldC53cmFwUHVzaCh0aGlzLCB7dGltZW91dDogdHJ1ZX0sICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbm5lbC5wdXNoKGV2ZW50LCBwYXlsb2FkLCBQVVNIX1RJTUVPVVQpLnJlY2VpdmUoXCJva1wiLCByZXNwID0+IHtcbiAgICAgICAgICBpZihyZWYgIT09IG51bGwpeyB0aGlzLnVuZG9SZWZzKHJlZikgfVxuICAgICAgICAgIGxldCBmaW5pc2ggPSAoaG9va1JlcGx5KSA9PiB7XG4gICAgICAgICAgICBpZihyZXNwLnJlZGlyZWN0KXsgdGhpcy5vblJlZGlyZWN0KHJlc3AucmVkaXJlY3QpIH1cbiAgICAgICAgICAgIGlmKHJlc3AubGl2ZV9wYXRjaCl7IHRoaXMub25MaXZlUGF0Y2gocmVzcC5saXZlX3BhdGNoKSB9XG4gICAgICAgICAgICBpZihyZXNwLmxpdmVfcmVkaXJlY3QpeyB0aGlzLm9uTGl2ZVJlZGlyZWN0KHJlc3AubGl2ZV9yZWRpcmVjdCkgfVxuICAgICAgICAgICAgb25Mb2FkaW5nRG9uZSgpXG4gICAgICAgICAgICBvblJlcGx5KHJlc3AsIGhvb2tSZXBseSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYocmVzcC5kaWZmKXtcbiAgICAgICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgbGV0IGhvb2tSZXBseSA9IHRoaXMuYXBwbHlEaWZmKFwidXBkYXRlXCIsIHJlc3AuZGlmZiwgKHtkaWZmLCBldmVudHN9KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoZGlmZiwgZXZlbnRzKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICBmaW5pc2goaG9va1JlcGx5KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmluaXNoKG51bGwpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICApXG4gIH1cblxuICB1bmRvUmVmcyhyZWYpe1xuICAgIERPTS5hbGwoZG9jdW1lbnQsIGBbJHtQSFhfUkVGX1NSQ309XCIke3RoaXMuaWR9XCJdWyR7UEhYX1JFRn09XCIke3JlZn1cIl1gLCBlbCA9PiB7XG4gICAgICBsZXQgZGlzYWJsZWRWYWwgPSBlbC5nZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVEKVxuICAgICAgLy8gcmVtb3ZlIHJlZnNcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfUkVGKVxuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUZfU1JDKVxuICAgICAgLy8gcmVzdG9yZSBpbnB1dHNcbiAgICAgIGlmKGVsLmdldEF0dHJpYnV0ZShQSFhfUkVBRE9OTFkpICE9PSBudWxsKXtcbiAgICAgICAgZWwucmVhZE9ubHkgPSBmYWxzZVxuICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFQURPTkxZKVxuICAgICAgfVxuICAgICAgaWYoZGlzYWJsZWRWYWwgIT09IG51bGwpe1xuICAgICAgICBlbC5kaXNhYmxlZCA9IGRpc2FibGVkVmFsID09PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZVxuICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX0RJU0FCTEVEKVxuICAgICAgfVxuICAgICAgLy8gcmVtb3ZlIGNsYXNzZXNcbiAgICAgIFBIWF9FVkVOVF9DTEFTU0VTLmZvckVhY2goY2xhc3NOYW1lID0+IERPTS5yZW1vdmVDbGFzcyhlbCwgY2xhc3NOYW1lKSlcbiAgICAgIC8vIHJlc3RvcmUgZGlzYWJsZXNcbiAgICAgIGxldCBkaXNhYmxlUmVzdG9yZSA9IGVsLmdldEF0dHJpYnV0ZShQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUpXG4gICAgICBpZihkaXNhYmxlUmVzdG9yZSAhPT0gbnVsbCl7XG4gICAgICAgIGVsLmlubmVyVGV4dCA9IGRpc2FibGVSZXN0b3JlXG4gICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUpXG4gICAgICB9XG4gICAgICBsZXQgdG9FbCA9IERPTS5wcml2YXRlKGVsLCBQSFhfUkVGKVxuICAgICAgaWYodG9FbCl7XG4gICAgICAgIGxldCBob29rID0gdGhpcy50cmlnZ2VyQmVmb3JlVXBkYXRlSG9vayhlbCwgdG9FbClcbiAgICAgICAgRE9NUGF0Y2gucGF0Y2hFbChlbCwgdG9FbCwgdGhpcy5saXZlU29ja2V0LmdldEFjdGl2ZUVsZW1lbnQoKSlcbiAgICAgICAgaWYoaG9vayl7IGhvb2suX191cGRhdGVkKCkgfVxuICAgICAgICBET00uZGVsZXRlUHJpdmF0ZShlbCwgUEhYX1JFRilcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHV0UmVmKGVsZW1lbnRzLCBldmVudCwgb3B0cyA9IHt9KXtcbiAgICBsZXQgbmV3UmVmID0gdGhpcy5yZWYrK1xuICAgIGxldCBkaXNhYmxlV2l0aCA9IHRoaXMuYmluZGluZyhQSFhfRElTQUJMRV9XSVRIKVxuICAgIGlmKG9wdHMubG9hZGluZyl7IGVsZW1lbnRzID0gZWxlbWVudHMuY29uY2F0KERPTS5hbGwoZG9jdW1lbnQsIG9wdHMubG9hZGluZykpfVxuXG4gICAgZWxlbWVudHMuZm9yRWFjaChlbCA9PiB7XG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKGBwaHgtJHtldmVudH0tbG9hZGluZ2ApXG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX1JFRiwgbmV3UmVmKVxuICAgICAgZWwuc2V0QXR0cmlidXRlKFBIWF9SRUZfU1JDLCB0aGlzLmVsLmlkKVxuICAgICAgbGV0IGRpc2FibGVUZXh0ID0gZWwuZ2V0QXR0cmlidXRlKGRpc2FibGVXaXRoKVxuICAgICAgaWYoZGlzYWJsZVRleHQgIT09IG51bGwpe1xuICAgICAgICBpZighZWwuZ2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSkpe1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUsIGVsLmlubmVyVGV4dClcbiAgICAgICAgfVxuICAgICAgICBpZihkaXNhYmxlVGV4dCAhPT0gXCJcIil7IGVsLmlubmVyVGV4dCA9IGRpc2FibGVUZXh0IH1cbiAgICAgICAgZWwuc2V0QXR0cmlidXRlKFwiZGlzYWJsZWRcIiwgXCJcIilcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBbbmV3UmVmLCBlbGVtZW50cywgb3B0c11cbiAgfVxuXG4gIGNvbXBvbmVudElEKGVsKXtcbiAgICBsZXQgY2lkID0gZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKVxuICAgIHJldHVybiBjaWQgPyBwYXJzZUludChjaWQpIDogbnVsbFxuICB9XG5cbiAgdGFyZ2V0Q29tcG9uZW50SUQodGFyZ2V0LCB0YXJnZXRDdHgsIG9wdHMgPSB7fSl7XG4gICAgaWYoaXNDaWQodGFyZ2V0Q3R4KSl7IHJldHVybiB0YXJnZXRDdHggfVxuXG4gICAgbGV0IGNpZE9yU2VsZWN0b3IgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcInRhcmdldFwiKSlcbiAgICBpZihpc0NpZChjaWRPclNlbGVjdG9yKSl7XG4gICAgICByZXR1cm4gcGFyc2VJbnQoY2lkT3JTZWxlY3RvcilcbiAgICB9IGVsc2UgaWYodGFyZ2V0Q3R4ICYmIChjaWRPclNlbGVjdG9yICE9PSBudWxsIHx8IG9wdHMudGFyZ2V0KSl7XG4gICAgICByZXR1cm4gdGhpcy5jbG9zZXN0Q29tcG9uZW50SUQodGFyZ2V0Q3R4KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGNsb3Nlc3RDb21wb25lbnRJRCh0YXJnZXRDdHgpe1xuICAgIGlmKGlzQ2lkKHRhcmdldEN0eCkpe1xuICAgICAgcmV0dXJuIHRhcmdldEN0eFxuICAgIH0gZWxzZSBpZih0YXJnZXRDdHgpe1xuICAgICAgcmV0dXJuIG1heWJlKHRhcmdldEN0eC5jbG9zZXN0KGBbJHtQSFhfQ09NUE9ORU5UfV1gKSwgZWwgPT4gdGhpcy5vd25zRWxlbWVudChlbCkgJiYgdGhpcy5jb21wb25lbnRJRChlbCkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgcHVzaEhvb2tFdmVudCh0YXJnZXRDdHgsIGV2ZW50LCBwYXlsb2FkLCBvblJlcGx5KXtcbiAgICBpZighdGhpcy5pc0Nvbm5lY3RlZCgpKXtcbiAgICAgIHRoaXMubG9nKFwiaG9va1wiLCAoKSA9PiBbXCJ1bmFibGUgdG8gcHVzaCBob29rIGV2ZW50LiBMaXZlVmlldyBub3QgY29ubmVjdGVkXCIsIGV2ZW50LCBwYXlsb2FkXSlcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBsZXQgW3JlZiwgZWxzLCBvcHRzXSA9IHRoaXMucHV0UmVmKFtdLCBcImhvb2tcIilcbiAgICB0aGlzLnB1c2hXaXRoUmVwbHkoKCkgPT4gW3JlZiwgZWxzLCBvcHRzXSwgXCJldmVudFwiLCB7XG4gICAgICB0eXBlOiBcImhvb2tcIixcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIHZhbHVlOiBwYXlsb2FkLFxuICAgICAgY2lkOiB0aGlzLmNsb3Nlc3RDb21wb25lbnRJRCh0YXJnZXRDdHgpXG4gICAgfSwgKHJlc3AsIHJlcGx5KSA9PiBvblJlcGx5KHJlcGx5LCByZWYpKVxuXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgZXh0cmFjdE1ldGEoZWwsIG1ldGEsIHZhbHVlKXtcbiAgICBsZXQgcHJlZml4ID0gdGhpcy5iaW5kaW5nKFwidmFsdWUtXCIpXG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGVsLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspe1xuICAgICAgaWYoIW1ldGEpeyBtZXRhID0ge30gfVxuICAgICAgbGV0IG5hbWUgPSBlbC5hdHRyaWJ1dGVzW2ldLm5hbWVcbiAgICAgIGlmKG5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKXsgbWV0YVtuYW1lLnJlcGxhY2UocHJlZml4LCBcIlwiKV0gPSBlbC5nZXRBdHRyaWJ1dGUobmFtZSkgfVxuICAgIH1cbiAgICBpZihlbC52YWx1ZSAhPT0gdW5kZWZpbmVkKXtcbiAgICAgIGlmKCFtZXRhKXsgbWV0YSA9IHt9IH1cbiAgICAgIG1ldGEudmFsdWUgPSBlbC52YWx1ZVxuXG4gICAgICBpZihlbC50YWdOYW1lID09PSBcIklOUFVUXCIgJiYgQ0hFQ0tBQkxFX0lOUFVUUy5pbmRleE9mKGVsLnR5cGUpID49IDAgJiYgIWVsLmNoZWNrZWQpe1xuICAgICAgICBkZWxldGUgbWV0YS52YWx1ZVxuICAgICAgfVxuICAgIH1cbiAgICBpZih2YWx1ZSl7XG4gICAgICBpZighbWV0YSl7IG1ldGEgPSB7fSB9XG4gICAgICBmb3IobGV0IGtleSBpbiB2YWx1ZSl7IG1ldGFba2V5XSA9IHZhbHVlW2tleV0gfVxuICAgIH1cbiAgICByZXR1cm4gbWV0YVxuICB9XG5cbiAgcHVzaEV2ZW50KHR5cGUsIGVsLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBtZXRhLCBvcHRzID0ge30pe1xuICAgIHRoaXMucHVzaFdpdGhSZXBseSgoKSA9PiB0aGlzLnB1dFJlZihbZWxdLCB0eXBlLCBvcHRzKSwgXCJldmVudFwiLCB7XG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgZXZlbnQ6IHBoeEV2ZW50LFxuICAgICAgdmFsdWU6IHRoaXMuZXh0cmFjdE1ldGEoZWwsIG1ldGEsIG9wdHMudmFsdWUpLFxuICAgICAgY2lkOiB0aGlzLnRhcmdldENvbXBvbmVudElEKGVsLCB0YXJnZXRDdHgsIG9wdHMpXG4gICAgfSlcbiAgfVxuXG4gIHB1c2hGaWxlUHJvZ3Jlc3MoZmlsZUVsLCBlbnRyeVJlZiwgcHJvZ3Jlc3MsIG9uUmVwbHkgPSBmdW5jdGlvbiAoKXsgfSl7XG4gICAgdGhpcy5saXZlU29ja2V0LndpdGhpbk93bmVycyhmaWxlRWwuZm9ybSwgKHZpZXcsIHRhcmdldEN0eCkgPT4ge1xuICAgICAgdmlldy5wdXNoV2l0aFJlcGx5KG51bGwsIFwicHJvZ3Jlc3NcIiwge1xuICAgICAgICBldmVudDogZmlsZUVsLmdldEF0dHJpYnV0ZSh2aWV3LmJpbmRpbmcoUEhYX1BST0dSRVNTKSksXG4gICAgICAgIHJlZjogZmlsZUVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRiksXG4gICAgICAgIGVudHJ5X3JlZjogZW50cnlSZWYsXG4gICAgICAgIHByb2dyZXNzOiBwcm9ncmVzcyxcbiAgICAgICAgY2lkOiB2aWV3LnRhcmdldENvbXBvbmVudElEKGZpbGVFbC5mb3JtLCB0YXJnZXRDdHgpXG4gICAgICB9LCBvblJlcGx5KVxuICAgIH0pXG4gIH1cblxuICBwdXNoSW5wdXQoaW5wdXRFbCwgdGFyZ2V0Q3R4LCBmb3JjZUNpZCwgcGh4RXZlbnQsIG9wdHMsIGNhbGxiYWNrKXtcbiAgICBsZXQgdXBsb2Fkc1xuICAgIGxldCBjaWQgPSBpc0NpZChmb3JjZUNpZCkgPyBmb3JjZUNpZCA6IHRoaXMudGFyZ2V0Q29tcG9uZW50SUQoaW5wdXRFbC5mb3JtLCB0YXJnZXRDdHgpXG4gICAgbGV0IHJlZkdlbmVyYXRvciA9ICgpID0+IHRoaXMucHV0UmVmKFtpbnB1dEVsLCBpbnB1dEVsLmZvcm1dLCBcImNoYW5nZVwiLCBvcHRzKVxuICAgIGxldCBmb3JtRGF0YSA9IHNlcmlhbGl6ZUZvcm0oaW5wdXRFbC5mb3JtLCB7X3RhcmdldDogb3B0cy5fdGFyZ2V0fSlcbiAgICBpZihET00uaXNVcGxvYWRJbnB1dChpbnB1dEVsKSAmJiBpbnB1dEVsLmZpbGVzICYmIGlucHV0RWwuZmlsZXMubGVuZ3RoID4gMCl7XG4gICAgICBMaXZlVXBsb2FkZXIudHJhY2tGaWxlcyhpbnB1dEVsLCBBcnJheS5mcm9tKGlucHV0RWwuZmlsZXMpKVxuICAgIH1cbiAgICB1cGxvYWRzID0gTGl2ZVVwbG9hZGVyLnNlcmlhbGl6ZVVwbG9hZHMoaW5wdXRFbClcbiAgICBsZXQgZXZlbnQgPSB7XG4gICAgICB0eXBlOiBcImZvcm1cIixcbiAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgIHZhbHVlOiBmb3JtRGF0YSxcbiAgICAgIHVwbG9hZHM6IHVwbG9hZHMsXG4gICAgICBjaWQ6IGNpZFxuICAgIH1cbiAgICB0aGlzLnB1c2hXaXRoUmVwbHkocmVmR2VuZXJhdG9yLCBcImV2ZW50XCIsIGV2ZW50LCByZXNwID0+IHtcbiAgICAgIERPTS5zaG93RXJyb3IoaW5wdXRFbCwgdGhpcy5saXZlU29ja2V0LmJpbmRpbmcoUEhYX0ZFRURCQUNLX0ZPUikpXG4gICAgICBpZihET00uaXNVcGxvYWRJbnB1dChpbnB1dEVsKSAmJiBpbnB1dEVsLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LWF1dG8tdXBsb2FkXCIpICE9PSBudWxsKXtcbiAgICAgICAgaWYoTGl2ZVVwbG9hZGVyLmZpbGVzQXdhaXRpbmdQcmVmbGlnaHQoaW5wdXRFbCkubGVuZ3RoID4gMCl7XG4gICAgICAgICAgbGV0IFtyZWYsIF9lbHNdID0gcmVmR2VuZXJhdG9yKClcbiAgICAgICAgICB0aGlzLnVwbG9hZEZpbGVzKGlucHV0RWwuZm9ybSwgdGFyZ2V0Q3R4LCByZWYsIGNpZCwgKF91cGxvYWRzKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhyZXNwKVxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyQXdhaXRpbmdTdWJtaXQoaW5wdXRFbC5mb3JtKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKHJlc3ApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHRyaWdnZXJBd2FpdGluZ1N1Ym1pdChmb3JtRWwpe1xuICAgIGxldCBhd2FpdGluZ1N1Ym1pdCA9IHRoaXMuZ2V0U2NoZWR1bGVkU3VibWl0KGZvcm1FbClcbiAgICBpZihhd2FpdGluZ1N1Ym1pdCl7XG4gICAgICBsZXQgW19lbCwgX3JlZiwgX29wdHMsIGNhbGxiYWNrXSA9IGF3YWl0aW5nU3VibWl0XG4gICAgICB0aGlzLmNhbmNlbFN1Ym1pdChmb3JtRWwpXG4gICAgICBjYWxsYmFjaygpXG4gICAgfVxuICB9XG5cbiAgZ2V0U2NoZWR1bGVkU3VibWl0KGZvcm1FbCl7XG4gICAgcmV0dXJuIHRoaXMuZm9ybVN1Ym1pdHMuZmluZCgoW2VsLCBfcmVmLCBfb3B0cywgX2NhbGxiYWNrXSkgPT4gZWwuaXNTYW1lTm9kZShmb3JtRWwpKVxuICB9XG5cbiAgc2NoZWR1bGVTdWJtaXQoZm9ybUVsLCByZWYsIG9wdHMsIGNhbGxiYWNrKXtcbiAgICBpZih0aGlzLmdldFNjaGVkdWxlZFN1Ym1pdChmb3JtRWwpKXsgcmV0dXJuIHRydWUgfVxuICAgIHRoaXMuZm9ybVN1Ym1pdHMucHVzaChbZm9ybUVsLCByZWYsIG9wdHMsIGNhbGxiYWNrXSlcbiAgfVxuXG4gIGNhbmNlbFN1Ym1pdChmb3JtRWwpe1xuICAgIHRoaXMuZm9ybVN1Ym1pdHMgPSB0aGlzLmZvcm1TdWJtaXRzLmZpbHRlcigoW2VsLCByZWYsIF9jYWxsYmFja10pID0+IHtcbiAgICAgIGlmKGVsLmlzU2FtZU5vZGUoZm9ybUVsKSl7XG4gICAgICAgIHRoaXMudW5kb1JlZnMocmVmKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHB1c2hGb3JtU3VibWl0KGZvcm1FbCwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgb3B0cywgb25SZXBseSl7XG4gICAgbGV0IGZpbHRlcklnbm9yZWQgPSBlbCA9PiB7XG4gICAgICBsZXQgdXNlcklnbm9yZWQgPSBjbG9zZXN0UGh4QmluZGluZyhlbCwgYCR7dGhpcy5iaW5kaW5nKFBIWF9VUERBVEUpfT1pZ25vcmVgLCBlbC5mb3JtKVxuICAgICAgcmV0dXJuICEodXNlcklnbm9yZWQgfHwgY2xvc2VzdFBoeEJpbmRpbmcoZWwsIFwiZGF0YS1waHgtdXBkYXRlPWlnbm9yZVwiLCBlbC5mb3JtKSlcbiAgICB9XG4gICAgbGV0IGZpbHRlckRpc2FibGVzID0gZWwgPT4ge1xuICAgICAgcmV0dXJuIGVsLmhhc0F0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX0RJU0FCTEVfV0lUSCkpXG4gICAgfVxuICAgIGxldCBmaWx0ZXJCdXR0b24gPSBlbCA9PiBlbC50YWdOYW1lID09IFwiQlVUVE9OXCJcblxuICAgIGxldCBmaWx0ZXJJbnB1dCA9IGVsID0+IFtcIklOUFVUXCIsIFwiVEVYVEFSRUFcIiwgXCJTRUxFQ1RcIl0uaW5jbHVkZXMoZWwudGFnTmFtZSlcblxuICAgIGxldCByZWZHZW5lcmF0b3IgPSAoKSA9PiB7XG4gICAgICBsZXQgZm9ybUVsZW1lbnRzID0gQXJyYXkuZnJvbShmb3JtRWwuZWxlbWVudHMpXG4gICAgICBsZXQgZGlzYWJsZXMgPSBmb3JtRWxlbWVudHMuZmlsdGVyKGZpbHRlckRpc2FibGVzKVxuICAgICAgbGV0IGJ1dHRvbnMgPSBmb3JtRWxlbWVudHMuZmlsdGVyKGZpbHRlckJ1dHRvbikuZmlsdGVyKGZpbHRlcklnbm9yZWQpXG4gICAgICBsZXQgaW5wdXRzID0gZm9ybUVsZW1lbnRzLmZpbHRlcihmaWx0ZXJJbnB1dCkuZmlsdGVyKGZpbHRlcklnbm9yZWQpXG5cbiAgICAgIGJ1dHRvbnMuZm9yRWFjaChidXR0b24gPT4ge1xuICAgICAgICBidXR0b24uc2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFRCwgYnV0dG9uLmRpc2FibGVkKVxuICAgICAgICBidXR0b24uZGlzYWJsZWQgPSB0cnVlXG4gICAgICB9KVxuICAgICAgaW5wdXRzLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoUEhYX1JFQURPTkxZLCBpbnB1dC5yZWFkT25seSlcbiAgICAgICAgaW5wdXQucmVhZE9ubHkgPSB0cnVlXG4gICAgICAgIGlmKGlucHV0LmZpbGVzKXtcbiAgICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVELCBpbnB1dC5kaXNhYmxlZClcbiAgICAgICAgICBpbnB1dC5kaXNhYmxlZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIGZvcm1FbC5zZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9QQUdFX0xPQURJTkcpLCBcIlwiKVxuICAgICAgcmV0dXJuIHRoaXMucHV0UmVmKFtmb3JtRWxdLmNvbmNhdChkaXNhYmxlcykuY29uY2F0KGJ1dHRvbnMpLmNvbmNhdChpbnB1dHMpLCBcInN1Ym1pdFwiLCBvcHRzKVxuICAgIH1cblxuICAgIGxldCBjaWQgPSB0aGlzLnRhcmdldENvbXBvbmVudElEKGZvcm1FbCwgdGFyZ2V0Q3R4KVxuICAgIGlmKExpdmVVcGxvYWRlci5oYXNVcGxvYWRzSW5Qcm9ncmVzcyhmb3JtRWwpKXtcbiAgICAgIGxldCBbcmVmLCBfZWxzXSA9IHJlZkdlbmVyYXRvcigpXG4gICAgICBsZXQgcHVzaCA9ICgpID0+IHRoaXMucHVzaEZvcm1TdWJtaXQoZm9ybUVsLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBvcHRzLCBvblJlcGx5KVxuICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVTdWJtaXQoZm9ybUVsLCByZWYsIG9wdHMsIHB1c2gpXG4gICAgfSBlbHNlIGlmKExpdmVVcGxvYWRlci5pbnB1dHNBd2FpdGluZ1ByZWZsaWdodChmb3JtRWwpLmxlbmd0aCA+IDApe1xuICAgICAgbGV0IFtyZWYsIGVsc10gPSByZWZHZW5lcmF0b3IoKVxuICAgICAgbGV0IHByb3h5UmVmR2VuID0gKCkgPT4gW3JlZiwgZWxzLCBvcHRzXVxuICAgICAgdGhpcy51cGxvYWRGaWxlcyhmb3JtRWwsIHRhcmdldEN0eCwgcmVmLCBjaWQsIChfdXBsb2FkcykgPT4ge1xuICAgICAgICBsZXQgZm9ybURhdGEgPSBzZXJpYWxpemVGb3JtKGZvcm1FbCwge30pXG4gICAgICAgIHRoaXMucHVzaFdpdGhSZXBseShwcm94eVJlZkdlbiwgXCJldmVudFwiLCB7XG4gICAgICAgICAgdHlwZTogXCJmb3JtXCIsXG4gICAgICAgICAgZXZlbnQ6IHBoeEV2ZW50LFxuICAgICAgICAgIHZhbHVlOiBmb3JtRGF0YSxcbiAgICAgICAgICBjaWQ6IGNpZFxuICAgICAgICB9LCBvblJlcGx5KVxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGZvcm1EYXRhID0gc2VyaWFsaXplRm9ybShmb3JtRWwpXG4gICAgICB0aGlzLnB1c2hXaXRoUmVwbHkocmVmR2VuZXJhdG9yLCBcImV2ZW50XCIsIHtcbiAgICAgICAgdHlwZTogXCJmb3JtXCIsXG4gICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgdmFsdWU6IGZvcm1EYXRhLFxuICAgICAgICBjaWQ6IGNpZFxuICAgICAgfSwgb25SZXBseSlcbiAgICB9XG4gIH1cblxuICB1cGxvYWRGaWxlcyhmb3JtRWwsIHRhcmdldEN0eCwgcmVmLCBjaWQsIG9uQ29tcGxldGUpe1xuICAgIGxldCBqb2luQ291bnRBdFVwbG9hZCA9IHRoaXMuam9pbkNvdW50XG4gICAgbGV0IGlucHV0RWxzID0gTGl2ZVVwbG9hZGVyLmFjdGl2ZUZpbGVJbnB1dHMoZm9ybUVsKVxuICAgIGxldCBudW1GaWxlSW5wdXRzSW5Qcm9ncmVzcyA9IGlucHV0RWxzLmxlbmd0aFxuXG4gICAgLy8gZ2V0IGVhY2ggZmlsZSBpbnB1dFxuICAgIGlucHV0RWxzLmZvckVhY2goaW5wdXRFbCA9PiB7XG4gICAgICBsZXQgdXBsb2FkZXIgPSBuZXcgTGl2ZVVwbG9hZGVyKGlucHV0RWwsIHRoaXMsICgpID0+IHtcbiAgICAgICAgbnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MtLVxuICAgICAgICBpZihudW1GaWxlSW5wdXRzSW5Qcm9ncmVzcyA9PT0gMCl7IG9uQ29tcGxldGUoKSB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy51cGxvYWRlcnNbaW5wdXRFbF0gPSB1cGxvYWRlclxuICAgICAgbGV0IGVudHJpZXMgPSB1cGxvYWRlci5lbnRyaWVzKCkubWFwKGVudHJ5ID0+IGVudHJ5LnRvUHJlZmxpZ2h0UGF5bG9hZCgpKVxuXG4gICAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgICAgcmVmOiBpbnB1dEVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRiksXG4gICAgICAgIGVudHJpZXM6IGVudHJpZXMsXG4gICAgICAgIGNpZDogdGhpcy50YXJnZXRDb21wb25lbnRJRChpbnB1dEVsLmZvcm0sIHRhcmdldEN0eClcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2coXCJ1cGxvYWRcIiwgKCkgPT4gW1wic2VuZGluZyBwcmVmbGlnaHQgcmVxdWVzdFwiLCBwYXlsb2FkXSlcblxuICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KG51bGwsIFwiYWxsb3dfdXBsb2FkXCIsIHBheWxvYWQsIHJlc3AgPT4ge1xuICAgICAgICB0aGlzLmxvZyhcInVwbG9hZFwiLCAoKSA9PiBbXCJnb3QgcHJlZmxpZ2h0IHJlc3BvbnNlXCIsIHJlc3BdKVxuICAgICAgICBpZihyZXNwLmVycm9yKXtcbiAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZilcbiAgICAgICAgICBsZXQgW2VudHJ5X3JlZiwgcmVhc29uXSA9IHJlc3AuZXJyb3JcbiAgICAgICAgICB0aGlzLmxvZyhcInVwbG9hZFwiLCAoKSA9PiBbYGVycm9yIGZvciBlbnRyeSAke2VudHJ5X3JlZn1gLCByZWFzb25dKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBvbkVycm9yID0gKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNoYW5uZWwub25FcnJvcigoKSA9PiB7XG4gICAgICAgICAgICAgIGlmKHRoaXMuam9pbkNvdW50ID09PSBqb2luQ291bnRBdFVwbG9hZCl7IGNhbGxiYWNrKCkgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgdXBsb2FkZXIuaW5pdEFkYXB0ZXJVcGxvYWQocmVzcCwgb25FcnJvciwgdGhpcy5saXZlU29ja2V0KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBkaXNwYXRjaFVwbG9hZHMobmFtZSwgZmlsZXNPckJsb2JzKXtcbiAgICBsZXQgaW5wdXRzID0gRE9NLmZpbmRVcGxvYWRJbnB1dHModGhpcy5lbCkuZmlsdGVyKGVsID0+IGVsLm5hbWUgPT09IG5hbWUpXG4gICAgaWYoaW5wdXRzLmxlbmd0aCA9PT0gMCl7IGxvZ0Vycm9yKGBubyBsaXZlIGZpbGUgaW5wdXRzIGZvdW5kIG1hdGNoaW5nIHRoZSBuYW1lIFwiJHtuYW1lfVwiYCkgfVxuICAgIGVsc2UgaWYoaW5wdXRzLmxlbmd0aCA+IDEpeyBsb2dFcnJvcihgZHVwbGljYXRlIGxpdmUgZmlsZSBpbnB1dHMgZm91bmQgbWF0Y2hpbmcgdGhlIG5hbWUgXCIke25hbWV9XCJgKSB9XG4gICAgZWxzZSB7IERPTS5kaXNwYXRjaEV2ZW50KGlucHV0c1swXSwgUEhYX1RSQUNLX1VQTE9BRFMsIHtmaWxlczogZmlsZXNPckJsb2JzfSkgfVxuICB9XG5cbiAgcHVzaEZvcm1SZWNvdmVyeShmb3JtLCBuZXdDaWQsIGNhbGxiYWNrKXtcbiAgICB0aGlzLmxpdmVTb2NrZXQud2l0aGluT3duZXJzKGZvcm0sICh2aWV3LCB0YXJnZXRDdHgpID0+IHtcbiAgICAgIGxldCBpbnB1dCA9IGZvcm0uZWxlbWVudHNbMF1cbiAgICAgIGxldCBwaHhFdmVudCA9IGZvcm0uZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfQVVUT19SRUNPVkVSKSkgfHwgZm9ybS5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpKVxuXG4gICAgICBKUy5leGVjKFwiY2hhbmdlXCIsIHBoeEV2ZW50LCB2aWV3LCBpbnB1dCwgW1wicHVzaFwiLCB7X3RhcmdldDogaW5wdXQubmFtZSwgbmV3Q2lkOiBuZXdDaWQsIGNhbGxiYWNrOiBjYWxsYmFja31dKVxuICAgIH0pXG4gIH1cblxuICBwdXNoTGlua1BhdGNoKGhyZWYsIHRhcmdldEVsLCBjYWxsYmFjayl7XG4gICAgbGV0IGxpbmtSZWYgPSB0aGlzLmxpdmVTb2NrZXQuc2V0UGVuZGluZ0xpbmsoaHJlZilcbiAgICBsZXQgcmVmR2VuID0gdGFyZ2V0RWwgPyAoKSA9PiB0aGlzLnB1dFJlZihbdGFyZ2V0RWxdLCBcImNsaWNrXCIpIDogbnVsbFxuICAgIGxldCBmYWxsYmFjayA9ICgpID0+IHRoaXMubGl2ZVNvY2tldC5yZWRpcmVjdCh3aW5kb3cubG9jYXRpb24uaHJlZilcblxuICAgIGxldCBwdXNoID0gdGhpcy5wdXNoV2l0aFJlcGx5KHJlZkdlbiwgXCJsaXZlX3BhdGNoXCIsIHt1cmw6IGhyZWZ9LCByZXNwID0+IHtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgaWYocmVzcC5saW5rX3JlZGlyZWN0KXtcbiAgICAgICAgICB0aGlzLmxpdmVTb2NrZXQucmVwbGFjZU1haW4oaHJlZiwgbnVsbCwgY2FsbGJhY2ssIGxpbmtSZWYpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYodGhpcy5saXZlU29ja2V0LmNvbW1pdFBlbmRpbmdMaW5rKGxpbmtSZWYpKXtcbiAgICAgICAgICAgIHRoaXMuaHJlZiA9IGhyZWZcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hcHBseVBlbmRpbmdVcGRhdGVzKClcbiAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhsaW5rUmVmKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpZihwdXNoKXtcbiAgICAgIHB1c2gucmVjZWl2ZShcInRpbWVvdXRcIiwgZmFsbGJhY2spXG4gICAgfSBlbHNlIHtcbiAgICAgIGZhbGxiYWNrKClcbiAgICB9XG4gIH1cblxuICBmb3Jtc0ZvclJlY292ZXJ5KGh0bWwpe1xuICAgIGlmKHRoaXMuam9pbkNvdW50ID09PSAwKXsgcmV0dXJuIFtdIH1cblxuICAgIGxldCBwaHhDaGFuZ2UgPSB0aGlzLmJpbmRpbmcoXCJjaGFuZ2VcIilcbiAgICBsZXQgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIilcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sXG5cbiAgICByZXR1cm4gKFxuICAgICAgRE9NLmFsbCh0aGlzLmVsLCBgZm9ybVske3BoeENoYW5nZX1dYClcbiAgICAgICAgLmZpbHRlcihmb3JtID0+IGZvcm0uaWQgJiYgdGhpcy5vd25zRWxlbWVudChmb3JtKSlcbiAgICAgICAgLmZpbHRlcihmb3JtID0+IGZvcm0uZWxlbWVudHMubGVuZ3RoID4gMClcbiAgICAgICAgLmZpbHRlcihmb3JtID0+IGZvcm0uZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfQVVUT19SRUNPVkVSKSkgIT09IFwiaWdub3JlXCIpXG4gICAgICAgIC5tYXAoZm9ybSA9PiB7XG4gICAgICAgICAgbGV0IG5ld0Zvcm0gPSB0ZW1wbGF0ZS5jb250ZW50LnF1ZXJ5U2VsZWN0b3IoYGZvcm1baWQ9XCIke2Zvcm0uaWR9XCJdWyR7cGh4Q2hhbmdlfT1cIiR7Zm9ybS5nZXRBdHRyaWJ1dGUocGh4Q2hhbmdlKX1cIl1gKVxuICAgICAgICAgIGlmKG5ld0Zvcm0pe1xuICAgICAgICAgICAgcmV0dXJuIFtmb3JtLCBuZXdGb3JtLCB0aGlzLnRhcmdldENvbXBvbmVudElEKG5ld0Zvcm0pXVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW2Zvcm0sIG51bGwsIG51bGxdXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChbZm9ybSwgbmV3Rm9ybSwgbmV3Q2lkXSkgPT4gbmV3Rm9ybSlcbiAgICApXG4gIH1cblxuICBtYXliZVB1c2hDb21wb25lbnRzRGVzdHJveWVkKGRlc3Ryb3llZENJRHMpe1xuICAgIGxldCB3aWxsRGVzdHJveUNJRHMgPSBkZXN0cm95ZWRDSURzLmZpbHRlcihjaWQgPT4ge1xuICAgICAgcmV0dXJuIERPTS5maW5kQ29tcG9uZW50Tm9kZUxpc3QodGhpcy5lbCwgY2lkKS5sZW5ndGggPT09IDBcbiAgICB9KVxuICAgIGlmKHdpbGxEZXN0cm95Q0lEcy5sZW5ndGggPiAwKXtcbiAgICAgIHRoaXMucHJ1bmluZ0NJRHMucHVzaCguLi53aWxsRGVzdHJveUNJRHMpXG5cbiAgICAgIHRoaXMucHVzaFdpdGhSZXBseShudWxsLCBcImNpZHNfd2lsbF9kZXN0cm95XCIsIHtjaWRzOiB3aWxsRGVzdHJveUNJRHN9LCAoKSA9PiB7XG4gICAgICAgIC8vIFRoZSBjaWRzIGFyZSBlaXRoZXIgYmFjayBvbiB0aGUgcGFnZSBvciB0aGV5IHdpbGwgYmUgZnVsbHkgcmVtb3ZlZCxcbiAgICAgICAgLy8gc28gd2UgY2FuIHJlbW92ZSB0aGVtIGZyb20gdGhlIHBydW5pbmdDSURzLlxuICAgICAgICB0aGlzLnBydW5pbmdDSURzID0gdGhpcy5wcnVuaW5nQ0lEcy5maWx0ZXIoY2lkID0+IHdpbGxEZXN0cm95Q0lEcy5pbmRleE9mKGNpZCkgIT09IC0xKVxuXG4gICAgICAgIC8vIFNlZSBpZiBhbnkgb2YgdGhlIGNpZHMgd2Ugd2FudGVkIHRvIGRlc3Ryb3kgd2VyZSBhZGRlZCBiYWNrLFxuICAgICAgICAvLyBpZiB0aGV5IHdlcmUgYWRkZWQgYmFjaywgd2UgZG9uJ3QgYWN0dWFsbHkgZGVzdHJveSB0aGVtLlxuICAgICAgICBsZXQgY29tcGxldGVseURlc3Ryb3lDSURzID0gd2lsbERlc3Ryb3lDSURzLmZpbHRlcihjaWQgPT4ge1xuICAgICAgICAgIHJldHVybiBET00uZmluZENvbXBvbmVudE5vZGVMaXN0KHRoaXMuZWwsIGNpZCkubGVuZ3RoID09PSAwXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYoY29tcGxldGVseURlc3Ryb3lDSURzLmxlbmd0aCA+IDApe1xuICAgICAgICAgIHRoaXMucHVzaFdpdGhSZXBseShudWxsLCBcImNpZHNfZGVzdHJveWVkXCIsIHtjaWRzOiBjb21wbGV0ZWx5RGVzdHJveUNJRHN9LCAocmVzcCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlZC5wcnVuZUNJRHMocmVzcC5jaWRzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgb3duc0VsZW1lbnQoZWwpe1xuICAgIHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoUEhYX1BBUkVOVF9JRCkgPT09IHRoaXMuaWQgfHxcbiAgICAgIG1heWJlKGVsLmNsb3Nlc3QoUEhYX1ZJRVdfU0VMRUNUT1IpLCBub2RlID0+IG5vZGUuaWQpID09PSB0aGlzLmlkXG4gIH1cblxuICBzdWJtaXRGb3JtKGZvcm0sIHRhcmdldEN0eCwgcGh4RXZlbnQsIG9wdHMgPSB7fSl7XG4gICAgRE9NLnB1dFByaXZhdGUoZm9ybSwgUEhYX0hBU19TVUJNSVRURUQsIHRydWUpXG4gICAgbGV0IHBoeEZlZWRiYWNrID0gdGhpcy5saXZlU29ja2V0LmJpbmRpbmcoUEhYX0ZFRURCQUNLX0ZPUilcbiAgICBsZXQgaW5wdXRzID0gQXJyYXkuZnJvbShmb3JtLmVsZW1lbnRzKVxuICAgIHRoaXMubGl2ZVNvY2tldC5ibHVyQWN0aXZlRWxlbWVudCh0aGlzKVxuICAgIHRoaXMucHVzaEZvcm1TdWJtaXQoZm9ybSwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgb3B0cywgKCkgPT4ge1xuICAgICAgaW5wdXRzLmZvckVhY2goaW5wdXQgPT4gRE9NLnNob3dFcnJvcihpbnB1dCwgcGh4RmVlZGJhY2spKVxuICAgICAgdGhpcy5saXZlU29ja2V0LnJlc3RvcmVQcmV2aW91c2x5QWN0aXZlRm9jdXMoKVxuICAgIH0pXG4gIH1cblxuICBiaW5kaW5nKGtpbmQpeyByZXR1cm4gdGhpcy5saXZlU29ja2V0LmJpbmRpbmcoa2luZCkgfVxufVxuIiwgIi8qKiBJbml0aWFsaXplcyB0aGUgTGl2ZVNvY2tldFxuICpcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5kUG9pbnQgLSBUaGUgc3RyaW5nIFdlYlNvY2tldCBlbmRwb2ludCwgaWUsIGBcIndzczovL2V4YW1wbGUuY29tL2xpdmVcImAsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFwiL2xpdmVcImAgKGluaGVyaXRlZCBob3N0ICYgcHJvdG9jb2wpXG4gKiBAcGFyYW0ge1Bob2VuaXguU29ja2V0fSBzb2NrZXQgLSB0aGUgcmVxdWlyZWQgUGhvZW5peCBTb2NrZXQgY2xhc3MgaW1wb3J0ZWQgZnJvbSBcInBob2VuaXhcIi4gRm9yIGV4YW1wbGU6XG4gKlxuICogICAgIGltcG9ydCB7U29ja2V0fSBmcm9tIFwicGhvZW5peFwiXG4gKiAgICAgaW1wb3J0IHtMaXZlU29ja2V0fSBmcm9tIFwicGhvZW5peF9saXZlX3ZpZXdcIlxuICogICAgIGxldCBsaXZlU29ja2V0ID0gbmV3IExpdmVTb2NrZXQoXCIvbGl2ZVwiLCBTb2NrZXQsIHsuLi59KVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uLiBPdXRzaWRlIG9mIGtleXMgbGlzdGVkIGJlbG93LCBhbGxcbiAqIGNvbmZpZ3VyYXRpb24gaXMgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBQaG9lbml4IFNvY2tldCBjb25zdHJ1Y3Rvci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0cy5kZWZhdWx0c10gLSBUaGUgb3B0aW9uYWwgZGVmYXVsdHMgdG8gdXNlIGZvciB2YXJpb3VzIGJpbmRpbmdzLFxuICogc3VjaCBhcyBgcGh4LWRlYm91bmNlYC4gU3VwcG9ydHMgdGhlIGZvbGxvd2luZyBrZXlzOlxuICpcbiAqICAgLSBkZWJvdW5jZSAtIHRoZSBtaWxsaXNlY29uZCBwaHgtZGVib3VuY2UgdGltZS4gRGVmYXVsdHMgMzAwXG4gKiAgIC0gdGhyb3R0bGUgLSB0aGUgbWlsbGlzZWNvbmQgcGh4LXRocm90dGxlIHRpbWUuIERlZmF1bHRzIDMwMFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRzLnBhcmFtc10gLSBUaGUgb3B0aW9uYWwgZnVuY3Rpb24gZm9yIHBhc3NpbmcgY29ubmVjdCBwYXJhbXMuXG4gKiBUaGUgZnVuY3Rpb24gcmVjZWl2ZXMgdGhlIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gTGl2ZVZpZXcuIEZvciBleGFtcGxlOlxuICpcbiAqICAgICAoZWwpID0+IHt2aWV3OiBlbC5nZXRBdHRyaWJ1dGUoXCJkYXRhLW15LXZpZXctbmFtZVwiLCB0b2tlbjogd2luZG93Lm15VG9rZW59XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmJpbmRpbmdQcmVmaXhdIC0gVGhlIG9wdGlvbmFsIHByZWZpeCB0byB1c2UgZm9yIGFsbCBwaHggRE9NIGFubm90YXRpb25zLlxuICogRGVmYXVsdHMgdG8gXCJwaHgtXCIuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHMuaG9va3NdIC0gVGhlIG9wdGlvbmFsIG9iamVjdCBmb3IgcmVmZXJlbmNpbmcgTGl2ZVZpZXcgaG9vayBjYWxsYmFja3MuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHMudXBsb2FkZXJzXSAtIFRoZSBvcHRpb25hbCBvYmplY3QgZm9yIHJlZmVyZW5jaW5nIExpdmVWaWV3IHVwbG9hZGVyIGNhbGxiYWNrcy5cbiAqIEBwYXJhbSB7aW50ZWdlcn0gW29wdHMubG9hZGVyVGltZW91dF0gLSBUaGUgb3B0aW9uYWwgZGVsYXkgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGFwcGx5XG4gKiBsb2FkaW5nIHN0YXRlcy5cbiAqIEBwYXJhbSB7aW50ZWdlcn0gW29wdHMubWF4UmVsb2Fkc10gLSBUaGUgbWF4aW11bSByZWxvYWRzIGJlZm9yZSBlbnRlcmluZyBmYWlsc2FmZSBtb2RlLlxuICogQHBhcmFtIHtpbnRlZ2VyfSBbb3B0cy5yZWxvYWRKaXR0ZXJNaW5dIC0gVGhlIG1pbmltdW0gdGltZSBiZXR3ZWVuIG5vcm1hbCByZWxvYWQgYXR0ZW1wdHMuXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtvcHRzLnJlbG9hZEppdHRlck1heF0gLSBUaGUgbWF4aW11bSB0aW1lIGJldHdlZW4gbm9ybWFsIHJlbG9hZCBhdHRlbXB0cy5cbiAqIEBwYXJhbSB7aW50ZWdlcn0gW29wdHMuZmFpbHNhZmVKaXR0ZXJdIC0gVGhlIHRpbWUgYmV0d2VlbiByZWxvYWQgYXR0ZW1wdHMgaW4gZmFpbHNhZmUgbW9kZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRzLnZpZXdMb2dnZXJdIC0gVGhlIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGxvZyBkZWJ1ZyBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGU6XG4gKlxuICogICAgICh2aWV3LCBraW5kLCBtc2csIG9iaikgPT4gY29uc29sZS5sb2coYCR7dmlldy5pZH0gJHtraW5kfTogJHttc2d9IC0gYCwgb2JqKVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0cy5tZXRhZGF0YV0gLSBUaGUgb3B0aW9uYWwgb2JqZWN0IG1hcHBpbmcgZXZlbnQgbmFtZXMgdG8gZnVuY3Rpb25zIGZvclxuICogcG9wdWxhdGluZyBldmVudCBtZXRhZGF0YS4gRm9yIGV4YW1wbGU6XG4gKlxuICogICAgIG1ldGFkYXRhOiB7XG4gKiAgICAgICBjbGljazogKGUsIGVsKSA9PiB7XG4gKiAgICAgICAgIHJldHVybiB7XG4gKiAgICAgICAgICAgY3RybEtleTogZS5jdHJsS2V5LFxuICogICAgICAgICAgIG1ldGFLZXk6IGUubWV0YUtleSxcbiAqICAgICAgICAgICBkZXRhaWw6IGUuZGV0YWlsIHx8IDEsXG4gKiAgICAgICAgIH1cbiAqICAgICAgIH0sXG4gKiAgICAgICBrZXlkb3duOiAoZSwgZWwpID0+IHtcbiAqICAgICAgICAgcmV0dXJuIHtcbiAqICAgICAgICAgICBrZXk6IGUua2V5LFxuICogICAgICAgICAgIGN0cmxLZXk6IGUuY3RybEtleSxcbiAqICAgICAgICAgICBtZXRhS2V5OiBlLm1ldGFLZXksXG4gKiAgICAgICAgICAgc2hpZnRLZXk6IGUuc2hpZnRLZXlcbiAqICAgICAgICAgfVxuICogICAgICAgfVxuICogICAgIH1cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0cy5zZXNzaW9uU3RvcmFnZV0gLSBBbiBvcHRpb25hbCBTdG9yYWdlIGNvbXBhdGlibGUgb2JqZWN0XG4gKiBVc2VmdWwgd2hlbiBMaXZlVmlldyB3b24ndCBoYXZlIGFjY2VzcyB0byBgc2Vzc2lvblN0b3JhZ2VgLiAgRm9yIGV4YW1wbGUsIFRoaXMgY291bGRcbiAqIGhhcHBlbiBpZiBhIHNpdGUgbG9hZHMgYSBjcm9zcy1kb21haW4gTGl2ZVZpZXcgaW4gYW4gaWZyYW1lLiAgRXhhbXBsZSB1c2FnZTpcbiAqXG4gKiAgICAgY2xhc3MgSW5NZW1vcnlTdG9yYWdlIHtcbiAqICAgICAgIGNvbnN0cnVjdG9yKCkgeyB0aGlzLnN0b3JhZ2UgPSB7fSB9XG4gKiAgICAgICBnZXRJdGVtKGtleU5hbWUpIHsgcmV0dXJuIHRoaXMuc3RvcmFnZVtrZXlOYW1lXSB9XG4gKiAgICAgICByZW1vdmVJdGVtKGtleU5hbWUpIHsgZGVsZXRlIHRoaXMuc3RvcmFnZVtrZXlOYW1lXSB9XG4gKiAgICAgICBzZXRJdGVtKGtleU5hbWUsIGtleVZhbHVlKSB7IHRoaXMuc3RvcmFnZVtrZXlOYW1lXSA9IGtleVZhbHVlIH1cbiAqICAgICB9XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzLmxvY2FsU3RvcmFnZV0gLSBBbiBvcHRpb25hbCBTdG9yYWdlIGNvbXBhdGlibGUgb2JqZWN0XG4gKiBVc2VmdWwgZm9yIHdoZW4gTGl2ZVZpZXcgd29uJ3QgaGF2ZSBhY2Nlc3MgdG8gYGxvY2FsU3RvcmFnZWAuXG4gKiBTZWUgYG9wdHMuc2Vzc2lvblN0b3JhZ2VgIGZvciBleGFtcGxlcy5cbiovXG5cbmltcG9ydCB7XG4gIEJJTkRJTkdfUFJFRklYLFxuICBDT05TRUNVVElWRV9SRUxPQURTLFxuICBERUZBVUxUUyxcbiAgRkFJTFNBRkVfSklUVEVSLFxuICBMT0FERVJfVElNRU9VVCxcbiAgTUFYX1JFTE9BRFMsXG4gIFBIWF9ERUJPVU5DRSxcbiAgUEhYX0RST1BfVEFSR0VULFxuICBQSFhfSEFTX0ZPQ1VTRUQsXG4gIFBIWF9LRVksXG4gIFBIWF9MSU5LX1NUQVRFLFxuICBQSFhfTElWRV9MSU5LLFxuICBQSFhfTFZfREVCVUcsXG4gIFBIWF9MVl9MQVRFTkNZX1NJTSxcbiAgUEhYX0xWX1BST0ZJTEUsXG4gIFBIWF9NQUlOLFxuICBQSFhfUEFSRU5UX0lELFxuICBQSFhfVklFV19TRUxFQ1RPUixcbiAgUEhYX1JPT1RfSUQsXG4gIFBIWF9USFJPVFRMRSxcbiAgUEhYX1RSQUNLX1VQTE9BRFMsXG4gIFBIWF9TRVNTSU9OLFxuICBSRUxPQURfSklUVEVSX01JTixcbiAgUkVMT0FEX0pJVFRFUl9NQVgsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGNsb25lLFxuICBjbG9zZXN0UGh4QmluZGluZyxcbiAgY2xvc3VyZSxcbiAgZGVidWcsXG4gIGlzT2JqZWN0LFxuICBtYXliZVxufSBmcm9tIFwiLi91dGlsc1wiXG5cbmltcG9ydCBCcm93c2VyIGZyb20gXCIuL2Jyb3dzZXJcIlxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIlxuaW1wb3J0IEhvb2tzIGZyb20gXCIuL2hvb2tzXCJcbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiXG5pbXBvcnQgVmlldyBmcm9tIFwiLi92aWV3XCJcbmltcG9ydCBKUyBmcm9tIFwiLi9qc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpdmVTb2NrZXQge1xuICBjb25zdHJ1Y3Rvcih1cmwsIHBoeFNvY2tldCwgb3B0cyA9IHt9KXtcbiAgICB0aGlzLnVubG9hZGVkID0gZmFsc2VcbiAgICBpZighcGh4U29ja2V0IHx8IHBoeFNvY2tldC5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIk9iamVjdFwiKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgXG4gICAgICBhIHBob2VuaXggU29ja2V0IG11c3QgYmUgcHJvdmlkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgTGl2ZVNvY2tldCBjb25zdHJ1Y3Rvci4gRm9yIGV4YW1wbGU6XG5cbiAgICAgICAgICBpbXBvcnQge1NvY2tldH0gZnJvbSBcInBob2VuaXhcIlxuICAgICAgICAgIGltcG9ydCB7TGl2ZVNvY2tldH0gZnJvbSBcInBob2VuaXhfbGl2ZV92aWV3XCJcbiAgICAgICAgICBsZXQgbGl2ZVNvY2tldCA9IG5ldyBMaXZlU29ja2V0KFwiL2xpdmVcIiwgU29ja2V0LCB7Li4ufSlcbiAgICAgIGApXG4gICAgfVxuICAgIHRoaXMuc29ja2V0ID0gbmV3IHBoeFNvY2tldCh1cmwsIG9wdHMpXG4gICAgdGhpcy5iaW5kaW5nUHJlZml4ID0gb3B0cy5iaW5kaW5nUHJlZml4IHx8IEJJTkRJTkdfUFJFRklYXG4gICAgdGhpcy5vcHRzID0gb3B0c1xuICAgIHRoaXMucGFyYW1zID0gY2xvc3VyZShvcHRzLnBhcmFtcyB8fCB7fSlcbiAgICB0aGlzLnZpZXdMb2dnZXIgPSBvcHRzLnZpZXdMb2dnZXJcbiAgICB0aGlzLm1ldGFkYXRhQ2FsbGJhY2tzID0gb3B0cy5tZXRhZGF0YSB8fCB7fVxuICAgIHRoaXMuZGVmYXVsdHMgPSBPYmplY3QuYXNzaWduKGNsb25lKERFRkFVTFRTKSwgb3B0cy5kZWZhdWx0cyB8fCB7fSlcbiAgICB0aGlzLmFjdGl2ZUVsZW1lbnQgPSBudWxsXG4gICAgdGhpcy5wcmV2QWN0aXZlID0gbnVsbFxuICAgIHRoaXMuc2lsZW5jZWQgPSBmYWxzZVxuICAgIHRoaXMubWFpbiA9IG51bGxcbiAgICB0aGlzLmxpbmtSZWYgPSAxXG4gICAgdGhpcy5jbGlja1JlZiA9IDFcbiAgICB0aGlzLnJvb3RzID0ge31cbiAgICB0aGlzLmhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZlxuICAgIHRoaXMucGVuZGluZ0xpbmsgPSBudWxsXG4gICAgdGhpcy5jdXJyZW50TG9jYXRpb24gPSBjbG9uZSh3aW5kb3cubG9jYXRpb24pXG4gICAgdGhpcy5ob29rcyA9IG9wdHMuaG9va3MgfHwge31cbiAgICB0aGlzLnVwbG9hZGVycyA9IG9wdHMudXBsb2FkZXJzIHx8IHt9XG4gICAgdGhpcy5sb2FkZXJUaW1lb3V0ID0gb3B0cy5sb2FkZXJUaW1lb3V0IHx8IExPQURFUl9USU1FT1VUXG4gICAgdGhpcy5tYXhSZWxvYWRzID0gb3B0cy5tYXhSZWxvYWRzIHx8IE1BWF9SRUxPQURTXG4gICAgdGhpcy5yZWxvYWRKaXR0ZXJNaW4gPSBvcHRzLnJlbG9hZEppdHRlck1pbiB8fCBSRUxPQURfSklUVEVSX01JTlxuICAgIHRoaXMucmVsb2FkSml0dGVyTWF4ID0gb3B0cy5yZWxvYWRKaXR0ZXJNYXggfHwgUkVMT0FEX0pJVFRFUl9NQVhcbiAgICB0aGlzLmZhaWxzYWZlSml0dGVyID0gb3B0cy5mYWlsc2FmZUppdHRlciB8fCBGQUlMU0FGRV9KSVRURVJcbiAgICB0aGlzLmxvY2FsU3RvcmFnZSA9IG9wdHMubG9jYWxTdG9yYWdlIHx8IHdpbmRvdy5sb2NhbFN0b3JhZ2VcbiAgICB0aGlzLnNlc3Npb25TdG9yYWdlID0gb3B0cy5zZXNzaW9uU3RvcmFnZSB8fCB3aW5kb3cuc2Vzc2lvblN0b3JhZ2VcbiAgICB0aGlzLmJvdW5kVG9wTGV2ZWxFdmVudHMgPSBmYWxzZVxuICAgIHRoaXMuZG9tQ2FsbGJhY2tzID0gT2JqZWN0LmFzc2lnbih7b25Ob2RlQWRkZWQ6IGNsb3N1cmUoKSwgb25CZWZvcmVFbFVwZGF0ZWQ6IGNsb3N1cmUoKX0sIG9wdHMuZG9tIHx8IHt9KVxuICAgIHRoaXMudHJhbnNpdGlvbnMgPSBuZXcgVHJhbnNpdGlvblNldCgpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCBfZSA9PiB7XG4gICAgICB0aGlzLnVubG9hZGVkID0gdHJ1ZVxuICAgIH0pXG4gICAgdGhpcy5zb2NrZXQub25PcGVuKCgpID0+IHtcbiAgICAgIGlmKHRoaXMuaXNVbmxvYWRlZCgpKXtcbiAgICAgICAgLy8gcmVsb2FkIHBhZ2UgaWYgYmVpbmcgcmVzdG9yZWQgZnJvbSBiYWNrL2ZvcndhcmQgY2FjaGUgYW5kIGJyb3dzZXIgZG9lcyBub3QgZW1pdCBcInBhZ2VzaG93XCJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vIHB1YmxpY1xuXG4gIGlzUHJvZmlsZUVuYWJsZWQoKXsgcmV0dXJuIHRoaXMuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShQSFhfTFZfUFJPRklMRSkgPT09IFwidHJ1ZVwiIH1cblxuICBpc0RlYnVnRW5hYmxlZCgpeyByZXR1cm4gdGhpcy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFBIWF9MVl9ERUJVRykgPT09IFwidHJ1ZVwiIH1cblxuICBlbmFibGVEZWJ1ZygpeyB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oUEhYX0xWX0RFQlVHLCBcInRydWVcIikgfVxuXG4gIGVuYWJsZVByb2ZpbGluZygpeyB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oUEhYX0xWX1BST0ZJTEUsIFwidHJ1ZVwiKSB9XG5cbiAgZGlzYWJsZURlYnVnKCl7IHRoaXMuc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShQSFhfTFZfREVCVUcpIH1cblxuICBkaXNhYmxlUHJvZmlsaW5nKCl7IHRoaXMuc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShQSFhfTFZfUFJPRklMRSkgfVxuXG4gIGVuYWJsZUxhdGVuY3lTaW0odXBwZXJCb3VuZE1zKXtcbiAgICB0aGlzLmVuYWJsZURlYnVnKClcbiAgICBjb25zb2xlLmxvZyhcImxhdGVuY3kgc2ltdWxhdG9yIGVuYWJsZWQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGlzIGJyb3dzZXIgc2Vzc2lvbi4gQ2FsbCBkaXNhYmxlTGF0ZW5jeVNpbSgpIHRvIGRpc2FibGVcIilcbiAgICB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oUEhYX0xWX0xBVEVOQ1lfU0lNLCB1cHBlckJvdW5kTXMpXG4gIH1cblxuICBkaXNhYmxlTGF0ZW5jeVNpbSgpeyB0aGlzLnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oUEhYX0xWX0xBVEVOQ1lfU0lNKSB9XG5cbiAgZ2V0TGF0ZW5jeVNpbSgpe1xuICAgIGxldCBzdHIgPSB0aGlzLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oUEhYX0xWX0xBVEVOQ1lfU0lNKVxuICAgIHJldHVybiBzdHIgPyBwYXJzZUludChzdHIpIDogbnVsbFxuICB9XG5cbiAgZ2V0U29ja2V0KCl7IHJldHVybiB0aGlzLnNvY2tldCB9XG5cbiAgY29ubmVjdCgpe1xuICAgIGxldCBkb0Nvbm5lY3QgPSAoKSA9PiB7XG4gICAgICBpZih0aGlzLmpvaW5Sb290Vmlld3MoKSl7XG4gICAgICAgIHRoaXMuYmluZFRvcExldmVsRXZlbnRzKClcbiAgICAgICAgdGhpcy5zb2NrZXQuY29ubmVjdCgpXG4gICAgICB9XG4gICAgfVxuICAgIGlmKFtcImNvbXBsZXRlXCIsIFwibG9hZGVkXCIsIFwiaW50ZXJhY3RpdmVcIl0uaW5kZXhPZihkb2N1bWVudC5yZWFkeVN0YXRlKSA+PSAwKXtcbiAgICAgIGRvQ29ubmVjdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsICgpID0+IGRvQ29ubmVjdCgpKVxuICAgIH1cbiAgfVxuXG4gIGRpc2Nvbm5lY3QoY2FsbGJhY2speyB0aGlzLnNvY2tldC5kaXNjb25uZWN0KGNhbGxiYWNrKSB9XG5cbiAgZXhlY0pTKGVsLCBlbmNvZGVkSlMsIGV2ZW50VHlwZSA9IG51bGwpe1xuICAgIHRoaXMub3duZXIoZWwsIHZpZXcgPT4gSlMuZXhlYyhldmVudFR5cGUsIGVuY29kZWRKUywgdmlldywgZWwpKVxuICB9XG5cbiAgLy8gcHJpdmF0ZVxuXG4gIHRyaWdnZXJET00oa2luZCwgYXJncyl7IHRoaXMuZG9tQ2FsbGJhY2tzW2tpbmRdKC4uLmFyZ3MpIH1cblxuICB0aW1lKG5hbWUsIGZ1bmMpe1xuICAgIGlmKCF0aGlzLmlzUHJvZmlsZUVuYWJsZWQoKSB8fCAhY29uc29sZS50aW1lKXsgcmV0dXJuIGZ1bmMoKSB9XG4gICAgY29uc29sZS50aW1lKG5hbWUpXG4gICAgbGV0IHJlc3VsdCA9IGZ1bmMoKVxuICAgIGNvbnNvbGUudGltZUVuZChuYW1lKVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGxvZyh2aWV3LCBraW5kLCBtc2dDYWxsYmFjayl7XG4gICAgaWYodGhpcy52aWV3TG9nZ2VyKXtcbiAgICAgIGxldCBbbXNnLCBvYmpdID0gbXNnQ2FsbGJhY2soKVxuICAgICAgdGhpcy52aWV3TG9nZ2VyKHZpZXcsIGtpbmQsIG1zZywgb2JqKVxuICAgIH0gZWxzZSBpZih0aGlzLmlzRGVidWdFbmFibGVkKCkpe1xuICAgICAgbGV0IFttc2csIG9ial0gPSBtc2dDYWxsYmFjaygpXG4gICAgICBkZWJ1Zyh2aWV3LCBraW5kLCBtc2csIG9iailcbiAgICB9XG4gIH1cblxuICByZXF1ZXN0RE9NVXBkYXRlKGNhbGxiYWNrKXtcbiAgICB0aGlzLnRyYW5zaXRpb25zLmFmdGVyKGNhbGxiYWNrKVxuICB9XG5cbiAgdHJhbnNpdGlvbih0aW1lLCBvblN0YXJ0LCBvbkRvbmUgPSBmdW5jdGlvbigpe30pe1xuICAgIHRoaXMudHJhbnNpdGlvbnMuYWRkVHJhbnNpdGlvbih0aW1lLCBvblN0YXJ0LCBvbkRvbmUpXG4gIH1cblxuICBvbkNoYW5uZWwoY2hhbm5lbCwgZXZlbnQsIGNiKXtcbiAgICBjaGFubmVsLm9uKGV2ZW50LCBkYXRhID0+IHtcbiAgICAgIGxldCBsYXRlbmN5ID0gdGhpcy5nZXRMYXRlbmN5U2ltKClcbiAgICAgIGlmKCFsYXRlbmN5KXtcbiAgICAgICAgY2IoZGF0YSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBzaW11bGF0aW5nICR7bGF0ZW5jeX1tcyBvZiBsYXRlbmN5IGZyb20gc2VydmVyIHRvIGNsaWVudGApXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gY2IoZGF0YSksIGxhdGVuY3kpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHdyYXBQdXNoKHZpZXcsIG9wdHMsIHB1c2gpe1xuICAgIGxldCBsYXRlbmN5ID0gdGhpcy5nZXRMYXRlbmN5U2ltKClcbiAgICBsZXQgb2xkSm9pbkNvdW50ID0gdmlldy5qb2luQ291bnRcbiAgICBpZighbGF0ZW5jeSl7XG4gICAgICBpZihvcHRzLnRpbWVvdXQpe1xuICAgICAgICByZXR1cm4gcHVzaCgpLnJlY2VpdmUoXCJ0aW1lb3V0XCIsICgpID0+IHtcbiAgICAgICAgICBpZih2aWV3LmpvaW5Db3VudCA9PT0gb2xkSm9pbkNvdW50ICYmICF2aWV3LmlzRGVzdHJveWVkKCkpe1xuICAgICAgICAgICAgdGhpcy5yZWxvYWRXaXRoSml0dGVyKHZpZXcsICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5sb2codmlldywgXCJ0aW1lb3V0XCIsICgpID0+IFtcInJlY2VpdmVkIHRpbWVvdXQgd2hpbGUgY29tbXVuaWNhdGluZyB3aXRoIHNlcnZlci4gRmFsbGluZyBiYWNrIHRvIGhhcmQgcmVmcmVzaCBmb3IgcmVjb3ZlcnlcIl0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBwdXNoKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgc2ltdWxhdGluZyAke2xhdGVuY3l9bXMgb2YgbGF0ZW5jeSBmcm9tIGNsaWVudCB0byBzZXJ2ZXJgKVxuICAgIGxldCBmYWtlUHVzaCA9IHtcbiAgICAgIHJlY2VpdmVzOiBbXSxcbiAgICAgIHJlY2VpdmUoa2luZCwgY2IpeyB0aGlzLnJlY2VpdmVzLnB1c2goW2tpbmQsIGNiXSkgfVxuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmKHZpZXcuaXNEZXN0cm95ZWQoKSl7IHJldHVybiB9XG4gICAgICBmYWtlUHVzaC5yZWNlaXZlcy5yZWR1Y2UoKGFjYywgW2tpbmQsIGNiXSkgPT4gYWNjLnJlY2VpdmUoa2luZCwgY2IpLCBwdXNoKCkpXG4gICAgfSwgbGF0ZW5jeSlcbiAgICByZXR1cm4gZmFrZVB1c2hcbiAgfVxuXG4gIHJlbG9hZFdpdGhKaXR0ZXIodmlldywgbG9nKXtcbiAgICB2aWV3LmRlc3Ryb3koKVxuICAgIHRoaXMuZGlzY29ubmVjdCgpXG4gICAgbGV0IG1pbk1zID0gdGhpcy5yZWxvYWRKaXR0ZXJNaW5cbiAgICBsZXQgbWF4TXMgPSB0aGlzLnJlbG9hZEppdHRlck1heFxuICAgIGxldCBhZnRlck1zID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heE1zIC0gbWluTXMgKyAxKSkgKyBtaW5Nc1xuICAgIGxldCB0cmllcyA9IEJyb3dzZXIudXBkYXRlTG9jYWwodGhpcy5sb2NhbFN0b3JhZ2UsIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwgQ09OU0VDVVRJVkVfUkVMT0FEUywgMCwgY291bnQgPT4gY291bnQgKyAxKVxuICAgIGxvZyA/IGxvZygpIDogdGhpcy5sb2codmlldywgXCJqb2luXCIsICgpID0+IFtgZW5jb3VudGVyZWQgJHt0cmllc30gY29uc2VjdXRpdmUgcmVsb2Fkc2BdKVxuICAgIGlmKHRyaWVzID4gdGhpcy5tYXhSZWxvYWRzKXtcbiAgICAgIHRoaXMubG9nKHZpZXcsIFwiam9pblwiLCAoKSA9PiBbYGV4Y2VlZGVkICR7dGhpcy5tYXhSZWxvYWRzfSBjb25zZWN1dGl2ZSByZWxvYWRzLiBFbnRlcmluZyBmYWlsc2FmZSBtb2RlYF0pXG4gICAgICBhZnRlck1zID0gdGhpcy5mYWlsc2FmZUppdHRlclxuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmKHRoaXMuaGFzUGVuZGluZ0xpbmsoKSl7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHRoaXMucGVuZGluZ0xpbmtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgfVxuICAgIH0sIGFmdGVyTXMpXG4gIH1cblxuICBnZXRIb29rQ2FsbGJhY2tzKG5hbWUpe1xuICAgIHJldHVybiBuYW1lICYmIG5hbWUuc3RhcnRzV2l0aChcIlBob2VuaXguXCIpID8gSG9va3NbbmFtZS5zcGxpdChcIi5cIilbMV1dIDogdGhpcy5ob29rc1tuYW1lXVxuICB9XG5cbiAgaXNVbmxvYWRlZCgpeyByZXR1cm4gdGhpcy51bmxvYWRlZCB9XG5cbiAgaXNDb25uZWN0ZWQoKXsgcmV0dXJuIHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkgfVxuXG4gIGdldEJpbmRpbmdQcmVmaXgoKXsgcmV0dXJuIHRoaXMuYmluZGluZ1ByZWZpeCB9XG5cbiAgYmluZGluZyhraW5kKXsgcmV0dXJuIGAke3RoaXMuZ2V0QmluZGluZ1ByZWZpeCgpfSR7a2luZH1gIH1cblxuICBjaGFubmVsKHRvcGljLCBwYXJhbXMpeyByZXR1cm4gdGhpcy5zb2NrZXQuY2hhbm5lbCh0b3BpYywgcGFyYW1zKSB9XG5cbiAgam9pblJvb3RWaWV3cygpe1xuICAgIGxldCByb290c0ZvdW5kID0gZmFsc2VcbiAgICBET00uYWxsKGRvY3VtZW50LCBgJHtQSFhfVklFV19TRUxFQ1RPUn06bm90KFske1BIWF9QQVJFTlRfSUR9XSlgLCByb290RWwgPT4ge1xuICAgICAgaWYoIXRoaXMuZ2V0Um9vdEJ5SWQocm9vdEVsLmlkKSl7XG4gICAgICAgIGxldCB2aWV3ID0gdGhpcy5uZXdSb290Vmlldyhyb290RWwpXG4gICAgICAgIHZpZXcuc2V0SHJlZih0aGlzLmdldEhyZWYoKSlcbiAgICAgICAgdmlldy5qb2luKClcbiAgICAgICAgaWYocm9vdEVsLmdldEF0dHJpYnV0ZShQSFhfTUFJTikpeyB0aGlzLm1haW4gPSB2aWV3IH1cbiAgICAgIH1cbiAgICAgIHJvb3RzRm91bmQgPSB0cnVlXG4gICAgfSlcbiAgICByZXR1cm4gcm9vdHNGb3VuZFxuICB9XG5cbiAgcmVkaXJlY3QodG8sIGZsYXNoKXtcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKVxuICAgIEJyb3dzZXIucmVkaXJlY3QodG8sIGZsYXNoKVxuICB9XG5cbiAgcmVwbGFjZU1haW4oaHJlZiwgZmxhc2gsIGNhbGxiYWNrID0gbnVsbCwgbGlua1JlZiA9IHRoaXMuc2V0UGVuZGluZ0xpbmsoaHJlZikpe1xuICAgIGxldCBvbGRNYWluRWwgPSB0aGlzLm1haW4uZWxcbiAgICBsZXQgbmV3TWFpbkVsID0gRE9NLmNsb25lTm9kZShvbGRNYWluRWwsIFwiXCIpXG4gICAgdGhpcy5tYWluLnNob3dMb2FkZXIodGhpcy5sb2FkZXJUaW1lb3V0KVxuICAgIHRoaXMubWFpbi5kZXN0cm95KClcblxuICAgIHRoaXMubWFpbiA9IHRoaXMubmV3Um9vdFZpZXcobmV3TWFpbkVsLCBmbGFzaClcbiAgICB0aGlzLm1haW4uc2V0UmVkaXJlY3QoaHJlZilcbiAgICB0aGlzLnRyYW5zaXRpb25SZW1vdmVzKClcbiAgICB0aGlzLm1haW4uam9pbigoam9pbkNvdW50LCBvbkRvbmUpID0+IHtcbiAgICAgIGlmKGpvaW5Db3VudCA9PT0gMSAmJiB0aGlzLmNvbW1pdFBlbmRpbmdMaW5rKGxpbmtSZWYpKXtcbiAgICAgICAgdGhpcy5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICBET00uZmluZFBoeFN0aWNreShkb2N1bWVudCkuZm9yRWFjaChlbCA9PiBuZXdNYWluRWwuYXBwZW5kQ2hpbGQoZWwpKVxuICAgICAgICAgIG9sZE1haW5FbC5yZXBsYWNlV2l0aChuZXdNYWluRWwpXG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICAgICAgICAgIG9uRG9uZSgpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHRyYW5zaXRpb25SZW1vdmVzKGVsZW1lbnRzKXtcbiAgICBsZXQgcmVtb3ZlQXR0ciA9IHRoaXMuYmluZGluZyhcInJlbW92ZVwiKVxuICAgIGVsZW1lbnRzID0gZWxlbWVudHMgfHwgRE9NLmFsbChkb2N1bWVudCwgYFske3JlbW92ZUF0dHJ9XWApXG4gICAgZWxlbWVudHMuZm9yRWFjaChlbCA9PiB7XG4gICAgICBpZihkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGVsKSl7IC8vIHNraXAgY2hpbGRyZW4gYWxyZWFkeSByZW1vdmVkXG4gICAgICAgIHRoaXMuZXhlY0pTKGVsLCBlbC5nZXRBdHRyaWJ1dGUocmVtb3ZlQXR0ciksIFwicmVtb3ZlXCIpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGlzUGh4VmlldyhlbCl7IHJldHVybiBlbC5nZXRBdHRyaWJ1dGUgJiYgZWwuZ2V0QXR0cmlidXRlKFBIWF9TRVNTSU9OKSAhPT0gbnVsbCB9XG5cbiAgbmV3Um9vdFZpZXcoZWwsIGZsYXNoKXtcbiAgICBsZXQgdmlldyA9IG5ldyBWaWV3KGVsLCB0aGlzLCBudWxsLCBmbGFzaClcbiAgICB0aGlzLnJvb3RzW3ZpZXcuaWRdID0gdmlld1xuICAgIHJldHVybiB2aWV3XG4gIH1cblxuICBvd25lcihjaGlsZEVsLCBjYWxsYmFjayl7XG4gICAgbGV0IHZpZXcgPSBtYXliZShjaGlsZEVsLmNsb3Nlc3QoUEhYX1ZJRVdfU0VMRUNUT1IpLCBlbCA9PiB0aGlzLmdldFZpZXdCeUVsKGVsKSkgfHwgdGhpcy5tYWluXG4gICAgaWYodmlldyl7IGNhbGxiYWNrKHZpZXcpIH1cbiAgfVxuXG4gIHdpdGhpbk93bmVycyhjaGlsZEVsLCBjYWxsYmFjayl7XG4gICAgdGhpcy5vd25lcihjaGlsZEVsLCB2aWV3ID0+IGNhbGxiYWNrKHZpZXcsIGNoaWxkRWwpKVxuICB9XG5cbiAgZ2V0Vmlld0J5RWwoZWwpe1xuICAgIGxldCByb290SWQgPSBlbC5nZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQpXG4gICAgcmV0dXJuIG1heWJlKHRoaXMuZ2V0Um9vdEJ5SWQocm9vdElkKSwgcm9vdCA9PiByb290LmdldERlc2NlbmRlbnRCeUVsKGVsKSlcbiAgfVxuXG4gIGdldFJvb3RCeUlkKGlkKXsgcmV0dXJuIHRoaXMucm9vdHNbaWRdIH1cblxuICBkZXN0cm95QWxsVmlld3MoKXtcbiAgICBmb3IobGV0IGlkIGluIHRoaXMucm9vdHMpe1xuICAgICAgdGhpcy5yb290c1tpZF0uZGVzdHJveSgpXG4gICAgICBkZWxldGUgdGhpcy5yb290c1tpZF1cbiAgICB9XG4gIH1cblxuICBkZXN0cm95Vmlld0J5RWwoZWwpe1xuICAgIGxldCByb290ID0gdGhpcy5nZXRSb290QnlJZChlbC5nZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQpKVxuICAgIGlmKHJvb3QgJiYgcm9vdC5pZCA9PT0gZWwuaWQpe1xuICAgICAgcm9vdC5kZXN0cm95KClcbiAgICAgIGRlbGV0ZSB0aGlzLnJvb3RzW3Jvb3QuaWRdXG4gICAgfSBlbHNlIGlmKHJvb3Qpe1xuICAgICAgcm9vdC5kZXN0cm95RGVzY2VuZGVudChlbC5pZClcbiAgICB9XG4gIH1cblxuICBzZXRBY3RpdmVFbGVtZW50KHRhcmdldCl7XG4gICAgaWYodGhpcy5hY3RpdmVFbGVtZW50ID09PSB0YXJnZXQpeyByZXR1cm4gfVxuICAgIHRoaXMuYWN0aXZlRWxlbWVudCA9IHRhcmdldFxuICAgIGxldCBjYW5jZWwgPSAoKSA9PiB7XG4gICAgICBpZih0YXJnZXQgPT09IHRoaXMuYWN0aXZlRWxlbWVudCl7IHRoaXMuYWN0aXZlRWxlbWVudCA9IG51bGwgfVxuICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMpXG4gICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIHRoaXMpXG4gICAgfVxuICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBjYW5jZWwpXG4gICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCBjYW5jZWwpXG4gIH1cblxuICBnZXRBY3RpdmVFbGVtZW50KCl7XG4gICAgaWYoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZG9jdW1lbnQuYm9keSl7XG4gICAgICByZXR1cm4gdGhpcy5hY3RpdmVFbGVtZW50IHx8IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBjYW4gYmUgbnVsbCBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMVxuICAgICAgcmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keVxuICAgIH1cbiAgfVxuXG4gIGRyb3BBY3RpdmVFbGVtZW50KHZpZXcpe1xuICAgIGlmKHRoaXMucHJldkFjdGl2ZSAmJiB2aWV3Lm93bnNFbGVtZW50KHRoaXMucHJldkFjdGl2ZSkpe1xuICAgICAgdGhpcy5wcmV2QWN0aXZlID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHJlc3RvcmVQcmV2aW91c2x5QWN0aXZlRm9jdXMoKXtcbiAgICBpZih0aGlzLnByZXZBY3RpdmUgJiYgdGhpcy5wcmV2QWN0aXZlICE9PSBkb2N1bWVudC5ib2R5KXtcbiAgICAgIHRoaXMucHJldkFjdGl2ZS5mb2N1cygpXG4gICAgfVxuICB9XG5cbiAgYmx1ckFjdGl2ZUVsZW1lbnQoKXtcbiAgICB0aGlzLnByZXZBY3RpdmUgPSB0aGlzLmdldEFjdGl2ZUVsZW1lbnQoKVxuICAgIGlmKHRoaXMucHJldkFjdGl2ZSAhPT0gZG9jdW1lbnQuYm9keSl7IHRoaXMucHJldkFjdGl2ZS5ibHVyKCkgfVxuICB9XG5cbiAgYmluZFRvcExldmVsRXZlbnRzKCl7XG4gICAgaWYodGhpcy5ib3VuZFRvcExldmVsRXZlbnRzKXsgcmV0dXJuIH1cblxuICAgIHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cyA9IHRydWVcbiAgICAvLyBlbnRlciBmYWlsc2FmZSByZWxvYWQgaWYgc2VydmVyIGhhcyBnb25lIGF3YXkgaW50ZW50aW9uYWxseSwgc3VjaCBhcyBcImRpc2Nvbm5lY3RcIiBicm9hZGNhc3RcbiAgICB0aGlzLnNvY2tldC5vbkNsb3NlKGV2ZW50ID0+IHtcbiAgICAgIGlmKGV2ZW50LmNvZGUgPT09IDEwMDAgJiYgdGhpcy5tYWluKXtcbiAgICAgICAgdGhpcy5yZWxvYWRXaXRoSml0dGVyKHRoaXMubWFpbilcbiAgICAgIH1cbiAgICB9KVxuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uICgpeyB9KSAvLyBlbnN1cmUgYWxsIGNsaWNrIGV2ZW50cyBidWJibGUgZm9yIG1vYmlsZSBTYWZhcmlcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VzaG93XCIsIGUgPT4ge1xuICAgICAgaWYoZS5wZXJzaXN0ZWQpeyAvLyByZWxvYWQgcGFnZSBpZiBiZWluZyByZXN0b3JlZCBmcm9tIGJhY2svZm9yd2FyZCBjYWNoZVxuICAgICAgICB0aGlzLmdldFNvY2tldCgpLmRpc2Nvbm5lY3QoKVxuICAgICAgICB0aGlzLndpdGhQYWdlTG9hZGluZyh7dG86IHdpbmRvdy5sb2NhdGlvbi5ocmVmLCBraW5kOiBcInJlZGlyZWN0XCJ9KVxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbiAgICAgIH1cbiAgICB9LCB0cnVlKVxuICAgIHRoaXMuYmluZE5hdigpXG4gICAgdGhpcy5iaW5kQ2xpY2tzKClcbiAgICB0aGlzLmJpbmRGb3JtcygpXG4gICAgdGhpcy5iaW5kKHtrZXl1cDogXCJrZXl1cFwiLCBrZXlkb3duOiBcImtleWRvd25cIn0sIChlLCB0eXBlLCB2aWV3LCB0YXJnZXRFbCwgcGh4RXZlbnQsIGV2ZW50VGFyZ2V0KSA9PiB7XG4gICAgICBsZXQgbWF0Y2hLZXkgPSB0YXJnZXRFbC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9LRVkpKVxuICAgICAgbGV0IHByZXNzZWRLZXkgPSBlLmtleSAmJiBlLmtleS50b0xvd2VyQ2FzZSgpIC8vIGNocm9tZSBjbGlja2VkIGF1dG9jb21wbGV0ZXMgc2VuZCBhIGtleWRvd24gd2l0aG91dCBrZXlcbiAgICAgIGlmKG1hdGNoS2V5ICYmIG1hdGNoS2V5LnRvTG93ZXJDYXNlKCkgIT09IHByZXNzZWRLZXkpeyByZXR1cm4gfVxuXG4gICAgICBsZXQgZGF0YSA9IHtrZXk6IGUua2V5LCAuLi50aGlzLmV2ZW50TWV0YSh0eXBlLCBlLCB0YXJnZXRFbCl9XG4gICAgICBKUy5leGVjKHR5cGUsIHBoeEV2ZW50LCB2aWV3LCB0YXJnZXRFbCwgW1wicHVzaFwiLCB7ZGF0YX1dKVxuICAgIH0pXG4gICAgdGhpcy5iaW5kKHtibHVyOiBcImZvY3Vzb3V0XCIsIGZvY3VzOiBcImZvY3VzaW5cIn0sIChlLCB0eXBlLCB2aWV3LCB0YXJnZXRFbCwgcGh4RXZlbnQsIGV2ZW50VGFyZ2V0KSA9PiB7XG4gICAgICBpZighZXZlbnRUYXJnZXQpe1xuICAgICAgICBsZXQgZGF0YSA9IHtrZXk6IGUua2V5LCAuLi50aGlzLmV2ZW50TWV0YSh0eXBlLCBlLCB0YXJnZXRFbCl9XG4gICAgICAgIEpTLmV4ZWModHlwZSwgcGh4RXZlbnQsIHZpZXcsIHRhcmdldEVsLCBbXCJwdXNoXCIsIHtkYXRhfV0pXG4gICAgICB9XG4gICAgfSlcbiAgICB0aGlzLmJpbmQoe2JsdXI6IFwiYmx1clwiLCBmb2N1czogXCJmb2N1c1wifSwgKGUsIHR5cGUsIHZpZXcsIHRhcmdldEVsLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBwaHhUYXJnZXQpID0+IHtcbiAgICAgIC8vIGJsdXIgYW5kIGZvY3VzIGFyZSB0cmlnZ2VyZWQgb24gZG9jdW1lbnQgYW5kIHdpbmRvdy4gRGlzY2FyZCBvbmUgdG8gYXZvaWQgZHVwc1xuICAgICAgaWYocGh4VGFyZ2V0ID09PSBcIndpbmRvd1wiKXtcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmV2ZW50TWV0YSh0eXBlLCBlLCB0YXJnZXRFbClcbiAgICAgICAgSlMuZXhlYyh0eXBlLCBwaHhFdmVudCwgdmlldywgdGFyZ2V0RWwsIFtcInB1c2hcIiwge2RhdGF9XSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiZHJhZ292ZXJcIiwgZSA9PiBlLnByZXZlbnREZWZhdWx0KCkpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJkcm9wXCIsIGUgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBsZXQgZHJvcFRhcmdldElkID0gbWF5YmUoY2xvc2VzdFBoeEJpbmRpbmcoZS50YXJnZXQsIHRoaXMuYmluZGluZyhQSFhfRFJPUF9UQVJHRVQpKSwgdHJ1ZVRhcmdldCA9PiB7XG4gICAgICAgIHJldHVybiB0cnVlVGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX0RST1BfVEFSR0VUKSlcbiAgICAgIH0pXG4gICAgICBsZXQgZHJvcFRhcmdldCA9IGRyb3BUYXJnZXRJZCAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkcm9wVGFyZ2V0SWQpXG4gICAgICBsZXQgZmlsZXMgPSBBcnJheS5mcm9tKGUuZGF0YVRyYW5zZmVyLmZpbGVzIHx8IFtdKVxuICAgICAgaWYoIWRyb3BUYXJnZXQgfHwgZHJvcFRhcmdldC5kaXNhYmxlZCB8fCBmaWxlcy5sZW5ndGggPT09IDAgfHwgIShkcm9wVGFyZ2V0LmZpbGVzIGluc3RhbmNlb2YgRmlsZUxpc3QpKXsgcmV0dXJuIH1cblxuICAgICAgTGl2ZVVwbG9hZGVyLnRyYWNrRmlsZXMoZHJvcFRhcmdldCwgZmlsZXMpXG4gICAgICBkcm9wVGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiaW5wdXRcIiwge2J1YmJsZXM6IHRydWV9KSlcbiAgICB9KVxuICAgIHRoaXMub24oUEhYX1RSQUNLX1VQTE9BRFMsIGUgPT4ge1xuICAgICAgbGV0IHVwbG9hZFRhcmdldCA9IGUudGFyZ2V0XG4gICAgICBpZighRE9NLmlzVXBsb2FkSW5wdXQodXBsb2FkVGFyZ2V0KSl7IHJldHVybiB9XG4gICAgICBsZXQgZmlsZXMgPSBBcnJheS5mcm9tKGUuZGV0YWlsLmZpbGVzIHx8IFtdKS5maWx0ZXIoZiA9PiBmIGluc3RhbmNlb2YgRmlsZSB8fCBmIGluc3RhbmNlb2YgQmxvYilcbiAgICAgIExpdmVVcGxvYWRlci50cmFja0ZpbGVzKHVwbG9hZFRhcmdldCwgZmlsZXMpXG4gICAgICB1cGxvYWRUYXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiLCB7YnViYmxlczogdHJ1ZX0pKVxuICAgIH0pXG4gIH1cblxuICBldmVudE1ldGEoZXZlbnROYW1lLCBlLCB0YXJnZXRFbCl7XG4gICAgbGV0IGNhbGxiYWNrID0gdGhpcy5tZXRhZGF0YUNhbGxiYWNrc1tldmVudE5hbWVdXG4gICAgcmV0dXJuIGNhbGxiYWNrID8gY2FsbGJhY2soZSwgdGFyZ2V0RWwpIDoge31cbiAgfVxuXG4gIHNldFBlbmRpbmdMaW5rKGhyZWYpe1xuICAgIHRoaXMubGlua1JlZisrXG4gICAgdGhpcy5wZW5kaW5nTGluayA9IGhyZWZcbiAgICByZXR1cm4gdGhpcy5saW5rUmVmXG4gIH1cblxuICBjb21taXRQZW5kaW5nTGluayhsaW5rUmVmKXtcbiAgICBpZih0aGlzLmxpbmtSZWYgIT09IGxpbmtSZWYpe1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaHJlZiA9IHRoaXMucGVuZGluZ0xpbmtcbiAgICAgIHRoaXMucGVuZGluZ0xpbmsgPSBudWxsXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIGdldEhyZWYoKXsgcmV0dXJuIHRoaXMuaHJlZiB9XG5cbiAgaGFzUGVuZGluZ0xpbmsoKXsgcmV0dXJuICEhdGhpcy5wZW5kaW5nTGluayB9XG5cbiAgYmluZChldmVudHMsIGNhbGxiYWNrKXtcbiAgICBmb3IobGV0IGV2ZW50IGluIGV2ZW50cyl7XG4gICAgICBsZXQgYnJvd3NlckV2ZW50TmFtZSA9IGV2ZW50c1tldmVudF1cblxuICAgICAgdGhpcy5vbihicm93c2VyRXZlbnROYW1lLCBlID0+IHtcbiAgICAgICAgbGV0IGJpbmRpbmcgPSB0aGlzLmJpbmRpbmcoZXZlbnQpXG4gICAgICAgIGxldCB3aW5kb3dCaW5kaW5nID0gdGhpcy5iaW5kaW5nKGB3aW5kb3ctJHtldmVudH1gKVxuICAgICAgICBsZXQgdGFyZ2V0UGh4RXZlbnQgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUgJiYgZS50YXJnZXQuZ2V0QXR0cmlidXRlKGJpbmRpbmcpXG4gICAgICAgIGlmKHRhcmdldFBoeEV2ZW50KXtcbiAgICAgICAgICB0aGlzLmRlYm91bmNlKGUudGFyZ2V0LCBlLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLndpdGhpbk93bmVycyhlLnRhcmdldCwgdmlldyA9PiB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKGUsIGV2ZW50LCB2aWV3LCBlLnRhcmdldCwgdGFyZ2V0UGh4RXZlbnQsIG51bGwpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgRE9NLmFsbChkb2N1bWVudCwgYFske3dpbmRvd0JpbmRpbmd9XWAsIGVsID0+IHtcbiAgICAgICAgICAgIGxldCBwaHhFdmVudCA9IGVsLmdldEF0dHJpYnV0ZSh3aW5kb3dCaW5kaW5nKVxuICAgICAgICAgICAgdGhpcy5kZWJvdW5jZShlbCwgZSwgKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLndpdGhpbk93bmVycyhlbCwgdmlldyA9PiB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZSwgZXZlbnQsIHZpZXcsIGVsLCBwaHhFdmVudCwgXCJ3aW5kb3dcIilcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBiaW5kQ2xpY2tzKCl7XG4gICAgdGhpcy5iaW5kQ2xpY2soXCJjbGlja1wiLCBcImNsaWNrXCIsIGZhbHNlKVxuICAgIHRoaXMuYmluZENsaWNrKFwibW91c2Vkb3duXCIsIFwiY2FwdHVyZS1jbGlja1wiLCB0cnVlKVxuICB9XG5cbiAgYmluZENsaWNrKGV2ZW50TmFtZSwgYmluZGluZ05hbWUsIGNhcHR1cmUpe1xuICAgIGxldCBjbGljayA9IHRoaXMuYmluZGluZyhiaW5kaW5nTmFtZSlcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGUgPT4ge1xuICAgICAgaWYoIXRoaXMuaXNDb25uZWN0ZWQoKSl7IHJldHVybiB9XG4gICAgICB0aGlzLmNsaWNrUmVmKytcbiAgICAgIGxldCBjbGlja1JlZldhcyA9IHRoaXMuY2xpY2tSZWZcbiAgICAgIGxldCB0YXJnZXQgPSBudWxsXG4gICAgICBpZihjYXB0dXJlKXtcbiAgICAgICAgdGFyZ2V0ID0gZS50YXJnZXQubWF0Y2hlcyhgWyR7Y2xpY2t9XWApID8gZS50YXJnZXQgOiBlLnRhcmdldC5xdWVyeVNlbGVjdG9yKGBbJHtjbGlja31dYClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldCA9IGNsb3Nlc3RQaHhCaW5kaW5nKGUudGFyZ2V0LCBjbGljaylcbiAgICAgICAgdGhpcy5kaXNwYXRjaENsaWNrQXdheShlLCBjbGlja1JlZldhcylcbiAgICAgIH1cbiAgICAgIGxldCBwaHhFdmVudCA9IHRhcmdldCAmJiB0YXJnZXQuZ2V0QXR0cmlidXRlKGNsaWNrKVxuICAgICAgaWYoIXBoeEV2ZW50KXsgcmV0dXJuIH1cbiAgICAgIGlmKHRhcmdldC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpID09PSBcIiNcIil7IGUucHJldmVudERlZmF1bHQoKSB9XG5cbiAgICAgIHRoaXMuZGVib3VuY2UodGFyZ2V0LCBlLCAoKSA9PiB7XG4gICAgICAgIHRoaXMud2l0aGluT3duZXJzKHRhcmdldCwgdmlldyA9PiB7XG4gICAgICAgICAgSlMuZXhlYyhcImNsaWNrXCIsIHBoeEV2ZW50LCB2aWV3LCB0YXJnZXQsIFtcInB1c2hcIiwge2RhdGE6IHRoaXMuZXZlbnRNZXRhKFwiY2xpY2tcIiwgZSwgdGFyZ2V0KX1dKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9LCBjYXB0dXJlKVxuICB9XG5cbiAgZGlzcGF0Y2hDbGlja0F3YXkoZSwgY2xpY2tSZWZXYXMpe1xuICAgIGxldCBwaHhDbGlja0F3YXkgPSB0aGlzLmJpbmRpbmcoXCJjbGljay1hd2F5XCIpXG4gICAgbGV0IHBoeENsaWNrID0gdGhpcy5iaW5kaW5nKFwiY2xpY2tcIilcbiAgICBET00uYWxsKGRvY3VtZW50LCBgWyR7cGh4Q2xpY2tBd2F5fV1gLCBlbCA9PiB7XG4gICAgICBpZighKGVsLmlzU2FtZU5vZGUoZS50YXJnZXQpIHx8IGVsLmNvbnRhaW5zKGUudGFyZ2V0KSkpe1xuICAgICAgICB0aGlzLndpdGhpbk93bmVycyhlLnRhcmdldCwgdmlldyA9PiB7XG4gICAgICAgICAgbGV0IHBoeEV2ZW50ID0gZWwuZ2V0QXR0cmlidXRlKHBoeENsaWNrQXdheSlcbiAgICAgICAgICBpZihKUy5pc1Zpc2libGUoZWwpKXtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBlLnRhcmdldC5jbG9zZXN0KGBbJHtwaHhDbGlja31dYCkgfHwgZS50YXJnZXRcbiAgICAgICAgICAgIEpTLmV4ZWMoXCJjbGlja1wiLCBwaHhFdmVudCwgdmlldywgZWwsIFtcInB1c2hcIiwge2RhdGE6IHRoaXMuZXZlbnRNZXRhKFwiY2xpY2tcIiwgZSwgZS50YXJnZXQpfV0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBiaW5kTmF2KCl7XG4gICAgaWYoIUJyb3dzZXIuY2FuUHVzaFN0YXRlKCkpeyByZXR1cm4gfVxuICAgIGlmKGhpc3Rvcnkuc2Nyb2xsUmVzdG9yYXRpb24peyBoaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uID0gXCJtYW51YWxcIiB9XG4gICAgbGV0IHNjcm9sbFRpbWVyID0gbnVsbFxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIF9lID0+IHtcbiAgICAgIGNsZWFyVGltZW91dChzY3JvbGxUaW1lcilcbiAgICAgIHNjcm9sbFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIEJyb3dzZXIudXBkYXRlQ3VycmVudFN0YXRlKHN0YXRlID0+IE9iamVjdC5hc3NpZ24oc3RhdGUsIHtzY3JvbGw6IHdpbmRvdy5zY3JvbGxZfSkpXG4gICAgICB9LCAxMDApXG4gICAgfSlcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIGV2ZW50ID0+IHtcbiAgICAgIGlmKCF0aGlzLnJlZ2lzdGVyTmV3TG9jYXRpb24od2luZG93LmxvY2F0aW9uKSl7IHJldHVybiB9XG4gICAgICBsZXQge3R5cGUsIGlkLCByb290LCBzY3JvbGx9ID0gZXZlbnQuc3RhdGUgfHwge31cbiAgICAgIGxldCBocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWZcblxuICAgICAgdGhpcy5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgaWYodGhpcy5tYWluLmlzQ29ubmVjdGVkKCkgJiYgKHR5cGUgPT09IFwicGF0Y2hcIiAmJiBpZCA9PT0gdGhpcy5tYWluLmlkKSl7XG4gICAgICAgICAgdGhpcy5tYWluLnB1c2hMaW5rUGF0Y2goaHJlZiwgbnVsbClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlcGxhY2VNYWluKGhyZWYsIG51bGwsICgpID0+IHtcbiAgICAgICAgICAgIGlmKHJvb3QpeyB0aGlzLnJlcGxhY2VSb290SGlzdG9yeSgpIH1cbiAgICAgICAgICAgIGlmKHR5cGVvZihzY3JvbGwpID09PSBcIm51bWJlclwiKXtcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIHNjcm9sbClcbiAgICAgICAgICAgICAgfSwgMCkgLy8gdGhlIGJvZHkgbmVlZHMgdG8gcmVuZGVyIGJlZm9yZSB3ZSBzY3JvbGwuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9LCBmYWxzZSlcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGUgPT4ge1xuICAgICAgbGV0IHRhcmdldCA9IGNsb3Nlc3RQaHhCaW5kaW5nKGUudGFyZ2V0LCBQSFhfTElWRV9MSU5LKVxuICAgICAgbGV0IHR5cGUgPSB0YXJnZXQgJiYgdGFyZ2V0LmdldEF0dHJpYnV0ZShQSFhfTElWRV9MSU5LKVxuICAgICAgbGV0IHdhbnRzTmV3VGFiID0gZS5tZXRhS2V5IHx8IGUuY3RybEtleSB8fCBlLmJ1dHRvbiA9PT0gMVxuICAgICAgaWYoIXR5cGUgfHwgIXRoaXMuaXNDb25uZWN0ZWQoKSB8fCAhdGhpcy5tYWluIHx8IHdhbnRzTmV3VGFiKXsgcmV0dXJuIH1cbiAgICAgIGxldCBocmVmID0gdGFyZ2V0LmhyZWZcbiAgICAgIGxldCBsaW5rU3RhdGUgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKFBIWF9MSU5LX1NUQVRFKVxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBpZih0aGlzLnBlbmRpbmdMaW5rID09PSBocmVmKXsgcmV0dXJuIH1cblxuICAgICAgdGhpcy5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgaWYodHlwZSA9PT0gXCJwYXRjaFwiKXtcbiAgICAgICAgICB0aGlzLnB1c2hIaXN0b3J5UGF0Y2goaHJlZiwgbGlua1N0YXRlLCB0YXJnZXQpXG4gICAgICAgIH0gZWxzZSBpZih0eXBlID09PSBcInJlZGlyZWN0XCIpe1xuICAgICAgICAgIHRoaXMuaGlzdG9yeVJlZGlyZWN0KGhyZWYsIGxpbmtTdGF0ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGV4cGVjdGVkICR7UEhYX0xJVkVfTElOS30gdG8gYmUgXCJwYXRjaFwiIG9yIFwicmVkaXJlY3RcIiwgZ290OiAke3R5cGV9YClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9LCBmYWxzZSlcbiAgfVxuXG4gIGRpc3BhdGNoRXZlbnQoZXZlbnQsIHBheWxvYWQgPSB7fSl7XG4gICAgRE9NLmRpc3BhdGNoRXZlbnQod2luZG93LCBgcGh4OiR7ZXZlbnR9YCwgcGF5bG9hZClcbiAgfVxuXG4gIGRpc3BhdGNoRXZlbnRzKGV2ZW50cyl7XG4gICAgZXZlbnRzLmZvckVhY2goKFtldmVudCwgcGF5bG9hZF0pID0+IHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCwgcGF5bG9hZCkpXG4gIH1cblxuICB3aXRoUGFnZUxvYWRpbmcoaW5mbywgY2FsbGJhY2spe1xuICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6cGFnZS1sb2FkaW5nLXN0YXJ0XCIsIGluZm8pXG4gICAgbGV0IGRvbmUgPSAoKSA9PiBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIFwicGh4OnBhZ2UtbG9hZGluZy1zdG9wXCIsIGluZm8pXG4gICAgcmV0dXJuIGNhbGxiYWNrID8gY2FsbGJhY2soZG9uZSkgOiBkb25lXG4gIH1cblxuICBwdXNoSGlzdG9yeVBhdGNoKGhyZWYsIGxpbmtTdGF0ZSwgdGFyZ2V0RWwpe1xuICAgIHRoaXMud2l0aFBhZ2VMb2FkaW5nKHt0bzogaHJlZiwga2luZDogXCJwYXRjaFwifSwgZG9uZSA9PiB7XG4gICAgICB0aGlzLm1haW4ucHVzaExpbmtQYXRjaChocmVmLCB0YXJnZXRFbCwgbGlua1JlZiA9PiB7XG4gICAgICAgIHRoaXMuaGlzdG9yeVBhdGNoKGhyZWYsIGxpbmtTdGF0ZSwgbGlua1JlZilcbiAgICAgICAgZG9uZSgpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBoaXN0b3J5UGF0Y2goaHJlZiwgbGlua1N0YXRlLCBsaW5rUmVmID0gdGhpcy5zZXRQZW5kaW5nTGluayhocmVmKSl7XG4gICAgaWYoIXRoaXMuY29tbWl0UGVuZGluZ0xpbmsobGlua1JlZikpeyByZXR1cm4gfVxuXG4gICAgQnJvd3Nlci5wdXNoU3RhdGUobGlua1N0YXRlLCB7dHlwZTogXCJwYXRjaFwiLCBpZDogdGhpcy5tYWluLmlkfSwgaHJlZilcbiAgICB0aGlzLnJlZ2lzdGVyTmV3TG9jYXRpb24od2luZG93LmxvY2F0aW9uKVxuICB9XG5cbiAgaGlzdG9yeVJlZGlyZWN0KGhyZWYsIGxpbmtTdGF0ZSwgZmxhc2gpe1xuICAgIGxldCBzY3JvbGwgPSB3aW5kb3cuc2Nyb2xsWVxuICAgIHRoaXMud2l0aFBhZ2VMb2FkaW5nKHt0bzogaHJlZiwga2luZDogXCJyZWRpcmVjdFwifSwgZG9uZSA9PiB7XG4gICAgICB0aGlzLnJlcGxhY2VNYWluKGhyZWYsIGZsYXNoLCAoKSA9PiB7XG4gICAgICAgIEJyb3dzZXIucHVzaFN0YXRlKGxpbmtTdGF0ZSwge3R5cGU6IFwicmVkaXJlY3RcIiwgaWQ6IHRoaXMubWFpbi5pZCwgc2Nyb2xsOiBzY3JvbGx9LCBocmVmKVxuICAgICAgICB0aGlzLnJlZ2lzdGVyTmV3TG9jYXRpb24od2luZG93LmxvY2F0aW9uKVxuICAgICAgICBkb25lKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHJlcGxhY2VSb290SGlzdG9yeSgpe1xuICAgIEJyb3dzZXIucHVzaFN0YXRlKFwicmVwbGFjZVwiLCB7cm9vdDogdHJ1ZSwgdHlwZTogXCJwYXRjaFwiLCBpZDogdGhpcy5tYWluLmlkfSlcbiAgfVxuXG4gIHJlZ2lzdGVyTmV3TG9jYXRpb24obmV3TG9jYXRpb24pe1xuICAgIGxldCB7cGF0aG5hbWUsIHNlYXJjaH0gPSB0aGlzLmN1cnJlbnRMb2NhdGlvblxuICAgIGlmKHBhdGhuYW1lICsgc2VhcmNoID09PSBuZXdMb2NhdGlvbi5wYXRobmFtZSArIG5ld0xvY2F0aW9uLnNlYXJjaCl7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyZW50TG9jYXRpb24gPSBjbG9uZShuZXdMb2NhdGlvbilcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgYmluZEZvcm1zKCl7XG4gICAgbGV0IGl0ZXJhdGlvbnMgPSAwXG4gICAgdGhpcy5vbihcInN1Ym1pdFwiLCBlID0+IHtcbiAgICAgIGxldCBwaHhFdmVudCA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJzdWJtaXRcIikpXG4gICAgICBpZighcGh4RXZlbnQpeyByZXR1cm4gfVxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBlLnRhcmdldC5kaXNhYmxlZCA9IHRydWVcbiAgICAgIHRoaXMud2l0aGluT3duZXJzKGUudGFyZ2V0LCB2aWV3ID0+IHtcbiAgICAgICAgSlMuZXhlYyhcInN1Ym1pdFwiLCBwaHhFdmVudCwgdmlldywgZS50YXJnZXQsIFtcInB1c2hcIiwge31dKVxuICAgICAgfSlcbiAgICB9LCBmYWxzZSlcblxuICAgIGZvcihsZXQgdHlwZSBvZiBbXCJjaGFuZ2VcIiwgXCJpbnB1dFwiXSl7XG4gICAgICB0aGlzLm9uKHR5cGUsIGUgPT4ge1xuICAgICAgICBsZXQgaW5wdXQgPSBlLnRhcmdldFxuICAgICAgICBsZXQgcGh4RXZlbnQgPSBpbnB1dC5mb3JtICYmIGlucHV0LmZvcm0uZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcImNoYW5nZVwiKSlcbiAgICAgICAgaWYoIXBoeEV2ZW50KXsgcmV0dXJuIH1cbiAgICAgICAgaWYoaW5wdXQudHlwZSA9PT0gXCJudW1iZXJcIiAmJiBpbnB1dC52YWxpZGl0eSAmJiBpbnB1dC52YWxpZGl0eS5iYWRJbnB1dCl7IHJldHVybiB9XG4gICAgICAgIGxldCBjdXJyZW50SXRlcmF0aW9ucyA9IGl0ZXJhdGlvbnNcbiAgICAgICAgaXRlcmF0aW9ucysrXG4gICAgICAgIGxldCB7YXQ6IGF0LCB0eXBlOiBsYXN0VHlwZX0gPSBET00ucHJpdmF0ZShpbnB1dCwgXCJwcmV2LWl0ZXJhdGlvblwiKSB8fCB7fVxuICAgICAgICAvLyBkZXRlY3QgZHVwIGJlY2F1c2Ugc29tZSBicm93c2VycyBkaXNwYXRjaCBib3RoIFwiaW5wdXRcIiBhbmQgXCJjaGFuZ2VcIlxuICAgICAgICBpZihhdCA9PT0gY3VycmVudEl0ZXJhdGlvbnMgLSAxICYmIHR5cGUgIT09IGxhc3RUeXBlKXsgcmV0dXJuIH1cblxuICAgICAgICBET00ucHV0UHJpdmF0ZShpbnB1dCwgXCJwcmV2LWl0ZXJhdGlvblwiLCB7YXQ6IGN1cnJlbnRJdGVyYXRpb25zLCB0eXBlOiB0eXBlfSlcblxuICAgICAgICB0aGlzLmRlYm91bmNlKGlucHV0LCBlLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoaW5wdXQuZm9ybSwgdmlldyA9PiB7XG4gICAgICAgICAgICBET00ucHV0UHJpdmF0ZShpbnB1dCwgUEhYX0hBU19GT0NVU0VELCB0cnVlKVxuICAgICAgICAgICAgaWYoIURPTS5pc1RleHR1YWxJbnB1dChpbnB1dCkpe1xuICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZUVsZW1lbnQoaW5wdXQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBKUy5leGVjKFwiY2hhbmdlXCIsIHBoeEV2ZW50LCB2aWV3LCBpbnB1dCwgW1wicHVzaFwiLCB7X3RhcmdldDogZS50YXJnZXQubmFtZX1dKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9LCBmYWxzZSlcbiAgICB9XG4gIH1cblxuICBkZWJvdW5jZShlbCwgZXZlbnQsIGNhbGxiYWNrKXtcbiAgICBsZXQgcGh4RGVib3VuY2UgPSB0aGlzLmJpbmRpbmcoUEhYX0RFQk9VTkNFKVxuICAgIGxldCBwaHhUaHJvdHRsZSA9IHRoaXMuYmluZGluZyhQSFhfVEhST1RUTEUpXG4gICAgbGV0IGRlZmF1bHREZWJvdW5jZSA9IHRoaXMuZGVmYXVsdHMuZGVib3VuY2UudG9TdHJpbmcoKVxuICAgIGxldCBkZWZhdWx0VGhyb3R0bGUgPSB0aGlzLmRlZmF1bHRzLnRocm90dGxlLnRvU3RyaW5nKClcbiAgICBET00uZGVib3VuY2UoZWwsIGV2ZW50LCBwaHhEZWJvdW5jZSwgZGVmYXVsdERlYm91bmNlLCBwaHhUaHJvdHRsZSwgZGVmYXVsdFRocm90dGxlLCBjYWxsYmFjaylcbiAgfVxuXG4gIHNpbGVuY2VFdmVudHMoY2FsbGJhY2spe1xuICAgIHRoaXMuc2lsZW5jZWQgPSB0cnVlXG4gICAgY2FsbGJhY2soKVxuICAgIHRoaXMuc2lsZW5jZWQgPSBmYWxzZVxuICB9XG5cbiAgb24oZXZlbnQsIGNhbGxiYWNrKXtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgZSA9PiB7XG4gICAgICBpZighdGhpcy5zaWxlbmNlZCl7IGNhbGxiYWNrKGUpIH1cbiAgICB9KVxuICB9XG59XG5cbmNsYXNzIFRyYW5zaXRpb25TZXQge1xuICBjb25zdHJ1Y3Rvcigpe1xuICAgIHRoaXMudHJhbnNpdGlvbnMgPSBuZXcgU2V0KClcbiAgICB0aGlzLnBlbmRpbmdPcHMgPSBbXVxuICAgIHRoaXMucmVzZXQoKVxuICB9XG5cbiAgcmVzZXQoKXtcbiAgICB0aGlzLnRyYW5zaXRpb25zLmZvckVhY2godGltZXIgPT4ge1xuICAgICAgY2FuY2VsVGltZW91dCh0aW1lcilcbiAgICAgIHRoaXMudHJhbnNpdGlvbnMuZGVsZXRlKHRpbWVyKVxuICAgIH0pXG4gICAgdGhpcy5mbHVzaFBlbmRpbmdPcHMoKVxuICB9XG5cbiAgYWZ0ZXIoY2FsbGJhY2spe1xuICAgIGlmKHRoaXMuc2l6ZSgpID09PSAwKXtcbiAgICAgIGNhbGxiYWNrKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXNoUGVuZGluZ09wKGNhbGxiYWNrKVxuICAgIH1cbiAgfVxuXG4gIGFkZFRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25Eb25lKXtcbiAgICBvblN0YXJ0KClcbiAgICBsZXQgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudHJhbnNpdGlvbnMuZGVsZXRlKHRpbWVyKVxuICAgICAgb25Eb25lKClcbiAgICAgIGlmKHRoaXMuc2l6ZSgpID09PSAwKXsgdGhpcy5mbHVzaFBlbmRpbmdPcHMoKSB9XG4gICAgfSwgdGltZSlcbiAgICB0aGlzLnRyYW5zaXRpb25zLmFkZCh0aW1lcilcbiAgfVxuXG4gIHB1c2hQZW5kaW5nT3Aob3ApeyB0aGlzLnBlbmRpbmdPcHMucHVzaChvcCkgfVxuXG4gIHNpemUoKXsgcmV0dXJuIHRoaXMudHJhbnNpdGlvbnMuc2l6ZSB9XG5cbiAgZmx1c2hQZW5kaW5nT3BzKCl7XG4gICAgdGhpcy5wZW5kaW5nT3BzLmZvckVhY2gob3AgPT4gb3AoKSlcbiAgICB0aGlzLnBlbmRpbmdPcHMgPSBbXVxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBYUEsTUFBRSxVQUFVLFNBQVEsU0FBVTtBQUU3QjtBQUVBLFlBQUssT0FBTyxXQUFXLFlBQVksT0FBTyxPQUFPLFlBQVksVUFBVztBQVN2RSxpQkFBTyxVQUFVLFFBQU8sV0FDdkIs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QUFBQSxZQUFtQjtBQUFBLFlBQU87QUFBQSxZQUFRO0FBQUEsWUFBYTtBQUFBLFlBQWM7QUFBQSxZQUFRO0FBQUEsWUFBWTtBQUFBLFlBQVE7QUFBQSxZQUFRO0FBQUEsWUFBUztBQUFBLFlBQVk7QUFBQSxZQUFRO0FBQUEsWUFBUztBQUFBLFlBQVE7QUFBQSxZQUFPO0FBQUEsWUFBSztBQUFBLFlBQUs7QUFBQSxZQUFTO0FBQUEsWUFBUztBQUFBLFlBQVM7QUFBQSxZQUFRO0FBQUEsWUFBbUI7QUFBQSxZQUFPO0FBQUEsWUFBVTtBQUFBLFlBQU87QUFBQSxZQUFTO0FBQUEsWUFBUTtBQUFBLFlBQVM7QUFBQSxZQUFVO0FBQUEsWUFBUTtBQUFBLFlBQVc7QUFBQSxZQUFXO0FBQUEsWUFBUTtBQUFBLFlBQVc7QUFBQSxZQUFPO0FBQUEsWUFBaUI7QUFBQSxZQUFZO0FBQUEsWUFBUztBQUFBLFlBQVM7QUFBQSxZQUFTO0FBQUEsWUFBUTtBQUFBLFlBQVE7QUFBQSxZQUFRO0FBQUEsWUFBUTtBQUFBLFlBQU87QUFBQSxZQUFRO0FBQUEsWUFBUTtBQUFBLFlBQVM7QUFBQSxZQUFXO0FBQUEsWUFBYTtBQUFBLFlBQVE7QUFBQSxZQUFTO0FBQUEsWUFBUTtBQUFBLFlBQVU7QUFBQSxZQUFpQjtBQUFBLFlBQVU7QUFBQSxZQUFTO0FBQUEsWUFBYTtBQUFBLFlBQVk7QUFBQSxZQUFxQjtBQUFBLFlBQW1CO0FBQUEsWUFBUTtBQUFBLFlBQWE7QUFBQSxZQUFPO0FBQUEsWUFBUztBQUFBLFlBQU87QUFBQSxZQUFTO0FBQUEsWUFBTztBQUFBLFlBQWtCO0FBQUEsVUFDL3VCO0FBQUEsVUFDQSx3QkFBd0I7QUFBQSxZQUV2QjtBQUFBLFlBQVc7QUFBQSxZQUFhO0FBQUEsWUFBYTtBQUFBLFlBQU07QUFBQSxZQUFVO0FBQUEsWUFBTztBQUFBLFlBQUs7QUFBQSxZQUFZO0FBQUEsWUFBTTtBQUFBLFlBQVU7QUFBQSxZQUFTO0FBQUEsWUFBVTtBQUFBLFlBQWE7QUFBQSxZQUFjO0FBQUEsWUFBWTtBQUFBLFlBQVU7QUFBQSxZQUFXO0FBQUEsWUFBaUI7QUFBQSxZQUFxQjtBQUFBLFlBQWE7QUFBQSxZQUFXO0FBQUEsWUFBb0I7QUFBQSxZQUFNO0FBQUEsWUFFcFE7QUFBQSxZQUFLO0FBQUEsWUFBTTtBQUFBLFVBQ1o7QUFBQSxVQUNBLHFCQUFxQjtBQUFBLFlBQ3BCO0FBQUEsWUFBYztBQUFBLFlBQVk7QUFBQSxZQUFVO0FBQUEsWUFBb0I7QUFBQSxZQUFVO0FBQUEsWUFBYztBQUFBLFlBQWM7QUFBQSxZQUFhO0FBQUEsWUFBb0I7QUFBQSxZQUFtQjtBQUFBLFlBQVk7QUFBQSxZQUFjO0FBQUEsWUFBUTtBQUFBLFlBQVk7QUFBQSxZQUFXO0FBQUEsWUFBYztBQUFBLFlBQWE7QUFBQSxZQUFZO0FBQUEsWUFBUTtBQUFBLFlBQVE7QUFBQSxZQUFPO0FBQUEsWUFBWTtBQUFBLFlBQVc7QUFBQSxZQUFVO0FBQUEsWUFBVztBQUFBLFlBQWM7QUFBQSxZQUFjO0FBQUEsWUFBVTtBQUFBLFlBQVM7QUFBQSxZQUFXO0FBQUEsWUFBcUI7QUFBQSxZQUFjO0FBQUEsWUFBZTtBQUFBLFlBQVE7QUFBQSxZQUFVO0FBQUEsWUFBaUI7QUFBQSxZQUFxQjtBQUFBLFlBQWlDO0FBQUEsWUFBa0M7QUFBQSxZQUFhO0FBQUEsWUFBVztBQUFBLFlBQVk7QUFBQSxZQUFVO0FBQUEsWUFBYztBQUFBLFlBQWM7QUFBQSxZQUFXO0FBQUEsWUFBVTtBQUFBLFlBQVE7QUFBQSxZQUFnQjtBQUFBLFlBQWdCO0FBQUEsWUFBUztBQUFBLFlBQVE7QUFBQSxZQUFVO0FBQUEsWUFBYTtBQUFBLFlBQVc7QUFBQSxZQUFTO0FBQUEsWUFBWTtBQUFBLFlBQWU7QUFBQSxZQUFZO0FBQUEsWUFBUztBQUFBLFlBQWE7QUFBQSxZQUFjO0FBQUEsWUFBYztBQUFBLFlBQXNCO0FBQUEsWUFBVTtBQUFBLFlBQVU7QUFBQSxZQUFZO0FBQUEsWUFBZ0I7QUFBQSxZQUFXO0FBQUEsWUFBYztBQUFBLFlBQVE7QUFBQSxZQUFXO0FBQUEsWUFBUztBQUFBLFlBQVU7QUFBQSxZQUFVO0FBQUEsWUFBUTtBQUFBLFlBQWM7QUFBQSxZQUFZO0FBQUEsWUFBYTtBQUFBLFlBQU87QUFBQSxZQUFjO0FBQUEsWUFBVztBQUFBLFlBQWM7QUFBQSxZQUFVO0FBQUEsWUFBZTtBQUFBLFlBQWE7QUFBQSxZQUFRO0FBQUEsWUFBYTtBQUFBLFlBQVU7QUFBQSxZQUFhO0FBQUEsWUFBa0I7QUFBQSxZQUFXO0FBQUEsWUFBZ0I7QUFBQSxZQUFXO0FBQUEsWUFBaUI7QUFBQSxZQUFnQjtBQUFBLFlBQWE7QUFBQSxZQUFvQjtBQUFBLFlBQVc7QUFBQSxZQUFVO0FBQUEsWUFBWTtBQUFBLFlBQVE7QUFBQSxZQUFjO0FBQUEsWUFBcUI7QUFBQSxZQUFhO0FBQUEsWUFBVztBQUFBLFlBQVc7QUFBQSxZQUFhO0FBQUEsWUFBWTtBQUFBLFlBQVk7QUFBQSxZQUFjO0FBQUEsWUFBUTtBQUFBLFlBQWU7QUFBQSxZQUFrQjtBQUFBLFlBQVM7QUFBQSxZQUFXO0FBQUEsWUFBYTtBQUFBLFlBQWlCO0FBQUEsWUFBZTtBQUFBLFlBQXFCO0FBQUEsWUFBTztBQUFBLFlBQVc7QUFBQSxZQUFRO0FBQUEsWUFBVTtBQUFBLFlBQVE7QUFBQSxZQUF1QjtBQUFBLFlBQWM7QUFBQSxZQUFjO0FBQUEsWUFBb0I7QUFBQSxZQUFXO0FBQUEsWUFBZTtBQUFBLFlBQVU7QUFBQSxZQUFjO0FBQUEsWUFBWTtBQUFBLFlBQW1CO0FBQUEsWUFBUTtBQUFBLFlBQVE7QUFBQSxZQUFTO0FBQUEsWUFBUztBQUFBLFlBQVM7QUFBQSxZQUFhO0FBQUEsWUFBVTtBQUFBLFlBQWdCO0FBQUEsWUFBZ0I7QUFBQSxZQUFZO0FBQUEsWUFBWTtBQUFBLFlBQU87QUFBQSxZQUFjO0FBQUEsWUFBYTtBQUFBLFlBQVk7QUFBQSxZQUFTO0FBQUEsWUFBcUI7QUFBQSxZQUFnQjtBQUFBLFlBQVE7QUFBQSxZQUFlO0FBQUEsWUFBUztBQUFBLFlBQVc7QUFBQSxZQUFXO0FBQUEsWUFBUTtBQUFBLFlBQWU7QUFBQSxZQUFVO0FBQUEsWUFBUTtBQUFBLFlBQWlCO0FBQUEsWUFBYTtBQUFBLFVBQ3ppRTtBQUFBLFVBQ0EsZ0JBQWdCO0FBQUEsWUFDZjtBQUFBLFlBQVc7QUFBQSxZQUFtQjtBQUFBLFlBQU87QUFBQSxZQUFlO0FBQUEsWUFBa0I7QUFBQSxZQUFjO0FBQUEsWUFBVztBQUFBLFlBQWdCO0FBQUEsWUFBVztBQUFBLFlBQVk7QUFBQSxZQUFlO0FBQUEsWUFBTztBQUFBLFlBQUs7QUFBQSxZQUFLO0FBQUEsWUFBZTtBQUFBLFlBQUs7QUFBQSxZQUFPO0FBQUEsWUFBSztBQUFBLFlBQU07QUFBQSxZQUFVO0FBQUEsWUFBZTtBQUFBLFlBQXlCO0FBQUEsWUFBUTtBQUFBLFlBQUs7QUFBQSxZQUFRO0FBQUEsWUFBSztBQUFBLFlBQVk7QUFBQSxZQUFVO0FBQUEsWUFBZTtBQUFBLFlBQU07QUFBQSxZQUFTO0FBQUEsWUFBYztBQUFBLFlBQVU7QUFBQSxZQUFTO0FBQUEsWUFBVTtBQUFBLFlBQVM7QUFBQSxZQUFTO0FBQUEsWUFBUztBQUFBLFlBQVc7QUFBQSxZQUFVO0FBQUEsWUFBVztBQUFBLFlBQVk7QUFBQSxZQUFNO0FBQUEsWUFBa0I7QUFBQSxZQUFNO0FBQUEsWUFBTztBQUFBLFlBQVc7QUFBQSxZQUFjO0FBQUEsWUFBTTtBQUFBLFlBQU07QUFBQSxZQUFPO0FBQUEsWUFBUztBQUFBLFlBQVk7QUFBQSxZQUFVO0FBQUEsWUFBTTtBQUFBLFlBQVc7QUFBQSxZQUFXO0FBQUEsWUFBTztBQUFBLFlBQVU7QUFBQSxZQUFNO0FBQUEsWUFBVTtBQUFBLFlBQVM7QUFBQSxZQUFRO0FBQUEsWUFBWTtBQUFBLFlBQWM7QUFBQSxZQUFXO0FBQUEsWUFBWTtBQUFBLFlBQVE7QUFBQSxZQUFhO0FBQUEsWUFBZTtBQUFBLFlBQVM7QUFBQSxZQUFPO0FBQUEsWUFBa0I7QUFBQSxZQUFhO0FBQUEsWUFBMEI7QUFBQSxZQUFjO0FBQUEsWUFBUztBQUFBLFlBQWM7QUFBQSxZQUFTO0FBQUEsWUFBVztBQUFBLFlBQU87QUFBQSxZQUFVO0FBQUEsWUFBeUI7QUFBQSxZQUFPO0FBQUEsWUFBUTtBQUFBLFlBQU07QUFBQSxZQUFRO0FBQUEsWUFBWTtBQUFBLFlBQVM7QUFBQSxZQUFhO0FBQUEsVUFDNzdCO0FBQUEsUUFFRDtBQUVBLGVBQU8sS0FBSyxRQUFRLEVBQUUsUUFBUSxTQUFVLEdBQUc7QUFDMUMsaUJBQU8sR0FBRyxVQUFVLGlCQUFpQixTQUFTLEVBQUU7QUFBQSxRQUNqRCxDQUFDO0FBRUQsWUFBSSxjQUFjO0FBQUEsVUFFakI7QUFBQSxVQUFPO0FBQUEsVUFBUztBQUFBLFVBQVE7QUFBQSxVQUFPO0FBQUEsVUFBUTtBQUFBLFVBQVM7QUFBQSxVQUFTO0FBQUEsVUFBUTtBQUFBLFVBQVM7QUFBQSxVQUFXO0FBQUEsVUFBTztBQUFBLFVBQU87QUFBQSxVQUFRO0FBQUEsVUFBUztBQUFBLFVBQVM7QUFBQSxVQUFXO0FBQUEsVUFBVTtBQUFBLFVBQVE7QUFBQSxVQUFRO0FBQUEsVUFBUztBQUFBLFVBQVM7QUFBQSxVQUFPO0FBQUEsVUFBVTtBQUFBLFVBQU07QUFBQSxVQUFXO0FBQUEsVUFBYTtBQUFBLFVBQU87QUFBQSxVQUFRO0FBQUEsVUFBYTtBQUFBLFVBQVM7QUFBQSxVQUFRO0FBQUEsVUFBUztBQUFBLFVBQVE7QUFBQSxVQUFTO0FBQUEsVUFBVztBQUFBLFVBQU07QUFBQSxVQUFTO0FBQUEsVUFBUTtBQUFBLFVBQVU7QUFBQSxVQUFjO0FBQUEsVUFBYztBQUFBLFVBQVk7QUFBQSxVQUFTO0FBQUEsVUFBVztBQUFBLFVBQVE7QUFBQSxVQUFNO0FBQUEsVUFBUTtBQUFBLFVBQVU7QUFBQSxVQUFTO0FBQUEsVUFBUTtBQUFBLFVBQVU7QUFBQSxVQUFPO0FBQUEsVUFBUTtBQUFBLFVBQVU7QUFBQSxVQUFPO0FBQUEsVUFBWTtBQUFBLFVBRXpmO0FBQUEsVUFBa0I7QUFBQSxVQUFtQjtBQUFBLFVBQVU7QUFBQSxVQUFhO0FBQUEsVUFBUztBQUFBLFVBQWE7QUFBQSxVQUFhO0FBQUEsVUFBWTtBQUFBLFVBQWU7QUFBQSxVQUFXO0FBQUEsVUFBYTtBQUFBLFVBQWlCO0FBQUEsVUFBb0I7QUFBQSxVQUFVO0FBQUEsVUFBTztBQUFBLFVBQVc7QUFBQSxVQUFlO0FBQUEsVUFBYztBQUFBLFVBQVU7QUFBQSxVQUFlO0FBQUEsVUFBUTtBQUFBLFVBQWdCO0FBQUEsVUFBYTtBQUFBLFVBQVc7QUFBQSxVQUFnQjtBQUFBLFVBQWdCO0FBQUEsVUFBYztBQUFBLFVBQW1CO0FBQUEsVUFBUztBQUFBLFVBQWM7QUFBQSxVQUFVO0FBQUEsVUFBZ0I7QUFBQSxVQUFhO0FBQUEsVUFBZ0I7QUFBQSxVQUFZO0FBQUEsVUFBVTtBQUFBLFVBQVk7QUFBQSxVQUFjO0FBQUEsVUFBUTtBQUFBLFVBQWE7QUFBQSxVQUFpQjtBQUFBLFVBQWdCO0FBQUEsVUFBUTtBQUFBLFVBQVc7QUFBQSxVQUFXO0FBQUEsVUFBYTtBQUFBLFVBQWlCO0FBQUEsVUFBa0I7QUFBQSxVQUFtQjtBQUFBLFVBQWlCO0FBQUEsVUFBVztBQUFBLFVBQVE7QUFBQSxVQUFhO0FBQUEsVUFBZTtBQUFBLFVBQVc7QUFBQSxVQUFlO0FBQUEsVUFBYztBQUFBLFVBQVE7QUFBQSxVQUFjO0FBQUEsVUFBa0I7QUFBQSxVQUFjO0FBQUEsVUFBUTtBQUFBLFVBQWdCO0FBQUEsVUFBZTtBQUFBLFVBQVk7QUFBQSxVQUFpQjtBQUFBLFVBQWE7QUFBQSxVQUFXO0FBQUEsVUFBUztBQUFBLFVBQWM7QUFBQSxVQUFTO0FBQUEsVUFBUTtBQUFBLFVBQWM7QUFBQSxVQUFXO0FBQUEsVUFBYztBQUFBLFVBQWM7QUFBQSxVQUFTO0FBQUEsVUFBUTtBQUFBLFVBQWE7QUFBQSxVQUFrQjtBQUFBLFVBRXRoQztBQUFBLFVBQVc7QUFBQSxVQUFnQjtBQUFBLFVBQWU7QUFBQSxVQUFrQjtBQUFBLFVBQWE7QUFBQSxVQUFxQjtBQUFBLFVBQW1CO0FBQUEsVUFBUztBQUFBLFVBQWtCO0FBQUEsVUFBZ0I7QUFBQSxVQUU1SjtBQUFBLFVBQW1CO0FBQUEsVUFBZTtBQUFBLFVBQWlCO0FBQUEsVUFBaUI7QUFBQSxVQUFtQjtBQUFBLFVBRXZGO0FBQUEsVUFBUTtBQUFBLFVB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WUFDUjtBQUFBLFlBQ0EsU0FBUztBQUFBLGNBQ1IsU0FBUztBQUFBLGNBQ1QsWUFBWTtBQUFBLGNBQ1osT0FBTztBQUFBLFlBQ1I7QUFBQSxZQUNBLGNBQWM7QUFBQSxjQUNiLFNBQVM7QUFBQSxjQUNULE9BQU8sQ0FBQyxTQUFTLFVBQVU7QUFBQSxZQUM1QjtBQUFBLFVBQ0Q7QUFBQSxRQUNEO0FBQUEsUUFFQSxTQUFTO0FBQUEsVUFNUjtBQUFBLFlBRUMsU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFlBQ1osT0FBTztBQUFBLFVBQ1I7QUFBQSxVQUNBO0FBQUEsWUFHQyxTQUFTO0FBQUEsWUFDVCxZQUFZO0FBQUEsWUFDWixPQUFPO0FBQUEsVUFDUjtBQUFBLFVBQ0E7QUFBQSxZQUVDLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxZQUNaLE9BQU87QUFBQSxVQUNSO0FBQUEsVUFDQTtBQUFBLFlBRUMsU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFlBQ1osT0FBTztBQUFBLFVBQ1I7QUFBQSxRQUNEO0FBQUEsUUFFQSxTQUFTO0FBQUEsVUFDUixTQUFTO0FBQUEsVUFDVCxZQUFZO0FBQUEsVUFDWixRQUFRO0FBQUEsVUFDUixPQUFPO0FBQUEsUUFDUjtBQUFBLFFBRUEsUUFBUTtBQUFBLFVBQ1AsU0FBUztBQUFBLFVBQ1QsT0FBTztBQUFBLFFBQ1I7QUFBQSxRQUNBLFVBQVU7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxRQUNUO0FBQUEsUUFFQSxjQUFjO0FBQUEsVUFDYixTQUFTO0FBQUEsVUFDVCxPQUFPO0FBQUEsUUFDUjtBQUFBLFFBRUEsV0FBVztBQUFBLFVBRVY7QUFBQSxZQUNDLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxZQUNaLFFBQVE7QUFBQSxVQUNUO0FBQUEsVUFDQTtBQUFBLFlBQ0MsU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFlBQ1osUUFBUTtBQUFBLFVBQ1Q7QUFBQSxRQUNEO0FBQUEsUUFFQSxVQUFVO0FBQUEsUUFFVixZQUFZO0FBQUEsVUFDWCxTQUFT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