jsoneditor.min.js 1.4 MB
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
/*!
 * jsoneditor.js
 *
 * @brief
 * JSONEditor is a web-based tool to view, edit, format, and validate JSON.
 * It has various modes such as a tree editor, a code editor, and a plain text
 * editor.
 *
 * Supported browsers: Chrome, Firefox, Safari, Opera, Internet Explorer 8+
 *
 * @license
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy
 * of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 *
 * Copyright (c) 2011-2021 Jos de Jong, http://jsoneditoronline.org
 *
 * @author  Jos de Jong, <wjosdejong@gmail.com>
 * @version 9.5.6
 * @date    2021-09-22
 */
!function (e, t) {
    "object" == typeof exports && "object" == typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define([], t) : "object" == typeof exports ? exports.JSONEditor = t() : e.JSONEditor = t()
}(self, function () {
    return i = {
        897: function (e, t, i) {
            "use strict";
            i.d(t, {
                x: function () {
                    return r
                }
            });
            var c = i(2602), h = i(9791), u = i(7907);

            function n(e, t) {
                for (var i = 0; i < t.length; i++) {
                    var n = t[i];
                    n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n)
                }
            }

            var r = function () {
                function l(t, e) {
                    !function (e, t) {
                        if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function")
                    }(this, l), this.dom = {};
                    var d = this, i = this.dom;
                    this.anchor = void 0, this.items = t, this.eventListeners = {}, this.selection = void 0, this.onClose = e ? e.close : void 0, this.limitHeight = !!e && e.limitHeight;
                    var n = document.createElement("div");
                    n.className = "jsoneditor-contextmenu-root", i.root = n;
                    e = document.createElement("div");
                    e.className = "jsoneditor-contextmenu", i.menu = e, n.appendChild(e);
                    n = document.createElement("ul");
                    n.className = "jsoneditor-menu", e.appendChild(n), i.list = n, i.items = [];
                    e = document.createElement("button");
                    e.type = "button", i.focusButton = e;
                    i = document.createElement("li");
                    i.style.overflow = "hidden", i.style.height = "0", i.appendChild(e), n.appendChild(i), function l(c, h, e) {
                        e.forEach(function (t) {
                            var i, e, n, r, o, s, a;
                            "separator" === t.type ? ((n = document.createElement("div")).className = "jsoneditor-separator", (o = document.createElement("li")).appendChild(n), c.appendChild(o)) : (i = {}, e = document.createElement("li"), c.appendChild(e), (n = document.createElement("button")).type = "button", n.className = t.className, i.button = n, t.title && (n.title = t.title), t.click && (n.onclick = function (e) {
                                e.preventDefault(), d.hide(), t.click()
                            }), e.appendChild(n), t.submenu ? ((o = document.createElement("div")).className = "jsoneditor-icon", n.appendChild(o), (o = document.createElement("div")).className = "jsoneditor-text" + (t.click ? "" : " jsoneditor-right-margin"), o.appendChild(document.createTextNode(t.text)), n.appendChild(o), (r = t.click ? (n.className += " jsoneditor-default", (a = document.createElement("button")).type = "button", (i.buttonExpand = a).className = "jsoneditor-expand", (o = document.createElement("div")).className = "jsoneditor-expand", a.appendChild(o), e.appendChild(a), t.submenuTitle && (a.title = t.submenuTitle), a) : ((s = document.createElement("div")).className = "jsoneditor-expand", n.appendChild(s), n)).onclick = function (e) {
                                e.preventDefault(), d._onExpandItem(i), r.focus()
                            }, i.subItems = a = [], s = document.createElement("ul"), (i.ul = s).className = "jsoneditor-menu", s.style.height = "0", e.appendChild(s), l(s, a, t.submenu)) : ((a = document.createElement("div")).className = "jsoneditor-icon", n.appendChild(a), (a = document.createElement("div")).className = "jsoneditor-text", a.appendChild(document.createTextNode((0, u.Iu)(t.text))), n.appendChild(a)), h.push(i))
                        })
                    }(n, this.dom.items, t), this.maxHeight = 0, t.forEach(function (e) {
                        e = 24 * (t.length + (e.submenu ? e.submenu.length : 0));
                        d.maxHeight = Math.max(d.maxHeight, e)
                    })
                }

                var e, t, i;
                return e = l, (t = [{
                    key: "_getVisibleButtons", value: function () {
                        var t = [], i = this;
                        return this.dom.items.forEach(function (e) {
                            t.push(e.button), e.buttonExpand && t.push(e.buttonExpand), e.subItems && e === i.expandedItem && e.subItems.forEach(function (e) {
                                t.push(e.button), e.buttonExpand && t.push(e.buttonExpand)
                            })
                        }), t
                    }
                }, {
                    key: "show", value: function (e, t, i) {
                        this.hide();
                        var n = !0, r = e.parentNode, o = e.getBoundingClientRect(), s = r.getBoundingClientRect(),
                            r = t.getBoundingClientRect(), a = this;
                        this.dom.absoluteAnchor = (0, c.w)(e, t, function () {
                            a.hide()
                        }), o.bottom + this.maxHeight < r.bottom || o.top - this.maxHeight > r.top && (n = !1);
                        i = i ? 0 : o.top - s.top;
                        n ? (s = e.offsetHeight, this.dom.menu.style.left = "0", this.dom.menu.style.top = i + s + "px", this.dom.menu.style.bottom = "") : (this.dom.menu.style.left = "0", this.dom.menu.style.top = "", this.dom.menu.style.bottom = "0px"), this.limitHeight && (r = n ? r.bottom - o.bottom - 10 : o.top - r.top - 10, this.dom.list.style.maxHeight = r + "px", this.dom.list.style.overflowY = "auto"), this.dom.absoluteAnchor.appendChild(this.dom.root), this.selection = (0, h.getSelection)(), this.anchor = e, setTimeout(function () {
                            a.dom.focusButton.focus()
                        }, 0), l.visibleMenu && l.visibleMenu.hide(), l.visibleMenu = this
                    }
                }, {
                    key: "hide", value: function () {
                        this.dom.absoluteAnchor && (this.dom.absoluteAnchor.destroy(), delete this.dom.absoluteAnchor), this.dom.root.parentNode && (this.dom.root.parentNode.removeChild(this.dom.root), this.onClose && this.onClose()), l.visibleMenu === this && (l.visibleMenu = void 0)
                    }
                }, {
                    key: "_onExpandItem", value: function (i) {
                        var n, r = this, e = i === this.expandedItem, t = this.expandedItem;
                        t && (t.ul.style.height = "0", t.ul.style.padding = "", setTimeout(function () {
                            r.expandedItem !== t && (t.ul.style.display = "", h.removeClassName)(t.ul.parentNode, "jsoneditor-selected")
                        }, 300), this.expandedItem = void 0), e || ((n = i.ul).style.display = "block", n.clientHeight, setTimeout(function () {
                            if (r.expandedItem === i) {
                                for (var e = 0, t = 0; t < n.childNodes.length; t++) e += n.childNodes[t].clientHeight;
                                n.style.height = e + "px", n.style.padding = "5px 10px"
                            }
                        }, 0), (0, h.addClassName)(n.parentNode, "jsoneditor-selected"), this.expandedItem = i)
                    }
                }, {
                    key: "_onKeyDown", value: function (e) {
                        var t, i, n, r, o = e.target, s = e.which, a = !1;
                        27 === s ? (this.selection && (0, h.setSelection)(this.selection), this.anchor && this.anchor.focus(), this.hide(), a = !0) : 9 === s ? e.shiftKey ? 0 === (i = (t = this._getVisibleButtons()).indexOf(o)) && (t[t.length - 1].focus(), a = !0) : (i = (t = this._getVisibleButtons()).indexOf(o)) === t.length - 1 && (t[0].focus(), a = !0) : 37 === s ? ("jsoneditor-expand" === o.className && (i = (t = this._getVisibleButtons()).indexOf(o), (n = t[i - 1]) && n.focus()), a = !0) : 38 === s ? (i = (t = this._getVisibleButtons()).indexOf(o), (n = (n = (n = t[i - 1]) && "jsoneditor-expand" === n.className ? t[i - 2] : n) || t[t.length - 1]) && n.focus(), a = !0) : 39 === s ? (i = (t = this._getVisibleButtons()).indexOf(o), (r = t[i + 1]) && "jsoneditor-expand" === r.className && r.focus(), a = !0) : 40 === s && (i = (t = this._getVisibleButtons()).indexOf(o), (r = (r = (r = t[i + 1]) && "jsoneditor-expand" === r.className ? t[i + 2] : r) || t[0]) && (r.focus(), a = !0), a = !0), a && (e.stopPropagation(), e.preventDefault())
                    }
                }]) && n(e.prototype, t), i && n(e, i), l
            }();
            r.visibleMenu = void 0
        }, 6436: function (e, t, i) {
            "use strict";

            function r(e, t) {
                for (var i = 0; i < t.length; i++) {
                    var n = t[i];
                    n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n)
                }
            }

            i.d(t, {
                Q: function () {
                    return n
                }
            });
            var n = function () {
                function i(e) {
                    !function (e, t) {
                        if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function")
                    }(this, i), this.errorTableVisible = e.errorTableVisible, this.onToggleVisibility = e.onToggleVisibility, this.onFocusLine = e.onFocusLine || function () {
                    }, this.onChangeHeight = e.onChangeHeight, this.dom = {};
                    var t = document.createElement("div");
                    t.className = "jsoneditor-validation-errors-container", this.dom.validationErrorsContainer = t;
                    e = document.createElement("div");
                    e.style.display = "none", e.className = "jsoneditor-additional-errors fadein", e.textContent = "Scroll for more ▿", this.dom.additionalErrorsIndication = e, t.appendChild(e);
                    e = document.createElement("span");
                    e.className = "jsoneditor-validation-error-icon", e.style.display = "none", this.dom.validationErrorIcon = e;
                    e = document.createElement("span");
                    e.className = "jsoneditor-validation-error-count", e.style.display = "none", this.dom.validationErrorCount = e, this.dom.parseErrorIndication = document.createElement("span"), this.dom.parseErrorIndication.className = "jsoneditor-parse-error-icon", this.dom.parseErrorIndication.style.display = "none"
                }

                var e, t, n;
                return e = i, (t = [{
                    key: "getErrorTable", value: function () {
                        return this.dom.validationErrorsContainer
                    }
                }, {
                    key: "getErrorCounter", value: function () {
                        return this.dom.validationErrorCount
                    }
                }, {
                    key: "getWarningIcon", value: function () {
                        return this.dom.validationErrorIcon
                    }
                }, {
                    key: "getErrorIcon", value: function () {
                        return this.dom.parseErrorIndication
                    }
                }, {
                    key: "toggleTableVisibility", value: function () {
                        this.errorTableVisible = !this.errorTableVisible, this.onToggleVisibility(this.errorTableVisible)
                    }
                }, {
                    key: "setErrors", value: function (e, a) {
                        var t, l, c = this;
                        this.dom.validationErrors && (this.dom.validationErrors.parentNode.removeChild(this.dom.validationErrors), this.dom.validationErrors = null, this.dom.additionalErrorsIndication.style.display = "none"), this.errorTableVisible && 0 < e.length ? ((i = document.createElement("div")).className = "jsoneditor-validation-errors", (t = document.createElement("table")).className = "jsoneditor-text-errors", i.appendChild(t), l = document.createElement("tbody"), t.appendChild(l), e.forEach(function (t) {
                            var e;
                            isNaN(t.line) ? !t.dataPath || (r = a.find(function (e) {
                                return e.path === t.dataPath
                            })) && (e = r.line + 1) : e = t.line;
                            var i = document.createElement("tr");
                            i.className = isNaN(e) ? "" : "jump-to-line", "error" === t.type ? i.className += " parse-error" : i.className += " validation-error";
                            var n = document.createElement("td"), r = document.createElement("button");
                            r.className = "jsoneditor-schema-error", n.appendChild(r), i.appendChild(n);
                            var o, s, n = document.createElement("td");
                            n.style = "white-space: nowrap;", n.textContent = isNaN(e) ? "" : "Ln " + e, i.appendChild(n), "string" == typeof t ? ((o = document.createElement("td")).colSpan = 2, (s = document.createElement("pre")).appendChild(document.createTextNode(t)), o.appendChild(s), i.appendChild(o)) : ((s = document.createElement("td")).appendChild(document.createTextNode(t.dataPath || "")), i.appendChild(s), o = document.createElement("td"), (s = document.createElement("pre")).appendChild(document.createTextNode(t.message.replace(/<br>/gi, "\n"))), o.appendChild(s), i.appendChild(o)), i.onclick = function () {
                                c.onFocusLine(e)
                            }, l.appendChild(i)
                        }), this.dom.validationErrors = i, this.dom.validationErrorsContainer.appendChild(i), this.dom.additionalErrorsIndication.title = e.length + " errors total", this.dom.validationErrorsContainer.clientHeight < this.dom.validationErrorsContainer.scrollHeight ? (this.dom.additionalErrorsIndication.style.display = "block", this.dom.validationErrorsContainer.onscroll = function () {
                            c.dom.additionalErrorsIndication.style.display = 0 < c.dom.validationErrorsContainer.clientHeight && 0 === c.dom.validationErrorsContainer.scrollTop ? "block" : "none"
                        }) : this.dom.validationErrorsContainer.onscroll = void 0, i = this.dom.validationErrorsContainer.clientHeight + (this.dom.statusBar ? this.dom.statusBar.clientHeight : 0), this.onChangeHeight(i)) : this.onChangeHeight(0);
                        var i = e.filter(function (e) {
                            return "error" !== e.type
                        }).length;
                        0 < i ? (this.dom.validationErrorCount.style.display = "inline", this.dom.validationErrorCount.innerText = i, this.dom.validationErrorCount.onclick = this.toggleTableVisibility.bind(this), this.dom.validationErrorIcon.style.display = "inline", this.dom.validationErrorIcon.title = i + " schema validation error(s) found", this.dom.validationErrorIcon.onclick = this.toggleTableVisibility.bind(this)) : (this.dom.validationErrorCount.style.display = "none", this.dom.validationErrorIcon.style.display = "none"), e.some(function (e) {
                            return "error" === e.type
                        }) ? (e = e[0].line, this.dom.parseErrorIndication.style.display = "block", this.dom.parseErrorIndication.title = isNaN(e) ? "parse error - check that the json is valid" : "parse error on line " + e, this.dom.parseErrorIndication.onclick = this.toggleTableVisibility.bind(this)) : this.dom.parseErrorIndication.style.display = "none"
                    }
                }]) && r(e.prototype, t), n && r(e, n), i
            }()
        }, 2474: function (e, t, i) {
            "use strict";

            function r(e, t) {
                for (var i = 0; i < t.length; i++) {
                    var n = t[i];
                    n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n)
                }
            }

            i.d(t, {
                R: function () {
                    return n
                }
            });
            var n = function () {
                function t(e) {
                    if (!function (e, t) {
                        if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function")
                    }(this, t), this.target = e.target || null, !this.target) throw new Error('FocusTracker constructor called without a "target" to track.');
                    this.onFocus = "function" == typeof e.onFocus ? e.onFocus : null, this.onBlur = "function" == typeof e.onBlur ? e.onBlur : null, this._onClick = this._onEvent.bind(this), this._onKeyUp = function (e) {
                        9 !== e.which && 9 !== e.keyCode || this._onEvent(e)
                    }.bind(this), this.focusFlag = !1, this.firstEventFlag = !0, (this.onFocus || this.onBlur) && (document.addEventListener("click", this._onClick), document.addEventListener("keyup", this._onKeyUp))
                }

                var e, i, n;
                return e = t, (i = [{
                    key: "destroy", value: function () {
                        document.removeEventListener("click", this._onClick), document.removeEventListener("keyup", this._onKeyUp), this._onEvent({target: document.body})
                    }
                }, {
                    key: "_onEvent", value: function (e) {
                        e = e.target, e = e === this.target || !(!this.target.contains(e) && !this.target.contains(document.activeElement));
                        e ? this.focusFlag || (this.onFocus && this.onFocus({
                            type: "focus",
                            target: this.target
                        }), this.focusFlag = !0) : (this.focusFlag || this.firstEventFlag) && (this.onBlur && this.onBlur({
                            type: "blur",
                            target: this.target
                        }), this.focusFlag = !1, this.firstEventFlag && (this.firstEventFlag = !1))
                    }
                }]) && r(e.prototype, i), n && r(e, n), t
            }()
        }, 3161: function (e, t, r) {
            "use strict";
            var i = r(8170), n = r(8037), o = r(8038).treeModeMixins, s = r(5956).textModeMixins,
                a = r(341).previewModeMixins, l = r(9791), c = l.clear, h = l.extend, d = l.getInnerText,
                u = l.getInternetExplorerVersion, g = l.parse, p = r(2744).tryRequireAjv,
                m = r(2558).showTransformModal, l = r(6210).showSortModal, f = p();

            function C(e, t, i) {
                if (!(this instanceof C)) throw new Error('JSONEditor constructor called without "new".');
                var n = u();
                if (-1 !== n && n < 9) throw new Error("Unsupported browser, IE9 or newer required. Please install the newest version of your browser.");
                t && (t.error && (console.warn('Option "error" has been renamed to "onError"'), t.onError = t.error, delete t.error), t.change && (console.warn('Option "change" has been renamed to "onChange"'), t.onChange = t.change, delete t.change), t.editable && (console.warn('Option "editable" has been renamed to "onEditable"'), t.onEditable = t.editable, delete t.editable), t.onChangeJSON && ("text" !== t.mode && "code" !== t.mode && (!t.modes || -1 === t.modes.indexOf("text") && -1 === t.modes.indexOf("code")) || console.warn('Option "onChangeJSON" is not applicable to modes "text" and "code". Use "onChangeText" or "onChange" instead.')), t && Object.keys(t).forEach(function (e) {
                    -1 === C.VALID_OPTIONS.indexOf(e) && console.warn('Unknown option "' + e + '". This option will be ignored')
                })), arguments.length && this._create(e, t, i)
            }

            "undefined" == typeof Promise && console.error("Promise undefined. Please load a Promise polyfill in the browser in order to use JSONEditor"), C.modes = {}, C.prototype.DEBOUNCE_INTERVAL = 150, C.VALID_OPTIONS = ["ajv", "schema", "schemaRefs", "templates", "ace", "theme", "autocomplete", "onChange", "onChangeJSON", "onChangeText", "onEditable", "onError", "onEvent", "onModeChange", "onNodeName", "onValidate", "onCreateMenu", "onSelectionChange", "onTextSelectionChange", "onClassName", "onFocus", "onBlur", "colorPicker", "onColorPicker", "timestampTag", "timestampFormat", "escapeUnicode", "history", "search", "mode", "modes", "name", "indentation", "sortObjectKeys", "navigationBar", "statusBar", "mainMenuBar", "languages", "language", "enableSort", "enableTransform", "limitDragging", "maxVisibleChilds", "onValidationError", "modalAnchor", "popupAnchor", "createQuery", "executeQuery", "queryDescription"], C.prototype._create = function (e, t, i) {
                this.container = e, this.options = t || {}, this.json = i || {};
                i = this.options.mode || this.options.modes && this.options.modes[0] || "tree";
                this.setMode(i)
            }, C.prototype.destroy = function () {
            }, C.prototype.set = function (e) {
                this.json = e
            }, C.prototype.get = function () {
                return this.json
            }, C.prototype.setText = function (e) {
                this.json = g(e)
            }, C.prototype.getText = function () {
                return JSON.stringify(this.json)
            }, C.prototype.setName = function (e) {
                this.options || (this.options = {}), this.options.name = e
            }, C.prototype.getName = function () {
                return this.options && this.options.name
            }, C.prototype.setMode = function (e) {
                if (e !== this.options.mode || !this.create) {
                    var t = this.container, i = h({}, this.options), n = i.mode;
                    i.mode = e;
                    var r = C.modes[e];
                    if (!r) throw new Error('Unknown mode "' + i.mode + '"');
                    var o = "text" === r.data, s = this.getName(), a = this[o ? "getText" : "get"]();
                    if (this.destroy(), c(this), h(this, r.mixin), this.create(t, i), this.setName(s), this[o ? "setText" : "set"](a), "function" == typeof r.load) try {
                        r.load.call(this)
                    } catch (e) {
                        console.error(e)
                    }
                    if ("function" == typeof i.onModeChange && e !== n) try {
                        i.onModeChange(e, n)
                    } catch (e) {
                        console.error(e)
                    }
                }
            }, C.prototype.getMode = function () {
                return this.options.mode
            }, C.prototype._onError = function (e) {
                this.options && "function" == typeof this.options.onError ? this.options.onError(e) : alert(e.toString())
            }, C.prototype.setSchema = function (e, t) {
                if (e) {
                    var i;
                    try {
                        this.options.ajv ? i = this.options.ajv : ((i = f({
                            allErrors: !0,
                            verbose: !0,
                            schemaId: "auto",
                            $data: !0
                        })).addMetaSchema(r(7171)), i.addMetaSchema(r(6273)))
                    } catch (e) {
                        console.warn("Failed to create an instance of Ajv, JSON Schema validation is not available. Please use a JSONEditor bundle including Ajv, or pass an instance of Ajv as via the configuration option `ajv`.")
                    }
                    if (i) {
                        if (t) {
                            for (var n in t) i.removeSchema(n), t[n] && i.addSchema(t[n], n);
                            this.options.schemaRefs = t
                        }
                        this.validateSchema = i.compile(e), this.options.schema = e, this.validate()
                    }
                    this.refresh()
                } else this.validateSchema = null, this.options.schema = null, this.options.schemaRefs = null, this.validate(), this.refresh()
            }, C.prototype.validate = function () {
            }, C.prototype.refresh = function () {
            }, (C.registerMode = function (e) {
                var t;
                if (Array.isArray(e)) for (r = 0; r < e.length; r++) C.registerMode(e[r]); else {
                    if (!("mode" in e)) throw new Error('Property "mode" missing');
                    if (!("mixin" in e)) throw new Error('Property "mixin" missing');
                    if (!("data" in e)) throw new Error('Property "data" missing');
                    var i = e.mode;
                    if (i in C.modes) throw new Error('Mode "' + i + '" already registered');
                    if ("function" != typeof e.mixin.create) throw new Error('Required function "create" missing on mixin');
                    for (var n = ["setMode", "registerMode", "modes"], r = 0; r < n.length; r++) if ((t = n[r]) in e.mixin) throw new Error('Reserved property "' + t + '" not allowed in mixin');
                    C.modes[i] = e
                }
            })(o), C.registerMode(s), C.registerMode(a), C.ace = i, C.Ajv = f, C.VanillaPicker = n, C.showTransformModal = m, C.showSortModal = l, C.getInnerText = d, e.exports = C.default = C
        }, 6617: function (e, t, i) {
            "use strict";
            i.d(t, {
                x: function () {
                    return r
                }
            });
            var u = i(897), g = i(7907);

            function n(e, t) {
                for (var i = 0; i < t.length; i++) {
                    var n = t[i];
                    n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n)
                }
            }

            var r = function () {
                function d(e, t, i, n) {
                    !function (e, t) {
                        if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function")
                    }(this, d);
                    for (var r = {
                        code: {
                            text: (0, g.Iu)("modeCodeText"),
                            title: (0, g.Iu)("modeCodeTitle"),
                            click: function () {
                                n("code")
                            }
                        },
                        form: {
                            text: (0, g.Iu)("modeFormText"), title: (0, g.Iu)("modeFormTitle"), click: function () {
                                n("form")
                            }
                        },
                        text: {
                            text: (0, g.Iu)("modeTextText"), title: (0, g.Iu)("modeTextTitle"), click: function () {
                                n("text")
                            }
                        },
                        tree: {
                            text: (0, g.Iu)("modeTreeText"), title: (0, g.Iu)("modeTreeTitle"), click: function () {
                                n("tree")
                            }
                        },
                        view: {
                            text: (0, g.Iu)("modeViewText"), title: (0, g.Iu)("modeViewTitle"), click: function () {
                                n("view")
                            }
                        },
                        preview: {
                            text: (0, g.Iu)("modePreviewText"),
                            title: (0, g.Iu)("modePreviewTitle"),
                            click: function () {
                                n("preview")
                            }
                        }
                    }, o = [], s = 0; s < t.length; s++) {
                        var a = t[s], l = r[a];
                        if (!l) throw new Error('Unknown mode "' + a + '"');
                        l.className = "jsoneditor-type-modes" + (i === a ? " jsoneditor-selected" : ""), o.push(l)
                    }
                    var c = r[i];
                    if (!c) throw new Error('Unknown mode "' + i + '"');
                    var c = c.text, h = document.createElement("button");
                    h.type = "button", h.className = "jsoneditor-modes jsoneditor-separator", h.textContent = c + " ▾", h.title = (0, g.Iu)("modeEditorTitle"), h.onclick = function () {
                        new u.x(o).show(h, e)
                    };
                    c = document.createElement("div");
                    c.className = "jsoneditor-modes", c.style.position = "relative", c.appendChild(h), e.appendChild(c), this.dom = {
                        container: e,
                        box: h,
                        frame: c
                    }
                }

                var e, t, i;
                return e = d, (t = [{
                    key: "focus", value: function () {
                        this.dom.box.focus()
                    }
                }, {
                    key: "destroy", value: function () {
                        this.dom && this.dom.frame && this.dom.frame.parentNode && this.dom.frame.parentNode.removeChild(this.dom.frame), this.dom = null
                    }
                }]) && n(e.prototype, t), i && n(e, i), d
            }()
        }, 8170: function (e, t, i) {
            var n;
            if (window.ace) n = window.ace; else try {
                n = i(6225), i(4091), i(3330);
                var r = i(7923);
                n.config.setModuleUrl("ace/mode/json_worker", r)
            } catch (e) {
            }
            e.exports = n
        }, 4864: function () {
            window.ace.define("ace/theme/jsoneditor", ["require", "exports", "module", "ace/lib/dom"], function (e, t, i) {
                t.isDark = !1, t.cssClass = "ace-jsoneditor", t.cssText = '.ace-jsoneditor .ace_gutter {\nbackground: #ebebeb;\ncolor: #333\n}\n\n.ace-jsoneditor.ace_editor {\nfont-family: "dejavu sans mono", "droid sans mono", consolas, monaco, "lucida console", "courier new", courier, monospace, sans-serif;\nline-height: 1.3;\nbackground-color: #fff;\n}\n.ace-jsoneditor .ace_print-margin {\nwidth: 1px;\nbackground: #e8e8e8\n}\n.ace-jsoneditor .ace_scroller {\nbackground-color: #FFFFFF\n}\n.ace-jsoneditor .ace_text-layer {\ncolor: gray\n}\n.ace-jsoneditor .ace_variable {\ncolor: #1a1a1a\n}\n.ace-jsoneditor .ace_cursor {\nborder-left: 2px solid #000000\n}\n.ace-jsoneditor .ace_overwrite-cursors .ace_cursor {\nborder-left: 0px;\nborder-bottom: 1px solid #000000\n}\n.ace-jsoneditor .ace_marker-layer .ace_selection {\nbackground: lightgray\n}\n.ace-jsoneditor.ace_multiselect .ace_selection.ace_start {\nbox-shadow: 0 0 3px 0px #FFFFFF;\nborder-radius: 2px\n}\n.ace-jsoneditor .ace_marker-layer .ace_step {\nbackground: rgb(255, 255, 0)\n}\n.ace-jsoneditor .ace_marker-layer .ace_bracket {\nmargin: -1px 0 0 -1px;\nborder: 1px solid #BFBFBF\n}\n.ace-jsoneditor .ace_marker-layer .ace_active-line {\nbackground: #FFFBD1\n}\n.ace-jsoneditor .ace_gutter-active-line {\nbackground-color : #dcdcdc\n}\n.ace-jsoneditor .ace_marker-layer .ace_selected-word {\nborder: 1px solid lightgray\n}\n.ace-jsoneditor .ace_invisible {\ncolor: #BFBFBF\n}\n.ace-jsoneditor .ace_keyword,\n.ace-jsoneditor .ace_meta,\n.ace-jsoneditor .ace_support.ace_constant.ace_property-value {\ncolor: #AF956F\n}\n.ace-jsoneditor .ace_keyword.ace_operator {\ncolor: #484848\n}\n.ace-jsoneditor .ace_keyword.ace_other.ace_unit {\ncolor: #96DC5F\n}\n.ace-jsoneditor .ace_constant.ace_language {\ncolor: darkorange\n}\n.ace-jsoneditor .ace_constant.ace_numeric {\ncolor: red\n}\n.ace-jsoneditor .ace_constant.ace_character.ace_entity {\ncolor: #BF78CC\n}\n.ace-jsoneditor .ace_invalid {\ncolor: #FFFFFF;\nbackground-color: #FF002A;\n}\n.ace-jsoneditor .ace_fold {\nbackground-color: #AF956F;\nborder-color: #000000\n}\n.ace-jsoneditor .ace_storage,\n.ace-jsoneditor .ace_support.ace_class,\n.ace-jsoneditor .ace_support.ace_function,\n.ace-jsoneditor .ace_support.ace_other,\n.ace-jsoneditor .ace_support.ace_type {\ncolor: #C52727\n}\n.ace-jsoneditor .ace_string {\ncolor: green\n}\n.ace-jsoneditor .ace_comment {\ncolor: #BCC8BA\n}\n.ace-jsoneditor .ace_entity.ace_name.ace_tag,\n.ace-jsoneditor .ace_entity.ace_other.ace_attribute-name {\ncolor: #606060\n}\n.ace-jsoneditor .ace_markup.ace_underline {\ntext-decoration: underline\n}\n.ace-jsoneditor .ace_indent-guide {\nbackground: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y\n}', e("../lib/dom").importCssString(t.cssText, t.cssClass)
            })
        }, 6589: function (e, t) {
            var i = function () {
                var e, t = {
                    trace: function () {
                    },
                    yy: {},
                    symbols_: {
                        error: 2,
                        JSONString: 3,
                        STRING: 4,
                        JSONNumber: 5,
                        NUMBER: 6,
                        JSONNullLiteral: 7,
                        NULL: 8,
                        JSONBooleanLiteral: 9,
                        TRUE: 10,
                        FALSE: 11,
                        JSONText: 12,
                        JSONValue: 13,
                        EOF: 14,
                        JSONObject: 15,
                        JSONArray: 16,
                        "{": 17,
                        "}": 18,
                        JSONMemberList: 19,
                        JSONMember: 20,
                        ":": 21,
                        ",": 22,
                        "[": 23,
                        "]": 24,
                        JSONElementList: 25,
                        $accept: 0,
                        $end: 1
                    },
                    terminals_: {
                        2: "error",
                        4: "STRING",
                        6: "NUMBER",
                        8: "NULL",
                        10: "TRUE",
                        11: "FALSE",
                        14: "EOF",
                        17: "{",
                        18: "}",
                        21: ":",
                        22: ",",
                        23: "[",
                        24: "]"
                    },
                    productions_: [0, [3, 1], [5, 1], [7, 1], [9, 1], [9, 1], [12, 2], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [15, 2], [15, 3], [20, 3], [19, 1], [19, 3], [16, 2], [16, 3], [25, 1], [25, 3]],
                    performAction: function (e, t, i, n, r, o, s) {
                        var a = o.length - 1;
                        switch (r) {
                            case 1:
                                this.$ = e.replace(/\\(\\|")/g, "$1").replace(/\\n/g, "\n").replace(/\\r/g, "\r").replace(/\\t/g, "\t").replace(/\\v/g, "\v").replace(/\\f/g, "\f").replace(/\\b/g, "\b");
                                break;
                            case 2:
                                this.$ = Number(e);
                                break;
                            case 3:
                                this.$ = null;
                                break;
                            case 4:
                                this.$ = !0;
                                break;
                            case 5:
                                this.$ = !1;
                                break;
                            case 6:
                                return this.$ = o[a - 1];
                            case 13:
                                this.$ = {};
                                break;
                            case 14:
                                this.$ = o[a - 1];
                                break;
                            case 15:
                                this.$ = [o[a - 2], o[a]];
                                break;
                            case 16:
                                this.$ = {}, this.$[o[a][0]] = o[a][1];
                                break;
                            case 17:
                                this.$ = o[a - 2], o[a - 2][o[a][0]] = o[a][1];
                                break;
                            case 18:
                                this.$ = [];
                                break;
                            case 19:
                                this.$ = o[a - 1];
                                break;
                            case 20:
                                this.$ = [o[a]];
                                break;
                            case 21:
                                this.$ = o[a - 2], o[a - 2].push(o[a])
                        }
                    },
                    table: [{
                        3: 5,
                        4: [1, 12],
                        5: 6,
                        6: [1, 13],
                        7: 3,
                        8: [1, 9],
                        9: 4,
                        10: [1, 10],
                        11: [1, 11],
                        12: 1,
                        13: 2,
                        15: 7,
                        16: 8,
                        17: [1, 14],
                        23: [1, 15]
                    }, {1: [3]}, {14: [1, 16]}, {14: [2, 7], 18: [2, 7], 22: [2, 7], 24: [2, 7]}, {
                        14: [2, 8],
                        18: [2, 8],
                        22: [2, 8],
                        24: [2, 8]
                    }, {14: [2, 9], 18: [2, 9], 22: [2, 9], 24: [2, 9]}, {
                        14: [2, 10],
                        18: [2, 10],
                        22: [2, 10],
                        24: [2, 10]
                    }, {14: [2, 11], 18: [2, 11], 22: [2, 11], 24: [2, 11]}, {
                        14: [2, 12],
                        18: [2, 12],
                        22: [2, 12],
                        24: [2, 12]
                    }, {14: [2, 3], 18: [2, 3], 22: [2, 3], 24: [2, 3]}, {
                        14: [2, 4],
                        18: [2, 4],
                        22: [2, 4],
                        24: [2, 4]
                    }, {14: [2, 5], 18: [2, 5], 22: [2, 5], 24: [2, 5]}, {
                        14: [2, 1],
                        18: [2, 1],
                        21: [2, 1],
                        22: [2, 1],
                        24: [2, 1]
                    }, {14: [2, 2], 18: [2, 2], 22: [2, 2], 24: [2, 2]}, {
                        3: 20,
                        4: [1, 12],
                        18: [1, 17],
                        19: 18,
                        20: 19
                    }, {
                        3: 5,
                        4: [1, 12],
                        5: 6,
                        6: [1, 13],
                        7: 3,
                        8: [1, 9],
                        9: 4,
                        10: [1, 10],
                        11: [1, 11],
                        13: 23,
                        15: 7,
                        16: 8,
                        17: [1, 14],
                        23: [1, 15],
                        24: [1, 21],
                        25: 22
                    }, {1: [2, 6]}, {14: [2, 13], 18: [2, 13], 22: [2, 13], 24: [2, 13]}, {
                        18: [1, 24],
                        22: [1, 25]
                    }, {18: [2, 16], 22: [2, 16]}, {21: [1, 26]}, {
                        14: [2, 18],
                        18: [2, 18],
                        22: [2, 18],
                        24: [2, 18]
                    }, {22: [1, 28], 24: [1, 27]}, {22: [2, 20], 24: [2, 20]}, {
                        14: [2, 14],
                        18: [2, 14],
                        22: [2, 14],
                        24: [2, 14]
                    }, {3: 20, 4: [1, 12], 20: 29}, {
                        3: 5,
                        4: [1, 12],
                        5: 6,
                        6: [1, 13],
                        7: 3,
                        8: [1, 9],
                        9: 4,
                        10: [1, 10],
                        11: [1, 11],
                        13: 30,
                        15: 7,
                        16: 8,
                        17: [1, 14],
                        23: [1, 15]
                    }, {14: [2, 19], 18: [2, 19], 22: [2, 19], 24: [2, 19]}, {
                        3: 5,
                        4: [1, 12],
                        5: 6,
                        6: [1, 13],
                        7: 3,
                        8: [1, 9],
                        9: 4,
                        10: [1, 10],
                        11: [1, 11],
                        13: 31,
                        15: 7,
                        16: 8,
                        17: [1, 14],
                        23: [1, 15]
                    }, {18: [2, 17], 22: [2, 17]}, {18: [2, 15], 22: [2, 15]}, {22: [2, 21], 24: [2, 21]}],
                    defaultActions: {16: [2, 6]},
                    parseError: function (e, t) {
                        throw new Error(e)
                    },
                    parse: function (e) {
                        var t = this, i = [0], n = [null], r = [], o = this.table, s = "", a = 0, l = 0, c = 0;
                        this.lexer.setInput(e), this.lexer.yy = this.yy, this.yy.lexer = this.lexer, void 0 === this.lexer.yylloc && (this.lexer.yylloc = {});
                        var h = this.lexer.yylloc;

                        function d() {
                            var e = t.lexer.lex() || 1;
                            return e = "number" != typeof e ? t.symbols_[e] || e : e
                        }

                        r.push(h), "function" == typeof this.yy.parseError && (this.parseError = this.yy.parseError);
                        for (var u, g, p, m, f, C, I, v, A, b = {}; ;) {
                            if (p = i[i.length - 1], void 0 === (m = this.defaultActions[p] || (null == u && (u = d()), o[p] && o[p][u])) || !m.length || !m[0]) {
                                if (!c) {
                                    for (C in v = [], o[p]) this.terminals_[C] && 2 < C && v.push("'" + this.terminals_[C] + "'");
                                    var y = "",
                                        y = this.lexer.showPosition ? "Parse error on line " + (a + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + v.join(", ") + ", got '" + this.terminals_[u] + "'" : "Parse error on line " + (a + 1) + ": Unexpected " + (1 == u ? "end of input" : "'" + (this.terminals_[u] || u) + "'");
                                    this.parseError(y, {
                                        text: this.lexer.match,
                                        token: this.terminals_[u] || u,
                                        line: this.lexer.yylineno,
                                        loc: h,
                                        expected: v
                                    })
                                }
                                if (3 == c) {
                                    if (1 == u) throw new Error(y || "Parsing halted.");
                                    l = this.lexer.yyleng, s = this.lexer.yytext, a = this.lexer.yylineno, h = this.lexer.yylloc, u = d()
                                }
                                for (; ;) {
                                    if (2..toString() in o[p]) break;
                                    if (0 == p) throw new Error(y || "Parsing halted.");
                                    A = 1, i.length = i.length - 2 * A, n.length = n.length - A, r.length = r.length - A, p = i[i.length - 1]
                                }
                                g = u, u = 2, m = o[p = i[i.length - 1]] && o[p][2], c = 3
                            }
                            if (m[0] instanceof Array && 1 < m.length) throw new Error("Parse Error: multiple actions possible at state: " + p + ", token: " + u);
                            switch (m[0]) {
                                case 1:
                                    i.push(u), n.push(this.lexer.yytext), r.push(this.lexer.yylloc), i.push(m[1]), u = null, g ? (u = g, g = null) : (l = this.lexer.yyleng, s = this.lexer.yytext, a = this.lexer.yylineno, h = this.lexer.yylloc, 0 < c && c--);
                                    break;
                                case 2:
                                    if (I = this.productions_[m[1]][1], b.$ = n[n.length - I], b._$ = {
                                        first_line: r[r.length - (I || 1)].first_line,
                                        last_line: r[r.length - 1].last_line,
                                        first_column: r[r.length - (I || 1)].first_column,
                                        last_column: r[r.length - 1].last_column
                                    }, void 0 !== (f = this.performAction.call(b, s, l, a, this.yy, m[1], n, r))) return f;
                                    I && (i = i.slice(0, -1 * I * 2), n = n.slice(0, -1 * I), r = r.slice(0, -1 * I)), i.push(this.productions_[m[1]][0]), n.push(b.$), r.push(b._$), I = o[i[i.length - 2]][i[i.length - 1]], i.push(I);
                                    break;
                                case 3:
                                    return !0
                            }
                        }
                        return !0
                    }
                };
                e = {
                    EOF: 1,
                    parseError: function (e, t) {
                        if (!this.yy.parseError) throw new Error(e);
                        this.yy.parseError(e, t)
                    },
                    setInput: function (e) {
                        return this._input = e, this._more = this._less = this.done = !1, this.yylineno = this.yyleng = 0, this.yytext = this.matched = this.match = "", this.conditionStack = ["INITIAL"], this.yylloc = {
                            first_line: 1,
                            first_column: 0,
                            last_line: 1,
                            last_column: 0
                        }, this
                    },
                    input: function () {
                        var e = this._input[0];
                        return this.yytext += e, this.yyleng++, this.match += e, this.matched += e, e.match(/\n/) && this.yylineno++, this._input = this._input.slice(1), e
                    },
                    unput: function (e) {
                        return this._input = e + this._input, this
                    },
                    more: function () {
                        return this._more = !0, this
                    },
                    less: function (e) {
                        this._input = this.match.slice(e) + this._input
                    },
                    pastInput: function () {
                        var e = this.matched.substr(0, this.matched.length - this.match.length);
                        return (20 < e.length ? "..." : "") + e.substr(-20).replace(/\n/g, "")
                    },
                    upcomingInput: function () {
                        var e = this.match;
                        return e.length < 20 && (e += this._input.substr(0, 20 - e.length)), (e.substr(0, 20) + (20 < e.length ? "..." : "")).replace(/\n/g, "")
                    },
                    showPosition: function () {
                        var e = this.pastInput(), t = new Array(e.length + 1).join("-");
                        return e + this.upcomingInput() + "\n" + t + "^"
                    },
                    next: function () {
                        if (this.done) return this.EOF;
                        var e, t, i, n;
                        this._input || (this.done = !0), this._more || (this.yytext = "", this.match = "");
                        for (var r = this._currentRules(), o = 0; o < r.length && (!(t = this._input.match(this.rules[r[o]])) || e && !(t[0].length > e[0].length) || (e = t, i = o, this.options.flex)); o++) ;
                        return e ? ((n = e[0].match(/\n.*/g)) && (this.yylineno += n.length), this.yylloc = {
                            first_line: this.yylloc.last_line,
                            last_line: this.yylineno + 1,
                            first_column: this.yylloc.last_column,
                            last_column: n ? n[n.length - 1].length - 1 : this.yylloc.last_column + e[0].length
                        }, this.yytext += e[0], this.match += e[0], this.yyleng = this.yytext.length, this._more = !1, this._input = this._input.slice(e[0].length), this.matched += e[0], n = this.performAction.call(this, this.yy, this, r[i], this.conditionStack[this.conditionStack.length - 1]), this.done && this._input && (this.done = !1), n || void 0) : "" === this._input ? this.EOF : void this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), {
                            text: "",
                            token: null,
                            line: this.yylineno
                        })
                    },
                    lex: function () {
                        var e = this.next();
                        return void 0 !== e ? e : this.lex()
                    },
                    begin: function (e) {
                        this.conditionStack.push(e)
                    },
                    popState: function () {
                        return this.conditionStack.pop()
                    },
                    _currentRules: function () {
                        return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules
                    },
                    topState: function () {
                        return this.conditionStack[this.conditionStack.length - 2]
                    },
                    pushState: function (e) {
                        this.begin(e)
                    },
                    options: {},
                    performAction: function (e, t, i, n) {
                        switch (i) {
                            case 0:
                                break;
                            case 1:
                                return 6;
                            case 2:
                                return t.yytext = t.yytext.substr(1, t.yyleng - 2), 4;
                            case 3:
                                return 17;
                            case 4:
                                return 18;
                            case 5:
                                return 23;
                            case 6:
                                return 24;
                            case 7:
                                return 22;
                            case 8:
                                return 21;
                            case 9:
                                return 10;
                            case 10:
                                return 11;
                            case 11:
                                return 8;
                            case 12:
                                return 14;
                            case 13:
                                return "INVALID"
                        }
                    },
                    rules: [/^(?:\s+)/, /^(?:(-?([0-9]|[1-9][0-9]+))(\.[0-9]+)?([eE][-+]?[0-9]+)?\b)/, /^(?:"(?:\\[\\"bfnrt/]|\\u[a-fA-F0-9]{4}|[^\\\0-\x09\x0a-\x1f"])*")/, /^(?:\{)/, /^(?:\})/, /^(?:\[)/, /^(?:\])/, /^(?:,)/, /^(?::)/, /^(?:true\b)/, /^(?:false\b)/, /^(?:null\b)/, /^(?:$)/, /^(?:.)/],
                    conditions: {INITIAL: {rules: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], inclusive: !0}}
                };
                return t.lexer = e, t
            }();
            t.parser = i, t.parse = i.parse.bind(i)
        }, 3879: function (e) {
            "use strict";

            function n() {
            }

            var i = {
                defaultSelected: !0,
                width: "auto",
                disabled: !1,
                searchable: !0,
                clearable: !1,
                sortSelected: !1,
                allowDeselect: !1,
                closeOnScroll: !1,
                nativeDropdown: !1,
                placeholder: "Select an option...",
                taggable: !1,
                tagPlaceholder: "Enter a tag..."
            };
            n.prototype = {
                on: function (e, t) {
                    this._events = this._events || {}, this._events[e] = this._events[e] || [], this._events[e].push(t)
                }, off: function (e, t) {
                    this._events = this._events || {}, e in this._events != !1 && this._events[e].splice(this._events[e].indexOf(t), 1)
                }, emit: function (e) {
                    if (this._events = this._events || {}, e in this._events != !1) for (var t = 0; t < this._events[e].length; t++) this._events[e][t].apply(this, Array.prototype.slice.call(arguments, 1))
                }
            }, n.mixin = function (e) {
                for (var t = ["on", "off", "emit"], i = 0; i < t.length; i++) "function" == typeof e ? e.prototype[t[i]] = n.prototype[t[i]] : e[t[i]] = n.prototype[t[i]];
                return e
            };
            var h = {
                extend: function (e, t) {
                    for (var i in t = t || {}, e) e.hasOwnProperty(i) && (t.hasOwnProperty(i) || (t[i] = e[i]));
                    return t
                }, each: function (e, t, i) {
                    if ("[object Object]" === Object.prototype.toString.call(e)) for (var n in e) Object.prototype.hasOwnProperty.call(e, n) && t.call(i, n, e[n], e); else for (var r = 0, o = e.length; r < o; r++) t.call(i, r, e[r], e)
                }, createElement: function (e, t) {
                    var i, n, r = document, o = r.createElement(e);
                    if (t && "[object Object]" === Object.prototype.toString.call(t)) for (i in t) i in o ? o[i] = t[i] : "html" === i ? o.textContent = t[i] : "text" === i ? (n = r.createTextNode(t[i]), o.appendChild(n)) : o.setAttribute(i, t[i]);
                    return o
                }, hasClass: function (e, t) {
                    if (e) return e.classList ? e.classList.contains(t) : !!e.className && !!e.className.match(new RegExp("(\\s|^)" + t + "(\\s|$)"))
                }, addClass: function (e, t) {
                    h.hasClass(e, t) || (e.classList ? e.classList.add(t) : e.className = e.className.trim() + " " + t)
                }, removeClass: function (e, t) {
                    h.hasClass(e, t) && (e.classList ? e.classList.remove(t) : e.className = e.className.replace(new RegExp("(^|\\s)" + t.split(" ").join("|") + "(\\s|$)", "gi"), " "))
                }, closest: function (e, t) {
                    return e && e !== document.body && (t(e) ? e : h.closest(e.parentNode, t))
                }, isInt: function (e) {
                    return "number" == typeof e && isFinite(e) && Math.floor(e) === e
                }, debounce: function (n, r, o) {
                    var s;
                    return function () {
                        var e = this, t = arguments, i = o && !s;
                        clearTimeout(s), s = setTimeout(function () {
                            s = null, o || n.apply(e, t)
                        }, r), i && n.apply(e, t)
                    }
                }, rect: function (e, t) {
                    var i = window, n = e.getBoundingClientRect(), e = t ? i.pageXOffset : 0, i = t ? i.pageYOffset : 0;
                    return {
                        bottom: n.bottom + i,
                        height: n.height,
                        left: n.left + e,
                        right: n.right + e,
                        top: n.top + i,
                        width: n.width
                    }
                }, includes: function (e, t) {
                    return -1 < e.indexOf(t)
                }, truncate: function (e) {
                    for (; e.firstChild;) e.removeChild(e.firstChild)
                }
            };

            function l(e, t) {
                return e.hasOwnProperty(t) && (!0 === e[t] || e[t].length)
            }

            function s(e, t, i) {
                e.parentNode ? e.parentNode.parentNode || t.appendChild(e.parentNode) : t.appendChild(e), h.removeClass(e, "excluded"), i || (e.textContent = e.textContent + "")
            }

            function a() {
                var i, e;
                this.items.length && (i = document.createDocumentFragment(), this.config.pagination ? (e = this.pages.slice(0, this.pageIndex), h.each(e, function (e, t) {
                    h.each(t, function (e, t) {
                        s(t, i, this.customOption)
                    }, this)
                }, this)) : h.each(this.items, function (e, t) {
                    s(t, i, this.customOption)
                }, this), i.childElementCount && (h.removeClass(this.items[this.navIndex], "active"), this.navIndex = i.querySelector(".selectr-option").idx, h.addClass(this.items[this.navIndex], "active")), this.tree.appendChild(i))
            }

            function c(e, t) {
                return t = t || e, t = this.customOption ? this.config.renderOption(t) : e.textContent, (t = h.createElement("li", {
                    class: "selectr-option",
                    html: t,
                    role: "treeitem",
                    "aria-selected": !1
                })).idx = e.idx, this.items.push(t), e.defaultSelected && this.defaultSelected.push(e.idx), e.disabled && (t.disabled = !0, h.addClass(t, "disabled")), t
            }

            function r() {
                var i, e = this.tree, t = e.scrollTop;
                e.scrollHeight - e.offsetHeight <= t && this.pageIndex < this.pages.length && (i = document.createDocumentFragment(), h.each(this.pages[this.pageIndex], function (e, t) {
                    s(t, i, this.customOption)
                }, this), e.appendChild(i), this.pageIndex++, this.emit("selectr.paginate", {
                    items: this.items.length,
                    total: this.data.length,
                    page: this.pageIndex,
                    pages: this.pages.length
                }))
            }

            function t() {
                (this.config.searchable || this.config.taggable) && (this.input.value = null, this.searching = !1, this.config.searchable && h.removeClass(this.inputContainer, "active"), h.hasClass(this.container, "notice") && (h.removeClass(this.container, "notice"), h.addClass(this.container, "open"), this.input.focus()), h.each(this.items, function (e, t) {
                    h.removeClass(t, "excluded"), this.customOption || (t.textContent = t.textContent + "")
                }, this))
            }

            function o(e, t) {
                if (t = t || {}, !e) throw new Error("You must supply either a HTMLSelectElement or a CSS3 selector string.");
                if ("string" == typeof (this.el = e) && (this.el = document.querySelector(e)), null === this.el) throw new Error("The element you passed to Selectr can not be found.");
                if ("select" !== this.el.nodeName.toLowerCase()) throw new Error("The element you passed to Selectr is not a HTMLSelectElement.");
                this.render(t)
            }

            o.prototype.render = function (e) {
                var t;
                this.rendered || (this.config = h.extend(i, e), this.originalType = this.el.type, this.originalIndex = this.el.tabIndex, this.defaultSelected = [], this.originalOptionCount = this.el.options.length, (this.config.multiple || this.config.taggable) && (this.el.multiple = !0), this.disabled = l(this.config, "disabled"), this.opened = !1, this.config.taggable && (this.config.searchable = !1), this.navigating = !1, this.mobileDevice = !1, /Android|webOS|iPhone|iPad|BlackBerry|Windows Phone|Opera Mini|IEMobile|Mobile/i.test(navigator.userAgent) && (this.mobileDevice = !0), this.customOption = this.config.hasOwnProperty("renderOption") && "function" == typeof this.config.renderOption, this.customSelected = this.config.hasOwnProperty("renderSelection") && "function" == typeof this.config.renderSelection, n.mixin(this), function () {
                    this.requiresPagination = this.config.pagination && 0 < this.config.pagination, l(this.config, "width") && (h.isInt(this.config.width) ? this.width = this.config.width + "px" : "auto" === this.config.width ? this.width = "100%" : h.includes(this.config.width, "%") && (this.width = this.config.width)), this.container = h.createElement("div", {class: "selectr-container"}), this.config.customClass && h.addClass(this.container, this.config.customClass), this.mobileDevice ? h.addClass(this.container, "selectr-mobile") : h.addClass(this.container, "selectr-desktop"), this.el.tabIndex = -1, this.config.nativeDropdown || this.mobileDevice ? h.addClass(this.el, "selectr-visible") : h.addClass(this.el, "selectr-hidden"), this.selected = h.createElement("div", {
                        class: "selectr-selected",
                        disabled: this.disabled,
                        tabIndex: 1,
                        "aria-expanded": !1
                    }), this.label = h.createElement(this.el.multiple ? "ul" : "span", {class: "selectr-label"});
                    var e, t = h.createElement("div", {class: "selectr-options-container"});
                    this.tree = h.createElement("ul", {
                        class: "selectr-options",
                        role: "tree",
                        "aria-hidden": !0,
                        "aria-expanded": !1
                    }), this.notice = h.createElement("div", {class: "selectr-notice"}), this.el.setAttribute("aria-hidden", !0), this.disabled && (this.el.disabled = !0), this.el.multiple && (h.addClass(this.label, "selectr-tags"), h.addClass(this.container, "multiple"), this.tags = [], this.selectedValues = this.getSelectedProperties("value"), this.selectedIndexes = this.getSelectedProperties("idx")), this.selected.appendChild(this.label), this.config.clearable && (this.selectClear = h.createElement("button", {
                        class: "selectr-clear",
                        type: "button"
                    }), this.container.appendChild(this.selectClear), h.addClass(this.container, "clearable")), this.config.taggable && (e = h.createElement("li", {class: "input-tag"}), this.input = h.createElement("input", {
                        class: "selectr-tag-input",
                        placeholder: this.config.tagPlaceholder,
                        tagIndex: 0,
                        autocomplete: "off",
                        autocorrect: "off",
                        autocapitalize: "off",
                        spellcheck: "false",
                        role: "textbox",
                        type: "search"
                    }), e.appendChild(this.input), this.label.appendChild(e), h.addClass(this.container, "taggable"), this.tagSeperators = [","], this.config.tagSeperators && (this.tagSeperators = this.tagSeperators.concat(this.config.tagSeperators))), this.config.searchable && (this.input = h.createElement("input", {
                        class: "selectr-input",
                        tagIndex: -1,
                        autocomplete: "off",
                        autocorrect: "off",
                        autocapitalize: "off",
                        spellcheck: "false",
                        role: "textbox",
                        type: "search"
                    }), this.inputClear = h.createElement("button", {
                        class: "selectr-input-clear",
                        type: "button"
                    }), this.inputContainer = h.createElement("div", {class: "selectr-input-container"}), this.inputContainer.appendChild(this.input), this.inputContainer.appendChild(this.inputClear), t.appendChild(this.inputContainer)), t.appendChild(this.notice), t.appendChild(this.tree), this.items = [], this.options = [], this.el.options.length && (this.options = [].slice.call(this.el.options));
                    var i, n, r, o = !1, s = 0;
                    this.el.children.length && h.each(this.el.children, function (e, t) {
                        "OPTGROUP" === t.nodeName ? (o = h.createElement("ul", {
                            class: "selectr-optgroup",
                            role: "group",
                            html: "<li class='selectr-optgroup--label'>" + t.label + "</li>"
                        }), h.each(t.children, function (e, t) {
                            t.idx = s, o.appendChild(c.call(this, t, o)), s++
                        }, this)) : (t.idx = s, c.call(this, t), s++)
                    }, this), this.config.data && Array.isArray(this.config.data) && (i = !(this.data = []), o = !1, s = 0, h.each(this.config.data, function (e, t) {
                        l(t, "children") ? (i = h.createElement("optgroup", {label: t.text}), o = h.createElement("ul", {
                            class: "selectr-optgroup",
                            role: "group",
                            html: "<li class='selectr-optgroup--label'>" + t.text + "</li>"
                        }), h.each(t.children, function (e, t) {
                            (n = new Option(t.text, t.value, !1, t.hasOwnProperty("selected") && !0 === t.selected)).disabled = l(t, "disabled"), this.options.push(n), i.appendChild(n), n.idx = s, o.appendChild(c.call(this, n, t)), this.data[s] = t, s++
                        }, this)) : ((n = new Option(t.text, t.value, !1, t.hasOwnProperty("selected") && !0 === t.selected)).disabled = l(t, "disabled"), this.options.push(n), n.idx = s, c.call(this, n, t), this.data[s] = t, s++)
                    }, this)), this.setSelected(!0);
                    for (var a = this.navIndex = 0; a < this.items.length; a++) if (r = this.items[a], !h.hasClass(r, "disabled")) {
                        h.addClass(r, "active"), this.navIndex = a;
                        break
                    }
                    this.requiresPagination && (this.pageIndex = 1, this.paginate()), this.container.appendChild(this.selected), this.container.appendChild(t), this.placeEl = h.createElement("div", {class: "selectr-placeholder"}), this.setPlaceholder(), this.selected.appendChild(this.placeEl), this.disabled && this.disable(), this.el.parentNode.insertBefore(this.container, this.el), this.container.appendChild(this.el)
                }.call(this), this.bindEvents(), this.update(), this.optsRect = h.rect(this.tree), this.rendered = !0, this.el.multiple || (this.el.selectedIndex = this.selectedIndex), t = this, setTimeout(function () {
                    t.emit("selectr.init")
                }, 20))
            }, o.prototype.getSelected = function () {
                return this.el.querySelectorAll("option:checked")
            }, o.prototype.getSelectedProperties = function (t) {
                var e = this.getSelected();
                return [].slice.call(e).map(function (e) {
                    return e[t]
                }).filter(function (e) {
                    return null != e
                })
            }, o.prototype.bindEvents = function () {
                var n = this;
                this.events = {}, this.events.dismiss = function (e) {
                    e = e.target;
                    this.container.contains(e) || !this.opened && !h.hasClass(this.container, "notice") || this.close()
                }.bind(this), this.events.navigate = function (e) {
                    if (e = e || window.event, this.items.length && this.opened && h.includes([13, 38, 40], e.which)) {
                        if (e.preventDefault(), 13 === e.which) return !(this.config.taggable && 0 < this.input.value.length) && this.change(this.navIndex);
                        var t, i = this.items[this.navIndex];
                        switch (e.which) {
                            case 38:
                                (t = 0) < this.navIndex && this.navIndex--;
                                break;
                            case 40:
                                this.navIndex < this.items.length - (t = 1) && this.navIndex++
                        }
                        for (this.navigating = !0; h.hasClass(this.items[this.navIndex], "disabled") || h.hasClass(this.items[this.navIndex], "excluded");) if (t ? this.navIndex++ : this.navIndex--, this.searching) {
                            if (this.navIndex > this.tree.lastElementChild.idx) {
                                this.navIndex = this.tree.lastElementChild.idx;
                                break
                            }
                            if (this.navIndex < this.tree.firstElementChild.idx) {
                                this.navIndex = this.tree.firstElementChild.idx;
                                break
                            }
                        }
                        e = h.rect(this.items[this.navIndex]);
                        t ? (0 === this.navIndex ? this.tree.scrollTop = 0 : e.top + e.height > this.optsRect.top + this.optsRect.height && (this.tree.scrollTop = this.tree.scrollTop + (e.top + e.height - (this.optsRect.top + this.optsRect.height))), this.navIndex === this.tree.childElementCount - 1 && this.requiresPagination && r.call(this)) : 0 === this.navIndex ? this.tree.scrollTop = 0 : e.top - this.optsRect.top < 0 && (this.tree.scrollTop = this.tree.scrollTop + (e.top - this.optsRect.top)), i && h.removeClass(i, "active"), h.addClass(this.items[this.navIndex], "active")
                    } else this.navigating = !1
                }.bind(this), this.events.reset = this.reset.bind(this), (this.config.nativeDropdown || this.mobileDevice) && (this.container.addEventListener("touchstart", function (e) {
                    e.changedTouches[0].target === n.el && n.toggle()
                }), (this.config.nativeDropdown || this.mobileDevice) && this.container.addEventListener("click", function (e) {
                    e.preventDefault(), e.stopPropagation(), e.target === n.el && n.toggle()
                }), this.el.addEventListener("change", function (e) {
                    var t;
                    n.el.multiple ? (t = n.getSelectedProperties("idx"), t = function (e, t) {
                        for (var i, n = [], r = e.slice(0), o = 0; o < t.length; o++) -1 < (i = r.indexOf(t[o])) ? r.splice(i, 1) : n.push(t[o]);
                        return [n, r]
                    }(n.selectedIndexes, t), h.each(t[0], function (e, t) {
                        n.select(t)
                    }, n), h.each(t[1], function (e, t) {
                        n.deselect(t)
                    }, n)) : -1 < n.el.selectedIndex && n.select(n.el.selectedIndex)
                })), this.config.nativeDropdown && this.container.addEventListener("keydown", function (e) {
                    "Enter" === e.key && n.selected === document.activeElement && (n.toggle(), setTimeout(function () {
                        n.el.focus()
                    }, 200))
                }), this.selected.addEventListener("click", function (e) {
                    n.disabled || n.toggle(), e.preventDefault(), e.stopPropagation()
                }), this.label.addEventListener("click", function (e) {
                    h.hasClass(e.target, "selectr-tag-remove") && n.deselect(e.target.parentNode.idx)
                }), this.selectClear && this.selectClear.addEventListener("click", this.clear.bind(this)), this.tree.addEventListener("mousedown", function (e) {
                    e.preventDefault()
                }), this.tree.addEventListener("click", function (e) {
                    e.preventDefault(), e.stopPropagation();
                    e = h.closest(e.target, function (e) {
                        return e && h.hasClass(e, "selectr-option")
                    });
                    e && (h.hasClass(e, "disabled") || (h.hasClass(e, "selected") ? (n.el.multiple || !n.el.multiple && n.config.allowDeselect) && n.deselect(e.idx) : n.select(e.idx), n.opened && !n.el.multiple && n.close()))
                }), this.tree.addEventListener("mouseover", function (e) {
                    h.hasClass(e.target, "selectr-option") && (h.hasClass(e.target, "disabled") || (h.removeClass(n.items[n.navIndex], "active"), h.addClass(e.target, "active"), n.navIndex = [].slice.call(n.items).indexOf(e.target)))
                }), this.config.searchable && (this.input.addEventListener("focus", function (e) {
                    n.searching = !0
                }), this.input.addEventListener("blur", function (e) {
                    n.searching = !1
                }), this.input.addEventListener("keyup", function (e) {
                    n.search(), n.config.taggable || (this.value.length ? h.addClass(this.parentNode, "active") : h.removeClass(this.parentNode, "active"))
                }), this.inputClear.addEventListener("click", function (e) {
                    n.input.value = null, t.call(n), n.tree.childElementCount || a.call(n)
                })), this.config.taggable && this.input.addEventListener("keyup", function (e) {
                    var i;
                    n.search(), n.config.taggable && this.value.length && (i = this.value.trim(), 13 !== e.which && !h.includes(n.tagSeperators, e.key) || (h.each(n.tagSeperators, function (e, t) {
                        i = i.replace(t, "")
                    }), n.add({
                        value: i,
                        text: i,
                        selected: !0
                    }, !0) ? (n.close(), t.call(n)) : (this.value = "", n.setMessage("That tag is already in use."))))
                }), this.update = h.debounce(function () {
                    n.opened && n.config.closeOnScroll && n.close(), n.width && (n.container.style.width = n.width), n.invert()
                }, 50), this.requiresPagination && (this.paginateItems = h.debounce(function () {
                    r.call(this)
                }, 50), this.tree.addEventListener("scroll", this.paginateItems.bind(this))), document.addEventListener("click", this.events.dismiss), window.addEventListener("keydown", this.events.navigate), window.addEventListener("resize", this.update), window.addEventListener("scroll", this.update), this.el.form && this.el.form.addEventListener("reset", this.events.reset)
            }, o.prototype.setSelected = function (e) {
                var i;
                this.config.data || this.el.multiple || !this.el.options.length || (0 === this.el.selectedIndex && (this.el.options[0].defaultSelected || this.config.defaultSelected || (this.el.selectedIndex = -1)), this.selectedIndex = this.el.selectedIndex, -1 < this.selectedIndex && this.select(this.selectedIndex)), this.config.multiple && "select-one" === this.originalType && !this.config.data && this.el.options[0].selected && !this.el.options[0].defaultSelected && (this.el.options[0].selected = !1), h.each(this.options, function (e, t) {
                    t.selected && t.defaultSelected && this.select(t.idx)
                }, this), this.config.selectedValue && this.setValue(this.config.selectedValue), this.config.data && (!this.el.multiple && this.config.defaultSelected && this.el.selectedIndex < 0 && this.select(0), i = 0, h.each(this.config.data, function (e, t) {
                    l(t, "children") ? h.each(t.children, function (e, t) {
                        t.hasOwnProperty("selected") && !0 === t.selected && this.select(i), i++
                    }, this) : (t.hasOwnProperty("selected") && !0 === t.selected && this.select(i), i++)
                }, this))
            }, o.prototype.destroy = function () {
                this.rendered && (this.emit("selectr.destroy"), "select-one" === this.originalType && (this.el.multiple = !1), this.config.data && (this.el.textContent = ""), h.removeClass(this.el, "selectr-hidden"), this.el.form && h.off(this.el.form, "reset", this.events.reset), h.off(document, "click", this.events.dismiss), h.off(document, "keydown", this.events.navigate), h.off(window, "resize", this.update), h.off(window, "scroll", this.update), this.container.parentNode.replaceChild(this.el, this.container), this.rendered = !1)
            }, o.prototype.change = function (e) {
                var t = this.items[e], i = this.options[e];
                i.disabled || (i.selected && h.hasClass(t, "selected") ? this.deselect(e) : this.select(e), this.opened && !this.el.multiple && this.close())
            }, o.prototype.select = function (n) {
                var e = this.items[n], t = [].slice.call(this.el.options), i = this.options[n];
                if (this.el.multiple) {
                    if (h.includes(this.selectedIndexes, n)) return !1;
                    if (this.config.maxSelections && this.tags.length === this.config.maxSelections) return this.setMessage("A maximum of " + this.config.maxSelections + " items can be selected.", !0), !1;
                    this.selectedValues.push(i.value), this.selectedIndexes.push(n), function (e) {
                        var l, c = this, i = document.createDocumentFragment(), t = this.options[e.idx],
                            n = this.data ? this.data[e.idx] : t,
                            r = this.customSelected ? this.config.renderSelection(n) : t.textContent,
                            n = h.createElement("li", {class: "selectr-tag", html: r}),
                            r = h.createElement("button", {class: "selectr-tag-remove", type: "button"});
                        n.appendChild(r), n.idx = e.idx, n.tag = t.value, this.tags.push(n), this.config.sortSelected ? (t = this.tags.slice(), l = function (e, n) {
                            e.replace(/(\d+)|(\D+)/g, function (e, t, i) {
                                n.push([t || 1 / 0, i || ""])
                            })
                        }, t.sort(function (e, t) {
                            var i, n, r = [], o = [];
                            for (!0 === c.config.sortSelected ? (i = e.tag, n = t.tag) : "text" === c.config.sortSelected && (i = e.textContent, n = t.textContent), l(i, r), l(n, o); r.length && o.length;) {
                                var s = r.shift(), a = o.shift(), a = s[0] - a[0] || s[1].localeCompare(a[1]);
                                if (a) return a
                            }
                            return r.length - o.length
                        }), h.each(t, function (e, t) {
                            i.appendChild(t)
                        }), this.label.textContent = "") : i.appendChild(n), this.config.taggable ? this.label.insertBefore(i, this.input.parentNode) : this.label.appendChild(i)
                    }.call(this, e)
                } else {
                    var r = this.data ? this.data[n] : i;
                    this.label.textContent = this.customSelected ? this.config.renderSelection(r) : i.textContent, this.selectedValue = i.value, this.selectedIndex = n, h.each(this.options, function (e, t) {
                        var i = this.items[e];
                        e !== n && (i && h.removeClass(i, "selected"), t.selected = !1, t.removeAttribute("selected"))
                    }, this)
                }
                h.includes(t, i) || this.el.add(i), e.setAttribute("aria-selected", !0), h.addClass(e, "selected"), h.addClass(this.container, "has-selected"), i.selected = !0, i.setAttribute("selected", ""), this.emit("selectr.change", i), this.emit("selectr.select", i)
            }, o.prototype.deselect = function (e, t) {
                var i = this.items[e], n = this.options[e];
                if (this.el.multiple) {
                    var r = this.selectedIndexes.indexOf(e);
                    this.selectedIndexes.splice(r, 1);
                    r = this.selectedValues.indexOf(n.value);
                    this.selectedValues.splice(r, 1), function (i) {
                        var n = !1;
                        h.each(this.tags, function (e, t) {
                            t.idx === i.idx && (n = t)
                        }, this), n && (this.label.removeChild(n), this.tags.splice(this.tags.indexOf(n), 1))
                    }.call(this, i), this.tags.length || h.removeClass(this.container, "has-selected")
                } else {
                    if (!t && !this.config.clearable && !this.config.allowDeselect) return !1;
                    this.label.textContent = "", this.selectedValue = null, this.el.selectedIndex = this.selectedIndex = -1, h.removeClass(this.container, "has-selected")
                }
                this.items[e].setAttribute("aria-selected", !1), h.removeClass(this.items[e], "selected"), n.selected = !1, n.removeAttribute("selected"), this.emit("selectr.change", null), this.emit("selectr.deselect", n)
            }, o.prototype.setValue = function (i) {
                var n = Array.isArray(i);
                if (n || (i = i.toString().trim()), !this.el.multiple && n) return !1;
                h.each(this.options, function (e, t) {
                    (n && h.includes(i.toString(), t.value) || t.value === i) && this.change(t.idx)
                }, this)
            }, o.prototype.getValue = function (e, t) {
                var i, n;
                return this.el.multiple ? e ? this.selectedIndexes.length && (n = {values: []}, h.each(this.selectedIndexes, function (e, t) {
                    t = this.options[t];
                    n.values[e] = {value: t.value, text: t.textContent}
                }, this)) : n = this.selectedValues.slice() : n = e ? {
                    value: (i = this.options[this.selectedIndex]).value,
                    text: i.textContent
                } : this.selectedValue, n = e && t ? JSON.stringify(n) : n
            }, o.prototype.add = function (i, n) {
                if (i) {
                    if (this.data = this.data || [], this.items = this.items || [], this.options = this.options || [], Array.isArray(i)) h.each(i, function (e, t) {
                        this.add(t, n)
                    }, this); else if ("[object Object]" === Object.prototype.toString.call(i)) {
                        if (n) {
                            var r = !1;
                            if (h.each(this.options, function (e, t) {
                                t.value.toLowerCase() === i.value.toLowerCase() && (r = !0)
                            }), r) return !1
                        }
                        var e = h.createElement("option", i);
                        return this.data.push(i), this.options.push(e), e.idx = 0 < this.options.length ? this.options.length - 1 : 0, c.call(this, e), i.selected && this.select(e.idx), e
                    }
                    return this.setPlaceholder(), this.config.pagination && this.paginate(), !0
                }
            }, o.prototype.remove = function (i) {
                var n, r = [];
                Array.isArray(i) ? h.each(i, function (e, t) {
                    h.isInt(t) ? r.push(this.getOptionByIndex(t)) : "string" == typeof i && r.push(this.getOptionByValue(t))
                }, this) : h.isInt(i) ? r.push(this.getOptionByIndex(i)) : "string" == typeof i && r.push(this.getOptionByValue(i)), r.length && (h.each(r, function (e, t) {
                    n = t.idx, this.el.remove(t), this.options.splice(n, 1);
                    t = this.items[n].parentNode;
                    t && t.removeChild(this.items[n]), this.items.splice(n, 1), h.each(this.options, function (e, t) {
                        t.idx = e, this.items[e].idx = e
                    }, this)
                }, this), this.setPlaceholder(), this.config.pagination && this.paginate())
            }, o.prototype.removeAll = function () {
                this.clear(!0), h.each(this.el.options, function (e, t) {
                    this.el.remove(t)
                }, this), h.truncate(this.tree), this.items = [], this.options = [], this.data = [], this.navIndex = 0, this.requiresPagination && (this.requiresPagination = !1, this.pageIndex = 1, this.pages = []), this.setPlaceholder()
            }, o.prototype.search = function (r) {
                var o, e, t;
                this.navigating || (r = r || this.input.value, o = document.createDocumentFragment(), this.removeMessage(), h.truncate(this.tree), 1 < r.length ? (h.each(this.options, function (e, t) {
                    var i, n = this.items[t.idx];
                    h.includes(t.textContent.toLowerCase(), r.toLowerCase()) && !t.disabled ? (s(n, o, this.customOption), h.removeClass(n, "excluded"), this.customOption || (n.textContent = "", (i = function (e, t) {
                        var i = new RegExp(e, "i").exec(t);
                        if (i) {
                            e = i.index, i = i.index + i[0].length;
                            return {before: t.substring(0, e), match: t.substring(e, i), after: t.substring(i)}
                        }
                        return null
                    }(r, t.textContent)) && (n.appendChild(document.createTextNode(i.before)), (t = document.createElement("span")).className = "selectr-match", t.appendChild(document.createTextNode(i.match)), n.appendChild(t), n.appendChild(document.createTextNode(i.after))))) : h.addClass(n, "excluded")
                }, this), o.childElementCount ? (e = this.items[this.navIndex], t = o.firstElementChild, h.removeClass(e, "active"), this.navIndex = t.idx, h.addClass(t, "active")) : this.config.taggable || this.setMessage("no results.")) : a.call(this), this.tree.appendChild(o))
            }, o.prototype.toggle = function () {
                this.disabled || (this.opened ? this.close() : this.open())
            }, o.prototype.open = function () {
                var e = this;
                return !!this.options.length && (this.opened || this.emit("selectr.open"), this.opened = !0, this.mobileDevice || this.config.nativeDropdown ? (h.addClass(this.container, "native-open"), void (this.config.data && h.each(this.options, function (e, t) {
                    this.el.add(t)
                }, this))) : (h.addClass(this.container, "open"), a.call(this), this.invert(), this.tree.scrollTop = 0, h.removeClass(this.container, "notice"), this.selected.setAttribute("aria-expanded", !0), this.tree.setAttribute("aria-hidden", !1), this.tree.setAttribute("aria-expanded", !0), void (this.config.searchable && !this.config.taggable && setTimeout(function () {
                    e.input.focus(), e.input.tabIndex = 0
                }, 10))))
            }, o.prototype.close = function () {
                var e;
                this.opened && this.emit("selectr.close"), this.opened = !1, this.mobileDevice || this.config.nativeDropdown ? h.removeClass(this.container, "native-open") : (e = h.hasClass(this.container, "notice"), this.config.searchable && !e && (this.input.blur(), this.input.tabIndex = -1, this.searching = !1), e && (h.removeClass(this.container, "notice"), this.notice.textContent = ""), h.removeClass(this.container, "open"), h.removeClass(this.container, "native-open"), this.selected.setAttribute("aria-expanded", !1), this.tree.setAttribute("aria-hidden", !0), this.tree.setAttribute("aria-expanded", !1), h.truncate(this.tree), t.call(this))
            }, o.prototype.enable = function () {
                this.disabled = !1, this.el.disabled = !1, this.selected.tabIndex = this.originalIndex, this.el.multiple && h.each(this.tags, function (e, t) {
                    t.lastElementChild.tabIndex = 0
                }), h.removeClass(this.container, "selectr-disabled")
            }, o.prototype.disable = function (e) {
                e || (this.el.disabled = !0), this.selected.tabIndex = -1, this.el.multiple && h.each(this.tags, function (e, t) {
                    t.lastElementChild.tabIndex = -1
                }), this.disabled = !0, h.addClass(this.container, "selectr-disabled")
            }, o.prototype.reset = function () {
                this.disabled || (this.clear(), this.setSelected(!0), h.each(this.defaultSelected, function (e, t) {
                    this.select(t)
                }, this), this.emit("selectr.reset"))
            }, o.prototype.clear = function (e) {
                var t;
                this.el.multiple ? this.selectedIndexes.length && (t = this.selectedIndexes.slice(), h.each(t, function (e, t) {
                    this.deselect(t)
                }, this)) : -1 < this.selectedIndex && this.deselect(this.selectedIndex, e), this.emit("selectr.clear")
            }, o.prototype.serialise = function (e) {
                var n = [];
                return h.each(this.options, function (e, t) {
                    var i = {value: t.value, text: t.textContent};
                    t.selected && (i.selected = !0), t.disabled && (i.disabled = !0), n[e] = i
                }), e ? JSON.stringify(n) : n
            }, o.prototype.serialize = function (e) {
                return this.serialise(e)
            }, o.prototype.setPlaceholder = function (e) {
                e = e || this.config.placeholder || this.el.getAttribute("placeholder"), this.options.length || (e = "No options available"), this.placeEl.textContent = e
            }, o.prototype.paginate = function () {
                if (this.items.length) {
                    var i = this;
                    return this.pages = this.items.map(function (e, t) {
                        return t % i.config.pagination == 0 ? i.items.slice(t, t + i.config.pagination) : null
                    }).filter(function (e) {
                        return e
                    }), this.pages
                }
            }, o.prototype.setMessage = function (e, t) {
                t && this.close(), h.addClass(this.container, "notice"), this.notice.textContent = e
            }, o.prototype.removeMessage = function () {
                h.removeClass(this.container, "notice"), this.notice.textContent = ""
            }, o.prototype.invert = function () {
                var e = h.rect(this.selected), t = this.tree.parentNode.offsetHeight, i = window.innerHeight;
                e.top + e.height + t > i ? (h.addClass(this.container, "inverted"), this.isInverted = !0) : (h.removeClass(this.container, "inverted"), this.isInverted = !1), this.optsRect = h.rect(this.tree)
            }, o.prototype.getOptionByIndex = function (e) {
                return this.options[e]
            }, o.prototype.getOptionByValue = function (e) {
                for (var t = !1, i = 0, n = this.options.length; i < n; i++) if (this.options[i].value.trim() === e.toString().trim()) {
                    t = this.options[i];
                    break
                }
                return t
            }, e.exports = o
        }, 4188: function (e, t, i) {
            "use strict";
            i.d(t, {
                qD: function () {
                    return n
                }, EX: function () {
                    return r
                }, WF: function () {
                    return o
                }, oW: function () {
                    return s
                }
            });
            var n = document.body, r = 10485760, o = 2e4, s = 2147483648
        }, 2602: function (e, t, i) {
            "use strict";
            i.d(t, {
                w: function () {
                    return n
                }
            });
            var u = i(9791);

            function n(i, e, n) {
                var t, r = 3 < arguments.length && void 0 !== arguments[3] && arguments[3],
                    o = "function" == typeof (l = i).getRootNode ? l.getRootNode() : window, s = {},
                    a = i.getBoundingClientRect(), l = e.getBoundingClientRect(), c = document.createElement("div");

                function h() {
                    if (c && c.parentNode) {
                        for (var e in c.parentNode.removeChild(c), s) t = e, Object.prototype.hasOwnProperty.call(s, t) && ((t = s[e]) && (0, u.removeEventListener)(o, e, t), delete s[e]);
                        "function" == typeof n && n(i)
                    }
                    var t
                }

                function d(e) {
                    (e = e.target) === c || (0, u.isChildOf)(e, c) || h()
                }

                return c.className = "jsoneditor-anchor", c.style.position = "absolute", c.style.left = a.left - l.left + "px", c.style.top = a.top - l.top + "px", c.style.width = a.width - 2 + "px", c.style.height = a.height - 2 + "px", c.style.boxSizing = "border-box", e.appendChild(c), s.mousedown = (0, u.addEventListener)(o, "mousedown", d), s.mousewheel = (0, u.addEventListener)(o, "mousewheel", d), r && (t = null, c.onmouseover = function () {
                    clearTimeout(t), t = null
                }, c.onmouseout = function () {
                    t = t || setTimeout(h, 200)
                }), c.destroy = h, c
            }
        }, 7923: function (e) {
            e.exports = "data:application/javascript;base64,Im5vIHVzZSBzdHJpY3QiOwohKGZ1bmN0aW9uKHdpbmRvdykgewppZiAodHlwZW9mIHdpbmRvdy53aW5kb3cgIT0gInVuZGVmaW5lZCIgJiYgd2luZG93LmRvY3VtZW50KQogICAgcmV0dXJuOwppZiAod2luZG93LnJlcXVpcmUgJiYgd2luZG93LmRlZmluZSkKICAgIHJldHVybjsKCmlmICghd2luZG93LmNvbnNvbGUpIHsKICAgIHdpbmRvdy5jb25zb2xlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIG1zZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApOwogICAgICAgIHBvc3RNZXNzYWdlKHt0eXBlOiAibG9nIiwgZGF0YTogbXNnc30pOwogICAgfTsKICAgIHdpbmRvdy5jb25zb2xlLmVycm9yID0KICAgIHdpbmRvdy5jb25zb2xlLndhcm4gPSAKICAgIHdpbmRvdy5jb25zb2xlLmxvZyA9CiAgICB3aW5kb3cuY29uc29sZS50cmFjZSA9IHdpbmRvdy5jb25zb2xlOwp9CndpbmRvdy53aW5kb3cgPSB3aW5kb3c7CndpbmRvdy5hY2UgPSB3aW5kb3c7Cgp3aW5kb3cub25lcnJvciA9IGZ1bmN0aW9uKG1lc3NhZ2UsIGZpbGUsIGxpbmUsIGNvbCwgZXJyKSB7CiAgICBwb3N0TWVzc2FnZSh7dHlwZTogImVycm9yIiwgZGF0YTogewogICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsCiAgICAgICAgZGF0YTogZXJyLmRhdGEsCiAgICAgICAgZmlsZTogZmlsZSwKICAgICAgICBsaW5lOiBsaW5lLCAKICAgICAgICBjb2w6IGNvbCwKICAgICAgICBzdGFjazogZXJyLnN0YWNrCiAgICB9fSk7Cn07Cgp3aW5kb3cubm9ybWFsaXplTW9kdWxlID0gZnVuY3Rpb24ocGFyZW50SWQsIG1vZHVsZU5hbWUpIHsKICAgIC8vIG5vcm1hbGl6ZSBwbHVnaW4gcmVxdWlyZXMKICAgIGlmIChtb2R1bGVOYW1lLmluZGV4T2YoIiEiKSAhPT0gLTEpIHsKICAgICAgICB2YXIgY2h1bmtzID0gbW9kdWxlTmFtZS5zcGxpdCgiISIpOwogICAgICAgIHJldHVybiB3aW5kb3cubm9ybWFsaXplTW9kdWxlKHBhcmVudElkLCBjaHVua3NbMF0pICsgIiEiICsgd2luZG93Lm5vcm1hbGl6ZU1vZHVsZShwYXJlbnRJZCwgY2h1bmtzWzFdKTsKICAgIH0KICAgIC8vIG5vcm1hbGl6ZSByZWxhdGl2ZSByZXF1aXJlcwogICAgaWYgKG1vZHVsZU5hbWUuY2hhckF0KDApID09ICIuIikgewogICAgICAgIHZhciBiYXNlID0gcGFyZW50SWQuc3BsaXQoIi8iKS5zbGljZSgwLCAtMSkuam9pbigiLyIpOwogICAgICAgIG1vZHVsZU5hbWUgPSAoYmFzZSA/IGJhc2UgKyAiLyIgOiAiIikgKyBtb2R1bGVOYW1lOwogICAgICAgIAogICAgICAgIHdoaWxlIChtb2R1bGVOYW1lLmluZGV4T2YoIi4iKSAhPT0gLTEgJiYgcHJldmlvdXMgIT0gbW9kdWxlTmFtZSkgewogICAgICAgICAgICB2YXIgcHJldmlvdXMgPSBtb2R1bGVOYW1lOwogICAgICAgICAgICBtb2R1bGVOYW1lID0gbW9kdWxlTmFtZS5yZXBsYWNlKC9eXC5cLy8sICIiKS5yZXBsYWNlKC9cL1wuXC8vLCAiLyIpLnJlcGxhY2UoL1teXC9dK1wvXC5cLlwvLywgIiIpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuIG1vZHVsZU5hbWU7Cn07Cgp3aW5kb3cucmVxdWlyZSA9IGZ1bmN0aW9uIHJlcXVpcmUocGFyZW50SWQsIGlkKSB7CiAgICBpZiAoIWlkKSB7CiAgICAgICAgaWQgPSBwYXJlbnRJZDsKICAgICAgICBwYXJlbnRJZCA9IG51bGw7CiAgICB9CiAgICBpZiAoIWlkLmNoYXJBdCkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIndvcmtlci5qcyByZXF1aXJlKCkgYWNjZXB0cyBvbmx5IChwYXJlbnRJZCwgaWQpIGFzIGFyZ3VtZW50cyIpOwoKICAgIGlkID0gd2luZG93Lm5vcm1hbGl6ZU1vZHVsZShwYXJlbnRJZCwgaWQpOwoKICAgIHZhciBtb2R1bGUgPSB3aW5kb3cucmVxdWlyZS5tb2R1bGVzW2lkXTsKICAgIGlmIChtb2R1bGUpIHsKICAgICAgICBpZiAoIW1vZHVsZS5pbml0aWFsaXplZCkgewogICAgICAgICAgICBtb2R1bGUuaW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IG1vZHVsZS5mYWN0b3J5KCkuZXhwb3J0czsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzOwogICAgfQogICAKICAgIGlmICghd2luZG93LnJlcXVpcmUudGxucykKICAgICAgICByZXR1cm4gY29uc29sZS5sb2coInVuYWJsZSB0byBsb2FkICIgKyBpZCk7CiAgICAKICAgIHZhciBwYXRoID0gcmVzb2x2ZU1vZHVsZUlkKGlkLCB3aW5kb3cucmVxdWlyZS50bG5zKTsKICAgIGlmIChwYXRoLnNsaWNlKC0zKSAhPSAiLmpzIikgcGF0aCArPSAiLmpzIjsKICAgIAogICAgd2luZG93LnJlcXVpcmUuaWQgPSBpZDsKICAgIHdpbmRvdy5yZXF1aXJlLm1vZHVsZXNbaWRdID0ge307IC8vIHByZXZlbnQgaW5maW5pdGUgbG9vcCBvbiBicm9rZW4gbW9kdWxlcwogICAgaW1wb3J0U2NyaXB0cyhwYXRoKTsKICAgIHJldHVybiB3aW5kb3cucmVxdWlyZShwYXJlbnRJZCwgaWQpOwp9OwpmdW5jdGlvbiByZXNvbHZlTW9kdWxlSWQoaWQsIHBhdGhzKSB7CiAgICB2YXIgdGVzdFBhdGggPSBpZCwgdGFpbCA9ICIiOwogICAgd2hpbGUgKHRlc3RQYXRoKSB7CiAgICAgICAgdmFyIGFsaWFzID0gcGF0aHNbdGVzdFBhdGhdOwogICAgICAgIGlmICh0eXBlb2YgYWxpYXMgPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgcmV0dXJuIGFsaWFzICsgdGFpbDsKICAgICAgICB9IGVsc2UgaWYgKGFsaWFzKSB7CiAgICAgICAgICAgIHJldHVybiAgYWxpYXMubG9jYXRpb24ucmVwbGFjZSgvXC8qJC8sICIvIikgKyAodGFpbCB8fCBhbGlhcy5tYWluIHx8IGFsaWFzLm5hbWUpOwogICAgICAgIH0gZWxzZSBpZiAoYWxpYXMgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgdmFyIGkgPSB0ZXN0UGF0aC5sYXN0SW5kZXhPZigiLyIpOwogICAgICAgIGlmIChpID09PSAtMSkgYnJlYWs7CiAgICAgICAgdGFpbCA9IHRlc3RQYXRoLnN1YnN0cihpKSArIHRhaWw7CiAgICAgICAgdGVzdFBhdGggPSB0ZXN0UGF0aC5zbGljZSgwLCBpKTsKICAgIH0KICAgIHJldHVybiBpZDsKfQp3aW5kb3cucmVxdWlyZS5tb2R1bGVzID0ge307CndpbmRvdy5yZXF1aXJlLnRsbnMgPSB7fTsKCndpbmRvdy5kZWZpbmUgPSBmdW5jdGlvbihpZCwgZGVwcywgZmFjdG9yeSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICAgIGZhY3RvcnkgPSBkZXBzOwogICAgICAgIGlmICh0eXBlb2YgaWQgIT0gInN0cmluZyIpIHsKICAgICAgICAgICAgZGVwcyA9IGlkOwogICAgICAgICAgICBpZCA9IHdpbmRvdy5yZXF1aXJlLmlkOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgZmFjdG9yeSA9IGlkOwogICAgICAgIGRlcHMgPSBbXTsKICAgICAgICBpZCA9IHdpbmRvdy5yZXF1aXJlLmlkOwogICAgfQogICAgCiAgICBpZiAodHlwZW9mIGZhY3RvcnkgIT0gImZ1bmN0aW9uIikgewogICAgICAgIHdpbmRvdy5yZXF1aXJlLm1vZHVsZXNbaWRdID0gewogICAgICAgICAgICBleHBvcnRzOiBmYWN0b3J5LAogICAgICAgICAgICBpbml0aWFsaXplZDogdHJ1ZQogICAgICAgIH07CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICghZGVwcy5sZW5ndGgpCiAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gZGVwZW5kZW5jaWVzLCB3ZSBpbmplY3QgInJlcXVpcmUiLCAiZXhwb3J0cyIgYW5kCiAgICAgICAgLy8gIm1vZHVsZSIgYXMgZGVwZW5kZW5jaWVzLCB0byBwcm92aWRlIENvbW1vbkpTIGNvbXBhdGliaWxpdHkuCiAgICAgICAgZGVwcyA9IFsicmVxdWlyZSIsICJleHBvcnRzIiwgIm1vZHVsZSJdOwoKICAgIHZhciByZXEgPSBmdW5jdGlvbihjaGlsZElkKSB7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5yZXF1aXJlKGlkLCBjaGlsZElkKTsKICAgIH07CgogICAgd2luZG93LnJlcXVpcmUubW9kdWxlc1tpZF0gPSB7CiAgICAgICAgZXhwb3J0czoge30sCiAgICAgICAgZmFjdG9yeTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBtb2R1bGUgPSB0aGlzOwogICAgICAgICAgICB2YXIgcmV0dXJuRXhwb3J0cyA9IGZhY3RvcnkuYXBwbHkodGhpcywgZGVwcy5zbGljZSgwLCBmYWN0b3J5Lmxlbmd0aCkubWFwKGZ1bmN0aW9uKGRlcCkgewogICAgICAgICAgICAgICAgc3dpdGNoIChkZXApIHsKICAgICAgICAgICAgICAgICAgICAvLyBCZWNhdXNlICJyZXF1aXJlIiwgImV4cG9ydHMiIGFuZCAibW9kdWxlIiBhcmVuJ3QgYWN0dWFsCiAgICAgICAgICAgICAgICAgICAgLy8gZGVwZW5kZW5jaWVzLCB3ZSBtdXN0IGhhbmRsZSB0aGVtIHNlcGVyYXRlbHkuCiAgICAgICAgICAgICAgICAgICAgY2FzZSAicmVxdWlyZSI6IHJldHVybiByZXE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiZXhwb3J0cyI6IHJldHVybiBtb2R1bGUuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICBjYXNlICJtb2R1bGUiOiAgcmV0dXJuIG1vZHVsZTsKICAgICAgICAgICAgICAgICAgICAvLyBCdXQgZm9yIGFsbCBvdGhlciBkZXBlbmRlbmNpZXMsIHdlIGNhbiBqdXN0IGdvIGFoZWFkIGFuZAogICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgdGhlbS4KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgcmV0dXJuIHJlcShkZXApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGlmIChyZXR1cm5FeHBvcnRzKQogICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSByZXR1cm5FeHBvcnRzOwogICAgICAgICAgICByZXR1cm4gbW9kdWxlOwogICAgICAgIH0KICAgIH07Cn07CndpbmRvdy5kZWZpbmUuYW1kID0ge307CnJlcXVpcmUudGxucyA9IHt9Owp3aW5kb3cuaW5pdEJhc2VVcmxzICA9IGZ1bmN0aW9uIGluaXRCYXNlVXJscyh0b3BMZXZlbE5hbWVzcGFjZXMpIHsKICAgIGZvciAodmFyIGkgaW4gdG9wTGV2ZWxOYW1lc3BhY2VzKQogICAgICAgIHJlcXVpcmUudGxuc1tpXSA9IHRvcExldmVsTmFtZXNwYWNlc1tpXTsKfTsKCndpbmRvdy5pbml0U2VuZGVyID0gZnVuY3Rpb24gaW5pdFNlbmRlcigpIHsKCiAgICB2YXIgRXZlbnRFbWl0dGVyID0gd2luZG93LnJlcXVpcmUoImFjZS9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsKICAgIHZhciBvb3AgPSB3aW5kb3cucmVxdWlyZSgiYWNlL2xpYi9vb3AiKTsKICAgIAogICAgdmFyIFNlbmRlciA9IGZ1bmN0aW9uKCkge307CiAgICAKICAgIChmdW5jdGlvbigpIHsKICAgICAgICAKICAgICAgICBvb3AuaW1wbGVtZW50KHRoaXMsIEV2ZW50RW1pdHRlcik7CiAgICAgICAgICAgICAgICAKICAgICAgICB0aGlzLmNhbGxiYWNrID0gZnVuY3Rpb24oZGF0YSwgY2FsbGJhY2tJZCkgewogICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICB0eXBlOiAiY2FsbCIsCiAgICAgICAgICAgICAgICBpZDogY2FsbGJhY2tJZCwKICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgIAogICAgICAgIHRoaXMuZW1pdCA9IGZ1bmN0aW9uKG5hbWUsIGRhdGEpIHsKICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgdHlwZTogImV2ZW50IiwKICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsCiAgICAgICAgICAgICAgICBkYXRhOiBkYXRhCiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgCiAgICB9KS5jYWxsKFNlbmRlci5wcm90b3R5cGUpOwogICAgCiAgICByZXR1cm4gbmV3IFNlbmRlcigpOwp9OwoKdmFyIG1haW4gPSB3aW5kb3cubWFpbiA9IG51bGw7CnZhciBzZW5kZXIgPSB3aW5kb3cuc2VuZGVyID0gbnVsbDsKCndpbmRvdy5vbm1lc3NhZ2UgPSBmdW5jdGlvbihlKSB7CiAgICB2YXIgbXNnID0gZS5kYXRhOwogICAgaWYgKG1zZy5ldmVudCAmJiBzZW5kZXIpIHsKICAgICAgICBzZW5kZXIuX3NpZ25hbChtc2cuZXZlbnQsIG1zZy5kYXRhKTsKICAgIH0KICAgIGVsc2UgaWYgKG1zZy5jb21tYW5kKSB7CiAgICAgICAgaWYgKG1haW5bbXNnLmNvbW1hbmRdKQogICAgICAgICAgICBtYWluW21zZy5jb21tYW5kXS5hcHBseShtYWluLCBtc2cuYXJncyk7CiAgICAgICAgZWxzZSBpZiAod2luZG93W21zZy5jb21tYW5kXSkKICAgICAgICAgICAgd2luZG93W21zZy5jb21tYW5kXS5hcHBseSh3aW5kb3csIG1zZy5hcmdzKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBjb21tYW5kOiIgKyBtc2cuY29tbWFuZCk7CiAgICB9CiAgICBlbHNlIGlmIChtc2cuaW5pdCkgewogICAgICAgIHdpbmRvdy5pbml0QmFzZVVybHMobXNnLnRsbnMpOwogICAgICAgIHNlbmRlciA9IHdpbmRvdy5zZW5kZXIgPSB3aW5kb3cuaW5pdFNlbmRlcigpOwogICAgICAgIHZhciBjbGF6eiA9IHJlcXVpcmUobXNnLm1vZHVsZSlbbXNnLmNsYXNzbmFtZV07CiAgICAgICAgbWFpbiA9IHdpbmRvdy5tYWluID0gbmV3IGNsYXp6KHNlbmRlcik7CiAgICB9Cn07Cn0pKHRoaXMpOwoKYWNlLmRlZmluZSgiYWNlL2xpYi9vb3AiLFtdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKZXhwb3J0cy5pbmhlcml0cyA9IGZ1bmN0aW9uKGN0b3IsIHN1cGVyQ3RvcikgewogICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3I7CiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwgewogICAgICAgIGNvbnN0cnVjdG9yOiB7CiAgICAgICAgICAgIHZhbHVlOiBjdG9yLAogICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICAgIH0KICAgIH0pOwp9OwoKZXhwb3J0cy5taXhpbiA9IGZ1bmN0aW9uKG9iaiwgbWl4aW4pIHsKICAgIGZvciAodmFyIGtleSBpbiBtaXhpbikgewogICAgICAgIG9ialtrZXldID0gbWl4aW5ba2V5XTsKICAgIH0KICAgIHJldHVybiBvYmo7Cn07CgpleHBvcnRzLmltcGxlbWVudCA9IGZ1bmN0aW9uKHByb3RvLCBtaXhpbikgewogICAgZXhwb3J0cy5taXhpbihwcm90bywgbWl4aW4pOwp9OwoKfSk7CgphY2UuZGVmaW5lKCJhY2UvcmFuZ2UiLFtdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwp2YXIgY29tcGFyZVBvaW50cyA9IGZ1bmN0aW9uKHAxLCBwMikgewogICAgcmV0dXJuIHAxLnJvdyAtIHAyLnJvdyB8fCBwMS5jb2x1bW4gLSBwMi5jb2x1bW47Cn07CnZhciBSYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pIHsKICAgIHRoaXMuc3RhcnQgPSB7CiAgICAgICAgcm93OiBzdGFydFJvdywKICAgICAgICBjb2x1bW46IHN0YXJ0Q29sdW1uCiAgICB9OwoKICAgIHRoaXMuZW5kID0gewogICAgICAgIHJvdzogZW5kUm93LAogICAgICAgIGNvbHVtbjogZW5kQ29sdW1uCiAgICB9Owp9OwoKKGZ1bmN0aW9uKCkgewogICAgdGhpcy5pc0VxdWFsID0gZnVuY3Rpb24ocmFuZ2UpIHsKICAgICAgICByZXR1cm4gdGhpcy5zdGFydC5yb3cgPT09IHJhbmdlLnN0YXJ0LnJvdyAmJgogICAgICAgICAgICB0aGlzLmVuZC5yb3cgPT09IHJhbmdlLmVuZC5yb3cgJiYKICAgICAgICAgICAgdGhpcy5zdGFydC5jb2x1bW4gPT09IHJhbmdlLnN0YXJ0LmNvbHVtbiAmJgogICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPT09IHJhbmdlLmVuZC5jb2x1bW47CiAgICB9OwogICAgdGhpcy50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAoIlJhbmdlOiBbIiArIHRoaXMuc3RhcnQucm93ICsgIi8iICsgdGhpcy5zdGFydC5jb2x1bW4gKwogICAgICAgICAgICAiXSAtPiBbIiArIHRoaXMuZW5kLnJvdyArICIvIiArIHRoaXMuZW5kLmNvbHVtbiArICJdIik7CiAgICB9OwoKICAgIHRoaXMuY29udGFpbnMgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDA7CiAgICB9OwogICAgdGhpcy5jb21wYXJlUmFuZ2UgPSBmdW5jdGlvbihyYW5nZSkgewogICAgICAgIHZhciBjbXAsCiAgICAgICAgICAgIGVuZCA9IHJhbmdlLmVuZCwKICAgICAgICAgICAgc3RhcnQgPSByYW5nZS5zdGFydDsKCiAgICAgICAgY21wID0gdGhpcy5jb21wYXJlKGVuZC5yb3csIGVuZC5jb2x1bW4pOwogICAgICAgIGlmIChjbXAgPT0gMSkgewogICAgICAgICAgICBjbXAgPSB0aGlzLmNvbXBhcmUoc3RhcnQucm93LCBzdGFydC5jb2x1bW4pOwogICAgICAgICAgICBpZiAoY21wID09IDEpIHsKICAgICAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgICAgICB9IGVsc2UgaWYgKGNtcCA9PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gLTEpIHsKICAgICAgICAgICAgcmV0dXJuIC0yOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNtcCA9IHRoaXMuY29tcGFyZShzdGFydC5yb3csIHN0YXJ0LmNvbHVtbik7CiAgICAgICAgICAgIGlmIChjbXAgPT0gLTEpIHsKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDQyOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwogICAgdGhpcy5jb21wYXJlUG9pbnQgPSBmdW5jdGlvbihwKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShwLnJvdywgcC5jb2x1bW4pOwogICAgfTsKICAgIHRoaXMuY29udGFpbnNSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZVBvaW50KHJhbmdlLnN0YXJ0KSA9PSAwICYmIHRoaXMuY29tcGFyZVBvaW50KHJhbmdlLmVuZCkgPT0gMDsKICAgIH07CiAgICB0aGlzLmludGVyc2VjdHMgPSBmdW5jdGlvbihyYW5nZSkgewogICAgICAgIHZhciBjbXAgPSB0aGlzLmNvbXBhcmVSYW5nZShyYW5nZSk7CiAgICAgICAgcmV0dXJuIChjbXAgPT0gLTEgfHwgY21wID09IDAgfHwgY21wID09IDEpOwogICAgfTsKICAgIHRoaXMuaXNFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIHJldHVybiB0aGlzLmVuZC5yb3cgPT0gcm93ICYmIHRoaXMuZW5kLmNvbHVtbiA9PSBjb2x1bW47CiAgICB9OwogICAgdGhpcy5pc1N0YXJ0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICByZXR1cm4gdGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbjsKICAgIH07CiAgICB0aGlzLnNldFN0YXJ0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAodHlwZW9mIHJvdyA9PSAib2JqZWN0IikgewogICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9IHJvdy5jb2x1bW47CiAgICAgICAgICAgIHRoaXMuc3RhcnQucm93ID0gcm93LnJvdzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLnN0YXJ0LnJvdyA9IHJvdzsKICAgICAgICAgICAgdGhpcy5zdGFydC5jb2x1bW4gPSBjb2x1bW47CiAgICAgICAgfQogICAgfTsKICAgIHRoaXMuc2V0RW5kID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAodHlwZW9mIHJvdyA9PSAib2JqZWN0IikgewogICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPSByb3cuY29sdW1uOwogICAgICAgICAgICB0aGlzLmVuZC5yb3cgPSByb3cucm93OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9IHJvdzsKICAgICAgICAgICAgdGhpcy5lbmQuY29sdW1uID0gY29sdW1uOwogICAgICAgIH0KICAgIH07CiAgICB0aGlzLmluc2lkZSA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgaWYgKHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMCkgewogICAgICAgICAgICBpZiAodGhpcy5pc0VuZChyb3csIGNvbHVtbikgfHwgdGhpcy5pc1N0YXJ0KHJvdywgY29sdW1uKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKICAgIHRoaXMuaW5zaWRlU3RhcnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDApIHsKICAgICAgICAgICAgaWYgKHRoaXMuaXNFbmQocm93LCBjb2x1bW4pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwogICAgdGhpcy5pbnNpZGVFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDApIHsKICAgICAgICAgICAgaWYgKHRoaXMuaXNTdGFydChyb3csIGNvbHVtbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH07CiAgICB0aGlzLmNvbXBhcmUgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIGlmICghdGhpcy5pc011bHRpTGluZSgpKSB7CiAgICAgICAgICAgIGlmIChyb3cgPT09IHRoaXMuc3RhcnQucm93KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uIDwgdGhpcy5zdGFydC5jb2x1bW4gPyAtMSA6IChjb2x1bW4gPiB0aGlzLmVuZC5jb2x1bW4gPyAxIDogMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChyb3cgPCB0aGlzLnN0YXJ0LnJvdykKICAgICAgICAgICAgcmV0dXJuIC0xOwoKICAgICAgICBpZiAocm93ID4gdGhpcy5lbmQucm93KQogICAgICAgICAgICByZXR1cm4gMTsKCiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93ID09PSByb3cpCiAgICAgICAgICAgIHJldHVybiBjb2x1bW4gPj0gdGhpcy5zdGFydC5jb2x1bW4gPyAwIDogLTE7CgogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPT09IHJvdykKICAgICAgICAgICAgcmV0dXJuIGNvbHVtbiA8PSB0aGlzLmVuZC5jb2x1bW4gPyAwIDogMTsKCiAgICAgICAgcmV0dXJuIDA7CiAgICB9OwogICAgdGhpcy5jb21wYXJlU3RhcnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0aGlzLnN0YXJ0LnJvdyA9PSByb3cgJiYgdGhpcy5zdGFydC5jb2x1bW4gPT0gY29sdW1uKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKTsKICAgICAgICB9CiAgICB9OwogICAgdGhpcy5jb21wYXJlRW5kID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAodGhpcy5lbmQucm93ID09IHJvdyAmJiB0aGlzLmVuZC5jb2x1bW4gPT0gY29sdW1uKSB7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pOwogICAgICAgIH0KICAgIH07CiAgICB0aGlzLmNvbXBhcmVJbnNpZGUgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPT0gcm93ICYmIHRoaXMuZW5kLmNvbHVtbiA9PSBjb2x1bW4pIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXJ0LnJvdyA9PSByb3cgJiYgdGhpcy5zdGFydC5jb2x1bW4gPT0gY29sdW1uKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKTsKICAgICAgICB9CiAgICB9OwogICAgdGhpcy5jbGlwUm93cyA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7CiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA+IGxhc3RSb3cpCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiBsYXN0Um93ICsgMSwgY29sdW1uOiAwfTsKICAgICAgICBlbHNlIGlmICh0aGlzLmVuZC5yb3cgPCBmaXJzdFJvdykKICAgICAgICAgICAgdmFyIGVuZCA9IHtyb3c6IGZpcnN0Um93LCBjb2x1bW46IDB9OwoKICAgICAgICBpZiAodGhpcy5zdGFydC5yb3cgPiBsYXN0Um93KQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7cm93OiBsYXN0Um93ICsgMSwgY29sdW1uOiAwfTsKICAgICAgICBlbHNlIGlmICh0aGlzLnN0YXJ0LnJvdyA8IGZpcnN0Um93KQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7cm93OiBmaXJzdFJvdywgY29sdW1uOiAwfTsKCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQgfHwgdGhpcy5zdGFydCwgZW5kIHx8IHRoaXMuZW5kKTsKICAgIH07CiAgICB0aGlzLmV4dGVuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIGNtcCA9IHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7CgogICAgICAgIGlmIChjbXAgPT0gMCkKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgZWxzZSBpZiAoY21wID09IC0xKQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1ufTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1ufTsKCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQgfHwgdGhpcy5zdGFydCwgZW5kIHx8IHRoaXMuZW5kKTsKICAgIH07CgogICAgdGhpcy5pc0VtcHR5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLnN0YXJ0LnJvdyA9PT0gdGhpcy5lbmQucm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09PSB0aGlzLmVuZC5jb2x1bW4pOwogICAgfTsKICAgIHRoaXMuaXNNdWx0aUxpbmUgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gKHRoaXMuc3RhcnQucm93ICE9PSB0aGlzLmVuZC5yb3cpOwogICAgfTsKICAgIHRoaXMuY2xvbmUgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyh0aGlzLnN0YXJ0LCB0aGlzLmVuZCk7CiAgICB9OwogICAgdGhpcy5jb2xsYXBzZVJvd3MgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5lbmQuY29sdW1uID09IDApCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2UodGhpcy5zdGFydC5yb3csIDAsIE1hdGgubWF4KHRoaXMuc3RhcnQucm93LCB0aGlzLmVuZC5yb3ctMSksIDApOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnN0YXJ0LnJvdywgMCwgdGhpcy5lbmQucm93LCAwKTsKICAgIH07CiAgICB0aGlzLnRvU2NyZWVuUmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uKSB7CiAgICAgICAgdmFyIHNjcmVlblBvc1N0YXJ0ID0gc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24odGhpcy5zdGFydCk7CiAgICAgICAgdmFyIHNjcmVlblBvc0VuZCA9IHNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuZW5kKTsKCiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSgKICAgICAgICAgICAgc2NyZWVuUG9zU3RhcnQucm93LCBzY3JlZW5Qb3NTdGFydC5jb2x1bW4sCiAgICAgICAgICAgIHNjcmVlblBvc0VuZC5yb3csIHNjcmVlblBvc0VuZC5jb2x1bW4KICAgICAgICApOwogICAgfTsKICAgIHRoaXMubW92ZUJ5ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICB0aGlzLnN0YXJ0LnJvdyArPSByb3c7CiAgICAgICAgdGhpcy5zdGFydC5jb2x1bW4gKz0gY29sdW1uOwogICAgICAgIHRoaXMuZW5kLnJvdyArPSByb3c7CiAgICAgICAgdGhpcy5lbmQuY29sdW1uICs9IGNvbHVtbjsKICAgIH07Cgp9KS5jYWxsKFJhbmdlLnByb3RvdHlwZSk7ClJhbmdlLmZyb21Qb2ludHMgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0LnJvdywgc3RhcnQuY29sdW1uLCBlbmQucm93LCBlbmQuY29sdW1uKTsKfTsKUmFuZ2UuY29tcGFyZVBvaW50cyA9IGNvbXBhcmVQb2ludHM7CgpSYW5nZS5jb21wYXJlUG9pbnRzID0gZnVuY3Rpb24ocDEsIHAyKSB7CiAgICByZXR1cm4gcDEucm93IC0gcDIucm93IHx8IHAxLmNvbHVtbiAtIHAyLmNvbHVtbjsKfTsKCgpleHBvcnRzLlJhbmdlID0gUmFuZ2U7Cn0pOwoKYWNlLmRlZmluZSgiYWNlL2FwcGx5X2RlbHRhIixbXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCmZ1bmN0aW9uIHRocm93RGVsdGFFcnJvcihkZWx0YSwgZXJyb3JUZXh0KXsKICAgIGNvbnNvbGUubG9nKCJJbnZhbGlkIERlbHRhOiIsIGRlbHRhKTsKICAgIHRocm93ICJJbnZhbGlkIERlbHRhOiAiICsgZXJyb3JUZXh0Owp9CgpmdW5jdGlvbiBwb3NpdGlvbkluRG9jdW1lbnQoZG9jTGluZXMsIHBvc2l0aW9uKSB7CiAgICByZXR1cm4gcG9zaXRpb24ucm93ICAgID49IDAgJiYgcG9zaXRpb24ucm93ICAgIDwgIGRvY0xpbmVzLmxlbmd0aCAmJgogICAgICAgICAgIHBvc2l0aW9uLmNvbHVtbiA+PSAwICYmIHBvc2l0aW9uLmNvbHVtbiA8PSBkb2NMaW5lc1twb3NpdGlvbi5yb3ddLmxlbmd0aDsKfQoKZnVuY3Rpb24gdmFsaWRhdGVEZWx0YShkb2NMaW5lcywgZGVsdGEpIHsKICAgIGlmIChkZWx0YS5hY3Rpb24gIT0gImluc2VydCIgJiYgZGVsdGEuYWN0aW9uICE9ICJyZW1vdmUiKQogICAgICAgIHRocm93RGVsdGFFcnJvcihkZWx0YSwgImRlbHRhLmFjdGlvbiBtdXN0IGJlICdpbnNlcnQnIG9yICdyZW1vdmUnIik7CiAgICBpZiAoIShkZWx0YS5saW5lcyBpbnN0YW5jZW9mIEFycmF5KSkKICAgICAgICB0aHJvd0RlbHRhRXJyb3IoZGVsdGEsICJkZWx0YS5saW5lcyBtdXN0IGJlIGFuIEFycmF5Iik7CiAgICBpZiAoIWRlbHRhLnN0YXJ0IHx8ICFkZWx0YS5lbmQpCiAgICAgICB0aHJvd0RlbHRhRXJyb3IoZGVsdGEsICJkZWx0YS5zdGFydC9lbmQgbXVzdCBiZSBhbiBwcmVzZW50Iik7CiAgICB2YXIgc3RhcnQgPSBkZWx0YS5zdGFydDsKICAgIGlmICghcG9zaXRpb25JbkRvY3VtZW50KGRvY0xpbmVzLCBkZWx0YS5zdGFydCkpCiAgICAgICAgdGhyb3dEZWx0YUVycm9yKGRlbHRhLCAiZGVsdGEuc3RhcnQgbXVzdCBiZSBjb250YWluZWQgaW4gZG9jdW1lbnQiKTsKICAgIHZhciBlbmQgPSBkZWx0YS5lbmQ7CiAgICBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmUiICYmICFwb3NpdGlvbkluRG9jdW1lbnQoZG9jTGluZXMsIGVuZCkpCiAgICAgICAgdGhyb3dEZWx0YUVycm9yKGRlbHRhLCAiZGVsdGEuZW5kIG11c3QgY29udGFpbmVkIGluIGRvY3VtZW50IGZvciAncmVtb3ZlJyBhY3Rpb25zIik7CiAgICB2YXIgbnVtUmFuZ2VSb3dzID0gZW5kLnJvdyAtIHN0YXJ0LnJvdzsKICAgIHZhciBudW1SYW5nZUxhc3RMaW5lQ2hhcnMgPSAoZW5kLmNvbHVtbiAtIChudW1SYW5nZVJvd3MgPT0gMCA/IHN0YXJ0LmNvbHVtbiA6IDApKTsKICAgIGlmIChudW1SYW5nZVJvd3MgIT0gZGVsdGEubGluZXMubGVuZ3RoIC0gMSB8fCBkZWx0YS5saW5lc1tudW1SYW5nZVJvd3NdLmxlbmd0aCAhPSBudW1SYW5nZUxhc3RMaW5lQ2hhcnMpCiAgICAgICAgdGhyb3dEZWx0YUVycm9yKGRlbHRhLCAiZGVsdGEucmFuZ2UgbXVzdCBtYXRjaCBkZWx0YSBsaW5lcyIpOwp9CgpleHBvcnRzLmFwcGx5RGVsdGEgPSBmdW5jdGlvbihkb2NMaW5lcywgZGVsdGEsIGRvTm90VmFsaWRhdGUpIHsKICAgIAogICAgdmFyIHJvdyA9IGRlbHRhLnN0YXJ0LnJvdzsKICAgIHZhciBzdGFydENvbHVtbiA9IGRlbHRhLnN0YXJ0LmNvbHVtbjsKICAgIHZhciBsaW5lID0gZG9jTGluZXNbcm93XSB8fCAiIjsKICAgIHN3aXRjaCAoZGVsdGEuYWN0aW9uKSB7CiAgICAgICAgY2FzZSAiaW5zZXJ0IjoKICAgICAgICAgICAgdmFyIGxpbmVzID0gZGVsdGEubGluZXM7CiAgICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgICAgIGRvY0xpbmVzW3Jvd10gPSBsaW5lLnN1YnN0cmluZygwLCBzdGFydENvbHVtbikgKyBkZWx0YS5saW5lc1swXSArIGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gW3JvdywgMV0uY29uY2F0KGRlbHRhLmxpbmVzKTsKICAgICAgICAgICAgICAgIGRvY0xpbmVzLnNwbGljZS5hcHBseShkb2NMaW5lcywgYXJncyk7CiAgICAgICAgICAgICAgICBkb2NMaW5lc1tyb3ddID0gbGluZS5zdWJzdHJpbmcoMCwgc3RhcnRDb2x1bW4pICsgZG9jTGluZXNbcm93XTsKICAgICAgICAgICAgICAgIGRvY0xpbmVzW3JvdyArIGRlbHRhLmxpbmVzLmxlbmd0aCAtIDFdICs9IGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJyZW1vdmUiOgogICAgICAgICAgICB2YXIgZW5kQ29sdW1uID0gZGVsdGEuZW5kLmNvbHVtbjsKICAgICAgICAgICAgdmFyIGVuZFJvdyA9IGRlbHRhLmVuZC5yb3c7CiAgICAgICAgICAgIGlmIChyb3cgPT09IGVuZFJvdykgewogICAgICAgICAgICAgICAgZG9jTGluZXNbcm93XSA9IGxpbmUuc3Vic3RyaW5nKDAsIHN0YXJ0Q29sdW1uKSArIGxpbmUuc3Vic3RyaW5nKGVuZENvbHVtbik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkb2NMaW5lcy5zcGxpY2UoCiAgICAgICAgICAgICAgICAgICAgcm93LCBlbmRSb3cgLSByb3cgKyAxLAogICAgICAgICAgICAgICAgICAgIGxpbmUuc3Vic3RyaW5nKDAsIHN0YXJ0Q29sdW1uKSArIGRvY0xpbmVzW2VuZFJvd10uc3Vic3RyaW5nKGVuZENvbHVtbikKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICB9Cn07Cn0pOwoKYWNlLmRlZmluZSgiYWNlL2xpYi9ldmVudF9lbWl0dGVyIixbXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBFdmVudEVtaXR0ZXIgPSB7fTsKdmFyIHN0b3BQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uKCkgeyB0aGlzLnByb3BhZ2F0aW9uU3RvcHBlZCA9IHRydWU7IH07CnZhciBwcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uKCkgeyB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlOyB9OwoKRXZlbnRFbWl0dGVyLl9lbWl0ID0KRXZlbnRFbWl0dGVyLl9kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24oZXZlbnROYW1lLCBlKSB7CiAgICB0aGlzLl9ldmVudFJlZ2lzdHJ5IHx8ICh0aGlzLl9ldmVudFJlZ2lzdHJ5ID0ge30pOwogICAgdGhpcy5fZGVmYXVsdEhhbmRsZXJzIHx8ICh0aGlzLl9kZWZhdWx0SGFuZGxlcnMgPSB7fSk7CgogICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXSB8fCBbXTsKICAgIHZhciBkZWZhdWx0SGFuZGxlciA9IHRoaXMuX2RlZmF1bHRIYW5kbGVyc1tldmVudE5hbWVdOwogICAgaWYgKCFsaXN0ZW5lcnMubGVuZ3RoICYmICFkZWZhdWx0SGFuZGxlcikKICAgICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZiBlICE9ICJvYmplY3QiIHx8ICFlKQogICAgICAgIGUgPSB7fTsKCiAgICBpZiAoIWUudHlwZSkKICAgICAgICBlLnR5cGUgPSBldmVudE5hbWU7CiAgICBpZiAoIWUuc3RvcFByb3BhZ2F0aW9uKQogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uID0gc3RvcFByb3BhZ2F0aW9uOwogICAgaWYgKCFlLnByZXZlbnREZWZhdWx0KQogICAgICAgIGUucHJldmVudERlZmF1bHQgPSBwcmV2ZW50RGVmYXVsdDsKCiAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuc2xpY2UoKTsKICAgIGZvciAodmFyIGk9MDsgaTxsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBsaXN0ZW5lcnNbaV0oZSwgdGhpcyk7CiAgICAgICAgaWYgKGUucHJvcGFnYXRpb25TdG9wcGVkKQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIAogICAgaWYgKGRlZmF1bHRIYW5kbGVyICYmICFlLmRlZmF1bHRQcmV2ZW50ZWQpCiAgICAgICAgcmV0dXJuIGRlZmF1bHRIYW5kbGVyKGUsIHRoaXMpOwp9OwoKCkV2ZW50RW1pdHRlci5fc2lnbmFsID0gZnVuY3Rpb24oZXZlbnROYW1lLCBlKSB7CiAgICB2YXIgbGlzdGVuZXJzID0gKHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge30pW2V2ZW50TmFtZV07CiAgICBpZiAoIWxpc3RlbmVycykKICAgICAgICByZXR1cm47CiAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuc2xpY2UoKTsKICAgIGZvciAodmFyIGk9MDsgaTxsaXN0ZW5lcnMubGVuZ3RoOyBpKyspCiAgICAgICAgbGlzdGVuZXJzW2ldKGUsIHRoaXMpOwp9OwoKRXZlbnRFbWl0dGVyLm9uY2UgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7CiAgICB2YXIgX3NlbGYgPSB0aGlzOwogICAgdGhpcy5vbihldmVudE5hbWUsIGZ1bmN0aW9uIG5ld0NhbGxiYWNrKCkgewogICAgICAgIF9zZWxmLm9mZihldmVudE5hbWUsIG5ld0NhbGxiYWNrKTsKICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgfSk7CiAgICBpZiAoIWNhbGxiYWNrKSB7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSByZXNvbHZlOwogICAgICAgIH0pOwogICAgfQp9OwoKCkV2ZW50RW1pdHRlci5zZXREZWZhdWx0SGFuZGxlciA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgY2FsbGJhY2spIHsKICAgIHZhciBoYW5kbGVycyA9IHRoaXMuX2RlZmF1bHRIYW5kbGVyczsKICAgIGlmICghaGFuZGxlcnMpCiAgICAgICAgaGFuZGxlcnMgPSB0aGlzLl9kZWZhdWx0SGFuZGxlcnMgPSB7X2Rpc2FibGVkXzoge319OwogICAgCiAgICBpZiAoaGFuZGxlcnNbZXZlbnROYW1lXSkgewogICAgICAgIHZhciBvbGQgPSBoYW5kbGVyc1tldmVudE5hbWVdOwogICAgICAgIHZhciBkaXNhYmxlZCA9IGhhbmRsZXJzLl9kaXNhYmxlZF9bZXZlbnROYW1lXTsKICAgICAgICBpZiAoIWRpc2FibGVkKQogICAgICAgICAgICBoYW5kbGVycy5fZGlzYWJsZWRfW2V2ZW50TmFtZV0gPSBkaXNhYmxlZCA9IFtdOwogICAgICAgIGRpc2FibGVkLnB1c2gob2xkKTsKICAgICAgICB2YXIgaSA9IGRpc2FibGVkLmluZGV4T2YoY2FsbGJhY2spOwogICAgICAgIGlmIChpICE9IC0xKSAKICAgICAgICAgICAgZGlzYWJsZWQuc3BsaWNlKGksIDEpOwogICAgfQogICAgaGFuZGxlcnNbZXZlbnROYW1lXSA9IGNhbGxiYWNrOwp9OwpFdmVudEVtaXR0ZXIucmVtb3ZlRGVmYXVsdEhhbmRsZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7CiAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLl9kZWZhdWx0SGFuZGxlcnM7CiAgICBpZiAoIWhhbmRsZXJzKQogICAgICAgIHJldHVybjsKICAgIHZhciBkaXNhYmxlZCA9IGhhbmRsZXJzLl9kaXNhYmxlZF9bZXZlbnROYW1lXTsKICAgIAogICAgaWYgKGhhbmRsZXJzW2V2ZW50TmFtZV0gPT0gY2FsbGJhY2spIHsKICAgICAgICBpZiAoZGlzYWJsZWQpCiAgICAgICAgICAgIHRoaXMuc2V0RGVmYXVsdEhhbmRsZXIoZXZlbnROYW1lLCBkaXNhYmxlZC5wb3AoKSk7CiAgICB9IGVsc2UgaWYgKGRpc2FibGVkKSB7CiAgICAgICAgdmFyIGkgPSBkaXNhYmxlZC5pbmRleE9mKGNhbGxiYWNrKTsKICAgICAgICBpZiAoaSAhPSAtMSkKICAgICAgICAgICAgZGlzYWJsZWQuc3BsaWNlKGksIDEpOwogICAgfQp9OwoKRXZlbnRFbWl0dGVyLm9uID0KRXZlbnRFbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrLCBjYXB0dXJpbmcpIHsKICAgIHRoaXMuX2V2ZW50UmVnaXN0cnkgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5IHx8IHt9OwoKICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5W2V2ZW50TmFtZV07CiAgICBpZiAoIWxpc3RlbmVycykKICAgICAgICBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5W2V2ZW50TmFtZV0gPSBbXTsKCiAgICBpZiAobGlzdGVuZXJzLmluZGV4T2YoY2FsbGJhY2spID09IC0xKQogICAgICAgIGxpc3RlbmVyc1tjYXB0dXJpbmcgPyAidW5zaGlmdCIgOiAicHVzaCJdKGNhbGxiYWNrKTsKICAgIHJldHVybiBjYWxsYmFjazsKfTsKCkV2ZW50RW1pdHRlci5vZmYgPQpFdmVudEVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPQpFdmVudEVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgY2FsbGJhY2spIHsKICAgIHRoaXMuX2V2ZW50UmVnaXN0cnkgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5IHx8IHt9OwoKICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5W2V2ZW50TmFtZV07CiAgICBpZiAoIWxpc3RlbmVycykKICAgICAgICByZXR1cm47CgogICAgdmFyIGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YoY2FsbGJhY2spOwogICAgaWYgKGluZGV4ICE9PSAtMSkKICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTsKfTsKCkV2ZW50RW1pdHRlci5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbihldmVudE5hbWUpIHsKICAgIGlmICghZXZlbnROYW1lKSB0aGlzLl9ldmVudFJlZ2lzdHJ5ID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzID0gdW5kZWZpbmVkOwogICAgaWYgKHRoaXMuX2V2ZW50UmVnaXN0cnkpIHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXSA9IHVuZGVmaW5lZDsKICAgIGlmICh0aGlzLl9kZWZhdWx0SGFuZGxlcnMpIHRoaXMuX2RlZmF1bHRIYW5kbGVyc1tldmVudE5hbWVdID0gdW5kZWZpbmVkOwp9OwoKZXhwb3J0cy5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7Cgp9KTsKCmFjZS5kZWZpbmUoImFjZS9hbmNob3IiLFtdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOwp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsKCnZhciBBbmNob3IgPSBleHBvcnRzLkFuY2hvciA9IGZ1bmN0aW9uKGRvYywgcm93LCBjb2x1bW4pIHsKICAgIHRoaXMuJG9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpOwogICAgdGhpcy5hdHRhY2goZG9jKTsKICAgIAogICAgaWYgKHR5cGVvZiBjb2x1bW4gPT0gInVuZGVmaW5lZCIpCiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbihyb3cucm93LCByb3cuY29sdW1uKTsKICAgIGVsc2UKICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHJvdywgY29sdW1uKTsKfTsKCihmdW5jdGlvbigpIHsKCiAgICBvb3AuaW1wbGVtZW50KHRoaXMsIEV2ZW50RW1pdHRlcik7CiAgICB0aGlzLmdldFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQodGhpcy5yb3csIHRoaXMuY29sdW1uKTsKICAgIH07CiAgICB0aGlzLmdldERvY3VtZW50ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnQ7CiAgICB9OwogICAgdGhpcy4kaW5zZXJ0UmlnaHQgPSBmYWxzZTsKICAgIHRoaXMub25DaGFuZ2UgPSBmdW5jdGlvbihkZWx0YSkgewogICAgICAgIGlmIChkZWx0YS5zdGFydC5yb3cgPT0gZGVsdGEuZW5kLnJvdyAmJiBkZWx0YS5zdGFydC5yb3cgIT0gdGhpcy5yb3cpCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgaWYgKGRlbHRhLnN0YXJ0LnJvdyA+IHRoaXMucm93KQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIAogICAgICAgIHZhciBwb2ludCA9ICRnZXRUcmFuc2Zvcm1lZFBvaW50KGRlbHRhLCB7cm93OiB0aGlzLnJvdywgY29sdW1uOiB0aGlzLmNvbHVtbn0sIHRoaXMuJGluc2VydFJpZ2h0KTsKICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHBvaW50LnJvdywgcG9pbnQuY29sdW1uLCB0cnVlKTsKICAgIH07CiAgICAKICAgIGZ1bmN0aW9uICRwb2ludHNJbk9yZGVyKHBvaW50MSwgcG9pbnQyLCBlcXVhbFBvaW50c0luT3JkZXIpIHsKICAgICAgICB2YXIgYkNvbElzQWZ0ZXIgPSBlcXVhbFBvaW50c0luT3JkZXIgPyBwb2ludDEuY29sdW1uIDw9IHBvaW50Mi5jb2x1bW4gOiBwb2ludDEuY29sdW1uIDwgcG9pbnQyLmNvbHVtbjsKICAgICAgICByZXR1cm4gKHBvaW50MS5yb3cgPCBwb2ludDIucm93KSB8fCAocG9pbnQxLnJvdyA9PSBwb2ludDIucm93ICYmIGJDb2xJc0FmdGVyKTsKICAgIH0KICAgICAgICAgICAgCiAgICBmdW5jdGlvbiAkZ2V0VHJhbnNmb3JtZWRQb2ludChkZWx0YSwgcG9pbnQsIG1vdmVJZkVxdWFsKSB7CiAgICAgICAgdmFyIGRlbHRhSXNJbnNlcnQgPSBkZWx0YS5hY3Rpb24gPT0gImluc2VydCI7CiAgICAgICAgdmFyIGRlbHRhUm93U2hpZnQgPSAoZGVsdGFJc0luc2VydCA/IDEgOiAtMSkgKiAoZGVsdGEuZW5kLnJvdyAgICAtIGRlbHRhLnN0YXJ0LnJvdyk7CiAgICAgICAgdmFyIGRlbHRhQ29sU2hpZnQgPSAoZGVsdGFJc0luc2VydCA/IDEgOiAtMSkgKiAoZGVsdGEuZW5kLmNvbHVtbiAtIGRlbHRhLnN0YXJ0LmNvbHVtbik7CiAgICAgICAgdmFyIGRlbHRhU3RhcnQgPSBkZWx0YS5zdGFydDsKICAgICAgICB2YXIgZGVsdGFFbmQgPSBkZWx0YUlzSW5zZXJ0ID8gZGVsdGFTdGFydCA6IGRlbHRhLmVuZDsgLy8gQ29sbGFwc2UgaW5zZXJ0IHJhbmdlLgogICAgICAgIGlmICgkcG9pbnRzSW5PcmRlcihwb2ludCwgZGVsdGFTdGFydCwgbW92ZUlmRXF1YWwpKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICByb3c6IHBvaW50LnJvdywKICAgICAgICAgICAgICAgIGNvbHVtbjogcG9pbnQuY29sdW1uCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmICgkcG9pbnRzSW5PcmRlcihkZWx0YUVuZCwgcG9pbnQsICFtb3ZlSWZFcXVhbCkpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHJvdzogcG9pbnQucm93ICsgZGVsdGFSb3dTaGlmdCwKICAgICAgICAgICAgICAgIGNvbHVtbjogcG9pbnQuY29sdW1uICsgKHBvaW50LnJvdyA9PSBkZWx0YUVuZC5yb3cgPyBkZWx0YUNvbFNoaWZ0IDogMCkKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcm93OiBkZWx0YVN0YXJ0LnJvdywKICAgICAgICAgICAgY29sdW1uOiBkZWx0YVN0YXJ0LmNvbHVtbgogICAgICAgIH07CiAgICB9CiAgICB0aGlzLnNldFBvc2l0aW9uID0gZnVuY3Rpb24ocm93LCBjb2x1bW4sIG5vQ2xpcCkgewogICAgICAgIHZhciBwb3M7CiAgICAgICAgaWYgKG5vQ2xpcCkgewogICAgICAgICAgICBwb3MgPSB7CiAgICAgICAgICAgICAgICByb3c6IHJvdywKICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uCiAgICAgICAgICAgIH07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcG9zID0gdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudChyb3csIGNvbHVtbik7CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy5yb3cgPT0gcG9zLnJvdyAmJiB0aGlzLmNvbHVtbiA9PSBwb3MuY29sdW1uKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHZhciBvbGQgPSB7CiAgICAgICAgICAgIHJvdzogdGhpcy5yb3csCiAgICAgICAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4KICAgICAgICB9OwoKICAgICAgICB0aGlzLnJvdyA9IHBvcy5yb3c7CiAgICAgICAgdGhpcy5jb2x1bW4gPSBwb3MuY29sdW1uOwogICAgICAgIHRoaXMuX3NpZ25hbCgiY2hhbmdlIiwgewogICAgICAgICAgICBvbGQ6IG9sZCwKICAgICAgICAgICAgdmFsdWU6IHBvcwogICAgICAgIH0pOwogICAgfTsKICAgIHRoaXMuZGV0YWNoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5kb2N1bWVudC5vZmYoImNoYW5nZSIsIHRoaXMuJG9uQ2hhbmdlKTsKICAgIH07CiAgICB0aGlzLmF0dGFjaCA9IGZ1bmN0aW9uKGRvYykgewogICAgICAgIHRoaXMuZG9jdW1lbnQgPSBkb2MgfHwgdGhpcy5kb2N1bWVudDsKICAgICAgICB0aGlzLmRvY3VtZW50Lm9uKCJjaGFuZ2UiLCB0aGlzLiRvbkNoYW5nZSk7CiAgICB9OwogICAgdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIHBvcyA9IHt9OwoKICAgICAgICBpZiAocm93ID49IHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKICAgICAgICAgICAgcG9zLnJvdyA9IE1hdGgubWF4KDAsIHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKTsKICAgICAgICAgICAgcG9zLmNvbHVtbiA9IHRoaXMuZG9jdW1lbnQuZ2V0TGluZShwb3Mucm93KS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHJvdyA8IDApIHsKICAgICAgICAgICAgcG9zLnJvdyA9IDA7CiAgICAgICAgICAgIHBvcy5jb2x1bW4gPSAwOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcG9zLnJvdyA9IHJvdzsKICAgICAgICAgICAgcG9zLmNvbHVtbiA9IE1hdGgubWluKHRoaXMuZG9jdW1lbnQuZ2V0TGluZShwb3Mucm93KS5sZW5ndGgsIE1hdGgubWF4KDAsIGNvbHVtbikpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbHVtbiA8IDApCiAgICAgICAgICAgIHBvcy5jb2x1bW4gPSAwOwoKICAgICAgICByZXR1cm4gcG9zOwogICAgfTsKCn0pLmNhbGwoQW5jaG9yLnByb3RvdHlwZSk7Cgp9KTsKCmFjZS5kZWZpbmUoImFjZS9kb2N1bWVudCIsW10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi9saWIvb29wIik7CnZhciBhcHBseURlbHRhID0gcmVxdWlyZSgiLi9hcHBseV9kZWx0YSIpLmFwcGx5RGVsdGE7CnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOwp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuL3JhbmdlIikuUmFuZ2U7CnZhciBBbmNob3IgPSByZXF1aXJlKCIuL2FuY2hvciIpLkFuY2hvcjsKCnZhciBEb2N1bWVudCA9IGZ1bmN0aW9uKHRleHRPckxpbmVzKSB7CiAgICB0aGlzLiRsaW5lcyA9IFsiIl07CiAgICBpZiAodGV4dE9yTGluZXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgdGhpcy4kbGluZXMgPSBbIiJdOwogICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRleHRPckxpbmVzKSkgewogICAgICAgIHRoaXMuaW5zZXJ0TWVyZ2VkTGluZXMoe3JvdzogMCwgY29sdW1uOiAwfSwgdGV4dE9yTGluZXMpOwogICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmluc2VydCh7cm93OiAwLCBjb2x1bW46MH0sIHRleHRPckxpbmVzKTsKICAgIH0KfTsKCihmdW5jdGlvbigpIHsKCiAgICBvb3AuaW1wbGVtZW50KHRoaXMsIEV2ZW50RW1pdHRlcik7CiAgICB0aGlzLnNldFZhbHVlID0gZnVuY3Rpb24odGV4dCkgewogICAgICAgIHZhciBsZW4gPSB0aGlzLmdldExlbmd0aCgpIC0gMTsKICAgICAgICB0aGlzLnJlbW92ZShuZXcgUmFuZ2UoMCwgMCwgbGVuLCB0aGlzLmdldExpbmUobGVuKS5sZW5ndGgpKTsKICAgICAgICB0aGlzLmluc2VydCh7cm93OiAwLCBjb2x1bW46IDB9LCB0ZXh0KTsKICAgIH07CiAgICB0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxsTGluZXMoKS5qb2luKHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpKTsKICAgIH07CiAgICB0aGlzLmNyZWF0ZUFuY2hvciA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgcmV0dXJuIG5ldyBBbmNob3IodGhpcywgcm93LCBjb2x1bW4pOwogICAgfTsKICAgIGlmICgiYWFhIi5zcGxpdCgvYS8pLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHRoaXMuJHNwbGl0ID0gZnVuY3Rpb24odGV4dCkgewogICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cclxufFxyL2csICJcbiIpLnNwbGl0KCJcbiIpOwogICAgICAgIH07CiAgICB9IGVsc2UgewogICAgICAgIHRoaXMuJHNwbGl0ID0gZnVuY3Rpb24odGV4dCkgewogICAgICAgICAgICByZXR1cm4gdGV4dC5zcGxpdCgvXHJcbnxccnxcbi8pOwogICAgICAgIH07CiAgICB9CgoKICAgIHRoaXMuJGRldGVjdE5ld0xpbmUgPSBmdW5jdGlvbih0ZXh0KSB7CiAgICAgICAgdmFyIG1hdGNoID0gdGV4dC5tYXRjaCgvXi4qPyhcclxufFxyfFxuKS9tKTsKICAgICAgICB0aGlzLiRhdXRvTmV3TGluZSA9IG1hdGNoID8gbWF0Y2hbMV0gOiAiXG4iOwogICAgICAgIHRoaXMuX3NpZ25hbCgiY2hhbmdlTmV3TGluZU1vZGUiKTsKICAgIH07CiAgICB0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICBzd2l0Y2ggKHRoaXMuJG5ld0xpbmVNb2RlKSB7CiAgICAgICAgICBjYXNlICJ3aW5kb3dzIjoKICAgICAgICAgICAgcmV0dXJuICJcclxuIjsKICAgICAgICAgIGNhc2UgInVuaXgiOgogICAgICAgICAgICByZXR1cm4gIlxuIjsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiB0aGlzLiRhdXRvTmV3TGluZSB8fCAiXG4iOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy4kYXV0b05ld0xpbmUgPSAiIjsKICAgIHRoaXMuJG5ld0xpbmVNb2RlID0gImF1dG8iOwogICAgdGhpcy5zZXROZXdMaW5lTW9kZSA9IGZ1bmN0aW9uKG5ld0xpbmVNb2RlKSB7CiAgICAgICAgaWYgKHRoaXMuJG5ld0xpbmVNb2RlID09PSBuZXdMaW5lTW9kZSkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB0aGlzLiRuZXdMaW5lTW9kZSA9IG5ld0xpbmVNb2RlOwogICAgICAgIHRoaXMuX3NpZ25hbCgiY2hhbmdlTmV3TGluZU1vZGUiKTsKICAgIH07CiAgICB0aGlzLmdldE5ld0xpbmVNb2RlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJG5ld0xpbmVNb2RlOwogICAgfTsKICAgIHRoaXMuaXNOZXdMaW5lID0gZnVuY3Rpb24odGV4dCkgewogICAgICAgIHJldHVybiAodGV4dCA9PSAiXHJcbiIgfHwgdGV4dCA9PSAiXHIiIHx8IHRleHQgPT0gIlxuIik7CiAgICB9OwogICAgdGhpcy5nZXRMaW5lID0gZnVuY3Rpb24ocm93KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJGxpbmVzW3Jvd10gfHwgIiI7CiAgICB9OwogICAgdGhpcy5nZXRMaW5lcyA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJGxpbmVzLnNsaWNlKGZpcnN0Um93LCBsYXN0Um93ICsgMSk7CiAgICB9OwogICAgdGhpcy5nZXRBbGxMaW5lcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmdldExpbmVzKDAsIHRoaXMuZ2V0TGVuZ3RoKCkpOwogICAgfTsKICAgIHRoaXMuZ2V0TGVuZ3RoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJGxpbmVzLmxlbmd0aDsKICAgIH07CiAgICB0aGlzLmdldFRleHRSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGluZXNGb3JSYW5nZShyYW5nZSkuam9pbih0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSk7CiAgICB9OwogICAgdGhpcy5nZXRMaW5lc0ZvclJhbmdlID0gZnVuY3Rpb24ocmFuZ2UpIHsKICAgICAgICB2YXIgbGluZXM7CiAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PT0gcmFuZ2UuZW5kLnJvdykgewogICAgICAgICAgICBsaW5lcyA9IFt0aGlzLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uKV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGluZXMgPSB0aGlzLmdldExpbmVzKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2UuZW5kLnJvdyk7CiAgICAgICAgICAgIGxpbmVzWzBdID0gKGxpbmVzWzBdIHx8ICIiKS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uKTsKICAgICAgICAgICAgdmFyIGwgPSBsaW5lcy5sZW5ndGggLSAxOwogICAgICAgICAgICBpZiAocmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdyA9PSBsKQogICAgICAgICAgICAgICAgbGluZXNbbF0gPSBsaW5lc1tsXS5zdWJzdHJpbmcoMCwgcmFuZ2UuZW5kLmNvbHVtbik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaW5lczsKICAgIH07CiAgICB0aGlzLmluc2VydExpbmVzID0gZnVuY3Rpb24ocm93LCBsaW5lcykgewogICAgICAgIGNvbnNvbGUud2FybigiVXNlIG9mIGRvY3VtZW50Lmluc2VydExpbmVzIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgaW5zZXJ0RnVsbExpbmVzIG1ldGhvZCBpbnN0ZWFkLiIpOwogICAgICAgIHJldHVybiB0aGlzLmluc2VydEZ1bGxMaW5lcyhyb3csIGxpbmVzKTsKICAgIH07CiAgICB0aGlzLnJlbW92ZUxpbmVzID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsKICAgICAgICBjb25zb2xlLndhcm4oIlVzZSBvZiBkb2N1bWVudC5yZW1vdmVMaW5lcyBpcyBkZXByZWNhdGVkLiBVc2UgdGhlIHJlbW92ZUZ1bGxMaW5lcyBtZXRob2QgaW5zdGVhZC4iKTsKICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVGdWxsTGluZXMoZmlyc3RSb3csIGxhc3RSb3cpOwogICAgfTsKICAgIHRoaXMuaW5zZXJ0TmV3TGluZSA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJVc2Ugb2YgZG9jdW1lbnQuaW5zZXJ0TmV3TGluZSBpcyBkZXByZWNhdGVkLiBVc2UgaW5zZXJ0TWVyZ2VkTGluZXMocG9zaXRpb24sIFsnJywgJyddKSBpbnN0ZWFkLiIpOwogICAgICAgIHJldHVybiB0aGlzLmluc2VydE1lcmdlZExpbmVzKHBvc2l0aW9uLCBbIiIsICIiXSk7CiAgICB9OwogICAgdGhpcy5pbnNlcnQgPSBmdW5jdGlvbihwb3NpdGlvbiwgdGV4dCkgewogICAgICAgIGlmICh0aGlzLmdldExlbmd0aCgpIDw9IDEpCiAgICAgICAgICAgIHRoaXMuJGRldGVjdE5ld0xpbmUodGV4dCk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0TWVyZ2VkTGluZXMocG9zaXRpb24sIHRoaXMuJHNwbGl0KHRleHQpKTsKICAgIH07CiAgICB0aGlzLmluc2VydEluTGluZSA9IGZ1bmN0aW9uKHBvc2l0aW9uLCB0ZXh0KSB7CiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5jbGlwcGVkUG9zKHBvc2l0aW9uLnJvdywgcG9zaXRpb24uY29sdW1uKTsKICAgICAgICB2YXIgZW5kID0gdGhpcy5wb3MocG9zaXRpb24ucm93LCBwb3NpdGlvbi5jb2x1bW4gKyB0ZXh0Lmxlbmd0aCk7CiAgICAgICAgCiAgICAgICAgdGhpcy5hcHBseURlbHRhKHsKICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LAogICAgICAgICAgICBlbmQ6IGVuZCwKICAgICAgICAgICAgYWN0aW9uOiAiaW5zZXJ0IiwKICAgICAgICAgICAgbGluZXM6IFt0ZXh0XQogICAgICAgIH0sIHRydWUpOwogICAgICAgIAogICAgICAgIHJldHVybiB0aGlzLmNsb25lUG9zKGVuZCk7CiAgICB9OwogICAgCiAgICB0aGlzLmNsaXBwZWRQb3MgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIHZhciBsZW5ndGggPSB0aGlzLmdldExlbmd0aCgpOwogICAgICAgIGlmIChyb3cgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICByb3cgPSBsZW5ndGg7CiAgICAgICAgfSBlbHNlIGlmIChyb3cgPCAwKSB7CiAgICAgICAgICAgIHJvdyA9IDA7CiAgICAgICAgfSBlbHNlIGlmIChyb3cgPj0gbGVuZ3RoKSB7CiAgICAgICAgICAgIHJvdyA9IGxlbmd0aCAtIDE7CiAgICAgICAgICAgIGNvbHVtbiA9IHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgdmFyIGxpbmUgPSB0aGlzLmdldExpbmUocm93KTsKICAgICAgICBpZiAoY29sdW1uID09IHVuZGVmaW5lZCkKICAgICAgICAgICAgY29sdW1uID0gbGluZS5sZW5ndGg7CiAgICAgICAgY29sdW1uID0gTWF0aC5taW4oTWF0aC5tYXgoY29sdW1uLCAwKSwgbGluZS5sZW5ndGgpOwogICAgICAgIHJldHVybiB7cm93OiByb3csIGNvbHVtbjogY29sdW1ufTsKICAgIH07CiAgICAKICAgIHRoaXMuY2xvbmVQb3MgPSBmdW5jdGlvbihwb3MpIHsKICAgICAgICByZXR1cm4ge3JvdzogcG9zLnJvdywgY29sdW1uOiBwb3MuY29sdW1ufTsKICAgIH07CiAgICAKICAgIHRoaXMucG9zID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICByZXR1cm4ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn07CiAgICB9OwogICAgCiAgICB0aGlzLiRjbGlwUG9zaXRpb24gPSBmdW5jdGlvbihwb3NpdGlvbikgewogICAgICAgIHZhciBsZW5ndGggPSB0aGlzLmdldExlbmd0aCgpOwogICAgICAgIGlmIChwb3NpdGlvbi5yb3cgPj0gbGVuZ3RoKSB7CiAgICAgICAgICAgIHBvc2l0aW9uLnJvdyA9IE1hdGgubWF4KDAsIGxlbmd0aCAtIDEpOwogICAgICAgICAgICBwb3NpdGlvbi5jb2x1bW4gPSB0aGlzLmdldExpbmUobGVuZ3RoIC0gMSkubGVuZ3RoOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHBvc2l0aW9uLnJvdyA9IE1hdGgubWF4KDAsIHBvc2l0aW9uLnJvdyk7CiAgICAgICAgICAgIHBvc2l0aW9uLmNvbHVtbiA9IE1hdGgubWluKE1hdGgubWF4KHBvc2l0aW9uLmNvbHVtbiwgMCksIHRoaXMuZ2V0TGluZShwb3NpdGlvbi5yb3cpLmxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgIH07CiAgICB0aGlzLmluc2VydEZ1bGxMaW5lcyA9IGZ1bmN0aW9uKHJvdywgbGluZXMpIHsKICAgICAgICByb3cgPSBNYXRoLm1pbihNYXRoLm1heChyb3csIDApLCB0aGlzLmdldExlbmd0aCgpKTsKICAgICAgICB2YXIgY29sdW1uID0gMDsKICAgICAgICBpZiAocm93IDwgdGhpcy5nZXRMZW5ndGgoKSkgewogICAgICAgICAgICBsaW5lcyA9IGxpbmVzLmNvbmNhdChbIiJdKTsKICAgICAgICAgICAgY29sdW1uID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsaW5lcyA9IFsiIl0uY29uY2F0KGxpbmVzKTsKICAgICAgICAgICAgcm93LS07CiAgICAgICAgICAgIGNvbHVtbiA9IHRoaXMuJGxpbmVzW3Jvd10ubGVuZ3RoOwogICAgICAgIH0KICAgICAgICB0aGlzLmluc2VydE1lcmdlZExpbmVzKHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59LCBsaW5lcyk7CiAgICB9OyAgICAKICAgIHRoaXMuaW5zZXJ0TWVyZ2VkTGluZXMgPSBmdW5jdGlvbihwb3NpdGlvbiwgbGluZXMpIHsKICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmNsaXBwZWRQb3MocG9zaXRpb24ucm93LCBwb3NpdGlvbi5jb2x1bW4pOwogICAgICAgIHZhciBlbmQgPSB7CiAgICAgICAgICAgIHJvdzogc3RhcnQucm93ICsgbGluZXMubGVuZ3RoIC0gMSwKICAgICAgICAgICAgY29sdW1uOiAobGluZXMubGVuZ3RoID09IDEgPyBzdGFydC5jb2x1bW4gOiAwKSArIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdLmxlbmd0aAogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgdGhpcy5hcHBseURlbHRhKHsKICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LAogICAgICAgICAgICBlbmQ6IGVuZCwKICAgICAgICAgICAgYWN0aW9uOiAiaW5zZXJ0IiwKICAgICAgICAgICAgbGluZXM6IGxpbmVzCiAgICAgICAgfSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmVQb3MoZW5kKTsKICAgIH07CiAgICB0aGlzLnJlbW92ZSA9IGZ1bmN0aW9uKHJhbmdlKSB7CiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5jbGlwcGVkUG9zKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2Uuc3RhcnQuY29sdW1uKTsKICAgICAgICB2YXIgZW5kID0gdGhpcy5jbGlwcGVkUG9zKHJhbmdlLmVuZC5yb3csIHJhbmdlLmVuZC5jb2x1bW4pOwogICAgICAgIHRoaXMuYXBwbHlEZWx0YSh7CiAgICAgICAgICAgIHN0YXJ0OiBzdGFydCwKICAgICAgICAgICAgZW5kOiBlbmQsCiAgICAgICAgICAgIGFjdGlvbjogInJlbW92ZSIsCiAgICAgICAgICAgIGxpbmVzOiB0aGlzLmdldExpbmVzRm9yUmFuZ2Uoe3N0YXJ0OiBzdGFydCwgZW5kOiBlbmR9KQogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0aGlzLmNsb25lUG9zKHN0YXJ0KTsKICAgIH07CiAgICB0aGlzLnJlbW92ZUluTGluZSA9IGZ1bmN0aW9uKHJvdywgc3RhcnRDb2x1bW4sIGVuZENvbHVtbikgewogICAgICAgIHZhciBzdGFydCA9IHRoaXMuY2xpcHBlZFBvcyhyb3csIHN0YXJ0Q29sdW1uKTsKICAgICAgICB2YXIgZW5kID0gdGhpcy5jbGlwcGVkUG9zKHJvdywgZW5kQ29sdW1uKTsKICAgICAgICAKICAgICAgICB0aGlzLmFwcGx5RGVsdGEoewogICAgICAgICAgICBzdGFydDogc3RhcnQsCiAgICAgICAgICAgIGVuZDogZW5kLAogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmUiLAogICAgICAgICAgICBsaW5lczogdGhpcy5nZXRMaW5lc0ZvclJhbmdlKHtzdGFydDogc3RhcnQsIGVuZDogZW5kfSkKICAgICAgICB9LCB0cnVlKTsKICAgICAgICAKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZVBvcyhzdGFydCk7CiAgICB9OwogICAgdGhpcy5yZW1vdmVGdWxsTGluZXMgPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgewogICAgICAgIGZpcnN0Um93ID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgZmlyc3RSb3cpLCB0aGlzLmdldExlbmd0aCgpIC0gMSk7CiAgICAgICAgbGFzdFJvdyAgPSBNYXRoLm1pbihNYXRoLm1heCgwLCBsYXN0Um93ICksIHRoaXMuZ2V0TGVuZ3RoKCkgLSAxKTsKICAgICAgICB2YXIgZGVsZXRlRmlyc3ROZXdMaW5lID0gbGFzdFJvdyA9PSB0aGlzLmdldExlbmd0aCgpIC0gMSAmJiBmaXJzdFJvdyA+IDA7CiAgICAgICAgdmFyIGRlbGV0ZUxhc3ROZXdMaW5lICA9IGxhc3RSb3cgIDwgdGhpcy5nZXRMZW5ndGgoKSAtIDE7CiAgICAgICAgdmFyIHN0YXJ0Um93ID0gKCBkZWxldGVGaXJzdE5ld0xpbmUgPyBmaXJzdFJvdyAtIDEgICAgICAgICAgICAgICAgICA6IGZpcnN0Um93ICAgICAgICAgICAgICAgICAgICApOwogICAgICAgIHZhciBzdGFydENvbCA9ICggZGVsZXRlRmlyc3ROZXdMaW5lID8gdGhpcy5nZXRMaW5lKHN0YXJ0Um93KS5sZW5ndGggOiAwICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICB2YXIgZW5kUm93ICAgPSAoIGRlbGV0ZUxhc3ROZXdMaW5lICA/IGxhc3RSb3cgKyAxICAgICAgICAgICAgICAgICAgIDogbGFzdFJvdyAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgdmFyIGVuZENvbCAgID0gKCBkZWxldGVMYXN0TmV3TGluZSAgPyAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZ2V0TGluZShlbmRSb3cpLmxlbmd0aCApOyAKICAgICAgICB2YXIgcmFuZ2UgPSBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sLCBlbmRSb3csIGVuZENvbCk7CiAgICAgICAgdmFyIGRlbGV0ZWRMaW5lcyA9IHRoaXMuJGxpbmVzLnNsaWNlKGZpcnN0Um93LCBsYXN0Um93ICsgMSk7CiAgICAgICAgCiAgICAgICAgdGhpcy5hcHBseURlbHRhKHsKICAgICAgICAgICAgc3RhcnQ6IHJhbmdlLnN0YXJ0LAogICAgICAgICAgICBlbmQ6IHJhbmdlLmVuZCwKICAgICAgICAgICAgYWN0aW9uOiAicmVtb3ZlIiwKICAgICAgICAgICAgbGluZXM6IHRoaXMuZ2V0TGluZXNGb3JSYW5nZShyYW5nZSkKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZGVsZXRlZExpbmVzOwogICAgfTsKICAgIHRoaXMucmVtb3ZlTmV3TGluZSA9IGZ1bmN0aW9uKHJvdykgewogICAgICAgIGlmIChyb3cgPCB0aGlzLmdldExlbmd0aCgpIC0gMSAmJiByb3cgPj0gMCkgewogICAgICAgICAgICB0aGlzLmFwcGx5RGVsdGEoewogICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMucG9zKHJvdywgdGhpcy5nZXRMaW5lKHJvdykubGVuZ3RoKSwKICAgICAgICAgICAgICAgIGVuZDogdGhpcy5wb3Mocm93ICsgMSwgMCksCiAgICAgICAgICAgICAgICBhY3Rpb246ICJyZW1vdmUiLAogICAgICAgICAgICAgICAgbGluZXM6IFsiIiwgIiJdCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH07CiAgICB0aGlzLnJlcGxhY2UgPSBmdW5jdGlvbihyYW5nZSwgdGV4dCkgewogICAgICAgIGlmICghKHJhbmdlIGluc3RhbmNlb2YgUmFuZ2UpKQogICAgICAgICAgICByYW5nZSA9IFJhbmdlLmZyb21Qb2ludHMocmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7CiAgICAgICAgaWYgKHRleHQubGVuZ3RoID09PSAwICYmIHJhbmdlLmlzRW1wdHkoKSkKICAgICAgICAgICAgcmV0dXJuIHJhbmdlLnN0YXJ0OwogICAgICAgIGlmICh0ZXh0ID09IHRoaXMuZ2V0VGV4dFJhbmdlKHJhbmdlKSkKICAgICAgICAgICAgcmV0dXJuIHJhbmdlLmVuZDsKCiAgICAgICAgdGhpcy5yZW1vdmUocmFuZ2UpOwogICAgICAgIHZhciBlbmQ7CiAgICAgICAgaWYgKHRleHQpIHsKICAgICAgICAgICAgZW5kID0gdGhpcy5pbnNlcnQocmFuZ2Uuc3RhcnQsIHRleHQpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZW5kID0gcmFuZ2Uuc3RhcnQ7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBlbmQ7CiAgICB9OwogICAgdGhpcy5hcHBseURlbHRhcyA9IGZ1bmN0aW9uKGRlbHRhcykgewogICAgICAgIGZvciAodmFyIGk9MDsgaTxkZWx0YXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5hcHBseURlbHRhKGRlbHRhc1tpXSk7CiAgICAgICAgfQogICAgfTsKICAgIHRoaXMucmV2ZXJ0RGVsdGFzID0gZnVuY3Rpb24oZGVsdGFzKSB7CiAgICAgICAgZm9yICh2YXIgaT1kZWx0YXMubGVuZ3RoLTE7IGk+PTA7IGktLSkgewogICAgICAgICAgICB0aGlzLnJldmVydERlbHRhKGRlbHRhc1tpXSk7CiAgICAgICAgfQogICAgfTsKICAgIHRoaXMuYXBwbHlEZWx0YSA9IGZ1bmN0aW9uKGRlbHRhLCBkb05vdFZhbGlkYXRlKSB7CiAgICAgICAgdmFyIGlzSW5zZXJ0ID0gZGVsdGEuYWN0aW9uID09ICJpbnNlcnQiOwogICAgICAgIGlmIChpc0luc2VydCA/IGRlbHRhLmxpbmVzLmxlbmd0aCA8PSAxICYmICFkZWx0YS5saW5lc1swXQogICAgICAgICAgICA6ICFSYW5nZS5jb21wYXJlUG9pbnRzKGRlbHRhLnN0YXJ0LCBkZWx0YS5lbmQpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKGlzSW5zZXJ0ICYmIGRlbHRhLmxpbmVzLmxlbmd0aCA+IDIwMDAwKSB7CiAgICAgICAgICAgIHRoaXMuJHNwbGl0QW5kYXBwbHlMYXJnZURlbHRhKGRlbHRhLCAyMDAwMCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBhcHBseURlbHRhKHRoaXMuJGxpbmVzLCBkZWx0YSwgZG9Ob3RWYWxpZGF0ZSk7CiAgICAgICAgICAgIHRoaXMuX3NpZ25hbCgiY2hhbmdlIiwgZGVsdGEpOwogICAgICAgIH0KICAgIH07CiAgICAKICAgIHRoaXMuJHNhZmVBcHBseURlbHRhID0gZnVuY3Rpb24oZGVsdGEpIHsKICAgICAgICB2YXIgZG9jTGVuZ3RoID0gdGhpcy4kbGluZXMubGVuZ3RoOwogICAgICAgIGlmICgKICAgICAgICAgICAgZGVsdGEuYWN0aW9uID09ICJyZW1vdmUiICYmIGRlbHRhLnN0YXJ0LnJvdyA8IGRvY0xlbmd0aCAmJiBkZWx0YS5lbmQucm93IDwgZG9jTGVuZ3RoCiAgICAgICAgICAgIHx8IGRlbHRhLmFjdGlvbiA9PSAiaW5zZXJ0IiAmJiBkZWx0YS5zdGFydC5yb3cgPD0gZG9jTGVuZ3RoCiAgICAgICAgKSB7CiAgICAgICAgICAgIHRoaXMuYXBwbHlEZWx0YShkZWx0YSk7CiAgICAgICAgfQogICAgfTsKICAgIAogICAgdGhpcy4kc3BsaXRBbmRhcHBseUxhcmdlRGVsdGEgPSBmdW5jdGlvbihkZWx0YSwgTUFYKSB7CiAgICAgICAgdmFyIGxpbmVzID0gZGVsdGEubGluZXM7CiAgICAgICAgdmFyIGwgPSBsaW5lcy5sZW5ndGggLSBNQVggKyAxOwogICAgICAgIHZhciByb3cgPSBkZWx0YS5zdGFydC5yb3c7IAogICAgICAgIHZhciBjb2x1bW4gPSBkZWx0YS5zdGFydC5jb2x1bW47CiAgICAgICAgZm9yICh2YXIgZnJvbSA9IDAsIHRvID0gMDsgZnJvbSA8IGw7IGZyb20gPSB0bykgewogICAgICAgICAgICB0byArPSBNQVggLSAxOwogICAgICAgICAgICB2YXIgY2h1bmsgPSBsaW5lcy5zbGljZShmcm9tLCB0byk7CiAgICAgICAgICAgIGNodW5rLnB1c2goIiIpOwogICAgICAgICAgICB0aGlzLmFwcGx5RGVsdGEoewogICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMucG9zKHJvdyArIGZyb20sIGNvbHVtbiksCiAgICAgICAgICAgICAgICBlbmQ6IHRoaXMucG9zKHJvdyArIHRvLCBjb2x1bW4gPSAwKSwKICAgICAgICAgICAgICAgIGFjdGlvbjogZGVsdGEuYWN0aW9uLAogICAgICAgICAgICAgICAgbGluZXM6IGNodW5rCiAgICAgICAgICAgIH0sIHRydWUpOwogICAgICAgIH0KICAgICAgICBkZWx0YS5saW5lcyA9IGxpbmVzLnNsaWNlKGZyb20pOwogICAgICAgIGRlbHRhLnN0YXJ0LnJvdyA9IHJvdyArIGZyb207CiAgICAgICAgZGVsdGEuc3RhcnQuY29sdW1uID0gY29sdW1uOwogICAgICAgIHRoaXMuYXBwbHlEZWx0YShkZWx0YSwgdHJ1ZSk7CiAgICB9OwogICAgdGhpcy5yZXZlcnREZWx0YSA9IGZ1bmN0aW9uKGRlbHRhKSB7CiAgICAgICAgdGhpcy4kc2FmZUFwcGx5RGVsdGEoewogICAgICAgICAgICBzdGFydDogdGhpcy5jbG9uZVBvcyhkZWx0YS5zdGFydCksCiAgICAgICAgICAgIGVuZDogdGhpcy5jbG9uZVBvcyhkZWx0YS5lbmQpLAogICAgICAgICAgICBhY3Rpb246IChkZWx0YS5hY3Rpb24gPT0gImluc2VydCIgPyAicmVtb3ZlIiA6ICJpbnNlcnQiKSwKICAgICAgICAgICAgbGluZXM6IGRlbHRhLmxpbmVzLnNsaWNlKCkKICAgICAgICB9KTsKICAgIH07CiAgICB0aGlzLmluZGV4VG9Qb3NpdGlvbiA9IGZ1bmN0aW9uKGluZGV4LCBzdGFydFJvdykgewogICAgICAgIHZhciBsaW5lcyA9IHRoaXMuJGxpbmVzIHx8IHRoaXMuZ2V0QWxsTGluZXMoKTsKICAgICAgICB2YXIgbmV3bGluZUxlbmd0aCA9IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpLmxlbmd0aDsKICAgICAgICBmb3IgKHZhciBpID0gc3RhcnRSb3cgfHwgMCwgbCA9IGxpbmVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICBpbmRleCAtPSBsaW5lc1tpXS5sZW5ndGggKyBuZXdsaW5lTGVuZ3RoOwogICAgICAgICAgICBpZiAoaW5kZXggPCAwKQogICAgICAgICAgICAgICAgcmV0dXJuIHtyb3c6IGksIGNvbHVtbjogaW5kZXggKyBsaW5lc1tpXS5sZW5ndGggKyBuZXdsaW5lTGVuZ3RofTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHtyb3c6IGwtMSwgY29sdW1uOiBpbmRleCArIGxpbmVzW2wtMV0ubGVuZ3RoICsgbmV3bGluZUxlbmd0aH07CiAgICB9OwogICAgdGhpcy5wb3NpdGlvblRvSW5kZXggPSBmdW5jdGlvbihwb3MsIHN0YXJ0Um93KSB7CiAgICAgICAgdmFyIGxpbmVzID0gdGhpcy4kbGluZXMgfHwgdGhpcy5nZXRBbGxMaW5lcygpOwogICAgICAgIHZhciBuZXdsaW5lTGVuZ3RoID0gdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkubGVuZ3RoOwogICAgICAgIHZhciBpbmRleCA9IDA7CiAgICAgICAgdmFyIHJvdyA9IE1hdGgubWluKHBvcy5yb3csIGxpbmVzLmxlbmd0aCk7CiAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0Um93IHx8IDA7IGkgPCByb3c7ICsraSkKICAgICAgICAgICAgaW5kZXggKz0gbGluZXNbaV0ubGVuZ3RoICsgbmV3bGluZUxlbmd0aDsKCiAgICAgICAgcmV0dXJuIGluZGV4ICsgcG9zLmNvbHVtbjsKICAgIH07Cgp9KS5jYWxsKERvY3VtZW50LnByb3RvdHlwZSk7CgpleHBvcnRzLkRvY3VtZW50ID0gRG9jdW1lbnQ7Cn0pOwoKYWNlLmRlZmluZSgiYWNlL2xpYi9sYW5nIixbXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCmV4cG9ydHMubGFzdCA9IGZ1bmN0aW9uKGEpIHsKICAgIHJldHVybiBhW2EubGVuZ3RoIC0gMV07Cn07CgpleHBvcnRzLnN0cmluZ1JldmVyc2UgPSBmdW5jdGlvbihzdHJpbmcpIHsKICAgIHJldHVybiBzdHJpbmcuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKTsKfTsKCmV4cG9ydHMuc3RyaW5nUmVwZWF0ID0gZnVuY3Rpb24gKHN0cmluZywgY291bnQpIHsKICAgIHZhciByZXN1bHQgPSAnJzsKICAgIHdoaWxlIChjb3VudCA+IDApIHsKICAgICAgICBpZiAoY291bnQgJiAxKQogICAgICAgICAgICByZXN1bHQgKz0gc3RyaW5nOwoKICAgICAgICBpZiAoY291bnQgPj49IDEpCiAgICAgICAgICAgIHN0cmluZyArPSBzdHJpbmc7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9OwoKdmFyIHRyaW1CZWdpblJlZ2V4cCA9IC9eXHNccyovOwp2YXIgdHJpbUVuZFJlZ2V4cCA9IC9cc1xzKiQvOwoKZXhwb3J0cy5zdHJpbmdUcmltTGVmdCA9IGZ1bmN0aW9uIChzdHJpbmcpIHsKICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSh0cmltQmVnaW5SZWdleHAsICcnKTsKfTsKCmV4cG9ydHMuc3RyaW5nVHJpbVJpZ2h0ID0gZnVuY3Rpb24gKHN0cmluZykgewogICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHRyaW1FbmRSZWdleHAsICcnKTsKfTsKCmV4cG9ydHMuY29weU9iamVjdCA9IGZ1bmN0aW9uKG9iaikgewogICAgdmFyIGNvcHkgPSB7fTsKICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKICAgICAgICBjb3B5W2tleV0gPSBvYmpba2V5XTsKICAgIH0KICAgIHJldHVybiBjb3B5Owp9OwoKZXhwb3J0cy5jb3B5QXJyYXkgPSBmdW5jdGlvbihhcnJheSl7CiAgICB2YXIgY29weSA9IFtdOwogICAgZm9yICh2YXIgaT0wLCBsPWFycmF5Lmxlbmd0aDsgaTxsOyBpKyspIHsKICAgICAgICBpZiAoYXJyYXlbaV0gJiYgdHlwZW9mIGFycmF5W2ldID09ICJvYmplY3QiKQogICAgICAgICAgICBjb3B5W2ldID0gdGhpcy5jb3B5T2JqZWN0KGFycmF5W2ldKTsKICAgICAgICBlbHNlIAogICAgICAgICAgICBjb3B5W2ldID0gYXJyYXlbaV07CiAgICB9CiAgICByZXR1cm4gY29weTsKfTsKCmV4cG9ydHMuZGVlcENvcHkgPSBmdW5jdGlvbiBkZWVwQ29weShvYmopIHsKICAgIGlmICh0eXBlb2Ygb2JqICE9PSAib2JqZWN0IiB8fCAhb2JqKQogICAgICAgIHJldHVybiBvYmo7CiAgICB2YXIgY29weTsKICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHsKICAgICAgICBjb3B5ID0gW107CiAgICAgICAgZm9yICh2YXIga2V5ID0gMDsga2V5IDwgb2JqLmxlbmd0aDsga2V5KyspIHsKICAgICAgICAgICAgY29weVtrZXldID0gZGVlcENvcHkob2JqW2tleV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29weTsKICAgIH0KICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSAhPT0gIltvYmplY3QgT2JqZWN0XSIpCiAgICAgICAgcmV0dXJuIG9iajsKICAgIAogICAgY29weSA9IHt9OwogICAgZm9yICh2YXIga2V5IGluIG9iaikKICAgICAgICBjb3B5W2tleV0gPSBkZWVwQ29weShvYmpba2V5XSk7CiAgICByZXR1cm4gY29weTsKfTsKCmV4cG9ydHMuYXJyYXlUb01hcCA9IGZ1bmN0aW9uKGFycikgewogICAgdmFyIG1hcCA9IHt9OwogICAgZm9yICh2YXIgaT0wOyBpPGFyci5sZW5ndGg7IGkrKykgewogICAgICAgIG1hcFthcnJbaV1dID0gMTsKICAgIH0KICAgIHJldHVybiBtYXA7Cgp9OwoKZXhwb3J0cy5jcmVhdGVNYXAgPSBmdW5jdGlvbihwcm9wcykgewogICAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBmb3IgKHZhciBpIGluIHByb3BzKSB7CiAgICAgICAgbWFwW2ldID0gcHJvcHNbaV07CiAgICB9CiAgICByZXR1cm4gbWFwOwp9OwpleHBvcnRzLmFycmF5UmVtb3ZlID0gZnVuY3Rpb24oYXJyYXksIHZhbHVlKSB7CiAgZm9yICh2YXIgaSA9IDA7IGkgPD0gYXJyYXkubGVuZ3RoOyBpKyspIHsKICAgIGlmICh2YWx1ZSA9PT0gYXJyYXlbaV0pIHsKICAgICAgYXJyYXkuc3BsaWNlKGksIDEpOwogICAgfQogIH0KfTsKCmV4cG9ydHMuZXNjYXBlUmVnRXhwID0gZnVuY3Rpb24oc3RyKSB7CiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbLiorP14ke30oKXxbXF1cL1xcXSkvZywgJ1xcJDEnKTsKfTsKCmV4cG9ydHMuZXNjYXBlSFRNTCA9IGZ1bmN0aW9uKHN0cikgewogICAgcmV0dXJuICgiIiArIHN0cikucmVwbGFjZSgvJi9nLCAiJiMzODsiKS5yZXBsYWNlKC8iL2csICImIzM0OyIpLnJlcGxhY2UoLycvZywgIiYjMzk7IikucmVwbGFjZSgvPC9nLCAiJiM2MDsiKTsKfTsKCmV4cG9ydHMuZ2V0TWF0Y2hPZmZzZXRzID0gZnVuY3Rpb24oc3RyaW5nLCByZWdFeHApIHsKICAgIHZhciBtYXRjaGVzID0gW107CgogICAgc3RyaW5nLnJlcGxhY2UocmVnRXhwLCBmdW5jdGlvbihzdHIpIHsKICAgICAgICBtYXRjaGVzLnB1c2goewogICAgICAgICAgICBvZmZzZXQ6IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTJdLAogICAgICAgICAgICBsZW5ndGg6IHN0ci5sZW5ndGgKICAgICAgICB9KTsKICAgIH0pOwoKICAgIHJldHVybiBtYXRjaGVzOwp9OwpleHBvcnRzLmRlZmVycmVkQ2FsbCA9IGZ1bmN0aW9uKGZjbikgewogICAgdmFyIHRpbWVyID0gbnVsbDsKICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRpbWVyID0gbnVsbDsKICAgICAgICBmY24oKTsKICAgIH07CgogICAgdmFyIGRlZmVycmVkID0gZnVuY3Rpb24odGltZW91dCkgewogICAgICAgIGRlZmVycmVkLmNhbmNlbCgpOwogICAgICAgIHRpbWVyID0gc2V0VGltZW91dChjYWxsYmFjaywgdGltZW91dCB8fCAwKTsKICAgICAgICByZXR1cm4gZGVmZXJyZWQ7CiAgICB9OwoKICAgIGRlZmVycmVkLnNjaGVkdWxlID0gZGVmZXJyZWQ7CgogICAgZGVmZXJyZWQuY2FsbCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuY2FuY2VsKCk7CiAgICAgICAgZmNuKCk7CiAgICAgICAgcmV0dXJuIGRlZmVycmVkOwogICAgfTsKCiAgICBkZWZlcnJlZC5jYW5jZWwgPSBmdW5jdGlvbigpIHsKICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpOwogICAgICAgIHRpbWVyID0gbnVsbDsKICAgICAgICByZXR1cm4gZGVmZXJyZWQ7CiAgICB9OwogICAgCiAgICBkZWZlcnJlZC5pc1BlbmRpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGltZXI7CiAgICB9OwoKICAgIHJldHVybiBkZWZlcnJlZDsKfTsKCgpleHBvcnRzLmRlbGF5ZWRDYWxsID0gZnVuY3Rpb24oZmNuLCBkZWZhdWx0VGltZW91dCkgewogICAgdmFyIHRpbWVyID0gbnVsbDsKICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRpbWVyID0gbnVsbDsKICAgICAgICBmY24oKTsKICAgIH07CgogICAgdmFyIF9zZWxmID0gZnVuY3Rpb24odGltZW91dCkgewogICAgICAgIGlmICh0aW1lciA9PSBudWxsKQogICAgICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIHRpbWVvdXQgfHwgZGVmYXVsdFRpbWVvdXQpOwogICAgfTsKCiAgICBfc2VsZi5kZWxheSA9IGZ1bmN0aW9uKHRpbWVvdXQpIHsKICAgICAgICB0aW1lciAmJiBjbGVhclRpbWVvdXQodGltZXIpOwogICAgICAgIHRpbWVyID0gc2V0VGltZW91dChjYWxsYmFjaywgdGltZW91dCB8fCBkZWZhdWx0VGltZW91dCk7CiAgICB9OwogICAgX3NlbGYuc2NoZWR1bGUgPSBfc2VsZjsKCiAgICBfc2VsZi5jYWxsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5jYW5jZWwoKTsKICAgICAgICBmY24oKTsKICAgIH07CgogICAgX3NlbGYuY2FuY2VsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGltZXIgJiYgY2xlYXJUaW1lb3V0KHRpbWVyKTsKICAgICAgICB0aW1lciA9IG51bGw7CiAgICB9OwoKICAgIF9zZWxmLmlzUGVuZGluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aW1lcjsKICAgIH07CgogICAgcmV0dXJuIF9zZWxmOwp9Owp9KTsKCmFjZS5kZWZpbmUoImFjZS93b3JrZXIvbWlycm9yIixbXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7CnZhciBEb2N1bWVudCA9IHJlcXVpcmUoIi4uL2RvY3VtZW50IikuRG9jdW1lbnQ7CnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsKICAgIAp2YXIgTWlycm9yID0gZXhwb3J0cy5NaXJyb3IgPSBmdW5jdGlvbihzZW5kZXIpIHsKICAgIHRoaXMuc2VuZGVyID0gc2VuZGVyOwogICAgdmFyIGRvYyA9IHRoaXMuZG9jID0gbmV3IERvY3VtZW50KCIiKTsKICAgIAogICAgdmFyIGRlZmVycmVkVXBkYXRlID0gdGhpcy5kZWZlcnJlZFVwZGF0ZSA9IGxhbmcuZGVsYXllZENhbGwodGhpcy5vblVwZGF0ZS5iaW5kKHRoaXMpKTsKICAgIAogICAgdmFyIF9zZWxmID0gdGhpczsKICAgIHNlbmRlci5vbigiY2hhbmdlIiwgZnVuY3Rpb24oZSkgewogICAgICAgIHZhciBkYXRhID0gZS5kYXRhOwogICAgICAgIGlmIChkYXRhWzBdLnN0YXJ0KSB7CiAgICAgICAgICAgIGRvYy5hcHBseURlbHRhcyhkYXRhKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGFbaSsxXSkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHthY3Rpb246ICJpbnNlcnQiLCBzdGFydDogZGF0YVtpXSwgbGluZXM6IGRhdGFbaSsxXX07CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0ge2FjdGlvbjogInJlbW92ZSIsIHN0YXJ0OiBkYXRhW2ldLCBlbmQ6IGRhdGFbaSsxXX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkb2MuYXBwbHlEZWx0YShkLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoX3NlbGYuJHRpbWVvdXQpCiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZFVwZGF0ZS5zY2hlZHVsZShfc2VsZi4kdGltZW91dCk7CiAgICAgICAgX3NlbGYub25VcGRhdGUoKTsKICAgIH0pOwp9OwoKKGZ1bmN0aW9uKCkgewogICAgCiAgICB0aGlzLiR0aW1lb3V0ID0gNTAwOwogICAgCiAgICB0aGlzLnNldFRpbWVvdXQgPSBmdW5jdGlvbih0aW1lb3V0KSB7CiAgICAgICAgdGhpcy4kdGltZW91dCA9IHRpbWVvdXQ7CiAgICB9OwogICAgCiAgICB0aGlzLnNldFZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICB0aGlzLmRvYy5zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgdGhpcy5kZWZlcnJlZFVwZGF0ZS5zY2hlZHVsZSh0aGlzLiR0aW1lb3V0KTsKICAgIH07CiAgICAKICAgIHRoaXMuZ2V0VmFsdWUgPSBmdW5jdGlvbihjYWxsYmFja0lkKSB7CiAgICAgICAgdGhpcy5zZW5kZXIuY2FsbGJhY2sodGhpcy5kb2MuZ2V0VmFsdWUoKSwgY2FsbGJhY2tJZCk7CiAgICB9OwogICAgCiAgICB0aGlzLm9uVXBkYXRlID0gZnVuY3Rpb24oKSB7CiAgICB9OwogICAgCiAgICB0aGlzLmlzUGVuZGluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmRlZmVycmVkVXBkYXRlLmlzUGVuZGluZygpOwogICAgfTsKICAgIAp9KS5jYWxsKE1pcnJvci5wcm90b3R5cGUpOwoKfSk7CgphY2UuZGVmaW5lKCJhY2UvbW9kZS9qc29uL2pzb25fcGFyc2UiLFtdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKICAgIHZhciBhdCwgICAgIC8vIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIKICAgICAgICBjaCwgICAgIC8vIFRoZSBjdXJyZW50IGNoYXJhY3RlcgogICAgICAgIGVzY2FwZWUgPSB7CiAgICAgICAgICAgICciJzogICciJywKICAgICAgICAgICAgJ1xcJzogJ1xcJywKICAgICAgICAgICAgJy8nOiAgJy8nLAogICAgICAgICAgICBiOiAgICAnXGInLAogICAgICAgICAgICBmOiAgICAnXGYnLAogICAgICAgICAgICBuOiAgICAnXG4nLAogICAgICAgICAgICByOiAgICAnXHInLAogICAgICAgICAgICB0OiAgICAnXHQnCiAgICAgICAgfSwKICAgICAgICB0ZXh0LAoKICAgICAgICBlcnJvciA9IGZ1bmN0aW9uIChtKSB7CgogICAgICAgICAgICB0aHJvdyB7CiAgICAgICAgICAgICAgICBuYW1lOiAgICAnU3ludGF4RXJyb3InLAogICAgICAgICAgICAgICAgbWVzc2FnZTogbSwKICAgICAgICAgICAgICAgIGF0OiAgICAgIGF0LAogICAgICAgICAgICAgICAgdGV4dDogICAgdGV4dAogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIG5leHQgPSBmdW5jdGlvbiAoYykgewoKICAgICAgICAgICAgaWYgKGMgJiYgYyAhPT0gY2gpIHsKICAgICAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCAnIiArIGMgKyAiJyBpbnN0ZWFkIG9mICciICsgY2ggKyAiJyIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaCA9IHRleHQuY2hhckF0KGF0KTsKICAgICAgICAgICAgYXQgKz0gMTsKICAgICAgICAgICAgcmV0dXJuIGNoOwogICAgICAgIH0sCgogICAgICAgIG51bWJlciA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgIHZhciBudW1iZXIsCiAgICAgICAgICAgICAgICBzdHJpbmcgPSAnJzsKCiAgICAgICAgICAgIGlmIChjaCA9PT0gJy0nKSB7CiAgICAgICAgICAgICAgICBzdHJpbmcgPSAnLSc7CiAgICAgICAgICAgICAgICBuZXh0KCctJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2ggPT09ICcuJykgewogICAgICAgICAgICAgICAgc3RyaW5nICs9ICcuJzsKICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0KCkgJiYgY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgewogICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2ggPT09ICdlJyB8fCBjaCA9PT0gJ0UnKSB7CiAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7CiAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJysnKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOwogICAgICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOwogICAgICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBudW1iZXIgPSArc3RyaW5nOwogICAgICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSkgewogICAgICAgICAgICAgICAgZXJyb3IoIkJhZCBudW1iZXIiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBzdHJpbmcgPSBmdW5jdGlvbiAoKSB7CgogICAgICAgICAgICB2YXIgaGV4LAogICAgICAgICAgICAgICAgaSwKICAgICAgICAgICAgICAgIHN0cmluZyA9ICcnLAogICAgICAgICAgICAgICAgdWZmZmY7CgogICAgICAgICAgICBpZiAoY2ggPT09ICciJykgewogICAgICAgICAgICAgICAgd2hpbGUgKG5leHQoKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJyInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXFwnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAndScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVmZmZmID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpICs9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXggPSBwYXJzZUludChuZXh0KCksIDE2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRmluaXRlKGhleCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVmZmZmID0gdWZmZmYgKiAxNiArIGhleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVmZmZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXNjYXBlZVtjaF0gPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gZXNjYXBlZVtjaF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gIlxuIiB8fCBjaCA9PSAiXHIiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IoIkJhZCBzdHJpbmciKTsKICAgICAgICB9LAoKICAgICAgICB3aGl0ZSA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgIHdoaWxlIChjaCAmJiBjaCA8PSAnICcpIHsKICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHdvcmQgPSBmdW5jdGlvbiAoKSB7CgogICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgICAgIGNhc2UgJ3QnOgogICAgICAgICAgICAgICAgbmV4dCgndCcpOwogICAgICAgICAgICAgICAgbmV4dCgncicpOwogICAgICAgICAgICAgICAgbmV4dCgndScpOwogICAgICAgICAgICAgICAgbmV4dCgnZScpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIGNhc2UgJ2YnOgogICAgICAgICAgICAgICAgbmV4dCgnZicpOwogICAgICAgICAgICAgICAgbmV4dCgnYScpOwogICAgICAgICAgICAgICAgbmV4dCgnbCcpOwogICAgICAgICAgICAgICAgbmV4dCgncycpOwogICAgICAgICAgICAgICAgbmV4dCgnZScpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICBjYXNlICduJzoKICAgICAgICAgICAgICAgIG5leHQoJ24nKTsKICAgICAgICAgICAgICAgIG5leHQoJ3UnKTsKICAgICAgICAgICAgICAgIG5leHQoJ2wnKTsKICAgICAgICAgICAgICAgIG5leHQoJ2wnKTsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yKCJVbmV4cGVjdGVkICciICsgY2ggKyAiJyIpOwogICAgICAgIH0sCgogICAgICAgIHZhbHVlLCAgLy8gUGxhY2UgaG9sZGVyIGZvciB0aGUgdmFsdWUgZnVuY3Rpb24uCgogICAgICAgIGFycmF5ID0gZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgdmFyIGFycmF5ID0gW107CgogICAgICAgICAgICBpZiAoY2ggPT09ICdbJykgewogICAgICAgICAgICAgICAgbmV4dCgnWycpOwogICAgICAgICAgICAgICAgd2hpdGUoKTsKICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ10nKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCgnXScpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheTsgICAvLyBlbXB0eSBhcnJheQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKGNoKSB7CiAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh2YWx1ZSgpKTsKICAgICAgICAgICAgICAgICAgICB3aGl0ZSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ10nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoJ10nKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBuZXh0KCcsJyk7CiAgICAgICAgICAgICAgICAgICAgd2hpdGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvcigiQmFkIGFycmF5Iik7CiAgICAgICAgfSwKCiAgICAgICAgb2JqZWN0ID0gZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgdmFyIGtleSwKICAgICAgICAgICAgICAgIG9iamVjdCA9IHt9OwoKICAgICAgICAgICAgaWYgKGNoID09PSAneycpIHsKICAgICAgICAgICAgICAgIG5leHQoJ3snKTsKICAgICAgICAgICAgICAgIHdoaXRlKCk7CiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICd9JykgewogICAgICAgICAgICAgICAgICAgIG5leHQoJ30nKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0OyAgIC8vIGVtcHR5IG9iamVjdAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKGNoKSB7CiAgICAgICAgICAgICAgICAgICAga2V5ID0gc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgd2hpdGUoKTsKICAgICAgICAgICAgICAgICAgICBuZXh0KCc6Jyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkgewogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRHVwbGljYXRlIGtleSAiJyArIGtleSArICciJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9iamVjdFtrZXldID0gdmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICB3aGl0ZSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ30nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoJ30nKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbmV4dCgnLCcpOwogICAgICAgICAgICAgICAgICAgIHdoaXRlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IoIkJhZCBvYmplY3QiKTsKICAgICAgICB9OwoKICAgIHZhbHVlID0gZnVuY3Rpb24gKCkgewoKICAgICAgICB3aGl0ZSgpOwogICAgICAgIHN3aXRjaCAoY2gpIHsKICAgICAgICBjYXNlICd7JzoKICAgICAgICAgICAgcmV0dXJuIG9iamVjdCgpOwogICAgICAgIGNhc2UgJ1snOgogICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICBjYXNlICciJzoKICAgICAgICAgICAgcmV0dXJuIHN0cmluZygpOwogICAgICAgIGNhc2UgJy0nOgogICAgICAgICAgICByZXR1cm4gbnVtYmVyKCk7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIGNoID49ICcwJyAmJiBjaCA8PSAnOScgPyBudW1iZXIoKSA6IHdvcmQoKTsKICAgICAgICB9CiAgICB9OwoKICAgIHJldHVybiBmdW5jdGlvbiAoc291cmNlLCByZXZpdmVyKSB7CiAgICAgICAgdmFyIHJlc3VsdDsKCiAgICAgICAgdGV4dCA9IHNvdXJjZTsKICAgICAgICBhdCA9IDA7CiAgICAgICAgY2ggPSAnICc7CiAgICAgICAgcmVzdWx0ID0gdmFsdWUoKTsKICAgICAgICB3aGl0ZSgpOwogICAgICAgIGlmIChjaCkgewogICAgICAgICAgICBlcnJvcigiU3ludGF4IGVycm9yIik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHlwZW9mIHJldml2ZXIgPT09ICdmdW5jdGlvbicgPyBmdW5jdGlvbiB3YWxrKGhvbGRlciwga2V5KSB7CiAgICAgICAgICAgIHZhciBrLCB2LCB2YWx1ZSA9IGhvbGRlcltrZXldOwogICAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgewogICAgICAgICAgICAgICAgZm9yIChrIGluIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2ID0gd2Fsayh2YWx1ZSwgayk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlW2tdID0gdjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2YWx1ZVtrXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmV2aXZlci5jYWxsKGhvbGRlciwga2V5LCB2YWx1ZSk7CiAgICAgICAgfSh7Jyc6IHJlc3VsdH0sICcnKSA6IHJlc3VsdDsKICAgIH07Cn0pOwoKYWNlLmRlZmluZSgiYWNlL21vZGUvanNvbl93b3JrZXIiLFtdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIE1pcnJvciA9IHJlcXVpcmUoIi4uL3dvcmtlci9taXJyb3IiKS5NaXJyb3I7CnZhciBwYXJzZSA9IHJlcXVpcmUoIi4vanNvbi9qc29uX3BhcnNlIik7Cgp2YXIgSnNvbldvcmtlciA9IGV4cG9ydHMuSnNvbldvcmtlciA9IGZ1bmN0aW9uKHNlbmRlcikgewogICAgTWlycm9yLmNhbGwodGhpcywgc2VuZGVyKTsKICAgIHRoaXMuc2V0VGltZW91dCgyMDApOwp9OwoKb29wLmluaGVyaXRzKEpzb25Xb3JrZXIsIE1pcnJvcik7CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5vblVwZGF0ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZG9jLmdldFZhbHVlKCk7CiAgICAgICAgdmFyIGVycm9ycyA9IFtdOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICh2YWx1ZSkKICAgICAgICAgICAgICAgIHBhcnNlKHZhbHVlKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIHZhciBwb3MgPSB0aGlzLmRvYy5pbmRleFRvUG9zaXRpb24oZS5hdC0xKTsKICAgICAgICAgICAgZXJyb3JzLnB1c2goewogICAgICAgICAgICAgICAgcm93OiBwb3Mucm93LAogICAgICAgICAgICAgICAgY29sdW1uOiBwb3MuY29sdW1uLAogICAgICAgICAgICAgICAgdGV4dDogZS5tZXNzYWdlLAogICAgICAgICAgICAgICAgdHlwZTogImVycm9yIgogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zZW5kZXIuZW1pdCgiYW5ub3RhdGUiLCBlcnJvcnMpOwogICAgfTsKCn0pLmNhbGwoSnNvbldvcmtlci5wcm90b3R5cGUpOwoKfSk7Cg=="
        }, 7907: function (e, t, i) {
            "use strict";
            i.d(t, {
                m0: function () {
                    return l
                }, cC: function () {
                    return c
                }, Iu: function () {
                    return h
                }
            });
            var t = i(4987), o = {
                    en: {
                        array: "Array",
                        auto: "Auto",
                        appendText: "Append",
                        appendTitle: "Append a new field with type 'auto' after this field (Ctrl+Shift+Ins)",
                        appendSubmenuTitle: "Select the type of the field to be appended",
                        appendTitleAuto: "Append a new field with type 'auto' (Ctrl+Shift+Ins)",
                        ascending: "Ascending",
                        ascendingTitle: "Sort the childs of this ${type} in ascending order",
                        actionsMenu: "Click to open the actions menu (Ctrl+M)",
                        cannotParseFieldError: "Cannot parse field into JSON",
                        cannotParseValueError: "Cannot parse value into JSON",
                        collapseAll: "Collapse all fields",
                        compactTitle: "Compact JSON data, remove all whitespaces (Ctrl+Shift+I)",
                        descending: "Descending",
                        descendingTitle: "Sort the childs of this ${type} in descending order",
                        drag: "Drag to move this field (Alt+Shift+Arrows)",
                        duplicateKey: "duplicate key",
                        duplicateText: "Duplicate",
                        duplicateTitle: "Duplicate selected fields (Ctrl+D)",
                        duplicateField: "Duplicate this field (Ctrl+D)",
                        duplicateFieldError: "Duplicate field name",
                        empty: "empty",
                        expandAll: "Expand all fields",
                        expandTitle: "Click to expand/collapse this field (Ctrl+E). \nCtrl+Click to expand/collapse including all childs.",
                        formatTitle: "Format JSON data, with proper indentation and line feeds (Ctrl+I)",
                        insert: "Insert",
                        insertTitle: "Insert a new field with type 'auto' before this field (Ctrl+Ins)",
                        insertSub: "Select the type of the field to be inserted",
                        object: "Object",
                        ok: "Ok",
                        redo: "Redo (Ctrl+Shift+Z)",
                        removeText: "Remove",
                        removeTitle: "Remove selected fields (Ctrl+Del)",
                        removeField: "Remove this field (Ctrl+Del)",
                        repairTitle: "Repair JSON: fix quotes and escape characters, remove comments and JSONP notation, turn JavaScript objects into JSON.",
                        searchTitle: "Search fields and values",
                        searchNextResultTitle: "Next result (Enter)",
                        searchPreviousResultTitle: "Previous result (Shift + Enter)",
                        selectNode: "Select a node...",
                        showAll: "show all",
                        showMore: "show more",
                        showMoreStatus: "displaying ${visibleChilds} of ${totalChilds} items.",
                        sort: "Sort",
                        sortTitle: "Sort the childs of this ${type}",
                        sortTitleShort: "Sort contents",
                        sortFieldLabel: "Field:",
                        sortDirectionLabel: "Direction:",
                        sortFieldTitle: "Select the nested field by which to sort the array or object",
                        sortAscending: "Ascending",
                        sortAscendingTitle: "Sort the selected field in ascending order",
                        sortDescending: "Descending",
                        sortDescendingTitle: "Sort the selected field in descending order",
                        string: "String",
                        transform: "Transform",
                        transformTitle: "Filter, sort, or transform the childs of this ${type}",
                        transformTitleShort: "Filter, sort, or transform contents",
                        extract: "Extract",
                        extractTitle: "Extract this ${type}",
                        transformQueryTitle: "Enter a JMESPath query",
                        transformWizardLabel: "Wizard",
                        transformWizardFilter: "Filter",
                        transformWizardSortBy: "Sort by",
                        transformWizardSelectFields: "Select fields",
                        transformQueryLabel: "Query",
                        transformPreviewLabel: "Preview",
                        type: "Type",
                        typeTitle: "Change the type of this field",
                        openUrl: "Ctrl+Click or Ctrl+Enter to open url in new window",
                        undo: "Undo last action (Ctrl+Z)",
                        validationCannotMove: "Cannot move a field into a child of itself",
                        autoType: 'Field type "auto". The field type is automatically determined from the value and can be a string, number, boolean, or null.',
                        objectType: 'Field type "object". An object contains an unordered set of key/value pairs.',
                        arrayType: 'Field type "array". An array contains an ordered collection of values.',
                        stringType: 'Field type "string". Field type is not determined from the value, but always returned as string.',
                        modeEditorTitle: "Switch Editor Mode",
                        modeCodeText: "Code",
                        modeCodeTitle: "Switch to code highlighter",
                        modeFormText: "Form",
                        modeFormTitle: "Switch to form editor",
                        modeTextText: "Text",
                        modeTextTitle: "Switch to plain text editor",
                        modeTreeText: "Tree",
                        modeTreeTitle: "Switch to tree editor",
                        modeViewText: "View",
                        modeViewTitle: "Switch to tree view",
                        modePreviewText: "Preview",
                        modePreviewTitle: "Switch to preview mode",
                        examples: "Examples",
                        default: "Default",
                        containsInvalidProperties: "Contains invalid properties",
                        containsInvalidItems: "Contains invalid items"
                    }, es: {
                        array: "Matriz",
                        auto: "Auto",
                        appendText: "Agregar",
                        appendTitle: "Agregue un nuevo campo con el tipo 'auto' después de este campo (Ctrl + Shift + Ins)",
                        appendSubmenuTitle: "Seleccione el tipo de campo que se agregará",
                        appendTitleAuto: "Agregue un nuevo campo con el tipo 'auto' (Ctrl + Shift + Ins)",
                        ascending: "Ascendente",
                        ascendingTitle: "Ordene los elementos secundarios de este ${type} en orden ascendente",
                        actionsMenu: "Haga clic para abrir el menú de acciones (Ctrl + M)",
                        cannotParseFieldError: "No se puede parsear el campo en JSON",
                        cannotParseValueError: "No se puede parsear el valor en JSON",
                        collapseAll: "Contraer todos los campos",
                        compactTitle: "Compactar datos JSON, eliminar todos los espacios en blanco (Ctrl + Shift + I)",
                        descending: "Descendente",
                        descendingTitle: "Ordene los hijos de este ${type} en orden descendente",
                        drag: "Arrastre para mover este campo (Alt + Mayús + Flechas)",
                        duplicateKey: "llave duplicada",
                        duplicateText: "Duplicar",
                        duplicateTitle: "Duplicar campos seleccionados (Ctrl + D)",
                        duplicateField: "Duplicar este campo (Ctrl + D)",
                        duplicateFieldError: "Nombre de campo duplicado",
                        empty: "vacio",
                        expandAll: "Expandir todos los campos",
                        expandTitle: "Haga clic para expandir/contraer este campo (Ctrl + E). \n  Ctrl+Clic para expandir/contraer incluyendo todos los niños.",
                        formatTitle: "Formatee los datos JSON, con la sangría y los avances de línea adecuados (Ctrl + I)",
                        insert: "Insertar",
                        insertTitle: "Inserte un nuevo campo con el tipo 'auto' antes de este campo (Ctrl + Ins)",
                        insertSub: "Seleccione el tipo de campo a insertar",
                        object: "Objeto",
                        ok: "Ok",
                        redo: "Rehacer (Ctrl+Mayús+Z)",
                        removeText: "Eliminar",
                        removeTitle: "Eliminar campos seleccionados (Ctrl+Supr)",
                        removeField: "Eliminar este campo (Ctrl+Supr)",
                        repairTitle: "Reparar JSON: corrija comillas y caracteres de escape, elimine comentarios y notación JSONP, convierta objetos JavaScript en JSON.",
                        searchTitle: "Campos de búsqueda y valores",
                        searchNextResultTitle: "Siguiente resultado (Entrar)",
                        searchPreviousResultTitle: "Resultado anterior (Shift + Enter)",
                        selectNode: "Seleccione un nodo...",
                        showAll: "mostrar todo",
                        showMore: "mostrar más",
                        showMoreStatus: "mostrando ${visibleChilds} de ${totalChilds} elementos.",
                        sort: "Ordenar",
                        sortTitle: "Ordene los hijos de este ${type}",
                        sortTitleShort: "Ordenar contenidos",
                        sortFieldLabel: "Campo:",
                        sortDirectionLabel: "Dirección:",
                        sortFieldTitle: "Seleccione el campo anidado por el cual ordenar la matriz u objeto",
                        sortAscending: "Ascendente",
                        sortAscendingTitle: "Ordenar el campo seleccionado en orden ascendente",
                        sortDescending: "Descendente",
                        sortDescendingTitle: "Ordenar por el campo seleccionado, en orden descendente",
                        string: "Texto",
                        transform: "Transformar",
                        transformTitle: "Filtrar, ordenar o transformar los hijos de este ${type}",
                        transformTitleShort: "Filtrar, ordenar o transformar contenidos",
                        extract: "Extraer",
                        extractTitle: "Extrae este ${type}",
                        transformQueryTitle: "Ingrese una consulta JMESPath",
                        transformWizardLabel: "Wizard",
                        transformWizardFilter: "Filtro",
                        transformWizardSortBy: "Ordenar por",
                        transformWizardSelectFields: "Seleccione un campo",
                        transformQueryLabel: "Consulta",
                        transformPreviewLabel: "Vista Previa",
                        type: "Tipo",
                        typeTitle: "Cambiar el tipo de campo",
                        openUrl: "Ctrl+Click o Ctrl+Enter para abrir la URL en una nueva ventana",
                        undo: "Deshacer la última acción (Ctrl+Z)",
                        validationCannotMove: "No se puede mover un campo a un hijo de sí mismo.",
                        autoType: 'Field type "auto". The field type is automatically determined from the value and can be a string, number, boolean, or null.',
                        objectType: 'Tipo de campo "objeto".  Un objeto contiene un conjunto desordenado de pares clave/valor.',
                        arrayType: 'Tipo de campo "matriz".  Una matriz contiene una colección ordenada de valores.',
                        stringType: 'Tipo de campo "cadena".  El tipo de campo no se determina a partir del valor,  pero siempre se devuelve como una cadena.',
                        modeEditorTitle: "Cambiar modo de editor",
                        modeCodeText: "Codigo",
                        modeCodeTitle: "Cambiar al resaltador de código",
                        modeFormText: "Formulario",
                        modeFormTitle: "Cambiar al editor de formularios",
                        modeTextText: "Texto",
                        modeTextTitle: "Cambiar al editor de texto sin formato",
                        modeTreeText: "Arbol",
                        modeTreeTitle: "Cambiar al editor de árbol",
                        modeViewText: "Vista",
                        modeViewTitle: "Cambiar a la vista de árbol",
                        modePreviewText: "Vista Previa",
                        modePreviewTitle: "Cambiar al modo de vista previa",
                        examples: "Ejemplos",
                        default: "Predeterminado",
                        containsInvalidProperties: "Contiene propiedades no validas",
                        containsInvalidItems: "Contiene items no validos"
                    }, "zh-CN": {
                        array: "数组",
                        auto: "自动",
                        appendText: "追加",
                        appendTitle: "在此字段后追加一个类型为“auto”的新字段 (Ctrl+Shift+Ins)",
                        appendSubmenuTitle: "选择要追加的字段类型",
                        appendTitleAuto: "追加类型为“auto”的新字段 (Ctrl+Shift+Ins)",
                        ascending: "升序",
                        ascendingTitle: "升序排列${type}的子节点",
                        actionsMenu: "点击打开动作菜单(Ctrl+M)",
                        cannotParseFieldError: "无法将字段解析为JSON",
                        cannotParseValueError: "无法将值解析为JSON",
                        collapseAll: "缩进所有字段",
                        compactTitle: "压缩JSON数据,删除所有空格 (Ctrl+Shift+I)",
                        descending: "降序",
                        descendingTitle: "降序排列${type}的子节点",
                        drag: "拖拽移动该节点(Alt+Shift+Arrows)",
                        duplicateKey: "重复键",
                        duplicateText: "复制",
                        duplicateTitle: "复制选中字段(Ctrl+D)",
                        duplicateField: "复制该字段(Ctrl+D)",
                        duplicateFieldError: "重复的字段名称",
                        empty: "清空",
                        expandAll: "展开所有字段",
                        expandTitle: "点击 展开/收缩 该字段(Ctrl+E). \nCtrl+Click 展开/收缩 包含所有子节点.",
                        formatTitle: "使用适当的缩进和换行符格式化JSON数据 (Ctrl+I)",
                        insert: "插入",
                        insertTitle: "在此字段前插入类型为“auto”的新字段 (Ctrl+Ins)",
                        insertSub: "选择要插入的字段类型",
                        object: "对象",
                        ok: "Ok",
                        redo: "重做 (Ctrl+Shift+Z)",
                        removeText: "移除",
                        removeTitle: "移除选中字段 (Ctrl+Del)",
                        removeField: "移除该字段 (Ctrl+Del)",
                        repairTitle: "修复JSON:修复引号和转义符,删除注释和JSONP表示法,将JavaScript对象转换为JSON。",
                        selectNode: "选择一个节点...",
                        showAll: "展示全部",
                        showMore: "展示更多",
                        showMoreStatus: "显示${totalChilds}的${visibleChilds}项目.",
                        sort: "排序",
                        sortTitle: "排序${type}的子节点",
                        sortTitleShort: "内容排序",
                        sortFieldLabel: "字段:",
                        sortDirectionLabel: "方向:",
                        sortFieldTitle: "选择用于对数组或对象排序的嵌套字段",
                        sortAscending: "升序排序",
                        sortAscendingTitle: "按照该字段升序排序",
                        sortDescending: "降序排序",
                        sortDescendingTitle: "按照该字段降序排序",
                        string: "字符串",
                        transform: "变换",
                        transformTitle: "筛选,排序,或者转换${type}的子节点",
                        transformTitleShort: "筛选,排序,或者转换内容",
                        extract: "提取",
                        extractTitle: "提取这个 ${type}",
                        transformQueryTitle: "输入JMESPath查询",
                        transformWizardLabel: "向导",
                        transformWizardFilter: "筛选",
                        transformWizardSortBy: "排序",
                        transformWizardSelectFields: "选择字段",
                        transformQueryLabel: "查询",
                        transformPreviewLabel: "预览",
                        type: "类型",
                        typeTitle: "更改字段类型",
                        openUrl: "Ctrl+Click 或者 Ctrl+Enter 在新窗口打开链接",
                        undo: "撤销上次动作 (Ctrl+Z)",
                        validationCannotMove: "无法将字段移入其子节点",
                        autoType: '字段类型 "auto". 字段类型由值自动确定 可以为 string,number,boolean,或者 null.',
                        objectType: '字段类型 "object". 对象包含一组无序的键/值对.',
                        arrayType: '字段类型 "array". 数组包含值的有序集合.',
                        stringType: '字段类型 "string". 字段类型由值自动确定,但始终作为字符串返回.',
                        modeCodeText: "代码",
                        modeCodeTitle: "切换至代码高亮",
                        modeFormText: "表单",
                        modeFormTitle: "切换至表单编辑",
                        modeTextText: "文本",
                        modeTextTitle: "切换至文本编辑",
                        modeTreeText: "树",
                        modeTreeTitle: "切换至树编辑",
                        modeViewText: "视图",
                        modeViewTitle: "切换至树视图",
                        modePreviewText: "预览",
                        modePreviewTitle: "切换至预览模式",
                        examples: "例子",
                        default: "缺省",
                        containsInvalidProperties: "包含无效的属性",
                        containsInvalidItems: "包含无效项目"
                    }, "pt-BR": {
                        array: "Lista",
                        auto: "Automatico",
                        appendText: "Adicionar",
                        appendTitle: "Adicionar novo campo com tipo 'auto' depois deste campo (Ctrl+Shift+Ins)",
                        appendSubmenuTitle: "Selecione o tipo do campo a ser adicionado",
                        appendTitleAuto: "Adicionar novo campo com tipo 'auto' (Ctrl+Shift+Ins)",
                        ascending: "Ascendente",
                        ascendingTitle: "Organizar filhor do tipo ${type} em crescente",
                        actionsMenu: "Clique para abrir o menu de ações (Ctrl+M)",
                        cannotParseFieldError: "Não é possível analisar o campo no JSON",
                        cannotParseValueError: "Não é possível analisar o valor em JSON",
                        collapseAll: "Fechar todos campos",
                        compactTitle: "Dados JSON compactos, remova todos os espaços em branco (Ctrl+Shift+I)",
                        descending: "Descendente",
                        descendingTitle: "Organizar o filhos do tipo ${type} em decrescente",
                        duplicateKey: "chave duplicada",
                        drag: "Arraste para mover este campo (Alt+Shift+Arrows)",
                        duplicateText: "Duplicar",
                        duplicateTitle: "Duplicar campos selecionados (Ctrl+D)",
                        duplicateField: "Duplicar este campo (Ctrl+D)",
                        duplicateFieldError: "Nome do campo duplicado",
                        empty: "vazio",
                        expandAll: "Expandir todos campos",
                        expandTitle: "Clique para expandir/encolher este campo (Ctrl+E). \nCtrl+Click para expandir/encolher incluindo todos os filhos.",
                        formatTitle: "Formate dados JSON, com recuo e feeds de linha adequados (Ctrl+I)",
                        insert: "Inserir",
                        insertTitle: "Inserir um novo campo do tipo 'auto' antes deste campo (Ctrl+Ins)",
                        insertSub: "Selecionar o tipo de campo a ser inserido",
                        object: "Objeto",
                        ok: "Ok",
                        redo: "Refazer (Ctrl+Shift+Z)",
                        removeText: "Remover",
                        removeTitle: "Remover campos selecionados (Ctrl+Del)",
                        removeField: "Remover este campo (Ctrl+Del)",
                        repairTitle: "Repare JSON: corrija aspas e caracteres de escape, remova comentários e notação JSONP, transforme objetos JavaScript em JSON.",
                        selectNode: "Selecione um nódulo...",
                        showAll: "mostrar todos",
                        showMore: "mostrar mais",
                        showMoreStatus: "exibindo ${visibleChilds} de ${totalChilds} itens.",
                        sort: "Organizar",
                        sortTitle: "Organizar os filhos deste ${type}",
                        sortTitleShort: "Organizar os filhos",
                        sortFieldLabel: "Campo:",
                        sortDirectionLabel: "Direção:",
                        sortFieldTitle: "Selecione um campo filho pelo qual ordenar o array ou objeto",
                        sortAscending: "Ascendente",
                        sortAscendingTitle: "Ordenar o campo selecionado por ordem ascendente",
                        sortDescending: "Descendente",
                        sortDescendingTitle: "Ordenar o campo selecionado por ordem descendente",
                        string: "Texto",
                        transform: "Transformar",
                        transformTitle: "Filtrar, ordenar ou transformar os filhos deste ${type}",
                        transformTitleShort: "Filtrar, ordenar ou transformar conteúdos",
                        transformQueryTitle: "Insira uma expressão JMESPath",
                        transformWizardLabel: "Assistente",
                        transformWizardFilter: "Filtro",
                        transformWizardSortBy: "Ordenar por",
                        transformWizardSelectFields: "Selecionar campos",
                        transformQueryLabel: "Expressão",
                        transformPreviewLabel: "Visualizar",
                        type: "Tipo",
                        typeTitle: "Mudar o tipo deste campo",
                        openUrl: "Ctrl+Click ou Ctrl+Enter para abrir link em nova janela",
                        undo: "Desfazer último ação (Ctrl+Z)",
                        validationCannotMove: "Não pode mover um campo como filho dele mesmo",
                        autoType: 'Campo do tipo "auto". O tipo do campo é determinao automaticamente a partir do seu valor e pode ser texto, número, verdade/falso ou nulo.',
                        objectType: 'Campo do tipo "objeto". Um objeto contém uma lista de pares com chave e valor.',
                        arrayType: 'Campo do tipo "lista". Uma lista contem uma coleção de valores ordenados.',
                        stringType: 'Campo do tipo "string". Campo do tipo nao é determinado através do seu valor, mas sempre retornara um texto.',
                        examples: "Exemplos",
                        default: "Revelia",
                        containsInvalidProperties: "Contém propriedades inválidas",
                        containsInvalidItems: "Contém itens inválidos"
                    }, tr: {
                        array: "Dizin",
                        auto: "Otomatik",
                        appendText: "Ekle",
                        appendTitle: "Bu alanın altına 'otomatik' tipinde yeni bir alan ekle (Ctrl+Shift+Ins)",
                        appendSubmenuTitle: "Eklenecek alanın tipini seç",
                        appendTitleAuto: "'Otomatik' tipinde yeni bir alan ekle (Ctrl+Shift+Ins)",
                        ascending: "Artan",
                        ascendingTitle: "${type}'ın alt tiplerini artan düzende sırala",
                        actionsMenu: "Aksiyon menüsünü açmak için tıklayın (Ctrl+M)",
                        collapseAll: "Tüm alanları kapat",
                        descending: "Azalan",
                        descendingTitle: "${type}'ın alt tiplerini azalan düzende sırala",
                        drag: "Bu alanı taşımak için sürükleyin (Alt+Shift+Arrows)",
                        duplicateKey: "Var olan anahtar",
                        duplicateText: "Aşağıya kopyala",
                        duplicateTitle: "Seçili alanlardan bir daha oluştur (Ctrl+D)",
                        duplicateField: "Bu alandan bir daha oluştur (Ctrl+D)",
                        duplicateFieldError: "Duplicate field name",
                        cannotParseFieldError: "Alan JSON'a ayrıştırılamıyor",
                        cannotParseValueError: "JSON'a değer ayrıştırılamıyor",
                        empty: "boş",
                        expandAll: "Tüm alanları aç",
                        expandTitle: "Bu alanı açmak/kapatmak için tıkla (Ctrl+E). \nAlt alanlarda dahil tüm alanları açmak için Ctrl+Click ",
                        insert: "Ekle",
                        insertTitle: "Bu alanın üstüne 'otomatik' tipinde yeni bir alan ekle (Ctrl+Ins)",
                        insertSub: "Araya eklenecek alanın tipini seç",
                        object: "Nesne",
                        ok: "Tamam",
                        redo: "Yeniden yap (Ctrl+Shift+Z)",
                        removeText: "Kaldır",
                        removeTitle: "Seçilen alanları kaldır (Ctrl+Del)",
                        removeField: "Bu alanı kaldır (Ctrl+Del)",
                        selectNode: "Bir nesne seç...",
                        showAll: "tümünü göster",
                        showMore: "daha fazla göster",
                        showMoreStatus: "${totalChilds} alanın ${visibleChilds} alt alanları gösteriliyor",
                        sort: "Sırala",
                        sortTitle: "${type}'ın alt alanlarını sırala",
                        sortTitleShort: "İçerikleri sırala",
                        sortFieldLabel: "Alan:",
                        sortDirectionLabel: "Yön:",
                        sortFieldTitle: "Diziyi veya nesneyi sıralamak için iç içe geçmiş alanı seçin",
                        sortAscending: "Artan",
                        sortAscendingTitle: "Seçili alanı artan düzende sırala",
                        sortDescending: "Azalan",
                        sortDescendingTitle: "Seçili alanı azalan düzende sırala",
                        string: "Karakter Dizisi",
                        transform: "Dönüştür",
                        transformTitle: "${type}'ın alt alanlarını filtrele, sırala veya dönüştür",
                        transformTitleShort: "İçerikleri filterele, sırala veya dönüştür",
                        transformQueryTitle: "JMESPath sorgusu gir",
                        transformWizardLabel: "Sihirbaz",
                        transformWizardFilter: "Filtre",
                        transformWizardSortBy: "Sırala",
                        transformWizardSelectFields: "Alanları seç",
                        transformQueryLabel: "Sorgu",
                        transformPreviewLabel: "Önizleme",
                        type: "Tip",
                        typeTitle: "Bu alanın tipini değiştir",
                        openUrl: "URL'i yeni bir pencerede açmak için Ctrl+Click veya Ctrl+Enter",
                        undo: "Son değişikliği geri al (Ctrl+Z)",
                        validationCannotMove: "Alt alan olarak taşınamıyor",
                        autoType: 'Alan tipi "otomatik". Alan türü otomatik olarak değerden belirlenirve bir dize, sayı, boolean veya null olabilir.',
                        objectType: 'Alan tipi "nesne". Bir nesne, sıralanmamış bir anahtar / değer çifti kümesi içerir.',
                        arrayType: 'Alan tipi "dizi". Bir dizi, düzenli değerler koleksiyonu içerir.',
                        stringType: 'Alan tipi "karakter dizisi". Alan türü değerden belirlenmez,ancak her zaman karakter dizisi olarak döndürülür.',
                        modeCodeText: "Kod",
                        modeCodeTitle: "Kod vurgulayıcıya geç",
                        modeFormText: "Form",
                        modeFormTitle: "Form düzenleyiciye geç",
                        modeTextText: "Metin",
                        modeTextTitle: "Düz metin düzenleyiciye geç",
                        modeTreeText: "Ağaç",
                        modeTreeTitle: "Ağaç düzenleyiciye geç",
                        modeViewText: "Görünüm",
                        modeViewTitle: "Ağaç görünümüne geç",
                        examples: "Örnekler",
                        default: "Varsayılan",
                        containsInvalidProperties: "Geçersiz özellikler içeriyor",
                        containsInvalidItems: "Geçersiz öğeler içeriyor"
                    }, ja: {
                        array: "配列",
                        auto: "オート",
                        appendText: "追加",
                        appendTitle: '次のフィールドに"オート"のフィールドを追加 (Ctrl+Shift+Ins)',
                        appendSubmenuTitle: "追加するフィールドの型を選択してください",
                        appendTitleAuto: '"オート"のフィールドを追加 (Ctrl+Shift+Ins)',
                        ascending: "昇順",
                        ascendingTitle: "${type}の子要素を昇順に並べ替え",
                        actionsMenu: "クリックしてアクションメニューを開く (Ctrl+M)",
                        collapseAll: "すべてを折りたたむ",
                        descending: "降順",
                        descendingTitle: "${type}の子要素を降順に並べ替え",
                        drag: "ドラッグして選択中のフィールドを移動 (Alt+Shift+Arrows)",
                        duplicateKey: "複製キー",
                        duplicateText: "複製",
                        duplicateTitle: "選択中のフィールドを複製 (Ctrl+D)",
                        duplicateField: "選択中のフィールドを複製 (Ctrl+D)",
                        duplicateFieldError: "フィールド名が重複しています",
                        cannotParseFieldError: "JSONのフィールドを解析できません",
                        cannotParseValueError: "JSONの値を解析できません",
                        empty: "空",
                        expandAll: "すべてを展開",
                        expandTitle: "クリックしてフィールドを展開/折りたたむ (Ctrl+E). \nCtrl+Click ですべての子要素を展開/折りたたむ",
                        insert: "挿入",
                        insertTitle: "選択中のフィールドの前に新しいフィールドを挿入 (Ctrl+Ins)",
                        insertSub: "挿入するフィールドの型を選択",
                        object: "オブジェクト",
                        ok: "実行",
                        redo: "やり直す (Ctrl+Shift+Z)",
                        removeText: "削除",
                        removeTitle: "選択中のフィールドを削除 (Ctrl+Del)",
                        removeField: "選択中のフィールドを削除 (Ctrl+Del)",
                        selectNode: "ノードを選択...",
                        showAll: "すべてを表示",
                        showMore: "もっと見る",
                        showMoreStatus: "${totalChilds}個のアイテムのうち ${visibleChilds}個を表示しています。",
                        sort: "並べ替え",
                        sortTitle: "${type}の子要素を並べ替え",
                        sortTitleShort: "並べ替え",
                        sortFieldLabel: "フィールド:",
                        sortDirectionLabel: "順序:",
                        sortFieldTitle: "配列またはオブジェクトを並び替えるためのフィールドを選択",
                        sortAscending: "昇順",
                        sortAscendingTitle: "選択中のフィールドを昇順に並び替え",
                        sortDescending: "降順",
                        sortDescendingTitle: "選択中のフィールドを降順に並び替え",
                        string: "文字列",
                        transform: "変換",
                        transformTitle: "${type}の子要素をフィルター・並び替え・変換する",
                        transformTitleShort: "内容をフィルター・並び替え・変換する",
                        extract: "抽出",
                        extractTitle: "${type}を抽出",
                        transformQueryTitle: "JMESPathクエリを入力",
                        transformWizardLabel: "ウィザード",
                        transformWizardFilter: "フィルター",
                        transformWizardSortBy: "並び替え",
                        transformWizardSelectFields: "フィールドを選択",
                        transformQueryLabel: "クエリ",
                        transformPreviewLabel: "プレビュー",
                        type: "型",
                        typeTitle: "選択中のフィールドの型を変更",
                        openUrl: "Ctrl+Click または Ctrl+Enter で 新規ウィンドウでURLを開く",
                        undo: "元に戻す (Ctrl+Z)",
                        validationCannotMove: "子要素に移動できません ",
                        autoType: "オート: フィールドの型は値から自動的に決定されます。 (文字列・数値・ブール・null)",
                        objectType: "オブジェクト: オブジェクトは順序が決まっていないキーと値のペア組み合わせです。",
                        arrayType: "配列: 配列は順序が決まっている値の集合体です。",
                        stringType: "文字列: フィールド型は値から決定されませんが、常に文字列として返されます。",
                        modeCodeText: "コードモード",
                        modeCodeTitle: "ハイライトモードに切り替え",
                        modeFormText: "フォームモード",
                        modeFormTitle: "フォームモードに切り替え",
                        modeTextText: "テキストモード",
                        modeTextTitle: "テキストモードに切り替え",
                        modeTreeText: "ツリーモード",
                        modeTreeTitle: "ツリーモードに切り替え",
                        modeViewText: "ビューモード",
                        modeViewTitle: "ビューモードに切り替え",
                        modePreviewText: "プレビュー",
                        modePreviewTitle: "プレビューに切り替え",
                        examples: "例",
                        default: "デフォルト",
                        containsInvalidProperties: "無効なプロパティが含まれています",
                        containsInvalidItems: "無効なアイテムが含まれています"
                    }, "fr-FR": {
                        array: "Liste",
                        auto: "Auto",
                        appendText: "Ajouter",
                        appendTitle: "Ajouter un champ de type 'auto' après ce champ (Ctrl+Shift+Ins)",
                        appendSubmenuTitle: "Sélectionner le type du champ à ajouter",
                        appendTitleAuto: "Ajouter un champ de type 'auto' (Ctrl+Shift+Ins)",
                        ascending: "Ascendant",
                        ascendingTitle: "Trier les enfants de ce ${type} par ordre ascendant",
                        actionsMenu: "Ouvrir le menu des actions (Ctrl+M)",
                        collapseAll: "Regrouper",
                        descending: "Descendant",
                        descendingTitle: "Trier les enfants de ce ${type} par ordre descendant",
                        drag: "Déplacer (Alt+Shift+Arrows)",
                        duplicateKey: "Dupliquer la clé",
                        duplicateText: "Dupliquer",
                        duplicateTitle: "Dupliquer les champs sélectionnés (Ctrl+D)",
                        duplicateField: "Dupliquer ce champ (Ctrl+D)",
                        duplicateFieldError: "Dupliquer le nom de champ",
                        cannotParseFieldError: "Champ impossible à parser en JSON",
                        cannotParseValueError: "Valeur impossible à parser en JSON",
                        empty: "vide",
                        expandAll: "Étendre",
                        expandTitle: "Étendre/regrouper ce champ (Ctrl+E). \nCtrl+Click pour étendre/regrouper avec tous les champs.",
                        insert: "Insérer",
                        insertTitle: "Insérer un champ de type 'auto' avant ce champ (Ctrl+Ins)",
                        insertSub: "Sélectionner le type de champ à insérer",
                        object: "Objet",
                        ok: "Ok",
                        redo: "Rejouer (Ctrl+Shift+Z)",
                        removeText: "Supprimer",
                        removeTitle: "Supprimer les champs sélectionnés (Ctrl+Del)",
                        removeField: "Supprimer ce champ (Ctrl+Del)",
                        searchTitle: "Rechercher champs et valeurs",
                        searchNextResultTitle: "Résultat suivant (Enter)",
                        searchPreviousResultTitle: "Résultat précédent (Shift + Enter)",
                        selectNode: "Sélectionner un nœud...",
                        showAll: "voir tout",
                        showMore: "voir plus",
                        showMoreStatus: "${visibleChilds} éléments affichés de ${totalChilds}.",
                        sort: "Trier",
                        sortTitle: "Trier les champs de ce ${type}",
                        sortTitleShort: "Trier",
                        sortFieldLabel: "Champ:",
                        sortDirectionLabel: "Direction:",
                        sortFieldTitle: "Sélectionner les champs permettant de trier les listes et objet",
                        sortAscending: "Ascendant",
                        sortAscendingTitle: "Trier les champs sélectionnés par ordre ascendant",
                        sortDescending: "Descendant",
                        sortDescendingTitle: "Trier les champs sélectionnés par ordre descendant",
                        string: "Chaîne",
                        transform: "Transformer",
                        transformTitle: "Filtrer, trier, or transformer les enfants de ce ${type}",
                        transformTitleShort: "Filtrer, trier ou transformer le contenu",
                        extract: "Extraire",
                        extractTitle: "Extraire ce ${type}",
                        transformQueryTitle: "Saisir une requête JMESPath",
                        transformWizardLabel: "Assistant",
                        transformWizardFilter: "Filtrer",
                        transformWizardSortBy: "Trier par",
                        transformWizardSelectFields: "Sélectionner les champs",
                        transformQueryLabel: "Requête",
                        transformPreviewLabel: "Prévisualisation",
                        type: "Type",
                        typeTitle: "Changer le type de ce champ",
                        openUrl: "Ctrl+Click ou Ctrl+Enter pour ouvrir l'url dans une autre fenêtre",
                        undo: "Annuler la dernière action (Ctrl+Z)",
                        validationCannotMove: "Cannot move a field into a child of itself",
                        autoType: 'Champe de type "auto". Ce type de champ est automatiquement déterminé en fonction de la valeur et peut être de type "chaîne", "nombre", "booléen" ou null.',
                        objectType: 'Champ de type "objet". Un objet contient un ensemble non ordonné de paires clé/valeur.',
                        arrayType: 'Champ de type "liste". Une liste contient une collection ordonnée de valeurs.',
                        stringType: 'Champ de type "chaîne". Ce type de champ n\'est pas déterminé en fonction de la valeur, mais retourne systématiquement une chaîne de caractères.',
                        modeEditorTitle: "Changer mode d'édition",
                        modeCodeText: "Code",
                        modeCodeTitle: "Activer surlignage code",
                        modeFormText: "Formulaire",
                        modeFormTitle: "Activer formulaire",
                        modeTextText: "Texte",
                        modeTextTitle: "Activer éditeur texte",
                        modeTreeText: "Arbre",
                        modeTreeTitle: "Activer éditeur arbre",
                        modeViewText: "Lecture seule",
                        modeViewTitle: "Activer vue arbre",
                        modePreviewText: "Prévisualisation",
                        modePreviewTitle: "Activer mode prévisualiser",
                        examples: "Exemples",
                        default: "Défaut",
                        containsInvalidProperties: "Contient des propriétés non valides",
                        containsInvalidItems: "Contient des éléments invalides"
                    }, de: {
                        array: "Auflistung",
                        auto: "Auto",
                        appendText: "anhängen",
                        appendTitle: "Fügen Sie nach diesem Feld ein neues Feld mit dem Typ 'auto' ein (Strg+Umschalt+Ein)",
                        appendSubmenuTitle: "Wählen Sie den Typ des neuen Feldes",
                        appendTitleAuto: "Ein neues Feld vom Typ 'auto' hinzufügen (Strg+Umschalt+Ein)",
                        ascending: "Aufsteigend",
                        ascendingTitle: "Sortieren Sie die Elemente dieses ${type} in aufsteigender Reihenfolge",
                        actionsMenu: "Klicken Sie zum Öffnen des Aktionsmenüs (Strg+M)",
                        cannotParseFieldError: "Feld kann nicht in JSON geparst werden",
                        cannotParseValueError: "Wert kann nicht in JSON geparst werden",
                        collapseAll: "Alle Felder zuklappen",
                        compactTitle: "JSON-Daten verdichten, alle Leerzeichen entfernen (Strg+Umschalt+\\)",
                        descending: "Absteigend",
                        descendingTitle: "Sortieren Sie die Elemente dieses ${type} in absteigender Reihenfolge",
                        drag: "Ziehen, um dieses Feld zu verschieben (Alt+Umschalt+Pfeile)",
                        duplicateKey: "Doppelter Schlüssel",
                        duplicateText: "Duplikat",
                        duplicateTitle: "Ausgewählte Felder duplizieren (Strg+D)",
                        duplicateField: "Dieses Feld duplizieren (Strg+D)",
                        duplicateFieldError: "Doppelter Feldname",
                        empty: "leer",
                        expandAll: "Alle Felder anzeigen",
                        expandTitle: "Klicken Sie, um dieses Feld zu erweitern/zu kollabieren (Strg+E). \nStrg+Klicken Sie, um dieses Feld einschließlich aller Elemente zu erweitern/zu kollabieren.",
                        formatTitle: "JSON-Daten mit korrekter Einrückung und Zeilenvorschüben formatieren (Strg+\\)",
                        insert: "einfügen",
                        insertTitle: "Fügen Sie vor diesem Feld ein neues Feld mit dem Typ 'auto' ein (Strg+Einfg)",
                        insertSub: "Wählen Sie den Typ des neuen Feldes",
                        object: "Objekt",
                        ok: "Ok",
                        redo: "Wiederholen (Strg+Umschalt+Z)",
                        removeText: "entfernen",
                        removeTitle: "Ausgewählte Felder entfernen (Strg+Entf)",
                        removeField: "Dieses Feld entfernen (Strg+Entf)",
                        repairTitle: "JSON reparieren: Anführungszeichen und Escape-Zeichen korrigieren, Kommentare und JSONP-Notation entfernen, JavaScript-Objekte in JSON umwandeln.",
                        searchTitle: "Suchfelder und Werte",
                        searchNextResultTitle: "Nächstes Ergebnis (Enter)",
                        searchPreviousResultTitle: "Vorheriges Ergebnis (Umschalt + Eingabe)",
                        selectNode: "Wählen Sie einen Knoten aus...",
                        showAll: "alle anzeigen",
                        showMore: "mehr anzeigen",
                        showMoreStatus: "Anzeige von ${visibleChilds} von ${totalChilds}-Elementen.",
                        sort: "Sortieren",
                        sortTitle: "Sortieren Sie die Elemente dieses ${type}",
                        sortTitleShort: "Inhalt sortieren",
                        sortFieldLabel: "Feld:",
                        sortDirectionLabel: "Richtung:",
                        sortFieldTitle: "Wählen Sie das verschachtelte Feld, nach dem das Array oder Objekt sortiert werden soll.",
                        sortAscending: "Aufsteigend",
                        sortAscendingTitle: "Sortieren Sie das ausgewählte Feld in aufsteigender Reihenfolge",
                        sortDescending: "Absteigend",
                        sortDescendingTitle: "Sortieren Sie das ausgewählte Feld in absteigender Reihenfolge",
                        string: "Zeichenfolge",
                        transform: "Verwandeln",
                        transformTitle: "Die Elemente dieses ${type} filtern, sortieren oder transformieren",
                        transformTitleShort: "Inhalte filtern, sortieren oder transformieren",
                        extract: "Auszug",
                        extractTitle: "Extrahieren Sie diesen ${type}",
                        transformQueryTitle: "Eine JMESPath-Abfrage eingeben",
                        transformWizardLabel: "Zauberer",
                        transformWizardFilter: "Filter",
                        transformWizardSortBy: "Sortieren nach",
                        transformWizardSelectFields: "Felder auswählen",
                        transformQueryLabel: "Anfrage",
                        transformPreviewLabel: "Vorschau",
                        type: "Geben Sie  ein.",
                        typeTitle: "Ändern Sie den Typ dieses Feldes",
                        openUrl: "Strg+Klicken oder Strg+Eingabe, um die URL in einem neuen Fenster zu öffnen",
                        undo: "Letzte Aktion rückgängig machen (Strg+Z)",
                        validationCannotMove: "Kann ein Feld nicht in ein Kind seiner selbst verschieben",
                        autoType: 'Feldtyp "auto". Der Feldtyp wird automatisch aus dem Wert bestimmt und kann ein String, eine Zahl, boolesch oder null sein.',
                        objectType: 'Feldtyp "Objekt". Ein Objekt enthält eine ungeordnete Menge von Schlüssel/Wert-Paaren.',
                        arrayType: 'Feldtyp "Array". Ein Array enthält eine geordnete Sammlung von Werten.',
                        stringType: 'Feldtyp "Zeichenfolge". Der Feldtyp wird nicht aus dem Wert bestimmt, sondern immer als Zeichenfolge zurückgegeben.',
                        modeEditorTitle: "Editor-Modus umschalten",
                        modeCodeText: "Code",
                        modeCodeTitle: "Umschalten auf Code-Highlighter",
                        modeFormText: "Formular",
                        modeFormTitle: "Zum Formular-Editor wechseln",
                        modeTextText: "Text",
                        modeTextTitle: "Zum Editor für einfachen Text wechseln",
                        modeTreeText: "Baum",
                        modeTreeTitle: "Zum Baum-Editor wechseln",
                        modeViewText: "Siehe",
                        modeViewTitle: "Zur Baumansicht wechseln",
                        modePreviewText: "Vorschau",
                        modePreviewTitle: "In den Vorschau-Modus wechseln",
                        examples: "Beispiele",
                        default: "Standardmäßig",
                        containsInvalidProperties: "Enthält ungültige Eigenschaften",
                        containsInvalidItems: "Enthält ungültige Elemente"
                    }, ru: {
                        array: "Массив",
                        auto: "Авто",
                        appendText: "Добавить",
                        appendTitle: "Добавить новое поле с типом 'авто' после этого поля (Ctrl+Shift+Ins)",
                        appendSubmenuTitle: "Выбрать тип поля для добавления",
                        appendTitleAuto: "Добавить новое поле с типом 'авто' (Ctrl+Shift+Ins)",
                        ascending: "По возрастанию",
                        ascendingTitle: "Сортировать ${type} по возрастанию",
                        actionsMenu: "Нажмите для открытия меню действий (Ctrl+M)",
                        cannotParseFieldError: "Невозможно преобразовать поле в JSON",
                        cannotParseValueError: "Невозможно преобразовать значение в JSON",
                        collapseAll: "Свернуть все",
                        compactTitle: "Минификация JSON (Ctrl+Shift+I)",
                        descending: "По убыванию",
                        descendingTitle: "Сортировать ${type} по убыванию",
                        drag: "Потяните для перемещения этого поля (Alt+Shift+Arrows)",
                        duplicateKey: "повторяющийся ключ",
                        duplicateText: "Дублировать",
                        duplicateTitle: "Дублирование полей (Ctrl+D)",
                        duplicateField: "Дублировать поле (Ctrl+D)",
                        duplicateFieldError: "Дублирование названия поля",
                        empty: "пустой",
                        expandAll: "Развернуть все",
                        expandTitle: "Нажмите для раскрытия/скрытия поля (Ctrl+E)\nили Ctrl+Click для раскрытия/скрытия всех потомков.",
                        formatTitle: "Форматирование JSON (Ctrl+I)",
                        insert: "Вставить",
                        insertTitle: "Вставить новое поле с типом 'авто' перед этим полем (Ctrl+Ins)",
                        insertSub: "Выбрать тип поля для вставки",
                        object: "Объект",
                        ok: "ОК",
                        redo: "Повторить (Ctrl+Shift+Z)",
                        removeText: "Удалить",
                        removeTitle: "Удалить выбранные поля (Ctrl+Del)",
                        removeField: "Удалить поле (Ctrl+Del)",
                        repairTitle: "Восстановите JSON: исправьте кавычки и escape-символы, удалите комментарии и нотацию JSONP, модифицируйте объекты JavaScript в JSON.",
                        searchTitle: "Поиск",
                        searchNextResultTitle: "Следующий результат (Enter)",
                        searchPreviousResultTitle: "Предыдущий результат (Shift + Enter)",
                        selectNode: "Выбор узла...",
                        showAll: "показать все",
                        showMore: "больше",
                        showMoreStatus: "${visibleChilds} из ${totalChilds}",
                        sort: "Сортировка",
                        sortTitle: "Сортировка потомков типа ${type}",
                        sortTitleShort: "Сортировка содержимого",
                        sortFieldLabel: "Поле:",
                        sortDirectionLabel: "Направление:",
                        sortFieldTitle: "Выберите поле для сортировки массива или объекта",
                        sortAscending: "По возрастанию",
                        sortAscendingTitle: "Сортировка выбранного поря по возрастанию",
                        sortDescending: "По убыванию",
                        sortDescendingTitle: "Сортировка выбранного поря по убыванию",
                        string: "Строка",
                        transform: "Модификация",
                        transformTitle: "Фильтрация, сортировка или модификация данных типа ${type}",
                        transformTitleShort: "Фильтрация, сортировка или модификация данных",
                        extract: "Извлечение",
                        extractTitle: "Извлечь тип ${type}",
                        transformQueryTitle: "Введите JMESpath запрос",
                        transformWizardLabel: "Мастер",
                        transformWizardFilter: "Фильтр",
                        transformWizardSortBy: "Сортировка",
                        transformWizardSelectFields: "Поля",
                        transformQueryLabel: "Запрос",
                        transformPreviewLabel: "Просмотр",
                        type: "Тип",
                        typeTitle: "Изменить тип этого поля",
                        openUrl: "Ctrl+Click или Ctrl+Enter для открытия url в новом окне",
                        undo: "Отменить (Ctrl+Z)",
                        validationCannotMove: "Поле не может быть перемещено в потомка",
                        autoType: "Тип поля автоматически определяется по значению и может быть строкой, числом, логическим значением или null.",
                        objectType: "Объект содержит неупорядоченный набор пар ключ/значение.",
                        arrayType: "Массив содержит упорядоченный набор значений.",
                        stringType: "Тип поля не определяется из значения, но всегда возвращается как строка.",
                        modeEditorTitle: "Переключение режима редактора",
                        modeCodeText: "Код",
                        modeCodeTitle: "Переключить в режим редактора кода",
                        modeFormText: "Форма",
                        modeFormTitle: "Переключить в режим формы",
                        modeTextText: "Текст",
                        modeTextTitle: "Переключить в режим редактора текста",
                        modeTreeText: "Дерево",
                        modeTreeTitle: "Переключить в режим редактора дерева",
                        modeViewText: "Просмотр дерева",
                        modeViewTitle: "Переключить в режим просмотра дерева",
                        modePreviewText: "Просмотр",
                        modePreviewTitle: "Переключить в режим просмотра",
                        examples: "Примеры",
                        default: "По умолчанию",
                        containsInvalidProperties: "Содержит недопустимые свойства",
                        containsInvalidItems: "Содержит недопустимые элементы"
                    }, ko: {
                        array: "배열",
                        auto: "자동",
                        appendText: "추가",
                        appendTitle: '선택한 요소 아래에 "자동" 요소를 추가합니다. (Ctrl + Shift + Ins)',
                        appendSubmenuTitle: "추가할 요소의 유형을 선택해주세요.",
                        appendTitleAuto: '"자동" 요소를 추가합니다. (Ctrl + Shift + Ins)',
                        ascending: "오름차순",
                        ascendingTitle: "선택한 ${type}의 하위 요소를 오름차순 정렬합니다.",
                        actionsMenu: "메뉴 열기 (Ctrl + M)",
                        cannotParseFieldError: "JSON의 요소를 해석할 수 없습니다.",
                        cannotParseValueError: "JSON의 값을 해석할 수 없습니다.",
                        collapseAll: "모두 접기",
                        compactTitle: "모든 공백을 제거하여 JSON 데이터를 작게 만듭니다. (Ctrl + Shift + I)",
                        descending: "내림차순",
                        descendingTitle: "선택한 ${type}의 하위 요소를 내림차순으로 정렬",
                        drag: "드래그하여 요소를 이동합니다. (Alt + Shift + Arrows)",
                        duplicateKey: "복제키",
                        duplicateText: "복제",
                        duplicateTitle: "선택한 요소를 복제합니다. (Ctrl + D)",
                        duplicateField: "선택한 요소를 복제합니다. (Ctrl + D)",
                        duplicateFieldError: "요소 이름이 중복되었습니다.",
                        empty: "비어있음",
                        expandAll: "모두 열기",
                        expandTitle: "클릭하여 요소를 열거나 닫습니다. (Ctrl + E) \nCtrl + Click으로 모든 하위 요소를 열거나 닫습니다.",
                        formatTitle: "적절한 들여쓰기 및 줄바꿈으로 JSON 데이터를 정형화합니다. (Ctrl + I)",
                        insert: "삽입",
                        insertTitle: "선택한 요소 위에 새요소를 삽입합니다. (Ctrl + Ins)",
                        insertSub: "삽입할 요소의 유형을 선택해주세요.",
                        object: "객체",
                        ok: "확인",
                        redo: "다시 실행 (Ctrl + Shift + Z)",
                        removeText: "삭제",
                        removeTitle: "선택한 요소를 삭제합니다. (Ctrl + Del)",
                        removeField: "선택한 요소를 삭제합니다. (Ctrl + Del)",
                        repairTitle: "JSON 교정: JSON 내의 주석과 JSONP 표기법을 지우고 따옴표와 이스케이프 문자를 수정합니다.",
                        searchTitle: "요소 또는 값 찾기",
                        searchNextResultTitle: "다음으로 찾기 (Enter)",
                        searchPreviousResultTitle: "이전으로 찾기 (Shift + Enter)",
                        selectNode: "요소를 선택해주세요...",
                        showAll: "모두보기",
                        showMore: "더보기",
                        showMoreStatus: "${totalChilds} 개의 항목 중 ${visibleChilds} 개를 표시합니다.",
                        sort: "정렬",
                        sortTitle: "선택한 ${type}의 하위 요소를 정렬합니다.",
                        sortTitleShort: "정렬",
                        sortFieldLabel: "요소:",
                        sortDirectionLabel: "순서:",
                        sortFieldTitle: "배열이나 객체를 정렬하는 요소를 선택해주세요.",
                        sortAscending: "오름차순",
                        sortAscendingTitle: "선택한 요소를 오름차순으로 정렬합니다.",
                        sortDescending: "내림차순",
                        sortDescendingTitle: "선택한 요소를 내림차순으로 정렬합니다.",
                        string: "문자",
                        transform: "변환",
                        transformTitle: "선택한 ${type}의 하위 요소를 필터하거나 정렬 또는 변환합니다.",
                        transformTitleShort: "내용을 필터하거나 정렬 또는 변환합니다.",
                        extract: "추출",
                        extractTitle: "선택한 ${type}의 값을 최상위에 위치시킵니다.",
                        transformQueryTitle: "JMESPath 쿼리를 입력해주세요.",
                        transformWizardLabel: "마법사",
                        transformWizardFilter: "필터",
                        transformWizardSortBy: "정렬",
                        transformWizardSelectFields: "요소를 선택해주세요.",
                        transformQueryLabel: "쿼리",
                        transformPreviewLabel: "미리보기",
                        type: "유형",
                        typeTitle: "선택한 요소의 유형을 변경합니다.",
                        openUrl: "Ctrl + Click 또는 Ctrl + Enter로 새 창에서 URL 열기",
                        undo: "실행 취소 (Ctrl + Z)",
                        validationCannotMove: "하위 요소로 이동할 수 없습니다.",
                        autoType: "자동: 요소의 형식이 값의 유형으로 결정됩니다. 문자, 숫자, 부울, 또는 null만 허용됩니다.",
                        objectType: "객체: 순서대로 나열되지 않은 이름/값 쌍으로 이루어진 집합입니다.",
                        arrayType: "배열: 순서대로 나열된 값의 집합입니다.",
                        stringType: "문자: 요소의 유형이 값에서 결정되지 않지만 항상 문자로 반환됩니다.",
                        modeEditorTitle: "편집기 유형 변경",
                        modeCodeText: "코드",
                        modeCodeTitle: "형식 교정을 도와주는 기능이 포함된 문자 편집기",
                        modeFormText: "입력 양식",
                        modeFormTitle: "정해진 요소에 값을 입력하는 편집기",
                        modeTextText: "문자",
                        modeTextTitle: "단순 문자 편집기",
                        modeTreeText: "트리",
                        modeTreeTitle: "트리 구조로 표시되는 편집기",
                        modeViewText: "보기",
                        modeViewTitle: "읽기전용 트리 구조로 JSON을 표시",
                        modePreviewText: "미리보기",
                        modePreviewTitle: "읽기전용 문자로 JSON을 표시",
                        examples: "예제",
                        default: "기본값",
                        containsInvalidProperties: "잘못된 속성이 포함되어 있습니다.",
                        containsInvalidItems: "잘못된 항목이 포함되어 있습니다"
                    }
                }, n = Object.keys(o), s = "en",
                r = "undefined" != typeof navigator ? navigator.language || navigator.userLanguage : void 0,
                a = n.find(function (e) {
                    return e === r
                }) || s;

            function l(t) {
                var e;
                t && ((e = n.find(function (e) {
                    return e === t
                })) ? a = e : console.error("Language not found"))
            }

            function c(e) {
                if (e) for (var t in e) !function (t) {
                    n.find(function (e) {
                        return e === t
                    }) || n.push(t), o[t] = Object.assign({}, o[s], o[t], e[t])
                }(t)
            }

            function h(e, t, i) {
                var n = o[i = i || a][e] || o[s][e] || e;
                if (t) for (var r in t) n = n.replace("${" + r + "}", t[r]);
                return n
            }
        }, 6056: function (e, t, i) {
            "use strict";
            i.d(t, {
                r: function () {
                    return r
                }, J: function () {
                    return o
                }
            });
            var t = i(5156), n = i.n(t), s = i(9791);

            function r(e, t) {
                var i = t.sort, n = t.filter, r = t.projection, o = "";
                return n ? (t = "@" !== n.field ? ["0"].concat((0, s.parsePath)("." + n.field)) : ["0"], t = "string" == typeof (0, s.get)(e, t) ? n.value : (0, s.parseString)(n.value), o += "[? " + n.field + " " + n.relation + " `" + JSON.stringify(t) + "`]") : o += Array.isArray(e) ? "[*]" : "@", i && ("desc" === i.direction ? o += " | reverse(sort_by(@, &" + i.field + "))" : o += " | sort_by(@, &" + i.field + ")"), r && ("]" !== o[o.length - 1] && (o += " | [*]"), 1 === r.fields.length ? o += "." + r.fields[0] : 1 < r.fields.length && (o += ".{" + r.fields.map(function (e) {
                    var t = e.split(".");
                    return t[t.length - 1] + ": " + e
                }).join(", ") + "}")), o
            }

            function o(e, t) {
                return n().search(e, t)
            }
        }, 4987: function () {
            function e(e) {
                "remove" in e || Object.defineProperty(e, "remove", {
                    configurable: !0,
                    enumerable: !0,
                    writable: !0,
                    value: function () {
                        void 0 !== this.parentNode && this.parentNode.removeChild(this)
                    }
                })
            }

            "undefined" != typeof Element && (void 0 !== window.Element && e(window.Element.prototype), void 0 !== window.CharacterData && e(window.CharacterData.prototype), void 0 !== window.DocumentType && e(window.DocumentType.prototype)), Array.prototype.findIndex || Object.defineProperty(Array.prototype, "findIndex", {
                value: function (e) {
                    for (var t = 0; t < this.length; t++) {
                        var i = this[t];
                        if (e.call(this, i, t, this)) return t
                    }
                    return -1
                }, configurable: !0, writable: !0
            }), Array.prototype.find || Object.defineProperty(Array.prototype, "find", {
                value: function (e) {
                    e = this.findIndex(e);
                    return this[e]
                }, configurable: !0, writable: !0
            }), String.prototype.trim || (String.prototype.trim = function () {
                return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "")
            })
        }, 341: function (e, t, i) {
            "use strict";
            i.r(t), i.d(t, {
                previewModeMixins: function () {
                    return m
                }
            });
            var t = i(3860), n = i.n(t), s = i(4188), r = i(6436), o = i(2474);

            function a(e, t) {
                for (var i = 0; i < t.length; i++) {
                    var n = t[i];
                    n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n)
                }
            }

            var l = function () {
                    function n(e, t, i) {
                        !function (e, t) {
                            if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function")
                        }(this, n), this.onChange = e, this.calculateItemSize = t || function () {
                            return 1
                        }, this.limit = i, this.items = [], this.index = -1
                    }

                    var e, t, i;
                    return e = n, (t = [{
                        key: "add", value: function (e) {
                            for (; this._calculateHistorySize() > this.limit && 1 < this.items.length;) this.items.shift(), this.index--;
                            this.items = this.items.slice(0, this.index + 1), this.items.push(e), this.index++, this.onChange()
                        }
                    }, {
                        key: "_calculateHistorySize", value: function () {
                            var t = this.calculateItemSize, i = 0;
                            return this.items.forEach(function (e) {
                                i += t(e)
                            }), i
                        }
                    }, {
                        key: "undo", value: function () {
                            if (this.canUndo()) return this.index--, this.onChange(), this.items[this.index]
                        }
                    }, {
                        key: "redo", value: function () {
                            if (this.canRedo()) return this.index++, this.onChange(), this.items[this.index]
                        }
                    }, {
                        key: "canUndo", value: function () {
                            return 0 < this.index
                        }
                    }, {
                        key: "canRedo", value: function () {
                            return this.index < this.items.length - 1
                        }
                    }, {
                        key: "clear", value: function () {
                            this.items = [], this.index = -1, this.onChange()
                        }
                    }]) && a(e.prototype, t), i && a(e, i), n
                }(), c = i(7907), h = i(6056), d = i(6617), u = i(6210), g = i(2558), t = i(5956), p = i(9791),
                i = t.textModeMixins[0].mixin, t = {
                    create: function (e) {
                        var t = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {};
                        void 0 === t.statusBar && (t.statusBar = !0), t.mainMenuBar = !1 !== t.mainMenuBar, t.enableSort = !1 !== t.enableSort, t.enableTransform = !1 !== t.enableTransform, t.createQuery = t.createQuery || h.r, t.executeQuery = t.executeQuery || h.J, "number" == typeof (this.options = t).indentation ? this.indentation = Number(t.indentation) : this.indentation = 2, (0, c.cC)(this.options.languages), (0, c.m0)(this.options.language), this.mode = "preview";
                        var i = this;
                        this.container = e, this.dom = {}, this.json = void 0, this.text = "", this._debouncedValidate = (0, p.debounce)(this.validate.bind(this), this.DEBOUNCE_INTERVAL), this.width = e.clientWidth, this.height = e.clientHeight, this.frame = document.createElement("div"), this.frame.className = "jsoneditor jsoneditor-mode-preview", this.frame.onclick = function (e) {
                            e.preventDefault()
                        };
                        var n, e = {
                            target: this.frame,
                            onFocus: this.options.onFocus || null,
                            onBlur: this.options.onBlur || null
                        };
                        this.frameFocusTracker = new o.R(e), this.content = document.createElement("div"), this.content.className = "jsoneditor-outer", this.dom.busy = document.createElement("div"), this.dom.busy.className = "jsoneditor-busy", this.dom.busyContent = document.createElement("span"), this.dom.busyContent.textContent = "busy...", this.dom.busy.appendChild(this.dom.busyContent), this.content.appendChild(this.dom.busy), this.dom.previewContent = document.createElement("pre"), this.dom.previewContent.className = "jsoneditor-preview", this.dom.previewText = document.createTextNode(""), this.dom.previewContent.appendChild(this.dom.previewText), this.content.appendChild(this.dom.previewContent), this.options.mainMenuBar && ((0, p.addClassName)(this.content, "has-main-menu-bar"), this.menu = document.createElement("div"), this.menu.className = "jsoneditor-menu", this.frame.appendChild(this.menu), (e = document.createElement("button")).type = "button", e.className = "jsoneditor-format", e.title = (0, c.Iu)("formatTitle"), this.menu.appendChild(e), e.onclick = function () {
                            i.executeWithBusyMessage(function () {
                                try {
                                    i.format()
                                } catch (e) {
                                    i._onError(e)
                                }
                            }, "formatting...")
                        }, (e = document.createElement("button")).type = "button", e.className = "jsoneditor-compact", e.title = (0, c.Iu)("compactTitle"), this.menu.appendChild(e), e.onclick = function () {
                            i.executeWithBusyMessage(function () {
                                try {
                                    i.compact()
                                } catch (e) {
                                    i._onError(e)
                                }
                            }, "compacting...")
                        }, this.options.enableSort && ((e = document.createElement("button")).type = "button", e.className = "jsoneditor-sort", e.title = (0, c.Iu)("sortTitleShort"), e.onclick = function () {
                            i._showSortModal()
                        }, this.menu.appendChild(e)), this.options.enableTransform && ((n = document.createElement("button")).type = "button", n.title = (0, c.Iu)("transformTitleShort"), n.className = "jsoneditor-transform", n.onclick = function () {
                            i._showTransformModal()
                        }, this.dom.transform = n, this.menu.appendChild(n)), (n = document.createElement("button")).type = "button", n.className = "jsoneditor-repair", n.title = (0, c.Iu)("repairTitle"), this.menu.appendChild(n), !(n.onclick = function () {
                            void 0 === i.json && i.executeWithBusyMessage(function () {
                                try {
                                    i.repair()
                                } catch (e) {
                                    i._onError(e)
                                }
                            }, "repairing...")
                        }) !== this.options.history && (this.history = new l(function () {
                            i.dom.undo.disabled = !i.history.canUndo(), i.dom.redo.disabled = !i.history.canRedo()
                        }, function (e) {
                            return 2 * e.text.length
                        }, s.oW), (n = document.createElement("button")).type = "button", n.className = "jsoneditor-undo jsoneditor-separator", n.title = (0, c.Iu)("undo"), n.onclick = function () {
                            var e = i.history.undo();
                            e && i._applyHistory(e)
                        }, this.menu.appendChild(n), this.dom.undo = n, (n = document.createElement("button")).type = "button", n.className = "jsoneditor-redo", n.title = (0, c.Iu)("redo"), n.onclick = function () {
                            var e = i.history.redo();
                            e && i._applyHistory(e)
                        }, this.menu.appendChild(n), this.dom.redo = n, this.history.onChange()), this.options && this.options.modes && this.options.modes.length && (this.modeSwitcher = new d.x(this.menu, this.options.modes, this.options.mode, function (e) {
                            try {
                                i.setMode(e), i.modeSwitcher.focus()
                            } catch (e) {
                                i._onError(e)
                            }
                        }))), this.errorTable = new r.Q({
                            errorTableVisible: !0, onToggleVisibility: function () {
                                i.validate()
                            }, onFocusLine: null, onChangeHeight: function (e) {
                                e = e + (i.dom.statusBar ? i.dom.statusBar.clientHeight : 0) + 1;
                                i.content.style.marginBottom = -e + "px", i.content.style.paddingBottom = e + "px"
                            }
                        }), this.frame.appendChild(this.content), this.frame.appendChild(this.errorTable.getErrorTable()), this.container.appendChild(this.frame), t.statusBar && ((0, p.addClassName)(this.content, "has-status-bar"), t = document.createElement("div"), (this.dom.statusBar = t).className = "jsoneditor-statusbar", this.frame.appendChild(t), this.dom.fileSizeInfo = document.createElement("span"), this.dom.fileSizeInfo.className = "jsoneditor-size-info", this.dom.fileSizeInfo.innerText = "", t.appendChild(this.dom.fileSizeInfo), this.dom.arrayInfo = document.createElement("span"), this.dom.arrayInfo.className = "jsoneditor-size-info", this.dom.arrayInfo.innerText = "", t.appendChild(this.dom.arrayInfo), t.appendChild(this.errorTable.getErrorCounter()), t.appendChild(this.errorTable.getWarningIcon()), t.appendChild(this.errorTable.getErrorIcon())), this._renderPreview(), this.setSchema(this.options.schema, this.options.schemaRefs)
                    }, _renderPreview: function () {
                        var e = this.getText();
                        this.dom.previewText.nodeValue = (0, p.limitCharacters)(e, s.WF), this.dom.fileSizeInfo && (this.dom.fileSizeInfo.innerText = "Size: " + (0, p.formatSize)(e.length)), this.dom.arrayInfo && (Array.isArray(this.json) ? this.dom.arrayInfo.innerText = "Array: " + this.json.length + " items" : this.dom.arrayInfo.innerText = "")
                    }, _onChange: function () {
                        if (this._debouncedValidate(), this.options.onChange) try {
                            this.options.onChange()
                        } catch (e) {
                            console.error("Error in onChange callback: ", e)
                        }
                        if (this.options.onChangeJSON) try {
                            this.options.onChangeJSON(this.get())
                        } catch (e) {
                            console.error("Error in onChangeJSON callback: ", e)
                        }
                        if (this.options.onChangeText) try {
                            this.options.onChangeText(this.getText())
                        } catch (e) {
                            console.error("Error in onChangeText callback: ", e)
                        }
                    }
                };
            t._showSortModal = function () {
                var o = this;
                this.executeWithBusyMessage(function () {
                    var e = o.options.modalAnchor || s.qD, r = o.get();
                    o._renderPreview(), (0, u.showSortModal)(e, r, function (n) {
                        o.executeWithBusyMessage(function () {
                            var e, t, i;
                            e = r, t = n, Array.isArray(e) && (i = (0, p.sort)(e, t.path, t.direction), o.sortedBy = t, o._setAndFireOnChange(i)), (0, p.isObject)(e) && (e = (0, p.sortObjectKeys)(e, t.direction), o.sortedBy = t, o._setAndFireOnChange(e))
                        }, "sorting...")
                    }, o.sortedBy)
                }, "parsing...")
            }, t._showTransformModal = function () {
                var o = this;
                this.executeWithBusyMessage(function () {
                    var e = o.options, t = e.createQuery, i = e.executeQuery, n = e.modalAnchor, e = e.queryDescription,
                        r = o.get();
                    o._renderPreview(), (0, g.showTransformModal)({
                        container: n || s.qD,
                        json: r,
                        queryDescription: e,
                        createQuery: t,
                        executeQuery: i,
                        onTransform: function (t) {
                            o.executeWithBusyMessage(function () {
                                var e = i(r, t);
                                o._setAndFireOnChange(e)
                            }, "transforming...")
                        }
                    })
                }, "parsing...")
            }, t.destroy = function () {
                this.frame && this.container && this.frame.parentNode === this.container && this.container.removeChild(this.frame), this.modeSwitcher && (this.modeSwitcher.destroy(), this.modeSwitcher = null), this._debouncedValidate = null, this.history && (this.history.clear(), this.history = null), this.frameFocusTracker.destroy()
            }, t.compact = function () {
                var e = this.get(), t = JSON.stringify(e);
                this._setTextAndFireOnChange(t, e)
            }, t.format = function () {
                var e = this.get(), t = JSON.stringify(e, null, this.indentation);
                this._setTextAndFireOnChange(t, e)
            }, t.repair = function () {
                var e = this.getText();
                try {
                    var t = n()(e);
                    this._setTextAndFireOnChange(t)
                } catch (e) {
                }
            }, t.focus = function () {
                this.dom.transform.focus()
            }, t.set = function (e) {
                this.history && this.history.clear(), this._set(e)
            }, t.update = function (e) {
                this._set(e)
            }, t._set = function (e) {
                this.text = void 0, this.json = e, this._renderPreview(), this._pushHistory(), this._debouncedValidate()
            }, t._setAndFireOnChange = function (e) {
                this._set(e), this._onChange()
            }, t.get = function () {
                var e;
                return void 0 === this.json && (e = this.getText(), this.json = (0, p.parse)(e)), this.json
            }, t.getText = function () {
                return void 0 === this.text && (this.text = JSON.stringify(this.json, null, this.indentation), !0 === this.options.escapeUnicode && (this.text = (0, p.escapeUnicodeChars)(this.text))), this.text
            }, t.setText = function (e) {
                this.history && this.history.clear(), this._setText(e)
            }, t.updateText = function (e) {
                this.getText() !== e && this._setText(e)
            }, t._setText = function (e, t) {
                var i;
                !0 === this.options.escapeUnicode ? this.text = (0, p.escapeUnicodeChars)(e) : this.text = e, this.json = t, this._renderPreview(), void 0 === this.json ? (i = this).executeWithBusyMessage(function () {
                    try {
                        i.json = i.get(), i._renderPreview(), i._pushHistory()
                    } catch (e) {
                    }
                }, "parsing...") : this._pushHistory(), this._debouncedValidate()
            }, t._setTextAndFireOnChange = function (e, t) {
                this._setText(e, t), this._onChange()
            }, t._applyHistory = function (e) {
                this.json = e.json, this.text = e.text, this._renderPreview(), this._debouncedValidate()
            }, t._pushHistory = function () {
                var e;
                this.history && (e = {text: this.text, json: this.json}, this.history.add(e))
            }, t.executeWithBusyMessage = function (e, t) {
                var i;
                this.getText().length > s.EX ? ((0, p.addClassName)((i = this).frame, "busy"), i.dom.busyContent.innerText = t, setTimeout(function () {
                    e(), (0, p.removeClassName)(i.frame, "busy"), i.dom.busyContent.innerText = ""
                }, 100)) : e()
            }, t.validate = i.validate, t._renderErrors = i._renderErrors;
            var m = [{mode: "preview", mixin: t, data: "json"}]
        }, 6210: function (e, t, i) {
            "use strict";
            i.r(t), i.d(t, {
                showSortModal: function () {
                    return s
                }
            });
            var t = i(483), n = i.n(t), r = i(7907), o = i(9791);

            function s(e, t, s, i) {
                var a = Array.isArray(t) ? (0, o.getChildPaths)(t) : [""],
                    l = i && i.path && (0, o.contains)(a, i.path) ? i.path : a[0], c = i && i.direction || "asc",
                    i = '<div class="pico-modal-contents"><div class="pico-modal-header">' + (0, r.Iu)("sort") + "</div><form><table><tbody><tr>  <td>" + (0, r.Iu)("sortFieldLabel") + ' </td>  <td class="jsoneditor-modal-input">  <div class="jsoneditor-select-wrapper">    <select id="field" title="' + (0, r.Iu)("sortFieldTitle") + '">    </select>  </div>  </td></tr><tr>  <td>' + (0, r.Iu)("sortDirectionLabel") + ' </td>  <td class="jsoneditor-modal-input">  <div id="direction" class="jsoneditor-button-group"><input type="button" value="' + (0, r.Iu)("sortAscending") + '" title="' + (0, r.Iu)("sortAscendingTitle") + '" data-value="asc" class="jsoneditor-button-first jsoneditor-button-asc"/><input type="button" value="' + (0, r.Iu)("sortDescending") + '" title="' + (0, r.Iu)("sortDescendingTitle") + '" data-value="desc" class="jsoneditor-button-last jsoneditor-button-desc"/>  </div>  </td></tr><tr><td colspan="2" class="jsoneditor-modal-input jsoneditor-modal-actions">  <input type="submit" id="ok" value="' + (0, r.Iu)("ok") + '" /></td></tr></tbody></table></form></div>';
                n()({
                    parent: e,
                    content: i,
                    overlayClass: "jsoneditor-modal-overlay",
                    overlayStyles: {backgroundColor: "rgb(1,1,1)", opacity: .3},
                    modalClass: "jsoneditor-modal jsoneditor-modal-sort"
                }).afterCreate(function (t) {
                    var e = t.modalElem().querySelector("form"), i = t.modalElem().querySelector("#ok"),
                        n = t.modalElem().querySelector("#field"), r = t.modalElem().querySelector("#direction");

                    function o(e) {
                        r.value = e, r.className = "jsoneditor-button-group jsoneditor-button-group-value-" + r.value
                    }

                    a.forEach(function (e) {
                        var t, i = document.createElement("option");
                        i.text = "" === (t = e) ? "@" : "." === t[0] ? t.slice(1) : t, i.value = e, n.appendChild(i)
                    }), n.value = l || a[0], o(c || "asc"), r.onclick = function (e) {
                        o(e.target.getAttribute("data-value"))
                    }, i.onclick = function (e) {
                        e.preventDefault(), e.stopPropagation(), t.close(), s({path: n.value, direction: r.value})
                    }, e && (e.onsubmit = i.onclick)
                }).afterClose(function (e) {
                    e.destroy()
                }).show()
            }
        }, 2558: function (e, t, i) {
            "use strict";
            i.r(t), i.d(t, {
                showTransformModal: function () {
                    return a
                }
            });
            var t = i(483), n = i.n(t), t = i(3879), x = i.n(t), r = i(7907);

            function o(e) {
                return (o = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) {
                    return typeof e
                } : function (e) {
                    return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e
                })(e)
            }

            function k(e, t, i, n) {
                return "boolean" == typeof e || e instanceof Boolean || null === e || "number" == typeof e || e instanceof Number || "string" == typeof e || e instanceof String || e instanceof Date ? JSON.stringify(e) : Array.isArray(e) ? function (e, t, i, n) {
                    for (var r = t ? i + t : void 0, o = t ? "[\n" : "[", s = 0; s < e.length; s++) {
                        var a = e[s];
                        if (t && (o += r), o += void 0 !== a && "function" != typeof a ? k(a, t, r, n) : "null", s < e.length - 1 && (o += t ? ",\n" : ","), o.length > n) return o + "..."
                    }
                    return o += t ? "\n" + i + "]" : "]"
                }(e, t, i, n) : e && "object" === o(e) ? function (e, t, i, n) {
                    var r, o = t ? i + t : void 0, s = !0, a = t ? "{\n" : "{";
                    if ("function" == typeof e.toJSON) return k(e.toJSON(), t, i, n);
                    for (r in e) if (function (e, t) {
                        return Object.prototype.hasOwnProperty.call(e, t)
                    }(e, r)) {
                        var l = e[r];
                        if (s ? s = !1 : a += t ? ",\n" : ",", a += t ? o + '"' + r + '": ' : '"' + r + '":', (a += k(l, t, o, n)).length > n) return a + "..."
                    }
                    return a += t ? "\n" + i + "}" : "}"
                }(e, t, i, n) : void 0
            }

            function E(e, t) {
                for (var i = ""; 0 < t--;) i += e;
                return i
            }

            var R = i(9791), T = i(4188),
                s = 'Enter a <a href="http://jmespath.org" target="_blank">JMESPath</a> query to filter, sort, or transform the JSON data.<br/>To learn JMESPath, go to <a href="http://jmespath.org/tutorial.html" target="_blank">the interactive tutorial</a>.';

            function a(e) {
                var t = e.container, A = e.json, i = e.queryDescription, i = void 0 === i ? s : i, b = e.createQuery,
                    y = e.executeQuery, w = e.onTransform, S = A,
                    i = '<label class="pico-modal-contents"><div class="pico-modal-header">' + (0, r.Iu)("transform") + "</div><p>" + i + '</p><div class="jsoneditor-jmespath-label">' + (0, r.Iu)("transformWizardLabel") + ' </div><div id="wizard" class="jsoneditor-jmespath-block jsoneditor-jmespath-wizard">  <table class="jsoneditor-jmespath-wizard-table">    <tbody>      <tr>        <th>' + (0, r.Iu)("transformWizardFilter") + '</th>        <td class="jsoneditor-jmespath-filter">          <div class="jsoneditor-inline jsoneditor-jmespath-filter-field" >            <select id="filterField">            </select>          </div>          <div class="jsoneditor-inline jsoneditor-jmespath-filter-relation" >            <select id="filterRelation">              <option value="==">==</option>              <option value="!=">!=</option>              <option value="<">&lt;</option>              <option value="<=">&lt;=</option>              <option value=">">&gt;</option>              <option value=">=">&gt;=</option>            </select>          </div>          <div class="jsoneditor-inline jsoneditor-jmespath-filter-value" >            <input type="text" class="value" placeholder="value..." id="filterValue" />          </div>        </td>      </tr>      <tr>        <th>' + (0, r.Iu)("transformWizardSortBy") + '</th>        <td class="jsoneditor-jmespath-filter">          <div class="jsoneditor-inline jsoneditor-jmespath-sort-field">            <select id="sortField">            </select>          </div>          <div class="jsoneditor-inline jsoneditor-jmespath-sort-order" >            <select id="sortOrder">              <option value="asc">Ascending</option>              <option value="desc">Descending</option>            </select>          </div>        </td>      </tr>      <tr id="selectFieldsPart">        <th>' + (0, r.Iu)("transformWizardSelectFields") + '</th>        <td class="jsoneditor-jmespath-filter">          <select class="jsoneditor-jmespath-select-fields" id="selectFields" multiple></select>        </td>      </tr>    </tbody>  </table></div><div class="jsoneditor-jmespath-label">' + (0, r.Iu)("transformQueryLabel") + ' </div><div class="jsoneditor-jmespath-block">  <textarea id="query"             rows="4"             autocomplete="off"             autocorrect="off"             autocapitalize="off"             spellcheck="false"            title="' + (0, r.Iu)("transformQueryTitle") + '">[*]</textarea></div><div class="jsoneditor-jmespath-label">' + (0, r.Iu)("transformPreviewLabel") + ' </div><div class="jsoneditor-jmespath-block">  <textarea id="preview"       class="jsoneditor-transform-preview"      readonly> </textarea></div><div class="jsoneditor-jmespath-block jsoneditor-modal-actions">  <input type="submit" id="ok" value="' + (0, r.Iu)("ok") + '" autofocus /></div></div>';
                n()({
                    parent: t,
                    content: i,
                    overlayClass: "jsoneditor-modal-overlay",
                    overlayStyles: {backgroundColor: "rgb(1,1,1)", opacity: .3},
                    modalClass: "jsoneditor-modal jsoneditor-modal-transform",
                    focus: !1
                }).afterCreate(function (t) {
                    var e = t.modalElem(), i = e.querySelector("#wizard"), o = e.querySelector("#ok"),
                        r = e.querySelector("#filterField"), s = e.querySelector("#filterRelation"),
                        a = e.querySelector("#filterValue"), l = e.querySelector("#sortField"),
                        c = e.querySelector("#sortOrder"), h = e.querySelector("#selectFields"),
                        d = e.querySelector("#query"), u = e.querySelector("#preview");
                    Array.isArray(S) || (i.style.fontStyle = "italic", i.textContent = "(wizard not available for objects, only for arrays)"), (0, R.getChildPaths)(A).forEach(function (e) {
                        var t = f(e), e = document.createElement("option");
                        e.text = t, e.value = t, r.appendChild(e);
                        e = document.createElement("option");
                        e.text = t, e.value = t, l.appendChild(e)
                    });
                    var n = (0, R.getChildPaths)(A, !0).filter(function (e) {
                        return "" !== e
                    });
                    0 < n.length ? n.forEach(function (e) {
                        var t = f(e), e = document.createElement("option");
                        e.text = t, e.value = t, h.appendChild(e)
                    }) : (m = e.querySelector("#selectFieldsPart")) && (m.style.display = "none");
                    var g = new (x())(r, {
                        defaultSelected: !1,
                        clearable: !0,
                        allowDeselect: !0,
                        placeholder: "field..."
                    }), p = new (x())(s, {
                        defaultSelected: !1,
                        clearable: !0,
                        allowDeselect: !0,
                        placeholder: "compare..."
                    }), i = new (x())(l, {
                        defaultSelected: !1,
                        clearable: !0,
                        allowDeselect: !0,
                        placeholder: "field..."
                    }), n = new (x())(c, {
                        defaultSelected: !1,
                        clearable: !0,
                        allowDeselect: !0,
                        placeholder: "order..."
                    }), m = new (x())(h, {
                        multiple: !0,
                        clearable: !0,
                        defaultSelected: !1,
                        placeholder: "select fields..."
                    });

                    function f(e) {
                        return "" === e ? "@" : "." === e[0] ? e.slice(1) : e
                    }

                    g.on("selectr.change", v), p.on("selectr.change", v), a.oninput = v, i.on("selectr.change", v), n.on("selectr.change", v), m.on("selectr.change", v), e.querySelector(".pico-modal-contents").onclick = function (e) {
                        "A" !== e.target.nodeName && e.preventDefault()
                    };
                    var C = (0, R.debounce)(function () {
                        try {
                            var e = y(S, d.value);
                            u.className = "jsoneditor-transform-preview", u.value = (t = e, i = 2, n = T.WF, "number" == typeof i ? 10 < i ? r = E(" ", 10) : 1 <= i && (r = E(" ", i)) : "string" == typeof i && "" !== i && (r = i), (t = k(t, r, "", n)).length > n ? (r = t, ("number" == typeof (n = n) ? r.slice(0, n) : r) + "...") : t), o.disabled = !1
                        } catch (e) {
                            u.className = "jsoneditor-transform-preview jsoneditor-error", u.value = e.toString(), o.disabled = !0
                        }
                        var t, i, n, r
                    }, 300);

                    function I(e, t) {
                        try {
                            d.value = b(e, t), o.disabled = !1, C()
                        } catch (e) {
                            t = 'Error: an error happened when executing "createQuery": ' + (e.message || e.toString());
                            d.value = "", o.disabled = !0, u.className = "jsoneditor-transform-preview jsoneditor-error", u.value = t
                        }
                    }

                    function v() {
                        var e = {};
                        if (r.value && s.value && a.value && (e.filter = {
                            field: r.value,
                            relation: s.value,
                            value: a.value
                        }), l.value && c.value && (e.sort = {field: l.value, direction: c.value}), h.value) {
                            for (var t, i = [], n = 0; n < h.options.length; n++) h.options[n].selected && (t = h.options[n].value, i.push(t));
                            e.projection = {fields: i}
                        }
                        I(A, e)
                    }

                    d.oninput = C, o.onclick = function (e) {
                        e.preventDefault(), e.stopPropagation(), t.close(), w(d.value)
                    }, I(A, {}), setTimeout(function () {
                        d.select(), d.focus(), d.selectionStart = 3, d.selectionEnd = 3
                    })
                }).afterClose(function (e) {
                    e.destroy()
                }).show()
            }
        }, 5956: function (e, t, i) {
            "use strict";
            i.r(t), i.d(t, {
                textModeMixins: function () {
                    return s
                }
            });
            var t = i(3860), n = i.n(t), t = i(8170), d = i.n(t), a = i(4188), u = i(6436), g = i(2474), p = i(7907),
                m = i(6056), f = i(6617), r = i(6210), l = i(2558), C = i(9125), I = i(9791);

            function v(e) {
                return (v = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) {
                    return typeof e
                } : function (e) {
                    return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e
                })(e)
            }

            var i = {}, A = "ace/theme/jsoneditor";

            function o() {
                try {
                    this.format()
                } catch (e) {
                }
            }

            i.create = function (e) {
                var t = this, i = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {};
                void 0 === i.statusBar && (i.statusBar = !0), i.mainMenuBar = !1 !== i.mainMenuBar, i.enableSort = !1 !== i.enableSort, i.enableTransform = !1 !== i.enableTransform, i.createQuery = i.createQuery || m.r, i.executeQuery = i.executeQuery || m.J, "number" == typeof (this.options = i).indentation ? this.indentation = Number(i.indentation) : this.indentation = 2, (0, p.cC)(this.options.languages), (0, p.m0)(this.options.language);
                var n = i.ace || d();
                this.mode = "code" === i.mode ? "code" : "text", "code" === this.mode && void 0 === n && (this.mode = "text", console.warn("Failed to load Ace editor, falling back to plain text mode. Please use a JSONEditor bundle including Ace, or pass Ace as via the configuration option `ace`.")), this.theme = i.theme || A, this.theme === A && n && (0, C.O)(), i.onTextSelectionChange && this.onTextSelectionChange(i.onTextSelectionChange);
                var r = this;
                this.container = e, this.dom = {}, this.aceEditor = void 0, this.textarea = void 0, this.validateSchema = null, this.annotations = [], this.lastSchemaErrors = void 0, this._debouncedValidate = (0, I.debounce)(this._validateAndCatch.bind(this), this.DEBOUNCE_INTERVAL), this.width = e.clientWidth, this.height = e.clientHeight, this.frame = document.createElement("div"), this.frame.className = "jsoneditor jsoneditor-mode-" + this.options.mode, this.frame.onclick = function (e) {
                    e.preventDefault()
                }, this.frame.onkeydown = function (e) {
                    r._onKeyDown(e)
                };
                var o, s, e = {
                    target: this.frame,
                    onFocus: this.options.onFocus || null,
                    onBlur: this.options.onBlur || null
                };
                this.frameFocusTracker = new g.R(e), this.content = document.createElement("div"), this.content.className = "jsoneditor-outer", this.options.mainMenuBar && ((0, I.addClassName)(this.content, "has-main-menu-bar"), this.menu = document.createElement("div"), this.menu.className = "jsoneditor-menu", this.frame.appendChild(this.menu), (e = document.createElement("button")).type = "button", e.className = "jsoneditor-format", e.title = (0, p.Iu)("formatTitle"), this.menu.appendChild(e), e.onclick = function () {
                    try {
                        r.format(), r._onChange()
                    } catch (e) {
                        r._onError(e)
                    }
                }, (e = document.createElement("button")).type = "button", e.className = "jsoneditor-compact", e.title = (0, p.Iu)("compactTitle"), this.menu.appendChild(e), e.onclick = function () {
                    try {
                        r.compact(), r._onChange()
                    } catch (e) {
                        r._onError(e)
                    }
                }, this.options.enableSort && ((e = document.createElement("button")).type = "button", e.className = "jsoneditor-sort", e.title = (0, p.Iu)("sortTitleShort"), e.onclick = function () {
                    r._showSortModal()
                }, this.menu.appendChild(e)), this.options.enableTransform && ((o = document.createElement("button")).type = "button", o.title = (0, p.Iu)("transformTitleShort"), o.className = "jsoneditor-transform", o.onclick = function () {
                    r._showTransformModal()
                }, this.menu.appendChild(o)), (o = document.createElement("button")).type = "button", o.className = "jsoneditor-repair", o.title = (0, p.Iu)("repairTitle"), this.menu.appendChild(o), o.onclick = function () {
                    try {
                        r.repair(), r._onChange()
                    } catch (e) {
                        r._onError(e)
                    }
                }, "code" === this.mode && ((h = document.createElement("button")).type = "button", h.className = "jsoneditor-undo jsoneditor-separator", h.title = (0, p.Iu)("undo"), h.onclick = function () {
                    t.aceEditor.getSession().getUndoManager().undo()
                }, this.menu.appendChild(h), this.dom.undo = h, (h = document.createElement("button")).type = "button", h.className = "jsoneditor-redo", h.title = (0, p.Iu)("redo"), h.onclick = function () {
                    t.aceEditor.getSession().getUndoManager().redo()
                }, this.menu.appendChild(h), this.dom.redo = h), this.options && this.options.modes && this.options.modes.length && (this.modeSwitcher = new f.x(this.menu, this.options.modes, this.options.mode, function (e) {
                    try {
                        r.setMode(e), r.modeSwitcher.focus()
                    } catch (e) {
                        r._onError(e)
                    }
                })) );
                var a, l, c,
                    h = this.options.onEditable && v("function" === this.options.onEditable) && !this.options.onEditable({});
                this.frame.appendChild(this.content), this.container.appendChild(this.frame), "code" === this.mode ? (this.editorDom = document.createElement("div"), this.editorDom.style.height = "100%", this.editorDom.style.width = "100%", this.content.appendChild(this.editorDom), n = (l = n.edit(this.editorDom)).getSession(), l.$blockScrolling = 1 / 0, l.setTheme(this.theme), l.setOptions({readOnly: h}), l.setShowPrintMargin(!1), l.setFontSize("13px"), n.setMode("ace/mode/json"), n.setTabSize(this.indentation), n.setUseSoftTabs(!0), n.setUseWrapMode(!0), a = n.setAnnotations, n.setAnnotations = function (e) {
                    a.call(this, e && e.length ? e : r.annotations)
                }, l.commands.bindKey("Ctrl-L", null), l.commands.bindKey("Command-L", null), l.commands.bindKey("Ctrl-\\", null), l.commands.bindKey("Command-\\", null), l.commands.bindKey("Ctrl-Shift-\\", null), l.commands.bindKey("Command-Shift-\\", null), (this.aceEditor = l).on("change", this._onChange.bind(this)), l.on("changeSelection", this._onSelect.bind(this))) : ((c = document.createElement("textarea")).className = "jsoneditor-text", c.spellcheck = !1, this.content.appendChild(c), this.textarea = c, this.textarea.readOnly = h, null === this.textarea.oninput ? this.textarea.oninput = this._onChange.bind(this
                ) : this.textarea.onchange = this._onChange.bind(this), c.onselect = this._onSelect.bind(this), c.onmousedown = this._onMouseDown.bind(this), c.onblur = this._onBlur.bind(this)), this._updateHistoryButtons(), this.errorTable = new u.Q({
                    errorTableVisible: "text" === this.mode,
                    onToggleVisibility: function () {
                        r._validateAndCatch()
                    },
                    onFocusLine: function (e) {
                        r.isFocused = !0, isNaN(e) || r.setTextSelection({row: e, column: 1}, {row: e, column: 1e3})
                    },
                    onChangeHeight: function (e) {
                        e = e + (r.dom.statusBar ? r.dom.statusBar.clientHeight : 0) + 1;
                        r.content.style.marginBottom = -e + "px", r.content.style.paddingBottom = e + "px"
                    }
                }), this.frame.appendChild(this.errorTable.getErrorTable()), i.statusBar && ((0, I.addClassName)(this.content, "has-status-bar"), this.curserInfoElements = {}, l = document.createElement("div"), (this.dom.statusBar = l).className = "jsoneditor-statusbar", this.frame.appendChild(l), (h = document.createElement("span")).className = "jsoneditor-curserinfo-label", h.innerText = "Ln:", (c = document.createElement("span")).className = "jsoneditor-curserinfo-val", c.innerText = "1", l.appendChild(h), l.appendChild(c), (i = document.createElement("span")).className = "jsoneditor-curserinfo-label", i.innerText = "Col:", (h = document.createElement("span")).className = "jsoneditor-curserinfo-val", h.innerText = "1", l.appendChild(i), l.appendChild(h), this.curserInfoElements.colVal = h, this.curserInfoElements.lnVal = c, (h = document.createElement("span")).className = "jsoneditor-curserinfo-label", h.innerText = "characters selected", h.style.display = "none", (c = document.createElement("span")).className = "jsoneditor-curserinfo-count", c.innerText = "0", c.style.display = "none", this.curserInfoElements.countLabel = h, this.curserInfoElements.countVal = c, l.appendChild(c), l.appendChild(h), l.appendChild(this.errorTable.getErrorCounter()), l.appendChild(this.errorTable.getWarningIcon()), l.appendChild(this.errorTable.getErrorIcon())), this.setSchema(this.options.schema, this.options.schemaRefs)
            }, i._onChange = function () {
                var e = this;
                if (!this.onChangeDisabled) {
                    if (setTimeout(function () {
                        e._updateHistoryButtons && e._updateHistoryButtons()
                    }), this._debouncedValidate(), this.options.onChange) try {
                        this.options.onChange()
                    } catch (e) {
                        console.error("Error in onChange callback: ", e)
                    }
                    if (this.options.onChangeText) try {
                        this.options.onChangeText(this.getText())
                    } catch (e) {
                        console.error("Error in onChangeText callback: ", e)
                    }
                }
            }, i._updateHistoryButtons = function () {
                var e;
                this.aceEditor && this.dom.undo && this.dom.redo && ((e = this.aceEditor.getSession().getUndoManager()) && e.hasUndo && e.hasRedo && (this.dom.undo.disabled = !e.hasUndo(), this.dom.redo.disabled = !e.hasRedo()))
            }, i._showSortModal = function () {
                try {
                    var i = this, e = this.options.modalAnchor || a.qD, n = this.get();
                    (0, r.showSortModal)(e, n, function (e) {
                        var t;
                        Array.isArray(n) && (t = (0, I.sort)(n, e.path, e.direction), i.sortedBy = e, i.update(t)), (0, I.isObject)(n) && (t = (0, I.sortObjectKeys)(n, e.direction), i.sortedBy = e, i.update(t))
                    }, i.sortedBy)
                } catch (e) {
                    this._onError(e)
                }
            }, i._showTransformModal = function () {
                var t = this;
                try {
                    var e = this.options, i = e.modalAnchor, n = e.createQuery, r = e.executeQuery,
                        o = e.queryDescription, s = this.get();
                    (0, l.showTransformModal)({
                        container: i || a.qD,
                        json: s,
                        queryDescription: o,
                        createQuery: n,
                        executeQuery: r,
                        onTransform: function (e) {
                            e = r(s, e);
                            t.update(e)
                        }
                    })
                } catch (e) {
                    this._onError(e)
                }
            }, i._onSelect = function () {
                this._updateCursorInfo(), this._emitSelectionChange()
            }, i._onKeyDown = function (e) {
                var t = !1;
                73 === (e.which || e.keyCode) && e.ctrlKey && (e.shiftKey ? this.compact() : this.format(), this._onChange(), t = !0), t && (e.preventDefault(), e.stopPropagation()), this._updateCursorInfo(), this._emitSelectionChange()
            }, i._onMouseDown = function () {
                this._updateCursorInfo(), this._emitSelectionChange()
            }, i._onBlur = function () {
                var e = this;
                setTimeout(function () {
                    e.isFocused || (e._updateCursorInfo(), e._emitSelectionChange()), e.isFocused = !1
                })
            }, i._updateCursorInfo = function () {
                var e, t, i, n, r, o = this;

                function s() {
                    o.curserInfoElements.countVal.innerText !== r && (o.curserInfoElements.countVal.innerText = r, o.curserInfoElements.countVal.style.display = r ? "inline" : "none", o.curserInfoElements.countLabel.style.display = r ? "inline" : "none"), o.curserInfoElements.lnVal.innerText = i, o.curserInfoElements.colVal.innerText = n
                }

                this.textarea ? setTimeout(function () {
                    var e = (0, I.getInputSelection)(o.textarea);
                    e.startIndex !== e.endIndex && (r = e.endIndex - e.startIndex), n = r && o.cursorInfo && o.cursorInfo.line === e.end.row && o.cursorInfo.column === e.end.column ? (i = e.start.row, e.start.column) : (i = e.end.row, e.end.column), o.cursorInfo = {
                        line: i,
                        column: n,
                        count: r
                    }, o.options.statusBar && s()
                }, 0) : this.aceEditor && this.curserInfoElements && (e = this.aceEditor.getCursorPosition(), t = this.aceEditor.getSelectedText(), i = e.row + 1, n = e.column + 1, r = t.length, o.cursorInfo = {
                    line: i,
                    column: n,
                    count: r
                }, this.options.statusBar && s())
            }, i._emitSelectionChange = function () {
                var e;
                this._selectionChangedHandler && (e = this.getTextSelection(), this._selectionChangedHandler(e.start, e.end, e.text))
            }, i._refreshAnnotations = function () {
                var e, t = this.aceEditor && this.aceEditor.getSession();
                t && (e = t.getAnnotations().filter(function (e) {
                    return "error" === e.type
                }), t.setAnnotations(e))
            }, i.destroy = function () {
                this.aceEditor && (this.aceEditor.destroy(), this.aceEditor = null), this.frame && this.container && this.frame.parentNode === this.container && this.container.removeChild(this.frame), this.modeSwitcher && (this.modeSwitcher.destroy(), this.modeSwitcher = null), this.textarea = null, this._debouncedValidate = null, this.frameFocusTracker.destroy()
            }, i.compact = function () {
                var e = this.get(), e = JSON.stringify(e);
                this.updateText(e)
            }, i.format = function () {
                var e = this.get(), e = JSON.stringify(e, null, this.indentation);
                this.updateText(e)
            }, i.repair = function () {
                var e = this.getText();
                try {
                    var t = n()(e);
                    this.updateText(t)
                } catch (e) {
                }
            }, i.focus = function () {
                this.textarea && this.textarea.focus(), this.aceEditor && this.aceEditor.focus()
            }, i.resize = function () {
                this.aceEditor && this.aceEditor.resize(!1)
            }, i.set = function (e) {
                this.setText(JSON.stringify(e, null, this.indentation))
            }, i.update = function (e) {
                this.updateText(JSON.stringify(e, null, this.indentation))
            }, i.get = function () {
                var e = this.getText();
                return (0, I.parse)(e)
            }, i.getText = function () {
                return this.textarea ? this.textarea.value : this.aceEditor ? this.aceEditor.getValue() : ""
            }, i._setText = function (e, t) {
                var i, n = this, e = !0 === this.options.escapeUnicode ? (0, I.escapeUnicodeChars)(e) : e;
                this.textarea && (this.textarea.value = e), this.aceEditor && (this.onChangeDisabled = !0, this.aceEditor.setValue(e, -1), this.onChangeDisabled = !1, t && (i = this, setTimeout(function () {
                    i.aceEditor && i.aceEditor.session.getUndoManager().reset()
                })), setTimeout(function () {
                    n._updateHistoryButtons && n._updateHistoryButtons()
                })), this._debouncedValidate()
            }, i.setText = function (e) {
                this._setText(e, !0)
            }, i.updateText = function (e) {
                this.getText() !== e && this._setText(e, !1)
            }, i.validate = function () {
                var t, i = this, n = [], r = [];
                try {
                    var o = this.get();
                    this.validateSchema && (this.validateSchema(o) || (n = this.validateSchema.errors.map(function (e) {
                        return e.type = "validation", (0, I.improveSchemaError)(e)
                    }))), this.validationSequence = (this.validationSequence || 0) + 1;
                    var s = this, a = this.validationSequence;
                    return function (e, t) {
                        if (!t) return Promise.resolve([]);
                        try {
                            var i = t(e);
                            return ((0, I.isPromise)(i) ? i : Promise.resolve(i)).then(function (e) {
                                return Array.isArray(e) ? e.filter(function (e) {
                                    var t = (0, I.isValidValidationError)(e);
                                    return t || console.warn('Ignoring a custom validation error with invalid structure. Expected structure: {path: [...], message: "..."}. Actual error:', e), t
                                }).map(function (e) {
                                    return {
                                        dataPath: (0, I.stringifyPath)(e.path),
                                        message: e.message,
                                        type: "customValidation"
                                    }
                                }) : []
                            })
                        } catch (e) {
                            return Promise.reject(e)
                        }
                    }(o, this.options.onValidate).then(function (e) {
                        return a === s.validationSequence && (e = n.concat(r).concat(e), s._renderErrors(e), "function" == typeof i.options.onValidationError && (0, I.isValidationErrorChanged)(e, i.lastSchemaErrors) && i.options.onValidationError.call(i, e), i.lastSchemaErrors = e), i.lastSchemaErrors
                    })
                } catch (e) {
                    return this.getText() && ((o = /\w*line\s*(\d+)\w*/g.exec(e.message)) && (t = +o[1]), r = [{
                        type: "error",
                        message: e.message.replace(/\n/g, "<br>"),
                        line: t
                    }]), this._renderErrors(r), "function" == typeof this.options.onValidationError && (0, I.isValidationErrorChanged)(r, this.lastSchemaErrors) && this.options.onValidationError.call(this, r), this.lastSchemaErrors = r, Promise.resolve(this.lastSchemaErrors)
                }
            }, i._validateAndCatch = function () {
                this.validate().catch(function (e) {
                    console.error("Error running validation:", e)
                })
            }, i._renderErrors = function (n) {
                var e = this.getText(), t = [];
                n.reduce(function (e, t) {
                    return "string" == typeof t.dataPath && -1 === e.indexOf(t.dataPath) && e.push(t.dataPath), e
                }, t);
                t = (0, I.getPositionForPath)(e, t);
                this.aceEditor && (this.annotations = t.map(function (t) {
                    var e = n.filter(function (e) {
                        return e.dataPath === t.path
                    }), i = e.map(function (e) {
                        return e.message
                    }).join("\n");
                    return i ? {
                        row: t.line,
                        column: t.column,
                        text: "Schema validation error" + (1 !== e.length ? "s" : "") + ": \n" + i,
                        type: "warning",
                        source: "jsoneditor"
                    } : {}
                }), this._refreshAnnotations()), this.errorTable.setErrors(n, t), this.aceEditor && this.aceEditor.resize(!1)
            }, i.getTextSelection = function () {
                var e = {};
                if (this.textarea) {
                    var t = (0, I.getInputSelection)(this.textarea);
                    return this.cursorInfo && this.cursorInfo.line === t.end.row && this.cursorInfo.column === t.end.column ? (e.start = t.end, e.end = t.start) : e = t, {
                        start: e.start,
                        end: e.end,
                        text: this.textarea.value.substring(t.startIndex, t.endIndex)
                    }
                }
                if (this.aceEditor) {
                    var i = this.aceEditor.getSelection(), n = this.aceEditor.getSelectedText(), t = i.getRange(),
                        i = i.getSelectionLead();
                    return i.row === t.end.row && i.column === t.end.column ? e = t : (e.start = t.end, e.end = t.start), {
                        start: {
                            row: e.start.row + 1,
                            column: e.start.column + 1
                        }, end: {row: e.end.row + 1, column: e.end.column + 1}, text: n
                    }
                }
            }, i.onTextSelectionChange = function (e) {
                "function" == typeof e && (this._selectionChangedHandler = (0, I.debounce)(e, this.DEBOUNCE_INTERVAL))
            }, i.setTextSelection = function (e, t) {
                var i, n, r;
                e && t && (this.textarea ? (i = (0, I.getIndexForPosition)(this.textarea, e.row, e.column), n = (0, I.getIndexForPosition)(this.textarea, t.row, t.column), -1 < i && -1 < n && (this.textarea.setSelectionRange ? (this.textarea.focus(), this.textarea.setSelectionRange(i, n)) : this.textarea.createTextRange && ((r = this.textarea.createTextRange()).collapse(!0), r.moveEnd("character", n), r.moveStart("character", i), r.select()), r = (this.textarea.value.match(/\n/g) || []).length + 1, r = this.textarea.scrollHeight / r, r = e.row * r, this.textarea.scrollTop = r > this.textarea.clientHeight ? r - this.textarea.clientHeight / 2 : 0)) : this.aceEditor && (t = {
                    start: {
                        row: e.row - 1,
                        column: e.column - 1
                    }, end: {row: t.row - 1, column: t.column - 1}
                }, this.aceEditor.selection.setRange(t), this.aceEditor.scrollToLine(e.row - 1, !0)))
            };
            var s = [{mode: "text", mixin: i, data: "text", load: o}, {mode: "code", mixin: i, data: "text", load: o}]
        }, 8038: function (e, t, i) {
            "use strict";
            i.r(t), i.d(t, {
                treeModeMixins: function () {
                    return V
                }
            });
            var w = {
                start: function (e, t, i) {
                    return 0 === t.indexOf(e)
                }, contain: function (e, t, i) {
                    return -1 < t.indexOf(e)
                }
            };
            var s = i(897), a = i(2474);

            function r(e, t) {
                for (var i = 0; i < t.length; i++) {
                    var n = t[i];
                    n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n)
                }
            }

            var n = function () {
                function e() {
                    !function (e, t) {
                        if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function")
                    }(this, e), this.locked = !1
                }

                var t, i, n;
                return t = e, (i = [{
                    key: "highlight", value: function (e) {
                        this.locked || (this.node !== e && (this.node && this.node.setHighlight(!1), this.node = e, this.node.setHighlight(!0)), this._cancelUnhighlight())
                    }
                }, {
                    key: "unhighlight", value: function () {
                        var e;
                        this.locked || (e = this).node && (this._cancelUnhighlight(), this.unhighlightTimer = setTimeout(function () {
                            e.node.setHighlight(!1), e.node = void 0, e.unhighlightTimer = void 0
                        }, 0))
                    }
                }, {
                    key: "_cancelUnhighlight", value: function () {
                        this.unhighlightTimer && (clearTimeout(this.unhighlightTimer), this.unhighlightTimer = void 0)
                    }
                }, {
                    key: "lock", value: function () {
                        this.locked = !0
                    }
                }, {
                    key: "unlock", value: function () {
                        this.locked = !1
                    }
                }]) && r(t.prototype, i), n && r(t, n), e
            }(), l = i(7907), o = i(6056), c = i(6617), t = i(233), h = i.n(t), d = i(2602), T = i(9791);
            var u = i(6210), g = i(2558), p = i(4188);

            function x(e) {
                return function (e) {
                    if (Array.isArray(e)) return f(e)
                }(e) || function (e) {
                    if ("undefined" != typeof Symbol && null != e[Symbol.iterator] || null != e["@@iterator"]) return Array.from(e)
                }(e) || m(e) || function () {
                    throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")
                }()
            }

            function k(e, t) {
                return function (e) {
                    if (Array.isArray(e)) return e
                }(e) || function (e, t) {
                    var i = null == e ? null : "undefined" != typeof Symbol && e[Symbol.iterator] || e["@@iterator"];
                    if (null != i) {
                        var n, r, o = [], s = !0, a = !1;
                        try {
                            for (i = i.call(e); !(s = (n = i.next()).done) && (o.push(n.value), !t || o.length !== t); s = !0) ;
                        } catch (e) {
                            a = !0, r = e
                        } finally {
                            try {
                                s || null == i.return || i.return()
                            } finally {
                                if (a) throw r
                            }
                        }
                        return o
                    }
                }(e, t) || m(e, t) || function () {
                    throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")
                }()
            }

            function E(e, t) {
                var i = "undefined" != typeof Symbol && e[Symbol.iterator] || e["@@iterator"];
                if (!i) {
                    if (Array.isArray(e) || (i = m(e)) || t && e && "number" == typeof e.length) {
                        i && (e = i);
                        var n = 0, t = function () {
                        };
                        return {
                            s: t, n: function () {
                                return n >= e.length ? {done: !0} : {done: !1, value: e[n++]}
                            }, e: function (e) {
                                throw e
                            }, f: t
                        }
                    }
                    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")
                }
                var r, o = !0, s = !1;
                return {
                    s: function () {
                        i = i.call(e)
                    }, n: function () {
                        var e = i.next();
                        return o = e.done, e
                    }, e: function (e) {
                        s = !0, r = e
                    }, f: function () {
                        try {
                            o || null == i.return || i.return()
                        } finally {
                            if (s) throw r
                        }
                    }
                }
            }

            function m(e, t) {
                if (e) {
                    if ("string" == typeof e) return f(e, t);
                    var i = Object.prototype.toString.call(e).slice(8, -1);
                    return "Map" === (i = "Object" === i && e.constructor ? e.constructor.name : i) || "Set" === i ? Array.from(e) : "Arguments" === i || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i) ? f(e, t) : void 0
                }
            }

            function f(e, t) {
                (null == t || t > e.length) && (t = e.length);
                for (var i = 0, n = new Array(t); i < t; i++) n[i] = e[i];
                return n
            }

            function _(e) {
                return (_ = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) {
                    return typeof e
                } : function (e) {
                    return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e
                })(e)
            }

            function C(e, t) {
                for (var i = 0; i < t.length; i++) {
                    var n = t[i];
                    n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n)
                }
            }

            var R = function () {
                function R(e, t) {
                    !function (e, t) {
                        if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function")
                    }(this, R), this.editor = e, this.dom = {}, this.expanded = !1, t && t instanceof Object ? (this.setField(t.field, t.fieldEditable), "value" in t && this.setValue(t.value, t.type), "internalValue" in t && this.setInternalValue(t.internalValue)) : (this.setField(""), this.setValue(null)), this._debouncedOnChangeValue = (0, T.debounce)(this._onChangeValue.bind(this), R.prototype.DEBOUNCE_INTERVAL), this._debouncedOnChangeField = (0, T.debounce)(this._onChangeField.bind(this), R.prototype.DEBOUNCE_INTERVAL), this.visibleChilds = this.getMaxVisibleChilds()
                }

                var e, t, i;
                return e = R, (t = [{
                    key: "getMaxVisibleChilds", value: function () {
                        return this.editor && this.editor.options && this.editor.options.maxVisibleChilds ? this.editor.options.maxVisibleChilds : I
                    }
                }, {
                    key: "_updateEditability", value: function () {
                        var e;
                        this.editable = {
                            field: !0,
                            value: !0
                        }, this.editor && (this.editable.field = "tree" === this.editor.options.mode, this.editable.value = "view" !== this.editor.options.mode, "tree" !== this.editor.options.mode && "form" !== this.editor.options.mode || "function" != typeof this.editor.options.onEditable || ("boolean" == typeof (e = this.editor.options.onEditable({
                            field: this.field,
                            value: this.value,
                            path: this.getPath()
                        })) ? (this.editable.field = e, this.editable.value = e) : "object" === _(e) && null !== e ? ("boolean" == typeof e.field && (this.editable.field = e.field), "boolean" == typeof e.value && (this.editable.value = e.value)) : (console.error("Invalid return value for function onEditable.", "Actual value:", e, ".", "Either a boolean or object { field: boolean, value: boolean } expected."), this.editable.field = !1, this.editable.value = !1)))
                    }
                }, {
                    key: "getPath", value: function () {
                        for (var e = this, t = []; e;) {
                            var i = e.getName();
                            void 0 !== i && t.unshift(i), e = e.parent
                        }
                        return t
                    }
                }, {
                    key: "getInternalPath", value: function () {
                        for (var e = this, t = []; e;) e.parent && t.unshift(e.getIndex()), e = e.parent;
                        return t
                    }
                }, {
                    key: "getName", value: function () {
                        return this.parent ? "array" !== this.parent.type ? this.field : this.index : void 0
                    }
                }, {
                    key: "findNodeByPath", value: function (e) {
                        if (e) {
                            if (0 === e.length) return this;
                            if (e.length && this.childs && this.childs.length) for (var t = 0; t < this.childs.length; ++t) if ("" + e[0] == "" + this.childs[t].getName()) return this.childs[t].findNodeByPath(e.slice(1))
                        }
                    }
                }, {
                    key: "findNodeByInternalPath", value: function (e) {
                        if (e) {
                            for (var t = this, i = 0; i < e.length && t; i++) var n = e[i], t = t.childs[n];
                            return t
                        }
                    }
                }, {
                    key: "serialize", value: function () {
                        return {value: this.getValue(), path: this.getPath()}
                    }
                }, {
                    key: "findNode", value: function (e) {
                        for (var i = (0, T.parsePath)(e), n = this; n && 0 < i.length;) !function () {
                            var t = i.shift();
                            if ("number" == typeof t) {
                                if ("array" !== n.type) throw new Error("Cannot get child node at index " + t + ": node is no array");
                                n = n.childs[t]
                            } else {
                                if ("object" !== n.type) throw new Error("Cannot get child node " + t + ": node is no object");
                                n = n.childs.filter(function (e) {
                                    return e.field === t
                                })[0]
                            }
                        }();
                        return n
                    }
                }, {
                    key: "findParents", value: function () {
                        for (var e = [], t = this.parent; t;) e.unshift(t), t = t.parent;
                        return e
                    }
                }, {
                    key: "setError", value: function (e, t) {
                        this.error = e, this.errorChild = t, this.dom && this.dom.tr && this.updateError()
                    }
                }, {
                    key: "updateError", value: function () {
                        var i = this, n = this.fieldError || this.valueError || this.error, e = this.dom.tdError;
                        if (n && this.dom && this.dom.tr) {
                            (0, T.addClassName)(this.dom.tr, "jsoneditor-validation-error"), e || (e = document.createElement("td"), this.dom.tdError = e, this.dom.tdValue.parentNode.appendChild(e));
                            var r = document.createElement("button");
                            r.type = "button", r.className = "jsoneditor-button jsoneditor-schema-error";
                            var t = function () {
                                i.dom.popupAnchor && i.dom.popupAnchor.destroy()
                            }, o = function () {
                                delete i.dom.popupAnchor
                            }, s = function (e) {
                                var t = i.editor.frame;
                                i.dom.popupAnchor = (0, d.w)(r, i.editor.getPopupAnchor(), o, e);
                                e = r.getBoundingClientRect(), t = 120 < t.getBoundingClientRect().width - e.x ? "jsoneditor-above" : "jsoneditor-left", e = document.createElement("div");
                                e.className = "jsoneditor-popover " + t, e.appendChild(document.createTextNode(n.message)), i.dom.popupAnchor.appendChild(e)
                            };
                            r.onmouseover = function () {
                                i.dom.popupAnchor || s(!0)
                            }, r.onfocus = function () {
                                t(), s(!1)
                            }, r.onblur = function () {
                                t()
                            };
                            var a = this.errorChild;
                            for (a && (r.onclick = function () {
                                a.findParents().forEach(function (e) {
                                    e.expand(!1)
                                }), a.scrollTo(function () {
                                    a.focus()
                                })
                            }); e.firstChild;) e.removeChild(e.firstChild);
                            e.appendChild(r)
                        } else this.dom.tr && (0, T.removeClassName)(this.dom.tr, "jsoneditor-validation-error"), e && (this.dom.tdError.parentNode.removeChild(this.dom.tdError), delete this.dom.tdError)
                    }
                }, {
                    key: "getIndex", value: function () {
                        if (this.parent) {
                            var e = this.parent.childs.indexOf(this);
                            return -1 !== e ? e : null
                        }
                        return -1
                    }
                }, {
                    key: "setParent", value: function (e) {
                        this.parent = e
                    }
                }, {
                    key: "setField", value: function (e, t) {
                        this.field = e, this.previousField = e, this.fieldEditable = !0 === t
                    }
                }, {
                    key: "getField", value: function () {
                        return void 0 === this.field && this._getDomField(), this.field
                    }
                }, {
                    key: "setValue", value: function (e, t) {
                        var i, n, r, o, s, a, l = this.childs;
                        if (this.type = this._getType(e), t && t !== this.type) {
                            if ("string" !== t || "auto" !== this.type) throw new Error('Type mismatch: cannot cast value of type "' + this.type + ' to the specified type "' + t + '"');
                            this.type = t
                        }
                        if ("array" === this.type) {
                            for (this.childs || (this.childs = []), i = 0; i < e.length; i++) void 0 === (s = e[i]) || s instanceof Function || (i < this.childs.length ? ((r = this.childs[i]).fieldEditable = !1, r.index = i, r.setValue(s)) : (r = new R(this.editor, {value: s}), o = i < this.getMaxVisibleChilds(), this.appendChild(r, o, !1)));
                            for (n = this.childs.length; n >= e.length; n--) this.removeChild(this.childs[n], !1)
                        } else if ("object" === this.type) {
                            for (this.childs || (this.childs = []), n = this.childs.length - 1; 0 <= n; n--) A(e, this.childs[n].field) || this.removeChild(this.childs[n], !1);
                            for (var c in i = 0, e) A(e, c) && (void 0 === (s = e[c]) || s instanceof Function || ((a = this.findChildByProperty(c)) ? (a.setField(c, !0), a.setValue(s)) : (a = new R(this.editor, {
                                field: c,
                                value: s
                            }), c = i < this.getMaxVisibleChilds(), this.appendChild(a, c, !1))), i++);
                            !(this.value = "") === this.editor.options.sortObjectKeys && this.sort([], "asc", !1)
                        } else this.hideChilds(), delete this.append, delete this.showMore, delete this.expanded, delete this.childs, this.value = e;
                        Array.isArray(l) !== Array.isArray(this.childs) && this.recreateDom(), this.updateDom({updateIndexes: !0}), this.previousValue = this.value
                    }
                }, {
                    key: "setInternalValue", value: function (e) {
                        var t, i, n, r, o, s = this.childs;
                        if (this.type = e.type, "array" === e.type) {
                            for (this.childs || (this.childs = []), r = 0; r < e.childs.length; r++) void 0 === (t = e.childs[r]) || t instanceof Function || (r < this.childs.length ? ((i = this.childs[r]).fieldEditable = !1, i.index = r, i.setInternalValue(t)) : (i = new R(this.editor, {internalValue: t}), n = r < this.getMaxVisibleChilds(), this.appendChild(i, n, !1)));
                            for (o = this.childs.length; o >= e.childs.length; o--) this.removeChild(this.childs[o], !1)
                        } else if ("object" === e.type) {
                            for (this.childs || (this.childs = []), r = 0; r < e.childs.length; r++) void 0 === (t = e.childs[r]) || t instanceof Function || (r < this.childs.length ? (delete (i = this.childs[r]).index, i.setField(t.field, !0), i.setInternalValue(t.value)) : (i = new R(this.editor, {
                                field: t.field,
                                internalValue: t.value
                            }), n = r < this.getMaxVisibleChilds(), this.appendChild(i, n, !1)));
                            for (o = this.childs.length; o >= e.childs.length; o--) this.removeChild(this.childs[o], !1)
                        } else this.hideChilds(), delete this.append, delete this.showMore, delete this.expanded, delete this.childs, this.value = e.value;
                        Array.isArray(s) !== Array.isArray(this.childs) && this.recreateDom(), this.updateDom({updateIndexes: !0}), this.previousValue = this.value
                    }
                }, {
                    key: "recreateDom", value: function () {
                        var e;
                        this.dom && this.dom.tr && this.dom.tr.parentNode ? (e = this._detachFromDom(), this.clearDom(), this._attachToDom(e)) : this.clearDom()
                    }
                }, {
                    key: "getValue", value: function () {
                        if ("array" === this.type) {
                            var t = [];
                            return this.childs.forEach(function (e) {
                                t.push(e.getValue())
                            }), t
                        }
                        if ("object" !== this.type) return void 0 === this.value && this._getDomValue(), this.value;
                        var i = {};
                        return this.childs.forEach(function (e) {
                            i[e.getField()] = e.getValue()
                        }), i
                    }
                }, {
                    key: "getInternalValue", value: function () {
                        return "array" === this.type ? {
                            type: this.type, childs: this.childs.map(function (e) {
                                return e.getInternalValue()
                            })
                        } : "object" === this.type ? {
                            type: this.type, childs: this.childs.map(function (e) {
                                return {field: e.getField(), value: e.getInternalValue()}
                            })
                        } : (void 0 === this.value && this._getDomValue(), {type: this.type, value: this.value})
                    }
                }, {
                    key: "getLevel", value: function () {
                        return this.parent ? this.parent.getLevel() + 1 : 0
                    }
                }, {
                    key: "getNodePath", value: function () {
                        var e = this.parent ? this.parent.getNodePath() : [];
                        return e.push(this), e
                    }
                }, {
                    key: "clone", value: function () {
                        var t, i;
                        return (t = new R(this.editor)).type = this.type, t.field = this.field, t.fieldInnerText = this.fieldInnerText, t.fieldEditable = this.fieldEditable, t.previousField = this.previousField, t.value = this.value, t.valueInnerText = this.valueInnerText, t.previousValue = this.previousValue, t.expanded = this.expanded, t.visibleChilds = this.visibleChilds, this.childs ? (i = [], this.childs.forEach(function (e) {
                            e = e.clone();
                            e.setParent(t), i.push(e)
                        }), t.childs = i) : t.childs = void 0, t
                    }
                }, {
                    key: "expand", value: function (t) {
                        this.childs && (this.expanded = !0, this.dom.expand && (this.dom.expand.className = "jsoneditor-button jsoneditor-expanded"), this.showChilds(), !1 !== t && this.childs.forEach(function (e) {
                            e.expand(t)
                        }), this.updateDom({recurse: !1}))
                    }
                }, {
                    key: "collapse", value: function (t) {
                        this.childs && (this.hideChilds(), !1 !== t && this.childs.forEach(function (e) {
                            e.collapse(t)
                        }), this.dom.expand && (this.dom.expand.className = "jsoneditor-button jsoneditor-collapsed"), this.expanded = !1, this.updateDom({recurse: !1}))
                    }
                }, {
                    key: "showChilds", value: function () {
                        var e = this.childs;
                        if (e && this.expanded) {
                            var t = this.dom.tr, i = t ? t.parentNode : void 0;
                            if (i) {
                                e = this.getAppendDom();
                                e.parentNode || ((r = t.nextSibling) ? i.insertBefore(e, r) : i.appendChild(e));
                                for (var n = Math.min(this.childs.length, this.visibleChilds), r = this._getNextTr(), o = 0; o < n; o++) {
                                    var s = this.childs[o];
                                    s.getDom().parentNode || i.insertBefore(s.getDom(), r), s.showChilds()
                                }
                                e = this.getShowMoreDom();
                                r = this._getNextTr(), e.parentNode || i.insertBefore(e, r), this.showMore.updateDom()
                            }
                        }
                    }
                }, {
                    key: "_getNextTr", value: function () {
                        return this.showMore && this.showMore.getDom().parentNode ? this.showMore.getDom() : this.append && this.append.getDom().parentNode ? this.append.getDom() : void 0
                    }
                }, {
                    key: "hide", value: function (e) {
                        var t = this.dom.tr, i = t ? t.parentNode : void 0;
                        i && i.removeChild(t), this.dom.popupAnchor && this.dom.popupAnchor.destroy(), this.hideChilds(e)
                    }
                }, {
                    key: "hideChilds", value: function (e) {
                        var t;
                        this.childs && this.expanded && ((t = this.getAppendDom()).parentNode && t.parentNode.removeChild(t), this.childs.forEach(function (e) {
                            e.hide()
                        }), (t = this.getShowMoreDom()).parentNode && t.parentNode.removeChild(t), e && !e.resetVisibleChilds || (this.visibleChilds = this.getMaxVisibleChilds()))
                    }
                }, {
                    key: "_updateCssClassName", value: function () {
                        var e;
                        this.dom.field && this.editor && this.editor.options && "function" == typeof this.editor.options.onClassName && this.dom.tree && ((0, T.removeAllClassNames)(this.dom.tree), e = this.editor.options.onClassName({
                            path: this.getPath(),
                            field: this.field,
                            value: this.value
                        }) || "", (0, T.addClassName)(this.dom.tree, "jsoneditor-values " + e))
                    }
                }, {
                    key: "recursivelyUpdateCssClassesOnNodes", value: function () {
                        if (this._updateCssClassName(), Array.isArray(this.childs)) for (var e = 0; e < this.childs.length; e++) this.childs[e].recursivelyUpdateCssClassesOnNodes()
                    }
                }, {
                    key: "expandTo", value: function () {
                        for (var e = this.parent; e;) e.expanded || e.expand(), e = e.parent
                    }
                }, {
                    key: "appendChild", value: function (e, t, i) {
                        var n, r;
                        this._hasChilds() && (e.setParent(this), e.fieldEditable = "object" === this.type, "array" === this.type && (e.index = this.childs.length), "object" === this.type && void 0 === e.field && e.setField(""), this.childs.push(e), this.expanded && !1 !== t && (n = e.getDom(), t = (r = this._getNextTr()) ? r.parentNode : void 0, r && t && t.insertBefore(n, r), e.showChilds(), this.visibleChilds++), !1 !== i && (this.updateDom({updateIndexes: !0}), e.updateDom({recurse: !0})))
                    }
                }, {
                    key: "moveBefore", value: function (e, t, i) {
                        var n, r, o;
                        this._hasChilds() && ((n = this.dom.tr ? this.dom.tr.parentNode : void 0) && ((r = document.createElement("tr")).style.height = n.clientHeight + "px", n.appendChild(r)), e.parent && e.parent.removeChild(e), t instanceof L || !t ? this.childs.length + 1 > this.visibleChilds ? (o = this.childs[this.visibleChilds - 1], this.insertBefore(e, o, i)) : this.appendChild(e, !0, i) : this.insertBefore(e, t, i), n && r && n.removeChild(r))
                    }
                }, {
                    key: "insertBefore", value: function (e, t, i) {
                        if (this._hasChilds()) {
                            if (this.visibleChilds++, "object" === this.type && void 0 === e.field && e.setField(""), t === this.append) e.setParent(this), e.fieldEditable = "object" === this.type, this.childs.push(e); else {
                                var n = this.childs.indexOf(t);
                                if (-1 === n) throw new Error("Node not found");
                                e.setParent(this), e.fieldEditable = "object" === this.type, this.childs.splice(n, 0, e)
                            }
                            var r;
                            this.expanded && (r = e.getDom(), t = (n = t.getDom()) ? n.parentNode : void 0, n && t && t.insertBefore(r, n), e.showChilds(), this.showChilds()), !1 !== i && (this.updateDom({updateIndexes: !0}), e.updateDom({recurse: !0}))
                        }
                    }
                }, {
                    key: "insertAfter", value: function (e, t) {
                        this._hasChilds() && (t = this.childs.indexOf(t), (t = this.childs[t + 1]) ? this.insertBefore(e, t) : this.appendChild(e))
                    }
                }, {
                    key: "search", value: function (t, i) {
                        Array.isArray(i) || (i = []);
                        var e = t ? t.toLowerCase() : void 0;
                        return delete this.searchField, delete this.searchValue, void 0 !== this.field && i.length <= this.MAX_SEARCH_RESULTS && (-1 !== String(this.field).toLowerCase().indexOf(e) && (this.searchField = !0, i.push({
                            node: this,
                            elem: "field"
                        })), this._updateDomField()), this._hasChilds() ? this.childs && this.childs.forEach(function (e) {
                            e.search(t, i)
                        }) : void 0 !== this.value && i.length <= this.MAX_SEARCH_RESULTS && (-1 !== String(this.value).toLowerCase().indexOf(e) && (this.searchValue = !0, i.push({
                            node: this,
                            elem: "value"
                        })), this._updateDomValue()), i
                    }
                }, {
                    key: "scrollTo", value: function (e) {
                        this.expandPathToNode(), this.dom.tr && this.dom.tr.parentNode && this.editor.scrollTo(this.dom.tr.offsetTop, e)
                    }
                }, {
                    key: "expandPathToNode", value: function () {
                        for (var e = this; e && e.parent;) {
                            for (var t = "array" === e.parent.type ? e.index : e.parent.childs.indexOf(e); e.parent.visibleChilds < t + 1;) e.parent.visibleChilds += this.getMaxVisibleChilds();
                            e.parent.expand(!1), e = e.parent
                        }
                    }
                }, {
                    key: "focus", value: function (e) {
                        if (R.focusElement = e, this.dom.tr && this.dom.tr.parentNode) {
                            var t = this.dom;
                            switch (e) {
                                case"drag":
                                    (t.drag || t.menu).focus();
                                    break;
                                case"menu":
                                    t.menu.focus();
                                    break;
                                case"expand":
                                    this._hasChilds() ? t.expand.focus() : t.field && this.fieldEditable ? (t.field.focus(), (0, T.selectContentEditable)(t.field)) : t.value && !this._hasChilds() ? (t.value.focus(), (0, T.selectContentEditable)(t.value)) : t.menu.focus();
                                    break;
                                case"field":
                                    t.field && this.fieldEditable ? (t.field.focus(), (0, T.selectContentEditable)(t.field)) : t.value && !this._hasChilds() ? (t.value.focus(), (0, T.selectContentEditable)(t.value)) : (this._hasChilds() ? t.expand : t.menu).focus();
                                    break;
                                default:
                                    t.select ? t.select.focus() : t.value && !this._hasChilds() ? (t.value.focus(), (0, T.selectContentEditable)(t.value)) : t.field && this.fieldEditable ? (t.field.focus(), (0, T.selectContentEditable)(t.field)) : (this._hasChilds() ? t.expand : t.menu).focus()
                            }
                        }
                    }
                }, {
                    key: "containsNode", value: function (e) {
                        if (this === e) return !0;
                        var t = this.childs;
                        if (t) for (var i = 0, n = t.length; i < n; i++) if (t[i].containsNode(e)) return !0;
                        return !1
                    }
                }, {
                    key: "removeChild", value: function (e, t) {
                        if (this.childs) {
                            var i = this.childs.indexOf(e);
                            if (-1 !== i) {
                                i < this.visibleChilds && this.expanded && this.visibleChilds--, e.hide(), delete e.searchField, delete e.searchValue;
                                i = this.childs.splice(i, 1)[0];
                                return i.parent = null, !1 !== t && this.updateDom({updateIndexes: !0}), i
                            }
                        }
                    }
                }, {
                    key: "_remove", value: function (e) {
                        this.removeChild(e)
                    }
                }, {
                    key: "changeType", value: function (e) {
                        var t, i = this.type;
                        i !== e && ("string" !== e && "auto" !== e || "string" !== i && "auto" !== i ? (t = this._detachFromDom(), this.clearDom(), "object" === (this.type = e) ? (this.childs || (this.childs = []), this.childs.forEach(function (e) {
                            e.clearDom(), delete e.index, e.fieldEditable = !0, void 0 === e.field && (e.field = "")
                        }), "string" !== i && "auto" !== i || (this.expanded = !0)) : "array" === e ? (this.childs || (this.childs = []), this.childs.forEach(function (e, t) {
                            e.clearDom(), e.fieldEditable = !1, e.index = t
                        }), "string" !== i && "auto" !== i || (this.expanded = !0)) : this.expanded = !1, this._attachToDom(t)) : this.type = e, "auto" !== e && "string" !== e || (this.value = "string" === e ? String(this.value) : (0, T.parseString)(String(this.value)), this.focus()), this.updateDom({updateIndexes: !0}))
                    }
                }, {
                    key: "deepEqual", value: function (e) {
                        var t;
                        if ("array" === this.type) {
                            if (!Array.isArray(e)) return !1;
                            if (this.childs.length !== e.length) return !1;
                            for (t = 0; t < this.childs.length; t++) if (!this.childs[t].deepEqual(e[t])) return !1
                        } else if ("object" === this.type) {
                            if ("object" !== _(e) || !e) return !1;
                            var i = Object.keys(e);
                            if (this.childs.length !== i.length) return !1;
                            for (t = 0; t < i.length; t++) {
                                var n = this.childs[t];
                                if (n.field !== i[t] || !n.deepEqual(e[n.field])) return !1
                            }
                        } else if (this.value !== e) return !1;
                        return !0
                    }
                }, {
                    key: "_getDomValue", value: function () {
                        if (this._clearValueError(), this.dom.value && "array" !== this.type && "object" !== this.type && (this.valueInnerText = (0, T.getInnerText)(this.dom.value), "" === this.valueInnerText && "" !== this.dom.value.innerHTML && (this.dom.value.textContent = "")), void 0 !== this.valueInnerText) try {
                            var e, t;
                            (t = "string" === this.type ? this._unescapeHTML(this.valueInnerText) : (e = this._unescapeHTML(this.valueInnerText), (0, T.parseString)(e))) !== this.value && (this.value = t, this._debouncedOnChangeValue())
                        } catch (e) {
                            this._setValueError((0, l.Iu)("cannotParseValueError"))
                        }
                    }
                }, {
                    key: "_setValueError", value: function (e) {
                        this.valueError = {message: e}, this.updateError()
                    }
                }, {
                    key: "_clearValueError", value: function () {
                        this.valueError && (this.valueError = null, this.updateError())
                    }
                }, {
                    key: "_setFieldError", value: function (e) {
                        this.fieldError = {message: e}, this.updateError()
                    }
                }, {
                    key: "_clearFieldError", value: function () {
                        this.fieldError && (this.fieldError = null, this.updateError())
                    }
                }, {
                    key: "_onChangeValue", value: function () {
                        var e = this.editor.getDomSelection();
                        e.range && (t = (0, T.textDiff)(String(this.value), String(this.previousValue)), e.range.startOffset = t.start, e.range.endOffset = t.end);
                        var t, i = this.editor.getDomSelection();
                        i.range && (t = (0, T.textDiff)(String(this.previousValue), String(this.value)), i.range.startOffset = t.start, i.range.endOffset = t.end), this.editor._onAction("editValue", {
                            path: this.getInternalPath(),
                            oldValue: this.previousValue,
                            newValue: this.value,
                            oldSelection: e,
                            newSelection: i
                        }), this.previousValue = this.value
                    }
                }, {
                    key: "_onChangeField", value: function () {
                        var e = this.editor.getDomSelection(), t = this.previousField || "";
                        e.range && (i = (0, T.textDiff)(this.field, t), e.range.startOffset = i.start, e.range.endOffset = i.end);
                        var i = this.editor.getDomSelection();
                        i.range && (t = (0, T.textDiff)(t, this.field), i.range.startOffset = t.start, i.range.endOffset = t.end), this.editor._onAction("editField", {
                            parentPath: this.parent.getInternalPath(),
                            index: this.getIndex(),
                            oldValue: this.previousField,
                            newValue: this.field,
                            oldSelection: e,
                            newSelection: i
                        }), this.previousField = this.field
                    }
                }, {
                    key: "_updateDomValue", value: function () {
                        var e = this.dom.value;
                        if (e) {
                            var t = ["jsoneditor-value"], i = this.value,
                                n = "auto" === this.type ? (0, T.getType)(i) : this.type,
                                r = "string" === n && (0, T.isUrl)(i);
                            if (t.push("jsoneditor-" + n), r && t.push("jsoneditor-url"), "" === String(this.value) && "array" !== this.type && "object" !== this.type && t.push("jsoneditor-empty"), this.searchValueActive && t.push("jsoneditor-highlight-active"), this.searchValue && t.push("jsoneditor-highlight"), e.className = t.join(" "), "array" === n || "object" === n ? (t = this.childs ? this.childs.length : 0, e.title = this.type + " containing " + t + " items") : r && this.editable.value ? e.title = (0, l.Iu)("openUrl") : e.title = "", "boolean" === n && this.editable.value ? (this.dom.checkbox || (this.dom.checkbox = document.createElement("input"), this.dom.checkbox.type = "checkbox", this.dom.tdCheckbox = document.createElement("td"), this.dom.tdCheckbox.className = "jsoneditor-tree", this.dom.tdCheckbox.appendChild(this.dom.checkbox), this.dom.tdValue.parentNode.insertBefore(this.dom.tdCheckbox, this.dom.tdValue)), this.dom.checkbox.checked = this.value) : this.dom.tdCheckbox && (this.dom.tdCheckbox.parentNode.removeChild(this.dom.tdCheckbox), delete this.dom.tdCheckbox, delete this.dom.checkbox), this.enum && this.editable.value) {
                                if (!this.dom.select) {
                                    this.dom.select = document.createElement("select"), this.id = this.field + "_" + (new Date).getUTCMilliseconds(), this.dom.select.id = this.id, this.dom.select.name = this.dom.select.id;
                                    var o = document.createElement("option");
                                    o.value = "", o.textContent = "--", this.dom.select.appendChild(o);
                                    for (var s = 0; s < this.enum.length; s++) {
                                        var a = document.createElement("option");
                                        a.value = this.enum[s], a.textContent = this.enum[s], this.dom.select.appendChild(a)
                                    }
                                    this.dom.tdSelect = document.createElement("td"), this.dom.tdSelect.className = "jsoneditor-tree", this.dom.tdSelect.appendChild(this.dom.select), this.dom.tdValue.parentNode.insertBefore(this.dom.tdSelect, this.dom.tdValue)
                                }
                                this.dom.select.value = -1 !== this.enum.indexOf(this.value) ? this.value : "", !this.schema || A(this.schema, "oneOf") || A(this.schema, "anyOf") || A(this.schema, "allOf") ? delete this.valueFieldHTML : (this.valueFieldHTML = this.dom.tdValue.innerHTML, this.dom.tdValue.style.visibility = "hidden", this.dom.tdValue.textContent = "")
                            } else this.dom.tdSelect && (this.dom.tdSelect.parentNode.removeChild(this.dom.tdSelect), delete this.dom.tdSelect, delete this.dom.select, this.dom.tdValue.innerHTML = this.valueFieldHTML, this.dom.tdValue.style.visibility = "", delete this.valueFieldHTML);
                            if (this.editable.value && this.editor.options.colorPicker && "string" == typeof i && (0, T.isValidColor)(i) ? (this.dom.color || (this.dom.color = document.createElement("div"), this.dom.color.className = "jsoneditor-color", this.dom.tdColor = document.createElement("td"), this.dom.tdColor.className = "jsoneditor-tree", this.dom.tdColor.appendChild(this.dom.color), this.dom.tdValue.parentNode.insertBefore(this.dom.tdColor, this.dom.tdValue)), (0, T.addClassName)(this.dom.value, "jsoneditor-color-value"), this.dom.color.style.backgroundColor = i) : this._deleteDomColor(), this._showTimestampTag()) {
                                this.dom.date || (this.dom.date = document.createElement("div"), this.dom.date.className = "jsoneditor-date", this.dom.value.parentNode.appendChild(this.dom.date));
                                o = null;
                                if (o = "function" == typeof this.editor.options.timestampFormat ? this.editor.options.timestampFormat({
                                    field: this.field,
                                    value: this.value,
                                    path: this.getPath()
                                }) : o) {
                                    for (; this.dom.date.firstChild;) this.dom.date.removeChild(this.dom.date.firstChild);
                                    this.dom.date.appendChild(document.createTextNode(o))
                                } else this.dom.date.textContent = new Date(i).toISOString();
                                this.dom.date.title = new Date(i).toString()
                            } else this.dom.date && (this.dom.date.parentNode.removeChild(this.dom.date), delete this.dom.date);
                            (0, T.stripFormatting)(e), this._updateDomDefault()
                        }
                    }
                }, {
                    key: "_deleteDomColor", value: function () {
                        this.dom.color && (this.dom.tdColor.parentNode.removeChild(this.dom.tdColor), delete this.dom.tdColor, delete this.dom.color, (0, T.removeClassName)(this.dom.value, "jsoneditor-color-value"))
                    }
                }, {
                    key: "_updateDomField", value: function () {
                        var e, t = this.dom.field;
                        t && ((e = (0, T.makeFieldTooltip)(this.schema, this.editor.options.language)) && (t.title = e), ("" === String(this.field) && this.parent && "array" !== this.parent.type ? (0, T.addClassName) : (0, T.removeClassName))(t, "jsoneditor-empty"), (this.searchFieldActive ? (0, T.addClassName) : (0, T.removeClassName))(t, "jsoneditor-highlight-active"), (this.searchField ? (0, T.addClassName) : (0, T.removeClassName))(t, "jsoneditor-highlight"), (0, T.stripFormatting)(t))
                    }
                }, {
                    key: "_getDomField", value: function (e) {
                        if (this._clearFieldError(), this.dom.field && this.fieldEditable && (this.fieldInnerText = (0, T.getInnerText)(this.dom.field), "" === this.fieldInnerText && "" !== this.dom.field.innerHTML && (this.dom.field.textContent = "")), void 0 !== this.fieldInnerText) try {
                            var t = this._unescapeHTML(this.fieldInnerText), i = this.parent.getFieldNames(this);
                            -1 !== i.indexOf(t) ? e ? (t = (0, T.findUniqueName)(t, i)) !== this.field && (this.field = t, this._debouncedOnChangeField()) : this._setFieldError((0, l.Iu)("duplicateFieldError")) : t !== this.field && (this.field = t, this._debouncedOnChangeField())
                        } catch (e) {
                            this._setFieldError((0, l.Iu)("cannotParseFieldError"))
                        }
                    }
                }, {
                    key: "_updateDomDefault", value: function () {
                        var e;
                        !this.schema || void 0 === this.schema.default || this._hasChilds() || (e = this.dom.select || this.dom.value) && (this.value === this.schema.default ? (e.title = (0, l.Iu)("default"), (0, T.addClassName)(e, "jsoneditor-is-default"), (0, T.removeClassName)(e, "jsoneditor-is-not-default")) : (e.removeAttribute("title"), (0, T.removeClassName)(e, "jsoneditor-is-default"), (0, T.addClassName)(e, "jsoneditor-is-not-default")))
                    }
                }, {
                    key: "_showTimestampTag", value: function () {
                        if ("number" != typeof this.value) return !1;
                        var e = this.editor.options.timestampTag;
                        if ("function" != typeof e) return !0 === e && (0, T.isTimestamp)(this.field, this.value);
                        e = e({field: this.field, value: this.value, path: this.getPath()});
                        return "boolean" == typeof e ? e : (0, T.isTimestamp)(this.field, this.value)
                    }
                }, {
                    key: "clearDom", value: function () {
                        this.dom = {}
                    }
                }, {
                    key: "getDom", value: function () {
                        var e, t = this.dom;
                        if (t.tr) return t.tr;
                        this._updateEditability(), t.tr = document.createElement("tr"), "tree" === (t.tr.node = this).editor.options.mode && (e = document.createElement("td"), this.editable.field && this.parent && ((i = document.createElement("button")).type = "button", (t.drag = i).className = "jsoneditor-button jsoneditor-dragarea", i.title = (0, l.Iu)("drag"), e.appendChild(i)), t.tr.appendChild(e), i = document.createElement("td"), (e = document.createElement("button")).type = "button", (t.menu = e).className = "jsoneditor-button jsoneditor-contextmenu-button", e.title = (0, l.Iu)("actionsMenu"), i.appendChild(t.menu), t.tr.appendChild(i));
                        var i = document.createElement("td");
                        return t.tr.appendChild(i), t.tree = this._createDomTree(), i.appendChild(t.tree), this.updateDom({updateIndexes: !0}), t.tr
                    }
                }, {
                    key: "isVisible", value: function () {
                        return this.dom && this.dom.tr && this.dom.tr.parentNode || !1
                    }
                }, {
                    key: "isDescendantOf", value: function (e) {
                        for (var t = this.parent; t;) {
                            if (t === e) return !0;
                            t = t.parent
                        }
                        return !1
                    }
                }, {
                    key: "_createDomField", value: function () {
                        return document.createElement("div")
                    }
                }, {
                    key: "setHighlight", value: function (t) {
                        this.dom.tr && ((t ? (0, T.addClassName) : (0, T.removeClassName))(this.dom.tr, "jsoneditor-highlight"), this.append && this.append.setHighlight(t), this.childs && this.childs.forEach(function (e) {
                            e.setHighlight(t)
                        }))
                    }
                }, {
                    key: "setSelected", value: function (t, e) {
                        this.selected = t, this.dom.tr && ((t ? (0, T.addClassName) : (0, T.removeClassName))(this.dom.tr, "jsoneditor-selected"), (e ? (0, T.addClassName) : (0, T.removeClassName))(this.dom.tr, "jsoneditor-first"), this.append && this.append.setSelected(t), this.showMore && this.showMore.setSelected(t), this.childs && this.childs.forEach(function (e) {
                            e.setSelected(t)
                        }))
                    }
                }, {
                    key: "updateValue", value: function (e) {
                        this.value = e, this.previousValue = e, this.valueError = void 0, this.updateDom()
                    }
                }, {
                    key: "updateField", value: function (e) {
                        this.field = e, this.previousField = e, this.fieldError = void 0, this.updateDom()
                    }
                }, {
                    key: "updateDom", value: function (t) {
                        var e = this.dom.tree;
                        e && (e.style.marginLeft = 24 * this.getLevel() + "px");
                        e = this.dom.field;
                        e && (this.fieldEditable ? (e.contentEditable = this.editable.field, e.spellcheck = !1, e.className = "jsoneditor-field") : (e.contentEditable = !1, e.className = "jsoneditor-readonly"), i = void 0 !== this.index ? this.index : void 0 !== this.field ? this.field : (i = this.editor.options.schema ? R._findSchema(this.editor.options.schema, this.editor.options.schemaRefs || {}, this.getPath()) : void 0) && i.title ? i.title : this._hasChilds() ? this.type : "", i = this._escapeHTML(i), document.activeElement !== e && i !== this._unescapeHTML((0, T.getInnerText)(e)) && (e.innerHTML = i), this._updateSchema());
                        var i = this.dom.value;
                        i && ("array" === this.type || "object" === this.type ? this.updateNodeName() : (n = this._escapeHTML(this.value), document.activeElement !== i && n !== this._unescapeHTML((0, T.getInnerText)(i)) && (i.innerHTML = n)));
                        var n = this.dom.tr;
                        n && ("array" === this.type || "object" === this.type ? ((0, T.addClassName)(n, "jsoneditor-expandable"), this.expanded ? ((0, T.addClassName)(n, "jsoneditor-expanded"), (0, T.removeClassName)(n, "jsoneditor-collapsed")) : ((0, T.addClassName)(n, "jsoneditor-collapsed"), (0, T.removeClassName)(n, "jsoneditor-expanded"))) : ((0, T.removeClassName)(n, "jsoneditor-expandable"), (0, T.removeClassName)(n, "jsoneditor-expanded"), (0, T.removeClassName)(n, "jsoneditor-collapsed"))), this._updateDomField(), this._updateDomValue(), t && !0 === t.updateIndexes && this._updateDomIndexes(), t && !0 === t.recurse && this.childs && this.childs.forEach(function (e) {
                            e.updateDom(t)
                        }), this.error && this.updateError(), this.append && this.append.updateDom(), this.showMore && this.showMore.updateDom(), this._updateCssClassName()
                    }
                }, {
                    key: "_updateSchema", value: function () {
                        this.editor && this.editor.options && (this.schema = this.editor.options.schema ? R._findSchema(this.editor.options.schema, this.editor.options.schemaRefs || {}, this.getPath()) : null, this.schema ? this.enum = R._findEnum(this.schema) : delete this.enum)
                    }
                }, {
                    key: "_updateDomIndexes", value: function () {
                        var e = this.dom.value, t = this.childs;
                        e && t && ("array" === this.type ? t.forEach(function (e, t) {
                            e.index = t;
                            e = e.dom.field;
                            e && (e.textContent = t)
                        }) : "object" === this.type && t.forEach(function (e) {
                            void 0 !== e.index && (delete e.index, void 0 === e.field && (e.field = ""))
                        }))
                    }
                }, {
                    key: "_createDomValue", value: function () {
                        var e;
                        return "array" === this.type ? (e = document.createElement("div")).textContent = "[...]" : "object" === this.type ? (e = document.createElement("div")).textContent = "{...}" : (!this.editable.value && (0, T.isUrl)(this.value) ? (e = document.createElement("a")).href = this.value : ((e = document.createElement("div")).contentEditable = this.editable.value, e.spellcheck = !1), e.innerHTML = this._escapeHTML(this.value)), e
                    }
                }, {
                    key: "_createDomExpandButton", value: function () {
                        var e = document.createElement("button");
                        return e.type = "button", this._hasChilds() ? (e.className = this.expanded ? "jsoneditor-button jsoneditor-expanded" : "jsoneditor-button jsoneditor-collapsed", e.title = (0, l.Iu)("expandTitle")) : (e.className = "jsoneditor-button jsoneditor-invisible", e.title = ""), e
                    }
                }, {
                    key: "_createDomTree", value: function () {
                        var e = this.dom, t = document.createElement("table"), i = document.createElement("tbody");
                        t.style.borderCollapse = "collapse", t.className = "jsoneditor-values", t.appendChild(i);
                        var n = document.createElement("tr");
                        i.appendChild(n);
                        i = document.createElement("td");
                        i.className = "jsoneditor-tree", n.appendChild(i), e.expand = this._createDomExpandButton(), i.appendChild(e.expand), e.tdExpand = i;
                        i = document.createElement("td");
                        i.className = "jsoneditor-tree", n.appendChild(i), e.field = this._createDomField(), i.appendChild(e.field), e.tdField = i;
                        i = document.createElement("td");
                        i.className = "jsoneditor-tree", n.appendChild(i), "object" !== this.type && "array" !== this.type && (i.appendChild(document.createTextNode(":")), i.className = "jsoneditor-separator"), e.tdSeparator = i;
                        i = document.createElement("td");
                        return i.className = "jsoneditor-tree", n.appendChild(i), e.value = this._createDomValue(), i.appendChild(e.value), e.tdValue = i, t
                    }
                }, {
                    key: "onEvent", value: function (e) {
                        var t, i = e.type, n = e.target || e.srcElement, r = this.dom, o = this, s = this._hasChilds();
                        n !== r.drag && n !== r.menu || ("mouseover" === i ? this.editor.highlighter.highlight(this) : "mouseout" === i && this.editor.highlighter.unhighlight()), "click" === i && n === r.menu && ((t = o.editor.highlighter).highlight(o), t.lock(), (0, T.addClassName)(r.menu, "jsoneditor-selected"), this.showContextMenu(r.menu, function () {
                            (0, T.removeClassName)(r.menu, "jsoneditor-selected"), t.unlock(), t.unhighlight()
                        })), "click" === i && n === r.expand && s && (d = e.ctrlKey, this._onExpand(d)), "click" !== i || e.target !== o.dom.tdColor && e.target !== o.dom.color || this._showColorPicker(), "change" === i && n === r.checkbox && (this.dom.value.textContent = String(!this.value), this._getDomValue(), this._updateDomDefault()), "change" === i && n === r.select && (this.dom.value.innerHTML = this._escapeHTML(r.select.value), this._getDomValue(), this._updateDomValue());
                        var a = r.value;
                        if (n === a) switch (i) {
                            case"blur":
                            case"change":
                                this._getDomValue(), this._clearValueError(), this._updateDomValue();
                                var l = this._escapeHTML(this.value);
                                l !== this._unescapeHTML((0, T.getInnerText)(a)) && (a.innerHTML = l);
                                break;
                            case"input":
                                this._getDomValue(), this._updateDomValue();
                                break;
                            case"keydown":
                            case"mousedown":
                                this.editor.selection = this.editor.getDomSelection();
                                break;
                            case"click":
                                e.ctrlKey && this.editable.value && (0, T.isUrl)(this.value) && (e.preventDefault(), window.open(this.value, "_blank", "noreferrer"));
                                break;
                            case"keyup":
                                this._getDomValue(), this._updateDomValue();
                                break;
                            case"cut":
                            case"paste":
                                setTimeout(function () {
                                    o._getDomValue(), o._updateDomValue()
                                }, 1)
                        }
                        var c = r.field;
                        if (n === c) switch (i) {
                            case"blur":
                                this._getDomField(!0), this._updateDomField();
                                var h = this._escapeHTML(this.field);
                                h !== this._unescapeHTML((0, T.getInnerText)(c)) && (c.innerHTML = h);
                                break;
                            case"input":
                                this._getDomField(), this._updateSchema(), this._updateDomField(), this._updateDomValue();
                                break;
                            case"keydown":
                            case"mousedown":
                                this.editor.selection = this.editor.getDomSelection();
                                break;
                            case"keyup":
                                this._getDomField(), this._updateDomField();
                                break;
                            case"cut":
                            case"paste":
                                setTimeout(function () {
                                    o._getDomField(), o._updateDomField()
                                }, 1)
                        }
                        var d = r.tree;
                        d && n === d.parentNode && "click" === i && !e.hasMoved && ((void 0 !== e.offsetX ? e.offsetX < 24 * (this.getLevel() + 1) : e.pageX < (0, T.getAbsoluteLeft)(r.tdSeparator)) || s ? c && ((0, T.setEndOfContentEditable)(c), c.focus()) : a && !this.enum && ((0, T.setEndOfContentEditable)(a), a.focus())), (n !== r.tdExpand || s) && n !== r.tdField && n !== r.tdSeparator || "click" !== i || e.hasMoved || c && ((0, T.setEndOfContentEditable)(c), c.focus()), "keydown" === i && this.onKeyDown(e), "function" == typeof this.editor.options.onEvent && this._onEvent(e)
                    }
                }, {
                    key: "_onEvent", value: function (e) {
                        var t = e.target, i = t === this.dom.field,
                            t = t === this.dom.value || t === this.dom.checkbox || t === this.dom.select;
                        (i || t) && (i = {
                            field: this.getField(),
                            path: this.getPath()
                        }, t && !this._hasChilds() && (i.value = this.getValue()), this.editor.options.onEvent(i, e))
                    }
                }, {
                    key: "onKeyDown", value: function (e) {
                        var t, i, n, r, o, s, a, l, c, h, d, u, g, p, m, f, C, I = e.which || e.keyCode,
                            v = e.target || e.srcElement, A = e.ctrlKey, b = e.shiftKey, y = e.altKey, w = !1,
                            S = "tree" === this.editor.options.mode,
                            x = 0 < this.editor.multiselection.nodes.length ? this.editor.multiselection.nodes : [this],
                            k = x[0], E = x[x.length - 1];
                        13 === I ? v === this.dom.value ? this.editable.value && !e.ctrlKey || (0, T.isUrl)(this.value) && (window.open(this.value, "_blank", "noreferrer"), w = !0) : v === this.dom.expand && this._hasChilds() && (d = e.ctrlKey, this._onExpand(d), v.focus(), w = !0) : 68 === I ? A && S && (R.onDuplicate(x), w = !0) : 69 === I ? A && (this._onExpand(b), v.focus(), w = !0) : 77 === I && S ? A && (this.showContextMenu(v), w = !0) : 46 === I && S ? A && (R.onRemove(x), w = !0) : 45 === I && S ? A && !b ? (this._onInsertBefore(), w = !0) : A && b && (this._onInsertAfter(), w = !0) : 35 === I ? y && ((d = this._lastNode()) && d.focus(R.focusElement || this._getElementName(v)), w = !0) : 36 === I ? y && ((u = this._firstNode()) && u.focus(R.focusElement || this._getElementName(v)), w = !0) : 37 === I ? y && !b ? ((u = this._previousElement(v)) && this.focus(this._getElementName(u)), w = !0) : y && b && S && (p = E.expanded ? (p = E.getAppendDom()) ? p.nextSibling : void 0 : E.getDom().nextSibling) && (g = R.getNodeFromTarget(p), p = p.nextSibling, m = R.getNodeFromTarget(p), g && g instanceof L && 1 !== E.parent.childs.length && m && m.parent && (i = this.editor.getDomSelection(), n = (r = k.parent).childs[E.getIndex() + 1] || r.append, o = k.getIndex(), s = m.getIndex(), a = r.getInternalPath(), l = m.parent.getInternalPath(), x.forEach(function (e) {
                            m.parent.moveBefore(e, m)
                        }), this.focus(R.focusElement || this._getElementName(v)), this.editor._onAction("moveNodes", {
                            count: x.length,
                            fieldNames: x.map($),
                            oldParentPath: r.getInternalPath(),
                            newParentPath: k.parent.getInternalPath(),
                            oldIndex: n.getIndex(),
                            newIndex: k.getIndex(),
                            oldIndexRedo: o,
                            newIndexRedo: s,
                            oldParentPathRedo: a,
                            newParentPathRedo: l,
                            oldSelection: i,
                            newSelection: this.editor.getDomSelection()
                        }))) : 38 === I ? y && !b ? ((t = this._previousNode()) && (this.editor.deselect(!0), t.focus(R.focusElement || this._getElementName(v))), w = !0) : !y && A && b && S ? ((t = this._previousNode()) && ((h = this.editor.multiselection).start = h.start || this, h.end = t, c = this.editor._findTopLevelNodes(h.start, h.end), this.editor.select(c), t.focus("field")), w = !0) : y && b && S && ((t = k._previousNode()) && t.parent && (i = this.editor.getDomSelection(), n = (r = k.parent).childs[E.getIndex() + 1] || r.append, o = k.getIndex(), s = t.getIndex(), a = r.getInternalPath(), l = t.parent.getInternalPath(), x.forEach(function (e) {
                            t.parent.moveBefore(e, t)
                        }), this.focus(R.focusElement || this._getElementName(v)), this.editor._onAction("moveNodes", {
                            count: x.length,
                            fieldNames: x.map($),
                            oldParentPath: r.getInternalPath(),
                            newParentPath: k.parent.getInternalPath(),
                            oldIndex: n.getIndex(),
                            newIndex: k.getIndex(),
                            oldIndexRedo: o,
                            newIndexRedo: s,
                            oldParentPathRedo: a,
                            newParentPathRedo: l,
                            oldSelection: i,
                            newSelection: this.editor.getDomSelection()
                        })), w = !0) : 39 === I ? y && !b ? ((f = this._nextElement(v)) && this.focus(this._getElementName(f)), w = !0) : y && b && S && ((f = k.getDom().previousSibling) && (t = R.getNodeFromTarget(f)) && t.parent && !t.isVisible() && (i = this.editor.getDomSelection(), n = (r = k.parent).childs[E.getIndex() + 1] || r.append, o = k.getIndex(), s = t.getIndex(), a = r.getInternalPath(), l = t.parent.getInternalPath(), x.forEach(function (e) {
                            t.parent.moveBefore(e, t)
                        }), this.focus(R.focusElement || this._getElementName(v)), this.editor._onAction("moveNodes", {
                            count: x.length,
                            fieldNames: x.map($),
                            oldParentPath: r.getInternalPath(),
                            newParentPath: k.parent.getInternalPath(),
                            oldIndex: n.getIndex(),
                            newIndex: k.getIndex(),
                            oldIndexRedo: o,
                            newIndexRedo: s,
                            oldParentPathRedo: a,
                            newParentPathRedo: l,
                            oldSelection: i,
                            newSelection: this.editor.getDomSelection()
                        }))) : 40 === I && (y && !b ? ((g = this._nextNode()) && (this.editor.deselect(!0), g.focus(R.focusElement || this._getElementName(v))), w = !0) : !y && A && b && S ? ((g = this._nextNode()) && ((h = this.editor.multiselection).start = h.start || this, h.end = g, c = this.editor._findTopLevelNodes(h.start, h.end), this.editor.select(c), g.focus("field")), w = !0) : y && b && S && ((C = (g = (g = (g = E.expanded ? E.append ? E.append._nextNode() : void 0 : E._nextNode()) && !g.isVisible() ? g.parent.showMore : g) && g instanceof L ? E : g) && (g._nextNode() || g.parent.append)) && C.parent && (i = this.editor.getDomSelection(), n = (r = k.parent).childs[E.getIndex() + 1] || r.append, o = k.getIndex(), s = C.getIndex(), a = r.getInternalPath(), l = C.parent.getInternalPath(), x.forEach(function (e) {
                            C.parent.moveBefore(e, C)
                        }), this.focus(R.focusElement || this._getElementName(v)), this.editor._onAction("moveNodes", {
                            count: x.length,
                            fieldNames: x.map($),
                            oldParentPath: r.getInternalPath(),
                            newParentPath: k.parent.getInternalPath(),
                            oldParentPathRedo: a,
                            newParentPathRedo: l,
                            oldIndexRedo: o,
                            newIndexRedo: s,
                            oldIndex: n.getIndex(),
                            newIndex: k.getIndex(),
                            oldSelection: i,
                            newSelection: this.editor.getDomSelection()
                        })), w = !0)), w && (e.preventDefault(), e.stopPropagation())
                    }
                }, {
                    key: "_onExpand", value: function (e) {
                        var t, i, n;
                        e && (n = (i = (t = this.dom.tr.parentNode).parentNode).scrollTop, i.removeChild(t)), this.expanded ? this.collapse(e) : this.expand(e), e && (i.appendChild(t), i.scrollTop = n)
                    }
                }, {
                    key: "_showColorPicker", value: function () {
                        var t, e;
                        "function" == typeof this.editor.options.onColorPicker && this.dom.color && ((t = this)._deleteDomColor(), t.updateDom(), e = (0, d.w)(this.dom.color, this.editor.getPopupAnchor()), this.editor.options.onColorPicker(e, this.value, function (e) {
                            "string" == typeof e && e !== t.value && (t._deleteDomColor(), t.value = e, t.updateDom(), t._debouncedOnChangeValue())
                        }))
                    }
                }, {
                    key: "getFieldNames", value: function (t) {
                        return "object" === this.type ? this.childs.filter(function (e) {
                            return e !== t
                        }).map(function (e) {
                            return e.field
                        }) : []
                    }
                }, {
                    key: "_onInsertBefore", value: function (e, t, i) {
                        var n = this.editor.getDomSelection(), e = new R(this.editor, {
                            field: void 0 !== e ? e : "",
                            value: void 0 !== t ? t : "",
                            type: i
                        });
                        e.expand(!0);
                        t = this.getInternalPath();
                        this.parent.insertBefore(e, this), this.editor.highlighter.unhighlight(), e.focus("field");
                        i = this.editor.getDomSelection();
                        this.editor._onAction("insertBeforeNodes", {
                            nodes: [e],
                            paths: [e.getInternalPath()],
                            beforePath: t,
                            parentPath: this.parent.getInternalPath(),
                            oldSelection: n,
                            newSelection: i
                        })
                    }
                }, {
                    key: "_onInsertAfter", value: function (e, t, i) {
                        var n = this.editor.getDomSelection(), t = new R(this.editor, {
                            field: void 0 !== e ? e : "",
                            value: void 0 !== t ? t : "",
                            type: i
                        });
                        t.expand(!0), this.parent.insertAfter(t, this), this.editor.highlighter.unhighlight(), t.focus("field");
                        i = this.editor.getDomSelection();
                        this.editor._onAction("insertAfterNodes", {
                            nodes: [t],
                            paths: [t.getInternalPath()],
                            afterPath: this.getInternalPath(),
                            parentPath: this.parent.getInternalPath(),
                            oldSelection: n,
                            newSelection: i
                        })
                    }
                }, {
                    key: "_onAppend", value: function (e, t, i) {
                        var n = this.editor.getDomSelection(), t = new R(this.editor, {
                            field: void 0 !== e ? e : "",
                            value: void 0 !== t ? t : "",
                            type: i
                        });
                        t.expand(!0), this.parent.appendChild(t), this.editor.highlighter.unhighlight(), t.focus("field");
                        i = this.editor.getDomSelection();
                        this.editor._onAction("appendNodes", {
                            nodes: [t],
                            paths: [t.getInternalPath()],
                            parentPath: this.parent.getInternalPath(),
                            oldSelection: n,
                            newSelection: i
                        })
                    }
                }, {
                    key: "_onChangeType", value: function (e) {
                        var t, i, n = this.type;
                        e !== n && (t = this.editor.getDomSelection(), this.changeType(e), i = this.editor.getDomSelection(), this.editor._onAction("changeType", {
                            path: this.getInternalPath(),
                            oldType: n,
                            newType: e,
                            oldSelection: t,
                            newSelection: i
                        }))
                    }
                }, {
                    key: "sort", value: function (i, e) {
                        var t, n, r = !(2 < arguments.length && void 0 !== arguments[2]) || arguments[2];
                        "string" == typeof i && (i = (0, T.parsePath)(i)), this._hasChilds() && (this.hideChilds(), t = this.childs, this.childs = this.childs.concat(), n = "desc" === e ? -1 : 1, "object" === this.type ? this.childs.sort(function (e, t) {
                            return n * h()(e.field, t.field)
                        }) : this.childs.sort(function (e, t) {
                            e = e.getNestedChild(i), t = t.getNestedChild(i);
                            if (!e) return n;
                            if (!t) return -n;
                            e = e.value, t = t.value;
                            return "string" != typeof e && "string" != typeof t ? t < e ? n : e < t ? -n : 0 : n * h()(e, t)
                        }), this._updateDomIndexes(), this.showChilds(), !0 === r && this.editor._onAction("sort", {
                            path: this.getInternalPath(),
                            oldChilds: t,
                            newChilds: this.childs
                        }))
                    }
                }, {
                    key: "update", value: function (e) {
                        var t = this.getInternalValue();
                        this.setValue(e), this.editor._onAction("transform", {
                            path: this.getInternalPath(),
                            oldValue: t,
                            newValue: this.getInternalValue()
                        })
                    }
                }, {
                    key: "_detachFromDom", value: function () {
                        var e = this.dom.tr ? this.dom.tr.parentNode : void 0,
                            t = this.expanded ? this.getAppendDom() : this.getDom(),
                            t = t && t.parentNode ? t.nextSibling : void 0;
                        return this.hide({resetVisibleChilds: !1}), {table: e, nextTr: t}
                    }
                }, {
                    key: "_attachToDom", value: function (e) {
                        e.table && (e.nextTr ? e.table.insertBefore(this.getDom(), e.nextTr) : e.table.appendChild(this.getDom())), this.expanded && this.showChilds()
                    }
                }, {
                    key: "transform", value: function (e) {
                        if (this._hasChilds()) {
                            this.hideChilds();
                            try {
                                var t = this.getInternalValue(), i = this.getValue(),
                                    n = this.editor.options.executeQuery(i, e);
                                this.setValue(n);
                                var r = this.getInternalValue();
                                this.editor._onAction("transform", {
                                    path: this.getInternalPath(),
                                    oldValue: t,
                                    newValue: r
                                }), this.showChilds()
                            } catch (e) {
                                this.showChilds(), this.editor._onError(e)
                            }
                        }
                    }
                }, {
                    key: "extract", value: function () {
                        this.editor.node.hideChilds(), this.hideChilds();
                        try {
                            var e = this.editor.node.getInternalValue();
                            this.editor._setRoot(this);
                            var t = this.editor.node.getInternalValue();
                            this.editor._onAction("transform", {
                                path: this.editor.node.getInternalPath(),
                                oldValue: e,
                                newValue: t
                            })
                        } catch (e) {
                            this.editor._onError(e)
                        } finally {
                            this.updateDom({recurse: !0}), this.showChilds()
                        }
                    }
                }, {
                    key: "getNestedChild", value: function (e) {
                        for (var t = 0, i = this; i && t < e.length;) i = i.findChildByProperty(e[t]), t++;
                        return i
                    }
                }, {
                    key: "findChildByProperty", value: function (t) {
                        if ("object" === this.type) return this.childs.find(function (e) {
                            return e.field === t
                        })
                    }
                }, {
                    key: "getAppendDom", value: function () {
                        return this.append || (this.append = new L(this.editor), this.append.setParent(this)), this.append.getDom()
                    }
                }, {
                    key: "getShowMoreDom", value: function () {
                        return this.showMore || (this.showMore = new y(this.editor, this)), this.showMore.getDom()
                    }
                }, {
                    key: "nextSibling", value: function () {
                        var e = this.parent.childs.indexOf(this);
                        return this.parent.childs[e + 1] || this.parent.append
                    }
                }, {
                    key: "_previousNode", value: function () {
                        var e = null, t = this.getDom();
                        if (t && t.parentNode) for (var i = t; i = i.previousSibling, e = R.getNodeFromTarget(i), i && e && e instanceof L && !e.isVisible();) ;
                        return e
                    }
                }, {
                    key: "_nextNode", value: function () {
                        var e = null, t = this.getDom();
                        if (t && t.parentNode) for (var i = t; i = i.nextSibling, e = R.getNodeFromTarget(i), i && e && e instanceof L && !e.isVisible();) ;
                        return e
                    }
                }, {
                    key: "_firstNode", value: function () {
                        var e = null, t = this.getDom();
                        return t && t.parentNode && (t = t.parentNode.firstChild, e = R.getNodeFromTarget(t)), e
                    }
                }, {
                    key: "_lastNode", value: function () {
                        var e = null, t = this.getDom();
                        if (t && t.parentNode) for (var i = t.parentNode.lastChild, e = R.getNodeFromTarget(i); i && e && !e.isVisible();) i = i.previousSibling, e = R.getNodeFromTarget(i);
                        return e
                    }
                }, {
                    key: "_previousElement", value: function (e) {
                        var t = this.dom;
                        switch (e) {
                            case t.value:
                                if (this.fieldEditable) return t.field;
                            case t.field:
                                if (this._hasChilds()) return t.expand;
                            case t.expand:
                                return t.menu;
                            case t.menu:
                                if (t.drag) return t.drag;
                            default:
                                return null
                        }
                    }
                }, {
                    key: "_nextElement", value: function (e) {
                        var t = this.dom;
                        switch (e) {
                            case t.drag:
                                return t.menu;
                            case t.menu:
                                if (this._hasChilds()) return t.expand;
                            case t.expand:
                                if (this.fieldEditable) return t.field;
                            case t.field:
                                if (!this._hasChilds()) return t.value;
                            default:
                                return null
                        }
                    }
                }, {
                    key: "_getElementName", value: function (t) {
                        var i = this;
                        return Object.keys(this.dom).find(function (e) {
                            return i.dom[e] === t
                        })
                    }
                }, {
                    key: "_hasChilds", value: function () {
                        return "array" === this.type || "object" === this.type
                    }
                }, {
                    key: "addTemplates", value: function (t, i) {
                        var n = this, e = n.editor.options.templates;
                        null != e && (e.length && t.push({type: "separator"}), e.forEach(function (e) {
                            t.push({
                                text: e.text,
                                className: e.className || "jsoneditor-type-object",
                                title: e.title,
                                click: (i ? function (e, t) {
                                    n._onAppend(e, t)
                                } : function (e, t) {
                                    n._onInsertBefore(e, t)
                                }).bind(this, e.field, e.value)
                            })
                        }))
                    }
                }, {
                    key: "showContextMenu", value: function (e, t) {
                        var i, n, r = this, o = [];
                        this.editable.value && o.push({
                            text: (0, l.Iu)("type"),
                            title: (0, l.Iu)("typeTitle"),
                            className: "jsoneditor-type-" + this.type,
                            submenu: [{
                                text: (0, l.Iu)("auto"),
                                className: "jsoneditor-type-auto" + ("auto" === this.type ? " jsoneditor-selected" : ""),
                                title: (0, l.Iu)("autoType"),
                                click: function () {
                                    r._onChangeType("auto")
                                }
                            }, {
                                text: (0, l.Iu)("array"),
                                className: "jsoneditor-type-array" + ("array" === this.type ? " jsoneditor-selected" : ""),
                                title: (0, l.Iu)("arrayType"),
                                click: function () {
                                    r._onChangeType("array")
                                }
                            }, {
                                text: (0, l.Iu)("object"),
                                className: "jsoneditor-type-object" + ("object" === this.type ? " jsoneditor-selected" : ""),
                                title: (0, l.Iu)("objectType"),
                                click: function () {
                                    r._onChangeType("object")
                                }
                            }, {
                                text: (0, l.Iu)("string"),
                                className: "jsoneditor-type-string" + ("string" === this.type ? " jsoneditor-selected" : ""),
                                title: (0, l.Iu)("stringType"),
                                click: function () {
                                    r._onChangeType("string")
                                }
                            }]
                        }), this._hasChilds() && (this.editor.options.enableSort && o.push({
                            text: (0, l.Iu)("sort"),
                            title: (0, l.Iu)("sortTitle", {type: this.type}),
                            className: "jsoneditor-sort-asc",
                            click: function () {
                                r.showSortModal()
                            }
                        }), this.editor.options.enableTransform && o.push({
                            text: (0, l.Iu)("transform"),
                            title: (0, l.Iu)("transformTitle", {type: this.type}),
                            className: "jsoneditor-transform",
                            click: function () {
                                r.showTransformModal()
                            }
                        }), this.parent && o.push({
                            text: (0, l.Iu)("extract"),
                            title: (0, l.Iu)("extractTitle", {type: this.type}),
                            className: "jsoneditor-extract",
                            click: function () {
                                r.extract()
                            }
                        })), this.parent && this.parent._hasChilds() && (o.length && o.push({type: "separator"}), i = r.parent.childs, r === i[i.length - 1] && (n = [{
                            text: (0, l.Iu)("auto"),
                            className: "jsoneditor-type-auto",
                            title: (0, l.Iu)("autoType"),
                            click: function () {
                                r._onAppend("", "", "auto")
                            }
                        }, {
                            text: (0, l.Iu)("array"),
                            className: "jsoneditor-type-array",
                            title: (0, l.Iu)("arrayType"),
                            click: function () {
                                r._onAppend("", [])
                            }
                        }, {
                            text: (0, l.Iu)("object"),
                            className: "jsoneditor-type-object",
                            title: (0, l.Iu)("objectType"),
                            click: function () {
                                r._onAppend("", {})
                            }
                        }, {
                            text: (0, l.Iu)("string"),
                            className: "jsoneditor-type-string",
                            title: (0, l.Iu)("stringType"),
                            click: function () {
                                r._onAppend("", "", "string")
                            }
                        }], r.addTemplates(n, !0), o.push({
                            text: (0, l.Iu)("appendText"),
                            title: (0, l.Iu)("appendTitle"),
                            submenuTitle: (0, l.Iu)("appendSubmenuTitle"),
                            className: "jsoneditor-append",
                            click: function () {
                                r._onAppend("", "", "auto")
                            },
                            submenu: n
                        })), n = [{
                            text: (0, l.Iu)("auto"),
                            className: "jsoneditor-type-auto",
                            title: (0, l.Iu)("autoType"),
                            click: function () {
                                r._onInsertBefore("", "", "auto")
                            }
                        }, {
                            text: (0, l.Iu)("array"),
                            className: "jsoneditor-type-array",
                            title: (0, l.Iu)("arrayType"),
                            click: function () {
                                r._onInsertBefore("", [])
                            }
                        }, {
                            text: (0, l.Iu)("object"),
                            className: "jsoneditor-type-object",
                            title: (0, l.Iu)("objectType"),
                            click: function () {
                                r._onInsertBefore("", {})
                            }
                        }, {
                            text: (0, l.Iu)("string"),
                            className: "jsoneditor-type-string",
                            title: (0, l.Iu)("stringType"),
                            click: function () {
                                r._onInsertBefore("", "", "string")
                            }
                        }], r.addTemplates(n, !1), o.push({
                            text: (0, l.Iu)("insert"),
                            title: (0, l.Iu)("insertTitle"),
                            submenuTitle: (0, l.Iu)("insertSub"),
                            className: "jsoneditor-insert",
                            click: function () {
                                r._onInsertBefore("", "", "auto")
                            },
                            submenu: n
                        }), this.editable.field && (o.push({
                            text: (0, l.Iu)("duplicateText"),
                            title: (0, l.Iu)("duplicateField"),
                            className: "jsoneditor-duplicate",
                            click: function () {
                                R.onDuplicate(r)
                            }
                        }), o.push({
                            text: (0, l.Iu)("removeText"),
                            title: (0, l.Iu)("removeField"),
                            className: "jsoneditor-remove",
                            click: function () {
                                R.onRemove(r)
                            }
                        }))), this.editor.options.onCreateMenu && (n = r.getPath(), o = this.editor.options.onCreateMenu(o, {
                            type: "single",
                            path: n,
                            paths: [n]
                        })), new s.x(o, {close: t}).show(e, this.editor.getPopupAnchor())
                    }
                }, {
                    key: "showSortModal", value: function () {
                        var i = this, e = this.editor.options.modalAnchor || p.qD, t = this.getValue();
                        (0, u.showSortModal)(e, t, function (e) {
                            var t = e.path, t = (0, T.parsePath)(t);
                            i.sortedBy = e, i.sort(t, e.direction)
                        }, i.sortedBy)
                    }
                }, {
                    key: "showTransformModal", value: function () {
                        var t = this, e = this.editor.options, i = e.modalAnchor, n = e.createQuery, r = e.executeQuery,
                            o = e.queryDescription, e = this.getValue();
                        (0, g.showTransformModal)({
                            container: i || p.qD,
                            json: e,
                            queryDescription: o,
                            createQuery: n,
                            executeQuery: r,
                            onTransform: function (e) {
                                t.transform(e)
                            }
                        })
                    }
                }, {
                    key: "_getType", value: function (e) {
                        return e instanceof Array ? "array" : e instanceof Object ? "object" : "string" == typeof e && "string" != typeof (0, T.parseString)(e) ? "string" : "auto"
                    }
                }, {
                    key: "_escapeHTML", value: function (e) {
                        if ("string" != typeof e) return String(e);
                        e = String(e).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/ {2}/g, " &nbsp;").replace(/^ /, "&nbsp;").replace(/ $/, "&nbsp;"), e = JSON.stringify(e), e = e.substring(1, e.length - 1);
                        return e = !0 === this.editor.options.escapeUnicode ? (0, T.escapeUnicodeChars)(e) : e
                    }
                }, {
                    key: "_unescapeHTML", value: function (e) {
                        e = '"' + this._escapeJSON(e) + '"';
                        return (0, T.parse)(e).replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&nbsp;|\u00A0/g, " ").replace(/&amp;/g, "&")
                    }
                }, {
                    key: "_escapeJSON", value: function (e) {
                        for (var t = "", i = 0; i < e.length;) {
                            var n = e.charAt(i);
                            "\n" === n ? t += "\\n" : "\\" === n ? (t += n, i++, "" !== (n = e.charAt(i)) && -1 !== '"\\/bfnrtu'.indexOf(n) || (t += "\\"), t += n) : t += '"' === n ? '\\"' : n, i++
                        }
                        return t
                    }
                }, {
                    key: "updateNodeName", value: function () {
                        var e, t = this.childs ? this.childs.length : 0;
                        if ("object" === this.type || "array" === this.type) {
                            if (this.editor.options.onNodeName) try {
                                e = this.editor.options.onNodeName({path: this.getPath(), size: t, type: this.type})
                            } catch (e) {
                                console.error("Error in onNodeName callback: ", e)
                            }
                            this.dom.value.textContent = "object" === this.type ? "{" + (e || t) + "}" : "[" + (e || t) + "]"
                        }
                    }
                }, {
                    key: "recursivelyUpdateNodeName", value: function () {
                        if (this.expanded && (this.updateNodeName(), "undefined" !== this.childs)) for (var e in this.childs) this.childs[e].recursivelyUpdateNodeName()
                    }
                }]) && C(e.prototype, t), i && C(e, i), R
            }();
            R.prototype.DEBOUNCE_INTERVAL = 150, R.prototype.MAX_SEARCH_RESULTS = 999;
            var I = 100;

            function v(e) {
                return e.getInternalPath()
            }

            function $(e) {
                return e.getField()
            }

            function A(e, t) {
                return Object.prototype.hasOwnProperty.call(e, t)
            }

            R.focusElement = void 0, R.select = function (e) {
                setTimeout(function () {
                    (0, T.selectContentEditable)(e)
                }, 0)
            }, R.onDragStart = function (t, e) {
                if (!Array.isArray(t)) return R.onDragStart([t], e);
                var i, n, r, o, s;
                0 !== t.length && (i = t[0], n = t[t.length - 1], r = i.parent, s = R.getNodeFromTarget(e.target), o = i.editor, s = (0, T.getAbsoluteTop)(s.dom.tr) - (0, T.getAbsoluteTop)(i.dom.tr), o.mousemove || (o.mousemove = (0, T.addEventListener)(e.view, "mousemove", function (e) {
                    R.onDrag(t, e)
                })), o.mouseup || (o.mouseup = (0, T.addEventListener)(e.view, "mouseup", function (e) {
                    R.onDragEnd(t, e)
                })), o.highlighter.lock(), o.drag = {
                    oldCursor: document.body.style.cursor,
                    oldSelection: o.getDomSelection(),
                    oldPaths: t.map(v),
                    oldParent: r,
                    oldNextNode: r.childs[n.getIndex() + 1] || r.append,
                    oldParentPathRedo: r.getInternalPath(),
                    oldIndexRedo: i.getIndex(),
                    mouseX: e.pageX,
                    offsetY: s,
                    level: i.getLevel()
                }, document.body.style.cursor = "move", e.preventDefault())
            }, R.onDrag = function (e, t) {
                if (!Array.isArray(e)) return R.onDrag([e], t);
                if (0 !== e.length) {
                    var i, n, r, o, s, a = e[0].editor, l = t.pageY - a.drag.offsetY, c = t.pageX, h = !1, d = e[0],
                        u = d.dom.tr, g = (0, T.getAbsoluteTop)(u), p = u.offsetHeight;
                    if (l < g) {
                        for (v = u; v = v.previousSibling, A = R.getNodeFromTarget(v), r = v ? (0, T.getAbsoluteTop)(v) : 0, v && l < r;) ;
                        (A = A && !A.parent ? void 0 : A) || (v = (m = u.parentNode.firstChild) ? m.nextSibling : void 0, (A = R.getNodeFromTarget(v)) === d && (A = void 0)), !(A = A && A.isVisible() && (r = (v = A.dom.tr) ? (0, T.getAbsoluteTop)(v) : 0) + p < l ? void 0 : A) || !1 !== a.options.limitDragging && A.parent !== e[0].parent || (e.forEach(function (e) {
                            A.parent.moveBefore(e, A)
                        }), h = !0)
                    } else {
                        var m, f = e[e.length - 1];
                        if (p = (m = f.expanded && f.append ? f.append.getDom() : f.dom.tr) ? m.nextSibling : void 0) {
                            for (o = (0, T.getAbsoluteTop)(p), i = p; n = R.getNodeFromTarget(i), i && (s = i.nextSibling ? (0, T.getAbsoluteTop)(i.nextSibling) : 0, s = i ? s - o : 0, n && n.parent.childs.length === e.length && n.parent.childs[e.length - 1] === f && (g += 27), i = i.nextSibling), i && g + s < l;) ;
                            if (n && n.parent) {
                                for (var p = c - a.drag.mouseX, p = Math.round(p / 24 / 2), C = a.drag.level + p, I = n.getLevel(), v = n.dom.tr && n.dom.tr.previousSibling; I < C && v;) {
                                    var A = R.getNodeFromTarget(v), b = e.some(function (e) {
                                        return e === A || A.isDescendantOf(e)
                                    });
                                    if (!b) {
                                        if (!(A instanceof L)) break;
                                        b = A.parent.childs;
                                        if (b.length === e.length && b[e.length - 1] === f) break;
                                        I = (n = R.getNodeFromTarget(v)).getLevel()
                                    }
                                    v = v.previousSibling
                                }
                                (n = n instanceof L && !n.isVisible() && n.parent.showMore.isVisible() ? n._nextNode() : n) && (!1 === a.options.limitDragging || n.parent === e[0].parent) && n.dom.tr && n.dom.tr !== m.nextSibling && (e.forEach(function (e) {
                                    n.parent.moveBefore(e, n)
                                }), h = !0)
                            }
                        }
                    }
                    h && (a.drag.mouseX = c, a.drag.level = d.getLevel()), a.startAutoScroll(l), t.preventDefault()
                }
            }, R.onDragEnd = function (e, t) {
                if (!Array.isArray(e)) return R.onDrag([e], t);
                var i, n, r, o, s, a, l, c, h;
                0 !== e.length && (h = e[0], i = h.editor, h && h.dom.menu && h.dom.menu.focus(), n = i.drag.oldParent.getInternalPath(), r = h.parent.getInternalPath(), o = i.drag.oldParent === h.parent, s = i.drag.oldNextNode.getIndex(), a = h.getIndex(), l = i.drag.oldParentPathRedo, c = i.drag.oldIndexRedo, h = o && c < a ? a + e.length : a, o && c === a || i._onAction("moveNodes", {
                    count: e.length,
                    fieldNames: e.map($),
                    oldParentPath: n,
                    newParentPath: r,
                    oldIndex: s,
                    newIndex: a,
                    oldIndexRedo: c,
                    newIndexRedo: h,
                    oldParentPathRedo: l,
                    newParentPathRedo: null,
                    oldSelection: i.drag.oldSelection,
                    newSelection: i.getDomSelection()
                }), document.body.style.cursor = i.drag.oldCursor, i.highlighter.unlock(), e.forEach(function (e) {
                    e.updateDom(), t.target !== e.dom.drag && t.target !== e.dom.menu && i.highlighter.unhighlight()
                }), delete i.drag, i.mousemove && ((0, T.removeEventListener)(t.view, "mousemove", i.mousemove), delete i.mousemove), i.mouseup && ((0, T.removeEventListener)(t.view, "mouseup", i.mouseup), delete i.mouseup), i.stopAutoScroll(), t.preventDefault())
            }, R._findEnum = function (e) {
                if (e.enum) return e.enum;
                e = e.oneOf || e.anyOf || e.allOf;
                if (e) {
                    e = e.filter(function (e) {
                        return e.enum
                    });
                    if (0 < e.length) return e[0].enum
                }
                return null
            }, R._findSchema = function (e, t, i) {
                for (var n = 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : e, r = i.slice(1, i.length), o = i[0], s = [n], a = 0, l = [n.oneOf, n.anyOf, n.allOf]; a < l.length; a++) {
                    var c = l[a];
                    Array.isArray(c) && (s = s.concat(c))
                }
                var h, d = E(s);
                try {
                    for (d.s(); !(h = d.n()).done;) {
                        if ("$ref" in (n = h.value) && "string" == typeof n.$ref) {
                            var u, g = n.$ref;
                            if (g in t) n = t[g]; else {
                                if (!g.startsWith("#/")) {
                                    if (1 !== (null === (u = g.match(/#\//g)) || void 0 === u ? void 0 : u.length)) throw Error("Unable to resolve reference ".concat(g));
                                    var p = k(g.split("#/"), 2), m = p[0], f = p[1];
                                    if (m in t) {
                                        var C = t[m], I = {$ref: "#/".concat(f)}, v = [];
                                        return v.push(o), 0 < r.length && v.push.apply(v, x(r)), R._findSchema(C, t, v, I)
                                    }
                                    throw Error("Unable to resolve reference ".concat(g))
                                }
                                var A, b = g.substring(2).split("/"), n = e, y = E(b);
                                try {
                                    for (y.s(); !(A = y.n()).done;) {
                                        var w = A.value;
                                        if (!(w in n)) throw Error("Unable to resovle reference ".concat(g));
                                        n = n[w]
                                    }
                                } catch (e) {
                                    y.e(e)
                                } finally {
                                    y.f()
                                }
                            }
                        }
                        if (void 0 === o) return n;
                        if ("string" != typeof o) {
                            if ("number" == typeof o && "object" === _(n.items) && null !== n.items) return n = n.items, R._findSchema(e, t, r, n)
                        } else {
                            if ("object" === _(n.properties) && null !== n.properties && o in n.properties) return n = n.properties[o], R._findSchema(e, t, r, n);
                            if ("object" === _(n.patternProperties) && null !== n.patternProperties) for (var S in n.patternProperties) if (o.match(S)) return n = n.patternProperties[S], R._findSchema(e, t, r, n);
                            if ("object" === _(n.additionalProperties)) return n = n.additionalProperties, R._findSchema(e, t, r, n)
                        }
                    }
                } catch (e) {
                    d.e(e)
                } finally {
                    d.f()
                }
                return null
            }, R.onRemove = function (e) {
                if (!Array.isArray(e)) return R.onRemove([e]);
                var t, i, n, r, o, s;
                e && 0 < e.length && (t = (s = e[0]).parent, i = s.editor, n = s.getIndex(), i.highlighter.unhighlight(), r = i.getDomSelection(), R.blurNodes(e), o = i.getDomSelection(), s = e.map(v), e.forEach(function (e) {
                    e.parent._remove(e)
                }), i._onAction("removeNodes", {
                    nodes: e,
                    paths: s,
                    parentPath: t.getInternalPath(),
                    index: n,
                    oldSelection: r,
                    newSelection: o
                }))
            }, R.onDuplicate = function (e) {
                if (!Array.isArray(e)) return R.onDuplicate([e]);
                var t, n, i, r, o, s, a;
                e && 0 < e.length && (t = e[e.length - 1], n = t.parent, (i = t.editor).deselect(i.multiselection.nodes), r = i.getDomSelection(), o = t, s = e.map(function (e) {
                    var t, i = e.clone();
                    return "object" === e.parent.type && (t = e.parent.getFieldNames(), i.field = (0, T.findUniqueName)(e.field, t)), n.insertAfter(i, o), o = i
                }), 1 === e.length ? "object" === s[0].parent.type ? (s[0].dom.field.innerHTML = e[0]._escapeHTML(e[0].field), s[0].focus("field")) : s[0].focus() : i.select(s), a = i.getDomSelection(), i._onAction("duplicateNodes", {
                    paths: e.map(v),
                    clonePaths: s.map(v),
                    afterPath: t.getInternalPath(),
                    parentPath: n.getInternalPath(),
                    oldSelection: r,
                    newSelection: a
                }))
            }, R.getNodeFromTarget = function (e) {
                for (; e;) {
                    if (e.node) return e.node;
                    e = e.parentNode
                }
            }, R.targetIsColorPicker = function (e) {
                var t = R.getNodeFromTarget(e);
                if (t) for (var i = e && e.parentNode; i;) {
                    if (i === t.dom.color) return !0;
                    i = i.parentNode
                }
                return !1
            }, R.blurNodes = function (e) {
                var t, i;
                Array.isArray(e) ? (t = (i = e[0]).parent, i = i.getIndex(), (t.childs[i + e.length] ? t.childs[i + e.length] : t.childs[i - 1] || t).focus()) : R.blurNodes([e])
            };
            var L = ((b.prototype = new R).getDom = function () {
                var e = this.dom;
                if (e.tr) return e.tr;
                this._updateEditability();
                var t = document.createElement("tr");
                t.className = "jsoneditor-append", t.node = this, e.tr = t, "tree" === this.editor.options.mode && (e.tdDrag = document.createElement("td"), n = document.createElement("td"), e.tdMenu = n, (i = document.createElement("button")).type = "button", i.className = "jsoneditor-button jsoneditor-contextmenu-button", i.title = "Click to open the actions menu (Ctrl+M)", e.menu = i, n.appendChild(e.menu));
                var i = document.createElement("td"), n = document.createElement("div");
                return n.appendChild(document.createTextNode("(" + (0, l.Iu)("empty") + ")")), n.className = "jsoneditor-readonly", i.appendChild(n), e.td = i, e.text = n, this.updateDom(), t
            }, b.prototype.getPath = function () {
                return null
            }, b.prototype.getIndex = function () {
                return null
            }, b.prototype.updateDom = function (e) {
                var t = this.dom, i = t.td;
                i && (i.style.paddingLeft = 24 * this.getLevel() + 26 + "px");
                var n = t.text;
                n && (n.firstChild.nodeValue = "(" + (0, l.Iu)("empty") + " " + this.parent.type + ")");
                n = t.tr;
                this.isVisible() ? t.tr.firstChild || (t.tdDrag && n.appendChild(t.tdDrag), t.tdMenu && n.appendChild(t.tdMenu), n.appendChild(i)) : t.tr.firstChild && (t.tdDrag && n.removeChild(t.tdDrag), t.tdMenu && n.removeChild(t.tdMenu), n.removeChild(i))
            }, b.prototype.isVisible = function () {
                return 0 === this.parent.childs.length
            }, b.prototype.showContextMenu = function (e, t) {
                var i = this, n = [{
                    text: (0, l.Iu)("auto"),
                    className: "jsoneditor-type-auto",
                    title: (0, l.Iu)("autoType"),
                    click: function () {
                        i._onAppend("", "", "auto")
                    }
                }, {
                    text: (0, l.Iu)("array"),
                    className: "jsoneditor-type-array",
                    title: (0, l.Iu)("arrayType"),
                    click: function () {
                        i._onAppend("", [])
                    }
                }, {
                    text: (0, l.Iu)("object"),
                    className: "jsoneditor-type-object",
                    title: (0, l.Iu)("objectType"),
                    click: function () {
                        i._onAppend("", {})
                    }
                }, {
                    text: (0, l.Iu)("string"),
                    className: "jsoneditor-type-string",
                    title: (0, l.Iu)("stringType"),
                    click: function () {
                        i._onAppend("", "", "string")
                    }
                }];
                i.addTemplates(n, !0);
                var r = [{
                    text: (0, l.Iu)("appendText"),
                    title: (0, l.Iu)("appendTitleAuto"),
                    submenuTitle: (0, l.Iu)("appendSubmenuTitle"),
                    className: "jsoneditor-insert",
                    click: function () {
                        i._onAppend("", "", "auto")
                    },
                    submenu: n
                }];
                this.editor.options.onCreateMenu && (n = i.parent.getPath(), r = this.editor.options.onCreateMenu(r, {
                    type: "append",
                    path: n,
                    paths: [n]
                })), new s.x(r, {close: t}).show(e, this.editor.getPopupAnchor())
            }, b.prototype.onEvent = function (e) {
                var t, i = e.type, n = e.target || e.srcElement, r = this.dom;
                n === r.menu && ("mouseover" === i ? this.editor.highlighter.highlight(this.parent) : "mouseout" === i && this.editor.highlighter.unhighlight()), "click" === i && n === r.menu && ((t = this.editor.highlighter).highlight(this.parent), t.lock(), (0, T.addClassName)(r.menu, "jsoneditor-selected"), this.showContextMenu(r.menu, function () {
                    (0, T.removeClassName)(r.menu, "jsoneditor-selected"), t.unlock(), t.unhighlight()
                })), "keydown" === i && this.onKeyDown(e)
            }, b);

            function b(e) {
                this.editor = e, this.dom = {}
            }

            var y = ((S.prototype = new R).getDom = function () {
                return this.dom.tr || (this._updateEditability(), this.dom.tr || (i = (t = this).parent, (r = document.createElement("a")).appendChild(document.createTextNode((0, l.Iu)("showMore"))), r.href = "#", r.onclick = function (e) {
                    return i.visibleChilds = Math.floor(i.visibleChilds / i.getMaxVisibleChilds() + 1) * i.getMaxVisibleChilds(), t.updateDom(), i.showChilds(), e.preventDefault(), !1
                }, (o = document.createElement("a")).appendChild(document.createTextNode((0, l.Iu)("showAll"))), o.href = "#", o.onclick = function (e) {
                    return i.visibleChilds = 1 / 0, t.updateDom(), i.showChilds(), e.preventDefault(), !1
                }, e = document.createElement("div"), n = document.createTextNode(this._getShowMoreText()), e.className = "jsoneditor-show-more", e.appendChild(n), e.appendChild(r), e.appendChild(document.createTextNode(". ")), e.appendChild(o), e.appendChild(document.createTextNode(". ")), (r = document.createElement("td")).appendChild(e), o = document.createElement("tr"), "tree" === this.editor.options.mode && (o.appendChild(document.createElement("td")), o.appendChild(document.createElement("td"))), o.appendChild(r), o.className = "jsoneditor-show-more", this.dom.tr = o, this.dom.moreContents = e, this.dom.moreText = n), this.updateDom(), this.dom.tr);
                var t, i, e, n, r, o
            }, S.prototype.updateDom = function (e) {
                var t;
                this.isVisible() ? (this.dom.tr.node = this.parent.childs[this.parent.visibleChilds], this.dom.tr.parentNode || (t = this.parent._getNextTr()) && t.parentNode.insertBefore(this.dom.tr, t), this.dom.moreText.nodeValue = this._getShowMoreText(), this.dom.moreContents.style.marginLeft = 24 * (this.getLevel() + 1) + "px") : this.dom.tr && this.dom.tr.parentNode && this.dom.tr.parentNode.removeChild(this.dom.tr)
            }, S.prototype._getShowMoreText = function () {
                return (0, l.Iu)("showMoreStatus", {
                    visibleChilds: this.parent.visibleChilds,
                    totalChilds: this.parent.childs.length
                }) + " "
            }, S.prototype.isVisible = function () {
                return this.parent.expanded && this.parent.childs.length > this.parent.visibleChilds
            }, S.prototype.onEvent = function (e) {
                "keydown" === e.type && this.onKeyDown(e)
            }, S);

            function S(e, t) {
                this.editor = e, this.parent = t, this.dom = {}
            }

            function B(e, t) {
                for (var i = 0; i < t.length; i++) {
                    var n = t[i];
                    n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n)
                }
            }

            var W = function () {
                function e(t) {
                    function o(e) {
                        return t.node.findNodeByInternalPath(e)
                    }

                    !function (e, t) {
                        if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function")
                    }(this, e), this.editor = t, this.history = [], this.index = -1, this.clear(), this.actions = {
                        editField: {
                            undo: function (e) {
                                o(e.parentPath).childs[e.index].updateField(e.oldValue)
                            }, redo: function (e) {
                                o(e.parentPath).childs[e.index].updateField(e.newValue)
                            }
                        }, editValue: {
                            undo: function (e) {
                                o(e.path).updateValue(e.oldValue)
                            }, redo: function (e) {
                                o(e.path).updateValue(e.newValue)
                            }
                        }, changeType: {
                            undo: function (e) {
                                o(e.path).changeType(e.oldType)
                            }, redo: function (e) {
                                o(e.path).changeType(e.newType)
                            }
                        }, appendNodes: {
                            undo: function (e) {
                                var t = o(e.parentPath);
                                e.paths.map(o).forEach(function (e) {
                                    t.removeChild(e)
                                })
                            }, redo: function (e) {
                                var t = o(e.parentPath);
                                e.nodes.forEach(function (e) {
                                    t.appendChild(e)
                                })
                            }
                        }, insertBeforeNodes: {
                            undo: function (e) {
                                var t = o(e.parentPath);
                                e.paths.map(o).forEach(function (e) {
                                    t.removeChild(e)
                                })
                            }, redo: function (e) {
                                var t = o(e.parentPath), i = o(e.beforePath);
                                e.nodes.forEach(function (e) {
                                    t.insertBefore(e, i)
                                })
                            }
                        }, insertAfterNodes: {
                            undo: function (e) {
                                var t = o(e.parentPath);
                                e.paths.map(o).forEach(function (e) {
                                    t.removeChild(e)
                                })
                            }, redo: function (e) {
                                var t = o(e.parentPath), i = o(e.afterPath);
                                e.nodes.forEach(function (e) {
                                    t.insertAfter(e, i), i = e
                                })
                            }
                        }, removeNodes: {
                            undo: function (e) {
                                var t = o(e.parentPath), i = t.childs[e.index] || t.append;
                                e.nodes.forEach(function (e) {
                                    t.insertBefore(e, i)
                                })
                            }, redo: function (e) {
                                var t = o(e.parentPath);
                                e.paths.map(o).forEach(function (e) {
                                    t.removeChild(e)
                                })
                            }
                        }, duplicateNodes: {
                            undo: function (e) {
                                var t = o(e.parentPath);
                                e.clonePaths.map(o).forEach(function (e) {
                                    t.removeChild(e)
                                })
                            }, redo: function (e) {
                                var n = o(e.parentPath), r = o(e.afterPath);
                                e.paths.map(o).forEach(function (e) {
                                    var t, i = e.clone();
                                    "object" === n.type && (t = n.getFieldNames(), i.field = (0, T.findUniqueName)(e.field, t)), n.insertAfter(i, r), r = i
                                })
                            }
                        }, moveNodes: {
                            undo: function (i) {
                                var n = o(i.oldParentPath), e = o(i.newParentPath),
                                    r = n.childs[i.oldIndex] || n.append;
                                e.childs.slice(i.newIndex, i.newIndex + i.count).forEach(function (e, t) {
                                    e.field = i.fieldNames[t], n.moveBefore(e, r)
                                }), null === i.newParentPathRedo && (i.newParentPathRedo = e.getInternalPath())
                            }, redo: function (i) {
                                var e = o(i.oldParentPathRedo), n = o(i.newParentPathRedo),
                                    r = n.childs[i.newIndexRedo] || n.append;
                                e.childs.slice(i.oldIndexRedo, i.oldIndexRedo + i.count).forEach(function (e, t) {
                                    e.field = i.fieldNames[t], n.moveBefore(e, r)
                                })
                            }
                        }, sort: {
                            undo: function (e) {
                                var t = o(e.path);
                                t.hideChilds(), t.childs = e.oldChilds, t.updateDom({updateIndexes: !0}), t.showChilds()
                            }, redo: function (e) {
                                var t = o(e.path);
                                t.hideChilds(), t.childs = e.newChilds, t.updateDom({updateIndexes: !0}), t.showChilds()
                            }
                        }, transform: {
                            undo: function (e) {
                                o(e.path).setInternalValue(e.oldValue)
                            }, redo: function (e) {
                                o(e.path).setInternalValue(e.newValue)
                            }
                        }
                    }
                }

                var t, i, n;
                return t = e, (i = [{
                    key: "onChange", value: function () {
                    }
                }, {
                    key: "add", value: function (e, t) {
                        this.index++, this.history[this.index] = {
                            action: e,
                            params: t,
                            timestamp: new Date
                        }, this.index < this.history.length - 1 && this.history.splice(this.index + 1, this.history.length - this.index - 1), this.onChange()
                    }
                }, {
                    key: "clear", value: function () {
                        this.history = [], this.index = -1, this.onChange()
                    }
                }, {
                    key: "canUndo", value: function () {
                        return 0 <= this.index
                    }
                }, {
                    key: "canRedo", value: function () {
                        return this.index < this.history.length - 1
                    }
                }, {
                    key: "undo", value: function () {
                        if (this.canUndo()) {
                            var e = this.history[this.index];
                            if (e) {
                                var t = this.actions[e.action];
                                if (t && t.undo) {
                                    if (t.undo(e.params), e.params.oldSelection) try {
                                        this.editor.setDomSelection(e.params.oldSelection)
                                    } catch (e) {
                                        console.error(e)
                                    }
                                } else console.error(new Error('unknown action "' + e.action + '"'))
                            }
                            this.index--, this.onChange()
                        }
                    }
                }, {
                    key: "redo", value: function () {
                        if (this.canRedo()) {
                            this.index++;
                            var e = this.history[this.index];
                            if (e) {
                                var t = this.actions[e.action];
                                if (t && t.redo) {
                                    if (t.redo(e.params), e.params.newSelection) try {
                                        this.editor.setDomSelection(e.params.newSelection)
                                    } catch (e) {
                                        console.error(e)
                                    }
                                } else console.error(new Error('unknown action "' + e.action + '"'))
                            }
                            this.onChange()
                        }
                    }
                }, {
                    key: "destroy", value: function () {
                        this.editor = null, this.history = [], this.index = -1
                    }
                }]) && B(t.prototype, i), n && B(t, n), e
            }();

            function N(e, t) {
                for (var i = 0; i < t.length; i++) {
                    var n = t[i];
                    n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n)
                }
            }

            var G = function () {
                function r(e, t) {
                    !function (e, t) {
                        if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function")
                    }(this, r);
                    var i = this;
                    this.editor = e, this.timeout = void 0, this.delay = 200, this.lastText = void 0, this.results = null, this.dom = {}, this.dom.container = t;
                    e = document.createElement("div");
                    (this.dom.wrapper = e).className = "jsoneditor-search", t.appendChild(e);
                    t = document.createElement("div");
                    (this.dom.results = t).className = "jsoneditor-results", e.appendChild(t);
                    t = document.createElement("div");
                    (this.dom.input = t).className = "jsoneditor-frame", t.title = (0, l.Iu)("searchTitle"), e.appendChild(t);
                    e = document.createElement("button");
                    e.type = "button", e.className = "jsoneditor-refresh", t.appendChild(e);
                    var n = document.createElement("input");
                    n.type = "text", (this.dom.search = n).oninput = function (e) {
                        i._onDelayedSearch(e)
                    }, n.onchange = function (e) {
                        i._onSearch()
                    }, n.onkeydown = function (e) {
                        i._onKeyDown(e)
                    }, n.onkeyup = function (e) {
                        i._onKeyUp(e)
                    }, e.onclick = function (e) {
                        n.select()
                    }, t.appendChild(n);
                    e = document.createElement("button");
                    e.type = "button", e.title = (0, l.Iu)("searchNextResultTitle"), e.className = "jsoneditor-next", e.onclick = function () {
                        i.next()
                    }, t.appendChild(e);
                    e = document.createElement("button");
                    e.type = "button", e.title = (0, l.Iu)("searchPreviousResultTitle"), e.className = "jsoneditor-previous", e.onclick = function () {
                        i.previous()
                    }, t.appendChild(e)
                }

                var e, t, i;
                return e = r, (t = [{
                    key: "next", value: function (e) {
                        var t;
                        this.results && ((t = null !== this.resultIndex ? this.resultIndex + 1 : 0) > this.results.length - 1 && (t = 0), this._setActiveResult(t, e))
                    }
                }, {
                    key: "previous", value: function (e) {
                        var t, i;
                        this.results && (t = this.results.length - 1, i = null !== this.resultIndex ? this.resultIndex - 1 : t, this._setActiveResult(i = i < 0 ? t : i, e))
                    }
                }, {
                    key: "_setActiveResult", value: function (e, t) {
                        var i;
                        if (this.activeResult && (i = this.activeResult.node, "field" === this.activeResult.elem ? delete i.searchFieldActive : delete i.searchValueActive, i.updateDom()), !this.results || !this.results[e]) return this.resultIndex = void 0, void (this.activeResult = void 0);
                        this.resultIndex = e;
                        var n = this.results[this.resultIndex].node, r = this.results[this.resultIndex].elem;
                        "field" === r ? n.searchFieldActive = !0 : n.searchValueActive = !0, this.activeResult = this.results[this.resultIndex], n.updateDom(), n.scrollTo(function () {
                            t && n.focus(r)
                        })
                    }
                }, {
                    key: "_clearDelay", value: function () {
                        void 0 !== this.timeout && (clearTimeout(this.timeout), delete this.timeout)
                    }
                }, {
                    key: "_onDelayedSearch", value: function (e) {
                        this._clearDelay();
                        var t = this;
                        this.timeout = setTimeout(function (e) {
                            t._onSearch()
                        }, this.delay)
                    }
                }, {
                    key: "_onSearch", value: function (e) {
                        this._clearDelay();
                        var t = this.dom.search.value, t = 0 < t.length ? t : void 0;
                        if (t !== this.lastText || e) {
                            this.lastText = t, this.results = this.editor.search(t);
                            var e = this.results[0] ? this.results[0].node.MAX_SEARCH_RESULTS : 1 / 0, i = 0;
                            if (this.activeResult) for (var n = 0; n < this.results.length; n++) if (this.results[n].node === this.activeResult.node) {
                                i = n;
                                break
                            }
                            this._setActiveResult(i, !1), void 0 !== t ? (t = this.results.length, this.dom.results.textContent = 0 === t ? "no results" : 1 === t ? "1 result" : e < t ? e + "+ results" : t + " results") : this.dom.results.textContent = ""
                        }
                    }
                }, {
                    key: "_onKeyDown", value: function (e) {
                        var t = e.which;
                        27 === t ? (this.dom.search.value = "", this._onSearch(), e.preventDefault(), e.stopPropagation()) : 13 === t && (e.ctrlKey ? this._onSearch(!0) : e.shiftKey ? this.previous() : this.next(), e.preventDefault(), e.stopPropagation())
                    }
                }, {
                    key: "_onKeyUp", value: function (e) {
                        var t = e.keyCode;
                        27 !== t && 13 !== t && this._onDelayedSearch(e)
                    }
                }, {
                    key: "clear", value: function () {
                        this.dom.search.value = "", this._onSearch()
                    }
                }, {
                    key: "forceSearch", value: function () {
                        this._onSearch(!0)
                    }
                }, {
                    key: "isEmpty", value: function () {
                        return "" === this.dom.search.value
                    }
                }, {
                    key: "destroy", value: function () {
                        this.editor = null, this.dom.container.removeChild(this.dom.wrapper), this.dom = null, this.results = null, this.activeResult = null, this._clearDelay()
                    }
                }]) && N(e.prototype, t), i && N(e, i), r
            }();

            function F(e, t) {
                for (var i = 0; i < t.length; i++) {
                    var n = t[i];
                    n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n)
                }
            }

            var P = function () {
                function i(e, t) {
                    !function (e, t) {
                        if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function")
                    }(this, i), e && (this.root = t, this.path = document.createElement("div"), this.path.className = "jsoneditor-treepath", this.path.setAttribute("tabindex", 0), this.contentMenuClicked = !1, e.appendChild(this.path), this.reset())
                }

                var e, t, n;
                return e = i, (t = [{
                    key: "reset", value: function () {
                        this.path.textContent = (0, l.Iu)("selectNode")
                    }
                }, {
                    key: "setPath", value: function (r) {
                        var o = this;
                        this.path.textContent = "", r && r.length && r.forEach(function (i, n) {
                            var e, t = document.createElement("span");
                            t.className = "jsoneditor-treepath-element", t.innerText = i.name, t.onclick = function (e) {
                                this.selectionCallback && this.selectionCallback(e)
                            }.bind(o, i), o.path.appendChild(t), i.children.length && ((e = document.createElement("span")).className = "jsoneditor-treepath-seperator", e.textContent = "►", e.onclick = function () {
                                o.contentMenuClicked = !0;
                                var t = [];
                                i.children.forEach(function (e) {
                                    t.push({
                                        text: e.name,
                                        className: "jsoneditor-type-modes" + (r[n + 1] + 1 && r[n + 1].name === e.name ? " jsoneditor-selected" : ""),
                                        click: function (e, t) {
                                            this.contextMenuCallback && this.contextMenuCallback(e, t)
                                        }.bind(o, i, e.name)
                                    })
                                }), new s.x(t, {limitHeight: !0}).show(e, o.root, !0)
                            }, o.path.appendChild(e)), n === r.length - 1 && (t = (e || t).getBoundingClientRect().right, o.path.offsetWidth < t && (o.path.scrollLeft = t), o.path.scrollLeft && ((t = document.createElement("span")).className = "jsoneditor-treepath-show-all-btn", t.title = "show all path", t.textContent = "...", t.onclick = function (e) {
                                (o.contentMenuClicked = !1, T.addClassName)(o.path, "show-all"), o.path.style.width = o.path.parentNode.getBoundingClientRect().width - 10 + "px", o.path.onblur = function () {
                                    if (o.contentMenuClicked) return o.contentMenuClicked = !1, void o.path.focus();
                                    (0, T.removeClassName)(o.path, "show-all"), o.path.onblur = void 0, o.path.style.width = "", o.setPath(e)
                                }
                            }.bind(o, r), o.path.insertBefore(t, o.path.firstChild)))
                        })
                    }
                }, {
                    key: "onSectionSelected", value: function (e) {
                        "function" == typeof e && (this.selectionCallback = e)
                    }
                }, {
                    key: "onContextMenuItemSelected", value: function (e) {
                        "function" == typeof e && (this.contextMenuCallback = e)
                    }
                }]) && F(e.prototype, t), n && F(e, n), i
            }(), t = i(8037), H = i.n(t), t = {};
            t.create = function (e, t) {
                if (!e) throw new Error("No container element provided.");
                this.container = e, this.dom = {}, this.highlighter = new n, this.selection = void 0, this.multiselection = {nodes: []}, this.validateSchema = null, this.validationSequence = 0, this.errorNodes = [], this.lastSchemaErrors = void 0, this.node = null, this.focusTarget = null, this._setOptions(t), t.autocomplete && (this.autocomplete = function (s) {
                    (s = s || {}).filter = s.filter || "start", s.trigger = s.trigger || "keydown", s.confirmKeys = s.confirmKeys || [39, 35, 9], s.caseSensitive = s.caseSensitive || !1;
                    var r = "", o = "", a = document.createElement("div");
                    a.style.position = "relative", a.style.outline = "0", a.style.border = "0", a.style.margin = "0", a.style.padding = "0";
                    var t, l, c = document.createElement("div");

                    function h(e) {
                        var t, i;
                        document.createRange ? ((t = document.createRange()).selectNodeContents(e), t.collapse(!1), (i = window.getSelection()).removeAllRanges(), i.addRange(t)) : document.selection && ((t = document.body.createTextRange()).moveToElementText(e), t.collapse(!1), t.select())
                    }

                    function d(e) {
                        return void 0 === t && ((t = document.createElement("span")).style.visibility = "hidden", t.style.position = "fixed", t.style.outline = "0", t.style.margin = "0", t.style.padding = "0", t.style.border = "0", t.style.left = "0", t.style.whiteSpace = "pre", t.style.fontSize = r, t.style.fontFamily = o, t.style.fontWeight = "normal", document.body.appendChild(t)), t.textContent = e, t.getBoundingClientRect().right
                    }

                    c.className = "autocomplete dropdown", c.style.position = "absolute", c.style.visibility = "hidden";
                    var u, g, p, i, m, f = {
                        onArrowDown: function () {
                        },
                        onArrowUp: function () {
                        },
                        onEnter: function () {
                        },
                        onTab: function () {
                        },
                        startFrom: 0,
                        options: [],
                        element: null,
                        elementHint: null,
                        elementStyle: null,
                        wrapper: a,
                        show: function (e, t, i) {
                            var n = this;
                            this.startFrom = t, this.wrapper.remove(), this.elementHint && (this.elementHint.remove(), this.elementHint = null), "" === r && (r = window.getComputedStyle(e).getPropertyValue("font-size")), "" === o && (o = window.getComputedStyle(e).getPropertyValue("font-family")), c.style.marginLeft = "0", c.style.marginTop = e.getBoundingClientRect().height + "px", this.options = i.map(String), this.element !== e && (this.element = e, this.elementStyle = {
                                zIndex: this.element.style.zIndex,
                                position: this.element.style.position,
                                backgroundColor: this.element.style.backgroundColor,
                                borderColor: this.element.style.borderColor
                            }), this.element.style.zIndex = 3, this.element.style.position = "relative", this.element.style.backgroundColor = "transparent", this.element.style.borderColor = "transparent", this.elementHint = e.cloneNode(), this.elementHint.className = "autocomplete hint", this.elementHint.style.zIndex = 2, this.elementHint.style.position = "absolute", this.elementHint.onfocus = function () {
                                n.element.focus()
                            }, this.element.addEventListener && (this.element.removeEventListener("keydown", b), this.element.addEventListener("keydown", b, !1), this.element.removeEventListener("blur", y), this.element.addEventListener("blur", y, !1)), a.appendChild(this.elementHint), a.appendChild(c), e.parentElement.appendChild(a), this.repaint(e)
                        },
                        setText: function (e) {
                            this.element.innerText = e
                        },
                        getText: function () {
                            return this.element.innerText
                        },
                        hideDropDown: function () {
                            this.wrapper.remove(), this.elementHint && (this.elementHint.remove(), this.elementHint = null, C.hide(), this.element.style.zIndex = this.elementStyle.zIndex, this.element.style.position = this.elementStyle.position, this.element.style.backgroundColor = this.elementStyle.backgroundColor, this.element.style.borderColor = this.elementStyle.borderColor)
                        },
                        repaint: function (e) {
                            var e = (e = e.innerText).replace("\n", ""), t = this.options.length,
                                i = e.substring(this.startFrom);
                            l = e.substring(0, this.startFrom);
                            for (var n = 0; n < t; n++) {
                                var r = this.options[n];
                                if (!s.caseSensitive && 0 === r.toLowerCase().indexOf(i.toLowerCase()) || s.caseSensitive && 0 === r.indexOf(i)) {
                                    this.elementHint.innerText = l + i + r.substring(i.length), this.elementHint.realInnerText = l + r;
                                    break
                                }
                            }
                            c.style.left = d(l) + "px", C.refresh(i, this.options), this.elementHint.style.width = d(this.elementHint.innerText) + 10 + "px", "hidden" === c.style.visibility || (this.elementHint.style.width = d(this.elementHint.innerText) + c.clientWidth + "px")
                        }
                    }, C = (u = c, g = [], p = 0, i = -1, m = {
                        rs: f, hide: function () {
                            u.style.visibility = "hidden"
                        }, refresh: function (n, e) {
                            u.style.visibility = "hidden", p = 0, u.textContent = "";
                            var t = window.innerHeight || document.documentElement.clientHeight,
                                i = u.parentNode.getBoundingClientRect(), r = i.top - 6, i = t - i.bottom - 6;
                            g = [];
                            var o = "function" == typeof s.filter ? s.filter : w[s.filter],
                                e = o ? e.filter(function (e) {
                                    return o(s.caseSensitive ? n : n.toLowerCase(), s.caseSensitive ? e : e.toLowerCase(), s)
                                }) : [];
                            0 !== (g = e.map(function (e) {
                                var t = document.createElement("div");
                                t.className = "item", t.onmouseover = I, t.onmouseout = v, t.onmousedown = A, t.__hint = e, t.textContent = "", t.appendChild(document.createTextNode(e.substring(0, n.length)));
                                var i = document.createElement("b");
                                return i.appendChild(document.createTextNode(e.substring(n.length))), t.appendChild(i), u.appendChild(t), t
                            })).length && (1 === g.length && (n.toLowerCase() === g[0].__hint.toLowerCase() && !s.caseSensitive || n === g[0].__hint && s.caseSensitive) || g.length < 2 || (m.highlight(0), 3 * i < r ? (u.style.maxHeight = r + "px", u.style.top = "", u.style.bottom = "100%") : (u.style.top = "100%", u.style.bottom = "", u.style.maxHeight = i + "px"), u.style.visibility = "visible"))
                        }, highlight: function (e) {
                            -1 !== i && g[i] && (g[i].className = "item"), g[e].className = "item hover", i = e
                        }, move: function (e) {
                            return "hidden" === u.style.visibility ? "" : (p + e === -1 || p + e === g.length || (p += e, m.highlight(p)), g[p].__hint)
                        }, onmouseselection: function () {
                        }
                    });

                    function I() {
                        this.style.backgroundColor = "#ddd"
                    }

                    function v() {
                        this.style.backgroundColor = ""
                    }

                    function A() {
                        m.hide(), m.onmouseselection(this.__hint, m.rs)
                    }

                    var b = function (e) {
                        var t = (e = e || window.event).keyCode;
                        if (null != this.elementHint && 33 !== t && 34 !== t) {
                            if (27 === t) return f.hideDropDown(), f.element.focus(), e.preventDefault(), void e.stopPropagation();
                            var i = (i = this.element.innerText).replace("\n", "");
                            if (0 <= s.confirmKeys.indexOf(t)) return 9 === t && 0 === this.elementHint.innerText.length && f.onTab(), void (0 < this.elementHint.innerText.length && this.element.innerText !== this.elementHint.realInnerText && (this.element.innerText = this.elementHint.realInnerText, f.hideDropDown(), h(this.element), 9 === t && (f.element.focus(), e.preventDefault(), e.stopPropagation())));
                            if (13 !== t) {
                                if (40 === t) {
                                    var n = i.substring(this.startFrom), r = C.move(1);
                                    return "" === r && f.onArrowDown(), this.elementHint.innerText = l + n + r.substring(n.length), this.elementHint.realInnerText = l + r, e.preventDefault(), void e.stopPropagation()
                                }
                                38 === t && (i = i.substring(this.startFrom), "" === (o = C.move(-1)) && f.onArrowUp(), this.elementHint.innerText = l + i + o.substring(i.length), this.elementHint.realInnerText = l + o, e.preventDefault(), e.stopPropagation())
                            } else if (0 === this.elementHint.innerText.length) f.onEnter(); else {
                                var o = "hidden" === c.style.visibility;
                                if (C.hide(), o) return f.hideDropDown(), f.element.focus(), void f.onEnter();
                                this.element.innerText = this.elementHint.realInnerText, f.hideDropDown(), h(this.element), e.preventDefault(), e.stopPropagation()
                            }
                        }
                    }.bind(f), y = function (e) {
                        f.hideDropDown()
                    };
                    return C.onmouseselection = function (e, t) {
                        t.element.innerText = t.elementHint.innerText = l + e, t.hideDropDown(), window.setTimeout(function () {
                            t.element.focus(), h(t.element)
                        }, 1)
                    }, f
                }(t.autocomplete)), this.options.history && "view" !== this.options.mode && (this.history = new W(this)), this._createFrame(), this._createTable()
            }, t.destroy = function () {
                this.frame && this.container && this.frame.parentNode === this.container && (this.container.removeChild(this.frame), this.frame = null), this.container = null, this.dom = null, this.clear(), this.node = null, this.focusTarget = null, this.selection = null, this.multiselection = null, this.errorNodes = null, this.validateSchema = null, this._debouncedValidate = null, this.history && (this.history.destroy(), this.history = null), this.searchBox && (this.searchBox.destroy(), this.searchBox = null), this.modeSwitcher && (this.modeSwitcher.destroy(), this.modeSwitcher = null), this.frameFocusTracker.destroy()
            }, t._setOptions = function (t) {
                var i = this;
                this.options = {
                    search: !0,
                    history: !0,
                    mode: "tree",
                    name: void 0,
                    schema: null,
                    schemaRefs: null,
                    autocomplete: null,
                    navigationBar: !0,
                    mainMenuBar: !0,
                    limitDragging: !1,
                    onSelectionChange: null,
                    colorPicker: !0,
                    onColorPicker: function (e, t, i) {
                        var n;
                        H() ? (n = e.getBoundingClientRect().top, n = (0, T.getWindow)(e).innerHeight - n < 300 && 300 < n, new (H())({
                            parent: e,
                            color: t,
                            popup: n ? "top" : "bottom",
                            onDone: function (e) {
                                e = 1 === e.rgba[3] ? e.hex.substr(0, 7) : e.hex;
                                i(e)
                            }
                        }).show()) : console.warn("Cannot open color picker: the `vanilla-picker` library is not included in the bundle. Either use the full bundle or implement your own color picker using `onColorPicker`.")
                    },
                    timestampTag: !0,
                    timestampFormat: null,
                    createQuery: o.r,
                    executeQuery: o.J,
                    onEvent: null,
                    enableSort: !0,
                    enableTransform: !0
                }, t && (Object.keys(t).forEach(function (e) {
                    i.options[e] = t[e]
                }), null == t.limitDragging && null != t.schema && (this.options.limitDragging = !0)), this.setSchema(this.options.schema, this.options.schemaRefs), this._debouncedValidate = (0, T.debounce)(this._validateAndCatch.bind(this), this.DEBOUNCE_INTERVAL), t.onSelectionChange && this.onSelectionChange(t.onSelectionChange), (0, l.cC)(this.options.languages), (0, l.m0)(this.options.language)
            }, t.set = function (e) {
                e instanceof Function || void 0 === e ? this.clear() : (this.content.removeChild(this.table), e = {
                    field: this.options.name,
                    value: e
                }, e = new R(this, e), this._setRoot(e), this._validateAndCatch(), this.node.expand(!1), this.content.appendChild(this.table)), this.history && this.history.clear(), this.searchBox && this.searchBox.clear()
            }, t.update = function (e) {
                var t, i;
                this.node.deepEqual(e) || (t = this.getSelection(), this.onChangeDisabled = !0, this.node.update(e), this.onChangeDisabled = !1, this._validateAndCatch(), this.searchBox && !this.searchBox.isEmpty() && this.searchBox.forceSearch(), t && t.start && t.end ? (i = this.node.findNodeByPath(t.start.path), e = this.node.findNodeByPath(t.end.path), i && e ? this.setSelection(t.start, t.end) : this.setSelection({}, {})) : this.setSelection({}, {}))
            }, t.get = function () {
                if (this.node) return this.node.getValue()
            }, t.getText = function () {
                return JSON.stringify(this.get())
            }, t.setText = function (t) {
                try {
                    this.set((0, T.parse)(t))
                } catch (e) {
                    t = (0, T.tryJsonRepair)(t);
                    this.set((0, T.parse)(t))
                }
            }, t.updateText = function (t) {
                try {
                    this.update((0, T.parse)(t))
                } catch (e) {
                    t = (0, T.tryJsonRepair)(t);
                    this.update((0, T.parse)(t))
                }
            }, t.setName = function (e) {
                this.options.name = e, this.node && this.node.updateField(this.options.name)
            }, t.getName = function () {
                return this.options.name
            }, t.focus = function () {
                var e = this.scrollableContent.querySelector("[contenteditable=true]");
                e ? e.focus() : this.node.dom.expand ? this.node.dom.expand.focus() : this.node.dom.menu ? this.node.dom.menu.focus() : (e = this.frame.querySelector("button")) && e.focus()
            }, t.clear = function () {
                this.node && (this.node.hide(), delete this.node), this.treePath && this.treePath.reset()
            }, t._setRoot = function (e) {
                this.clear(), (this.node = e).setParent(null), e.setField(this.getName(), !1), delete e.index, this.tbody.appendChild(e.getDom())
            }, t.search = function (e) {
                var t;
                return this.node ? (this.content.removeChild(this.table), t = this.node.search(e), this.content.appendChild(this.table)) : t = [], t
            }, t.expandAll = function () {
                this.node && (this.content.removeChild(this.table), this.node.expand(), this.content.appendChild(this.table))
            }, t.collapseAll = function () {
                this.node && (this.content.removeChild(this.table), this.node.collapse(), this.content.appendChild(this.table))
            }, t._onAction = function (e, t) {
                this.history && this.history.add(e, t), this._onChange()
            }, t._onChange = function () {
                if (!this.onChangeDisabled) {
                    var e;
                    if (this.selection = this.getDomSelection(), this._debouncedValidate(), this.treePath && ((e = this.node && this.selection ? this.node.findNodeByInternalPath(this.selection.path) : this.multiselection ? this.multiselection.nodes[0] : void 0) ? this._updateTreePath(e.getNodePath()) : this.treePath.reset()), this.options.onChange) try {
                        this.options.onChange()
                    } catch (e) {
                        console.error("Error in onChange callback: ", e)
                    }
                    if (this.options.onChangeJSON) try {
                        this.options.onChangeJSON(this.get())
                    } catch (e) {
                        console.error("Error in onChangeJSON callback: ", e)
                    }
                    if (this.options.onChangeText) try {
                        this.options.onChangeText(this.getText())
                    } catch (e) {
                        console.error("Error in onChangeText callback: ", e)
                    }
                    if (this.options.onClassName && this.node.recursivelyUpdateCssClassesOnNodes(), this.options.onNodeName && this.node.childs) try {
                        this.node.recursivelyUpdateNodeName()
                    } catch (e) {
                        console.error("Error in onNodeName callback: ", e)
                    }
                }
            }, t.validate = function () {
                var t = this, i = this.node;
                if (i) {
                    var e = i.getValue(), n = [];
                    this.validateSchema && (this.validateSchema(e) || (n = this.validateSchema.errors.map(function (e) {
                        return (0, T.improveSchemaError)(e)
                    }).map(function (e) {
                        return {node: i.findNode(e.dataPath), error: e, type: "validation"}
                    }).filter(function (e) {
                        return null != e.node
                    })));
                    try {
                        this.validationSequence++;
                        var r = this, o = this.validationSequence;
                        return this._validateCustom(e).then(function (e) {
                            return o === r.validationSequence && (e = [].concat(n, e || []), r._renderValidationErrors(e), "function" == typeof t.options.onValidationError && (0, T.isValidationErrorChanged)(e, t.lastSchemaErrors) && t.options.onValidationError.call(t, e), t.lastSchemaErrors = e), t.lastSchemaErrors
                        })
                    } catch (e) {
                        return Promise.reject(e)
                    }
                }
            }, t._validateAndCatch = function () {
                this.validate().catch(function (e) {
                    console.error("Error running validation:", e)
                })
            }, t._renderValidationErrors = function (e) {
                this.errorNodes && this.errorNodes.forEach(function (e) {
                    e.setError(null)
                });
                var t = e.reduce(function (e, t) {
                    return t.node.findParents().filter(function (t) {
                        return !e.some(function (e) {
                            return e[0] === t
                        })
                    }).map(function (e) {
                        return [e, t.node]
                    }).concat(e)
                }, []);
                this.errorNodes = t.map(function (e) {
                    return {
                        node: e[0],
                        child: e[1],
                        error: {message: "object" === e[0].type ? (0, l.Iu)("containsInvalidProperties") : (0, l.Iu)("containsInvalidItems")}
                    }
                }).concat(e).map(function (e) {
                    return e.node.setError(e.error, e.child), e.node
                })
            }, t._validateCustom = function (e) {
                try {
                    if (this.options.onValidate) {
                        var i = this.node, t = this.options.onValidate(e);
                        return ((0, T.isPromise)(t) ? t : Promise.resolve(t)).then(function (e) {
                            return Array.isArray(e) ? e.filter(function (e) {
                                var t = (0, T.isValidValidationError)(e);
                                return t || console.warn('Ignoring a custom validation error with invalid structure. Expected structure: {path: [...], message: "..."}. Actual error:', e), t
                            }).map(function (e) {
                                var t;
                                try {
                                    t = e && e.path ? i.findNodeByPath(e.path) : null
                                } catch (e) {
                                }
                                return t || console.warn("Ignoring validation error: node not found. Path:", e.path, "Error:", e), {
                                    node: t,
                                    error: e,
                                    type: "customValidation"
                                }
                            }).filter(function (e) {
                                return e && e.node && e.error && e.error.message
                            }) : null
                        })
                    }
                } catch (e) {
                    return Promise.reject(e)
                }
                return Promise.resolve(null)
            }, t.refresh = function () {
                this.node && this.node.updateDom({recurse: !0})
            }, t.startAutoScroll = function (e) {
                var t = this, i = this.scrollableContent, n = (0, T.getAbsoluteTop)(i), r = i.clientHeight, o = n + r;
                e < n + 24 && 0 < i.scrollTop ? this.autoScrollStep = (n + 24 - e) / 3 : o - 24 < e && r + i.scrollTop < i.scrollHeight ? this.autoScrollStep = (o - 24 - e) / 3 : this.autoScrollStep = void 0, this.autoScrollStep ? this.autoScrollTimer || (this.autoScrollTimer = setInterval(function () {
                    t.autoScrollStep ? i.scrollTop -= t.autoScrollStep : t.stopAutoScroll()
                }, 50)) : this.stopAutoScroll()
            }, t.stopAutoScroll = function () {
                this.autoScrollTimer && (clearTimeout(this.autoScrollTimer), delete this.autoScrollTimer), this.autoScrollStep && delete this.autoScrollStep
            }, t.setDomSelection = function (e) {
                var t, i, n;
                e && ("scrollTop" in e && this.scrollableContent && (this.scrollableContent.scrollTop = e.scrollTop), e.paths ? (t = this, n = e.paths.map(function (e) {
                    return t.node.findNodeByInternalPath(e)
                }), this.select(n)) : (n = (i = e.path ? this.node.findNodeByInternalPath(e.path) : null) && e.domName ? i.dom[e.domName] : null, e.range && n ? (n = Object.assign({}, e.range, {container: n}), (0, T.setSelectionOffset)(n)) : i && i.focus()))
            }, t.getDomSelection = function () {
                var t = R.getNodeFromTarget(this.focusTarget), i = this.focusTarget,
                    e = t ? Object.keys(t.dom).find(function (e) {
                        return t.dom[e] === i
                    }) : null, n = (0, T.getSelectionOffset)();
                return (n = (n = n && "DIV" !== n.container.nodeName ? null : n) && n.container !== i ? null : n) && delete n.container, {
                    path: t ? t.getInternalPath() : null,
                    domName: e,
                    range: n,
                    paths: 0 < this.multiselection.length ? this.multiselection.nodes.map(function (e) {
                        return e.getInternalPath()
                    }) : null,
                    scrollTop: this.scrollableContent ? this.scrollableContent.scrollTop : 0
                }
            }, t.scrollTo = function (e, i) {
                var n, t, r, o, s = this.scrollableContent;
                s ? ((n = this).animateTimeout && (clearTimeout(n.animateTimeout), delete n.animateTimeout), n.animateCallback && (n.animateCallback(!1), delete n.animateCallback), t = s.clientHeight, r = s.scrollHeight - t, o = Math.min(Math.max(e - t / 4, 0), r), function e() {
                    var t = s.scrollTop, t = o - t;
                    3 < Math.abs(t) ? (s.scrollTop += t / 3, n.animateCallback = i, n.animateTimeout = setTimeout(e, 50)) : (i && i(!0), s.scrollTop = o, delete n.animateTimeout, delete n.animateCallback)
                }()) : i && i(!1)
            }, t._createFrame = function () {
                this.frame = document.createElement("div"), this.frame.className = "jsoneditor jsoneditor-mode-" + this.options.mode, this.container.appendChild(this.frame), this.contentOuter = document.createElement("div"), this.contentOuter.className = "jsoneditor-outer";
                var t = this;

                function i(e) {
                    t._onEvent && t._onEvent(e)
                }

                var e, n, r, o, s = {
                    target: this.frame,
                    onFocus: this.options.onFocus || null,
                    onBlur: this.options.onBlur || null
                };
                this.frameFocusTracker = new a.R(s), this.frame.onclick = function (e) {
                    var t = e.target;
                    i(e), "BUTTON" === t.nodeName && e.preventDefault()
                }, this.frame.oninput = i, this.frame.onchange = i, this.frame.onkeydown = i, this.frame.onkeyup = i, this.frame.oncut = i, this.frame.onpaste = i, this.frame.onmousedown = i, this.frame.onmouseup = i, this.frame.onmouseover = i, this.frame.onmouseout = i, (0, T.addEventListener)(this.frame, "focus", i, !0), (0, T.addEventListener)(this.frame, "blur", i, !0), this.frame.onfocusin = i, this.frame.onfocusout = i, this.options.mainMenuBar && ((0, T.addClassName)(this.contentOuter, "has-main-menu-bar"), this.menu = document.createElement("div"), this.menu.className = "jsoneditor-menu", this.frame.appendChild(this.menu), (s = document.createElement("button")).type = "button", s.className = "jsoneditor-expand-all", s.title = (0, l.Iu)("expandAll"), s.onclick = function () {
                    t.expandAll()
                }, this.menu.appendChild(s), (s = document.createElement("button")).type = "button", s.title = (0, l.Iu)("collapseAll"), s.className = "jsoneditor-collapse-all", s.onclick = function () {
                    t.collapseAll()
                }, this.menu.appendChild(s), this.options.enableSort && ((e = document.createElement("button")).type = "button", e.className = "jsoneditor-sort", e.title = (0, l.Iu)("sortTitleShort"), e.onclick = function () {
                    t.node.showSortModal()
                }, this.menu.appendChild(e)), this.options.enableTransform && ((e = document.createElement("button")).type = "button", e.title = (0, l.Iu)("transformTitleShort"), e.className = "jsoneditor-transform", e.onclick = function () {
                    t.node.showTransformModal()
                }, this.menu.appendChild(e)), this.history && ((n = document.createElement("button")).type = "button", n.className = "jsoneditor-undo jsoneditor-separator", n.title = (0, l.Iu)("undo"), n.onclick = function () {
                    t._onUndo()
                }, this.menu.appendChild(n), this.dom.undo = n, (r = document.createElement("button")).type = "button", r.className = "jsoneditor-redo", r.title = (0, l.Iu)("redo"), r.onclick = function () {
                    t._onRedo()
                }, this.menu.appendChild(r), this.dom.redo = r, this.history.onChange = function () {
                    n.disabled = !t.history.canUndo(), r.disabled = !t.history.canRedo()
                }, this.history.onChange()), this.options && this.options.modes && this.options.modes.length && ((o = this).modeSwitcher = new c.x(this.menu, this.options.modes, this.options.mode, function (e) {
                    try {
                        o.setMode(e), o.modeSwitcher.focus()
                    } catch (e) {
                        o._onError(e)
                    }
                })), this.options.search && (this.searchBox = new G(this, this.menu))), this.options.navigationBar && (this.navBar = document.createElement("div"), this.navBar.className = "jsoneditor-navigation-bar nav-bar-empty", this.frame.appendChild(this.navBar), this.treePath = new P(this.navBar, this.getPopupAnchor()), this.treePath.onSectionSelected(this._onTreePathSectionSelected.bind(this)), this.treePath.onContextMenuItemSelected(this._onTreePathMenuItemSelected.bind(this)))
            }, t._onUndo = function () {
                this.history && (this.history.undo(), this._onChange())
            }, t._onRedo = function () {
                this.history && (this.history.redo(), this._onChange())
            }, t._onEvent = function (e) {
                if (!R.targetIsColorPicker(e.target)) {
                    var t, i = R.getNodeFromTarget(e.target);
                    if ("keydown" === e.type && this._onKeyDown(e), i && "focus" === e.type && (this.focusTarget = e.target, this.options.autocomplete && "focus" === this.options.autocomplete.trigger && this._showAutoComplete(e.target)), "mousedown" === e.type && this._startDragDistance(e), "mousemove" !== e.type && "mouseup" !== e.type && "click" !== e.type || this._updateDragDistance(e), i && this.options && this.options.navigationBar && i && ("keydown" === e.type || "mousedown" === e.type) && (t = this, setTimeout(function () {
                        t._updateTreePath(i.getNodePath())
                    })), i && i.selected) {
                        if ("click" === e.type) {
                            if (e.target === i.dom.menu) return void this.showContextMenu(e.target);
                            e.hasMoved || this.deselect()
                        }
                        "mousedown" === e.type && R.onDragStart(this.multiselection.nodes, e)
                    } else "mousedown" === e.type && (0, T.hasParentNode)(e.target, this.content) && (this.deselect(), i && e.target === i.dom.drag ? R.onDragStart(i, e) : i && (e.target === i.dom.field || e.target === i.dom.value || e.target === i.dom.select) || this._onMultiSelectStart(e));
                    i && i.onEvent(e)
                }
            }, t._updateTreePath = function (e) {
                var i;

                function n(e) {
                    return e.parent ? "array" === e.parent.type ? e.index : e.field : e.field || e.type
                }

                e && e.length ? ((0, T.removeClassName)(this.navBar, "nav-bar-empty"), i = [], e.forEach(function (e) {
                    var t = {name: n(e), node: e, children: []};
                    e.childs && e.childs.length && e.childs.forEach(function (e) {
                        t.children.push({name: n(e), node: e})
                    }), i.push(t)
                }), this.treePath.setPath(i)) : (0, T.addClassName)(this.navBar, "nav-bar-empty")
            }, t._onTreePathSectionSelected = function (e) {
                e && e.node && (e.node.expandTo(), e.node.focus())
            }, t._onTreePathMenuItemSelected = function (e, t) {
                e && e.children.length && ((e = e.children.find(function (e) {
                    return e.name === t
                })) && e.node && (this._updateTreePath(e.node.getNodePath()), e.node.expandTo(), e.node.focus()))
            }, t._startDragDistance = function (e) {
                this.dragDistanceEvent = {
                    initialTarget: e.target,
                    initialPageX: e.pageX,
                    initialPageY: e.pageY,
                    dragDistance: 0,
                    hasMoved: !1
                }
            }, t._updateDragDistance = function (e) {
                this.dragDistanceEvent || this._startDragDistance(e);
                var t = e.pageX - this.dragDistanceEvent.initialPageX,
                    i = e.pageY - this.dragDistanceEvent.initialPageY;
                return this.dragDistanceEvent.dragDistance = Math.sqrt(t * t + i * i), this.dragDistanceEvent.hasMoved = this.dragDistanceEvent.hasMoved || 10 < this.dragDistanceEvent.dragDistance, e.dragDistance = this.dragDistanceEvent.dragDistance, e.hasMoved = this.dragDistanceEvent.hasMoved, e.dragDistance
            }, t._onMultiSelectStart = function (e) {
                var t, i = R.getNodeFromTarget(e.target);
                "tree" === this.options.mode && void 0 === this.options.onEditable && (this.multiselection = {
                    start: i || null,
                    end: null,
                    nodes: []
                }, this._startDragDistance(e), (t = this).mousemove || (this.mousemove = (0, T.addEventListener)(e.view, "mousemove", function (e) {
                    t._onMultiSelect(e)
                })), this.mouseup || (this.mouseup = (0, T.addEventListener)(e.view, "mouseup", function (e) {
                    t._onMultiSelectEnd(e)
                })), e.preventDefault())
            }, t._onMultiSelect = function (e) {
                var t;
                e.preventDefault(), this._updateDragDistance(e), e.hasMoved && ((t = R.getNodeFromTarget(e.target)) && (null == this.multiselection.start && (this.multiselection.start = t), this.multiselection.end = t), this.deselect(), e = this.multiselection.start, t = this.multiselection.end || this.multiselection.start, e && t && (this.multiselection.nodes = this._findTopLevelNodes(e, t), this.multiselection.nodes && this.multiselection.nodes.length && (t = this.multiselection.nodes[0], this.multiselection.start === t || this.multiselection.start.isDescendantOf(t) ? this.multiselection.direction = "down" : this.multiselection.direction = "up"), this.select(this.multiselection.nodes)))
            }, t._onMultiSelectEnd = function (e) {
                var t = this.multiselection.nodes[0];
                t && t.dom.menu && t.dom.menu.focus(), this.multiselection.start = null, this.multiselection.end = null, this.mousemove && ((0, T.removeEventListener)(e.view, "mousemove", this.mousemove), delete this.mousemove), this.mouseup && ((0, T.removeEventListener)(e.view, "mouseup", this.mouseup), delete this.mouseup)
            }, t.deselect = function (e) {
                var t = !!this.multiselection.nodes.length;
                this.multiselection.nodes.forEach(function (e) {
                    e.setSelected(!1)
                }), this.multiselection.nodes = [], e && (this.multiselection.start = null, this.multiselection.end = null), t && this._selectionChangedHandler && this._selectionChangedHandler()
            }, t.select = function (e) {
                if (!Array.isArray(e)) return this.select([e]);
                var t;
                e && (this.deselect(), this.multiselection.nodes = e.slice(0), t = e[0], e.forEach(function (e) {
                    e.expandPathToNode(), e.setSelected(!0, e === t)
                }), this._selectionChangedHandler && (e = this.getSelection(), this._selectionChangedHandler(e.start, e.end)))
            }, t._findTopLevelNodes = function (e, t) {
                for (var i = e.getNodePath(), n = t.getNodePath(), r = 0; r < i.length && i[r] === n[r];) r++;
                var o = i[r - 1], s = i[r], e = n[r];
                if (s && e || (o.parent ? o = (e = s = o).parent : (s = o.childs[0], e = o.childs[o.childs.length - 1])), o && s && e) {
                    t = o.childs.indexOf(s), s = o.childs.indexOf(e), e = Math.min(t, s), s = Math.max(t, s);
                    return o.childs.slice(e, s + 1)
                }
                return []
            }, t._showAutoComplete = function (t) {
                var i, n = R.getNodeFromTarget(t), r = "";
                0 <= t.className.indexOf("jsoneditor-value") && (r = "value"), "" !== (r = 0 <= t.className.indexOf("jsoneditor-field") ? "field" : r) && (i = this, setTimeout(function () {
                    var e;
                    !n || !("focus" === i.options.autocomplete.trigger || 0 < t.innerText.length) || null === (e = i.options.autocomplete.getOptions(t.innerText, n.getPath(), r, n.editor)) ? i.autocomplete.hideDropDown() : "function" == typeof e.then ? e.then(function (e) {
                        null === e ? i.autocomplete.hideDropDown() : e.options ? i.autocomplete.show(t, e.startFrom, e.options) : i.autocomplete.show(t, 0, e)
                    }).catch(function (e) {
                        console.error(e)
                    }) : e.options ? i.autocomplete.show(t, e.startFrom, e.options) : i.autocomplete.show(t, 0, e)
                }, 50))
            }, t._onKeyDown = function (e) {
                var t, i = e.which || e.keyCode, n = e.altKey, r = e.ctrlKey, o = e.metaKey, s = e.shiftKey, a = !1,
                    l = this.focusTarget;
                9 === i && (t = this, setTimeout(function () {
                    t.focusTarget !== l && (0, T.selectContentEditable)(t.focusTarget)
                }, 0)), this.searchBox && (r && 70 === i ? (this.searchBox.dom.search.focus(), this.searchBox.dom.search.select(), a = !0) : (114 === i || r && 71 === i) && (s ? this.searchBox.previous(!0) : this.searchBox.next(!0), a = !0)), this.history && (r && !s && 90 === i ? (this._onUndo(), a = !0) : r && s && 90 === i && (this._onRedo(), a = !0)), this.options.autocomplete && !a && (r || n || o || 1 !== e.key.length && 8 !== i && 46 !== i || (a = !1, this._showAutoComplete(e.target))), a && (e.preventDefault(), e.stopPropagation())
            }, t._createTable = function () {
                var e;
                this.options.navigationBar && (0, T.addClassName)(this.contentOuter, "has-nav-bar"), this.scrollableContent = document.createElement("div"), this.scrollableContent.className = "jsoneditor-tree", this.contentOuter.appendChild(this.scrollableContent), this.content = document.createElement("div"), this.content.className = "jsoneditor-tree-inner", this.scrollableContent.appendChild(this.content), this.table = document.createElement("table"), this.table.className = "jsoneditor-tree", this.content.appendChild(this.table), this.colgroupContent = document.createElement("colgroup"), "tree" === this.options.mode && ((e = document.createElement("col")).width = "24px", this.colgroupContent.appendChild(e)), (e = document.createElement("col")).width = "24px", this.colgroupContent.appendChild(e), e = document.createElement("col"), this.colgroupContent.appendChild(e), this.table.appendChild(this.colgroupContent), this.tbody = document.createElement("tbody"), this.table.appendChild(this.tbody), this.frame.appendChild(this.contentOuter)
            }, t.showContextMenu = function (e, t) {
                var i, n = [], r = this.multiselection.nodes.slice();
                n.push({
                    text: (0, l.Iu)("duplicateText"),
                    title: (0, l.Iu)("duplicateTitle"),
                    className: "jsoneditor-duplicate",
                    click: function () {
                        R.onDuplicate(r)
                    }
                }), n.push({
                    text: (0, l.Iu)("remove"),
                    title: (0, l.Iu)("removeTitle"),
                    className: "jsoneditor-remove",
                    click: function () {
                        R.onRemove(r)
                    }
                }), this.options.onCreateMenu && (i = r.map(function (e) {
                    return e.getPath()
                }), n = this.options.onCreateMenu(n, {
                    type: "multiple",
                    path: i[0],
                    paths: i
                })), new s.x(n, {close: t}).show(e, this.getPopupAnchor())
            }, t.getPopupAnchor = function () {
                return this.options.popupAnchor || this.frame
            }, t.getSelection = function () {
                var e, t, i = {start: null, end: null};
                return this.multiselection.nodes && this.multiselection.nodes.length && this.multiselection.nodes.length && (e = this.multiselection.nodes[0], t = this.multiselection.nodes[this.multiselection.nodes.length - 1], "down" === this.multiselection.direction ? (i.start = e.serialize(), i.end = t.serialize()) : (i.start = t.serialize(), i.end = e.serialize())), i
            }, t.onSelectionChange = function (e) {
                "function" == typeof e && (this._selectionChangedHandler = (0, T.debounce)(e, this.DEBOUNCE_INTERVAL))
            }, t.setSelection = function (e, t) {
                e && e.dom && e.range && (console.warn("setSelection/getSelection usage for text selection is deprecated and should not be used, see documentation for supported selection options"), this.setDomSelection(e));
                t = this._getNodeInstancesByRange(e, t);
                t.forEach(function (e) {
                    e.expandTo()
                }), this.select(t)
            }, t._getNodeInstancesByRange = function (e, t) {
                var i, n;
                e && e.path && (i = this.node.findNodeByPath(e.path), t && t.path && (n = this.node.findNodeByPath(t.path)));
                var r = [];
                if (i instanceof R) if (n instanceof R && n !== i) if (i.parent === n.parent) {
                    t = i.getIndex() < n.getIndex() ? (e = i, n) : (e = n, i);
                    var o = e;
                    for (r.push(o); o = o.nextSibling(), r.push(o), o && o !== t;) ;
                } else r = this._findTopLevelNodes(i, n); else r.push(i);
                return r
            }, t.getNodesByRange = function (e, t) {
                var t = this._getNodeInstancesByRange(e, t), i = [];
                return t.forEach(function (e) {
                    i.push(e.serialize())
                }), i
            };
            var V = [{mode: "tree", mixin: t, data: "json"}, {mode: "view", mixin: t, data: "json"}, {
                mode: "form",
                mixin: t,
                data: "json"
            }]
        }, 2744: function (e, t, i) {
            t.tryRequireAjv = function () {
                try {
                    return i(8903)
                } catch (e) {
                }
            }
        }, 9125: function (e, t, i) {
            t.O = function () {
                try {
                    i(4864)
                } catch (e) {
                    console.error(e)
                }
            }
        }, 9791: function (e, t, i) {
            "use strict";
            i.r(t), i.d(t, {
                parse: function () {
                    return d
                }, tryJsonRepair: function () {
                    return u
                }, escapeUnicodeChars: function () {
                    return g
                }, validate: function () {
                    return p
                }, extend: function () {
                    return m
                }, clear: function () {
                    return f
                }, getType: function () {
                    return C
                }, isUrl: function () {
                    return v
                }, isArray: function () {
                    return A
                }, getWindow: function () {
                    return b
                }, getAbsoluteLeft: function () {
                    return y
                }, getAbsoluteTop: function () {
                    return w
                }, addClassName: function () {
                    return S
                }, removeAllClassNames: function () {
                    return x
                }, removeClassName: function () {
                    return k
                }, stripFormatting: function () {
                    return E
                }, setEndOfContentEditable: function () {
                    return R
                }, selectContentEditable: function () {
                    return T
                }, getSelection: function () {
                    return _
                }, setSelection: function () {
                    return $
                }, getSelectionOffset: function () {
                    return L
                }, setSelectionOffset: function () {
                    return B
                }, getInnerText: function () {
                    return W
                }, hasParentNode: function () {
                    return N
                }, getInternetExplorerVersion: function () {
                    return G
                }, isFirefox: function () {
                    return P
                }, addEventListener: function () {
                    return H
                }, removeEventListener: function () {
                    return V
                }, isChildOf: function () {
                    return Z
                }, parsePath: function () {
                    return M
                }, stringifyPath: function () {
                    return O
                }, improveSchemaError: function () {
                    return D
                }, isPromise: function () {
                    return K
                }, isValidValidationError: function () {
                    return j
                }, insideRect: function () {
                    return z
                }, debounce: function () {
                    return X
                }, textDiff: function () {
                    return J
                }, getInputSelection: function () {
                    return Y
                }, getIndexForPosition: function () {
                    return U
                }, getPositionForPath: function () {
                    return Q
                }, compileJSONPointer: function () {
                    return q
                }, getColorCSS: function () {
                    return ee
                }, isValidColor: function () {
                    return te
                }, makeFieldTooltip: function () {
                    return ie
                }, get: function () {
                    return ne
                }, findUniqueName: function () {
                    return re
                }, getChildPaths: function () {
                    return oe
                }, sort: function () {
                    return se
                }, sortObjectKeys: function () {
                    return ae
                }, parseString: function () {
                    return le
                }, isTimestamp: function () {
                    return ce
                }, formatSize: function () {
                    return he
                }, limitCharacters: function () {
                    return de
                }, isObject: function () {
                    return ue
                }, contains: function () {
                    return ge
                }, isValidationErrorChanged: function () {
                    return pe
                }
            });
            var t = i(4987), t = i(233), r = i.n(t), t = i(3860), n = i.n(t), o = i(6589), s = i(7026), a = i(7907);

            function l(e) {
                return (l = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) {
                    return typeof e
                } : function (e) {
                    return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e
                })(e)
            }

            var c = 1e4, h = 9466848e5;

            function d(t) {
                try {
                    return JSON.parse(t)
                } catch (e) {
                    throw p(t), e
                }
            }

            function u(t) {
                try {
                    return n()(t)
                } catch (e) {
                    return t
                }
            }

            function g(e) {
                return e.replace(/[\u007F-\uFFFF]/g, function (e) {
                    return "\\u" + ("0000" + e.charCodeAt(0).toString(16)).slice(-4)
                })
            }

            function p(e) {
                (void 0 !== o ? o : JSON).parse(e)
            }

            function m(e, t) {
                for (var i in t) me(t, i) && (e[i] = t[i]);
                return e
            }

            function f(e) {
                for (var t in e) me(e, t) && delete e[t];
                return e
            }

            function C(e) {
                return null === e ? "null" : void 0 === e ? "undefined" : e instanceof Number || "number" == typeof e ? "number" : e instanceof String || "string" == typeof e ? "string" : e instanceof Boolean || "boolean" == typeof e ? "boolean" : e instanceof RegExp ? "regexp" : A(e) ? "array" : "object"
            }

            var I = /^https?:\/\/\S+$/;

            function v(e) {
                return ("string" == typeof e || e instanceof String) && I.test(e)
            }

            function A(e) {
                return "[object Array]" === Object.prototype.toString.call(e)
            }

            function b(e) {
                return e.ownerDocument.defaultView
            }

            function y(e) {
                return e.getBoundingClientRect().left + window.pageXOffset || document.scrollLeft || 0
            }

            function w(e) {
                return e.getBoundingClientRect().top + window.pageYOffset || document.scrollTop || 0
            }

            function S(e, t) {
                var i = e.className.split(" ");
                -1 === i.indexOf(t) && (i.push(t), e.className = i.join(" "))
            }

            function x(e) {
                e.className = ""
            }

            function k(e, t) {
                var i = e.className.split(" "), t = i.indexOf(t);
                -1 !== t && (i.splice(t, 1), e.className = i.join(" "))
            }

            function E(e) {
                for (var t = e.childNodes, i = 0, n = t.length; i < n; i++) {
                    var r = t[i];
                    r.style && r.removeAttribute("style");
                    var o = r.attributes;
                    if (o) for (var s = o.length - 1; 0 <= s; s--) {
                        var a = o[s];
                        !0 === a.specified && r.removeAttribute(a.name)
                    }
                    E(r)
                }
            }

            function R(e) {
                var t;
                document.createRange && ((t = document.createRange()).selectNodeContents(e), t.collapse(!1), (e = window.getSelection()).removeAllRanges(), e.addRange(t))
            }

            function T(e) {
                var t;
                e && "DIV" === e.nodeName && window.getSelection && document.createRange && ((t = document.createRange()).selectNodeContents(e), (e = window.getSelection()).removeAllRanges(), e.addRange(t))
            }

            function _() {
                if (window.getSelection) {
                    var e = window.getSelection();
                    if (e.getRangeAt && e.rangeCount) return e.getRangeAt(0)
                }
                return null
            }

            function $(e) {
                var t;
                e && window.getSelection && ((t = window.getSelection()).removeAllRanges(), t.addRange(e))
            }

            function L() {
                var e = _();
                return e && "startOffset" in e && "endOffset" in e && e.startContainer && e.startContainer === e.endContainer ? {
                    startOffset: e.startOffset,
                    endOffset: e.endOffset,
                    container: e.startContainer.parentNode
                } : null
            }

            function B(e) {
                var t;
                document.createRange && window.getSelection && window.getSelection() && (t = document.createRange(), e.container.firstChild || e.container.appendChild(document.createTextNode("")), t.setStart(e.container.firstChild, e.startOffset), t.setEnd(e.container.firstChild, e.endOffset), $(t))
            }

            function W(e, t) {
                if (void 0 === t && (t = {
                    _text: "", flush: function () {
                        var e = this._text;
                        return this._text = "", e
                    }, set: function (e) {
                        this._text = e
                    }
                }), e.nodeValue) {
                    var i = e.nodeValue.replace(/(\b|^)\s*\n\s*(\b|$)/g, "");
                    return "" !== i ? t.flush() + i : ""
                }
                if (e.hasChildNodes()) {
                    for (var n = e.childNodes, r = "", o = 0, s = n.length; o < s; o++) {
                        var a, l = n[o];
                        "DIV" === l.nodeName || "P" === l.nodeName ? ((a = (a = n[o - 1]) ? a.nodeName : void 0) && "DIV" !== a && "P" !== a && "BR" !== a && ("" !== r && (r += "\n"), t.flush()), r += W(l, t), t.set("\n")) : "BR" === l.nodeName ? (r += t.flush(), t.set("\n")) : r += W(l, t)
                    }
                    return r
                }
                return ""
            }

            function N(e, t) {
                for (var i = e ? e.parentNode : void 0; i;) {
                    if (i === t) return !0;
                    i = i.parentNode
                }
                return !1
            }

            function G() {
                var e;
                return -1 === F && (e = -1, "undefined" != typeof navigator && "Microsoft Internet Explorer" === navigator.appName && (null != /MSIE ([0-9]+[.0-9]+)/.exec(navigator.userAgent) && (e = parseFloat(RegExp.$1))), F = e), F
            }

            var F = -1;

            function P() {
                return "undefined" != typeof navigator && -1 !== navigator.userAgent.indexOf("Firefox")
            }

            function H(e, t, i, n) {
                if (e.addEventListener) return void 0 === n && (n = !1), "mousewheel" === t && P() && (t = "DOMMouseScroll"), e.addEventListener(t, i, n), i;
                if (e.attachEvent) {
                    n = function () {
                        return i.call(e, window.event)
                    };
                    return e.attachEvent("on" + t, n), n
                }
            }

            function V(e, t, i, n) {
                e.removeEventListener ? (void 0 === n && (n = !1), "mousewheel" === t && P() && (t = "DOMMouseScroll"), e.removeEventListener(t, i, n)) : e.detachEvent && e.detachEvent("on" + t, i)
            }

            function Z(e, t) {
                for (var i = e.parentNode; i;) {
                    if (i === t) return !0;
                    i = i.parentNode
                }
                return !1
            }

            function M(i) {
                var e = [], n = 0;

                function t(e) {
                    for (var t = ""; void 0 !== i[n] && i[n] !== e;) t += i[n], n++;
                    if (i[n] !== e) throw new Error("Invalid JSON path: unexpected end, character " + e + " expected");
                    return t
                }

                for (; void 0 !== i[n];) if ("." === i[n]) n++, e.push(function () {
                    for (var e = ""; void 0 !== i[n] && /[\w$]/.test(i[n]);) e += i[n], n++;
                    if ("" === e) throw new Error("Invalid JSON path: property name expected at index " + n);
                    return e
                }()); else {
                    if ("[" !== i[n]) throw new Error('Invalid JSON path: unexpected character "' + i[n] + '" at index ' + n);
                    if ("'" === i[++n] || '"' === i[n]) {
                        var r = i[n];
                        if (n++, e.push(t(r)), i[n] !== r) throw new Error("Invalid JSON path: closing quote ' expected at index " + n);
                        n++
                    } else {
                        r = t("]").trim();
                        if (0 === r.length) throw new Error("Invalid JSON path: array value expected at index " + n);
                        r = "*" === r ? r : JSON.parse(r), e.push(r)
                    }
                    if ("]" !== i[n]) throw new Error("Invalid JSON path: closing bracket ] expected at index " + n);
                    n++
                }
                return e
            }

            function O(e) {
                return e.map(function (e) {
                    return "number" == typeof e ? "[" + e + "]" : "string" == typeof e && e.match(/^[A-Za-z0-9_$]+$/) ? "." + e : '["' + e + '"]'
                }).join("")
            }

            function D(e) {
                var t, i;
                return "enum" !== e.keyword || !Array.isArray(e.schema) || (i = e.schema) && (5 < (i = i.map(function (e) {
                    return JSON.stringify(e)
                })).length && (t = ["(" + (i.length - 5) + " more...)"], (i = i.slice(0, 5)).push(t)), e.message = "should be equal to one of: " + i.join(", ")), "additionalProperties" === e.keyword && (e.message = "should NOT have additional property: " + e.params.additionalProperty), e
            }

            function K(e) {
                return e && "function" == typeof e.then && "function" == typeof e.catch
            }

            function j(e) {
                return "object" === l(e) && Array.isArray(e.path) && "string" == typeof e.message
            }

            function z(e, t, i) {
                i = void 0 !== i ? i : 0;
                return t.left - i >= e.left && t.right + i <= e.right && t.top - i >= e.top && t.bottom + i <= e.bottom
            }

            function X(n, r, o) {
                var s;
                return function () {
                    var e = this, t = arguments, i = o && !s;
                    clearTimeout(s), s = setTimeout(function () {
                        s = null, o || n.apply(e, t)
                    }, r), i && n.apply(e, t)
                }
            }

            function J(e, t) {
                for (var i = t.length, n = 0, r = e.length, o = t.length; t.charAt(n) === e.charAt(n) && n < i;) n++;
                for (; t.charAt(o - 1) === e.charAt(r - 1) && n < o && 0 < r;) o--, r--;
                return {start: n, end: o}
            }

            function Y(t) {
                var e, i, n, r, o = 0, s = 0;
                return "number" == typeof t.selectionStart && "number" == typeof t.selectionEnd ? (o = t.selectionStart, s = t.selectionEnd) : (r = document.selection.createRange()) && r.parentElement() === t && (n = t.value.length, e = t.value.replace(/\r\n/g, "\n"), (i = t.createTextRange()).moveToBookmark(r.getBookmark()), (r = t.createTextRange()).collapse(!1), -1 < i.compareEndPoints("StartToEnd", r) ? o = s = n : (o = -i.moveStart("character", -n), o += e.slice(0, o).split("\n").length - 1, -1 < i.compareEndPoints("EndToEnd", r) ? s = n : (s = -i.moveEnd("character", -n), s += e.slice(0, s).split("\n").length - 1))), {
                    startIndex: o,
                    endIndex: s,
                    start: a(o),
                    end: a(s)
                };

                function a(e) {
                    e = t.value.substring(0, e);
                    return {row: (e.match(/\n/g) || []).length + 1, column: e.length - e.lastIndexOf("\n")}
                }
            }

            function U(e, t, i) {
                e = e.value || "";
                if (0 < t && 0 < i) {
                    e = e.split("\n", t);
                    t = Math.min(e.length, t), i = Math.min(e[t - 1].length, i - 1);
                    i = 1 === t ? i : i + 1;
                    return e.slice(0, t - 1).join("\n").length + i
                }
                return -1
            }

            function Q(e, t) {
                var i, n = [];
                if (!t || !t.length) return n;
                try {
                    i = s.parse(e)
                } catch (e) {
                    return n
                }
                return t.forEach(function (e) {
                    var t = q(M(e)), t = i.pointers[t];
                    t && n.push({
                        path: e,
                        line: t.key ? t.key.line : t.value ? t.value.line : 0,
                        column: t.key ? t.key.column : t.value ? t.value.column : 0
                    })
                }), n
            }

            function q(e) {
                return e.map(function (e) {
                    return "/" + String(e).replace(/~/g, "~0").replace(/\//g, "~1")
                }).join("")
            }

            function ee(e) {
                var t = document.createElement("div");
                return t.style.color = e, t.style.color.split(/\s+/).join("").toLowerCase() || null
            }

            function te(e) {
                return !!ee(e)
            }

            function ie(i, e) {
                if (!i) return "";
                var n = "";
                return i.title && (n += i.title), i.description && (0 < n.length && (n += "\n"), n += i.description), i.default && (0 < n.length && (n += "\n\n"), n += (0, a.Iu)("default", void 0, e) + "\n", n += JSON.stringify(i.default, null, 2)), Array.isArray(i.examples) && 0 < i.examples.length && (0 < n.length && (n += "\n\n"), n += (0, a.Iu)("examples", void 0, e) + "\n", i.examples.forEach(function (e, t) {
                    n += JSON.stringify(e, null, 2), t !== i.examples.length - 1 && (n += "\n")
                })), n
            }

            function ne(e, t) {
                for (var i = e, n = 0; n < t.length && null != i; n++) i = i[t[n]];
                return i
            }

            function re(e, t) {
                for (var i = e.replace(/ \(copy( \d+)?\)$/, ""), n = i, r = 1; -1 !== t.indexOf(n);) {
                    n = i + " (" + ("copy" + (1 < r ? " " + r : "")) + ")";
                    r++
                }
                return n
            }

            function oe(e, t) {
                var i = {};
                if (Array.isArray(e)) for (var n = Math.min(e.length, c), r = 0; r < n; r++) !function t(i, n, r, o) {
                    (Array.isArray(i) || ue(i)) && !o || (n[r || ""] = !0), ue(i) && Object.keys(i).forEach(function (e) {
                        t(i[e], n, r + "." + e, o)
                    })
                }(e[r], i, "", t); else i[""] = !0;
                return Object.keys(i).sort()
            }

            function se(e, t, i) {
                var n = t && "." !== t ? M(t) : [], r = "desc" === i ? -1 : 1, e = e.slice();
                return e.sort(function (e, t) {
                    e = ne(e, n), t = ne(t, n);
                    return r * (t < e ? 1 : e < t ? -1 : 0)
                }), e
            }

            function ae(t, e) {
                var i = "desc" === e ? -1 : 1, e = Object.keys(t).sort(function (e, t) {
                    return i * r()(e, t)
                }), n = {};
                return e.forEach(function (e) {
                    n[e] = t[e]
                }), n
            }

            function le(e) {
                if ("" === e) return "";
                var t = e.toLowerCase();
                if ("null" === t) return null;
                if ("true" === t) return !0;
                if ("false" === t) return !1;
                var i = Number(e), t = parseFloat(e);
                return isNaN(i) || isNaN(t) ? e : i
            }

            function ce(e, t) {
                return "number" == typeof t && h < t && isFinite(t) && Math.floor(t) === t && !isNaN(new Date(t).valueOf())
            }

            function he(e) {
                if (e < 900) return e.toFixed() + " B";
                e /= 1e3;
                if (e < 900) return e.toFixed(1) + " KB";
                e /= 1e3;
                if (e < 900) return e.toFixed(1) + " MB";
                e /= 1e3;
                return e < 900 ? e.toFixed(1) + " GB" : (e / 1e3).toFixed(1) + " TB"
            }

            function de(e, t) {
                return e.length <= t ? e : e.slice(0, t) + "..."
            }

            function ue(e) {
                return "object" === l(e) && null !== e && !Array.isArray(e)
            }

            function ge(e, t) {
                return -1 !== e.indexOf(t)
            }

            function pe(i, e) {
                if (!e && !i) return !1;
                if (e && !i || !e && i) return !0;
                if (e.length !== i.length) return !0;
                for (var t = 0; t < i.length; ++t) {
                    var n = function (t) {
                        if (!("error" === i[t].type ? e.find(function (e) {
                            return e.line === i[t].line
                        }) : e.find(function (e) {
                            return e.dataPath === i[t].dataPath && e.schemaPath === i[t].schemaPath
                        }))) return {
                            v: !0
                        }
                    }(t);
                    if ("object" === l(n)) return n.v
                }
                return !1
            }

            function me(e, t) {
                return Object.prototype.hasOwnProperty.call(e, t)
            }
        }, 8037: function (e, t, i) {
            var n;
            if (window.Picker) n = window.Picker; else try {
                n = i(4049)
            } catch (e) {
            }
            e.exports = n
        }, 6225: function (i, e, C) {
            i = C.nmd(i), function () {
                var e = function () {
                    return this
                }();
                e || "undefined" == typeof window || (e = window);
                var r = function (e, t, i) {
                    "string" == typeof e ? (2 == arguments.length && (i = t), r.modules[e] || (r.payloads[e] = i, r.modules[e] = null)) : r.original ? r.original.apply(this, arguments) : (console.error("dropping module because define wasn't a string."), console.trace())
                };
                r.modules = {}, r.payloads = {};

                function l(e, i) {
                    i = s(e, i);
                    var t, n = r.modules[i];
                    return n || ("function" == typeof (n = r.payloads[i]) && (e = {
                        id: i,
                        uri: "",
                        exports: t = {},
                        packaged: !0
                    }, t = n(function (e, t) {
                        return o(i, e, t)
                    }, t, e) || e.exports, r.modules[i] = t, delete r.payloads[i]), n = r.modules[i] = t || n), n
                }

                var t, i, o = function (e, t, i) {
                    if ("string" == typeof t) {
                        var n = l(e, t);
                        if (null != n) return i && i(), n
                    } else if ("[object Array]" === Object.prototype.toString.call(t)) {
                        for (var r = [], o = 0, s = t.length; o < s; ++o) {
                            var a = l(e, t[o]);
                            if (null == a && c.original) return;
                            r.push(a)
                        }
                        return i && i.apply(null, r) || !0
                    }
                }, c = function (e, t) {
                    var i = o("", e, t);
                    return null == i && c.original ? c.original.apply(this, arguments) : i
                }, s = function (e, t) {
                    if (-1 !== t.indexOf("!")) {
                        var i = t.split("!");
                        return s(e, i[0]) + "!" + s(e, i[1])
                    }
                    if ("." == t.charAt(0)) for (t = e.split("/").slice(0, -1).join("/") + "/" + t; -1 !== t.indexOf(".") && n != t;) {
                        var n = t;
                        t = t.replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, "")
                    }
                    return t
                };
                i = e, (t = "ace") && (e[t] || (e[t] = {}), i = e[t]), i.define && i.define.packaged || (r.original = i.define, i.define = r, i.define.packaged = !0), i.require && i.require.packaged || (c.original = i.require, i.require = c, i.require.packaged = !0)
            }(), ace.define("ace/lib/fixoldbrowsers", ["require", "exports", "module"], function (e, t, i) {
                "use strict";
                "undefined" == typeof Element || Element.prototype.remove || Object.defineProperty(Element.prototype, "remove", {
                    enumerable: !1,
                    writable: !0,
                    configurable: !0,
                    value: function () {
                        this.parentNode && this.parentNode.removeChild(this)
                    }
                })
            }), ace.define("ace/lib/useragent", ["require", "exports", "module"], function (e, t, i) {
                "use strict";
                t.OS = {LINUX: "LINUX", MAC: "MAC", WINDOWS: "WINDOWS"}, t.getOS = function () {
                    return t.isMac ? t.OS.MAC : t.isLinux ? t.OS.LINUX : t.OS.WINDOWS
                };
                var n = "object" == typeof navigator ? navigator : {},
                    r = (/mac|win|linux/i.exec(n.platform) || ["other"])[0].toLowerCase(), o = n.userAgent || "",
                    n = n.appName || "";
                t.isWin = "win" == r, t.isMac = "mac" == r, t.isLinux = "linux" == r, t.isIE = "Microsoft Internet Explorer" == n || 0 <= n.indexOf("MSAppHost") ? parseFloat((o.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/) || [])[1]) : parseFloat((o.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/) || [])[1]), t.isOldIE = t.isIE && t.isIE < 9, t.isGecko = t.isMozilla = o.match(/ Gecko\/\d+/), t.isOpera = "object" == typeof opera && "[object Opera]" == Object.prototype.toString.call(window.opera), t.isWebKit = parseFloat(o.split("WebKit/")[1]) || void 0, t.isChrome = parseFloat(o.split(" Chrome/")[1]) || void 0, t.isEdge = parseFloat(o.split(" Edge/")[1]) || void 0, t.isAIR = 0 <= o.indexOf("AdobeAIR"), t.isAndroid = 0 <= o.indexOf("Android"), t.isChromeOS = 0 <= o.indexOf(" CrOS "), t.isIOS = /iPad|iPhone|iPod/.test(o) && !window.MSStream, t.isIOS && (t.isMac = !0), t.isMobile = t.isIOS || t.isAndroid
            }), ace.define("ace/lib/dom", ["require", "exports", "module", "ace/lib/useragent"], function (e, o, t) {
                "use strict";
                var i = e("./useragent");
                o.buildDom = function e(t, i, n) {
                    if ("string" == typeof t && t) {
                        var r = document.createTextNode(t);
                        return i && i.appendChild(r), r
                    }
                    if (!Array.isArray(t)) return t && t.appendChild && i && i.appendChild(t), t;
                    if ("string" != typeof t[0] || !t[0]) {
                        for (var o = [], s = 0; s < t.length; s++) {
                            var a = e(t[s], i, n);
                            a && o.push(a)
                        }
                        return o
                    }
                    for (var l = document.createElement(t[0]), c = t[1], r = 1, s = r = c && "object" == typeof c && !Array.isArray(c) ? 2 : r; s < t.length; s++) e(t[s], l, n);
                    return 2 == r && Object.keys(c).forEach(function (e) {
                        var t = c[e];
                        "class" === e ? l.className = Array.isArray(t) ? t.join(" ") : t : "function" == typeof t || "value" == e || "$" == e[0] ? l[e] = t : "ref" === e ? n && (n[t] = l) : null != t && l.setAttribute(e, t)
                    }), i && i.appendChild(l), l
                }, o.getDocumentHead = function (e) {
                    return (e = e || document).head || e.getElementsByTagName("head")[0] || e.documentElement
                }, o.createElement = function (e, t) {
                    return document.createElementNS ? document.createElementNS(t || "http://www.w3.org/1999/xhtml", e) : document.createElement(e)
                }, o.removeChildren = function (e) {
                    e.innerHTML = ""
                }, o.createTextNode = function (e, t) {
                    return (t ? t.ownerDocument : document).createTextNode(e)
                }, o.createFragment = function (e) {
                    return (e ? e.ownerDocument : document).createDocumentFragment()
                }, o.hasCssClass = function (e, t) {
                    return -1 !== (e.className + "").split(/\s+/g).indexOf(t)
                }, o.addCssClass = function (e, t) {
                    o.hasCssClass(e, t) || (e.className += " " + t)
                }, o.removeCssClass = function (e, t) {
                    for (var i = e.className.split(/\s+/g); ;) {
                        var n = i.indexOf(t);
                        if (-1 == n) break;
                        i.splice(n, 1)
                    }
                    e.className = i.join(" ")
                }, o.toggleCssClass = function (e, t) {
                    for (var i = e.className.split(/\s+/g), n = !0; ;) {
                        var r = i.indexOf(t);
                        if (-1 == r) break;
                        n = !1, i.splice(r, 1)
                    }
                    return n && i.push(t), e.className = i.join(" "), n
                }, o.setCssClass = function (e, t, i) {
                    i ? o.addCssClass(e, t) : o.removeCssClass(e, t)
                }, o.hasCssString = function (e, t) {
                    var i, n = 0;
                    if (i = (t = t || document).querySelectorAll("style")) for (; n < i.length;) if (i[n++].id === e) return !0
                }, o.importCssString = function (e, t, i) {
                    var n = i,
                        r = (n = !(i && i.getRootNode && (n = i.getRootNode()) && n != i) ? document : n).ownerDocument || n;
                    if (t && o.hasCssString(t, n)) return null;
                    t && (e += "\n/*# sourceURL=ace/css/" + t + " */");
                    i = o.createElement("style");
                    i.appendChild(r.createTextNode(e)), t && (i.id = t), (n = n == r ? o.getDocumentHead(r) : n).insertBefore(i, n.firstChild)
                }, o.importCssStylsheet = function (e, t) {
                    o.buildDom(["link", {rel: "stylesheet", href: e}], o.getDocumentHead(t))
                }, o.scrollbarWidth = function (e) {
                    var t = o.createElement("ace_inner");
                    t.style.width = "100%", t.style.minWidth = "0px", t.style.height = "200px", t.style.display = "block";
                    var i = o.createElement("ace_outer"), n = i.style;
                    n.position = "absolute", n.left = "-10000px", n.overflow = "hidden", n.width = "200px", n.minWidth = "0px", n.height = "150px", n.display = "block", i.appendChild(t);
                    var r = e.documentElement;
                    r.appendChild(i);
                    e = t.offsetWidth;
                    n.overflow = "scroll";
                    t = t.offsetWidth;
                    return e == t && (t = i.clientWidth), r.removeChild(i), e - t
                }, "undefined" == typeof document && (o.importCssString = function () {
                }), o.computedStyle = function (e, t) {
                    return window.getComputedStyle(e, "") || {}
                }, o.setStyle = function (e, t, i) {
                    e[t] !== i && (e[t] = i)
                }, o.HAS_CSS_ANIMATION = !1, o.HAS_CSS_TRANSFORMS = !1, o.HI_DPI = !i.isWin || "undefined" != typeof window && 1.5 <= window.devicePixelRatio, "undefined" != typeof document && (e = document.createElement("div"), o.HI_DPI && void 0 !== e.style.transform && (o.HAS_CSS_TRANSFORMS = !0), i.isEdge || void 0 === e.style.animationName || (o.HAS_CSS_ANIMATION = !0), e = null), o.HAS_CSS_TRANSFORMS ? o.translate = function (e, t, i) {
                    e.style.transform = "translate(" + Math.round(t) + "px, " + Math.round(i) + "px)"
                } : o.translate = function (e, t, i) {
                    e.style.top = Math.round(i) + "px", e.style.left = Math.round(t) + "px"
                }
            }), ace.define("ace/lib/oop", ["require", "exports", "module"], function (e, i, t) {
                "use strict";
                i.inherits = function (e, t) {
                    e.super_ = t, e.prototype = Object.create(t.prototype, {
                        constructor: {
                            value: e,
                            enumerable: !1,
                            writable: !0,
                            configurable: !0
                        }
                    })
                }, i.mixin = function (e, t) {
                    for (var i in t) e[i] = t[i];
                    return e
                }, i.implement = function (e, t) {
                    i.mixin(e, t)
                }
            }), ace.define("ace/lib/keys", ["require", "exports", "module", "ace/lib/oop"], function (e, t, i) {
                "use strict";
                var n = e("./oop"), r = function () {
                    var e, t, i = {
                        MODIFIER_KEYS: {
                            16: "Shift",
                            17: "Ctrl",
                            18: "Alt",
                            224: "Meta",
                            91: "MetaLeft",
                            92: "MetaRight",
                            93: "ContextMenu"
                        },
                        KEY_MODS: {
                            ctrl: 1,
                            alt: 2,
                            option: 2,
                            shift: 4,
                            super: 8,
                            meta: 8,
                            command: 8,
                            cmd: 8,
                            control: 1
                        },
                        FUNCTION_KEYS: {
                            8: "Backspace",
                            9: "Tab",
                            13: "Return",
                            19: "Pause",
                            27: "Esc",
                            32: "Space",
                            33: "PageUp",
                            34: "PageDown",
                            35: "End",
                            36: "Home",
                            37: "Left",
                            38: "Up",
                            39: "Right",
                            40: "Down",
                            44: "Print",
                            45: "Insert",
                            46: "Delete",
                            96: "Numpad0",
                            97: "Numpad1",
                            98: "Numpad2",
                            99: "Numpad3",
                            100: "Numpad4",
                            101: "Numpad5",
                            102: "Numpad6",
                            103: "Numpad7",
                            104: "Numpad8",
                            105: "Numpad9",
                            "-13": "NumpadEnter",
                            112: "F1",
                            113: "F2",
                            114: "F3",
                            115: "F4",
                            116: "F5",
                            117: "F6",
                            118: "F7",
                            119: "F8",
                            120: "F9",
                            121: "F10",
                            122: "F11",
                            123: "F12",
                            144: "Numlock",
                            145: "Scrolllock"
                        },
                        PRINTABLE_KEYS: {
                            32: " ",
                            48: "0",
                            49: "1",
                            50: "2",
                            51: "3",
                            52: "4",
                            53: "5",
                            54: "6",
                            55: "7",
                            56: "8",
                            57: "9",
                            59: ";",
                            61: "=",
                            65: "a",
                            66: "b",
                            67: "c",
                            68: "d",
                            69: "e",
                            70: "f",
                            71: "g",
                            72: "h",
                            73: "i",
                            74: "j",
                            75: "k",
                            76: "l",
                            77: "m",
                            78: "n",
                            79: "o",
                            80: "p",
                            81: "q",
                            82: "r",
                            83: "s",
                            84: "t",
                            85: "u",
                            86: "v",
                            87: "w",
                            88: "x",
                            89: "y",
                            90: "z",
                            107: "+",
                            109: "-",
                            110: ".",
                            186: ";",
                            187: "=",
                            188: ",",
                            189: "-",
                            190: ".",
                            191: "/",
                            192: "`",
                            219: "[",
                            220: "\\",
                            221: "]",
                            222: "'",
                            111: "/",
                            106: "*"
                        }
                    };
                    for (t in i.FUNCTION_KEYS) e = i.FUNCTION_KEYS[t].toLowerCase(), i[e] = parseInt(t, 10);
                    for (t in i.PRINTABLE_KEYS) e = i.PRINTABLE_KEYS[t].toLowerCase(), i[e] = parseInt(t, 10);
                    return n.mixin(i, i.MODIFIER_KEYS), n.mixin(i, i.PRINTABLE_KEYS), n.mixin(i, i.FUNCTION_KEYS), i.enter = i.return, i.escape = i.esc, i.del = i.delete, i[173] = "-", function () {
                        for (var e = ["cmd", "ctrl", "alt", "shift"], t = Math.pow(2, e.length); t--;) i.KEY_MODS[t] = e.filter(function (e) {
                            return t & i.KEY_MODS[e]
                        }).join("-") + "-"
                    }(), i.KEY_MODS[0] = "", i.KEY_MODS[-1] = "input-", i
                }();
                n.mixin(t, r), t.keyCodeToString = function (e) {
                    var t = r[e];
                    return (t = "string" != typeof t ? String.fromCharCode(e) : t).toLowerCase()
                }
            }), ace.define("ace/lib/event", ["require", "exports", "module", "ace/lib/keys", "ace/lib/useragent"], function (e, d, t) {
                "use strict";
                var i, o = e("./keys"), u = e("./useragent"), s = null, a = 0;

                function r() {
                    return null == i && function () {
                        i = !1;
                        try {
                            document.createComment("").addEventListener("test", function () {
                            }, {
                                get passive() {
                                    i = {passive: !1}
                                }
                            })
                        } catch (e) {
                        }
                    }(), i
                }

                function l(e, t, i) {
                    this.elem = e, this.type = t, this.callback = i
                }

                l.prototype.destroy = function () {
                    c(this.elem, this.type, this.callback), this.elem = this.type = this.callback = void 0
                };
                var g = d.addListener = function (e, t, i, n) {
                    e.addEventListener(t, i, r()), n && n.$toDestroy.push(new l(e, t, i))
                }, c = d.removeListener = function (e, t, i) {
                    e.removeEventListener(t, i, r())
                };
                d.stopEvent = function (e) {
                    return d.stopPropagation(e), d.preventDefault(e), !1
                }, d.stopPropagation = function (e) {
                    e.stopPropagation && e.stopPropagation()
                }, d.preventDefault = function (e) {
                    e.preventDefault && e.preventDefault()
                }, d.getButton = function (e) {
                    return "dblclick" == e.type ? 0 : "contextmenu" == e.type || u.isMac && e.ctrlKey && !e.altKey && !e.shiftKey ? 2 : e.button
                }, d.capture = function (e, t, i) {
                    var n = e && e.ownerDocument || document;

                    function r(e) {
                        t && t(e), i && i(e), c(n, "mousemove", t), c(n, "mouseup", r), c(n, "dragstart", r)
                    }

                    return g(n, "mousemove", t), g(n, "mouseup", r), g(n, "dragstart", r), r
                }, d.addMouseWheelListener = function (e, t, i) {
                    "onmousewheel" in e ? g(e, "mousewheel", function (e) {
                        void 0 !== e.wheelDeltaX ? (e.wheelX = -e.wheelDeltaX / 8, e.wheelY = -e.wheelDeltaY / 8) : (e.wheelX = 0, e.wheelY = -e.wheelDelta / 8), t(e)
                    }, i) : "onwheel" in e ? g(e, "wheel", function (e) {
                        switch (e.deltaMode) {
                            case e.DOM_DELTA_PIXEL:
                                e.wheelX = .35 * e.deltaX || 0, e.wheelY = .35 * e.deltaY || 0;
                                break;
                            case e.DOM_DELTA_LINE:
                            case e.DOM_DELTA_PAGE:
                                e.wheelX = 5 * (e.deltaX || 0), e.wheelY = 5 * (e.deltaY || 0)
                        }
                        t(e)
                    }, i) : g(e, "DOMMouseScroll", function (e) {
                        e.axis && e.axis == e.HORIZONTAL_AXIS ? (e.wheelX = 5 * (e.detail || 0), e.wheelY = 0) : (e.wheelX = 0, e.wheelY = 5 * (e.detail || 0)), t(e)
                    }, i)
                }, d.addMultiMouseDownListener = function (e, i, n, r, t) {
                    var o, s, a, l = 0, c = {2: "dblclick", 3: "tripleclick", 4: "quadclick"};

                    function h(e) {
                        var t;
                        if (0 !== d.getButton(e) ? l = 0 : 1 < e.detail && !(4 < ++l) || (l = 1), u.isIE && (t = 5 < Math.abs(e.clientX - o) || 5 < Math.abs(e.clientY - s), a && !t || (l = 1), a && clearTimeout(a), a = setTimeout(function () {
                            a = null
                        }, i[l - 1] || 600), 1 == l && (o = e.clientX, s = e.clientY)), e._clicks = l, n[r]("mousedown", e), 4 < l) l = 0; else if (1 < l) return n[r](c[l], e)
                    }

                    (e = !Array.isArray(e) ? [e] : e).forEach(function (e) {
                        g(e, "mousedown", h, t)
                    })
                };

                function h(e) {
                    return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0)
                }

                var p;

                function m(e, t, i) {
                    var n = h(t);
                    if (!u.isMac && s) {
                        if (t.getModifierState && (t.getModifierState("OS") || t.getModifierState("Win")) && (n |= 8), s.altGr) {
                            if (3 == (3 & n)) return;
                            s.altGr = 0
                        }
                        18 !== i && 17 !== i || (r = "location" in t ? t.location : t.keyLocation, 17 === i && 1 === r ? 1 == s[i] && (a = t.timeStamp) : 18 === i && 3 === n && 2 === r && t.timeStamp - a < 50 && (s.altGr = !0))
                    }
                    if (i in o.MODIFIER_KEYS && (i = -1), !n && 13 === i) {
                        var r = "location" in t ? t.location : t.keyLocation;
                        if (3 === r && (e(t, n, -i), t.defaultPrevented)) return
                    }
                    if (u.isChromeOS && 8 & n) {
                        if (e(t, n, i), t.defaultPrevented) return;
                        n &= -9
                    }
                    return !!(n || i in o.FUNCTION_KEYS || i in o.PRINTABLE_KEYS) && e(t, n, i)
                }

                function f() {
                    s = Object.create(null)
                }

                d.getModifierString = function (e) {
                    return o.KEY_MODS[h(e)]
                }, d.addCommandKeyListener = function (e, i, t) {
                    var n, r;
                    u.isOldGecko || u.isOpera && !("KeyboardEvent" in window) ? (n = null, g(e, "keydown", function (e) {
                        n = e.keyCode
                    }, t), g(e, "keypress", function (e) {
                        return m(i, e, n)
                    }, t)) : (r = null, g(e, "keydown", function (e) {
                        s[e.keyCode] = (s[e.keyCode] || 0) + 1;
                        var t = m(i, e, e.keyCode);
                        return r = e.defaultPrevented, t
                    }, t), g(e, "keypress", function (e) {
                        r && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) && (d.stopEvent(e), r = null)
                    }, t), g(e, "keyup", function (e) {
                        s[e.keyCode] = null
                    }, t), s || (f(), g(window, "focus", f)))
                }, "object" == typeof window && window.postMessage && !u.isOldIE && (p = 1, d.nextTick = function (t, i) {
                    i = i || window;

                    function n(e) {
                        e.data == r && (d.stopPropagation(e), c(i, "message", n), t())
                    }

                    var r = "zero-timeout-message-" + p++;
                    g(i, "message", n), i.postMessage(r, "*")
                }), d.$idleBlocked = !1, d.onIdle = function (t, e) {
                    return setTimeout(function e() {
                        d.$idleBlocked ? setTimeout(e, 100) : t()
                    }, e)
                }, d.$idleBlockId = null, d.blockIdle = function (e) {
                    d.$idleBlockId && clearTimeout(d.$idleBlockId), d.$idleBlocked = !0, d.$idleBlockId = setTimeout(function () {
                        d.$idleBlocked = !1
                    }, e || 100)
                }, d.nextFrame = "object" == typeof window && (window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame || window.oRequestAnimationFrame), d.nextFrame ? d.nextFrame = d.nextFrame.bind(window) : d.nextFrame = function (e) {
                    setTimeout(e, 17)
                }
            }), ace.define("ace/range", ["require", "exports", "module"], function (e, t, i) {
                "use strict";

                function o(e, t, i, n) {
                    this.start = {row: e, column: t}, this.end = {row: i, column: n}
                }

                !function () {
                    this.isEqual = function (e) {
                        return this.start.row === e.start.row && this.end.row === e.end.row && this.start.column === e.start.column && this.end.column === e.end.column
                    }, this.toString = function () {
                        return "Range: [" + this.start.row + "/" + this.start.column + "] -> [" + this.end.row + "/" + this.end.column + "]"
                    }, this.contains = function (e, t) {
                        return 0 == this.compare(e, t)
                    }, this.compareRange = function (e) {
                        var t = e.end, e = e.start, t = this.compare(t.row, t.column);
                        return 1 == t ? 1 == (t = this.compare(e.row, e.column)) ? 2 : 0 == t ? 1 : 0 : -1 == t ? -2 : -1 == (t = this.compare(e.row, e.column)) ? -1 : 1 == t ? 42 : 0
                    }, this.comparePoint = function (e) {
                        return this.compare(e.row, e.column)
                    }, this.containsRange = function (e) {
                        return 0 == this.comparePoint(e.start) && 0 == this.comparePoint(e.end)
                    }, this.intersects = function (e) {
                        e = this.compareRange(e);
                        return -1 == e || 0 == e || 1 == e
                    }, this.isEnd = function (e, t) {
                        return this.end.row == e && this.end.column == t
                    }, this.isStart = function (e, t) {
                        return this.start.row == e && this.start.column == t
                    }, this.setStart = function (e, t) {
                        "object" == typeof e ? (this.start.column = e.column, this.start.row = e.row) : (this.start.row = e, this.start.column = t)
                    }, this.setEnd = function (e, t) {
                        "object" == typeof e ? (this.end.column = e.column, this.end.row = e.row) : (this.end.row = e, this.end.column = t)
                    }, this.inside = function (e, t) {
                        return 0 == this.compare(e, t) && (!this.isEnd(e, t) && !this.isStart(e, t))
                    }, this.insideStart = function (e, t) {
                        return 0 == this.compare(e, t) && !this.isEnd(e, t)
                    }, this.insideEnd = function (e, t) {
                        return 0 == this.compare(e, t) && !this.isStart(e, t)
                    }, this.compare = function (e, t) {
                        return this.isMultiLine() || e !== this.start.row ? e < this.start.row ? -1 : e > this.end.row ? 1 : this.start.row === e ? t >= this.start.column ? 0 : -1 : this.end.row !== e || t <= this.end.column ? 0 : 1 : t < this.start.column ? -1 : t > this.end.column ? 1 : 0
                    }, this.compareStart = function (e, t) {
                        return this.start.row == e && this.start.column == t ? -1 : this.compare(e, t)
                    }, this.compareEnd = function (e, t) {
                        return this.end.row == e && this.end.column == t ? 1 : this.compare(e, t)
                    }, this.compareInside = function (e, t) {
                        return this.end.row == e && this.end.column == t ? 1 : this.start.row == e && this.start.column == t ? -1 : this.compare(e, t)
                    }, this.clipRows = function (e, t) {
                        var i, n;
                        return this.end.row > t ? i = {row: t + 1, column: 0} : this.end.row < e && (i = {
                            row: e,
                            column: 0
                        }), this.start.row > t ? n = {row: t + 1, column: 0} : this.start.row < e && (n = {
                            row: e,
                            column: 0
                        }), o.fromPoints(n || this.start, i || this.end)
                    }, this.extend = function (e, t) {
                        var i, n, r = this.compare(e, t);
                        return 0 == r ? this : (-1 == r ? i = {row: e, column: t} : n = {
                            row: e,
                            column: t
                        }, o.fromPoints(i || this.start, n || this.end))
                    }, this.isEmpty = function () {
                        return this.start.row === this.end.row && this.start.column === this.end.column
                    }, this.isMultiLine = function () {
                        return this.start.row !== this.end.row
                    }, this.clone = function () {
                        return o.fromPoints(this.start, this.end)
                    }, this.collapseRows = function () {
                        return 0 == this.end.column ? new o(this.start.row, 0, Math.max(this.start.row, this.end.row - 1), 0) : new o(this.start.row, 0, this.end.row, 0)
                    }, this.toScreenRange = function (e) {
                        var t = e.documentToScreenPosition(this.start), e = e.documentToScreenPosition(this.end);
                        return new o(t.row, t.column, e.row, e.column)
                    }, this.moveBy = function (e, t) {
                        this.start.row += e, this.start.column += t, this.end.row += e, this.end.column += t
                    }
                }.call(o.prototype), o.fromPoints = function (e, t) {
                    return new o(e.row, e.column, t.row, t.column)
                }, o.comparePoints = function (e, t) {
                    return e.row - t.row || e.column - t.column
                }, o.comparePoints = function (e, t) {
                    return e.row - t.row || e.column - t.column
                }, t.Range = o
            }), ace.define("ace/lib/lang", ["require", "exports", "module"], function (e, t, i) {
                "use strict";
                t.last = function (e) {
                    return e[e.length - 1]
                }, t.stringReverse = function (e) {
                    return e.split("").reverse().join("")
                }, t.stringRepeat = function (e, t) {
                    for (var i = ""; 0 < t;) 1 & t && (i += e), (t >>= 1) && (e += e);
                    return i
                };
                var n = /^\s\s*/, r = /\s\s*$/;
                t.stringTrimLeft = function (e) {
                    return e.replace(n, "")
                }, t.stringTrimRight = function (e) {
                    return e.replace(r, "")
                }, t.copyObject = function (e) {
                    var t, i = {};
                    for (t in e) i[t] = e[t];
                    return i
                }, t.copyArray = function (e) {
                    for (var t = [], i = 0, n = e.length; i < n; i++) e[i] && "object" == typeof e[i] ? t[i] = this.copyObject(e[i]) : t[i] = e[i];
                    return t
                }, t.deepCopy = function e(t) {
                    if ("object" != typeof t || !t) return t;
                    if (Array.isArray(t)) {
                        for (var i = [], n = 0; n < t.length; n++) i[n] = e(t[n]);
                        return i
                    }
                    if ("[object Object]" !== Object.prototype.toString.call(t)) return t;
                    for (n in i = {}, t) i[n] = e(t[n]);
                    return i
                }, t.arrayToMap = function (e) {
                    for (var t = {}, i = 0; i < e.length; i++) t[e[i]] = 1;
                    return t
                }, t.createMap = function (e) {
                    var t, i = Object.create(null);
                    for (t in e) i[t] = e[t];
                    return i
                }, t.arrayRemove = function (e, t) {
                    for (var i = 0; i <= e.length; i++) t === e[i] && e.splice(i, 1)
                }, t.escapeRegExp = function (e) {
                    return e.replace(/([.*+?^${}()|[\]\/\\])/g, "\\$1")
                }, t.escapeHTML = function (e) {
                    return ("" + e).replace(/&/g, "&#38;").replace(/"/g, "&#34;").replace(/'/g, "&#39;").replace(/</g, "&#60;")
                }, t.getMatchOffsets = function (e, t) {
                    var i = [];
                    return e.replace(t, function (e) {
                        i.push({offset: arguments[arguments.length - 2], length: e.length})
                    }), i
                }, t.deferredCall = function (e) {
                    function t() {
                        n = null, e()
                    }

                    function i(e) {
                        return i.cancel(), n = setTimeout(t, e || 0), i
                    }

                    var n = null;
                    return (i.schedule = i).call = function () {
                        return this.cancel(), e(), i
                    }, i.cancel = function () {
                        return clearTimeout(n), n = null, i
                    }, i.isPending = function () {
                        return n
                    }, i
                }, t.delayedCall = function (e, t) {
                    function i() {
                        r = null, e()
                    }

                    function n(e) {
                        null == r && (r = setTimeout(i, e || t))
                    }

                    var r = null;
                    return n.delay = function (e) {
                        r && clearTimeout(r), r = setTimeout(i, e || t)
                    }, (n.schedule = n).call = function () {
                        this.cancel(), e()
                    }, n.cancel = function () {
                        r && clearTimeout(r), r = null
                    }, n.isPending = function () {
                        return r
                    }, n
                }
            }), ace.define("ace/clipboard", ["require", "exports", "module"], function (e, t, i) {
                "use strict";
                var n;
                i.exports = {
                    lineMode: !1, pasteCancelled: function () {
                        return !!(n && n > Date.now() - 50) || (n = !1)
                    }, cancel: function () {
                        n = Date.now()
                    }
                }
            }), ace.define("ace/keyboard/textinput", ["require", "exports", "module", "ace/lib/event", "ace/lib/useragent", "ace/lib/dom", "ace/lib/lang", "ace/clipboard", "ace/lib/keys"], function (e, t, i) {
                "use strict";
                var L = e("../lib/event"), B = e("../lib/useragent"), W = e("../lib/dom"), N = e("../lib/lang"),
                    G = e("../clipboard"), F = B.isChrome < 18, P = B.isIE, H = 63 < B.isChrome, V = e("../lib/keys"),
                    Z = V.KEY_MODS, M = B.isIOS, O = M ? /\s/ : /\n/, D = B.isMobile;
                t.TextInput = function (e, d) {
                    var u = W.createElement("textarea");
                    u.className = "ace_text-input", u.setAttribute("wrap", "off"), u.setAttribute("autocorrect", "off"), u.setAttribute("autocapitalize", "off"), u.setAttribute("spellcheck", !1), u.style.opacity = "0", e.insertBefore(u, e.firstChild);
                    var l = !1, g = !1, c = !1, p = !1, s = "";
                    D || (u.style.fontSize = "1px");
                    var m = !1, t = !1, f = "", C = 0, I = 0, v = 0;
                    try {
                        var a = document.activeElement === u
                    } catch (e) {
                    }
                    L.addListener(u, "blur", function (e) {
                        t || (d.onBlur(e), a = !1)
                    }, d), L.addListener(u, "focus", function (e) {
                        if (!t) {
                            if (a = !0, B.isEdge) try {
                                if (!document.hasFocus()) return
                            } catch (e) {
                            }
                            d.onFocus(e), B.isEdge ? setTimeout(A) : A()
                        }
                    }, d), this.$focusScroll = !1, this.focus = function () {
                        if (s || H || "browser" == this.$focusScroll) return u.focus({preventScroll: !0});
                        var e = u.style.top;
                        u.style.position = "fixed", u.style.top = "0px";
                        try {
                            var t = 0 != u.getBoundingClientRect().top
                        } catch (e) {
                            return
                        }
                        var i = [];
                        if (t) for (var n = u.parentElement; n && 1 == n.nodeType;) i.push(n), n.setAttribute("ace_nocontext", !0), n = !n.parentElement && n.getRootNode ? n.getRootNode().host : n.parentElement;
                        u.focus({preventScroll: !0}), t && i.forEach(function (e) {
                            e.removeAttribute("ace_nocontext")
                        }), setTimeout(function () {
                            u.style.position = "", "0px" == u.style.top && (u.style.top = e)
                        }, 0)
                    }, this.blur = function () {
                        u.blur()
                    }, this.isFocused = function () {
                        return a
                    }, d.on("beforeEndOperation", function () {
                        var e = d.curOp, t = e && e.command && e.command.name;
                        "insertstring" != t && (e = t && (e.docChanged || e.selectionChanged), c && e && (f = u.value = "", E()), A())
                    });
                    var A = M ? function (e) {
                        var t;
                        !a || l && !e || p || ((t = "\n ab" + (e = e || "") + "cde fg\n") != u.value && (u.value = f = t), e = 4 + (e.length || (d.selection.isEmpty() ? 0 : 1)), 4 == C && I == e || u.setSelectionRange(4, e), C = 4, I = e)
                    } : function () {
                        if (!c && !p && (a || b)) {
                            c = !0;
                            var e, t, i, n = 0, r = 0, o = "";
                            d.session && (e = (t = d.selection).getRange(), t = t.cursor.row, n = e.start.column, r = e.end.column, o = d.session.getLine(t), e.start.row != t ? (i = d.session.getLine(t - 1), n = e.start.row < t - 1 ? 0 : n, r += i.length + 1, o = i + "\n" + o) : e.end.row != t ? (i = d.session.getLine(t + 1), r = e.end.row > t + 1 ? i.length : r, r += o.length + 1, o = o + "\n" + i) : D && 0 < t && (o = "\n" + o, r += 1, n += 1), 400 < o.length && (n < 400 && r < 400 ? o = o.slice(0, 400) : (o = "\n", n == r ? n = r = 0 : (n = 0, r = 1))));
                            o = o + "\n\n";
                            if (o != f && (u.value = f = o, C = I = o.length), b && (C = u.selectionStart, I = u.selectionEnd), I != r || C != n || u.selectionEnd != I) try {
                                u.setSelectionRange(n, r), C = n, I = r
                            } catch (e) {
                            }
                            c = !1
                        }
                    };
                    this.resetSelection = A, a && d.onFocus();
                    var i = function (e) {
                        return 0 === e.selectionStart && e.selectionEnd >= f.length && e.value === f && f && e.selectionEnd !== I
                    }, n = null;
                    this.setInputHandler = function (e) {
                        n = e
                    };

                    function r(e) {
                        x(e, !0)
                    }

                    function o(e) {
                        x(e, !1)
                    }

                    function h(e) {
                        var t = S(e);
                        G.pasteCancelled() || ("string" == typeof t ? (t && d.onPaste(t, e), B.isIE && setTimeout(A), L.preventDefault(e)) : (u.value = "", g = !0))
                    }

                    var b = !(this.getInputHandler = function () {
                        return n
                    }), y = function (e, t) {
                        if (b = b && !1, g) return A(), e && d.onPaste(e), g = !1, "";
                        for (var i = u.selectionStart, n = u.selectionEnd, r = C, o = f.length - I, s = e, a = e.length - i, l = e.length - n, c = 0; 0 < r && f[c] == e[c];) c++, r--;
                        for (s = s.slice(c), c = 1; 0 < o && f.length - c > C - 1 && f[f.length - c] == e[e.length - c];) c++, o--;
                        a -= c - 1, l -= c - 1;
                        var h = s.length - c + 1;
                        if (h < 0 && (r = -h, h = 0), s = s.slice(0, h), !(t || s || a || r || o || l)) return "";
                        t = !(p = !0);
                        return B.isAndroid && ". " == s && (s = "  ", t = !0), s && !r && !o && !a && !l || m ? d.onTextInput(s) : d.onTextInput(s, {
                            extendLeft: r,
                            extendRight: o,
                            restoreStart: a,
                            restoreEnd: l
                        }), p = !1, f = e, C = i, I = n, v = l, t ? "\n" : s
                    }, w = function (e) {
                        if (c) return k();
                        if (e && e.inputType) {
                            if ("historyUndo" == e.inputType) return d.execCommand("undo");
                            if ("historyRedo" == e.inputType) return d.execCommand("redo")
                        }
                        var t = u.value, e = y(t, !0);
                        (500 < t.length || O.test(e) || D && C < 1 && C == I) && A()
                    }, S = function (e, t, i) {
                        var n = e.clipboardData || window.clipboardData;
                        if (n && !F) {
                            var r = P || i ? "Text" : "text/plain";
                            try {
                                return t ? !1 !== n.setData(r, t) : n.getData(r)
                            } catch (e) {
                                if (!i) return S(e, t, !0)
                            }
                        }
                    }, x = function (e, t) {
                        var i = d.getCopyText();
                        if (!i) return L.preventDefault(e);
                        S(e, i) ? (M && (A(i), l = i, setTimeout(function () {
                            l = !1
                        }, 10)), t ? d.onCut() : d.onCopy(), L.preventDefault(e)) : (l = !0, u.value = i, u.select(), setTimeout(function () {
                            l = !1, A(), t ? d.onCut() : d.onCopy()
                        }))
                    };
                    L.addCommandKeyListener(u, d.onCommandKey.bind(d), d), L.addListener(u, "select", function (e) {
                        c || (l ? l = !1 : i(u) ? (d.selectAll(), A()) : D && u.selectionStart != C && A())
                    }, d), L.addListener(u, "input", w, d), L.addListener(u, "cut", r, d), L.addListener(u, "copy", o, d), L.addListener(u, "paste", h, d), "oncut" in u && "oncopy" in u && "onpaste" in u || L.addListener(e, "keydown", function (e) {
                        if ((!B.isMac || e.metaKey) && e.ctrlKey) switch (e.keyCode) {
                            case 67:
                                o(e);
                                break;
                            case 86:
                                h(e);
                                break;
                            case 88:
                                r(e)
                        }
                    }, d);
                    var k = function () {
                        var e;
                        if (c && d.onCompositionUpdate && !d.$readOnly) return m ? R() : void (c.useTextareaForIME ? d.onCompositionUpdate(u.value) : (e = u.value, y(e), c.markerRange && (c.context && (c.markerRange.start.column = c.selectionStart = c.context.compositionStartOffset), c.markerRange.end.column = c.markerRange.start.column + I - c.selectionStart + v)))
                    }, E = function (e) {
                        d.onCompositionEnd && !d.$readOnly && (c = !1, d.onCompositionEnd(), d.off("mousedown", R), e && w())
                    };

                    function R() {
                        t = !0, u.blur(), u.focus(), t = !1
                    }

                    var T, _ = N.delayedCall(k, 50).schedule.bind(null, null);

                    function $() {
                        clearTimeout(T), T = setTimeout(function () {
                            s && (u.style.cssText = s, s = ""), d.renderer.$isMousePressed = !1, d.renderer.$keepTextAreaAtCursor && d.renderer.$moveTextAreaToCursor()
                        }, 0)
                    }

                    L.addListener(u, "compositionstart", function (e) {
                        c || !d.onCompositionStart || d.$readOnly || (c = {}, m || (e.data && (c.useTextareaForIME = !1), setTimeout(k, 0), d._signal("compositionStart"), d.on("mousedown", R), (e = d.getSelectionRange()).end.row = e.start.row, e.end.column = e.start.column, c.markerRange = e, c.selectionStart = C, d.onCompositionStart(c), c.useTextareaForIME ? (f = u.value = "", I = C = 0) : (u.msGetInputContext && (c.context = u.msGetInputContext()), u.getInputContext && (c.context = u.getInputContext()))))
                    }, d), L.addListener(u, "compositionupdate", k, d), L.addListener(u, "keyup", function (e) {
                        27 == e.keyCode && u.value.length < u.selectionStart && (c || (f = u.value), C = I = -1, A()), _()
                    }, d), L.addListener(u, "keydown", _, d), L.addListener(u, "compositionend", E, d), this.getElement = function () {
                        return u
                    }, this.setCommandMode = function (e) {
                        m = e, u.readOnly = !1
                    }, this.setReadOnly = function (e) {
                        m || (u.readOnly = e)
                    }, this.setCopyWithEmptySelection = function (e) {
                    }, this.onContextMenu = function (e) {
                        b = !0, A(), d._emit("nativecontextmenu", {target: d, domEvent: e}), this.moveToMouse(e, !0)
                    }, this.moveToMouse = function (e, t) {
                        s = s || u.style.cssText, u.style.cssText = (t ? "z-index:100000;" : "") + (B.isIE ? "opacity:0.1;" : "") + "text-indent: -" + (C + I) * d.renderer.characterWidth * .5 + "px;";
                        var i = d.container.getBoundingClientRect(), t = W.computedStyle(d.container),
                            n = i.top + (parseInt(t.borderTopWidth) || 0),
                            r = i.left + (parseInt(i.borderLeftWidth) || 0), o = i.bottom - n - u.clientHeight - 2,
                            i = function (e) {
                                W.translate(u, e.clientX - r - 2, Math.min(e.clientY - n - 2, o))
                            };
                        i(e), "mousedown" == e.type && (d.renderer.$isMousePressed = !0, clearTimeout(T), B.isWin && L.capture(d.container, i, $))
                    }, this.onContextMenuClose = $;
                    e = function (e) {
                        d.textInput.onContextMenu(e), $()
                    };
                    L.addListener(u, "mouseup", e, d), L.addListener(u, "mousedown", function (e) {
                        e.preventDefault(), $()
                    }, d), L.addListener(d.renderer.scroller, "contextmenu", e, d), L.addListener(u, "contextmenu", e, d), M && function (o, s) {
                        var t = null, a = !1;
                        s.addEventListener("keydown", function (e) {
                            t && clearTimeout(t), a = !0
                        }, !0), s.addEventListener("keyup", function (e) {
                            t = setTimeout(function () {
                                a = !1
                            }, 100)
                        }, !0);

                        function e(e) {
                            var t, i, n, r;
                            document.activeElement === s && (a || c || o.$mouseHandler.isMousePressed || l || (t = s.selectionStart, i = s.selectionEnd, r = null, (n = 0) == t ? r = V.up : 1 == t ? r = V.home : I < i && "\n" == f[i] ? r = V.end : t < C && " " == f[t - 1] ? (r = V.left, n = Z.option) : t < C || t == C && I != C && t == i ? r = V.left : I < i && 2 < f.slice(0, i).split("\n").length ? r = V.down : I < i && " " == f[i - 1] ? (r = V.right, n = Z.option) : (I < i || i == I && I != C && t == i) && (r = V.right), t !== i && (n |= Z.shift), r && (!o.onCommandKey({}, n, r) && o.commands && (r = V.keyCodeToString(r), (r = o.commands.findKeyCommand(n, r)) && o.execCommand(r)), C = t, I = i, A(""))))
                        }

                        document.addEventListener("selectionchange", e), o.on("destroy", function () {
                            document.removeEventListener("selectionchange", e)
                        })
                    }(d, u)
                }, t.$setUserAgentForTests = function (e, t) {
                    D = e, M = t
                }
            }), ace.define("ace/mouse/default_handlers", ["require", "exports", "module", "ace/lib/useragent"], function (e, t, i) {
                "use strict";
                var o = e("../lib/useragent");

                function n(t) {
                    t.$clickSelection = null;
                    var e = t.editor;
                    e.setDefaultHandler("mousedown", this.onMouseDown.bind(t)), e.setDefaultHandler("dblclick", this.onDoubleClick.bind(t)), e.setDefaultHandler("tripleclick", this.onTripleClick.bind(t)), e.setDefaultHandler("quadclick", this.onQuadClick.bind(t)), e.setDefaultHandler("mousewheel", this.onMouseWheel.bind(t));
                    ["select", "startSelect", "selectEnd", "selectAllEnd", "selectByWordsEnd", "selectByLinesEnd", "dragWait", "dragWaitEnd", "focusWait"].forEach(function (e) {
                        t[e] = this[e]
                    }, this), t.selectByLines = this.extendSelectionBy.bind(t, "getLineRange"), t.selectByWords = this.extendSelectionBy.bind(t, "getWordRange")
                }

                function s(e, t) {
                    return (e.start.row == e.end.row ? 2 * t.column - e.start.column - e.end.column : e.start.row != e.end.row - 1 || e.start.column || e.end.column ? 2 * t.row - e.start.row - e.end.row : t.column - 4) < 0 ? {
                        cursor: e.start,
                        anchor: e.end
                    } : {cursor: e.end, anchor: e.start}
                }

                !function () {
                    this.onMouseDown = function (e) {
                        var t = e.inSelection(), i = e.getDocumentPosition();
                        this.mousedownEvent = e;
                        var n = this.editor, r = e.getButton();
                        return 0 !== r ? (!n.getSelectionRange().isEmpty() && 1 != r || n.selection.moveToPosition(i), void (2 == r && (n.textInput.onContextMenu(e.domEvent), o.isMozilla || e.preventDefault()))) : (this.mousedownEvent.time = Date.now(), !t || n.isFocused() || (n.focus(), !this.$focusTimeout || this.$clickSelection || n.inMultiSelectMode) ? (this.captureMouse(e), this.startSelect(i, 1 < e.domEvent._clicks), e.preventDefault()) : (this.setState("focusWait"), void this.captureMouse(e)))
                    }, this.startSelect = function (e, t) {
                        e = e || this.editor.renderer.screenToTextCoordinates(this.x, this.y);
                        var i = this.editor;
                        this.mousedownEvent && (this.mousedownEvent.getShiftKey() ? i.selection.selectToPosition(e) : t || i.selection.moveToPosition(e), t || this.select(), i.renderer.scroller.setCapture && i.renderer.scroller.setCapture(), i.setStyle("ace_selecting"), this.setState("select"))
                    }, this.select = function () {
                        var e, t, i = this.editor, n = i.renderer.screenToTextCoordinates(this.x, this.y);
                        this.$clickSelection && (t = -1 == (e = this.$clickSelection.comparePoint(n)) ? this.$clickSelection.end : 1 == e ? this.$clickSelection.start : (n = (t = s(this.$clickSelection, n)).cursor, t.anchor), i.selection.setSelectionAnchor(t.row, t.column)), i.selection.selectToPosition(n), i.renderer.scrollCursorIntoView()
                    }, this.extendSelectionBy = function (e) {
                        var t, i, n = this.editor, r = n.renderer.screenToTextCoordinates(this.x, this.y),
                            o = n.selection[e](r.row, r.column);
                        this.$clickSelection && (t = this.$clickSelection.comparePoint(o.start), e = this.$clickSelection.comparePoint(o.end), -1 == t && e <= 0 ? (i = this.$clickSelection.end, o.end.row == r.row && o.end.column == r.column || (r = o.start)) : 1 == e && 0 <= t ? (i = this.$clickSelection.start, o.start.row == r.row && o.start.column == r.column || (r = o.end)) : i = -1 == t && 1 == e ? (r = o.end, o.start) : (r = (o = s(this.$clickSelection, r)).cursor, o.anchor), n.selection.setSelectionAnchor(i.row, i.column)), n.selection.selectToPosition(r), n.renderer.scrollCursorIntoView()
                    }, this.selectEnd = this.selectAllEnd = this.selectByWordsEnd = this.selectByLinesEnd = function () {
                        this.$clickSelection = null, this.editor.unsetStyle("ace_selecting"), this.editor.renderer.scroller.releaseCapture && this.editor.renderer.scroller.releaseCapture()
                    }, this.focusWait = function () {
                        var e, t, i,
                            i = (e = this.mousedownEvent.x, n = this.mousedownEvent.y, t = this.x, i = this.y, Math.sqrt(Math.pow(t - e, 2) + Math.pow(i - n, 2))),
                            n = Date.now();
                        (0 < i || n - this.mousedownEvent.time > this.$focusTimeout) && this.startSelect(this.mousedownEvent.getDocumentPosition())
                    }, this.onDoubleClick = function (e) {
                        var t = e.getDocumentPosition(), i = this.editor, e = i.session.getBracketRange(t);
                        e ? (e.isEmpty() && (e.start.column--, e.end.column++), this.setState("select")) : (e = i.selection.getWordRange(t.row, t.column), this.setState("selectByWords")), this.$clickSelection = e, this.select()
                    }, this.onTripleClick = function (e) {
                        var t = e.getDocumentPosition(), i = this.editor;
                        this.setState("selectByLines");
                        e = i.getSelectionRange();
                        e.isMultiLine() && e.contains(t.row, t.column) ? (this.$clickSelection = i.selection.getLineRange(e.start.row), this.$clickSelection.end = i.selection.getLineRange(e.end.row).end) : this.$clickSelection = i.selection.getLineRange(t.row), this.select()
                    }, this.onQuadClick = function (e) {
                        var t = this.editor;
                        t.selectAll(), this.$clickSelection = t.getSelectionRange(), this.setState("selectAll")
                    }, this.onMouseWheel = function (e) {
                        if (!e.getAccelKey()) {
                            e.getShiftKey() && e.wheelY && !e.wheelX && (e.wheelX = e.wheelY, e.wheelY = 0);
                            var t = this.editor;
                            this.$lastScroll || (this.$lastScroll = {t: 0, vx: 0, vy: 0, allowed: 0});
                            var i = this.$lastScroll, n = e.domEvent.timeStamp, r = n - i.t,
                                o = r ? e.wheelX / r : i.vx, s = r ? e.wheelY / r : i.vy;
                            r < 550 && (o = (o + i.vx) / 2, s = (s + i.vy) / 2);
                            var a = Math.abs(o / s), r = !1;
                            return 1 <= a && t.renderer.isScrollableBy(e.wheelX * e.speed, 0) && (r = !0), (r = a <= 1 && t.renderer.isScrollableBy(0, e.wheelY * e.speed) ? !0 : r) ? i.allowed = n : n - i.allowed < 550 && (Math.abs(o) <= 1.5 * Math.abs(i.vx) && Math.abs(s) <= 1.5 * Math.abs(i.vy) ? (r = !0, i.allowed = n) : i.allowed = 0), i.t = n, i.vx = o, i.vy = s, r ? (t.renderer.scrollBy(e.wheelX * e.speed, e.wheelY * e.speed), e.stop()) : void 0
                        }
                    }
                }.call(n.prototype), t.DefaultHandlers = n
            }), ace.define("ace/tooltip", ["require", "exports", "module", "ace/lib/oop", "ace/lib/dom"], function (e, t, i) {
                "use strict";
                e("./lib/oop");
                var n = e("./lib/dom");

                function r(e) {
                    this.isOpen = !1, this.$element = null, this.$parentNode = e
                }

                !function () {
                    this.$init = function () {
                        return this.$element = n.createElement("div"), this.$element.className = "ace_tooltip", this.$element.style.display = "none", this.$parentNode.appendChild(this.$element), this.$element
                    }, this.getElement = function () {
                        return this.$element || this.$init()
                    }, this.setText = function (e) {
                        this.getElement().textContent = e
                    }, this.setHtml = function (e) {
                        this.getElement().innerHTML = e
                    }, this.setPosition = function (e, t) {
                        this.getElement().style.left = e + "px", this.getElement().style.top = t + "px"
                    }, this.setClassName = function (e) {
                        n.addCssClass(this.getElement(), e)
                    }, this.show = function (e, t, i) {
                        null != e && this.setText(e), null != t && null != i && this.setPosition(t, i), this.isOpen || (this.getElement().style.display = "block", this.isOpen = !0)
                    }, this.hide = function () {
                        this.isOpen && (this.getElement().style.display = "none", this.isOpen = !1)
                    }, this.getHeight = function () {
                        return this.getElement().offsetHeight
                    }, this.getWidth = function () {
                        return this.getElement().offsetWidth
                    }, this.destroy = function () {
                        this.isOpen = !1, this.$element && this.$element.parentNode && this.$element.parentNode.removeChild(this.$element)
                    }
                }.call(r.prototype), t.Tooltip = r
            }), ace.define("ace/mouse/default_gutter_handler", ["require", "exports", "module", "ace/lib/dom", "ace/lib/oop", "ace/lib/event", "ace/tooltip"], function (e, t, i) {
                "use strict";
                var d = e("../lib/dom"), n = e("../lib/oop"), u = e("../lib/event"), s = e("../tooltip").Tooltip;

                function g(e) {
                    s.call(this, e)
                }

                n.inherits(g, s), function () {
                    this.setPosition = function (e, t) {
                        var i = window.innerWidth || document.documentElement.clientWidth,
                            n = window.innerHeight || document.documentElement.clientHeight, r = this.getWidth(),
                            o = this.getHeight();
                        i < (e += 15) + r && (e -= e + r - i), n < (t += 15) + o && (t -= 20 + o), s.prototype.setPosition.call(this, e, t)
                    }
                }.call(g.prototype), t.GutterHandler = function (n) {
                    var i, r, o, s = n.editor, a = s.renderer.$gutterLayer, l = new g(s.container);

                    function c() {
                        i = i && clearTimeout(i), o && (l.hide(), o = null, s._signal("hideGutterTooltip", l), s.off("mousewheel", c))
                    }

                    function h(e) {
                        l.setPosition(e.x, e.y)
                    }

                    n.editor.setDefaultHandler("guttermousedown", function (e) {
                        if (s.isFocused() && 0 == e.getButton() && "foldWidgets" != a.getRegion(e)) {
                            var t = e.getDocumentPosition().row, i = s.session.selection;
                            if (e.getShiftKey()) i.selectTo(t, 0); else {
                                if (2 == e.domEvent.detail) return s.selectAll(), e.preventDefault();
                                n.$clickSelection = s.selection.getLineRange(t)
                            }
                            return n.setState("selectByLines"), n.captureMouse(e), e.preventDefault()
                        }
                    }), n.editor.setDefaultHandler("guttermousemove", function (e) {
                        var t = e.domEvent.target || e.domEvent.srcElement;
                        if (d.hasCssClass(t, "ace_fold-widget")) return c();
                        o && n.$tooltipFollowsMouse && h(e), r = e, i = i || setTimeout(function () {
                            i = null, (r && !n.isMousePressed ? function () {
                                var e = r.getDocumentPosition().row, t = a.$annotations[e];
                                if (!t) return c();
                                if (e == s.session.getLength()) {
                                    var e = s.renderer.pixelToScreenCoordinates(0, r.y).row, i = r.$pos;
                                    if (e > s.session.documentToScreenRow(i.row, i.column)) return c()
                                }
                                o != t && (o = t.text.join("<br/>"), l.setHtml(o), l.show(), s._signal("showGutterTooltip", l), s.on("mousewheel", c), n.$tooltipFollowsMouse ? h(r) : (i = r.domEvent.target.getBoundingClientRect(), (t = l.getElement().style).left = i.right + "px", t.top = i.bottom + "px"))
                            } : c)()
                        }, 50)
                    }), u.addListener(s.renderer.$gutter, "mouseout", function (e) {
                        r = null, o && !i && (i = setTimeout(function () {
                            i = null, c()
                        }, 50))
                    }, s), s.on("changeSession", c)
                }
            }), ace.define("ace/mouse/mouse_event", ["require", "exports", "module", "ace/lib/event", "ace/lib/useragent"], function (e, t, i) {
                "use strict";
                var n = e("../lib/event"), r = e("../lib/useragent"), t = t.MouseEvent = function (e, t) {
                    this.domEvent = e, this.editor = t, this.x = this.clientX = e.clientX, this.y = this.clientY = e.clientY, this.$pos = null, this.$inSelection = null, this.propagationStopped = !1, this.defaultPrevented = !1
                };
                !function () {
                    this.stopPropagation = function () {
                        n.stopPropagation(this.domEvent), this.propagationStopped = !0
                    }, this.preventDefault = function () {
                        n.preventDefault(this.domEvent), this.defaultPrevented = !0
                    }, this.stop = function () {
                        this.stopPropagation(), this.preventDefault()
                    }, this.getDocumentPosition = function () {
                        return this.$pos || (this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY), this.$pos)
                    }, this.inSelection = function () {
                        if (null !== this.$inSelection) return this.$inSelection;
                        var e, t = this.editor.getSelectionRange();
                        return t.isEmpty() ? this.$inSelection = !1 : (e = this.getDocumentPosition(), this.$inSelection = t.contains(e.row, e.column)), this.$inSelection
                    }, this.getButton = function () {
                        return n.getButton(this.domEvent)
                    }, this.getShiftKey = function () {
                        return this.domEvent.shiftKey
                    }, this.getAccelKey = r.isMac ? function () {
                        return this.domEvent.metaKey
                    } : function () {
                        return this.domEvent.ctrlKey
                    }
                }.call(t.prototype)
            }), ace.define("ace/mouse/dragdrop_handler", ["require", "exports", "module", "ace/lib/dom", "ace/lib/event", "ace/lib/useragent"], function (e, t, i) {
                "use strict";
                var w = e("../lib/dom"), S = e("../lib/event"), x = e("../lib/useragent");

                function n(t) {
                    var c = t.editor, n = w.createElement("img");
                    n.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==", x.isOpera && (n.style.cssText = "width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;");
                    ["dragWait", "dragWaitEnd", "startDrag", "dragReadyEnd", "onMouseDrag"].forEach(function (e) {
                        t[e] = this[e]
                    }, this), c.on("mousedown", this.onMouseDown.bind(t));
                    var i, h, d, e, r, u, o, s, g, p, m, a = c.container, l = 0;

                    function f() {
                        var e, t, i, n, r, o, s, a, l = u;
                        u = c.renderer.screenToTextCoordinates(h, d), s = u, o = l, a = Date.now(), r = !o || s.row != o.row, o = !o || s.column != o.column, !p || r || o ? (c.moveCursorToPosition(s), p = a, m = {
                            x: h,
                            y: d
                        }) : 5 < k(m.x, m.y, h, d) ? p = null : 200 <= a - p && (c.renderer.scrollCursorIntoView(), p = null), e = u, t = l, i = Date.now(), n = c.renderer.layerConfig.lineHeight, r = c.renderer.layerConfig.characterWidth, o = c.renderer.scroller.getBoundingClientRect(), s = {
                            x: {
                                left: h - o.left,
                                right: o.right - h
                            }, y: {top: d - o.top, bottom: o.bottom - d}
                        }, a = Math.min(s.x.left, s.x.right), l = Math.min(s.y.top, s.y.bottom), o = {
                            row: e.row,
                            column: e.column
                        }, a / r <= 2 && (o.column += s.x.left < s.x.right ? -3 : 2), l / n <= 1 && (o.row += s.y.top < s.y.bottom ? -1 : 1), n = e.row != o.row, s = e.column != o.column, t = !t || e.row != t.row, n || s && !t ? g ? 200 <= i - g && c.renderer.scrollCursorIntoView(o) : g = i : g = null
                    }

                    function C() {
                        r = c.selection.toOrientedRange(), i = c.session.addMarker(r, "ace_selection", c.getSelectionStyle()), c.clearSelection(), c.isFocused() && c.renderer.$cursorLayer.setBlinking(!1), clearInterval(e), f(), e = setInterval(f, 20), l = 0, S.addListener(document, "mousemove", A)
                    }

                    function I() {
                        clearInterval(e), c.session.removeMarker(i), i = null, c.selection.fromOrientedRange(r), c.isFocused() && !s && c.$resetCursorStyle(), l = 0, p = g = u = r = null, S.removeListener(document, "mousemove", A)
                    }

                    this.onDragStart = function (e) {
                        if (this.cancelDrag || !a.draggable) {
                            var t = this;
                            return setTimeout(function () {
                                t.startSelect(), t.captureMouse(e)
                            }, 0), e.preventDefault()
                        }
                        r = c.getSelectionRange();
                        var i = e.dataTransfer;
                        i.effectAllowed = c.getReadOnly() ? "copy" : "copyMove", x.isOpera && (c.container.appendChild(n), n.scrollTop = 0), i.setDragImage && i.setDragImage(n, 0, 0), x.isOpera && c.container.removeChild(n), i.clearData(), i.setData("Text", c.session.getTextRange()), s = !0, this.setState("drag")
                    }, this.onDragEnd = function (e) {
                        a.draggable = !1, s = !1, this.setState(null), c.getReadOnly() || (e = e.dataTransfer.dropEffect, o || "move" != e || c.session.remove(c.getSelectionRange()), c.$resetCursorStyle()), this.editor.unsetStyle("ace_dragging"), this.editor.renderer.setCursorStyle("")
                    }, this.onDragEnter = function (e) {
                        if (!c.getReadOnly() && b(e.dataTransfer)) return h = e.clientX, d = e.clientY, i || C(), l++, e.dataTransfer.dropEffect = o = y(e), S.preventDefault(e)
                    }, this.onDragOver = function (e) {
                        if (!c.getReadOnly() && b(e.dataTransfer)) return h = e.clientX, d = e.clientY, i || (C(), l++), null !== v && (v = null), e.dataTransfer.dropEffect = o = y(e), S.preventDefault(e)
                    }, this.onDragLeave = function (e) {
                        if (--l <= 0 && i) return I(), o = null, S.preventDefault(e)
                    }, this.onDrop = function (e) {
                        if (u) {
                            var t = e.dataTransfer;
                            if (s) switch (o) {
                                case"move":
                                    r = r.contains(u.row, u.column) ? {start: u, end: u} : c.moveText(r, u);
                                    break;
                                case"copy":
                                    r = c.moveText(r, u, !0)
                            } else {
                                t = t.getData("Text");
                                r = {start: u, end: c.session.insert(u, t)}, c.focus(), o = null
                            }
                            return I(), S.preventDefault(e)
                        }
                    }, S.addListener(a, "dragstart", this.onDragStart.bind(t), c), S.addListener(a, "dragend", this.onDragEnd.bind(t), c), S.addListener(a, "dragenter", this.onDragEnter.bind(t), c), S.addListener(a, "dragover", this.onDragOver.bind(t), c), S.addListener(a, "dragleave", this.onDragLeave.bind(t), c), S.addListener(a, "drop", this.onDrop.bind(t), c);
                    var v = null;

                    function A() {
                        null == v && (v = setTimeout(function () {
                            null != v && i && I()
                        }, 20))
                    }

                    function b(e) {
                        e = e.types;
                        return !e || Array.prototype.some.call(e, function (e) {
                            return "text/plain" == e || "Text" == e
                        })
                    }

                    function y(e) {
                        var t = ["copy", "copymove", "all", "uninitialized"], i = x.isMac ? e.altKey : e.ctrlKey,
                            n = "uninitialized";
                        try {
                            n = e.dataTransfer.effectAllowed.toLowerCase()
                        } catch (e) {
                        }
                        var r = "none";
                        return i && 0 <= t.indexOf(n) ? r = "copy" : 0 <= ["move", "copymove", "linkmove", "all", "uninitialized"].indexOf(n) ? r = "move" : 0 <= t.indexOf(n) && (r = "copy"), r
                    }
                }

                function k(e, t, i, n) {
                    return Math.sqrt(Math.pow(i - e, 2) + Math.pow(n - t, 2))
                }

                !function () {
                    this.dragWait = function () {
                        Date.now() - this.mousedownEvent.time > this.editor.getDragDelay() && this.startDrag()
                    }, this.dragWaitEnd = function () {
                        this.editor.container.draggable = !1, this.startSelect(this.mousedownEvent.getDocumentPosition()), this.selectEnd()
                    }, this.dragReadyEnd = function (e) {
                        this.editor.$resetCursorStyle(), this.editor.unsetStyle("ace_dragging"), this.editor.renderer.setCursorStyle(""), this.dragWaitEnd()
                    }, this.startDrag = function () {
                        this.cancelDrag = !1;
                        var e = this.editor;
                        e.container.draggable = !0, e.renderer.$cursorLayer.setBlinking(!1), e.setStyle("ace_dragging");
                        var t = x.isWin ? "default" : "move";
                        e.renderer.setCursorStyle(t), this.setState("dragReady")
                    }, this.onMouseDrag = function (e) {
                        var t = this.editor.container;
                        x.isIE && "dragReady" == this.state && 3 < k(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y) && t.dragDrop(), "dragWait" === this.state && 0 < k(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y) && (t.draggable = !1, this.startSelect(this.mousedownEvent.getDocumentPosition()))
                    }, this.onMouseDown = function (e) {
                        var t, i, n;
                        this.$dragEnabled && (this.mousedownEvent = e, t = this.editor, n = e.inSelection(), i = e.getButton(), 1 === (e.domEvent.detail || 1) && 0 === i && n && (e.editor.inMultiSelectMode && (e.getAccelKey() || e.getShiftKey()) || (this.mousedownEvent.time = Date.now(), "unselectable" in (n = e.domEvent.target || e.domEvent.srcElement) && (n.unselectable = "on"), t.getDragDelay() ? (x.isWebKit && (this.cancelDrag = !0, t.container.draggable = !0), this.setState("dragWait")) : this.startDrag(), this.captureMouse(e, this.onMouseDrag.bind(this)), e.defaultPrevented = !0)))
                    }
                }.call(n.prototype), t.DragdropHandler = n
            }), ace.define("ace/mouse/touch_handler", ["require", "exports", "module", "ace/mouse/mouse_event", "ace/lib/event", "ace/lib/dom"], function (e, t, i) {
                "use strict";
                var S = e("./mouse_event").MouseEvent, n = e("../lib/event"), a = e("../lib/dom");
                t.addTouchListeners = function (e, h) {
                    var d, u, g, p, m, t, f, C, o, I = "scroll", v = 0, A = 0, b = 0, y = 0;

                    function r() {
                        function t(e) {
                            var t, i = e.target.getAttribute("action");
                            if ("more" == i || !r) return r = !r, t = h.getCopyText(), e = h.session.getUndoManager().hasUndo(), void o.replaceChild(a.buildDom(r ? ["span", !t && ["span", {
                                class: "ace_mobile-button",
                                action: "selectall"
                            }, "Select All"], t && ["span", {
                                class: "ace_mobile-button",
                                action: "copy"
                            }, "Copy"], t && ["span", {
                                class: "ace_mobile-button",
                                action: "cut"
                            }, "Cut"], n && ["span", {
                                class: "ace_mobile-button",
                                action: "paste"
                            }, "Paste"], e && ["span", {
                                class: "ace_mobile-button",
                                action: "undo"
                            }, "Undo"], ["span", {
                                class: "ace_mobile-button",
                                action: "find"
                            }, "Find"], ["span", {
                                class: "ace_mobile-button",
                                action: "openCommandPallete"
                            }, "Pallete"]] : ["span"]), o.firstChild);
                            "paste" == i ? n.readText().then(function (e) {
                                h.execCommand(i, e)
                            }) : i && ("cut" != i && "copy" != i || (n ? n.writeText(h.getCopyText()) : document.execCommand("copy")), h.execCommand(i)), o.firstChild.style.display = "none", r = !1, "openCommandPallete" != i && h.focus()
                        }

                        var n = window.navigator && window.navigator.clipboard, r = !1;
                        o = a.buildDom(["div", {
                            class: "ace_mobile-menu", ontouchstart: function (e) {
                                I = "menu", e.stopPropagation(), e.preventDefault(), h.textInput.focus()
                            }, ontouchend: function (e) {
                                e.stopPropagation(), e.preventDefault(), t(e)
                            }, onclick: t
                        }, ["span"], ["span", {class: "ace_mobile-button", action: "more"}, "..."]], h.container)
                    }

                    function i() {
                        o || r();
                        var e = h.selection.cursor, t = h.renderer.textToScreenCoordinates(e.row, e.column),
                            i = h.renderer.textToScreenCoordinates(0, 0).pageX, n = h.renderer.scrollLeft,
                            e = h.container.getBoundingClientRect();
                        o.style.top = t.pageY - e.top - 3 + "px", t.pageX - e.left < e.width - 70 ? (o.style.left = "", o.style.right = "10px") : (o.style.right = "", o.style.left = i + n - e.left + "px"), o.style.display = "", o.firstChild.style.display = "none", h.on("input", s)
                    }

                    function s(e) {
                        o && (o.style.display = "none"), h.off("input", s)
                    }

                    function w() {
                        m = null, clearTimeout(m);
                        var e = h.selection.getRange(), t = e.contains(f.row, f.column);
                        !e.isEmpty() && t || (h.selection.moveToPosition(f), h.selection.selectWord()), I = "wait", i()
                    }

                    n.addListener(e, "contextmenu", function (e) {
                        C && h.textInput.getElement().focus()
                    }, h), n.addListener(e, "touchstart", function (e) {
                        var t = e.touches;
                        if (m || 1 < t.length) return clearTimeout(m), m = null, g = -1, void (I = "zoom");
                        C = h.$mouseHandler.isMousePressed = !0;
                        var i = h.renderer.layerConfig.lineHeight, n = h.renderer.layerConfig.lineHeight,
                            r = e.timeStamp;
                        p = r;
                        var o = t[0], s = o.clientX, a = o.clientY;
                        Math.abs(d - s) + Math.abs(u - a) > i && (g = -1), d = e.clientX = s, u = e.clientY = a, b = y = 0;
                        var l = new S(e, h);
                        if (f = l.getDocumentPosition(), r - g < 500 && 1 == t.length && !v) A++, e.preventDefault(), e.button = 0, function () {
                            m = null, clearTimeout(m), h.selection.moveToPosition(f);
                            var e = 2 <= A ? h.selection.getLineRange(f.row) : h.session.getBracketRange(f);
                            e && !e.isEmpty() ? h.selection.setRange(e) : h.selection.selectWord(), I = "wait"
                        }(); else {
                            A = 0;
                            var c = h.selection.cursor, o = h.selection.isEmpty() ? c : h.selection.anchor,
                                s = h.renderer.$cursorLayer.getPixelPosition(c, !0),
                                a = h.renderer.$cursorLayer.getPixelPosition(o, !0),
                                l = h.renderer.scroller.getBoundingClientRect(), t = h.renderer.layerConfig.offset,
                                c = h.renderer.scrollLeft, o = function (e, t) {
                                    return (e /= n) * e + (t = t / i - .75) * t
                                };
                            if (e.clientX < l.left) return void (I = "zoom");
                            s = o(e.clientX - l.left - s.left + c, e.clientY - l.top - s.top + t), t = o(e.clientX - l.left - a.left + c, e.clientY - l.top - a.top + t);
                            s < 3.5 && t < 3.5 && (I = t < s ? "cursor" : "anchor"), I = t < 3.5 ? "anchor" : s < 3.5 ? "cursor" : "scroll", m = setTimeout(w, 450)
                        }
                        g = r
                    }, h), n.addListener(e, "touchend", function (e) {
                        C = h.$mouseHandler.isMousePressed = !1, t && clearInterval(t), "zoom" == I ? (I = "", v = 0) : m ? (h.selection.moveToPosition(f), v = 0, i()) : "scroll" == I ? (v += 60, t = setInterval(function () {
                            v-- <= 0 && (clearInterval(t), t = null), Math.abs(b) < .01 && (b = 0), Math.abs(y) < .01 && (y = 0), v < 20 && (b *= .9), v < 20 && (y *= .9);
                            var e = h.session.getScrollTop();
                            h.renderer.scrollBy(10 * b, 10 * y), e == h.session.getScrollTop() && (v = 0)
                        }, 10), s()) : i(), clearTimeout(m), m = null
                    }, h), n.addListener(e, "touchmove", function (e) {
                        m && (clearTimeout(m), m = null);
                        var t = e.touches;
                        if (!(1 < t.length || "zoom" == I)) {
                            var i = t[0], n = d - i.clientX, r = u - i.clientY;
                            if ("wait" == I) {
                                if (!(4 < n * n + r * r)) return e.preventDefault();
                                I = "cursor"
                            }
                            d = i.clientX, u = i.clientY, e.clientX = i.clientX, e.clientY = i.clientY;
                            var o, t = e.timeStamp, i = t - p;
                            p = t, "scroll" == I ? ((o = new S(e, h)).speed = 1, o.wheelX = n, o.wheelY = r, 10 * Math.abs(n) < Math.abs(r) && (n = 0), 10 * Math.abs(r) < Math.abs(n) && (r = 0), 0 != i && (b = n / i, y = r / i), h._emit("mousewheel", o), o.propagationStopped || (b = y = 0)) : (o = new S(e, h).getDocumentPosition(), "cursor" == I ? h.selection.moveCursorToPosition(o) : "anchor" == I && h.selection.setSelectionAnchor(o.row, o.column), h.renderer.scrollCursorIntoView(o), e.preventDefault())
                        }
                    }, h)
                }
            }), ace.define("ace/lib/net", ["require", "exports", "module", "ace/lib/dom"], function (e, t, i) {
                "use strict";
                var r = e("./dom");
                t.get = function (e, t) {
                    var i = new XMLHttpRequest;
                    i.open("GET", e, !0), i.onreadystatechange = function () {
                        4 === i.readyState && t(i.responseText)
                    }, i.send(null)
                }, t.loadScript = function (e, i) {
                    var t = r.getDocumentHead(), n = document.createElement("script");
                    n.src = e, t.appendChild(n), n.onload = n.onreadystatechange = function (e, t) {
                        !t && n.readyState && "loaded" != n.readyState && "complete" != n.readyState || (n = n.onload = n.onreadystatechange = null, t || i())
                    }
                }, t.qualifyURL = function (e) {
                    var t = document.createElement("a");
                    return t.href = e, t.href
                }
            }), ace.define("ace/lib/event_emitter", ["require", "exports", "module"], function (e, t, i) {
                "use strict";

                function o() {
                    this.propagationStopped = !0
                }

                function s() {
                    this.defaultPrevented = !0
                }

                var n = {};
                n._emit = n._dispatchEvent = function (e, t) {
                    this._eventRegistry || (this._eventRegistry = {}), this._defaultHandlers || (this._defaultHandlers = {});
                    var i = this._eventRegistry[e] || [], n = this._defaultHandlers[e];
                    if (i.length || n) {
                        (t = "object" != typeof t || !t ? {} : t).type || (t.type = e), t.stopPropagation || (t.stopPropagation = o), t.preventDefault || (t.preventDefault = s);
                        for (var i = i.slice(), r = 0; r < i.length && (i[r](t, this), !t.propagationStopped); r++) ;
                        return n && !t.defaultPrevented ? n(t, this) : void 0
                    }
                }, n._signal = function (e, t) {
                    if (i = (this._eventRegistry || {})[e]) for (var i = i.slice(), n = 0; n < i.length; n++) i[n](t, this)
                }, n.once = function (t, i) {
                    var n = this;
                    if (this.on(t, function e() {
                        n.off(t, e), i.apply(null, arguments)
                    }), !i) return new Promise(function (e) {
                        i = e
                    })
                }, n.setDefaultHandler = function (e, t) {
                    var i, n, r = this._defaultHandlers;
                    (r = r || (this._defaultHandlers = {_disabled_: {}}))[e] && (n = r[e], (i = r._disabled_[e]) || (r._disabled_[e] = i = []), i.push(n), -1 != (n = i.indexOf(t)) && i.splice(n, 1)), r[e] = t
                }, n.removeDefaultHandler = function (e, t) {
                    var i, n = this._defaultHandlers;
                    n && (i = n._disabled_[e], n[e] == t ? i && this.setDefaultHandler(e, i.pop()) : !i || -1 != (t = i.indexOf(t)) && i.splice(t, 1))
                }, n.on = n.addEventListener = function (e, t, i) {
                    this._eventRegistry = this._eventRegistry || {};
                    var n = this._eventRegistry[e];
                    return -1 == (n = n || (this._eventRegistry[e] = [])).indexOf(t) && n[i ? "unshift" : "push"](t), t
                }, n.off = n.removeListener = n.removeEventListener = function (e, t) {
                    this._eventRegistry = this._eventRegistry || {};
                    e = this._eventRegistry[e];
                    !e || -1 !== (t = e.indexOf(t)) && e.splice(t, 1)
                }, n.removeAllListeners = function (e) {
                    e || (this._eventRegistry = this._defaultHandlers = void 0), this._eventRegistry && (this._eventRegistry[e] = void 0), this._defaultHandlers && (this._defaultHandlers[e] = void 0)
                }, t.EventEmitter = n
            }), ace.define("ace/lib/app_config", ["require", "exports", "module", "ace/lib/oop", "ace/lib/event_emitter"], function (e, t, i) {
                var r = e("./oop"), n = e("./event_emitter").EventEmitter, o = {
                    setOptions: function (t) {
                        Object.keys(t).forEach(function (e) {
                            this.setOption(e, t[e])
                        }, this)
                    }, getOptions: function (e) {
                        var t, i = {};
                        return e ? Array.isArray(e) || (i = e, e = Object.keys(i)) : (t = this.$options, e = Object.keys(t).filter(function (e) {
                            return !t[e].hidden
                        })), e.forEach(function (e) {
                            i[e] = this.getOption(e)
                        }, this), i
                    }, setOption: function (e, t) {
                        if (this["$" + e] !== t) {
                            var i = this.$options[e];
                            return i ? i.forwardTo ? this[i.forwardTo] && this[i.forwardTo].setOption(e, t) : (i.handlesSet || (this["$" + e] = t), void (i && i.set && i.set.call(this, t))) : s('misspelled option "' + e + '"')
                        }
                    }, getOption: function (e) {
                        var t = this.$options[e];
                        return t ? t.forwardTo ? this[t.forwardTo] && this[t.forwardTo].getOption(e) : t && t.get ? t.get.call(this) : this["$" + e] : s('misspelled option "' + e + '"')
                    }
                };

                function s(e) {
                    "undefined" != typeof console && console.warn && console.warn.apply(console, arguments)
                }

                function a(e, t) {
                    var i = new Error(e);
                    i.data = t, "object" == typeof console && console.error && console.error(i), setTimeout(function () {
                        throw i
                    })
                }

                e = function () {
                    this.$defaultOptions = {}
                };
                !function () {
                    r.implement(this, n), this.defineOptions = function (i, e, n) {
                        return i.$options || (this.$defaultOptions[e] = i.$options = {}), Object.keys(n).forEach(function (e) {
                            var t = n[e];
                            (t = "string" == typeof t ? {forwardTo: t} : t).name || (t.name = e), "initialValue" in (i.$options[t.name] = t) && (i["$" + t.name] = t.initialValue)
                        }), r.implement(i, o), this
                    }, this.resetOptions = function (i) {
                        Object.keys(i.$options).forEach(function (e) {
                            var t = i.$options[e];
                            "value" in t && i.setOption(e, t.value)
                        })
                    }, this.setDefaultValue = function (e, t, i) {
                        if (!e) {
                            for (e in this.$defaultOptions) if (this.$defaultOptions[e][t]) break;
                            if (!this.$defaultOptions[e][t]) return !1
                        }
                        var n = this.$defaultOptions[e] || (this.$defaultOptions[e] = {});
                        n[t] && (n.forwardTo ? this.setDefaultValue(n.forwardTo, t, i) : n[t].value = i)
                    }, this.setDefaultValues = function (t, i) {
                        Object.keys(i).forEach(function (e) {
                            this.setDefaultValue(t, e, i[e])
                        }, this)
                    }, this.warn = s, this.reportError = a
                }.call(e.prototype), t.AppConfig = e
            }), ace.define("ace/config", ["require", "exports", "module", "ace/lib/lang", "ace/lib/oop", "ace/lib/net", "ace/lib/app_config"], function (u, g, p) {
                var e = u("./lib/lang"), r = (u("./lib/oop"), u("./lib/net")), t = u("./lib/app_config").AppConfig;
                p.exports = g = new t;
                var m = function () {
                    return this || "undefined" != typeof window && window
                }(), f = {
                    packaged: !1,
                    workerPath: null,
                    modePath: null,
                    themePath: null,
                    basePath: "",
                    suffix: ".js",
                    $moduleUrls: {},
                    loadWorkerFromBlob: !0,
                    sharedPopups: !1
                };
                g.get = function (e) {
                    if (!f.hasOwnProperty(e)) throw new Error("Unknown config key: " + e);
                    return f[e]
                }, g.set = function (e, t) {
                    if (f.hasOwnProperty(e)) f[e] = t; else if (0 == this.setDefaultValue("", e, t)) throw new Error("Unknown config key: " + e)
                }, g.all = function () {
                    return e.copyObject(f)
                }, g.$modes = {}, g.moduleUrl = function (e, t) {
                    if (f.$moduleUrls[e]) return f.$moduleUrls[e];
                    var i = e.split("/"), n = "snippets" == (t = t || i[i.length - 2] || "") ? "/" : "-",
                        r = i[i.length - 1];
                    "worker" == t && "-" == n && (e = new RegExp("^" + t + "[\\-_]|[\\-_]" + t + "$", "g"), r = r.replace(e, "")), (!r || r == t) && 1 < i.length && (r = i[i.length - 2]);
                    i = f[t + "Path"];
                    return null == i ? i = f.basePath : "/" == n && (t = n = ""), i && "/" != i.slice(-1) && (i += "/"), i + t + n + r + this.get("suffix")
                }, g.setModuleUrl = function (e, t) {
                    return f.$moduleUrls[e] = t
                }, g.$loading = {}, g.loadModule = function (i, e) {
                    var t, n;
                    Array.isArray(i) && (n = i[0], i = i[1]);
                    try {
                        t = u(i)
                    } catch (e) {
                    }
                    if (t && !g.$loading[i]) return e && e(t);
                    if (g.$loading[i] || (g.$loading[i] = []), g.$loading[i].push(e), !(1 < g.$loading[i].length)) {
                        e = function () {
                            u([i], function (t) {
                                g._emit("load.module", {name: i, module: t});
                                var e = g.$loading[i];
                                g.$loading[i] = null, e.forEach(function (e) {
                                    e && e(t)
                                })
                            })
                        };
                        if (!g.get("packaged")) return e();
                        r.loadScript(g.moduleUrl(i, n), e), o()
                    }
                };
                var o = function () {
                    f.basePath || f.workerPath || f.modePath || f.themePath || Object.keys(f.$moduleUrls).length || (console.error("Unable to infer path to ace from script src,", "use ace.config.set('basePath', 'path') to enable dynamic loading of modes and themes", "or with webpack use ace/webpack-resolver"), o = function () {
                    })
                };

                function i(e) {
                    if (m && m.document) {
                        f.packaged = e || u.packaged || p.packaged || m.define && C.amdD.packaged;
                        for (var t, i = {}, n = "", e = document.currentScript || document._currentScript, r = (e && e.ownerDocument || document).getElementsByTagName("script"), o = 0; o < r.length; o++) {
                            var s = r[o], a = s.src || s.getAttribute("src");
                            if (a) {
                                for (var l = s.attributes, c = 0, h = l.length; c < h; c++) {
                                    var d = l[c];
                                    0 === d.name.indexOf("data-ace-") && (i[d.name.replace(/^data-ace-/, "").replace(/-(.)/g, function (e, t) {
                                        return t.toUpperCase()
                                    })] = d.value)
                                }
                                a = a.match(/^(.*)\/ace(\-\w+)?\.js(\?|$)/);
                                a && (n = a[1])
                            }
                        }
                        for (t in n && (i.base = i.base || n, i.packaged = !0), i.basePath = i.base, i.workerPath = i.workerPath || i.base, i.modePath = i.modePath || i.base, i.themePath = i.themePath || i.base, delete i.base, i) void 0 !== i[t] && g.set(t, i[t])
                    }
                }

                i(!0), g.init = i, g.version = "1.4.12"
            }), ace.define("ace/mouse/mouse_handler", ["require", "exports", "module", "ace/lib/event", "ace/lib/useragent", "ace/mouse/default_handlers", "ace/mouse/default_gutter_handler", "ace/mouse/mouse_event", "ace/mouse/dragdrop_handler", "ace/mouse/touch_handler", "ace/config"], function (e, t, i) {
                "use strict";
                var h = e("../lib/event"), d = e("../lib/useragent"), o = e("./default_handlers").DefaultHandlers,
                    s = e("./default_gutter_handler").GutterHandler, u = e("./mouse_event").MouseEvent,
                    a = e("./dragdrop_handler").DragdropHandler, l = e("./touch_handler").addTouchListeners,
                    n = e("../config"), e = function (n) {
                        var r = this;
                        this.editor = n, new o(this), new s(this), new a(this);

                        function e(e) {
                            document.hasFocus && document.hasFocus() && (n.isFocused() || document.activeElement != (n.textInput && n.textInput.getElement())) || window.focus(), n.focus()
                        }

                        var t = n.renderer.getMouseEventTarget();
                        h.addListener(t, "click", this.onMouseEvent.bind(this, "click"), n), h.addListener(t, "mousemove", this.onMouseMove.bind(this, "mousemove"), n), h.addMultiMouseDownListener([t, n.renderer.scrollBarV && n.renderer.scrollBarV.inner, n.renderer.scrollBarH && n.renderer.scrollBarH.inner, n.textInput && n.textInput.getElement()].filter(Boolean), [400, 300, 250], this, "onMouseEvent", n), h.addMouseWheelListener(n.container, this.onMouseWheel.bind(this, "mousewheel"), n), l(n.container, n);
                        var i = n.renderer.$gutter;
                        h.addListener(i, "mousedown", this.onMouseEvent.bind(this, "guttermousedown"), n), h.addListener(i, "click", this.onMouseEvent.bind(this, "gutterclick"), n), h.addListener(i, "dblclick", this.onMouseEvent.bind(this, "gutterdblclick"), n), h.addListener(i, "mousemove", this.onMouseEvent.bind(this, "guttermousemove"), n), h.addListener(t, "mousedown", e, n), h.addListener(i, "mousedown", e, n), d.isIE && n.renderer.scrollBarV && (h.addListener(n.renderer.scrollBarV.element, "mousedown", e, n), h.addListener(n.renderer.scrollBarH.element, "mousedown", e, n)), n.on("mousemove", function (e) {
                            var t, i;
                            r.state || r.$dragDelay || !r.$dragEnabled || (t = n.renderer.screenToTextCoordinates(e.x, e.y), i = n.session.selection.getRange(), e = n.renderer, !i.isEmpty() && i.insideStart(t.row, t.column) ? e.setCursorStyle("default") : e.setCursorStyle(""))
                        }, n)
                    };
                !function () {
                    this.onMouseEvent = function (e, t) {
                        this.editor._emit(e, new u(t, this.editor))
                    }, this.onMouseMove = function (e, t) {
                        var i = this.editor._eventRegistry && this.editor._eventRegistry.mousemove;
                        i && i.length && this.editor._emit(e, new u(t, this.editor))
                    }, this.onMouseWheel = function (e, t) {
                        var i = new u(t, this.editor);
                        i.speed = 2 * this.$scrollSpeed, i.wheelX = t.wheelX, i.wheelY = t.wheelY, this.editor._emit(e, i)
                    }, this.setState = function (e) {
                        this.state = e
                    }, this.captureMouse = function (e, t) {
                        this.x = e.x, this.y = e.y, this.isMousePressed = !0;
                        var i = this.editor, n = this.editor.renderer;
                        n.$isMousePressed = !0;

                        function r(e) {
                            if (e) {
                                if (d.isWebKit && !e.which && a.releaseMouse) return a.releaseMouse();
                                a.x = e.clientX, a.y = e.clientY, t && t(e), a.mouseEvent = new u(e, a.editor), a.$mouseMoved = !0
                            }
                        }

                        function o(e) {
                            i.off("beforeEndOperation", l), clearInterval(c), s(), a[a.state + "End"] && a[a.state + "End"](e), a.state = "", a.isMousePressed = n.$isMousePressed = !1, n.$keepTextAreaAtCursor && n.$moveTextAreaToCursor(), a.$onCaptureMouseMove = a.releaseMouse = null, e && a.onMouseEvent("mouseup", e), i.endOperation()
                        }

                        function s() {
                            a[a.state] && a[a.state](), a.$mouseMoved = !1
                        }

                        var a = this;
                        if (d.isOldIE && "dblclick" == e.domEvent.type) return setTimeout(function () {
                            o(e)
                        });
                        var l = function (e) {
                            a.releaseMouse && i.curOp.command.name && i.curOp.selectionChanged && (a[a.state + "End"] && a[a.state + "End"](), a.state = "", a.releaseMouse())
                        };
                        i.on("beforeEndOperation", l), i.startOperation({command: {name: "mouse"}}), a.$onCaptureMouseMove = r, a.releaseMouse = h.capture(this.editor.container, r, o);
                        var c = setInterval(s, 20)
                    }, this.releaseMouse = null, this.cancelContextMenu = function () {
                        var t = function (e) {
                            e && e.domEvent && "contextmenu" != e.domEvent.type || (this.editor.off("nativecontextmenu", t), e && e.domEvent && h.stopEvent(e.domEvent))
                        }.bind(this);
                        setTimeout(t, 10), this.editor.on("nativecontextmenu", t)
                    }, this.destroy = function () {
                        this.releaseMouse && this.releaseMouse()
                    }
                }.call(e.prototype), n.defineOptions(e.prototype, "mouseHandler", {
                    scrollSpeed: {initialValue: 2},
                    dragDelay: {initialValue: d.isMac ? 150 : 0},
                    dragEnabled: {initialValue: !0},
                    focusTimeout: {initialValue: 0},
                    tooltipFollowsMouse: {initialValue: !0}
                }), t.MouseHandler = e
            }), ace.define("ace/mouse/fold_handler", ["require", "exports", "module", "ace/lib/dom"], function (e, t, i) {
                "use strict";
                var n = e("../lib/dom");
                t.FoldHandler = function (r) {
                    r.on("click", function (e) {
                        var t = e.getDocumentPosition(), i = r.session, t = i.getFoldAt(t.row, t.column, 1);
                        t && (e.getAccelKey() ? i.removeFold(t) : i.expandFold(t), e.stop());
                        e = e.domEvent && e.domEvent.target;
                        e && n.hasCssClass(e, "ace_inline_button") && n.hasCssClass(e, "ace_toggle_wrap") && (i.setOption("wrap", !i.getUseWrapMode()), r.renderer.scrollCursorIntoView())
                    }), r.on("gutterclick", function (e) {
                        var t, i;
                        "foldWidgets" == r.renderer.$gutterLayer.getRegion(e) && (t = e.getDocumentPosition().row, (i = r.session).foldWidgets && i.foldWidgets[t] && r.session.onFoldWidgetClick(t, e), r.isFocused() || r.focus(), e.stop())
                    }), r.on("gutterdblclick", function (e) {
                        var t, i, n;
                        "foldWidgets" == r.renderer.$gutterLayer.getRegion(e) && (n = e.getDocumentPosition().row, (i = (i = (t = r.session).getParentFoldRangeData(n, !0)).range || i.firstRange) && (n = i.start.row, (n = t.getFoldAt(n, t.getLine(n).length, 1)) ? t.removeFold(n) : (t.addFold("...", i), r.renderer.scrollCursorIntoView({
                            row: i.start.row,
                            column: 0
                        }))), e.stop())
                    })
                }
            }), ace.define("ace/keyboard/keybinding", ["require", "exports", "module", "ace/lib/keys", "ace/lib/event"], function (e, t, i) {
                "use strict";
                var r = e("../lib/keys"), l = e("../lib/event"), e = function (e) {
                    this.$editor = e, this.$data = {editor: e}, this.$handlers = [], this.setDefaultHandler(e.commands)
                };
                !function () {
                    this.setDefaultHandler = function (e) {
                        this.removeKeyboardHandler(this.$defaultHandler), this.$defaultHandler = e, this.addKeyboardHandler(e, 0)
                    }, this.setKeyboardHandler = function (e) {
                        var t = this.$handlers;
                        if (t[t.length - 1] != e) {
                            for (; t[t.length - 1] && t[t.length - 1] != this.$defaultHandler;) this.removeKeyboardHandler(t[t.length - 1]);
                            this.addKeyboardHandler(e, 1)
                        }
                    }, this.addKeyboardHandler = function (e, t) {
                        var i;
                        e && ("function" != typeof e || e.handleKeyboard || (e.handleKeyboard = e), -1 != (i = this.$handlers.indexOf(e)) && this.$handlers.splice(i, 1), null == t ? this.$handlers.push(e) : this.$handlers.splice(t, 0, e), -1 == i && e.attach && e.attach(this.$editor))
                    }, this.removeKeyboardHandler = function (e) {
                        var t = this.$handlers.indexOf(e);
                        return -1 != t && (this.$handlers.splice(t, 1), e.detach && e.detach(this.$editor), !0)
                    }, this.getKeyboardHandler = function () {
                        return this.$handlers[this.$handlers.length - 1]
                    }, this.getStatusText = function () {
                        var t = this.$data, i = t.editor;
                        return this.$handlers.map(function (e) {
                            return e.getStatusText && e.getStatusText(i, t) || ""
                        }).filter(Boolean).join(" ")
                    }, this.$callKeyboardHandlers = function (e, t, i, n) {
                        for (var r, o = !1, s = this.$editor.commands, a = this.$handlers.length; a-- && !((r = this.$handlers[a].handleKeyboard(this.$data, e, t, i, n)) && r.command && ((o = "null" == r.command || s.exec(r.command, this.$editor, r.args, n)) && n && -1 != e && 1 != r.passEvent && 1 != r.command.passEvent && l.stopEvent(n), o));) ;
                        return o || -1 != e || (r = {command: "insertstring"}, o = s.exec("insertstring", this.$editor, t)), o && this.$editor._signal && this.$editor._signal("keyboardActivity", r), o
                    }, this.onCommandKey = function (e, t, i) {
                        var n = r.keyCodeToString(i);
                        return this.$callKeyboardHandlers(t, n, i, e)
                    }, this.onTextInput = function (e) {
                        return this.$callKeyboardHandlers(-1, e)
                    }
                }.call(e.prototype), t.KeyBinding = e
            }), ace.define("ace/lib/bidiutil", ["require", "exports", "module"], function (e, l, t) {
                "use strict";
                var m = 0, f = 0, C = !1, I = !1, v = !1,
                    A = [[0, 3, 0, 1, 0, 0, 0], [0, 3, 0, 1, 2, 2, 0], [0, 3, 0, 17, 2, 0, 1], [0, 3, 5, 5, 4, 1, 0], [0, 3, 21, 21, 4, 0, 1], [0, 3, 5, 5, 4, 2, 0]],
                    b = [[2, 0, 1, 1, 0, 1, 0], [2, 0, 1, 1, 0, 2, 0], [2, 0, 2, 1, 3, 2, 0], [2, 0, 2, 33, 3, 1, 1]],
                    y = 0, w = 1, S = 2, x = 3, k = 4, E = 5, R = 6, T = 7, _ = 8, $ = 9, L = 10, B = 11, W = 12,
                    N = 13, G = 14, F = 15, P = 16, H = 17, V = 18,
                    n = [V, V, V, V, V, V, V, V, V, R, E, R, _, E, V, V, V, V, V, V, V, V, V, V, V, V, V, V, E, E, E, R, _, k, k, B, B, B, k, k, k, k, k, L, $, L, $, $, S, S, S, S, S, S, S, S, S, S, $, k, k, k, k, k, k, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, k, k, k, k, k, k, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, y, k, k, k, k, V, V, V, V, V, V, E, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, $, k, B, B, B, B, k, k, k, k, y, k, k, V, k, k, B, B, S, S, k, y, k, k, k, S, y, k, k, k, k, k],
                    r = [_, _, _, _, _, _, _, _, _, _, _, V, V, V, y, w, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, _, E, N, G, F, P, H, $, B, B, B, B, B, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, $, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, _];

                function c(e, t, i, n) {
                    var r, o, s, a, l = m ? b : A, c = 0, h = -1, d = null, u = null, g = [];
                    if (!n) for (d = 0, n = []; d < i; d++) n[d] = Z(e[d]);
                    for (f = m, v = I = C = !1, u = 0; u < i; u++) {
                        if (r = c, g[u] = o = function (e, t, i, n) {
                            var r, o, s, a = t[n];
                            switch (a) {
                                case y:
                                case w:
                                    C = !1;
                                case k:
                                case x:
                                    return a;
                                case S:
                                    return C ? x : S;
                                case T:
                                    return C = !0, w;
                                case _:
                                    return k;
                                case $:
                                    return n < 1 || n + 1 >= t.length || (r = i[n - 1]) != S && r != x || (l = t[n + 1]) != S && l != x ? k : (l = C ? x : l) == r ? l : k;
                                case L:
                                    return (r = 0 < n ? i[n - 1] : E) == S && n + 1 < t.length && t[n + 1] == S ? S : k;
                                case B:
                                    if (0 < n && i[n - 1] == S) return S;
                                    if (C) return k;
                                    for (s = n + 1, o = t.length; s < o && t[s] == B;) s++;
                                    return s < o && t[s] == S ? S : k;
                                case W:
                                    for (o = t.length,
                                             s = n + 1; s < o && t[s] == W;) s++;
                                    if (s < o) {
                                        var l = e[n], l = 1425 <= l && l <= 2303 || 64286 == l;
                                        if (r = t[s], l && (r == w || r == T)) return w
                                    }
                                    return n < 1 || (r = t[n - 1]) == E ? k : i[n - 1];
                                case E:
                                    return I = !(C = !1), m;
                                case R:
                                    return v = !0, k;
                                case N:
                                case G:
                                case P:
                                case H:
                                case F:
                                    C = !1;
                                case V:
                                    return k
                            }
                        }(e, n, g, u), a = 240 & (c = l[r][o]), c &= 15, t[u] = s = l[c][5], 0 < a) if (16 == a) {
                            for (d = h; d < u; d++) t[d] = 1;
                            h = -1
                        } else h = -1;
                        if (l[c][6]) -1 == h && (h = u); else if (-1 < h) {
                            for (d = h; d < u; d++) t[d] = s;
                            h = -1
                        }
                        n[u] == E && (t[u] = 0), f |= s
                    }
                    if (v) for (d = 0; d < i; d++) if (n[d] == R) {
                        t[d] = m;
                        for (var p = d - 1; 0 <= p && n[p] == _; p--) t[p] = m
                    }
                }

                function h(e, t, i) {
                    if (!(f < e)) if (1 != e || 1 != m || I) for (var n, r, o, s, a = i.length, l = 0; l < a;) {
                        if (t[l] >= e) {
                            for (n = l + 1; n < a && t[n] >= e;) n++;
                            for (r = l, o = n - 1; r < o; r++, o--) s = i[r], i[r] = i[o], i[o] = s;
                            l = n
                        }
                        l++
                    } else i.reverse()
                }

                function Z(e) {
                    var t = e.charCodeAt(0), i = t >> 8;
                    return 0 == i ? 191 < t ? y : n[t] : 5 == i ? /[\u0591-\u05f4]/.test(e) ? w : y : 6 == i ? /[\u0610-\u061a\u064b-\u065f\u06d6-\u06e4\u06e7-\u06ed]/.test(e) ? W : /[\u0660-\u0669\u066b-\u066c]/.test(e) ? x : 1642 == t ? B : /[\u06f0-\u06f9]/.test(e) ? S : T : 32 == i && t <= 8287 ? r[255 & t] : 254 == i && 65136 <= t ? T : k
                }

                l.L = y, l.R = w, l.EN = S, l.ON_R = 3, l.AN = 4, l.R_H = 5, l.B = 6, l.RLE = 7, l.DOT = "·", l.doBidiReorder = function (e, t, i) {
                    if (e.length < 2) return {};
                    var n = e.split(""), r = new Array(n.length), o = new Array(n.length), s = [];
                    m = i ? 1 : 0, c(n, s, n.length, t);
                    for (var a = 0; a < r.length; r[a] = a, a++) ;
                    h(2, s, r), h(1, s, r);
                    for (a = 0; a < r.length - 1; a++) t[a] === x ? s[a] = l.AN : s[a] === w && (t[a] > T && t[a] < N || t[a] === k || t[a] === V) ? s[a] = l.ON_R : 0 < a && "ل" === n[a - 1] && /\u0622|\u0623|\u0625|\u0627/.test(n[a]) && (s[a - 1] = s[a] = l.R_H, a++);
                    n[n.length - 1] === l.DOT && (s[n.length - 1] = l.B), "‫" === n[0] && (s[0] = l.RLE);
                    for (a = 0; a < r.length; a++) o[a] = s[r[a]];
                    return {logicalFromVisual: r, bidiLevels: o}
                }, l.hasBidiCharacters = function (e, t) {
                    for (var i = !1, n = 0; n < e.length; n++) t[n] = Z(e.charAt(n)), i || t[n] != w && t[n] != T && t[n] != x || (i = !0);
                    return i
                }, l.getVisualFromLogicalIdx = function (e, t) {
                    for (var i = 0; i < t.logicalFromVisual.length; i++) if (t.logicalFromVisual[i] == e) return i;
                    return 0
                }
            }), ace.define("ace/bidihandler", ["require", "exports", "module", "ace/lib/bidiutil", "ace/lib/lang"], function (e, t, i) {
                "use strict";
                var a = e("./lib/bidiutil"), s = e("./lib/lang"), n = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac\u202B]/,
                    e = function (e) {
                        this.session = e, this.bidiMap = {}, this.currentRow = null, this.bidiUtil = a, this.charWidths = [], this.EOL = "¬", this.showInvisibles = !0, this.isRtlDir = !1, this.$isRtl = !1, this.line = "", this.wrapIndent = 0, this.EOF = "¶", this.RLE = "‫", this.contentWidth = 0, this.fontMetrics = null, this.rtlLineOffset = 0, this.wrapOffset = 0, this.isMoveLeftOperation = !1, this.seenBidi = n.test(e.getValue())
                    };
                !function () {
                    this.isBidiRow = function (e, t, i) {
                        return !!this.seenBidi && (e !== this.currentRow && (this.currentRow = e, this.updateRowLine(t, i), this.updateBidiMap()), this.bidiMap.bidiLevels)
                    }, this.onChange = function (e) {
                        this.seenBidi ? this.currentRow = null : "insert" == e.action && n.test(e.lines.join("\n")) && (this.seenBidi = !0, this.currentRow = null)
                    }, this.getDocumentRow = function () {
                        var e = 0, t = this.session.$screenRowCache;
                        return !t.length || 0 <= (t = this.session.$getRowCacheIndex(t, this.currentRow)) && (e = this.session.$docRowCache[t]), e
                    }, this.getSplitIndex = function () {
                        var e = 0, t = this.session.$screenRowCache;
                        if (t.length) for (var i, n = this.session.$getRowCacheIndex(t, this.currentRow); 0 < this.currentRow - e && (i = this.session.$getRowCacheIndex(t, this.currentRow - e - 1)) === n;) n = i, e++; else e = this.currentRow;
                        return e
                    }, this.updateRowLine = function (e, t) {
                        var i = (e = void 0 === e ? this.getDocumentRow() : e) === this.session.getLength() - 1 ? this.EOF : this.EOL;
                        this.wrapIndent = 0, this.line = this.session.getLine(e), this.isRtlDir = this.$isRtl || this.line.charAt(0) === this.RLE, this.session.$useWrapMode ? ((e = this.session.$wrapData[e]) && (0 < (t = void 0 === t ? this.getSplitIndex() : t) && e.length ? (this.wrapIndent = e.indent, this.wrapOffset = this.wrapIndent * this.charWidths[a.L], this.line = t < e.length ? this.line.substring(e[t - 1], e[t]) : this.line.substring(e[e.length - 1])) : this.line = this.line.substring(0, e[t])), t == e.length && (this.line += this.showInvisibles ? i : a.DOT)) : this.line += this.showInvisibles ? i : a.DOT;
                        var n, r = this.session, o = 0;
                        this.line = this.line.replace(/\t|[\u1100-\u2029, \u202F-\uFFE6]/g, function (e, t) {
                            return "\t" === e || r.isFullWidth(e.charCodeAt(0)) ? (n = "\t" === e ? r.getScreenTabSize(t + o) : 2, o += n - 1, s.stringRepeat(a.DOT, n)) : e
                        }), this.isRtlDir && (this.fontMetrics.$main.textContent = this.line.charAt(this.line.length - 1) == a.DOT ? this.line.substr(0, this.line.length - 1) : this.line, this.rtlLineOffset = this.contentWidth - this.fontMetrics.$main.getBoundingClientRect().width)
                    }, this.updateBidiMap = function () {
                        var e = [];
                        a.hasBidiCharacters(this.line, e) || this.isRtlDir ? this.bidiMap = a.doBidiReorder(this.line, e, this.isRtlDir) : this.bidiMap = {}
                    }, this.markAsDirty = function () {
                        this.currentRow = null
                    }, this.updateCharacterWidths = function (e) {
                        var t;
                        this.characterWidth !== e.$characterSize.width && (this.fontMetrics = e, t = this.characterWidth = e.$characterSize.width, e = e.$measureCharWidth("ה"), this.charWidths[a.L] = this.charWidths[a.EN] = this.charWidths[a.ON_R] = t, this.charWidths[a.R] = this.charWidths[a.AN] = e, this.charWidths[a.R_H] = .45 * e, this.charWidths[a.B] = this.charWidths[a.RLE] = 0, this.currentRow = null)
                    }, this.setShowInvisibles = function (e) {
                        this.showInvisibles = e, this.currentRow = null
                    }, this.setEolChar = function (e) {
                        this.EOL = e
                    }, this.setContentWidth = function (e) {
                        this.contentWidth = e
                    }, this.isRtlLine = function (e) {
                        return !!this.$isRtl || (null != e ? this.session.getLine(e).charAt(0) == this.RLE : this.isRtlDir)
                    }, this.setRtlDirection = function (e, t) {
                        for (var i = e.getCursorPosition(), n = e.selection.getSelectionAnchor().row; n <= i.row; n++) t || e.session.getLine(n).charAt(0) !== e.session.$bidiHandler.RLE ? t && e.session.getLine(n).charAt(0) !== e.session.$bidiHandler.RLE && e.session.doc.insert({
                            column: 0,
                            row: n
                        }, e.session.$bidiHandler.RLE) : e.session.doc.removeInLine(n, 0, 1)
                    }, this.getPosLeft = function (e) {
                        e -= this.wrapIndent;
                        var t = this.line.charAt(0) === this.RLE ? 1 : 0,
                            i = t < e ? this.session.getOverwrite() ? e : e - 1 : t,
                            n = a.getVisualFromLogicalIdx(i, this.bidiMap), r = this.bidiMap.bidiLevels, o = 0;
                        !this.session.getOverwrite() && e <= t && r[n] % 2 != 0 && n++;
                        for (var s = 0; s < n; s++) o += this.charWidths[r[s]];
                        return !this.session.getOverwrite() && t < e && r[n] % 2 == 0 && (o += this.charWidths[r[n]]), this.wrapIndent && (o += this.isRtlDir ? -1 * this.wrapOffset : this.wrapOffset), this.isRtlDir && (o += this.rtlLineOffset), o
                    }, this.getSelections = function (e, t) {
                        var i, n = this.bidiMap, r = n.bidiLevels, o = [], s = 0, a = Math.min(e, t) - this.wrapIndent,
                            l = Math.max(e, t) - this.wrapIndent, c = !1, h = !1, d = 0;
                        this.wrapIndent && (s += this.isRtlDir ? -1 * this.wrapOffset : this.wrapOffset);
                        for (var u, g = 0; g < r.length; g++) u = n.logicalFromVisual[g], i = r[g], (c = a <= u && u < l) && !h ? d = s : !c && h && o.push({
                            left: d,
                            width: s - d
                        }), s += this.charWidths[i], h = c;
                        if (c && g === r.length && o.push({
                            left: d,
                            width: s - d
                        }), this.isRtlDir) for (var p = 0; p < o.length; p++) o[p].left += this.rtlLineOffset;
                        return o
                    }, this.offsetToCol = function (e) {
                        this.isRtlDir && (e -= this.rtlLineOffset);
                        var t = 0, e = Math.max(e, 0), i = 0, n = 0, r = this.bidiMap.bidiLevels,
                            o = this.charWidths[r[n]];
                        for (this.wrapIndent && (e -= this.isRtlDir ? -1 * this.wrapOffset : this.wrapOffset); i + o / 2 < e;) {
                            if (i += o, n === r.length - 1) {
                                o = 0;
                                break
                            }
                            o = this.charWidths[r[++n]]
                        }
                        return 0 === (t = 0 < n && r[n - 1] % 2 != 0 && r[n] % 2 == 0 ? (e < i && n--, this.bidiMap.logicalFromVisual[n]) : 0 < n && r[n - 1] % 2 == 0 && r[n] % 2 != 0 ? 1 + (i < e ? this.bidiMap.logicalFromVisual[n] : this.bidiMap.logicalFromVisual[n - 1]) : this.isRtlDir && n === r.length - 1 && 0 === o && r[n - 1] % 2 == 0 || !this.isRtlDir && 0 === n && r[n] % 2 != 0 ? 1 + this.bidiMap.logicalFromVisual[n] : (0 < n && r[n - 1] % 2 != 0 && 0 !== o && n--, this.bidiMap.logicalFromVisual[n])) && this.isRtlDir && t++, t + this.wrapIndent
                    }
                }.call(e.prototype), t.BidiHandler = e
            }), ace.define("ace/selection", ["require", "exports", "module", "ace/lib/oop", "ace/lib/lang", "ace/lib/event_emitter", "ace/range"], function (e, t, i) {
                "use strict";
                var n = e("./lib/oop"), r = e("./lib/lang"), o = e("./lib/event_emitter").EventEmitter,
                    s = e("./range").Range, e = function (e) {
                        this.session = e, this.doc = e.getDocument(), this.clearSelection(), this.cursor = this.lead = this.doc.createAnchor(0, 0), this.anchor = this.doc.createAnchor(0, 0), this.$silent = !1;
                        var t = this;
                        this.cursor.on("change", function (e) {
                            t.$cursorChanged = !0, t.$silent || t._emit("changeCursor"), t.$isEmpty || t.$silent || t._emit("changeSelection"), t.$keepDesiredColumnOnChange || e.old.column == e.value.column || (t.$desiredColumn = null)
                        }), this.anchor.on("change", function () {
                            t.$anchorChanged = !0, t.$isEmpty || t.$silent || t._emit("changeSelection")
                        })
                    };
                !function () {
                    n.implement(this, o), this.isEmpty = function () {
                        return this.$isEmpty || this.anchor.row == this.lead.row && this.anchor.column == this.lead.column
                    }, this.isMultiLine = function () {
                        return !this.$isEmpty && this.anchor.row != this.cursor.row
                    }, this.getCursor = function () {
                        return this.lead.getPosition()
                    }, this.setSelectionAnchor = function (e, t) {
                        this.$isEmpty = !1, this.anchor.setPosition(e, t)
                    }, this.getAnchor = this.getSelectionAnchor = function () {
                        return this.$isEmpty ? this.getSelectionLead() : this.anchor.getPosition()
                    }, this.getSelectionLead = function () {
                        return this.lead.getPosition()
                    }, this.isBackwards = function () {
                        var e = this.anchor, t = this.lead;
                        return e.row > t.row || e.row == t.row && e.column > t.column
                    }, this.getRange = function () {
                        var e = this.anchor, t = this.lead;
                        return this.$isEmpty ? s.fromPoints(t, t) : this.isBackwards() ? s.fromPoints(t, e) : s.fromPoints(e, t)
                    }, this.clearSelection = function () {
                        this.$isEmpty || (this.$isEmpty = !0, this._emit("changeSelection"))
                    }, this.selectAll = function () {
                        this.$setSelection(0, 0, Number.MAX_VALUE, Number.MAX_VALUE)
                    }, this.setRange = this.setSelectionRange = function (e, t) {
                        var i = t ? e.end : e.start, e = t ? e.start : e.end;
                        this.$setSelection(i.row, i.column, e.row, e.column)
                    }, this.$setSelection = function (e, t, i, n) {
                        var r, o;
                        this.$silent || (r = this.$isEmpty, o = this.inMultiSelectMode, this.$silent = !0, this.$cursorChanged = this.$anchorChanged = !1, this.anchor.setPosition(e, t), this.cursor.setPosition(i, n), this.$isEmpty = !s.comparePoints(this.anchor, this.cursor), this.$silent = !1, this.$cursorChanged && this._emit("changeCursor"), (this.$cursorChanged || this.$anchorChanged || r != this.$isEmpty || o) && this._emit("changeSelection"))
                    }, this.$moveSelection = function (e) {
                        var t = this.lead;
                        this.$isEmpty && this.setSelectionAnchor(t.row, t.column), e.call(this)
                    }, this.selectTo = function (e, t) {
                        this.$moveSelection(function () {
                            this.moveCursorTo(e, t)
                        })
                    }, this.selectToPosition = function (e) {
                        this.$moveSelection(function () {
                            this.moveCursorToPosition(e)
                        })
                    }, this.moveTo = function (e, t) {
                        this.clearSelection(), this.moveCursorTo(e, t)
                    }, this.moveToPosition = function (e) {
                        this.clearSelection(), this.moveCursorToPosition(e)
                    }, this.selectUp = function () {
                        this.$moveSelection(this.moveCursorUp)
                    }, this.selectDown = function () {
                        this.$moveSelection(this.moveCursorDown)
                    }, this.selectRight = function () {
                        this.$moveSelection(this.moveCursorRight)
                    }, this.selectLeft = function () {
                        this.$moveSelection(this.moveCursorLeft)
                    }, this.selectLineStart = function () {
                        this.$moveSelection(this.moveCursorLineStart)
                    }, this.selectLineEnd = function () {
                        this.$moveSelection(this.moveCursorLineEnd)
                    }, this.selectFileEnd = function () {
                        this.$moveSelection(this.moveCursorFileEnd)
                    }, this.selectFileStart = function () {
                        this.$moveSelection(this.moveCursorFileStart)
                    }, this.selectWordRight = function () {
                        this.$moveSelection(this.moveCursorWordRight)
                    }, this.selectWordLeft = function () {
                        this.$moveSelection(this.moveCursorWordLeft)
                    }, this.getWordRange = function (e, t) {
                        var i;
                        return void 0 === t && (e = (i = e || this.lead).row, t = i.column), this.session.getWordRange(e, t)
                    }, this.selectWord = function () {
                        this.setSelectionRange(this.getWordRange())
                    }, this.selectAWord = function () {
                        var e = this.getCursor(), e = this.session.getAWordRange(e.row, e.column);
                        this.setSelectionRange(e)
                    }, this.getLineRange = function (e, t) {
                        var i = "number" == typeof e ? e : this.lead.row, e = this.session.getFoldLine(i),
                            e = e ? (i = e.start.row, e.end.row) : i;
                        return !0 === t ? new s(i, 0, e, this.session.getLine(e).length) : new s(i, 0, e + 1, 0)
                    }, this.selectLine = function () {
                        this.setSelectionRange(this.getLineRange())
                    }, this.moveCursorUp = function () {
                        this.moveCursorBy(-1, 0)
                    }, this.moveCursorDown = function () {
                        this.moveCursorBy(1, 0)
                    }, this.wouldMoveIntoSoftTab = function (e, t, i) {
                        var n = e.column, r = e.column + t;
                        return i < 0 && (n = e.column - t, r = e.column), this.session.isTabStop(e) && this.doc.getLine(e.row).slice(n, r).split(" ").length - 1 == t
                    }, this.moveCursorLeft = function () {
                        var e, t = this.lead.getPosition();
                        (e = this.session.getFoldAt(t.row, t.column, -1)) ? this.moveCursorTo(e.start.row, e.start.column) : 0 === t.column ? 0 < t.row && this.moveCursorTo(t.row - 1, this.doc.getLine(t.row - 1).length) : (e = this.session.getTabSize(), this.wouldMoveIntoSoftTab(t, e, -1) && !this.session.getNavigateWithinSoftTabs() ? this.moveCursorBy(0, -e) : this.moveCursorBy(0, -1))
                    }, this.moveCursorRight = function () {
                        var e, t = this.lead.getPosition();
                        (e = this.session.getFoldAt(t.row, t.column, 1)) ? this.moveCursorTo(e.end.row, e.end.column) : this.lead.column == this.doc.getLine(this.lead.row).length ? this.lead.row < this.doc.getLength() - 1 && this.moveCursorTo(this.lead.row + 1, 0) : (e = this.session.getTabSize(), t = this.lead, this.wouldMoveIntoSoftTab(t, e, 1) && !this.session.getNavigateWithinSoftTabs() ? this.moveCursorBy(0, e) : this.moveCursorBy(0, 1))
                    }, this.moveCursorLineStart = function () {
                        var e = this.lead.row, t = this.lead.column, i = this.session.documentToScreenRow(e, t),
                            i = this.session.screenToDocumentPosition(i, 0),
                            e = this.session.getDisplayLine(e, null, i.row, i.column).match(/^\s*/);
                        e[0].length == t || this.session.$useEmacsStyleLineStart || (i.column += e[0].length), this.moveCursorToPosition(i)
                    }, this.moveCursorLineEnd = function () {
                        var e = this.lead, t = this.session.getDocumentLastRowColumnPosition(e.row, e.column);
                        this.lead.column == t.column && (e = this.session.getLine(t.row), t.column != e.length || 0 < (e = e.search(/\s+$/)) && (t.column = e)), this.moveCursorTo(t.row, t.column)
                    }, this.moveCursorFileEnd = function () {
                        var e = this.doc.getLength() - 1, t = this.doc.getLine(e).length;
                        this.moveCursorTo(e, t)
                    }, this.moveCursorFileStart = function () {
                        this.moveCursorTo(0, 0)
                    }, this.moveCursorLongWordRight = function () {
                        var e = this.lead.row, t = this.lead.column, i = this.doc.getLine(e), n = i.substring(t);
                        this.session.nonTokenRe.lastIndex = 0, this.session.tokenRe.lastIndex = 0;
                        var r = this.session.getFoldAt(e, t, 1);
                        if (r) this.moveCursorTo(r.end.row, r.end.column); else {
                            if (this.session.nonTokenRe.exec(n) && (t += this.session.nonTokenRe.lastIndex, this.session.nonTokenRe.lastIndex = 0, n = i.substring(t)), t >= i.length) return this.moveCursorTo(e, i.length), this.moveCursorRight(), void (e < this.doc.getLength() - 1 && this.moveCursorWordRight());
                            this.session.tokenRe.exec(n) && (t += this.session.tokenRe.lastIndex, this.session.tokenRe.lastIndex = 0), this.moveCursorTo(e, t)
                        }
                    }, this.moveCursorLongWordLeft = function () {
                        var e = this.lead.row, t = this.lead.column;
                        if (i = this.session.getFoldAt(e, t, -1)) this.moveCursorTo(i.start.row, i.start.column); else {
                            var i = this.session.getFoldStringAt(e, t, -1);
                            null == i && (i = this.doc.getLine(e).substring(0, t));
                            i = r.stringReverse(i);
                            if (this.session.nonTokenRe.lastIndex = 0, this.session.tokenRe.lastIndex = 0, this.session.nonTokenRe.exec(i) && (t -= this.session.nonTokenRe.lastIndex, i = i.slice(this.session.nonTokenRe.lastIndex), this.session.nonTokenRe.lastIndex = 0), t <= 0) return this.moveCursorTo(e, 0), this.moveCursorLeft(), void (0 < e && this.moveCursorWordLeft());
                            this.session.tokenRe.exec(i) && (t -= this.session.tokenRe.lastIndex, this.session.tokenRe.lastIndex = 0), this.moveCursorTo(e, t)
                        }
                    }, this.$shortWordEndIndex = function (e) {
                        var t, i = 0, n = /\s/, r = this.session.tokenRe;
                        if (r.lastIndex = 0, this.session.tokenRe.exec(e)) i = this.session.tokenRe.lastIndex; else {
                            for (; (t = e[i]) && n.test(t);) i++;
                            if (i < 1) for (r.lastIndex = 0; (t = e[i]) && !r.test(t);) if (r.lastIndex = 0, i++, n.test(t)) {
                                if (2 < i) {
                                    i--;
                                    break
                                }
                                for (; (t = e[i]) && n.test(t);) i++;
                                if (2 < i) break
                            }
                        }
                        return r.lastIndex = 0, i
                    }, this.moveCursorShortWordRight = function () {
                        var e = this.lead.row, t = this.lead.column, i = this.doc.getLine(e), n = i.substring(t),
                            r = this.session.getFoldAt(e, t, 1);
                        if (r) return this.moveCursorTo(r.end.row, r.end.column);
                        if (t == i.length) {
                            for (var o = this.doc.getLength(); n = this.doc.getLine(++e), e < o && /^\s*$/.test(n);) ;
                            /^\s+/.test(n) || (n = ""), t = 0
                        }
                        i = this.$shortWordEndIndex(n);
                        this.moveCursorTo(e, t + i)
                    }, this.moveCursorShortWordLeft = function () {
                        var e = this.lead.row, t = this.lead.column;
                        if (n = this.session.getFoldAt(e, t, -1)) return this.moveCursorTo(n.start.row, n.start.column);
                        var i = this.session.getLine(e).substring(0, t);
                        if (0 === t) {
                            for (; i = this.doc.getLine(--e), 0 < e && /^\s*$/.test(i);) ;
                            t = i.length, /\s+$/.test(i) || (i = "")
                        }
                        var n = r.stringReverse(i), n = this.$shortWordEndIndex(n);
                        return this.moveCursorTo(e, t - n)
                    }, this.moveCursorWordRight = function () {
                        this.session.$selectLongWords ? this.moveCursorLongWordRight() : this.moveCursorShortWordRight()
                    }, this.moveCursorWordLeft = function () {
                        this.session.$selectLongWords ? this.moveCursorLongWordLeft() : this.moveCursorShortWordLeft()
                    }, this.moveCursorBy = function (e, t) {
                        var i, n = this.session.documentToScreenPosition(this.lead.row, this.lead.column);
                        0 === t && (0 !== e && (this.session.$bidiHandler.isBidiRow(n.row, this.lead.row) ? (r = this.session.$bidiHandler.getPosLeft(n.column), n.column = Math.round(r / this.session.$bidiHandler.charWidths[0])) : r = n.column * this.session.$bidiHandler.charWidths[0]), this.$desiredColumn ? n.column = this.$desiredColumn : this.$desiredColumn = n.column), 0 != e && this.session.lineWidgets && this.session.lineWidgets[this.lead.row] && (i = this.session.lineWidgets[this.lead.row], e < 0 ? e -= i.rowsAbove || 0 : 0 < e && (e += i.rowCount - (i.rowsAbove || 0)));
                        var r = this.session.screenToDocumentPosition(n.row + e, n.column, r);
                        0 !== e && 0 === t && r.row === this.lead.row && (r.column, this.lead.column), this.moveCursorTo(r.row, r.column + t, 0 === t)
                    }, this.moveCursorToPosition = function (e) {
                        this.moveCursorTo(e.row, e.column)
                    }, this.moveCursorTo = function (e, t, i) {
                        var n = this.session.getFoldAt(e, t, 1);
                        n && (e = n.start.row, t = n.start.column), this.$keepDesiredColumnOnChange = !0;
                        n = this.session.getLine(e);
                        /[\uDC00-\uDFFF]/.test(n.charAt(t)) && n.charAt(t - 1) && (this.lead.row == e && this.lead.column == t + 1 ? t -= 1 : t += 1), this.lead.setPosition(e, t), this.$keepDesiredColumnOnChange = !1, i || (this.$desiredColumn = null)
                    }, this.moveCursorToScreen = function (e, t, i) {
                        t = this.session.screenToDocumentPosition(e, t);
                        this.moveCursorTo(t.row, t.column, i)
                    }, this.detach = function () {
                        this.lead.detach(), this.anchor.detach(), this.session = this.doc = null
                    }, this.fromOrientedRange = function (e) {
                        this.setSelectionRange(e, e.cursor == e.start), this.$desiredColumn = e.desiredColumn || this.$desiredColumn
                    }, this.toOrientedRange = function (e) {
                        var t = this.getRange();
                        return e ? (e.start.column = t.start.column, e.start.row = t.start.row, e.end.column = t.end.column, e.end.row = t.end.row) : e = t, e.cursor = this.isBackwards() ? e.start : e.end, e.desiredColumn = this.$desiredColumn, e
                    }, this.getRangeOfMovements = function (e) {
                        var t = this.getCursor();
                        try {
                            e(this);
                            var i = this.getCursor();
                            return s.fromPoints(t, i)
                        } catch (e) {
                            return s.fromPoints(t, t)
                        } finally {
                            this.moveCursorToPosition(t)
                        }
                    }, this.toJSON = function () {
                        var e;
                        return this.rangeCount ? e = this.ranges.map(function (e) {
                            var t = e.clone();
                            return t.isBackwards = e.cursor == e.start, t
                        }) : (e = this.getRange()).isBackwards = this.isBackwards(), e
                    }, this.fromJSON = function (e) {
                        if (null == e.start) {
                            if (this.rangeList && 1 < e.length) {
                                this.toSingleRange(e[0]);
                                for (var t = e.length; t--;) {
                                    var i = s.fromPoints(e[t].start, e[t].end);
                                    e[t].isBackwards && (i.cursor = i.start), this.addRange(i, !0)
                                }
                                return
                            }
                            e = e[0]
                        }
                        this.rangeList && this.toSingleRange(e), this.setSelectionRange(e, e.isBackwards)
                    }, this.isEqual = function (e) {
                        if ((e.length || this.rangeCount) && e.length != this.rangeCount) return !1;
                        if (!e.length || !this.ranges) return this.getRange().isEqual(e);
                        for (var t = this.ranges.length; t--;) if (!this.ranges[t].isEqual(e[t])) return !1;
                        return !0
                    }
                }.call(e.prototype), t.Selection = e
            }), ace.define("ace/tokenizer", ["require", "exports", "module", "ace/config"], function (e, t, i) {
                "use strict";
                var n = e("./config"), I = 2e3, e = function (e) {
                    for (var t in this.states = e, this.regExps = {}, this.matchMappings = {}, this.states) {
                        for (var i = this.states[t], n = [], r = 0, o = this.matchMappings[t] = {defaultToken: "text"}, s = "g", a = [], l = 0; l < i.length; l++) {
                            var c, h, d = i[l];
                            d.defaultToken && (o.defaultToken = d.defaultToken), d.caseInsensitive && (s = "gi"), null != d.regex && (d.regex instanceof RegExp && (d.regex = d.regex.toString().slice(1, -1)), c = d.regex, h = new RegExp("(?:(" + c + ")|(.))").exec("a").length - 2, Array.isArray(d.token) ? 1 == d.token.length || 1 == h ? d.token = d.token[0] : h - 1 != d.token.length ? (this.reportError("number of classes and regexp groups doesn't match", {
                                rule: d,
                                groupCount: h - 1
                            }), d.token = d.token[0]) : (d.tokenArray = d.token, d.token = null, d.onMatch = this.$arrayTokens) : "function" != typeof d.token || d.onMatch || (d.onMatch = 1 < h ? this.$applyToken : d.token), 1 < h && (c = /\\\d/.test(d.regex) ? d.regex.replace(/\\([0-9]+)/g, function (e, t) {
                                return "\\" + (parseInt(t, 10) + r + 1)
                            }) : (h = 1, this.removeCapturingGroups(d.regex)), d.splitRegex || "string" == typeof d.token || a.push(d)), o[r] = l, r += h, n.push(c), d.onMatch || (d.onMatch = null))
                        }
                        n.length || (o[0] = 0, n.push("$")), a.forEach(function (e) {
                            e.splitRegex = this.createSplitterRegexp(e.regex, s)
                        }, this), this.regExps[t] = new RegExp("(" + n.join(")|(") + ")|($)", s)
                    }
                };
                !function () {
                    this.$setMaxTokenCount = function (e) {
                        I = 0 | e
                    }, this.$applyToken = function (e) {
                        var t = this.splitRegex.exec(e).slice(1), i = this.token.apply(this, t);
                        if ("string" == typeof i) return [{type: i, value: e}];
                        for (var n = [], r = 0, o = i.length; r < o; r++) t[r] && (n[n.length] = {
                            type: i[r],
                            value: t[r]
                        });
                        return n
                    }, this.$arrayTokens = function (e) {
                        if (!e) return [];
                        var t = this.splitRegex.exec(e);
                        if (!t) return "text";
                        for (var i = [], n = this.tokenArray, r = 0, o = n.length; r < o; r++) t[r + 1] && (i[i.length] = {
                            type: n[r],
                            value: t[r + 1]
                        });
                        return i
                    }, this.removeCapturingGroups = function (e) {
                        return e.replace(/\\.|\[(?:\\.|[^\\\]])*|\(\?[:=!]|(\()/g, function (e, t) {
                            return t ? "(?:" : e
                        })
                    }, this.createSplitterRegexp = function (e, t) {
                        var s, a, l;
                        return -1 != e.indexOf("(?=") && (s = 0, a = !1, l = {}, e.replace(/(\\.)|(\((?:\?[=!])?)|(\))|([\[\]])/g, function (e, t, i, n, r, o) {
                            return a ? a = "]" != r : r ? a = !0 : n ? (s == l.stack && (l.end = o + 1, l.stack = -1), s--) : i && (s++, 1 != i.length && (l.stack = s, l.start = o)), e
                        }), null != l.end && /^\)*$/.test(e.substr(l.end)) && (e = e.substring(0, l.start) + e.substr(l.end))), "$" != (e = "^" != e.charAt(0) ? "^" + e : e).charAt(e.length - 1) && (e += "$"), new RegExp(e, (t || "").replace("g", ""))
                    }, this.getLineTokens = function (e, t) {
                        var i;
                        t && "string" != typeof t ? "#tmp" === (t = (i = t.slice(0))[0]) && (i.shift(), t = i.shift()) : i = [];
                        for (var n, r = t || "start", o = (o = this.states[r]) || this.states[r = "start"], s = this.matchMappings[r], a = this.regExps[r], l = [], c = a.lastIndex = 0, h = 0, d = {
                            type: null,
                            value: ""
                        }; n = a.exec(e);) {
                            var u, g = s.defaultToken, p = null, m = n[0], f = a.lastIndex;
                            f - m.length > c && (u = e.substring(c, f - m.length), d.type == g ? d.value += u : (d.type && l.push(d), d = {
                                type: g,
                                value: u
                            }));
                            for (var C = 0; C < n.length - 2; C++) if (void 0 !== n[C + 1]) {
                                g = (p = o[s[C]]).onMatch ? p.onMatch(m, r, i, e) : p.token, p.next && (r = "string" == typeof p.next ? p.next : p.next(r, i), (o = this.states[r]) || (this.reportError("state doesn't exist", r), o = this.states[r = "start"]), s = this.matchMappings[r], (a = this.regExps[r]).lastIndex = c = f), p.consumeLineEnd && (c = f);
                                break
                            }
                            if (m) if ("string" == typeof g) p && !1 === p.merge || d.type !== g ? (d.type && l.push(d), d = {
                                type: g,
                                value: m
                            }) : d.value += m; else if (g) {
                                d.type && l.push(d);
                                for (d = {type: null, value: ""}, C = 0; C < g.length; C++) l.push(g[C])
                            }
                            if (c == e.length) break;
                            if (c = f, h++ > I) {
                                for (h > 2 * e.length && this.reportError("infinite loop with in ace tokenizer", {
                                    startState: t,
                                    line: e
                                }); c < e.length;) d.type && l.push(d), d = {
                                    value: e.substring(c, c += 500),
                                    type: "overflow"
                                };
                                r = "start", i = [];
                                break
                            }
                        }
                        return d.type && l.push(d), 1 < i.length && i[0] !== r && i.unshift("#tmp", r), {
                            tokens: l,
                            state: i.length ? i : r
                        }
                    }, this.reportError = n.reportError
                }.call(e.prototype), t.Tokenizer = e
            }), ace.define("ace/mode/text_highlight_rules", ["require", "exports", "module", "ace/lib/lang"], function (e, t, i) {
                "use strict";
                var l = e("../lib/lang"), e = function () {
                    this.$rules = {start: [{token: "empty_line", regex: "^$"}, {defaultToken: "text"}]}
                };
                !function () {
                    this.addRules = function (e, t) {
                        if (t) for (var i in e) {
                            for (var n = e[i], r = 0; r < n.length; r++) {
                                var o = n[r];
                                (o.next || o.onMatch) && ("string" == typeof o.next && 0 !== o.next.indexOf(t) && (o.next = t + o.next), o.nextState && 0 !== o.nextState.indexOf(t) && (o.nextState = t + o.nextState))
                            }
                            this.$rules[t + i] = n
                        } else for (var i in e) this.$rules[i] = e[i]
                    }, this.getRules = function () {
                        return this.$rules
                    }, this.embedRules = function (e, t, i, n, r) {
                        e = "function" == typeof e ? (new e).getRules() : e;
                        if (n) for (var o = 0; o < n.length; o++) n[o] = t + n[o]; else for (var s in n = [], e) n.push(t + s);
                        if (this.addRules(e, t), i) for (var a = Array.prototype[r ? "push" : "unshift"], o = 0; o < n.length; o++) a.apply(this.$rules[n[o]], l.deepCopy(i));
                        this.$embeds || (this.$embeds = []), this.$embeds.push(t)
                    }, this.getEmbeds = function () {
                        return this.$embeds
                    };

                    function d(e, t) {
                        return "start" == e && !t.length || t.unshift(this.nextState, e), this.nextState
                    }

                    function u(e, t) {
                        return t.shift(), t.shift() || "start"
                    }

                    this.normalizeRules = function () {
                        var c = 0, h = this.$rules;
                        Object.keys(h).forEach(function e(t) {
                            var i = h[t];
                            i.processed = !0;
                            for (var n = 0; n < i.length; n++) {
                                var r = i[n], o = null;
                                Array.isArray(r) && (o = r, r = {}), !r.regex && r.start && (r.regex = r.start, r.next || (r.next = []), r.next.push({defaultToken: r.token}, {
                                    token: r.token + ".end",
                                    regex: r.end || r.start,
                                    next: "pop"
                                }), r.token = r.token + ".start", r.push = !0);
                                var s, a = r.next || r.push;
                                if (a && Array.isArray(a) ? ((s = r.stateName) || ("string" != typeof (s = r.token) && (s = s[0] || ""), h[s] && (s += c++)), h[s] = a, e(r.next = s)) : "pop" == a && (r.next = u), r.push && (r.nextState = r.next || r.push, r.next = d, delete r.push), r.rules) for (var l in r.rules) h[l] ? h[l].push && h[l].push.apply(h[l], r.rules[l]) : h[l] = r.rules[l];
                                a = "string" == typeof r ? r : r.include, (o = a ? Array.isArray(a) ? a.map(function (e) {
                                    return h[e]
                                }) : h[a] : o) && (o = [n, 1].concat(o), r.noEscape && (o = o.filter(function (e) {
                                    return !e.next
                                })), i.splice.apply(i, o), n--), r.keywordMap && (r.token = this.createKeywordMapper(r.keywordMap, r.defaultToken || "text", r.caseInsensitive), delete r.defaultToken)
                            }
                        }, this)
                    }, this.createKeywordMapper = function (r, t, o, s) {
                        var a = Object.create(null);
                        return this.$keywordList = [], Object.keys(r).forEach(function (e) {
                            for (var t = r[e].split(s || "|"), i = t.length; i--;) {
                                var n = t[i];
                                this.$keywordList.push(n), o && (n = n.toLowerCase()), a[n] = e
                            }
                        }, this), r = null, o ? function (e) {
                            return a[e.toLowerCase()] || t
                        } : function (e) {
                            return a[e] || t
                        }
                    }, this.getKeywords = function () {
                        return this.$keywords
                    }
                }.call(e.prototype), t.TextHighlightRules = e
            }), ace.define("ace/mode/behaviour", ["require", "exports", "module"], function (e, t, i) {
                "use strict";

                function n() {
                    this.$behaviours = {}
                }

                !function () {
                    this.add = function (e, t, i) {
                        switch (void 0) {
                            case this.$behaviours:
                                this.$behaviours = {};
                            case this.$behaviours[e]:
                                this.$behaviours[e] = {}
                        }
                        this.$behaviours[e][t] = i
                    }, this.addBehaviours = function (e) {
                        for (var t in e) for (var i in e[t]) this.add(t, i, e[t][i])
                    }, this.remove = function (e) {
                        this.$behaviours && this.$behaviours[e] && delete this.$behaviours[e]
                    }, this.inherit = function (e, t) {
                        t = ("function" == typeof e ? new e : e).getBehaviours(t), this.addBehaviours(t)
                    }, this.getBehaviours = function (e) {
                        if (e) {
                            for (var t = {}, i = 0; i < e.length; i++) this.$behaviours[e[i]] && (t[e[i]] = this.$behaviours[e[i]]);
                            return t
                        }
                        return this.$behaviours
                    }
                }.call(n.prototype), t.Behaviour = n
            }), ace.define("ace/token_iterator", ["require", "exports", "module", "ace/range"], function (e, t, i) {
                "use strict";
                var n = e("./range").Range, e = function (e, t, i) {
                    this.$session = e, this.$row = t, this.$rowTokens = e.getTokens(t);
                    i = e.getTokenAt(t, i);
                    this.$tokenIndex = i ? i.index : -1
                };
                !function () {
                    this.stepBackward = function () {
                        for (--this.$tokenIndex; this.$tokenIndex < 0;) {
                            if (--this.$row, this.$row < 0) return this.$row = 0, null;
                            this.$rowTokens = this.$session.getTokens(this.$row), this.$tokenIndex = this.$rowTokens.length - 1
                        }
                        return this.$rowTokens[this.$tokenIndex]
                    }, this.stepForward = function () {
                        var e;
                        for (this.$tokenIndex += 1; this.$tokenIndex >= this.$rowTokens.length;) {
                            if (this.$row += 1, e = e || this.$session.getLength(), this.$row >= e) return this.$row = e - 1, null;
                            this.$rowTokens = this.$session.getTokens(this.$row), this.$tokenIndex = 0
                        }
                        return this.$rowTokens[this.$tokenIndex]
                    }, this.getCurrentToken = function () {
                        return this.$rowTokens[this.$tokenIndex]
                    }, this.getCurrentTokenRow = function () {
                        return this.$row
                    }, this.getCurrentTokenColumn = function () {
                        var e = this.$rowTokens, t = this.$tokenIndex, i = e[t].start;
                        if (void 0 !== i) return i;
                        for (i = 0; 0 < t;) i += e[--t].value.length;
                        return i
                    }, this.getCurrentTokenPosition = function () {
                        return {row: this.$row, column: this.getCurrentTokenColumn()}
                    }, this.getCurrentTokenRange = function () {
                        var e = this.$rowTokens[this.$tokenIndex], t = this.getCurrentTokenColumn();
                        return new n(this.$row, t, this.$row, t + e.value.length)
                    }
                }.call(e.prototype), t.TokenIterator = e
            }), ace.define("ace/mode/behaviour/cstyle", ["require", "exports", "module", "ace/lib/oop", "ace/mode/behaviour", "ace/token_iterator", "ace/lib/lang"], function (e, t, i) {
                "use strict";

                function u(e) {
                    var t = -1;
                    if (e.multiSelect && (t = e.selection.index, l.rangeCount != e.multiSelect.rangeCount && (l = {rangeCount: e.multiSelect.rangeCount})), l[t]) return m = l[t];
                    m = l[t] = {
                        autoInsertedBrackets: 0,
                        autoInsertedRow: -1,
                        autoInsertedLineEnd: "",
                        maybeInsertedBrackets: 0,
                        maybeInsertedRow: -1,
                        maybeInsertedLineStart: "",
                        maybeInsertedLineEnd: ""
                    }
                }

                function g(e, t, i, n) {
                    var r = e.end.row - e.start.row;
                    return {text: i + t + n, selection: [0, e.start.column + 1, r, e.end.column + (r ? 0 : 1)]}
                }

                function p(d) {
                    this.add("braces", "insertion", function (e, t, i, n, r) {
                        var o = i.getCursorPosition(), s = n.doc.getLine(o.row);
                        if ("{" == r) {
                            u(i);
                            var a = i.getSelectionRange(), l = n.doc.getTextRange(a);
                            return "" !== l && "{" !== l && i.getWrapBehavioursEnabled() ? g(a, l, "{", "}") : p.isSaneInsertion(i, n) ? /[\]\}\)]/.test(s[o.column]) || i.inMultiSelectMode || d && d.braces ? (p.recordAutoInsert(i, n, "}"), {
                                text: "{}",
                                selection: [1, 1]
                            }) : (p.recordMaybeInsert(i, n, "{"), {text: "{", selection: [1, 1]}) : void 0
                        }
                        if ("}" == r) {
                            u(i);
                            var c = s.substring(o.column, o.column + 1);
                            if ("}" == c) if (null !== n.$findOpeningBracket("}", {
                                column: o.column + 1,
                                row: o.row
                            }) && p.isAutoInsertedClosing(o, s, r)) return p.popAutoInsertedClosing(), {
                                text: "",
                                selection: [1, 1]
                            }
                        } else {
                            if ("\n" == r || "\r\n" == r) {
                                u(i);
                                i = "";
                                if (p.isMaybeInsertedClosing(o, s) && (i = f.stringRepeat("}", m.maybeInsertedBrackets), p.clearMaybeInsertedClosing()), "}" === (c = s.substring(o.column, o.column + 1))) {
                                    var h = n.findMatchingBracket({row: o.row, column: o.column + 1}, "}");
                                    if (!h) return null;
                                    h = this.$getIndent(n.getLine(h.row))
                                } else {
                                    if (!i) return void p.clearMaybeInsertedClosing();
                                    h = this.$getIndent(s)
                                }
                                n = h + n.getTabString();
                                return {text: "\n" + n + "\n" + h + i, selection: [1, n.length, 1, n.length]}
                            }
                            p.clearMaybeInsertedClosing()
                        }
                    }), this.add("braces", "deletion", function (e, t, i, n, r) {
                        var o = n.doc.getTextRange(r);
                        if (!r.isMultiLine() && "{" == o) {
                            if (u(i), "}" == n.doc.getLine(r.start.row).substring(r.end.column, r.end.column + 1)) return r.end.column++, r;
                            m.maybeInsertedBrackets--
                        }
                    }), this.add("parens", "insertion", function (e, t, i, n, r) {
                        if ("(" == r) {
                            u(i);
                            var o = i.getSelectionRange(), s = n.doc.getTextRange(o);
                            return "" !== s && i.getWrapBehavioursEnabled() ? g(o, s, "(", ")") : p.isSaneInsertion(i, n) ? (p.recordAutoInsert(i, n, ")"), {
                                text: "()",
                                selection: [1, 1]
                            }) : void 0
                        }
                        if (")" == r) {
                            u(i);
                            o = i.getCursorPosition(), s = n.doc.getLine(o.row), i = s.substring(o.column, o.column + 1);
                            if (")" == i) if (null !== n.$findOpeningBracket(")", {
                                column: o.column + 1,
                                row: o.row
                            }) && p.isAutoInsertedClosing(o, s, r)) return p.popAutoInsertedClosing(), {
                                text: "",
                                selection: [1, 1]
                            }
                        }
                    }), this.add("parens", "deletion", function (e, t, i, n, r) {
                        var o = n.doc.getTextRange(r);
                        if (!r.isMultiLine() && "(" == o && (u(i), ")" == n.doc.getLine(r.start.row).substring(r.start.column + 1, r.start.column + 2))) return r.end.column++, r
                    }), this.add("brackets", "insertion", function (e, t, i, n, r) {
                        if ("[" == r) {
                            u(i);
                            var o = i.getSelectionRange(), s = n.doc.getTextRange(o);
                            return "" !== s && i.getWrapBehavioursEnabled() ? g(o, s, "[", "]") : p.isSaneInsertion(i, n) ? (p.recordAutoInsert(i, n, "]"), {
                                text: "[]",
                                selection: [1, 1]
                            }) : void 0
                        }
                        if ("]" == r) {
                            u(i);
                            o = i.getCursorPosition(), s = n.doc.getLine(o.row), i = s.substring(o.column, o.column + 1);
                            if ("]" == i) if (null !== n.$findOpeningBracket("]", {
                                column: o.column + 1,
                                row: o.row
                            }) && p.isAutoInsertedClosing(o, s, r)) return p.popAutoInsertedClosing(), {
                                text: "",
                                selection: [1, 1]
                            }
                        }
                    }), this.add("brackets", "deletion", function (e, t, i, n, r) {
                        var o = n.doc.getTextRange(r);
                        if (!r.isMultiLine() && "[" == o && (u(i), "]" == n.doc.getLine(r.start.row).substring(r.start.column + 1, r.start.column + 2))) return r.end.column++, r
                    }), this.add("string_dquotes", "insertion", function (e, t, i, n, r) {
                        var o = n.$mode.$quotes || C;
                        if (1 == r.length && o[r] && (!this.lineCommentStart || -1 == this.lineCommentStart.indexOf(r))) {
                            u(i);
                            var s = r, a = i.getSelectionRange(), l = n.doc.getTextRange(a);
                            if (!("" === l || 1 == l.length && o[l]) && i.getWrapBehavioursEnabled()) return g(a, l, s, s);
                            if (!l) {
                                var c = i.getCursorPosition(), h = n.doc.getLine(c.row),
                                    r = h.substring(c.column - 1, c.column), o = h.substring(c.column, c.column + 1),
                                    a = n.getTokenAt(c.row, c.column), l = n.getTokenAt(c.row, c.column + 1);
                                if ("\\" == r && a && /escape/.test(a.type)) return null;
                                var d, i = a && /string|escape/.test(a.type), a = !l || /string|escape/.test(l.type);
                                if (o == s) (d = i !== a) && /string\.end/.test(l.type) && (d = !1); else {
                                    if (i && !a) return null;
                                    if (i && a) return null;
                                    i = n.$mode.tokenRe;
                                    i.lastIndex = 0;
                                    a = i.test(r);
                                    i.lastIndex = 0;
                                    n = i.test(r);
                                    if (a || n) return null;
                                    if (o && !/[\s;,.})\]\\]/.test(o)) return null;
                                    c = h[c.column - 2];
                                    if (r == s && (c == s || i.test(c))) return null;
                                    d = !0
                                }
                                return {text: d ? s + s : "", selection: [1, 1]}
                            }
                        }
                    }), this.add("string_dquotes", "deletion", function (e, t, i, n, r) {
                        var o = n.$mode.$quotes || C, s = n.doc.getTextRange(r);
                        if (!r.isMultiLine() && o.hasOwnProperty(s) && (u(i), n.doc.getLine(r.start.row).substring(r.start.column + 1, r.start.column + 2) == s)) return r.end.column++, r
                    })
                }

                var m, n = e("../../lib/oop"), r = e("../behaviour").Behaviour,
                    o = e("../../token_iterator").TokenIterator, f = e("../../lib/lang"),
                    s = ["text", "paren.rparen", "rparen", "paren", "punctuation.operator"],
                    a = ["text", "paren.rparen", "rparen", "paren", "punctuation.operator", "comment"], l = {},
                    C = {'"': '"', "'": "'"};
                p.isSaneInsertion = function (e, t) {
                    var i = e.getCursorPosition(), n = new o(t, i.row, i.column);
                    if (!this.$matchTokenType(n.getCurrentToken() || "text", s)) {
                        if (/[)}\]]/.test(e.session.getLine(i.row)[i.column])) return !0;
                        t = new o(t, i.row, i.column + 1);
                        if (!this.$matchTokenType(t.getCurrentToken() || "text", s)) return !1
                    }
                    return n.stepForward(), n.getCurrentTokenRow() !== i.row || this.$matchTokenType(n.getCurrentToken() || "text", a)
                }, p.$matchTokenType = function (e, t) {
                    return -1 < t.indexOf(e.type || e)
                }, p.recordAutoInsert = function (e, t, i) {
                    e = e.getCursorPosition(), t = t.doc.getLine(e.row);
                    this.isAutoInsertedClosing(e, t, m.autoInsertedLineEnd[0]) || (m.autoInsertedBrackets = 0), m.autoInsertedRow = e.row, m.autoInsertedLineEnd = i + t.substr(e.column), m.autoInsertedBrackets++
                }, p.recordMaybeInsert = function (e, t, i) {
                    e = e.getCursorPosition(), t = t.doc.getLine(e.row);
                    this.isMaybeInsertedClosing(e, t) || (m.maybeInsertedBrackets = 0), m.maybeInsertedRow = e.row, m.maybeInsertedLineStart = t.substr(0, e.column) + i, m.maybeInsertedLineEnd = t.substr(e.column), m.maybeInsertedBrackets++
                }, p.isAutoInsertedClosing = function (e, t, i) {
                    return 0 < m.autoInsertedBrackets && e.row === m.autoInsertedRow && i === m.autoInsertedLineEnd[0] && t.substr(e.column) === m.autoInsertedLineEnd
                }, p.isMaybeInsertedClosing = function (e, t) {
                    return 0 < m.maybeInsertedBrackets && e.row === m.maybeInsertedRow && t.substr(e.column) === m.maybeInsertedLineEnd && t.substr(0, e.column) == m.maybeInsertedLineStart
                }, p.popAutoInsertedClosing = function () {
                    m.autoInsertedLineEnd = m.autoInsertedLineEnd.substr(1), m.autoInsertedBrackets--
                }, p.clearMaybeInsertedClosing = function () {
                    m && (m.maybeInsertedBrackets = 0, m.maybeInsertedRow = -1)
                }, n.inherits(p, r), t.CstyleBehaviour = p
            }), ace.define("ace/unicode", ["require", "exports", "module"], function (e, t, i) {
                "use strict";
                for (var n = [48, 9, 8, 25, 5, 0, 2, 25, 48, 0, 11, 0, 5, 0, 6, 22, 2, 30, 2, 457, 5, 11, 15, 4, 8, 0, 2, 0, 18, 116, 2, 1, 3, 3, 9, 0, 2, 2, 2, 0, 2, 19, 2, 82, 2, 138, 2, 4, 3, 155, 12, 37, 3, 0, 8, 38, 10, 44, 2, 0, 2, 1, 2, 1, 2, 0, 9, 26, 6, 2, 30, 10, 7, 61, 2, 9, 5, 101, 2, 7, 3, 9, 2, 18, 3, 0, 17, 58, 3, 100, 15, 53, 5, 0, 6, 45, 211, 57, 3, 18, 2, 5, 3, 11, 3, 9, 2, 1, 7, 6, 2, 2, 2, 7, 3, 1, 3, 21, 2, 6, 2, 0, 4, 3, 3, 8, 3, 1, 3, 3, 9, 0, 5, 1, 2, 4, 3, 11, 16, 2, 2, 5, 5, 1, 3, 21, 2, 6, 2, 1, 2, 1, 2, 1, 3, 0, 2, 4, 5, 1, 3, 2, 4, 0, 8, 3, 2, 0, 8, 15, 12, 2, 2, 8, 2, 2, 2, 21, 2, 6, 2, 1, 2, 4, 3, 9, 2, 2, 2, 2, 3, 0, 16, 3, 3, 9, 18, 2, 2, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 3, 8, 3, 1, 3, 2, 9, 1, 5, 1, 2, 4, 3, 9, 2, 0, 17, 1, 2, 5, 4, 2, 2, 3, 4, 1, 2, 0, 2, 1, 4, 1, 4, 2, 4, 11, 5, 4, 4, 2, 2, 3, 3, 0, 7, 0, 15, 9, 18, 2, 2, 7, 2, 2, 2, 22, 2, 9, 2, 4, 4, 7, 2, 2, 2, 3, 8, 1, 2, 1, 7, 3, 3, 9, 19, 1, 2, 7, 2, 2, 2, 22, 2, 9, 2, 4, 3, 8, 2, 2, 2, 3, 8, 1, 8, 0, 2, 3, 3, 9, 19, 1, 2, 7, 2, 2, 2, 22, 2, 15, 4, 7, 2, 2, 2, 3, 10, 0, 9, 3, 3, 9, 11, 5, 3, 1, 2, 17, 4, 23, 2, 8, 2, 0, 3, 6, 4, 0, 5, 5, 2, 0, 2, 7, 19, 1, 14, 57, 6, 14, 2, 9, 40, 1, 2, 0, 3, 1, 2, 0, 3, 0, 7, 3, 2, 6, 2, 2, 2, 0, 2, 0, 3, 1, 2, 12, 2, 2, 3, 4, 2, 0, 2, 5, 3, 9, 3, 1, 35, 0, 24, 1, 7, 9, 12, 0, 2, 0, 2, 0, 5, 9, 2, 35, 5, 19, 2, 5, 5, 7, 2, 35, 10, 0, 58, 73, 7, 77, 3, 37, 11, 42, 2, 0, 4, 328, 2, 3, 3, 6, 2, 0, 2, 3, 3, 40, 2, 3, 3, 32, 2, 3, 3, 6, 2, 0, 2, 3, 3, 14, 2, 56, 2, 3, 3, 66, 5, 0, 33, 15, 17, 84, 13, 619, 3, 16, 2, 25, 6, 74, 22, 12, 2, 6, 12, 20, 12, 19, 13, 12, 2, 2, 2, 1, 13, 51, 3, 29, 4, 0, 5, 1, 3, 9, 34, 2, 3, 9, 7, 87, 9, 42, 6, 69, 11, 28, 4, 11, 5, 11, 11, 39, 3, 4, 12, 43, 5, 25, 7, 10, 38, 27, 5, 62, 2, 28, 3, 10, 7, 9, 14, 0, 89, 75, 5, 9, 18, 8, 13, 42, 4, 11, 71, 55, 9, 9, 4, 48, 83, 2, 2, 30, 14, 230, 23, 280, 3, 5, 3, 37, 3, 5, 3, 7, 2, 0, 2, 0, 2, 0, 2, 30, 3, 52, 2, 6, 2, 0, 4, 2, 2, 6, 4, 3, 3, 5, 5, 12, 6, 2, 2, 6, 67, 1, 20, 0, 29, 0, 14, 0, 17, 4, 60, 12, 5, 0, 4, 11, 18, 0, 5, 0, 3, 9, 2, 0, 4, 4, 7, 0, 2, 0, 2, 0, 2, 3, 2, 10, 3, 3, 6, 4, 5, 0, 53, 1, 2684, 46, 2, 46, 2, 132, 7, 6, 15, 37, 11, 53, 10, 0, 17, 22, 10, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 31, 48, 0, 470, 1, 36, 5, 2, 4, 6, 1, 5, 85, 3, 1, 3, 2, 2, 89, 2, 3, 6, 40, 4, 93, 18, 23, 57, 15, 513, 6581, 75, 20939, 53, 1164, 68, 45, 3, 268, 4, 27, 21, 31, 3, 13, 13, 1, 2, 24, 9, 69, 11, 1, 38, 8, 3, 102, 3, 1, 111, 44, 25, 51, 13, 68, 12, 9, 7, 23, 4, 0, 5, 45, 3, 35, 13, 28, 4, 64, 15, 10, 39, 54, 10, 13, 3, 9, 7, 22, 4, 1, 5, 66, 25, 2, 227, 42, 2, 1, 3, 9, 7, 11171, 13, 22, 5, 48, 8453, 301, 3, 61, 3, 105, 39, 6, 13, 4, 6, 11, 2, 12, 2, 4, 2, 0, 2, 1, 2, 1, 2, 107, 34, 362, 19, 63, 3, 53, 41, 11, 5, 15, 17, 6, 13, 1, 25, 2, 33, 4, 2, 134, 20, 9, 8, 25, 5, 0, 2, 25, 12, 88, 4, 5, 3, 5, 3, 5, 3, 2], r = 0, o = [], s = 0; s < n.length; s += 2) o.push(r += n[s]), n[s + 1] && o.push(45, r += n[s + 1]);
                t.wordChars = String.fromCharCode.apply(null, o)
            }), ace.define("ace/mode/text", ["require", "exports", "module", "ace/config", "ace/tokenizer", "ace/mode/text_highlight_rules", "ace/mode/behaviour/cstyle", "ace/unicode", "ace/lib/lang", "ace/token_iterator", "ace/range"], function (e, t, i) {
                "use strict";
                var s = e("../config"), n = e("../tokenizer").Tokenizer,
                    r = e("./text_highlight_rules").TextHighlightRules, o = e("./behaviour/cstyle").CstyleBehaviour,
                    a = e("../unicode"), b = e("../lib/lang"), m = e("../token_iterator").TokenIterator,
                    f = e("../range").Range, e = function () {
                        this.HighlightRules = r
                    };
                !function () {
                    this.$defaultBehaviour = new o, this.tokenRe = new RegExp("^[" + a.wordChars + "\\$_]+", "g"), this.nonTokenRe = new RegExp("^(?:[^" + a.wordChars + "\\$_]|\\s])+", "g"), this.getTokenizer = function () {
                        return this.$tokenizer || (this.$highlightRules = this.$highlightRules || new this.HighlightRules(this.$highlightRuleConfig), this.$tokenizer = new n(this.$highlightRules.getRules())), this.$tokenizer
                    }, this.lineCommentStart = "", this.blockComment = "", this.toggleCommentLines = function (e, r, i, n) {
                        var o = r.doc, s = !0, a = !0, l = 1 / 0, c = r.getTabSize(), t = !1;
                        if (this.lineCommentStart) {
                            m = Array.isArray(this.lineCommentStart) ? (C = this.lineCommentStart.map(b.escapeRegExp).join("|"), this.lineCommentStart[0]) : (C = b.escapeRegExp(this.lineCommentStart), this.lineCommentStart), C = new RegExp("^(\\s*)(?:" + C + ") ?");
                            var t = r.getUseSoftTabs(), h = function (e, t) {
                                var i, n, r = e.match(C);
                                r && (i = r[1].length, n = r[0].length, p(e, i, n) || " " != r[0][n - 1] || n--, o.removeInLine(t, i, n))
                            }, d = m + " ", u = function (e, t) {
                                s && !/\S/.test(e) || (p(e, l, l) ? o.insertInLine({
                                    row: t,
                                    column: l
                                }, d) : o.insertInLine({row: t, column: l}, m))
                            }, g = function (e, t) {
                                return C.test(e)
                            }, p = function (e, t, i) {
                                for (var n = 0; t-- && " " == e.charAt(t);) n++;
                                if (n % c != 0) return !1;
                                for (n = 0; " " == e.charAt(i++);) n++;
                                return 2 < c ? n % c != c - 1 : n % c == 0
                            }
                        } else {
                            if (!this.blockComment) return !1;
                            var m = this.blockComment.start, f = this.blockComment.end,
                                C = new RegExp("^(\\s*)(?:" + b.escapeRegExp(m) + ")"),
                                I = new RegExp("(?:" + b.escapeRegExp(f) + ")\\s*$"), u = function (e, t) {
                                    g(e, t) || s && !/\S/.test(e) || (o.insertInLine({
                                        row: t,
                                        column: e.length
                                    }, f), o.insertInLine({row: t, column: l}, m))
                                }, h = function (e, t) {
                                    var i;
                                    (i = e.match(I)) && o.removeInLine(t, e.length - i[0].length, e.length), (i = e.match(C)) && o.removeInLine(t, i[1].length, i[0].length)
                                }, g = function (e, t) {
                                    if (C.test(e)) return !0;
                                    for (var i = r.getTokens(t), n = 0; n < i.length; n++) if ("comment" === i[n].type) return !0
                                }
                        }

                        function v(e) {
                            for (var t = i; t <= n; t++) e(o.getLine(t), t)
                        }

                        var A = 1 / 0;
                        v(function (e, t) {
                            var i = e.search(/\S/);
                            -1 !== i ? (i < l && (l = i), a && !g(e, t) && (a = !1)) : A > e.length && (A = e.length)
                        }), l == 1 / 0 && (l = A, a = s = !1), t && l % c != 0 && (l = Math.floor(l / c) * c), v(a ? h : u)
                    }, this.toggleBlockComment = function (e, t, i, n) {
                        var r = this.blockComment;
                        if (r) {
                            !r.start && r[0] && (r = r[0]);
                            var o, s, a = (u = new m(t, n.row, n.column)).getCurrentToken(),
                                l = (t.selection, t.selection.toOrientedRange());
                            if (a && /comment/.test(a.type)) {
                                for (; a && /comment/.test(a.type);) {
                                    if (-1 != (g = a.value.indexOf(r.start))) {
                                        var c = u.getCurrentTokenRow(), h = u.getCurrentTokenColumn() + g,
                                            d = new f(c, h, c, h + r.start.length);
                                        break
                                    }
                                    a = u.stepBackward()
                                }
                                for (var u, g, a = (u = new m(t, n.row, n.column)).getCurrentToken(); a && /comment/.test(a.type);) {
                                    if (-1 != (g = a.value.indexOf(r.end))) {
                                        var c = u.getCurrentTokenRow(), h = u.getCurrentTokenColumn() + g,
                                            p = new f(c, h, c, h + r.end.length);
                                        break
                                    }
                                    a = u.stepForward()
                                }
                                p && t.remove(p), d && (t.remove(d), o = d.start.row, s = -r.start.length)
                            } else s = r.start.length, o = i.start.row, t.insert(i.end, r.end), t.insert(i.start, r.start);
                            l.start.row == o && (l.start.column += s), l.end.row == o && (l.end.column += s), t.selection.fromOrientedRange(l)
                        }
                    }, this.getNextLineIndent = function (e, t, i) {
                        return this.$getIndent(t)
                    }, this.checkOutdent = function (e, t, i) {
                        return !1
                    }, this.autoOutdent = function (e, t, i) {
                    }, this.$getIndent = function (e) {
                        return e.match(/^\s*/)[0]
                    }, this.createWorker = function (e) {
                        return null
                    }, this.createModeDelegates = function (e) {
                        for (var n in this.$embeds = [], this.$modes = {}, e) {
                            var t, i, r;
                            e[n] && (i = (t = e[n]).prototype.$id, (r = s.$modes[i]) || (s.$modes[i] = r = new t), s.$modes[n] || (s.$modes[n] = r), this.$embeds.push(n), this.$modes[n] = r)
                        }
                        for (var o = ["toggleBlockComment", "toggleCommentLines", "getNextLineIndent", "checkOutdent", "autoOutdent", "transformAction", "getCompletions"], n = 0; n < o.length; n++) !function (e) {
                            var t = o[n], i = e[t];
                            e[o[n]] = function () {
                                return this.$delegator(t, arguments, i)
                            }
                        }(this)
                    }, this.$delegator = function (e, t, i) {
                        var n = t[0] || "start";
                        if ("string" != typeof n) {
                            if (Array.isArray(n[2])) {
                                var r = n[2][n[2].length - 1];
                                if (s = this.$modes[r]) return s[e].apply(s, [n[1]].concat([].slice.call(t, 1)))
                            }
                            n = n[0] || "start"
                        }
                        for (var o = 0; o < this.$embeds.length; o++) if (this.$modes[this.$embeds[o]]) {
                            var s, a = n.split(this.$embeds[o]);
                            if (!a[0] && a[1]) return t[0] = a[1], (s = this.$modes[this.$embeds[o]])[e].apply(s, t)
                        }
                        r = i.apply(this, t);
                        return i ? r : void 0
                    }, this.transformAction = function (e, t, i, n, r) {
                        if (this.$behaviour) {
                            var o, s = this.$behaviour.getBehaviours();
                            for (o in s) if (s[o][t]) {
                                var a = s[o][t].apply(this, arguments);
                                if (a) return a
                            }
                        }
                    }, this.getKeywords = function (e) {
                        if (!this.completionKeywords) {
                            var t = this.$tokenizer.rules, i = [];
                            for (s in t) for (var n = t[s], r = 0, o = n.length; r < o; r++) if ("string" == typeof n[r].token) /keyword|support|storage/.test(n[r].token) && i.push(n[r].regex); else if ("object" == typeof n[r].token) for (var s, a = 0, l = n[r].token.length; a < l; a++) /keyword|support|storage/.test(n[r].token[a]) && (s = n[r].regex.match(/\(.+?\)/g)[a], i.push(s.substr(1, s.length - 2)));
                            this.completionKeywords = i
                        }
                        return e ? i.concat(this.$keywordList || []) : this.$keywordList
                    }, this.$createKeywordList = function () {
                        return this.$highlightRules || this.getTokenizer(), this.$keywordList = this.$highlightRules.$keywordList || []
                    }, this.getCompletions = function (e, t, i, n) {
                        return (this.$keywordList || this.$createKeywordList()).map(function (e) {
                            return {name: e, value: e, score: 0, meta: "keyword"}
                        })
                    }, this.$id = "ace/mode/text"
                }.call(e.prototype), t.Mode = e
            }), ace.define("ace/apply_delta", ["require", "exports", "module"], function (e, t, i) {
                "use strict";
                t.applyDelta = function (e, t, i) {
                    var n = t.start.row, r = t.start.column, o = e[n] || "";
                    switch (t.action) {
                        case"insert":
                            1 === t.lines.length ? e[n] = o.substring(0, r) + t.lines[0] + o.substring(r) : (a = [n, 1].concat(t.lines), e.splice.apply(e, a), e[n] = o.substring(0, r) + e[n], e[n + t.lines.length - 1] += o.substring(r));
                            break;
                        case"remove":
                            var s = t.end.column, a = t.end.row;
                            n === a ? e[n] = o.substring(0, r) + o.substring(s) : e.splice(n, a - n + 1, o.substring(0, r) + e[a].substring(s))
                    }
                }
            }), ace.define("ace/anchor", ["require", "exports", "module", "ace/lib/oop", "ace/lib/event_emitter"], function (e, t, i) {
                "use strict";
                var n = e("./lib/oop"), r = e("./lib/event_emitter").EventEmitter, t = t.Anchor = function (e, t, i) {
                    this.$onChange = this.onChange.bind(this), this.attach(e), void 0 === i ? this.setPosition(t.row, t.column) : this.setPosition(t, i)
                };
                !function () {
                    function a(e, t, i) {
                        i = i ? e.column <= t.column : e.column < t.column;
                        return e.row < t.row || e.row == t.row && i
                    }

                    n.implement(this, r), this.getPosition = function () {
                        return this.$clipPositionToDocument(this.row, this.column)
                    }, this.getDocument = function () {
                        return this.document
                    }, this.$insertRight = !1, this.onChange = function (e) {
                        e.start.row == e.end.row && e.start.row != this.row || e.start.row > this.row || (e = function (e, t, i) {
                            var n = "insert" == e.action, r = (n ? 1 : -1) * (e.end.row - e.start.row),
                                o = (n ? 1 : -1) * (e.end.column - e.start.column), s = e.start, e = n ? s : e.end;
                            if (a(t, s, i)) return {row: t.row, column: t.column};
                            if (a(e, t, !i)) return {row: t.row + r, column: t.column + (t.row == e.row ? o : 0)};
                            return {row: s.row, column: s.column}
                        }(e, {
                            row: this.row,
                            column: this.column
                        }, this.$insertRight), this.setPosition(e.row, e.column, !0))
                    }, this.setPosition = function (e, t, i) {
                        e = i ? {row: e, column: t} : this.$clipPositionToDocument(e, t);
                        this.row == e.row && this.column == e.column || (t = {
                            row: this.row,
                            column: this.column
                        }, this.row = e.row, this.column = e.column, this._signal("change", {old: t, value: e}))
                    }, this.detach = function () {
                        this.document.off("change", this.$onChange)
                    }, this.attach = function (e) {
                        this.document = e || this.document, this.document.on("change", this.$onChange)
                    }, this.$clipPositionToDocument = function (e, t) {
                        var i = {};
                        return e >= this.document.getLength() ? (i.row = Math.max(0, this.document.getLength() - 1), i.column = this.document.getLine(i.row).length) : e < 0 ? (i.row = 0, i.column = 0) : (i.row = e, i.column = Math.min(this.document.getLine(i.row).length, Math.max(0, t))), t < 0 && (i.column = 0), i
                    }
                }.call(t.prototype)
            }), ace.define("ace/document", ["require", "exports", "module", "ace/lib/oop", "ace/apply_delta", "ace/lib/event_emitter", "ace/range", "ace/anchor"], function (e, t, i) {
                "use strict";
                var n = e("./lib/oop"), r = e("./apply_delta").applyDelta, o = e("./lib/event_emitter").EventEmitter,
                    s = e("./range").Range, a = e("./anchor").Anchor, e = function (e) {
                        this.$lines = [""], 0 === e.length ? this.$lines = [""] : Array.isArray(e) ? this.insertMergedLines({
                            row: 0,
                            column: 0
                        }, e) : this.insert({row: 0, column: 0}, e)
                    };
                !function () {
                    n.implement(this, o), this.setValue = function (e) {
                        var t = this.getLength() - 1;
                        this.remove(new s(0, 0, t, this.getLine(t).length)), this.insert({row: 0, column: 0}, e)
                    }, this.getValue = function () {
                        return this.getAllLines().join(this.getNewLineCharacter())
                    }, this.createAnchor = function (e, t) {
                        return new a(this, e, t)
                    }, 0 === "aaa".split(/a/).length ? this.$split = function (e) {
                        return e.replace(/\r\n|\r/g, "\n").split("\n")
                    } : this.$split = function (e) {
                        return e.split(/\r\n|\r|\n/)
                    }, this.$detectNewLine = function (e) {
                        e = e.match(/^.*?(\r\n|\r|\n)/m);
                        this.$autoNewLine = e ? e[1] : "\n", this._signal("changeNewLineMode")
                    }, this.getNewLineCharacter = function () {
                        switch (this.$newLineMode) {
                            case"windows":
                                return "\r\n";
                            case"unix":
                                return "\n";
                            default:
                                return this.$autoNewLine || "\n"
                        }
                    }, this.$autoNewLine = "", this.$newLineMode = "auto", this.setNewLineMode = function (e) {
                        this.$newLineMode !== e && (this.$newLineMode = e, this._signal("changeNewLineMode"))
                    }, this.getNewLineMode = function () {
                        return this.$newLineMode
                    }, this.isNewLine = function (e) {
                        return "\r\n" == e || "\r" == e || "\n" == e
                    }, this.getLine = function (e) {
                        return this.$lines[e] || ""
                    }, this.getLines = function (e, t) {
                        return this.$lines.slice(e, t + 1)
                    }, this.getAllLines = function () {
                        return this.getLines(0, this.getLength())
                    }, this.getLength = function () {
                        return this.$lines.length
                    }, this.getTextRange = function (e) {
                        return this.getLinesForRange(e).join(this.getNewLineCharacter())
                    }, this.getLinesForRange = function (e) {
                        var t, i;
                        return e.start.row === e.end.row ? t = [this.getLine(e.start.row).substring(e.start.column, e.end.column)] : ((t = this.getLines(e.start.row, e.end.row))[0] = (t[0] || "").substring(e.start.column), i = t.length - 1, e.end.row - e.start.row == i && (t[i] = t[i].substring(0, e.end.column))), t
                    }, this.insertLines = function (e, t) {
                        return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."), this.insertFullLines(e, t)
                    }, this.removeLines = function (e, t) {
                        return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."), this.removeFullLines(e, t)
                    }, this.insertNewLine = function (e) {
                        return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."), this.insertMergedLines(e, ["", ""])
                    }, this.insert = function (e, t) {
                        return this.getLength() <= 1 && this.$detectNewLine(t), this.insertMergedLines(e, this.$split(t))
                    }, this.insertInLine = function (e, t) {
                        var i = this.clippedPos(e.row, e.column), e = this.pos(e.row, e.column + t.length);
                        return this.applyDelta({start: i, end: e, action: "insert", lines: [t]}, !0), this.clonePos(e)
                    }, this.clippedPos = function (e, t) {
                        var i = this.getLength();
                        void 0 === e ? e = i : e < 0 ? e = 0 : i <= e && (e = i - 1, t = void 0);
                        i = this.getLine(e);
                        return null == t && (t = i.length), {row: e, column: t = Math.min(Math.max(t, 0), i.length)}
                    }, this.clonePos = function (e) {
                        return {row: e.row, column: e.column}
                    }, this.pos = function (e, t) {
                        return {row: e, column: t}
                    }, this.$clipPosition = function (e) {
                        var t = this.getLength();
                        return e.row >= t ? (e.row = Math.max(0, t - 1), e.column = this.getLine(t - 1).length) : (e.row = Math.max(0, e.row), e.column = Math.min(Math.max(e.column, 0), this.getLine(e.row).length)), e
                    }, this.insertFullLines = function (e, t) {
                        var i = 0,
                            i = (e = Math.min(Math.max(e, 0), this.getLength())) < this.getLength() ? (t = t.concat([""]), 0) : (t = [""].concat(t), this.$lines[--e].length);
                        this.insertMergedLines({row: e, column: i}, t)
                    }, this.insertMergedLines = function (e, t) {
                        var i = this.clippedPos(e.row, e.column), e = {
                            row: i.row + t.length - 1,
                            column: (1 == t.length ? i.column : 0) + t[t.length - 1].length
                        };
                        return this.applyDelta({start: i, end: e, action: "insert", lines: t}), this.clonePos(e)
                    }, this.remove = function (e) {
                        var t = this.clippedPos(e.start.row, e.start.column),
                            e = this.clippedPos(e.end.row, e.end.column);
                        return this.applyDelta({
                            start: t,
                            end: e,
                            action: "remove",
                            lines: this.getLinesForRange({start: t, end: e})
                        }), this.clonePos(t)
                    }, this.removeInLine = function (e, t, i) {
                        t = this.clippedPos(e, t), i = this.clippedPos(e, i);
                        return this.applyDelta({
                            start: t,
                            end: i,
                            action: "remove",
                            lines: this.getLinesForRange({start: t, end: i})
                        }, !0), this.clonePos(t)
                    }, this.removeFullLines = function (e, t) {
                        e = Math.min(Math.max(0, e), this.getLength() - 1);
                        var i = (t = Math.min(Math.max(0, t), this.getLength() - 1)) == this.getLength() - 1 && 0 < e,
                            n = t < this.getLength() - 1, r = i ? e - 1 : e, o = i ? this.getLine(r).length : 0,
                            i = n ? t + 1 : t, n = n ? 0 : this.getLine(i).length, n = new s(r, o, i, n),
                            t = this.$lines.slice(e, t + 1);
                        return this.applyDelta({
                            start: n.start,
                            end: n.end,
                            action: "remove",
                            lines: this.getLinesForRange(n)
                        }), t
                    }, this.removeNewLine = function (e) {
                        e < this.getLength() - 1 && 0 <= e && this.applyDelta({
                            start: this.pos(e, this.getLine(e).length),
                            end: this.pos(e + 1, 0),
                            action: "remove",
                            lines: ["", ""]
                        })
                    }, this.replace = function (e, t) {
                        return e instanceof s || (e = s.fromPoints(e.start, e.end)), 0 === t.length && e.isEmpty() ? e.start : t == this.getTextRange(e) ? e.end : (this.remove(e), t ? this.insert(e.start, t) : e.start)
                    }, this.applyDeltas = function (e) {
                        for (var t = 0; t < e.length; t++) this.applyDelta(e[t])
                    }, this.revertDeltas = function (e) {
                        for (var t = e.length - 1; 0 <= t; t--) this.revertDelta(e[t])
                    }, this.applyDelta = function (e, t) {
                        var i = "insert" == e.action;
                        (i ? e.lines.length <= 1 && !e.lines[0] : !s.comparePoints(e.start, e.end)) || (i && 2e4 < e.lines.length ? this.$splitAndapplyLargeDelta(e, 2e4) : (r(this.$lines, e, t), this._signal("change", e)))
                    }, this.$safeApplyDelta = function (e) {
                        var t = this.$lines.length;
                        ("remove" == e.action && e.start.row < t && e.end.row < t || "insert" == e.action && e.start.row <= t) && this.applyDelta(e)
                    }, this.$splitAndapplyLargeDelta = function (e, t) {
                        for (var i = e.lines, n = i.length - t + 1, r = e.start.row, o = e.start.column, s = 0, a = 0; s < n; s = a) {
                            a += t - 1;
                            var l = i.slice(s, a);
                            l.push(""), this.applyDelta({
                                start: this.pos(r + s, o),
                                end: this.pos(r + a, o = 0),
                                action: e.action,
                                lines: l
                            }, !0)
                        }
                        e.lines = i.slice(s), e.start.row = r + s, e.start.column = o, this.applyDelta(e, !0)
                    }, this.revertDelta = function (e) {
                        this.$safeApplyDelta({
                            start: this.clonePos(e.start),
                            end: this.clonePos(e.end),
                            action: "insert" == e.action ? "remove" : "insert",
                            lines: e.lines.slice()
                        })
                    }, this.indexToPosition = function (e, t) {
                        for (var i = this.$lines || this.getAllLines(), n = this.getNewLineCharacter().length, r = t || 0, o = i.length; r < o; r++) if ((e -= i[r].length + n) < 0) return {
                            row: r,
                            column: e + i[r].length + n
                        };
                        return {row: o - 1, column: e + i[o - 1].length + n}
                    }, this.positionToIndex = function (e, t) {
                        for (var i = this.$lines || this.getAllLines(), n = this.getNewLineCharacter().length, r = 0, o = Math.min(e.row, i.length), s = t || 0; s < o; ++s) r += i[s].length + n;
                        return r + e.column
                    }
                }.call(e.prototype), t.Document = e
            }), ace.define("ace/background_tokenizer", ["require", "exports", "module", "ace/lib/oop", "ace/lib/event_emitter"], function (e, t, i) {
                "use strict";
                var n = e("./lib/oop"), r = e("./lib/event_emitter").EventEmitter, e = function (e, t) {
                    this.running = !1, this.lines = [], this.states = [], this.currentLine = 0, this.tokenizer = e;
                    var a = this;
                    this.$worker = function () {
                        if (a.running) {
                            for (var e = new Date, t = a.currentLine, i = -1, n = a.doc, r = t; a.lines[t];) t++;
                            var o = n.getLength(), s = 0;
                            for (a.running = !1; t < o;) {
                                for (a.$tokenizeRow(t), i = t; t++, a.lines[t];) ;
                                if (++s % 5 == 0 && 20 < new Date - e) {
                                    a.running = setTimeout(a.$worker, 20);
                                    break
                                }
                            }
                            a.currentLine = t, r <= (i = -1 == i ? t : i) && a.fireUpdateEvent(r, i)
                        }
                    }
                };
                !function () {
                    n.implement(this, r), this.setTokenizer = function (e) {
                        this.tokenizer = e, this.lines = [], this.states = [], this.start(0)
                    }, this.setDocument = function (e) {
                        this.doc = e, this.lines = [], this.states = [], this.stop()
                    }, this.fireUpdateEvent = function (e, t) {
                        this._signal("update", {data: {first: e, last: t}})
                    }, this.start = function (e) {
                        this.currentLine = Math.min(e || 0, this.currentLine, this.doc.getLength()), this.lines.splice(this.currentLine, this.lines.length), this.states.splice(this.currentLine, this.states.length), this.stop(), this.running = setTimeout(this.$worker, 700)
                    }, this.scheduleStart = function () {
                        this.running || (this.running = setTimeout(this.$worker, 700))
                    }, this.$updateOnChange = function (e) {
                        var t = e.start.row, i = e.end.row - t;
                        0 == i ? this.lines[t] = null : "remove" == e.action ? (this.lines.splice(t, 1 + i, null), this.states.splice(t, 1 + i, null)) : ((i = Array(1 + i)).unshift(t, 1), this.lines.splice.apply(this.lines, i), this.states.splice.apply(this.states, i)), this.currentLine = Math.min(t, this.currentLine, this.doc.getLength()), this.stop()
                    }, this.stop = function () {
                        this.running && clearTimeout(this.running), this.running = !1
                    }, this.getTokens = function (e) {
                        return this.lines[e] || this.$tokenizeRow(e)
                    }, this.getState = function (e) {
                        return this.currentLine == e && this.$tokenizeRow(e), this.states[e] || "start"
                    }, this.$tokenizeRow = function (e) {
                        var t = this.doc.getLine(e), i = this.states[e - 1], i = this.tokenizer.getLineTokens(t, i, e);
                        return this.states[e] + "" != i.state + "" ? (this.states[e] = i.state, this.lines[e + 1] = null, this.currentLine > e + 1 && (this.currentLine = e + 1)) : this.currentLine == e && (this.currentLine = e + 1), this.lines[e] = i.tokens
                    }
                }.call(e.prototype), t.BackgroundTokenizer = e
            }), ace.define("ace/search_highlight", ["require", "exports", "module", "ace/lib/lang", "ace/lib/oop", "ace/range"], function (e, t, i) {
                "use strict";
                var c = e("./lib/lang"), h = (e("./lib/oop"), e("./range").Range), e = function (e, t, i) {
                    this.setRegexp(e), this.clazz = t, this.type = i || "text"
                };
                !function () {
                    this.MAX_RANGES = 500, this.setRegexp = function (e) {
                        this.regExp + "" != e + "" && (this.regExp = e, this.cache = [])
                    }, this.update = function (e, t, i, n) {
                        if (this.regExp) for (var r = n.firstRow, o = n.lastRow, s = r; s <= o; s++) {
                            var a = this.cache[s];
                            null == a && (a = (a = (a = c.getMatchOffsets(i.getLine(s), this.regExp)).length > this.MAX_RANGES ? a.slice(0, this.MAX_RANGES) : a).map(function (e) {
                                return new h(s, e.offset, s, e.offset + e.length)
                            }), this.cache[s] = a.length ? a : "");
                            for (var l = a.length; l--;) t.drawSingleLineMarker(e, a[l].toScreenRange(i), this.clazz, n)
                        }
                    }
                }.call(e.prototype), t.SearchHighlight = e
            }), ace.define("ace/edit_session/fold_line", ["require", "exports", "module", "ace/range"], function (e, t, i) {
                "use strict";
                var n = e("../range").Range;

                function r(e, t) {
                    this.foldData = e, Array.isArray(t) ? this.folds = t : t = this.folds = [t];
                    e = t[t.length - 1];
                    this.range = new n(t[0].start.row, t[0].start.column, e.end.row, e.end.column), this.start = this.range.start, this.end = this.range.end, this.folds.forEach(function (e) {
                        e.setFoldLine(this)
                    }, this)
                }

                !function () {
                    this.shiftRow = function (t) {
                        this.start.row += t, this.end.row += t, this.folds.forEach(function (e) {
                            e.start.row += t, e.end.row += t
                        })
                    }, this.addFold = function (e) {
                        if (e.sameRow) {
                            if (e.start.row < this.startRow || e.endRow > this.endRow) throw new Error("Can't add a fold to this FoldLine as it has no connection");
                            this.folds.push(e), this.folds.sort(function (e, t) {
                                return -e.range.compareEnd(t.start.row, t.start.column)
                            }), 0 < this.range.compareEnd(e.start.row, e.start.column) ? (this.end.row = e.end.row, this.end.column = e.end.column) : this.range.compareStart(e.end.row, e.end.column) < 0 && (this.start.row = e.start.row, this.start.column = e.start.column)
                        } else if (e.start.row == this.end.row) this.folds.push(e), this.end.row = e.end.row, this.end.column = e.end.column; else {
                            if (e.end.row != this.start.row) throw new Error("Trying to add fold to FoldRow that doesn't have a matching row");
                            this.folds.unshift(e), this.start.row = e.start.row, this.start.column = e.start.column
                        }
                        e.foldLine = this
                    }, this.containsRow = function (e) {
                        return e >= this.start.row && e <= this.end.row
                    }, this.walk = function (e, t, i) {
                        var n, r, o = 0, s = this.folds, a = !0;
                        null == t && (t = this.end.row, i = this.end.column);
                        for (var l = 0; l < s.length; l++) {
                            if (-1 == (r = (n = s[l]).range.compareStart(t, i))) return void e(null, t, i, o, a);
                            if (!e(null, n.start.row, n.start.column, o, a) && e(n.placeholder, n.start.row, n.start.column, o) || 0 === r) return;
                            a = !n.sameRow, o = n.end.column
                        }
                        e(null, t, i, o, a)
                    }, this.getNextFoldTo = function (e, t) {
                        for (var i, n, r = 0; r < this.folds.length; r++) {
                            if (-1 == (n = (i = this.folds[r]).range.compareEnd(e, t))) return {fold: i, kind: "after"};
                            if (0 === n) return {fold: i, kind: "inside"}
                        }
                        return null
                    }, this.addRemoveChars = function (e, t, i) {
                        var n, r = this.getNextFoldTo(e, t);
                        if (r) if (n = r.fold, "inside" == r.kind && n.start.column != t && n.start.row != e) window.console && window.console.log(e, t, n); else if (n.start.row == e) {
                            var o, s = (o = this.folds).indexOf(n);
                            for (0 === s && (this.start.column += i); s < o.length; s++) {
                                if ((n = o[s]).start.column += i, !n.sameRow) return;
                                n.end.column += i
                            }
                            this.end.column += i
                        }
                    }, this.split = function (e, t) {
                        var i = this.getNextFoldTo(e, t);
                        if (!i || "inside" == i.kind) return null;
                        var n = i.fold, e = this.folds, t = this.foldData, i = e.indexOf(n), n = e[i - 1];
                        this.end.row = n.end.row, this.end.column = n.end.column;
                        e = new r(t, e = e.splice(i, e.length - i));
                        return t.splice(t.indexOf(this) + 1, 0, e), e
                    }, this.merge = function (e) {
                        for (var t = e.folds, i = 0; i < t.length; i++) this.addFold(t[i]);
                        var n = this.foldData;
                        n.splice(n.indexOf(e), 1)
                    }, this.toString = function () {
                        var t = [this.range.toString() + ": ["];
                        return this.folds.forEach(function (e) {
                            t.push("  " + e.toString())
                        }), t.push("]"), t.join("\n")
                    }, this.idxToPosition = function (e) {
                        for (var t = 0, i = 0; i < this.folds.length; i++) {
                            var n = this.folds[i];
                            if ((e -= n.start.column - t) < 0) return {row: n.start.row, column: n.start.column + e};
                            if ((e -= n.placeholder.length) < 0) return n.start;
                            t = n.end.column
                        }
                        return {row: this.end.row, column: this.end.column + e}
                    }
                }.call(r.prototype), t.FoldLine = r
            }), ace.define("ace/range_list", ["require", "exports", "module", "ace/range"], function (e, t, i) {
                "use strict";
                var a = e("./range").Range.comparePoints, e = function () {
                    this.ranges = [], this.$bias = 1
                };
                !function () {
                    this.comparePoints = a, this.pointIndex = function (e, t, i) {
                        for (var n = this.ranges, r = i || 0; r < n.length; r++) {
                            var o = n[r], s = a(e, o.end);
                            if (!(0 < s)) {
                                o = a(e, o.start);
                                return 0 === s ? t && 0 !== o ? -r - 2 : r : 0 < o || 0 === o && !t ? r : -r - 1
                            }
                        }
                        return -r - 1
                    }, this.add = function (e) {
                        var t = !e.isEmpty(), i = this.pointIndex(e.start, t),
                            t = this.pointIndex(e.end, t, i = i < 0 ? -i - 1 : i);
                        return t < 0 ? t = -t - 1 : t++, this.ranges.splice(i, t - i, e)
                    }, this.addList = function (e) {
                        for (var t = [], i = e.length; i--;) t.push.apply(t, this.add(e[i]));
                        return t
                    }, this.substractPoint = function (e) {
                        e = this.pointIndex(e);
                        if (0 <= e) return this.ranges.splice(e, 1)
                    }, this.merge = function () {
                        for (var e = [], t = this.ranges, i = (t = t.sort(function (e, t) {
                            return a(e.start, t.start)
                        }))[0], n = 1; n < t.length; n++) {
                            var r = i, i = t[n], o = a(r.end, i.start);
                            o < 0 || (0 != o || r.isEmpty() || i.isEmpty()) && (a(r.end, i.end) < 0 && (r.end.row = i.end.row, r.end.column = i.end.column), t.splice(n, 1), e.push(i), i = r, n--)
                        }
                        return this.ranges = t, e
                    }, this.contains = function (e, t) {
                        return 0 <= this.pointIndex({row: e, column: t})
                    }, this.containsPoint = function (e) {
                        return 0 <= this.pointIndex(e)
                    }, this.rangeAtPoint = function (e) {
                        e = this.pointIndex(e);
                        if (0 <= e) return this.ranges[e]
                    }, this.clipRows = function (e, t) {
                        var i = this.ranges;
                        if (i[0].start.row > t || i[i.length - 1].start.row < e) return [];
                        var e = this.pointIndex({row: e, column: 0}),
                            n = this.pointIndex({row: t, column: 0}, e = e < 0 ? -e - 1 : e);
                        n < 0 && (n = -n - 1);
                        for (var r = [], o = e; o < n; o++) r.push(i[o]);
                        return r
                    }, this.removeAll = function () {
                        return this.ranges.splice(0, this.ranges.length)
                    }, this.attach = function (e) {
                        this.session && this.detach(), this.session = e, this.onChange = this.$onChange.bind(this), this.session.on("change", this.onChange)
                    }, this.detach = function () {
                        this.session && (this.session.removeListener("change", this.onChange), this.session = null)
                    }, this.$onChange = function (e) {
                        for (var t = e.start, i = e.end, n = t.row, r = i.row, o = this.ranges, s = 0, a = o.length; s < a; s++) if ((h = o[s]).end.row >= n) break;
                        if ("insert" == e.action) for (var l = r - n, c = -t.column + i.column; s < a; s++) {
                            if ((h = o[s]).start.row > n) break;
                            h.start.row == n && h.start.column >= t.column && (h.start.column == t.column && this.$bias <= 0 || (h.start.column += c, h.start.row += l)), h.end.row == n && h.end.column >= t.column && (h.end.column == t.column && this.$bias < 0 || (h.end.column == t.column && 0 < c && s < a - 1 && h.end.column > h.start.column && h.end.column == o[s + 1].start.column && (h.end.column -= c), h.end.column += c, h.end.row += l))
                        } else for (var h, l = n - r, c = t.column - i.column; s < a; s++) {
                            if ((h = o[s]).start.row > r) break;
                            h.end.row < r && (n < h.end.row || n == h.end.row && t.column < h.end.column) ? (h.end.row = n, h.end.column = t.column) : h.end.row == r ? h.end.column <= i.column ? (l || h.end.column > t.column) && (h.end.column = t.column, h.end.row = t.row) : (h.end.column += c, h.end.row += l) : h.end.row > r && (h.end.row += l), h.start.row < r && (n < h.start.row || n == h.start.row && t.column < h.start.column) ? (h.start.row = n, h.start.column = t.column) : h.start.row == r ? h.start.column <= i.column ? (l || h.start.column > t.column) && (h.start.column = t.column, h.start.row = t.row) : (h.start.column += c, h.start.row += l) : h.start.row > r && (h.start.row += l)
                        }
                        if (0 != l && s < a) for (; s < a; s++) (h = o[s]).start.row += l, h.end.row += l
                    }
                }.call(e.prototype), t.RangeList = e
            }), ace.define("ace/edit_session/fold", ["require", "exports", "module", "ace/range_list", "ace/lib/oop"], function (e, t, i) {
                "use strict";
                var n = e("../range_list").RangeList, e = e("../lib/oop"), r = t.Fold = function (e, t) {
                    this.foldLine = null, this.placeholder = t, this.range = e, this.start = e.start, this.end = e.end, this.sameRow = e.start.row == e.end.row, this.subFolds = this.ranges = []
                };

                function d(e, t) {
                    e.row -= t.row, 0 == e.row && (e.column -= t.column)
                }

                function o(e, t) {
                    0 == e.row && (e.column += t.column), e.row += t.row
                }

                e.inherits(r, n), function () {
                    this.toString = function () {
                        return '"' + this.placeholder + '" ' + this.range.toString()
                    }, this.setFoldLine = function (t) {
                        this.foldLine = t, this.subFolds.forEach(function (e) {
                            e.setFoldLine(t)
                        })
                    }, this.clone = function () {
                        var e = this.range.clone(), t = new r(e, this.placeholder);
                        return this.subFolds.forEach(function (e) {
                            t.subFolds.push(e.clone())
                        }), t.collapseChildren = this.collapseChildren, t
                    }, this.addSubFold = function (e) {
                        if (!this.range.isEqual(e)) {
                            o = e, s = this.start, d(o.start, s), d(o.end, s);
                            for (var t = e.start.row, i = e.start.column, n = 0, r = -1; n < this.subFolds.length && 1 == (r = this.subFolds[n].range.compare(t, i)); n++) ;
                            var o = this.subFolds[n], s = 0;
                            if (0 == r) {
                                if (o.range.containsRange(e)) return o.addSubFold(e);
                                s = 1
                            }
                            for (var t = e.range.end.row, i = e.range.end.column, a = n, r = -1; a < this.subFolds.length && 1 == (r = this.subFolds[a].range.compare(t, i)); a++) ;
                            0 == r && a++;
                            for (var l = this.subFolds.splice(n, a - n, e), c = 0 == r ? l.length - 1 : l.length, h = s; h < c; h++) e.addSubFold(l[h]);
                            return e.setFoldLine(this.foldLine), e
                        }
                    }, this.restoreRange = function (e) {
                        return t = e, e = this.start, o(t.start, e), void o(t.end, e);
                        var t
                    }
                }.call(r.prototype)
            }), ace.define("ace/edit_session/folding", ["require", "exports", "module", "ace/range", "ace/edit_session/fold_line", "ace/edit_session/fold", "ace/token_iterator"], function (e, t, i) {
                "use strict";
                var c = e("../range").Range, u = e("./fold_line").FoldLine, g = e("./fold").Fold,
                    h = e("../token_iterator").TokenIterator;
                t.Folding = function () {
                    this.getFoldAt = function (e, t, i) {
                        var n = this.getFoldLine(e);
                        if (!n) return null;
                        for (var r = n.folds, o = 0; o < r.length; o++) {
                            var s = r[o].range;
                            if (s.contains(e, t) && (1 != i || !s.isEnd(e, t) || s.isEmpty()) && (-1 != i || !s.isStart(e, t) || s.isEmpty())) return r[o]
                        }
                    }, this.getFoldsInRange = function (e) {
                        var t = e.start, i = e.end, n = this.$foldData, r = [];
                        t.column += 1, --i.column;
                        for (var o = 0; o < n.length; o++) if (2 != (l = n[o].range.compareRange(e))) {
                            if (-2 == l) break;
                            for (var s = n[o].folds, a = 0; a < s.length; a++) {
                                var l, c = s[a];
                                if (-2 == (l = c.range.compareRange(e))) break;
                                if (2 != l) {
                                    if (42 == l) break;
                                    r.push(c)
                                }
                            }
                        }
                        return --t.column, i.column += 1, r
                    }, this.getFoldsInRangeList = function (e) {
                        var t;
                        return Array.isArray(e) ? (t = [], e.forEach(function (e) {
                            t = t.concat(this.getFoldsInRange(e))
                        }, this)) : t = this.getFoldsInRange(e), t
                    }, this.getAllFolds = function () {
                        for (var e = [], t = this.$foldData, i = 0; i < t.length; i++) for (var n = 0; n < t[i].folds.length; n++) e.push(t[i].folds[n]);
                        return e
                    }, this.getFoldStringAt = function (e, t, i, n) {
                        if (!(n = n || this.getFoldLine(e))) return null;
                        for (var r, o = {end: {column: 0}}, s = 0; s < n.folds.length; s++) {
                            var a, l = (a = n.folds[s]).range.compareEnd(e, t);
                            if (-1 == l) {
                                r = this.getLine(a.start.row).substring(o.end.column, a.start.column);
                                break
                            }
                            if (0 === l) return null;
                            o = a
                        }
                        return r = r || this.getLine(a.start.row).substring(o.end.column), -1 == i ? r.substring(0, t - o.end.column) : 1 == i ? r.substring(t - o.end.column) : r
                    }, this.getFoldLine = function (e, t) {
                        var i = this.$foldData, n = 0;
                        for (-1 == (n = t ? i.indexOf(t) : n) && (n = 0); n < i.length; n++) {
                            var r = i[n];
                            if (r.start.row <= e && r.end.row >= e) return r;
                            if (r.end.row > e) return null
                        }
                        return null
                    }, this.getNextFoldLine = function (e, t) {
                        var i = this.$foldData, n = 0;
                        for (-1 == (
                            n = t ? i.indexOf(t) : n) && (n = 0); n < i.length; n++) {
                            var r = i[n];
                            if (r.end.row >= e) return r
                        }
                        return null
                    }, this.getFoldedRowCount = function (e, t) {
                        for (var i = this.$foldData, n = t - e + 1, r = 0; r < i.length; r++) {
                            var o = i[r], s = o.end.row, o = o.start.row;
                            if (t <= s) {
                                o < t && (e <= o ? n -= t - o : n = 0);
                                break
                            }
                            e <= s && (n -= e <= o ? s - o : s - e + 1)
                        }
                        return n
                    }, this.$addFoldLine = function (e) {
                        return this.$foldData.push(e), this.$foldData.sort(function (e, t) {
                            return e.start.row - t.start.row
                        }), e
                    }, this.addFold = function (e, t) {
                        var i, n = this.$foldData, r = !1;
                        e instanceof g ? i = e : (i = new g(t, e)).collapseChildren = t.collapseChildren, this.$clipRangeToDocument(i.range);
                        var o = i.start.row, s = i.start.column, a = i.end.row, l = i.end.column,
                            e = this.getFoldAt(o, s, 1), t = this.getFoldAt(a, l, -1);
                        if (e && t == e) return e.addSubFold(i);
                        e && !e.range.isStart(o, s) && this.removeFold(e), t && !t.range.isEnd(a, l) && this.removeFold(t);
                        t = this.getFoldsInRange(i.range);
                        0 < t.length && (this.removeFolds(t), i.collapseChildren || t.forEach(function (e) {
                            i.addSubFold(e)
                        }));
                        for (var c = 0; c < n.length; c++) {
                            var h = n[c];
                            if (a == h.start.row) {
                                h.addFold(i), r = !0;
                                break
                            }
                            if (o == h.end.row) {
                                if (h.addFold(i), r = !0, !i.sameRow) {
                                    var d = n[c + 1];
                                    if (d && d.start.row == a) {
                                        h.merge(d);
                                        break
                                    }
                                }
                                break
                            }
                            if (a <= h.start.row) break
                        }
                        return r || (h = this.$addFoldLine(new u(this.$foldData, i))), this.$useWrapMode ? this.$updateWrapData(h.start.row, h.start.row) : this.$updateRowLengthCache(h.start.row, h.start.row), this.$modified = !0, this._signal("changeFold", {
                            data: i,
                            action: "add"
                        }), i
                    }, this.addFolds = function (e) {
                        e.forEach(function (e) {
                            this.addFold(e)
                        }, this)
                    }, this.removeFold = function (e) {
                        var t = e.foldLine, i = t.start.row, n = t.end.row, r = this.$foldData, o = t.folds;
                        1 == o.length ? r.splice(r.indexOf(t), 1) : t.range.isEnd(e.end.row, e.end.column) ? (o.pop(), t.end.row = o[o.length - 1].end.row, t.end.column = o[o.length - 1].end.column) : t.range.isStart(e.start.row, e.start.column) ? (o.shift(), t.start.row = o[0].start.row, t.start.column = o[0].start.column) : e.sameRow ? o.splice(o.indexOf(e), 1) : ((o = (t = t.split(e.start.row, e.start.column)).folds).shift(), t.start.row = o[0].start.row, t.start.column = o[0].start.column), this.$updating || (this.$useWrapMode ? this.$updateWrapData(i, n) : this.$updateRowLengthCache(i, n)), this.$modified = !0, this._signal("changeFold", {
                            data: e,
                            action: "remove"
                        })
                    }, this.removeFolds = function (e) {
                        for (var t = [], i = 0; i < e.length; i++) t.push(e[i]);
                        t.forEach(function (e) {
                            this.removeFold(e)
                        }, this), this.$modified = !0
                    }, this.expandFold = function (t) {
                        this.removeFold(t), t.subFolds.forEach(function (e) {
                            t.restoreRange(e), this.addFold(e)
                        }, this), 0 < t.collapseChildren && this.foldAll(t.start.row + 1, t.end.row, t.collapseChildren - 1), t.subFolds = []
                    }, this.expandFolds = function (e) {
                        e.forEach(function (e) {
                            this.expandFold(e)
                        }, this)
                    }, this.unfold = function (e, t) {
                        var i;
                        if (null == e ? (i = new c(0, 0, this.getLength(), 0), null == t && (t = !0)) : i = "number" == typeof e ? new c(e, 0, e, this.getLine(e).length) : "row" in e ? c.fromPoints(e, e) : e, i = this.getFoldsInRangeList(i), 0 != t ? this.removeFolds(i) : this.expandFolds(i), i.length) return i
                    }, this.isRowFolded = function (e, t) {
                        return !!this.getFoldLine(e, t)
                    }, this.getRowFoldEnd = function (e, t) {
                        t = this.getFoldLine(e, t);
                        return t ? t.end.row : e
                    }, this.getRowFoldStart = function (e, t) {
                        t = this.getFoldLine(e, t);
                        return t ? t.start.row : e
                    }, this.getFoldDisplayLine = function (e, t, i, r, o) {
                        null == r && (r = e.start.row), null == o && (o = 0), null == t && (t = e.end.row), null == i && (i = this.getLine(t).length);
                        var s = this.doc, a = "";
                        return e.walk(function (e, t, i, n) {
                            if (!(t < r)) {
                                if (t == r) {
                                    if (i < o) return;
                                    n = Math.max(o, n)
                                }
                                a += null != e ? e : s.getLine(t).substring(n, i)
                            }
                        }, t, i), a
                    }, this.getDisplayLine = function (e, t, i, n) {
                        var r = this.getFoldLine(e);
                        if (r) return this.getFoldDisplayLine(r, e, t, i, n);
                        e = this.doc.getLine(e);
                        return e.substring(n || 0, t || e.length)
                    }, this.$cloneFoldData = function () {
                        var t = [];
                        return t = this.$foldData.map(function (e) {
                            e = e.folds.map(function (e) {
                                return e.clone()
                            });
                            return new u(t, e)
                        })
                    }, this.toggleFold = function (e) {
                        var t, i = this.selection.getRange();
                        if (i.isEmpty()) {
                            var n = i.start;
                            if (r = this.getFoldAt(n.row, n.column)) return void this.expandFold(r);
                            (t = this.findMatchingBracket(n)) ? 1 == i.comparePoint(t) ? i.end = t : (i.start = t, i.start.column++, i.end.column--) : (t = this.findMatchingBracket({
                                row: n.row,
                                column: n.column + 1
                            })) ? (1 == i.comparePoint(t) ? i.end = t : i.start = t, i.start.column++) : i = this.getCommentFoldRange(n.row, n.column) || i
                        } else {
                            n = this.getFoldsInRange(i);
                            if (e && n.length) return void this.expandFolds(n);
                            1 == n.length && (r = n[0])
                        }
                        if ((r = r || this.getFoldAt(i.start.row, i.start.column)) && r.range.toString() == i.toString()) this.expandFold(r); else {
                            var r = "...";
                            if (!i.isMultiLine()) {
                                if ((r = this.getTextRange(i)).length < 4) return;
                                r = r.trim().substring(0, 2) + ".."
                            }
                            this.addFold(r, i)
                        }
                    }, this.getCommentFoldRange = function (e, t, i) {
                        var n = new h(this, e, t), r = n.getCurrentToken(), o = r && r.type;
                        if (r && /^comment|string/.test(o)) {
                            "comment" == (o = o.match(/comment|string/)[0]) && (o += "|doc-start");
                            var s = new RegExp(o), o = new c;
                            if (1 != i) {
                                for (; (r = n.stepBackward()) && s.test(r.type);) ;
                                n.stepForward()
                            }
                            if (o.start.row = n.getCurrentTokenRow(), o.start.column = n.getCurrentTokenColumn() + 2, n = new h(this, e, t), -1 != i) {
                                var a = -1;
                                do {
                                    if (r = n.stepForward(), -1 == a) {
                                        var l = this.getState(n.$row);
                                        s.test(l) || (a = n.$row)
                                    } else if (n.$row > a) break
                                } while (r && s.test(r.type));
                                r = n.stepBackward()
                            } else r = n.getCurrentToken();
                            return o.end.row = n.getCurrentTokenRow(), o.end.column = n.getCurrentTokenColumn() + r.value.length - 2, o
                        }
                    }, this.foldAll = function (e, t, i, n) {
                        null == i && (i = 1e5);
                        var r = this.foldWidgets;
                        if (r) {
                            t = t || this.getLength();
                            for (var o, s = e = e || 0; s < t; s++) null == r[s] && (r[s] = this.getFoldWidget(s)), "start" == r[s] && (n && !n(s) || (o = this.getFoldWidgetRange(s)) && o.isMultiLine() && o.end.row <= t && o.start.row >= e && (s = o.end.row, o.collapseChildren = i, this.addFold("...", o)))
                        }
                    }, this.foldToLevel = function (e) {
                        for (this.foldAll(); 0 < e--;) this.unfold(null, !1)
                    }, this.foldAllComments = function () {
                        var r = this;
                        this.foldAll(null, null, null, function (e) {
                            for (var t = r.getTokens(e), i = 0; i < t.length; i++) {
                                var n = t[i];
                                if ("text" != n.type || !/^\s+$/.test(n.value)) return !!/comment/.test(n.type)
                            }
                        })
                    }, this.$foldStyles = {
                        manual: 1,
                        markbegin: 1,
                        markbeginend: 1
                    }, this.$foldStyle = "markbegin", this.setFoldStyle = function (e) {
                        if (!this.$foldStyles[e]) throw new Error("invalid fold style: " + e + "[" + Object.keys(this.$foldStyles).join(", ") + "]");
                        this.$foldStyle != e && ("manual" == (this.$foldStyle = e) && this.unfold(), e = this.$foldMode, this.$setFolding(null), this.$setFolding(e))
                    }, this.$setFolding = function (e) {
                        this.$foldMode != e && (this.$foldMode = e, this.off("change", this.$updateFoldWidgets), this.off("tokenizerUpdate", this.$tokenizerUpdateFoldWidgets), this._signal("changeAnnotation"), e && "manual" != this.$foldStyle ? (this.foldWidgets = [], this.getFoldWidget = e.getFoldWidget.bind(e, this, this.$foldStyle), this.getFoldWidgetRange = e.getFoldWidgetRange.bind(e, this, this.$foldStyle), this.$updateFoldWidgets = this.updateFoldWidgets.bind(this), this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this), this.on("change", this.$updateFoldWidgets), this.on("tokenizerUpdate", this.$tokenizerUpdateFoldWidgets)) : this.foldWidgets = null)
                    }, this.getParentFoldRangeData = function (e, t) {
                        var i = this.foldWidgets;
                        if (!i || t && i[e]) return {};
                        for (var n = e - 1; 0 <= n;) {
                            var r = i[n];
                            if ("start" == (r = null == r ? i[n] = this.getFoldWidget(n) : r)) {
                                var o = this.getFoldWidgetRange(n), s = s || o;
                                if (o && o.end.row >= e) break
                            }
                            n--
                        }
                        return {range: -1 !== n && o, firstRange: s}
                    }, this.onFoldWidgetClick = function (e, t) {
                        var i = {children: (t = t.domEvent).shiftKey, all: t.ctrlKey || t.metaKey, siblings: t.altKey};
                        this.$toggleFoldWidget(e, i) || (t = t.target || t.srcElement) && /ace_fold-widget/.test(t.className) && (t.className += " ace_invalid")
                    }, this.$toggleFoldWidget = function (e, t) {
                        if (this.getFoldWidget) {
                            var i = this.getFoldWidget(e), n = this.getLine(e), i = "end" === i ? -1 : 1,
                                n = this.getFoldAt(e, -1 == i ? 0 : n.length, i);
                            if (n) return t.children || t.all ? this.removeFold(n) : this.expandFold(n), n;
                            var r, o, i = this.getFoldWidgetRange(e, !0);
                            return i && !i.isMultiLine() && (n = this.getFoldAt(i.start.row, i.start.column, 1)) && i.isEqual(n.range) ? (this.removeFold(n), n) : (t.siblings ? ((n = this.getParentFoldRangeData(e)).range && (r = n.range.start.row + 1, o = n.range.end.row), this.foldAll(r, o, t.all ? 1e4 : 0)) : t.children ? (o = i ? i.end.row : this.getLength(), this.foldAll(e + 1, o, t.all ? 1e4 : 0)) : i && (t.all && (i.collapseChildren = 1e4), this.addFold("...", i)), i)
                        }
                    }, this.toggleFoldWidget = function (e) {
                        var t, i, n = this.selection.getCursor().row;
                        n = this.getRowFoldStart(n), (i = this.$toggleFoldWidget(n, {})) || (i = (t = this.getParentFoldRangeData(n, !0)).range || t.firstRange) && (n = i.start.row, (n = this.getFoldAt(n, this.getLine(n).length, 1)) ? this.removeFold(n) : this.addFold("...", i))
                    }, this.updateFoldWidgets = function (e) {
                        var t = e.start.row, i = e.end.row - t;
                        0 == i ? this.foldWidgets[t] = null : "remove" == e.action ? this.foldWidgets.splice(t, 1 + i, null) : ((i = Array(1 + i)).unshift(t, 1), this.foldWidgets.splice.apply(this.foldWidgets, i))
                    }, this.tokenizerUpdateFoldWidgets = function (e) {
                        e = e.data;
                        e.first != e.last && this.foldWidgets.length > e.first && this.foldWidgets.splice(e.first, this.foldWidgets.length)
                    }
                }
            }), ace.define("ace/edit_session/bracket_match", ["require", "exports", "module", "ace/token_iterator", "ace/range"], function (e, t, i) {
                "use strict";
                var d = e("../token_iterator").TokenIterator, a = e("../range").Range;
                t.BracketMatch = function () {
                    this.findMatchingBracket = function (e, t) {
                        if (0 == e.column) return null;
                        t = t || this.getLine(e.row).charAt(e.column - 1);
                        if ("" == t) return null;
                        t = t.match(/([\(\[\{])|([\)\]\}])/);
                        return t ? t[1] ? this.$findClosingBracket(t[1], e) : this.$findOpeningBracket(t[2], e) : null
                    }, this.getBracketRange = function (e) {
                        var t, i, n = this.getLine(e.row), r = !0, o = n.charAt(e.column - 1),
                            s = o && o.match(/([\(\[\{])|([\)\]\}])/);
                        if (s || (o = n.charAt(e.column), e = {
                            row: e.row,
                            column: e.column + 1
                        }, s = o && o.match(/([\(\[\{])|([\)\]\}])/), r = !1), !s) return null;
                        if (s[1]) {
                            if (!(i = this.$findClosingBracket(s[1], e))) return null;
                            t = a.fromPoints(e, i), r || (t.end.column++, t.start.column--), t.cursor = t.end
                        } else {
                            if (!(i = this.$findOpeningBracket(s[2], e))) return null;
                            t = a.fromPoints(i, e), r || (t.start.column++, t.end.column--), t.cursor = t.start
                        }
                        return t
                    }, this.getMatchingBracketRanges = function (e) {
                        var t = this.getLine(e.row), i = t.charAt(e.column - 1),
                            n = i && i.match(/([\(\[\{])|([\)\]\}])/);
                        if (n || (i = t.charAt(e.column), e = {
                            row: e.row,
                            column: e.column + 1
                        }, n = i && i.match(/([\(\[\{])|([\)\]\}])/)), !n) return null;
                        i = new a(e.row, e.column - 1, e.row, e.column), e = n[1] ? this.$findClosingBracket(n[1], e) : this.$findOpeningBracket(n[2], e);
                        return e ? [i, new a(e.row, e.column, e.row, e.column + 1)] : [i]
                    }, this.$brackets = {
                        ")": "(",
                        "(": ")",
                        "]": "[",
                        "[": "]",
                        "{": "}",
                        "}": "{",
                        "<": ">",
                        ">": "<"
                    }, this.$findOpeningBracket = function (e, t, i) {
                        var n = this.$brackets[e], r = 1, o = new d(this, t.row, t.column), s = o.getCurrentToken();
                        if (s = s || o.stepForward()) {
                            i = i || new RegExp("(\\.?" + s.type.replace(".", "\\.").replace("rparen", ".paren").replace(/\b(?:end)\b/, "(?:start|begin|end)") + ")+");
                            for (var a = t.column - o.getCurrentTokenColumn() - 2, l = s.value; ;) {
                                for (; 0 <= a;) {
                                    var c = l.charAt(a);
                                    if (c == n) {
                                        if (0 == --r) return {
                                            row: o.getCurrentTokenRow(),
                                            column: a + o.getCurrentTokenColumn()
                                        }
                                    } else c == e && (r += 1);
                                    --a
                                }
                                for (; (s = o.stepBackward()) && !i.test(s.type);) ;
                                if (null == s) break;
                                a = (l = s.value).length - 1
                            }
                            return null
                        }
                    }, this.$findClosingBracket = function (e, t, i) {
                        var n = this.$brackets[e], r = 1, o = new d(this, t.row, t.column), s = o.getCurrentToken();
                        if (s = s || o.stepForward()) {
                            i = i || new RegExp("(\\.?" + s.type.replace(".", "\\.").replace("lparen", ".paren").replace(/\b(?:start|begin)\b/, "(?:start|begin|end)") + ")+");
                            for (var a = t.column - o.getCurrentTokenColumn(); ;) {
                                for (var l = s.value, c = l.length; a < c;) {
                                    var h = l.charAt(a);
                                    if (h == n) {
                                        if (0 == --r) return {
                                            row: o.getCurrentTokenRow(),
                                            column: a + o.getCurrentTokenColumn()
                                        }
                                    } else h == e && (r += 1);
                                    a += 1
                                }
                                for (; (s = o.stepForward()) && !i.test(s.type);) ;
                                if (null == s) break;
                                a = 0
                            }
                            return null
                        }
                    }
                }
            }), ace.define("ace/edit_session", ["require", "exports", "module", "ace/lib/oop", "ace/lib/lang", "ace/bidihandler", "ace/config", "ace/lib/event_emitter", "ace/selection", "ace/mode/text", "ace/range", "ace/document", "ace/background_tokenizer", "ace/search_highlight", "ace/edit_session/folding", "ace/edit_session/bracket_match"], function (e, t, i) {
                "use strict";

                function n(e, t) {
                    this.$breakpoints = [], this.$decorations = [], this.$frontMarkers = {}, this.$backMarkers = {}, this.$markerId = 1, this.$undoSelect = !0, this.$foldData = [], this.id = "session" + ++n.$uid, this.$foldData.toString = function () {
                        return this.join("\n")
                    }, this.on("changeFold", this.onChangeFold.bind(this)), this.$onChange = this.onChange.bind(this), "object" == typeof e && e.getLine || (e = new u(e)), this.setDocument(e), this.selection = new a(this), this.$bidiHandler = new s(this), l.resetOptions(this), this.setMode(t), l._signal("session", this)
                }

                var r = e("./lib/oop"), o = e("./lib/lang"), s = e("./bidihandler").BidiHandler, l = e("./config"),
                    c = e("./lib/event_emitter").EventEmitter, a = e("./selection").Selection,
                    h = e("./mode/text").Mode, d = e("./range").Range, u = e("./document").Document,
                    g = e("./background_tokenizer").BackgroundTokenizer, f = e("./search_highlight").SearchHighlight;
                n.$uid = 0, function () {
                    r.implement(this, c), this.setDocument = function (e) {
                        this.doc && this.doc.removeListener("change", this.$onChange), (this.doc = e).on("change", this.$onChange), this.bgTokenizer && this.bgTokenizer.setDocument(this.getDocument()), this.resetCaches()
                    }, this.getDocument = function () {
                        return this.doc
                    }, this.$resetRowCache = function (e) {
                        if (!e) return this.$docRowCache = [], void (this.$screenRowCache = []);
                        var t = this.$docRowCache.length, e = this.$getRowCacheIndex(this.$docRowCache, e) + 1;
                        e < t && (this.$docRowCache.splice(e, t), this.$screenRowCache.splice(e, t))
                    }, this.$getRowCacheIndex = function (e, t) {
                        for (var i = 0, n = e.length - 1; i <= n;) {
                            var r = i + n >> 1, o = e[r];
                            if (o < t) i = 1 + r; else {
                                if (!(t < o)) return r;
                                n = r - 1
                            }
                        }
                        return i - 1
                    }, this.resetCaches = function () {
                        this.$modified = !0, this.$wrapData = [], this.$rowLengthCache = [], this.$resetRowCache(0), this.bgTokenizer && this.bgTokenizer.start(0)
                    }, this.onChangeFold = function (e) {
                        e = e.data;
                        this.$resetRowCache(e.start.row)
                    }, this.onChange = function (e) {
                        this.$modified = !0, this.$bidiHandler.onChange(e), this.$resetRowCache(e.start.row);
                        var t = this.$updateInternalDataOnChange(e);
                        !this.$fromUndo && this.$undoManager && (t && t.length && (this.$undoManager.add({
                            action: "removeFolds",
                            folds: t
                        }, this.mergeUndoDeltas), this.mergeUndoDeltas = !0), this.$undoManager.add(e, this.mergeUndoDeltas), this.mergeUndoDeltas = !0, this.$informUndoManager.schedule()), this.bgTokenizer && this.bgTokenizer.$updateOnChange(e), this._signal("change", e)
                    }, this.setValue = function (e) {
                        this.doc.setValue(e), this.selection.moveTo(0, 0), this.$resetRowCache(0), this.setUndoManager(this.$undoManager), this.getUndoManager().reset()
                    }, this.getValue = this.toString = function () {
                        return this.doc.getValue()
                    }, this.getSelection = function () {
                        return this.selection
                    }, this.getState = function (e) {
                        return this.bgTokenizer.getState(e)
                    }, this.getTokens = function (e) {
                        return this.bgTokenizer.getTokens(e)
                    }, this.getTokenAt = function (e, t) {
                        var i = this.bgTokenizer.getTokens(e), n = 0;
                        if (null == t) var r = i.length - 1,
                            n = this.getLine(e).length; else for (r = 0; r < i.length && !(t <= (n += i[r].value.length)); r++) ;
                        return (e = i[r]) ? (e.index = r, e.start = n - e.value.length, e) : null
                    }, this.setUndoManager = function (e) {
                        var t;
                        this.$undoManager = e, this.$informUndoManager && this.$informUndoManager.cancel(), e ? (e.addSession(t = this), this.$syncInformUndoManager = function () {
                            t.$informUndoManager.cancel(), t.mergeUndoDeltas = !1
                        }, this.$informUndoManager = o.delayedCall(this.$syncInformUndoManager)) : this.$syncInformUndoManager = function () {
                        }
                    }, this.markUndoGroup = function () {
                        this.$syncInformUndoManager && this.$syncInformUndoManager()
                    }, this.$defaultUndoManager = {
                        undo: function () {
                        }, redo: function () {
                        }, hasUndo: function () {
                        }, hasRedo: function () {
                        }, reset: function () {
                        }, add: function () {
                        }, addSelection: function () {
                        }, startNewGroup: function () {
                        }, addSession: function () {
                        }
                    }, this.getUndoManager = function () {
                        return this.$undoManager || this.$defaultUndoManager
                    }, this.getTabString = function () {
                        return this.getUseSoftTabs() ? o.stringRepeat(" ", this.getTabSize()) : "\t"
                    }, this.setUseSoftTabs = function (e) {
                        this.setOption("useSoftTabs", e)
                    }, this.getUseSoftTabs = function () {
                        return this.$useSoftTabs && !this.$mode.$indentWithTabs
                    }, this.setTabSize = function (e) {
                        this.setOption("tabSize", e)
                    }, this.getTabSize = function () {
                        return this.$tabSize
                    }, this.isTabStop = function (e) {
                        return this.$useSoftTabs && e.column % this.$tabSize == 0
                    }, this.setNavigateWithinSoftTabs = function (e) {
                        this.setOption("navigateWithinSoftTabs", e)
                    }, this.getNavigateWithinSoftTabs = function () {
                        return this.$navigateWithinSoftTabs
                    }, this.$overwrite = !1, this.setOverwrite = function (e) {
                        this.setOption("overwrite", e)
                    }, this.getOverwrite = function () {
                        return this.$overwrite
                    }, this.toggleOverwrite = function () {
                        this.setOverwrite(!this.$overwrite)
                    }, this.addGutterDecoration = function (e, t) {
                        this.$decorations[e] || (this.$decorations[e] = ""), this.$decorations[e] += " " + t, this._signal("changeBreakpoint", {})
                    }, this.removeGutterDecoration = function (e, t) {
                        this.$decorations[e] = (this.$decorations[e] || "").replace(" " + t, ""), this._signal("changeBreakpoint", {})
                    }, this.getBreakpoints = function () {
                        return this.$breakpoints
                    }, this.setBreakpoints = function (e) {
                        this.$breakpoints = [];
                        for (var t = 0; t < e.length; t++) this.$breakpoints[e[t]] = "ace_breakpoint";
                        this._signal("changeBreakpoint", {})
                    }, this.clearBreakpoints = function () {
                        this.$breakpoints = [], this._signal("changeBreakpoint", {})
                    }, this.setBreakpoint = function (e, t) {
                        (t = void 0 === t ? "ace_breakpoint" : t) ? this.$breakpoints[e] = t : delete this.$breakpoints[e], this._signal("changeBreakpoint", {})
                    }, this.clearBreakpoint = function (e) {
                        delete this.$breakpoints[e], this._signal("changeBreakpoint", {})
                    }, this.addMarker = function (e, t, i, n) {
                        var r = this.$markerId++, t = {
                            range: e,
                            type: i || "line",
                            renderer: "function" == typeof i ? i : null,
                            clazz: t,
                            inFront: !!n,
                            id: r
                        };
                        return n ? (this.$frontMarkers[r] = t, this._signal("changeFrontMarker")) : (this.$backMarkers[r] = t, this._signal("changeBackMarker")), r
                    }, this.addDynamicMarker = function (e, t) {
                        if (e.update) {
                            var i = this.$markerId++;
                            return e.id = i, e.inFront = !!t, t ? (this.$frontMarkers[i] = e, this._signal("changeFrontMarker")) : (this.$backMarkers[i] = e, this._signal("changeBackMarker")), e
                        }
                    }, this.removeMarker = function (e) {
                        var t = this.$frontMarkers[e] || this.$backMarkers[e];
                        t && (delete (t.inFront ? this.$frontMarkers : this.$backMarkers)[e], this._signal(t.inFront ? "changeFrontMarker" : "changeBackMarker"))
                    }, this.getMarkers = function (e) {
                        return e ? this.$frontMarkers : this.$backMarkers
                    }, this.highlight = function (e) {
                        var t;
                        this.$searchHighlight || (t = new f(null, "ace_selected-word", "text"), this.$searchHighlight = this.addDynamicMarker(t)), this.$searchHighlight.setRegexp(e)
                    }, this.highlightLines = function (e, t, i, n) {
                        "number" != typeof t && (i = t, t = e), i = i || "ace_step";
                        t = new d(e, 0, t, 1 / 0);
                        return t.id = this.addMarker(t, i, "fullLine", n), t
                    }, this.setAnnotations = function (e) {
                        this.$annotations = e, this._signal("changeAnnotation", {})
                    }, this.getAnnotations = function () {
                        return this.$annotations || []
                    }, this.clearAnnotations = function () {
                        this.setAnnotations([])
                    }, this.$detectNewLine = function (e) {
                        e = e.match(/^.*?(\r?\n)/m);
                        this.$autoNewLine = e ? e[1] : "\n"
                    }, this.getWordRange = function (e, t) {
                        var i, n = this.getLine(e), r = !1;
                        i = (r = (r = 0 < t ? !!n.charAt(t - 1).match(this.tokenRe) : r) || !!n.charAt(t).match(this.tokenRe)) ? this.tokenRe : /^\s+$/.test(n.slice(t - 1, t + 1)) ? /\s/ : this.nonTokenRe;
                        var o = t;
                        if (0 < o) {
                            for (; 0 <= --o && n.charAt(o).match(i);) ;
                            o++
                        }
                        for (var s = t; s < n.length && n.charAt(s).match(i);) s++;
                        return new d(e, o, e, s)
                    }, this.getAWordRange = function (e, t) {
                        for (var i = this.getWordRange(e, t), n = this.getLine(i.end.row); n.charAt(i.end.column).match(/[ \t]/);) i.end.column += 1;
                        return i
                    }, this.setNewLineMode = function (e) {
                        this.doc.setNewLineMode(e)
                    }, this.getNewLineMode = function () {
                        return this.doc.getNewLineMode()
                    }, this.setUseWorker = function (e) {
                        this.setOption("useWorker", e)
                    }, this.getUseWorker = function () {
                        return this.$useWorker
                    }, this.onReloadTokenizer = function (e) {
                        var t = e.data;
                        this.bgTokenizer.start(t.first), this._signal("tokenizerUpdate", e)
                    }, this.$modes = l.$modes, this.$mode = null, this.$modeId = null, this.setMode = function (e, t) {
                        if (e && "object" == typeof e) {
                            if (e.getTokenizer) return this.$onChangeMode(e);
                            var i = e, n = i.path
                        } else n = e || "ace/mode/text";
                        if (this.$modes["ace/mode/text"] || (this.$modes["ace/mode/text"] = new h), this.$modes[n] && !i) return this.$onChangeMode(this.$modes[n]), void (t && t());
                        this.$modeId = n, l.loadModule(["mode", n], function (e) {
                            if (this.$modeId !== n) return t && t();
                            this.$modes[n] && !i ? this.$onChangeMode(this.$modes[n]) : e && e.Mode && (e = new e.Mode(i), i || ((this.$modes[n] = e).$id = n), this.$onChangeMode(e)), t && t()
                        }.bind(this)), this.$mode || this.$onChangeMode(this.$modes["ace/mode/text"], !0)
                    }, this.$onChangeMode = function (e, t) {
                        var i, n, r, o;
                        t || (this.$modeId = e.$id), this.$mode !== e && (i = this.$mode, this.$mode = e, this.$stopWorker(), this.$useWorker && this.$startWorker(), void 0 !== (n = e.getTokenizer()).on && (r = this.onReloadTokenizer.bind(this), n.on("update", r)), this.bgTokenizer ? this.bgTokenizer.setTokenizer(n) : (this.bgTokenizer = new g(n), (o = this).bgTokenizer.on("update", function (e) {
                            o._signal("tokenizerUpdate", e)
                        })), this.bgTokenizer.setDocument(this.getDocument()), this.tokenRe = e.tokenRe, this.nonTokenRe = e.nonTokenRe, t || (e.attachToSession && e.attachToSession(this), this.$options.wrapMethod.set.call(this, this.$wrapMethod), this.$setFolding(e.foldingRules), this.bgTokenizer.start(0), this._emit("changeMode", {
                            oldMode: i,
                            mode: e
                        })))
                    }, this.$stopWorker = function () {
                        this.$worker && (this.$worker.terminate(), this.$worker = null)
                    }, this.$startWorker = function () {
                        try {
                            this.$worker = this.$mode.createWorker(this)
                        } catch (e) {
                            l.warn("Could not load worker", e), this.$worker = null
                        }
                    }, this.getMode = function () {
                        return this.$mode
                    }, this.$scrollTop = 0, this.setScrollTop = function (e) {
                        this.$scrollTop === e || isNaN(e) || (this.$scrollTop = e, this._signal("changeScrollTop", e))
                    }, this.getScrollTop = function () {
                        return this.$scrollTop
                    }, this.$scrollLeft = 0, this.setScrollLeft = function (e) {
                        this.$scrollLeft === e || isNaN(e) || (this.$scrollLeft = e, this._signal("changeScrollLeft", e))
                    }, this.getScrollLeft = function () {
                        return this.$scrollLeft
                    }, this.getScreenWidth = function () {
                        return this.$computeWidth(), this.lineWidgets ? Math.max(this.getLineWidgetMaxWidth(), this.screenWidth) : this.screenWidth
                    }, this.getLineWidgetMaxWidth = function () {
                        if (null != this.lineWidgetsWidth) return this.lineWidgetsWidth;
                        var t = 0;
                        return this.lineWidgets.forEach(function (e) {
                            e && e.screenWidth > t && (t = e.screenWidth)
                        }), this.lineWidgetWidth = t
                    }, this.$computeWidth = function (e) {
                        if (this.$modified || e) {
                            if (this.$modified = !1, this.$useWrapMode) return this.screenWidth = this.$wrapLimit;
                            for (var t = this.doc.getAllLines(), i = this.$rowLengthCache, n = 0, r = 0, o = this.$foldData[r], s = o ? o.start.row : 1 / 0, a = t.length, l = 0; l < a; l++) {
                                if (s < l) {
                                    if (a <= (l = o.end.row + 1)) break;
                                    s = (o = this.$foldData[r++]) ? o.start.row : 1 / 0
                                }
                                null == i[l] && (i[l] = this.$getStringScreenWidth(t[l])[0]), i[l] > n && (n = i[l])
                            }
                            this.screenWidth = n
                        }
                    }, this.getLine = function (e) {
                        return this.doc.getLine(e)
                    }, this.getLines = function (e, t) {
                        return this.doc.getLines(e, t)
                    }, this.getLength = function () {
                        return this.doc.getLength()
                    }, this.getTextRange = function (e) {
                        return this.doc.getTextRange(e || this.selection.getRange())
                    }, this.insert = function (e, t) {
                        return this.doc.insert(e, t)
                    }, this.remove = function (e) {
                        return this.doc.remove(e)
                    }, this.removeFullLines = function (e, t) {
                        return this.doc.removeFullLines(e, t)
                    }, this.undoChanges = function (e, t) {
                        if (e.length) {
                            this.$fromUndo = !0;
                            for (var i = e.length - 1; -1 != i; i--) {
                                var n = e[i];
                                "insert" == n.action || "remove" == n.action ? this.doc.revertDelta(n) : n.folds && this.addFolds(n.folds)
                            }
                            !t && this.$undoSelect && (e.selectionBefore ? this.selection.fromJSON(e.selectionBefore) : this.selection.setRange(this.$getUndoSelection(e, !0))), this.$fromUndo = !1
                        }
                    }, this.redoChanges = function (e, t) {
                        if (e.length) {
                            this.$fromUndo = !0;
                            for (var i = 0; i < e.length; i++) {
                                var n = e[i];
                                "insert" != n.action && "remove" != n.action || this.doc.$safeApplyDelta(n)
                            }
                            !t && this.$undoSelect && (e.selectionAfter ? this.selection.fromJSON(e.selectionAfter) : this.selection.setRange(this.$getUndoSelection(e, !1))), this.$fromUndo = !1
                        }
                    }, this.setUndoSelect = function (e) {
                        this.$undoSelect = e
                    }, this.$getUndoSelection = function (e, t) {
                        function i(e) {
                            return t ? "insert" !== e.action : "insert" === e.action
                        }

                        for (var n, r, o = 0; o < e.length; o++) {
                            var s = e[o];
                            s.start && (n ? i(s) ? (r = s.start, -1 == n.compare(r.row, r.column) && n.setStart(r), r = s.end, 1 == n.compare(r.row, r.column) && n.setEnd(r)) : (r = s.start, -1 == n.compare(r.row, r.column) && (n = d.fromPoints(s.start, s.start))) : n = i(s) ? d.fromPoints(s.start, s.end) : d.fromPoints(s.start, s.start))
                        }
                        return n
                    }, this.replace = function (e, t) {
                        return this.doc.replace(e, t)
                    }, this.moveText = function (e, t, i) {
                        var n, r, o, s = this.getTextRange(e), a = this.getFoldsInRange(e), t = d.fromPoints(t, t);
                        return i || (this.remove(e), r = e.start.row - e.end.row, (o = r ? -e.end.column : e.start.column - e.end.column) && (t.start.row == e.end.row && t.start.column > e.end.column && (t.start.column += o), t.end.row == e.end.row && t.end.column > e.end.column && (t.end.column += o)), r && t.start.row >= e.end.row && (t.start.row += r, t.end.row += r)), t.end = this.insert(t.start, s), a.length && (n = e.start, e = t.start, r = e.row - n.row, o = e.column - n.column, this.addFolds(a.map(function (e) {
                            return (e = e.clone()).start.row == n.row && (e.start.column += o), e.end.row == n.row && (e.end.column += o), e.start.row += r, e.end.row += r, e
                        }))), t
                    }, this.indentRows = function (e, t, i) {
                        i = i.replace(/\t/g, this.getTabString());
                        for (var n = e; n <= t; n++) this.doc.insertInLine({row: n, column: 0}, i)
                    }, this.outdentRows = function (e) {
                        for (var t = e.collapseRows(), i = new d(0, 0, 0, 0), n = this.getTabSize(), r = t.start.row; r <= t.end.row; ++r) {
                            var o = this.getLine(r);
                            i.start.row = r, i.end.row = r;
                            for (var s = 0; s < n && " " == o.charAt(s); ++s) ;
                            s < n && "\t" == o.charAt(s) ? (i.start.column = s, i.end.column = s + 1) : (i.start.column = 0, i.end.column = s), this.remove(i)
                        }
                    }, this.$moveLines = function (e, t, i) {
                        if (e = this.getRowFoldStart(e), t = this.getRowFoldEnd(t), i < 0) {
                            if ((r = this.getRowFoldStart(e + i)) < 0) return 0;
                            var n = r - e
                        } else if (0 < i) {
                            if ((r = this.getRowFoldEnd(t + i)) > this.doc.getLength() - 1) return 0;
                            n = r - t
                        } else {
                            e = this.$clipRowToDocument(e);
                            n = (t = this.$clipRowToDocument(t)) - e + 1
                        }
                        var r = new d(e, 0, t, Number.MAX_VALUE), r = this.getFoldsInRange(r).map(function (e) {
                            return (e = e.clone()).start.row += n, e.end.row += n, e
                        }), t = 0 == i ? this.doc.getLines(e, t) : this.doc.removeFullLines(e, t);
                        return this.doc.insertFullLines(e + n, t), r.length && this.addFolds(r), n
                    }, this.moveLinesUp = function (e, t) {
                        return this.$moveLines(e, t, -1)
                    }, this.moveLinesDown = function (e, t) {
                        return this.$moveLines(e, t, 1)
                    }, this.duplicateLines = function (e, t) {
                        return this.$moveLines(e, t, 0)
                    }, this.$clipRowToDocument = function (e) {
                        return Math.max(0, Math.min(e, this.doc.getLength() - 1))
                    }, this.$clipColumnToRow = function (e, t) {
                        return t < 0 ? 0 : Math.min(this.doc.getLine(e).length, t)
                    }, this.$clipPositionToDocument = function (e, t) {
                        var i;
                        return t = Math.max(0, t), t = e < 0 ? e = 0 : (i = this.doc.getLength()) <= e ? this.doc.getLine(e = i - 1).length : Math.min(this.doc.getLine(e).length, t), {
                            row: e,
                            column: t
                        }
                    }, this.$clipRangeToDocument = function (e) {
                        e.start.row < 0 ? (e.start.row = 0, e.start.column = 0) : e.start.column = this.$clipColumnToRow(e.start.row, e.start.column);
                        var t = this.doc.getLength() - 1;
                        return e.end.row > t ? (e.end.row = t, e.end.column = this.doc.getLine(t).length) : e.end.column = this.$clipColumnToRow(e.end.row, e.end.column), e
                    }, this.$wrapLimit = 80, this.$useWrapMode = !1, this.$wrapLimitRange = {
                        min: null,
                        max: null
                    }, this.setUseWrapMode = function (e) {
                        e != this.$useWrapMode && (this.$useWrapMode = e, this.$modified = !0, this.$resetRowCache(0), e && (e = this.getLength(), this.$wrapData = Array(e), this.$updateWrapData(0, e - 1)), this._signal("changeWrapMode"))
                    }, this.getUseWrapMode = function () {
                        return this.$useWrapMode
                    }, this.setWrapLimitRange = function (e, t) {
                        this.$wrapLimitRange.min === e && this.$wrapLimitRange.max === t || (this.$wrapLimitRange = {
                            min: e,
                            max: t
                        }, this.$modified = !0, this.$bidiHandler.markAsDirty(), this.$useWrapMode && this._signal("changeWrapMode"))
                    }, this.adjustWrapLimit = function (e, t) {
                        var i = this.$wrapLimitRange;
                        i.max < 0 && (i = {min: t, max: t});
                        i = this.$constrainWrapLimit(e, i.min, i.max);
                        return i != this.$wrapLimit && 1 < i && (this.$wrapLimit = i, this.$modified = !0, this.$useWrapMode && (this.$updateWrapData(0, this.getLength() - 1), this.$resetRowCache(0), this._signal("changeWrapLimit")), !0)
                    },this.$constrainWrapLimit = function (e, t, i) {
                        return t && (e = Math.max(t, e)), e = i ? Math.min(i, e) : e
                    },this.getWrapLimit = function () {
                        return this.$wrapLimit
                    },this.setWrapLimit = function (e) {
                        this.setWrapLimitRange(e, e)
                    },this.getWrapLimitRange = function () {
                        return {min: this.$wrapLimitRange.min, max: this.$wrapLimitRange.max}
                    },this.$updateInternalDataOnChange = function (e) {
                        var t = this.$useWrapMode, i = e.action, n = e.start, r = e.end, o = n.row, s = r.row,
                            a = s - o, l = null;
                        if (this.$updating = !0, 0 != a) if ("remove" === i) {
                            this[t ? "$wrapData" : "$rowLengthCache"].splice(o, a);
                            var c = this.$foldData, l = this.getFoldsInRange(e);
                            this.removeFolds(l);
                            var h = 0;
                            for ((g = this.getFoldLine(r.row)) && (g.addRemoveChars(r.row, r.column, n.column - r.column), g.shiftRow(-a), (u = this.getFoldLine(o)) && u !== g && (u.merge(g), g = u), h = c.indexOf(g) + 1); h < c.length; h++) (g = c[h]).start.row >= r.row && g.shiftRow(-a);
                            s = o
                        } else {
                            var d = Array(a);
                            d.unshift(o, 0);
                            var u = t ? this.$wrapData : this.$rowLengthCache;
                            u.splice.apply(u, d);
                            c = this.$foldData, h = 0;
                            for ((g = this.getFoldLine(o)) && (0 == (d = g.range.compareInside(n.row, n.column)) ? (g = g.split(n.row, n.column)) && (g.shiftRow(a), g.addRemoveChars(s, 0, r.column - n.column)) : -1 == d && (g.addRemoveChars(o, 0, r.column - n.column), g.shiftRow(a)), h = c.indexOf(g) + 1); h < c.length; h++) (g = c[h]).start.row >= o && g.shiftRow(a)
                        } else {
                            var g, a = Math.abs(e.start.column - e.end.column);
                            "remove" === i && (l = this.getFoldsInRange(e), this.removeFolds(l), a = -a), (g = this.getFoldLine(o)) && g.addRemoveChars(o, n.column, a)
                        }
                        return t && this.$wrapData.length != this.doc.getLength() && console.error("doc.getLength() and $wrapData.length have to be the same!"), this.$updating = !1, t ? this.$updateWrapData(o, s) : this.$updateRowLengthCache(o, s), l
                    },this.$updateRowLengthCache = function (e, t, i) {
                        this.$rowLengthCache[e] = null, this.$rowLengthCache[t] = null
                    },this.$updateWrapData = function (e, t) {
                        var s, i, a = this.doc.getAllLines(), n = this.getTabSize(), r = this.$wrapData,
                            o = this.$wrapLimit, l = e;
                        for (t = Math.min(t, a.length - 1); l <= t;) (i = this.getFoldLine(l, i)) ? (s = [], i.walk(function (e, t, i, n) {
                            var r;
                            if (null != e) {
                                (r = this.$getDisplayTokens(e, s.length))[0] = p;
                                for (var o = 1; o < r.length; o++) r[o] = m
                            } else r = this.$getDisplayTokens(a[t].substring(n, i), s.length);
                            s = s.concat(r)
                        }.bind(this), i.end.row, a[i.end.row].length + 1), r[i.start.row] = this.$computeWrapSplits(s, o, n), l = i.end.row + 1) : (s = this.$getDisplayTokens(a[l]), r[l] = this.$computeWrapSplits(s, o, n), l++)
                    };
                    var p = 3, m = 4;

                    function a(e) {
                        return !(e < 4352) && (4352 <= e && e <= 4447 || 4515 <= e && e <= 4519 || 4602 <= e && e <= 4607 || 9001 <= e && e <= 9002 || 11904 <= e && e <= 11929 || 11931 <= e && e <= 12019 || 12032 <= e && e <= 12245 || 12272 <= e && e <= 12283 || 12288 <= e && e <= 12350 || 12353 <= e && e <= 12438 || 12441 <= e && e <= 12543 || 12549 <= e && e <= 12589 || 12593 <= e && e <= 12686 || 12688 <= e && e <= 12730 || 12736 <= e && e <= 12771 || 12784 <= e && e <= 12830 || 12832 <= e && e <= 12871 || 12880 <= e && e <= 13054 || 13056 <= e && e <= 19903 || 19968 <= e && e <= 42124 || 42128 <= e && e <= 42182 || 43360 <= e && e <= 43388 || 44032 <= e && e <= 55203 || 55216 <= e && e <= 55238 || 55243 <= e && e <= 55291 || 63744 <= e && e <= 64255 || 65040 <= e && e <= 65049 || 65072 <= e && e <= 65106 || 65108 <= e && e <= 65126 || 65128 <= e && e <= 65131 || 65281 <= e && e <= 65376 || 65504 <= e && e <= 65510)
                    }

                    this.$computeWrapSplits = function (r, e, o) {
                        if (0 == r.length) return [];
                        var s = [], t = r.length, a = 0, l = 0, c = this.$wrapAsCode, h = this.$indentedSoftWrap,
                            d = e <= Math.max(2 * o, 8) || !1 === h ? 0 : Math.floor(e / 2);

                        function i(e) {
                            for (var t = e - a, i = a; i < e; i++) {
                                var n = r[i];
                                12 !== n && 2 !== n || --t
                            }
                            s.length || (u = function () {
                                var e = 0;
                                if (0 === d) return e;
                                if (h) for (var t = 0; t < r.length; t++) {
                                    var i = r[t];
                                    if (10 == i) e += 1; else if (11 == i) e += o; else if (12 != i) break
                                }
                                return c && !1 !== h && (e += o), Math.min(e, d)
                            }(), s.indent = u), l += t, s.push(l), a = e
                        }

                        for (var u = 0; e - u < t - a;) {
                            var n = a + e - u;
                            if (10 <= r[n - 1] && 10 <= r[n]) i(n); else if (r[n] != p && r[n] != m) {
                                for (var g = Math.max(n - (e - (e >> 2)), a - 1); g < n && r[n] < p;) n--;
                                if (c) {
                                    for (; g < n && r[n] < p;) n--;
                                    for (; g < n && 9 == r[n];) n--
                                } else for (; g < n && r[n] < 10;) n--;
                                g < n ? i(++n) : (2 == r[n = a + e] && n--, i(n - u))
                            } else {
                                for (; n != a - 1 && r[n] != p; n--) ;
                                if (a < n) i(n); else {
                                    for (n = a + e; n < r.length && r[n] == m; n++) ;
                                    if (n == r.length) break;
                                    i(n)
                                }
                            }
                        }
                        return s
                    }, this.$getDisplayTokens = function (e, t) {
                        var i, n = [];
                        t = t || 0;
                        for (var r = 0; r < e.length; r++) {
                            var o = e.charCodeAt(r);
                            if (9 == o) {
                                i = this.getScreenTabSize(n.length + t), n.push(11);
                                for (var s = 1; s < i; s++) n.push(12)
                            } else 32 == o ? n.push(10) : 39 < o && o < 48 || 57 < o && o < 64 ? n.push(9) : 4352 <= o && a(o) ? n.push(1, 2) : n.push(1)
                        }
                        return n
                    }, this.$getStringScreenWidth = function (e, t, i) {
                        if (0 == t) return [0, 0];
                        var n, r;
                        for (null == t && (t = 1 / 0), i = i || 0, r = 0; r < e.length && (9 == (n = e.charCodeAt(r)) ? i += this.getScreenTabSize(i) : 4352 <= n && a(n) ? i += 2 : i += 1, !(t < i)); r++) ;
                        return [i, r]
                    }, this.lineWidgets = null, this.getRowLength = function (e) {
                        var t = 1;
                        return this.lineWidgets && (t += this.lineWidgets[e] && this.lineWidgets[e].rowCount || 0), this.$useWrapMode && this.$wrapData[e] ? this.$wrapData[e].length + t : t
                    }, this.getRowLineCount = function (e) {
                        return this.$useWrapMode && this.$wrapData[e] ? this.$wrapData[e].length + 1 : 1
                    }, this.getRowWrapIndent = function (e) {
                        if (this.$useWrapMode) {
                            var t = this.screenToDocumentPosition(e, Number.MAX_VALUE), e = this.$wrapData[t.row];
                            return e.length && e[0] < t.column ? e.indent : 0
                        }
                        return 0
                    }, this.getScreenLastRowColumn = function (e) {
                        e = this.screenToDocumentPosition(e, Number.MAX_VALUE);
                        return this.documentToScreenColumn(e.row, e.column)
                    }, this.getDocumentLastRowColumn = function (e, t) {
                        t = this.documentToScreenRow(e, t);
                        return this.getScreenLastRowColumn(t)
                    }, this.getDocumentLastRowColumnPosition = function (e, t) {
                        t = this.documentToScreenRow(e, t);
                        return this.screenToDocumentPosition(t, Number.MAX_VALUE / 10)
                    }, this.getRowSplitData = function (e) {
                        if (this.$useWrapMode) return this.$wrapData[e]
                    }, this.getScreenTabSize = function (e) {
                        return this.$tabSize - (e % this.$tabSize | 0)
                    }, this.screenToDocumentRow = function (e, t) {
                        return this.screenToDocumentPosition(e, t).row
                    }, this.screenToDocumentColumn = function (e, t) {
                        return this.screenToDocumentPosition(e, t).column
                    }, this.screenToDocumentPosition = function (e, t, i) {
                        if (e < 0) return {row: 0, column: 0};
                        var n, r, o, s = 0, a = 0, l = 0, c = 0, h = this.$screenRowCache,
                            d = this.$getRowCacheIndex(h, e), u = h.length;
                        o = u && 0 <= d ? (l = h[d], s = this.$docRowCache[d], e > h[u - 1]) : !u;
                        for (var g = this.getLength() - 1, p = this.getNextFoldLine(s), m = p ? p.start.row : 1 / 0; l <= e && !(e < l + (c = this.getRowLength(s)) || g <= s);) l += c, m < ++s && (s = p.end.row + 1, m = (p = this.getNextFoldLine(s, p)) ? p.start.row : 1 / 0), o && (this.$docRowCache.push(s), this.$screenRowCache.push(l));
                        if (p && p.start.row <= s) n = this.getFoldDisplayLine(p), s = p.start.row; else {
                            if (l + c <= e || g < s) return {row: g, column: this.getLine(g).length};
                            n = this.getLine(s), p = null
                        }
                        d = 0, h = Math.floor(e - l);
                        return !this.$useWrapMode || (u = this.$wrapData[s]) && (r = u[h], 0 < h && u.length && (d = u.indent, a = u[h - 1] || u[u.length - 1], n = n.substring(a))), void 0 !== i && this.$bidiHandler.isBidiRow(l + h, s, h) && (t = this.$bidiHandler.offsetToCol(i)), a += this.$getStringScreenWidth(n, t - d)[1], this.$useWrapMode && r <= a && (a = r - 1), p ? p.idxToPosition(a) : {
                            row: s,
                            column: a
                        }
                    }, this.documentToScreenPosition = function (e, t) {
                        var i = void 0 === t ? this.$clipPositionToDocument(e.row, e.column) : this.$clipPositionToDocument(e, t);
                        e = i.row, t = i.column;
                        var n = 0, r = null, o = null;
                        (o = this.getFoldAt(e, t, 1)) && (e = o.start.row, t = o.start.column);
                        var s, a, l = 0, c = this.$docRowCache, i = this.$getRowCacheIndex(c, e), o = c.length;
                        a = o && 0 <= i ? (l = c[i], n = this.$screenRowCache[i], e > c[o - 1]) : !o;
                        for (var h = this.getNextFoldLine(l), d = h ? h.start.row : 1 / 0; l < e;) {
                            if (d <= l) {
                                if (e < (s = h.end.row + 1)) break;
                                d = (h = this.getNextFoldLine(s, h)) ? h.start.row : 1 / 0
                            } else s = l + 1;
                            n += this.getRowLength(l), l = s, a && (this.$docRowCache.push(l), this.$screenRowCache.push(n))
                        }
                        var u = "",
                            r = h && d <= l ? (u = this.getFoldDisplayLine(h, e, t), h.start.row) : (u = this.getLine(e).substring(0, t), e),
                            t = 0;
                        if (this.$useWrapMode) {
                            var g = this.$wrapData[r];
                            if (g) {
                                for (var p = 0; u.length >= g[p];) n++, p++;
                                u = u.substring(g[p - 1] || 0, u.length), t = 0 < p ? g.indent : 0
                            }
                        }
                        return this.lineWidgets && this.lineWidgets[l] && this.lineWidgets[l].rowsAbove && (n += this.lineWidgets[l].rowsAbove), {
                            row: n,
                            column: t + this.$getStringScreenWidth(u)[0]
                        }
                    }, this.documentToScreenColumn = function (e, t) {
                        return this.documentToScreenPosition(e, t).column
                    }, this.documentToScreenRow = function (e, t) {
                        return this.documentToScreenPosition(e, t).row
                    }, this.getScreenLength = function () {
                        var e = 0, t = null;
                        if (this.$useWrapMode) for (var i = this.$wrapData.length, n = 0, r = 0, o = (t = this.$foldData[r++]) ? t.start.row : 1 / 0; n < i;) {
                            var s = this.$wrapData[n];
                            e += s ? s.length + 1 : 1, o < ++n && (n = t.end.row + 1, o = (t = this.$foldData[r++]) ? t.start.row : 1 / 0)
                        } else for (var e = this.getLength(), a = this.$foldData, r = 0; r < a.length; r++) e -= (t = a[r]).end.row - t.start.row;
                        return this.lineWidgets && (e += this.$getWidgetScreenLength()), e
                    }, this.$setFontMetrics = function (o) {
                        this.$enableVarChar && (this.$getStringScreenWidth = function (e, t, i) {
                            if (0 === t) return [0, 0];
                            var n, r;
                            for (t = t || 1 / 0, i = i || 0, r = 0; r < e.length && !(t < (i += "\t" === (n = e.charAt(r)) ? this.getScreenTabSize(i) : o.getCharacterWidth(n))); r++) ;
                            return [i, r]
                        })
                    }, this.destroy = function () {
                        this.bgTokenizer && (this.bgTokenizer.setDocument(null), this.bgTokenizer = null), this.$stopWorker(), this.removeAllListeners(), this.selection.detach()
                    }, this.isFullWidth = a
                }.call(n.prototype), e("./edit_session/folding").Folding.call(n.prototype), e("./edit_session/bracket_match").BracketMatch.call(n.prototype), l.defineOptions(n.prototype, "session", {
                    wrap: {
                        set: function (e) {
                            e && "off" != e ? "free" == e ? e = !0 : "printMargin" == e ? e = -1 : "string" == typeof e && (e = parseInt(e, 10) || !1) : e = !1, this.$wrap != e && ((this.$wrap = e) ? (this.setWrapLimitRange(e = "number" == typeof e ? e : null, e), this.setUseWrapMode(!0)) : this.setUseWrapMode(!1))
                        }, get: function () {
                            return this.getUseWrapMode() ? -1 == this.$wrap ? "printMargin" : this.getWrapLimitRange().min ? this.$wrap : "free" : "off"
                        }, handlesSet: !0
                    }, wrapMethod: {
                        set: function (e) {
                            (e = "auto" == e ? "text" != this.$mode.type : "text" != e) != this.$wrapAsCode && (this.$wrapAsCode = e, this.$useWrapMode && (this.$useWrapMode = !1, this.setUseWrapMode(!0)))
                        }, initialValue: "auto"
                    }, indentedSoftWrap: {
                        set: function () {
                            this.$useWrapMode && (this.$useWrapMode = !1, this.setUseWrapMode(!0))
                        }, initialValue: !0
                    }, firstLineNumber: {
                        set: function () {
                            this._signal("changeBreakpoint")
                        }, initialValue: 1
                    }, useWorker: {
                        set: function (e) {
                            this.$useWorker = e, this.$stopWorker(), e && this.$startWorker()
                        }, initialValue: !0
                    }, useSoftTabs: {initialValue: !0}, tabSize: {
                        set: function (e) {
                            0 < (e = parseInt(e)) && this.$tabSize !== e && (this.$modified = !0, this.$rowLengthCache = [], this.$tabSize = e, this._signal("changeTabSize"))
                        }, initialValue: 4, handlesSet: !0
                    }, navigateWithinSoftTabs: {initialValue: !1}, foldStyle: {
                        set: function (e) {
                            this.setFoldStyle(e)
                        }, handlesSet: !0
                    }, overwrite: {
                        set: function (e) {
                            this._signal("changeOverwrite")
                        }, initialValue: !1
                    }, newLineMode: {
                        set: function (e) {
                            this.doc.setNewLineMode(e)
                        }, get: function () {
                            return this.doc.getNewLineMode()
                        }, handlesSet: !0
                    }, mode: {
                        set: function (e) {
                            this.setMode(e)
                        }, get: function () {
                            return this.$modeId
                        }, handlesSet: !0
                    }
                }), t.EditSession = n
            }), ace.define("ace/search", ["require", "exports", "module", "ace/lib/lang", "ace/lib/oop", "ace/range"], function (e, t, i) {
                "use strict";
                var I = e("./lib/lang"), n = e("./lib/oop"), v = e("./range").Range, e = function () {
                    this.$options = {}
                };
                !function () {
                    this.set = function (e) {
                        return n.mixin(this.$options, e), this
                    }, this.getOptions = function () {
                        return I.copyObject(this.$options)
                    }, this.setOptions = function (e) {
                        this.$options = e
                    }, this.find = function (e) {
                        var r = this.$options, e = this.$matchIterator(e, r);
                        if (!e) return !1;
                        var o = null;
                        return e.forEach(function (e, t, i, n) {
                            return o = new v(e, t, i, n), !(t == n && r.start && r.start.start && 0 != r.skipCurrent && o.isEqual(r.start)) || (o = null, !1)
                        }), o
                    }, this.findAll = function (e) {
                        var t = this.$options;
                        if (!t.needle) return [];
                        this.$assembleRegExp(t);
                        var i = t.range, n = i ? e.getLines(i.start.row, i.end.row) : e.doc.getAllLines(), r = [],
                            o = t.re;
                        if (t.$isMultiLine) {
                            var s, a = o.length, l = n.length - a;
                            e:for (var c = o.offset || 0; c <= l; c++) {
                                for (var h = 0; h < a; h++) if (-1 == n[c + h].search(o[h])) continue e;
                                var d = n[c], u = n[c + a - 1], d = d.length - d.match(o[0])[0].length,
                                    u = u.match(o[a - 1])[0].length;
                                s && s.end.row === c && s.end.column > d || (r.push(s = new v(c, d, c + a - 1, u)), 2 < a && (c = c + a - 2))
                            }
                        } else for (var g = 0; g < n.length; g++) for (var p = I.getMatchOffsets(n[g], o), h = 0; h < p.length; h++) {
                            var m = p[h];
                            r.push(new v(g, m.offset, g, m.offset + m.length))
                        }
                        if (i) {
                            for (var f = i.start.column, C = i.start.column, g = 0, h = r.length - 1; g < h && r[g].start.column < f && r[g].start.row == i.start.row;) g++;
                            for (; g < h && r[h].end.column > C && r[h].end.row == i.end.row;) h--;
                            for (r = r.slice(g, h + 1), g = 0, h = r.length; g < h; g++) r[g].start.row += i.start.row, r[g].end.row += i.start.row
                        }
                        return r
                    }, this.replace = function (e, t) {
                        var i = this.$options, n = this.$assembleRegExp(i);
                        if (i.$isMultiLine) return t;
                        if (n) {
                            var r = n.exec(e);
                            if (!r || r[0].length != e.length) return null;
                            if (t = e.replace(n, t), i.preserveCase) {
                                t = t.split("");
                                for (var o = Math.min(e.length, e.length); o--;) {
                                    var s = e[o];
                                    s && s.toLowerCase() != s ? t[o] = t[o].toUpperCase() : t[o] = t[o].toLowerCase()
                                }
                                t = t.join("")
                            }
                            return t
                        }
                    }, this.$assembleRegExp = function (e, t) {
                        if (e.needle instanceof RegExp) return e.re = e.needle;
                        var i, n = e.needle;
                        if (!e.needle) return e.re = !1;

                        function r(e) {
                            return /\w/.test(e) || i.regExp ? "\\b" : ""
                        }

                        e.regExp || (n = I.escapeRegExp(n)), e.wholeWord && (i = e, n = r((o = n)[0]) + o + r(o[o.length - 1]));
                        var o = e.caseSensitive ? "gm" : "gmi";
                        if (e.$isMultiLine = !t && /[\n\r]/.test(n), e.$isMultiLine) return e.re = this.$assembleMultilineRegExp(n, o);
                        try {
                            var s = new RegExp(n, o)
                        } catch (e) {
                            s = !1
                        }
                        return e.re = s
                    }, this.$assembleMultilineRegExp = function (e, t) {
                        for (var i = e.replace(/\r\n|\r|\n/g, "$\n^").split("\n"), n = [], r = 0; r < i.length; r++) try {
                            n.push(new RegExp(i[r], t))
                        } catch (e) {
                            return !1
                        }
                        return n
                    }, this.$matchIterator = function (h, i) {
                        var d = this.$assembleRegExp(i);
                        if (!d) return !1;
                        var a = 1 == i.backwards, e = 0 != i.skipCurrent, t = i.range, n = i.start;
                        (n = n || (t ? t[a ? "end" : "start"] : h.selection.getRange())).start && (n = n[e != a ? "end" : "start"]);
                        var l, r, o = t ? t.start.row : 0, s = t ? t.end.row : h.getLength() - 1;
                        return t = a ? function (e) {
                            var t = n.row;
                            if (!r(t, n.column, e)) {
                                for (t--; o <= t; t--) if (r(t, Number.MAX_VALUE, e)) return;
                                if (0 != i.wrap) for (t = s, o = n.row; o <= t; t--) if (r(t, Number.MAX_VALUE, e)) return
                            }
                        } : function (e) {
                            var t = n.row;
                            if (!r(t, n.column, e)) {
                                for (t += 1; t <= s; t++) if (r(t, 0, e)) return;
                                if (0 != i.wrap) for (t = o, s = n.row; t <= s; t++) if (r(t, 0, e)) return
                            }
                        }, r = i.$isMultiLine ? (l = d.length, function (e, t, i) {
                            var n = a ? e - l + 1 : e;
                            if (!(n < 0)) {
                                var r = h.getLine(n), o = r.search(d[0]);
                                if (!(!a && o < t || -1 === o)) {
                                    for (var s = 1; s < l; s++) if (-1 == (r = h.getLine(n + s)).search(d[s])) return;
                                    e = r.match(d[l - 1])[0].length;
                                    if (!(a && t < e)) return !!i(n, o, n + l - 1, e) || void 0
                                }
                            }
                        }) : a ? function (e, t, i) {
                            var n, r = h.getLine(e), o = [];
                            for (d.lastIndex = 0; n = d.exec(r);) {
                                var s = n[0].length, a = n.index;
                                if (!s) {
                                    if (a >= r.length) break;
                                    d.lastIndex = a += 1
                                }
                                if (n.index + s > t) break;
                                o.push(n.index, s)
                            }
                            for (var l = o.length - 1; 0 <= l; l -= 2) {
                                var c = o[l - 1];
                                if (i(e, c, e, c + (s = o[l]))) return !0
                            }
                        } : function (e, t, i) {
                            var n = h.getLine(e);
                            for (d.lastIndex = t; r = d.exec(n);) {
                                var r, o = r[0].length;
                                if (i(e, r = r.index, e, r + o)) return !0;
                                if (!o && (d.lastIndex = r += 1, r >= n.length)) return !1
                            }
                        }, {forEach: t}
                    }
                }.call(e.prototype), t.Search = e
            }), ace.define("ace/keyboard/hash_handler", ["require", "exports", "module", "ace/lib/keys", "ace/lib/useragent"], function (e, t, i) {
                "use strict";
                var a = e("../lib/keys"), n = e("../lib/useragent"), l = a.KEY_MODS;

                function r(e, t) {
                    this.platform = t || (n.isMac ? "mac" : "win"), this.commands = {}, this.commandKeyBinding = {}, this.addCommands(e), this.$singleCommand = !0
                }

                function o(e, t) {
                    r.call(this, e, t), this.$singleCommand = !1
                }

                o.prototype = r.prototype, function () {
                    function s(e) {
                        return "object" == typeof e && e.bindKey && e.bindKey.position || (e.isDefault ? -100 : 0)
                    }

                    this.addCommand = function (e) {
                        this.commands[e.name] && this.removeCommand(e), (this.commands[e.name] = e).bindKey && this._buildKeyHash(e)
                    }, this.removeCommand = function (e, t) {
                        var i = e && ("string" == typeof e ? e : e.name);
                        e = this.commands[i], t || delete this.commands[i];
                        var n, r = this.commandKeyBinding;
                        for (n in r) {
                            var o, s = r[n];
                            s == e ? delete r[n] : !Array.isArray(s) || -1 != (o = s.indexOf(e)) && (s.splice(o, 1), 1 == s.length && (r[n] = s[0]))
                        }
                    }, this.bindKey = function (e, n, r) {
                        if ("object" == typeof e && e && (null == r && (r = e.position), e = e[this.platform]), e) return "function" == typeof n ? this.addCommand({
                            exec: n,
                            bindKey: e,
                            name: n.name || e
                        }) : void e.split("|").forEach(function (e) {
                            var t, i = "";
                            -1 != e.indexOf(" ") && (e = (t = e.split(/\s+/)).pop(), t.forEach(function (e) {
                                e = this.parseKeys(e), e = l[e.hashId] + e.key;
                                i += (i ? " " : "") + e, this._addCommandToBinding(i, "chainKeys")
                            }, this), i += " ");
                            e = this.parseKeys(e), e = l[e.hashId] + e.key;
                            this._addCommandToBinding(i + e, n, r)
                        }, this)
                    }, this._addCommandToBinding = function (e, t, i) {
                        var n = this.commandKeyBinding;
                        if (t) if (!n[e] || this.$singleCommand) n[e] = t; else {
                            Array.isArray(n[e]) ? -1 != (o = n[e].indexOf(t)) && n[e].splice(o, 1) : n[e] = [n[e]], "number" != typeof i && (i = s(t));
                            for (var r = n[e], o = 0; o < r.length; o++) if (i < s(r[o])) break;
                            r.splice(o, 0, t)
                        } else delete n[e]
                    }, this.addCommands = function (i) {
                        i && Object.keys(i).forEach(function (e) {
                            var t = i[e];
                            if (t) {
                                if ("string" == typeof t) return this.bindKey(t, e);
                                "object" == typeof (t = "function" == typeof t ? {exec: t} : t) && (t.name || (t.name = e), this.addCommand(t))
                            }
                        }, this)
                    }, this.removeCommands = function (t) {
                        Object.keys(t).forEach(function (e) {
                            this.removeCommand(t[e])
                        }, this)
                    }, this.bindKeys = function (t) {
                        Object.keys(t).forEach(function (e) {
                            this.bindKey(e, t[e])
                        }, this)
                    }, this._buildKeyHash = function (e) {
                        this.bindKey(e.bindKey, e)
                    }, this.parseKeys = function (e) {
                        var t = e.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function (e) {
                            return e
                        }), i = t.pop(), n = a[i];
                        if (a.FUNCTION_KEYS[n]) i = a.FUNCTION_KEYS[n].toLowerCase(); else {
                            if (!t.length) return {key: i, hashId: -1};
                            if (1 == t.length && "shift" == t[0]) return {key: i.toUpperCase(), hashId: -1}
                        }
                        for (var r = 0, o = t.length; o--;) {
                            var s = a.KEY_MODS[t[o]];
                            if (null == s) return "undefined" != typeof console && console.error("invalid modifier " + t[o] + " in " + e), !1;
                            r |= s
                        }
                        return {key: i, hashId: r}
                    }, this.findKeyCommand = function (e, t) {
                        t = l[e] + t;
                        return this.commandKeyBinding[t]
                    }, this.handleKeyboard = function (e, t, i, n) {
                        if (!(n < 0)) {
                            var r = l[t] + i, o = this.commandKeyBinding[r];
                            return (e.$keyChain && (e.$keyChain += " " + r, o = this.commandKeyBinding[e.$keyChain] || o), !o || "chainKeys" != o && "chainKeys" != o[o.length - 1]) ? (e.$keyChain && (t && 4 != t || 1 != i.length ? (-1 == t || 0 < n) && (e.$keyChain = "") : e.$keyChain = e.$keyChain.slice(0, -r.length - 1)), {command: o}) : (e.$keyChain = e.$keyChain || r, {command: "null"})
                        }
                    }, this.getStatusText = function (e, t) {
                        return t.$keyChain || ""
                    }
                }.call(r.prototype), t.HashHandler = r, t.MultiHashHandler = o
            }), ace.define("ace/commands/command_manager", ["require", "exports", "module", "ace/lib/oop", "ace/keyboard/hash_handler", "ace/lib/event_emitter"], function (e, t, i) {
                "use strict";
                var n = e("../lib/oop"), r = e("../keyboard/hash_handler").MultiHashHandler,
                    o = e("../lib/event_emitter").EventEmitter, e = function (e, t) {
                        r.call(this, t, e), this.byName = this.commands, this.setDefaultHandler("exec", function (e) {
                            return e.command.exec(e.editor, e.args || {})
                        })
                    };
                n.inherits(e, r), function () {
                    n.implement(this, o), this.exec = function (e, t, i) {
                        if (Array.isArray(e)) {
                            for (var n = e.length; n--;) if (this.exec(e[n], t, i)) return !0;
                            return !1
                        }
                        if (!(e = "string" == typeof e ? this.commands[e] : e)) return !1;
                        if (t && t.$readOnly && !e.readOnly) return !1;
                        if (0 != this.$checkCommandState && e.isAvailable && !e.isAvailable(t)) return !1;
                        var r = {editor: t, command: e, args: i};
                        return r.returnValue = this._emit("exec", r), this._signal("afterExec", r), !1 !== r.returnValue
                    }, this.toggleRecording = function (e) {
                        if (!this.$inReplay) return e && e._emit("changeStatus"), this.recording ? (this.macro.pop(), this.off("exec", this.$addCommandToMacro), this.macro.length || (this.macro = this.oldMacro), this.recording = !1) : (this.$addCommandToMacro || (this.$addCommandToMacro = function (e) {
                            this.macro.push([e.command, e.args])
                        }.bind(this)), this.oldMacro = this.macro, this.macro = [], this.on("exec", this.$addCommandToMacro), this.recording = !0)
                    }, this.replay = function (t) {
                        if (!this.$inReplay && this.macro) {
                            if (this.recording) return this.toggleRecording(t);
                            try {
                                this.$inReplay = !0, this.macro.forEach(function (e) {
                                    "string" == typeof e ? this.exec(e, t) : this.exec(e[0], t, e[1])
                                }, this)
                            } finally {
                                this.$inReplay = !1
                            }
                        }
                    }, this.trimMacro = function (e) {
                        return e.map(function (e) {
                            return "string" != typeof e[0] && (e[0] = e[0].name), e = !e[1] ? e[0] : e
                        })
                    }
                }.call(e.prototype), t.CommandManager = e
            }), ace.define("ace/commands/default_commands", ["require", "exports", "module", "ace/lib/lang", "ace/config", "ace/range"], function (e, t, i) {
                "use strict";
                var l = e("../lib/lang"), n = e("../config"), c = e("../range").Range;

                function r(e, t) {
                    return {win: e, mac: t}
                }

                t.commands = [{
                    name: "showSettingsMenu", bindKey: r("Ctrl-,", "Command-,"), exec: function (t) {
                        n.loadModule("ace/ext/settings_menu", function (e) {
                            e.init(t), t.showSettingsMenu()
                        })
                    }, readOnly: !0
                }, {
                    name: "goToNextError", bindKey: r("Alt-E", "F4"), exec: function (t) {
                        n.loadModule("./ext/error_marker", function (e) {
                            e.showErrorMarker(t, 1)
                        })
                    }, scrollIntoView: "animate", readOnly: !0
                }, {
                    name: "goToPreviousError", bindKey: r("Alt-Shift-E", "Shift-F4"), exec: function (t) {
                        n.loadModule("./ext/error_marker", function (e) {
                            e.showErrorMarker(t, -1)
                        })
                    }, scrollIntoView: "animate", readOnly: !0
                }, {
                    name: "selectall",
                    description: "Select all",
                    bindKey: r("Ctrl-A", "Command-A"),
                    exec: function (e) {
                        e.selectAll()
                    },
                    readOnly: !0
                }, {
                    name: "centerselection",
                    description: "Center selection",
                    bindKey: r(null, "Ctrl-L"),
                    exec: function (e) {
                        e.centerSelection()
                    },
                    readOnly: !0
                }, {
                    name: "gotoline",
                    description: "Go to line...",
                    bindKey: r("Ctrl-L", "Command-L"),
                    exec: function (e, t) {
                        "number" != typeof t || isNaN(t) || e.gotoLine(t), e.prompt({$type: "gotoLine"})
                    },
                    readOnly: !0
                }, {
                    name: "fold", bindKey: r("Alt-L|Ctrl-F1", "Command-Alt-L|Command-F1"), exec: function (e) {
                        e.session.toggleFold(!1)
                    }, multiSelectAction: "forEach", scrollIntoView: "center", readOnly: !0
                }, {
                    name: "unfold",
                    bindKey: r("Alt-Shift-L|Ctrl-Shift-F1", "Command-Alt-Shift-L|Command-Shift-F1"),
                    exec: function (e) {
                        e.session.toggleFold(!0)
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "center",
                    readOnly: !0
                }, {
                    name: "toggleFoldWidget", bindKey: r("F2", "F2"), exec: function (e) {
                        e.session.toggleFoldWidget()
                    }, multiSelectAction: "forEach", scrollIntoView: "center", readOnly: !0
                }, {
                    name: "toggleParentFoldWidget", bindKey: r("Alt-F2", "Alt-F2"), exec: function (e) {
                        e.session.toggleFoldWidget(!0)
                    }, multiSelectAction: "forEach", scrollIntoView: "center", readOnly: !0
                }, {
                    name: "foldall",
                    description: "Fold all",
                    bindKey: r(null, "Ctrl-Command-Option-0"),
                    exec: function (e) {
                        e.session.foldAll()
                    },
                    scrollIntoView: "center",
                    readOnly: !0
                }, {
                    name: "foldAllComments",
                    description: "Fold all comments",
                    bindKey: r(null, "Ctrl-Command-Option-0"),
                    exec: function (e) {
                        e.session.foldAllComments()
                    },
                    scrollIntoView: "center",
                    readOnly: !0
                }, {
                    name: "foldOther",
                    description: "Fold other",
                    bindKey: r("Alt-0", "Command-Option-0"),
                    exec: function (e) {
                        e.session.foldAll(), e.session.unfold(e.selection.getAllRanges())
                    },
                    scrollIntoView: "center",
                    readOnly: !0
                }, {
                    name: "unfoldall",
                    description: "Unfold all",
                    bindKey: r("Alt-Shift-0", "Command-Option-Shift-0"),
                    exec: function (e) {
                        e.session.unfold()
                    },
                    scrollIntoView: "center",
                    readOnly: !0
                }, {
                    name: "findnext", description: "Find next", bindKey: r("Ctrl-K", "Command-G"), exec: function (e) {
                        e.findNext()
                    }, multiSelectAction: "forEach", scrollIntoView: "center", readOnly: !0
                }, {
                    name: "findprevious",
                    description: "Find previous",
                    bindKey: r("Ctrl-Shift-K", "Command-Shift-G"),
                    exec: function (e) {
                        e.findPrevious()
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "center",
                    readOnly: !0
                }, {
                    name: "selectOrFindNext",
                    description: "Select or find next",
                    bindKey: r("Alt-K", "Ctrl-G"),
                    exec: function (e) {
                        e.selection.isEmpty() ? e.selection.selectWord() : e.findNext()
                    },
                    readOnly: !0
                }, {
                    name: "selectOrFindPrevious",
                    description: "Select or find previous",
                    bindKey: r("Alt-Shift-K", "Ctrl-Shift-G"),
                    exec: function (e) {
                        e.selection.isEmpty() ? e.selection.selectWord() : e.findPrevious()
                    },
                    readOnly: !0
                }, {
                    name: "find", description: "Find", bindKey: r("Ctrl-F", "Command-F"), exec: function (t) {
                        n.loadModule("ace/ext/searchbox", function (e) {
                            e.Search(t)
                        })
                    }, readOnly: !0
                }, {
                    name: "overwrite", description: "Overwrite", bindKey: "Insert", exec: function (e) {
                        e.toggleOverwrite()
                    }, readOnly: !0
                }, {
                    name: "selecttostart",
                    description: "Select to start",
                    bindKey: r("Ctrl-Shift-Home", "Command-Shift-Home|Command-Shift-Up"),
                    exec: function (e) {
                        e.getSelection().selectFileStart()
                    },
                    multiSelectAction: "forEach",
                    readOnly: !0,
                    scrollIntoView: "animate",
                    aceCommandGroup: "fileJump"
                }, {
                    name: "gotostart",
                    description: "Go to start",
                    bindKey: r("Ctrl-Home", "Command-Home|Command-Up"),
                    exec: function (e) {
                        e.navigateFileStart()
                    },
                    multiSelectAction: "forEach",
                    readOnly: !0,
                    scrollIntoView: "animate",
                    aceCommandGroup: "fileJump"
                }, {
                    name: "selectup",
                    description: "Select up",
                    bindKey: r("Shift-Up", "Shift-Up|Ctrl-Shift-P"),
                    exec: function (e) {
                        e.getSelection().selectUp()
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor",
                    readOnly: !0
                }, {
                    name: "golineup", description: "Go line up", bindKey: r("Up", "Up|Ctrl-P"), exec: function (e, t) {
                        e.navigateUp(t.times)
                    }, multiSelectAction: "forEach", scrollIntoView: "cursor", readOnly: !0
                }, {
                    name: "selecttoend",
                    description: "Select to end",
                    bindKey: r("Ctrl-Shift-End", "Command-Shift-End|Command-Shift-Down"),
                    exec: function (e) {
                        e.getSelection().selectFileEnd()
                    },
                    multiSelectAction: "forEach",
                    readOnly: !0,
                    scrollIntoView: "animate",
                    aceCommandGroup: "fileJump"
                }, {
                    name: "gotoend",
                    description: "Go to end",
                    bindKey: r("Ctrl-End", "Command-End|Command-Down"),
                    exec: function (e) {
                        e.navigateFileEnd()
                    },
                    multiSelectAction: "forEach",
                    readOnly: !0,
                    scrollIntoView: "animate",
                    aceCommandGroup: "fileJump"
                }, {
                    name: "selectdown",
                    description: "Select down",
                    bindKey: r("Shift-Down", "Shift-Down|Ctrl-Shift-N"),
                    exec: function (e) {
                        e.getSelection().selectDown()
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor",
                    readOnly: !0
                }, {
                    name: "golinedown",
                    description: "Go line down",
                    bindKey: r("Down", "Down|Ctrl-N"),
                    exec: function (e, t) {
                        e.navigateDown(t.times)
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor",
                    readOnly: !0
                }, {
                    name: "selectwordleft",
                    description: "Select word left",
                    bindKey: r("Ctrl-Shift-Left", "Option-Shift-Left"),
                    exec: function (e) {
                        e.getSelection().selectWordLeft()
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor",
                    readOnly: !0
                }, {
                    name: "gotowordleft",
                    description: "Go to word left",
                    bindKey: r("Ctrl-Left", "Option-Left"),
                    exec: function (e) {
                        e.navigateWordLeft()
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor",
                    readOnly: !0
                }, {
                    name: "selecttolinestart",
                    description: "Select to line start",
                    bindKey: r("Alt-Shift-Left", "Command-Shift-Left|Ctrl-Shift-A"),
                    exec: function (e) {
                        e.getSelection().selectLineStart()
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor",
                    readOnly: !0
                }, {
                    name: "gotolinestart",
                    description: "Go to line start",
                    bindKey: r("Alt-Left|Home", "Command-Left|Home|Ctrl-A"),
                    exec: function (e) {
                        e.navigateLineStart()
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor",
                    readOnly: !0
                }, {
                    name: "selectleft",
                    description: "Select left",
                    bindKey: r("Shift-Left", "Shift-Left|Ctrl-Shift-B"),
                    exec: function (e) {
                        e.getSelection().selectLeft()
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor",
                    readOnly: !0
                }, {
                    name: "gotoleft",
                    description: "Go to left",
                    bindKey: r("Left", "Left|Ctrl-B"),
                    exec: function (e, t) {
                        e.navigateLeft(t.times)
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor",
                    readOnly: !0
                }, {
                    name: "selectwordright",
                    description: "Select word right",
                    bindKey: r("Ctrl-Shift-Right", "Option-Shift-Right"),
                    exec: function (e) {
                        e.getSelection().selectWordRight()
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor",
                    readOnly: !0
                }, {
                    name: "gotowordright",
                    description: "Go to word right",
                    bindKey: r("Ctrl-Right", "Option-Right"),
                    exec: function (e) {
                        e.navigateWordRight()
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor",
                    readOnly: !0
                }, {
                    name: "selecttolineend",
                    description: "Select to line end",
                    bindKey: r("Alt-Shift-Right", "Command-Shift-Right|Shift-End|Ctrl-Shift-E"),
                    exec: function (e) {
                        e.getSelection().selectLineEnd()
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor",
                    readOnly: !0
                }, {
                    name: "gotolineend",
                    description: "Go to line end",
                    bindKey: r("Alt-Right|End", "Command-Right|End|Ctrl-E"),
                    exec: function (e) {
                        e.navigateLineEnd()
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor",
                    readOnly: !0
                }, {
                    name: "selectright",
                    description: "Select right",
                    bindKey: r("Shift-Right", "Shift-Right"),
                    exec: function (e) {
                        e.getSelection().selectRight()
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor",
                    readOnly: !0
                }, {
                    name: "gotoright",
                    description: "Go to right",
                    bindKey: r("Right", "Right|Ctrl-F"),
                    exec: function (e, t) {
                        e.navigateRight(t.times)
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor",
                    readOnly: !0
                }, {
                    name: "selectpagedown",
                    description: "Select page down",
                    bindKey: "Shift-PageDown",
                    exec: function (e) {
                        e.selectPageDown()
                    },
                    readOnly: !0
                }, {
                    name: "pagedown",
                    description: "Page down",
                    bindKey: r(null, "Option-PageDown"),
                    exec: function (e) {
                        e.scrollPageDown()
                    },
                    readOnly: !0
                }, {
                    name: "gotopagedown",
                    description: "Go to page down",
                    bindKey: r("PageDown", "PageDown|Ctrl-V"),
                    exec: function (e) {
                        e.gotoPageDown()
                    },
                    readOnly: !0
                }, {
                    name: "selectpageup", description: "Select page up", bindKey: "Shift-PageUp", exec: function (e) {
                        e.selectPageUp()
                    }, readOnly: !0
                }, {
                    name: "pageup", description: "Page up", bindKey: r(null, "Option-PageUp"), exec: function (e) {
                        e.scrollPageUp()
                    }, readOnly: !0
                }, {
                    name: "gotopageup", description: "Go to page up", bindKey: "PageUp", exec: function (e) {
                        e.gotoPageUp()
                    }, readOnly: !0
                }, {
                    name: "scrollup", description: "Scroll up", bindKey: r("Ctrl-Up", null), exec: function (e) {
                        e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight)
                    }, readOnly: !0
                }, {
                    name: "scrolldown", description: "Scroll down", bindKey: r("Ctrl-Down", null), exec: function (e) {
                        e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight)
                    }, readOnly: !0
                }, {
                    name: "selectlinestart",
                    description: "Select line start",
                    bindKey: "Shift-Home",
                    exec: function (e) {
                        e.getSelection().selectLineStart()
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor",
                    readOnly: !0
                }, {
                    name: "selectlineend", description: "Select line end", bindKey: "Shift-End", exec: function (e) {
                        e.getSelection().selectLineEnd()
                    }, multiSelectAction: "forEach", scrollIntoView: "cursor", readOnly: !0
                }, {
                    name: "togglerecording",
                    description: "Toggle recording",
                    bindKey: r("Ctrl-Alt-E", "Command-Option-E"),
                    exec: function (e) {
                        e.commands.toggleRecording(e)
                    },
                    readOnly: !0
                }, {
                    name: "replaymacro",
                    description: "Replay macro",
                    bindKey: r("Ctrl-Shift-E", "Command-Shift-E"),
                    exec: function (e) {
                        e.commands.replay(e)
                    },
                    readOnly: !0
                }, {
                    name: "jumptomatching",
                    description: "Jump to matching",
                    bindKey: r("Ctrl-\\|Ctrl-P", "Command-\\"),
                    exec: function (e) {
                        e.jumpToMatching()
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "animate",
                    readOnly: !0
                }, {
                    name: "selecttomatching",
                    description: "Select to matching",
                    bindKey: r("Ctrl-Shift-\\|Ctrl-Shift-P", "Command-Shift-\\"),
                    exec: function (e) {
                        e.jumpToMatching(!0)
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "animate",
                    readOnly: !0
                }, {
                    name: "expandToMatching",
                    description: "Expand to matching",
                    bindKey: r("Ctrl-Shift-M", "Ctrl-Shift-M"),
                    exec: function (e) {
                        e.jumpToMatching(!0, !0)
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "animate",
                    readOnly: !0
                }, {
                    name: "passKeysToBrowser",
                    description: "Pass keys to browser",
                    bindKey: r(null, null),
                    exec: function () {
                    },
                    passEvent: !0,
                    readOnly: !0
                }, {
                    name: "copy", description: "Copy", exec: function (e) {
                    }, readOnly: !0
                }, {
                    name: "cut", description: "Cut", exec: function (e) {
                        var t = e.$copyWithEmptySelection && e.selection.isEmpty() ? e.selection.getLineRange() : e.selection.getRange();
                        e._emit("cut", t), t.isEmpty() || e.session.remove(t), e.clearSelection()
                    }, scrollIntoView: "cursor", multiSelectAction: "forEach"
                }, {
                    name: "paste", description: "Paste", exec: function (e, t) {
                        e.$handlePaste(t)
                    }, scrollIntoView: "cursor"
                }, {
                    name: "removeline",
                    description: "Remove line",
                    bindKey: r("Ctrl-D", "Command-D"),
                    exec: function (e) {
                        e.removeLines()
                    },
                    scrollIntoView: "cursor",
                    multiSelectAction: "forEachLine"
                }, {
                    name: "duplicateSelection",
                    description: "Duplicate selection",
                    bindKey: r("Ctrl-Shift-D", "Command-Shift-D"),
                    exec: function (e) {
                        e.duplicateSelection()
                    },
                    scrollIntoView: "cursor",
                    multiSelectAction: "forEach"
                }, {
                    name: "sortlines",
                    description: "Sort lines",
                    bindKey: r("Ctrl-Alt-S", "Command-Alt-S"),
                    exec: function (e) {
                        e.sortLines()
                    },
                    scrollIntoView: "selection",
                    multiSelectAction: "forEachLine"
                }, {
                    name: "togglecomment",
                    description: "Toggle comment",
                    bindKey: r("Ctrl-/", "Command-/"),
                    exec: function (e) {
                        e.toggleCommentLines()
                    },
                    multiSelectAction: "forEachLine",
                    scrollIntoView: "selectionPart"
                }, {
                    name: "toggleBlockComment",
                    description: "Toggle block comment",
                    bindKey: r("Ctrl-Shift-/", "Command-Shift-/"),
                    exec: function (e) {
                        e.toggleBlockComment()
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "selectionPart"
                }, {
                    name: "modifyNumberUp",
                    description: "Modify number up",
                    bindKey: r("Ctrl-Shift-Up", "Alt-Shift-Up"),
                    exec: function (e) {
                        e.modifyNumber(1)
                    },
                    scrollIntoView: "cursor",
                    multiSelectAction: "forEach"
                }, {
                    name: "modifyNumberDown",
                    description: "Modify number down",
                    bindKey: r("Ctrl-Shift-Down", "Alt-Shift-Down"),
                    exec: function (e) {
                        e.modifyNumber(-1)
                    },
                    scrollIntoView: "cursor",
                    multiSelectAction: "forEach"
                }, {
                    name: "replace",
                    description: "Replace",
                    bindKey: r("Ctrl-H", "Command-Option-F"),
                    exec: function (t) {
                        n.loadModule("ace/ext/searchbox", function (e) {
                            e.Search(t, !0)
                        })
                    }
                }, {
                    name: "undo", description: "Undo", bindKey: r("Ctrl-Z", "Command-Z"), exec: function (e) {
                        e.undo()
                    }
                }, {
                    name: "redo",
                    description: "Redo",
                    bindKey: r("Ctrl-Shift-Z|Ctrl-Y", "Command-Shift-Z|Command-Y"),
                    exec: function (e) {
                        e.redo()
                    }
                }, {
                    name: "copylinesup",
                    description: "Copy lines up",
                    bindKey: r("Alt-Shift-Up", "Command-Option-Up"),
                    exec: function (e) {
                        e.copyLinesUp()
                    },
                    scrollIntoView: "cursor"
                }, {
                    name: "movelinesup",
                    description: "Move lines up",
                    bindKey: r("Alt-Up", "Option-Up"),
                    exec: function (e) {
                        e.moveLinesUp()
                    },
                    scrollIntoView: "cursor"
                }, {
                    name: "copylinesdown",
                    description: "Copy lines down",
                    bindKey: r("Alt-Shift-Down", "Command-Option-Down"),
                    exec: function (e) {
                        e.copyLinesDown()
                    },
                    scrollIntoView: "cursor"
                }, {
                    name: "movelinesdown",
                    description: "Move lines down",
                    bindKey: r("Alt-Down", "Option-Down"),
                    exec: function (e) {
                        e.moveLinesDown()
                    },
                    scrollIntoView: "cursor"
                }, {
                    name: "del",
                    description: "Delete",
                    bindKey: r("Delete", "Delete|Ctrl-D|Shift-Delete"),
                    exec: function (e) {
                        e.remove("right")
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor"
                }, {
                    name: "backspace",
                    description: "Backspace",
                    bindKey: r("Shift-Backspace|Backspace", "Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"),
                    exec: function (e) {
                        e.remove("left")
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor"
                }, {
                    name: "cut_or_delete",
                    description: "Cut or delete",
                    bindKey: r("Shift-Delete", null),
                    exec: function (e) {
                        if (!e.selection.isEmpty()) return !1;
                        e.remove("left")
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor"
                }, {
                    name: "removetolinestart",
                    description: "Remove to line start",
                    bindKey: r("Alt-Backspace", "Command-Backspace"),
                    exec: function (e) {
                        e.removeToLineStart()
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor"
                }, {
                    name: "removetolineend",
                    description: "Remove to line end",
                    bindKey: r("Alt-Delete", "Ctrl-K|Command-Delete"),
                    exec: function (e) {
                        e.removeToLineEnd()
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor"
                }, {
                    name: "removetolinestarthard",
                    description: "Remove to line start hard",
                    bindKey: r("Ctrl-Shift-Backspace", null),
                    exec: function (e) {
                        var t = e.selection.getRange();
                        t.start.column = 0, e.session.remove(t)
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor"
                }, {
                    name: "removetolineendhard",
                    description: "Remove to line end hard",
                    bindKey: r("Ctrl-Shift-Delete", null),
                    exec: function (e) {
                        var t = e.selection.getRange();
                        t.end.column = Number.MAX_VALUE, e.session.remove(t)
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor"
                }, {
                    name: "removewordleft",
                    description: "Remove word left",
                    bindKey: r("Ctrl-Backspace", "Alt-Backspace|Ctrl-Alt-Backspace"),
                    exec: function (e) {
                        e.removeWordLeft()
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor"
                }, {
                    name: "removewordright",
                    description: "Remove word right",
                    bindKey: r("Ctrl-Delete", "Alt-Delete"),
                    exec: function (e) {
                        e.removeWordRight()
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor"
                }, {
                    name: "outdent", description: "Outdent", bindKey: r("Shift-Tab", "Shift-Tab"), exec: function (e) {
                        e.blockOutdent()
                    }, multiSelectAction: "forEach", scrollIntoView: "selectionPart"
                }, {
                    name: "indent", description: "Indent", bindKey: r("Tab", "Tab"), exec: function (e) {
                        e.indent()
                    }, multiSelectAction: "forEach", scrollIntoView: "selectionPart"
                }, {
                    name: "blockoutdent",
                    description: "Block outdent",
                    bindKey: r("Ctrl-[", "Ctrl-["),
                    exec: function (e) {
                        e.blockOutdent()
                    },
                    multiSelectAction: "forEachLine",
                    scrollIntoView: "selectionPart"
                }, {
                    name: "blockindent",
                    description: "Block indent",
                    bindKey: r("Ctrl-]", "Ctrl-]"),
                    exec: function (e) {
                        e.blockIndent()
                    },
                    multiSelectAction: "forEachLine",
                    scrollIntoView: "selectionPart"
                }, {
                    name: "insertstring", description: "Insert string", exec: function (e, t) {
                        e.insert(t)
                    }, multiSelectAction: "forEach", scrollIntoView: "cursor"
                }, {
                    name: "inserttext", description: "Insert text", exec: function (e, t) {
                        e.insert(l.stringRepeat(t.text || "", t.times || 1))
                    }, multiSelectAction: "forEach", scrollIntoView: "cursor"
                }, {
                    name: "splitline", description: "Split line", bindKey: r(null, "Ctrl-O"), exec: function (e) {
                        e.splitLine()
                    }, multiSelectAction: "forEach", scrollIntoView: "cursor"
                }, {
                    name: "transposeletters",
                    description: "Transpose letters",
                    bindKey: r("Alt-Shift-X", "Ctrl-T"),
                    exec: function (e) {
                        e.transposeLetters()
                    },
                    multiSelectAction: function (e) {
                        e.transposeSelections(1)
                    },
                    scrollIntoView: "cursor"
                }, {
                    name: "touppercase",
                    description: "To uppercase",
                    bindKey: r("Ctrl-U", "Ctrl-U"),
                    exec: function (e) {
                        e.toUpperCase()
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor"
                }, {
                    name: "tolowercase",
                    description: "To lowercase",
                    bindKey: r("Ctrl-Shift-U", "Ctrl-Shift-U"),
                    exec: function (e) {
                        e.toLowerCase()
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor"
                }, {
                    name: "autoindent", description: "Auto Indent", bindKey: r(null, null), exec: function (e) {
                        e.autoIndent()
                    }, multiSelectAction: "forEachLine", scrollIntoView: "animate"
                }, {
                    name: "expandtoline",
                    description: "Expand to line",
                    bindKey: r("Ctrl-Shift-L", "Command-Shift-L"),
                    exec: function (e) {
                        var t = e.selection.getRange();
                        t.start.column = t.end.column = 0, t.end.row++, e.selection.setRange(t, !1)
                    },
                    multiSelectAction: "forEach",
                    scrollIntoView: "cursor",
                    readOnly: !0
                }, {
                    name: "joinlines", description: "Join lines", bindKey: r(null, null), exec: function (e) {
                        for (var t = e.selection.isBackwards(), i = t ? e.selection.getSelectionLead() : e.selection.getSelectionAnchor(), n = t ? e.selection.getSelectionAnchor() : e.selection.getSelectionLead(), r = e.session.doc.getLine(i.row).length, t = e.session.doc.getTextRange(e.selection.getRange()).replace(/\n\s*/, " ").length, o = e.session.doc.getLine(i.row), s = i.row + 1; s <= n.row + 1; s++) {
                            var a = l.stringTrimLeft(l.stringTrimRight(
                                e.session.doc.getLine(s)));
                            o += a = 0 !== a.length ? " " + a : a
                        }
                        n.row + 1 < e.session.doc.getLength() - 1 && (o += e.session.doc.getNewLineCharacter()), e.clearSelection(), e.session.doc.replace(new c(i.row, 0, n.row + 2, 0), o), 0 < t ? (e.selection.moveCursorTo(i.row, i.column), e.selection.selectTo(i.row, i.column + t)) : (r = e.session.doc.getLine(i.row).length > r ? r + 1 : r, e.selection.moveCursorTo(i.row, r))
                    }, multiSelectAction: "forEach", readOnly: !0
                }, {
                    name: "invertSelection",
                    description: "Invert selection",
                    bindKey: r(null, null),
                    exec: function (e) {
                        var t = e.session.doc.getLength() - 1, i = e.session.doc.getLine(t).length,
                            n = e.selection.rangeList.ranges, r = [];
                        n.length < 1 && (n = [e.selection.getRange()]);
                        for (var o = 0; o < n.length; o++) o == n.length - 1 && (n[o].end.row === t && n[o].end.column === i || r.push(new c(n[o].end.row, n[o].end.column, t, i))), 0 === o ? 0 === n[o].start.row && 0 === n[o].start.column || r.push(new c(0, 0, n[o].start.row, n[o].start.column)) : r.push(new c(n[o - 1].end.row, n[o - 1].end.column, n[o].start.row, n[o].start.column));
                        e.exitMultiSelectMode(), e.clearSelection();
                        for (o = 0; o < r.length; o++) e.selection.addRange(r[o], !1)
                    },
                    readOnly: !0,
                    scrollIntoView: "none"
                }, {
                    name: "addLineAfter", exec: function (e) {
                        e.selection.clearSelection(), e.navigateLineEnd(), e.insert("\n")
                    }, multiSelectAction: "forEach", scrollIntoView: "cursor"
                }, {
                    name: "addLineBefore", exec: function (e) {
                        e.selection.clearSelection();
                        var t = e.getCursorPosition();
                        e.selection.moveTo(t.row - 1, Number.MAX_VALUE), e.insert("\n"), 0 === t.row && e.navigateUp()
                    }, multiSelectAction: "forEach", scrollIntoView: "cursor"
                }, {
                    name: "openCommandPallete",
                    description: "Open command pallete",
                    bindKey: r("F1", "F1"),
                    exec: function (e) {
                        e.prompt({$type: "commands"})
                    },
                    readOnly: !0
                }, {
                    name: "modeSelect",
                    description: "Change language mode...",
                    bindKey: r(null, null),
                    exec: function (e) {
                        e.prompt({$type: "modes"})
                    },
                    readOnly: !0
                }];
                for (var o = 1; o < 9; o++) t.commands.push({
                    name: "foldToLevel" + o,
                    description: "Fold To Level " + o,
                    level: o,
                    exec: function (e) {
                        e.session.foldToLevel(this.level)
                    },
                    scrollIntoView: "center",
                    readOnly: !0
                })
            }), ace.define("ace/editor", ["require", "exports", "module", "ace/lib/fixoldbrowsers", "ace/lib/oop", "ace/lib/dom", "ace/lib/lang", "ace/lib/useragent", "ace/keyboard/textinput", "ace/mouse/mouse_handler", "ace/mouse/fold_handler", "ace/keyboard/keybinding", "ace/edit_session", "ace/search", "ace/range", "ace/lib/event_emitter", "ace/commands/command_manager", "ace/commands/default_commands", "ace/config", "ace/token_iterator", "ace/clipboard"], function (e, t, i) {
                "use strict";
                e("./lib/fixoldbrowsers");

                function r(e, t, i) {
                    this.$toDestroy = [];
                    var n = e.getContainerElement();
                    this.container = n, this.renderer = e, this.id = "editor" + ++r.$uid, this.commands = new p(s.isMac ? "mac" : "win", C), "object" == typeof document && (this.textInput = new a(e.getTextAreaContainer(), this), this.renderer.textarea = this.textInput.getElement(), this.$mouseHandler = new l(this), new c(this)), this.keyBinding = new h(this), this.$search = (new u).set({wrap: !0}), this.$historyTracker = this.$historyTracker.bind(this), this.commands.on("exec", this.$historyTracker), this.$initOperationListeners(), this._$emitInputEvent = m.delayedCall(function () {
                        this._signal("input", {}), this.session && this.session.bgTokenizer && this.session.bgTokenizer.scheduleStart()
                    }.bind(this)), this.on("change", function (e, t) {
                        t._$emitInputEvent.schedule(31)
                    }), this.setSession(t || i && i.session || new d("")), I.resetOptions(this), i && this.setOptions(i), I._signal("editor", this)
                }

                var o = e("./lib/oop"), n = e("./lib/dom"), m = e("./lib/lang"), s = e("./lib/useragent"),
                    a = e("./keyboard/textinput").TextInput, l = e("./mouse/mouse_handler").MouseHandler,
                    c = e("./mouse/fold_handler").FoldHandler, h = e("./keyboard/keybinding").KeyBinding,
                    d = e("./edit_session").EditSession, u = e("./search").Search, f = e("./range").Range,
                    g = e("./lib/event_emitter").EventEmitter, p = e("./commands/command_manager").CommandManager,
                    C = e("./commands/default_commands").commands, I = e("./config"),
                    v = e("./token_iterator").TokenIterator, A = e("./clipboard");
                r.$uid = 0, function () {
                    o.implement(this, g), this.$initOperationListeners = function () {
                        this.commands.on("exec", this.startOperation.bind(this), !0), this.commands.on("afterExec", this.endOperation.bind(this), !0), this.$opResetTimer = m.delayedCall(this.endOperation.bind(this, !0)), this.on("change", function () {
                            this.curOp || (this.startOperation(), this.curOp.selectionBefore = this.$lastSel), this.curOp.docChanged = !0
                        }.bind(this), !0), this.on("changeSelection", function () {
                            this.curOp || (this.startOperation(), this.curOp.selectionBefore = this.$lastSel), this.curOp.selectionChanged = !0
                        }.bind(this), !0)
                    }, this.curOp = null, this.prevOp = {}, this.startOperation = function (e) {
                        if (this.curOp) {
                            if (!e || this.curOp.command) return;
                            this.prevOp = this.curOp
                        }
                        e || (this.previousCommand = null, e = {}), this.$opResetTimer.schedule(), this.curOp = this.session.curOp = {
                            command: e.command || {},
                            args: e.args,
                            scrollTop: this.renderer.scrollTop
                        }, this.curOp.selectionBefore = this.selection.toJSON()
                    }, this.endOperation = function (e) {
                        if (this.curOp && this.session) {
                            if (e && !1 === e.returnValue || !this.session) return this.curOp = null;
                            if ((1 != e || !this.curOp.command || "mouse" != this.curOp.command.name) && (this._signal("beforeEndOperation"), this.curOp)) {
                                var e = this.curOp.command, t = e && e.scrollIntoView;
                                if (t) {
                                    switch (t) {
                                        case"center-animate":
                                            t = "animate";
                                        case"center":
                                            this.renderer.scrollCursorIntoView(null, .5);
                                            break;
                                        case"animate":
                                        case"cursor":
                                            this.renderer.scrollCursorIntoView();
                                            break;
                                        case"selectionPart":
                                            var i = this.selection.getRange(), n = this.renderer.layerConfig;
                                            (i.start.row >= n.lastRow || i.end.row <= n.firstRow) && this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead)
                                    }
                                    "animate" == t && this.renderer.animateScrolling(this.curOp.scrollTop)
                                }
                                e = this.selection.toJSON();
                                this.curOp.selectionAfter = e, this.$lastSel = this.selection.toJSON(), this.session.getUndoManager().addSelection(e), this.prevOp = this.curOp, this.curOp = null
                            }
                        }
                    }, this.$mergeableCommands = ["backspace", "del", "insertstring"], this.$historyTracker = function (e) {
                        var t, i, n, r;
                        this.$mergeUndoDeltas && (t = this.prevOp, i = this.$mergeableCommands, n = t.command && e.command.name == t.command.name, "insertstring" == e.command.name ? (r = e.args, void 0 === this.mergeNextCommand && (this.mergeNextCommand = !0), n = n && this.mergeNextCommand && (!/\s/.test(r) || /\s/.test(t.args)), this.mergeNextCommand = !0) : n = n && -1 !== i.indexOf(e.command.name), (n = "always" != this.$mergeUndoDeltas && 2e3 < Date.now() - this.sequenceStartTime ? !1 : n) ? this.session.mergeUndoDeltas = !0 : -1 !== i.indexOf(e.command.name) && (this.sequenceStartTime = Date.now()))
                    }, this.setKeyboardHandler = function (t, i) {
                        var n;
                        t && "string" == typeof t && "ace" != t ? (this.$keybindingId = t, n = this, I.loadModule(["keybinding", t], function (e) {
                            n.$keybindingId == t && n.keyBinding.setKeyboardHandler(e && e.handler), i && i()
                        })) : (this.$keybindingId = null, this.keyBinding.setKeyboardHandler(t), i && i())
                    }, this.getKeyboardHandler = function () {
                        return this.keyBinding.getKeyboardHandler()
                    }, this.setSession = function (e) {
                        var t, i;
                        this.session != e && (this.curOp && this.endOperation(), this.curOp = {}, (t = this.session) && (this.session.off("change", this.$onDocumentChange), this.session.off("changeMode", this.$onChangeMode), this.session.off("tokenizerUpdate", this.$onTokenizerUpdate), this.session.off("changeTabSize", this.$onChangeTabSize), this.session.off("changeWrapLimit", this.$onChangeWrapLimit), this.session.off("changeWrapMode", this.$onChangeWrapMode), this.session.off("changeFold", this.$onChangeFold), this.session.off("changeFrontMarker", this.$onChangeFrontMarker), this.session.off("changeBackMarker", this.$onChangeBackMarker), this.session.off("changeBreakpoint", this.$onChangeBreakpoint), this.session.off("changeAnnotation", this.$onChangeAnnotation), this.session.off("changeOverwrite", this.$onCursorChange), this.session.off("changeScrollTop", this.$onScrollTopChange), this.session.off("changeScrollLeft", this.$onScrollLeftChange), (i = this.session.getSelection()).off("changeCursor", this.$onCursorChange), i.off("changeSelection", this.$onSelectionChange)), (this.session = e) ? (this.$onDocumentChange = this.onDocumentChange.bind(this), e.on("change", this.$onDocumentChange), this.renderer.setSession(e), this.$onChangeMode = this.onChangeMode.bind(this), e.on("changeMode", this.$onChangeMode), this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this), e.on("tokenizerUpdate", this.$onTokenizerUpdate), this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer), e.on("changeTabSize", this.$onChangeTabSize), this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this), e.on("changeWrapLimit", this.$onChangeWrapLimit), this.$onChangeWrapMode = this.onChangeWrapMode.bind(this), e.on("changeWrapMode", this.$onChangeWrapMode), this.$onChangeFold = this.onChangeFold.bind(this), e.on("changeFold", this.$onChangeFold), this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this), this.session.on("changeFrontMarker", this.$onChangeFrontMarker), this.$onChangeBackMarker = this.onChangeBackMarker.bind(this), this.session.on("changeBackMarker", this.$onChangeBackMarker), this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this), this.session.on("changeBreakpoint", this.$onChangeBreakpoint), this.$onChangeAnnotation = this.onChangeAnnotation.bind(this), this.session.on("changeAnnotation", this.$onChangeAnnotation), this.$onCursorChange = this.onCursorChange.bind(this), this.session.on("changeOverwrite", this.$onCursorChange), this.$onScrollTopChange = this.onScrollTopChange.bind(this), this.session.on("changeScrollTop", this.$onScrollTopChange), this.$onScrollLeftChange = this.onScrollLeftChange.bind(this), this.session.on("changeScrollLeft", this.$onScrollLeftChange), this.selection = e.getSelection(), this.selection.on("changeCursor", this.$onCursorChange), this.$onSelectionChange = this.onSelectionChange.bind(this), this.selection.on("changeSelection", this.$onSelectionChange), this.onChangeMode(), this.onCursorChange(), this.onScrollTopChange(), this.onScrollLeftChange(), this.onSelectionChange(), this.onChangeFrontMarker(), this.onChangeBackMarker(), this.onChangeBreakpoint(), this.onChangeAnnotation(), this.session.getUseWrapMode() && this.renderer.adjustWrapLimit(), this.renderer.updateFull()) : (this.selection = null, this.renderer.setSession(e)), this._signal("changeSession", {
                            session: e,
                            oldSession: t
                        }), this.curOp = null, t && t._signal("changeEditor", {oldEditor: this}), e && e._signal("changeEditor", {editor: this}), e && e.bgTokenizer && e.bgTokenizer.scheduleStart())
                    }, this.getSession = function () {
                        return this.session
                    }, this.setValue = function (e, t) {
                        return this.session.doc.setValue(e), t ? 1 == t ? this.navigateFileEnd() : -1 == t && this.navigateFileStart() : this.selectAll(), e
                    }, this.getValue = function () {
                        return this.session.getValue()
                    }, this.getSelection = function () {
                        return this.selection
                    }, this.resize = function (e) {
                        this.renderer.onResize(e)
                    }, this.setTheme = function (e, t) {
                        this.renderer.setTheme(e, t)
                    }, this.getTheme = function () {
                        return this.renderer.getTheme()
                    }, this.setStyle = function (e) {
                        this.renderer.setStyle(e)
                    }, this.unsetStyle = function (e) {
                        this.renderer.unsetStyle(e)
                    }, this.getFontSize = function () {
                        return this.getOption("fontSize") || n.computedStyle(this.container).fontSize
                    }, this.setFontSize = function (e) {
                        this.setOption("fontSize", e)
                    }, this.$highlightBrackets = function () {
                        var n;
                        this.$highlightPending || ((n = this).$highlightPending = !0, setTimeout(function () {
                            n.$highlightPending = !1;
                            var e, t, i = n.session;
                            i && i.bgTokenizer && (i.$bracketHighlight && (i.$bracketHighlight.markerIds.forEach(function (e) {
                                i.removeMarker(e)
                            }), i.$bracketHighlight = null), (e = !(e = i.getMatchingBracketRanges(n.getCursorPosition())) && i.$mode.getMatching ? i.$mode.getMatching(n.session) : e) && (t = "ace_bracket", Array.isArray(e) ? 1 == e.length && (t = "ace_error_bracket") : e = [e], 2 == e.length && (0 == f.comparePoints(e[0].end, e[1].start) ? e = [f.fromPoints(e[0].start, e[1].end)] : 0 == f.comparePoints(e[0].start, e[1].end) && (e = [f.fromPoints(e[1].start, e[0].end)])), i.$bracketHighlight = {
                                ranges: e,
                                markerIds: e.map(function (e) {
                                    return i.addMarker(e, t, "text")
                                })
                            }))
                        }, 50))
                    }, this.$highlightTags = function () {
                        var u;
                        this.$highlightTagPending || ((u = this).$highlightTagPending = !0, setTimeout(function () {
                            u.$highlightTagPending = !1;
                            var e = u.session;
                            if (e && e.bgTokenizer) {
                                var t = u.getCursorPosition(), i = new v(u.session, t.row, t.column),
                                    n = i.getCurrentToken();
                                if (!n || !/\b(?:tag-open|tag-name)/.test(n.type)) return e.removeMarker(e.$tagHighlight), void (e.$tagHighlight = null);
                                if (-1 === n.type.indexOf("tag-open") || (n = i.stepForward())) {
                                    var r = n.value, o = n.value, s = 0, a = i.stepBackward();
                                    if ("<" === a.value) for (; a = n, (n = i.stepForward()) && (-1 !== n.type.indexOf("tag-name") ? r === (o = n.value) && ("<" === a.value ? s++ : "</" === a.value && s--) : r === o && "/>" === n.value && s--), n && 0 <= s;) ; else {
                                        do {
                                            if (n = a, a = i.stepBackward(), n) if (-1 !== n.type.indexOf("tag-name")) r === n.value && ("<" === a.value ? s++ : "</" === a.value && s--); else if ("/>" === n.value) {
                                                for (var l = 0, c = a; c;) {
                                                    if (-1 !== c.type.indexOf("tag-name") && c.value === r) {
                                                        s--;
                                                        break
                                                    }
                                                    if ("<" === c.value) break;
                                                    c = i.stepBackward(), l++
                                                }
                                                for (var h = 0; h < l; h++) i.stepForward()
                                            }
                                        } while (a && s <= 0);
                                        i.stepForward()
                                    }
                                    if (!n) return e.removeMarker(e.$tagHighlight), void (e.$tagHighlight = null);
                                    var d = i.getCurrentTokenRow(), t = i.getCurrentTokenColumn(),
                                        d = new f(d, t, d, t + n.value.length), t = e.$backMarkers[e.$tagHighlight];
                                    e.$tagHighlight && null != t && 0 !== d.compareRange(t.range) && (e.removeMarker(e.$tagHighlight), e.$tagHighlight = null), e.$tagHighlight || (e.$tagHighlight = e.addMarker(d, "ace_bracket", "text"))
                                }
                            }
                        }, 50))
                    }, this.focus = function () {
                        var e = this;
                        setTimeout(function () {
                            e.isFocused() || e.textInput.focus()
                        }), this.textInput.focus()
                    }, this.isFocused = function () {
                        return this.textInput.isFocused()
                    }, this.blur = function () {
                        this.textInput.blur()
                    }, this.onFocus = function (e) {
                        this.$isFocused || (this.$isFocused = !0, this.renderer.showCursor(), this.renderer.visualizeFocus(), this._emit("focus", e))
                    }, this.onBlur = function (e) {
                        this.$isFocused && (this.$isFocused = !1, this.renderer.hideCursor(), this.renderer.visualizeBlur(), this._emit("blur", e))
                    }, this.$cursorChange = function () {
                        this.renderer.updateCursor(), this.$highlightBrackets(), this.$highlightTags(), this.$updateHighlightActiveLine()
                    }, this.onDocumentChange = function (e) {
                        var t = this.session.$useWrapMode, i = e.start.row == e.end.row ? e.end.row : 1 / 0;
                        this.renderer.updateLines(e.start.row, i, t), this._signal("change", e), this.$cursorChange()
                    }, this.onTokenizerUpdate = function (e) {
                        e = e.data;
                        this.renderer.updateLines(e.first, e.last)
                    }, this.onScrollTopChange = function () {
                        this.renderer.scrollToY(this.session.getScrollTop())
                    }, this.onScrollLeftChange = function () {
                        this.renderer.scrollToX(this.session.getScrollLeft())
                    }, this.onCursorChange = function () {
                        this.$cursorChange(), this._signal("changeSelection")
                    }, this.$updateHighlightActiveLine = function () {
                        var e, t, i = this.getSession();
                        this.$highlightActiveLine && ("line" == this.$selectionStyle && this.selection.isMultiLine() || (e = this.getCursorPosition()), this.renderer.theme && this.renderer.theme.$selectionColorConflict && !this.selection.isEmpty() && (e = !1), !this.renderer.$maxLines || 1 !== this.session.getLength() || 1 < this.renderer.$minLines || (e = !1)), i.$highlightLineMarker && !e ? (i.removeMarker(i.$highlightLineMarker.id), i.$highlightLineMarker = null) : !i.$highlightLineMarker && e ? ((t = new f(e.row, e.column, e.row, 1 / 0)).id = i.addMarker(t, "ace_active-line", "screenLine"), i.$highlightLineMarker = t) : e && (i.$highlightLineMarker.start.row = e.row, i.$highlightLineMarker.end.row = e.row, i.$highlightLineMarker.start.column = e.column, i._signal("changeBackMarker"))
                    }, this.onSelectionChange = function (e) {
                        var t, i = this.session;
                        i.$selectionMarker && i.removeMarker(i.$selectionMarker), i.$selectionMarker = null, this.selection.isEmpty() ? this.$updateHighlightActiveLine() : (t = this.selection.getRange(), n = this.getSelectionStyle(), i.$selectionMarker = i.addMarker(t, "ace_selection", n));
                        var n = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp();
                        this.session.highlight(n), this._signal("changeSelection")
                    }, this.$getSelectionHighLightRegexp = function () {
                        var e = this.session, t = this.getSelectionRange();
                        if (!t.isEmpty() && !t.isMultiLine()) {
                            var i = t.start.column, n = t.end.column, e = e.getLine(t.start.row), t = e.substring(i, n);
                            if (!(5e3 < t.length) && /[\w\d]/.test(t)) {
                                t = this.$search.$assembleRegExp({
                                    wholeWord: !0,
                                    caseSensitive: !0,
                                    needle: t
                                }), n = e.substring(i - 1, n + 1);
                                if (t.test(n)) return t
                            }
                        }
                    }, this.onChangeFrontMarker = function () {
                        this.renderer.updateFrontMarkers()
                    }, this.onChangeBackMarker = function () {
                        this.renderer.updateBackMarkers()
                    }, this.onChangeBreakpoint = function () {
                        this.renderer.updateBreakpoints()
                    }, this.onChangeAnnotation = function () {
                        this.renderer.setAnnotations(this.session.getAnnotations())
                    }, this.onChangeMode = function (e) {
                        this.renderer.updateText(), this._emit("changeMode", e)
                    }, this.onChangeWrapLimit = function () {
                        this.renderer.updateFull()
                    }, this.onChangeWrapMode = function () {
                        this.renderer.onResize(!0)
                    }, this.onChangeFold = function () {
                        this.$updateHighlightActiveLine(), this.renderer.updateFull()
                    }, this.getSelectedText = function () {
                        return this.session.getTextRange(this.getSelectionRange())
                    }, this.getCopyText = function () {
                        var e = this.getSelectedText(), t = this.session.doc.getNewLineCharacter(), i = !1;
                        if (!e && this.$copyWithEmptySelection) for (var i = !0, n = this.selection.getAllRanges(), r = 0; r < n.length; r++) {
                            var o = n[r];
                            r && n[r - 1].start.row == o.start.row || (e += this.session.getLine(o.start.row) + t)
                        }
                        var s = {text: e};
                        return this._signal("copy", s), A.lineMode = i ? s.text : "", s.text
                    }, this.onCopy = function () {
                        this.commands.exec("copy", this)
                    }, this.onCut = function () {
                        this.commands.exec("cut", this)
                    }, this.onPaste = function (e, t) {
                        this.commands.exec("paste", this, {text: e, event: t})
                    }, this.$handlePaste = function (e) {
                        this._signal("paste", e = "string" == typeof e ? {text: e} : e);
                        var t = e.text, e = t == A.lineMode, i = this.session;
                        if (!this.inMultiSelectMode || this.inVirtualSelectionMode) e ? i.insert({
                            row: this.selection.lead.row,
                            column: 0
                        }, t) : this.insert(t); else if (e) this.selection.rangeList.ranges.forEach(function (e) {
                            i.insert({row: e.start.row, column: 0}, t)
                        }); else {
                            var n = t.split(/\r\n|\r|\n/), r = this.selection.rangeList.ranges,
                                e = !(2 != n.length || n[0] && n[1]);
                            if (n.length != r.length || e) return this.commands.exec("insertstring", this, t);
                            for (var o = r.length; o--;) {
                                var s = r[o];
                                s.isEmpty() || i.remove(s), i.insert(s.start, n[o])
                            }
                        }
                    }, this.execCommand = function (e, t) {
                        return this.commands.exec(e, this, t)
                    }, this.insert = function (e, t) {
                        var i, n = this.session, r = n.getMode(), o = this.getCursorPosition();
                        !this.getBehavioursEnabled() || t || (i = r.transformAction(n.getState(o.row), "insertion", this, n, e)) && (e !== i.text && (this.inVirtualSelectionMode || (this.session.mergeUndoDeltas = !1, this.mergeNextCommand = !1)), e = i.text), "\t" == e && (e = this.session.getTabString()), this.selection.isEmpty() ? this.session.getOverwrite() && -1 == e.indexOf("\n") && ((s = new f.fromPoints(o, o)).end.column += e.length, this.session.remove(s)) : (s = this.getSelectionRange(), o = this.session.remove(s), this.clearSelection()), "\n" != e && "\r\n" != e || (a = n.getLine(o.row), o.column > a.search(/\S|$/) && (l = a.substr(o.column).search(/\S|$/), n.doc.removeInLine(o.row, o.column, o.column + l))), this.clearSelection();
                        var t = o.column, s = n.getState(o.row), a = n.getLine(o.row), l = r.checkOutdent(s, a, e);
                        n.insert(o, e), i && i.selection && (2 == i.selection.length ? this.selection.setSelectionRange(new f(o.row, t + i.selection[0], o.row, t + i.selection[1])) : this.selection.setSelectionRange(new f(o.row + i.selection[0], i.selection[1], o.row + i.selection[2], i.selection[3]))), this.$enableAutoIndent && (n.getDocument().isNewLine(e) && (a = r.getNextLineIndent(s, a.slice(0, o.column), n.getTabString()), n.insert({
                            row: o.row + 1,
                            column: 0
                        }, a)), l && r.autoOutdent(s, n, o.row))
                    }, this.autoIndent = function () {
                        var e, t, i, n = this.session, r = n.getMode();
                        i = this.selection.isEmpty() ? (t = 0, n.doc.getLength() - 1) : (t = (e = this.getSelectionRange()).start.row, e.end.row);
                        for (var o, s, a = "", l = "", c = n.getTabString(), h = t; h <= i; h++) 0 < h && (a = n.getState(h - 1), o = n.getLine(h - 1), l = r.getNextLineIndent(a, o, c)), s = n.getLine(h), l !== (s = r.$getIndent(s)) && (0 < s.length && (s = new f(h, 0, h, s.length), n.remove(s)), 0 < l.length && n.insert({
                            row: h,
                            column: 0
                        }, l)), r.autoOutdent(a, n, h)
                    }, this.onTextInput = function (e, t) {
                        if (!t) return this.keyBinding.onTextInput(e);
                        this.startOperation({command: {name: "insertstring"}});
                        t = this.applyComposition.bind(this, e, t);
                        this.selection.rangeCount ? this.forEachSelection(t) : t(), this.endOperation()
                    }, this.applyComposition = function (e, t) {
                        var i;
                        (t.extendLeft || t.extendRight) && ((i = this.selection.getRange()).start.column -= t.extendLeft, i.end.column += t.extendRight, i.start.column < 0 && (i.start.row--, i.start.column += this.session.getLine(i.start.row).length + 1), this.selection.setRange(i), e || i.isEmpty() || this.remove()), !e && this.selection.isEmpty() || this.insert(e, !0), (t.restoreStart || t.restoreEnd) && ((i = this.selection.getRange()).start.column -= t.restoreStart, i.end.column -= t.restoreEnd, this.selection.setRange(i))
                    }, this.onCommandKey = function (e, t, i) {
                        return this.keyBinding.onCommandKey(e, t, i)
                    }, this.setOverwrite = function (e) {
                        this.session.setOverwrite(e)
                    }, this.getOverwrite = function () {
                        return this.session.getOverwrite()
                    }, this.toggleOverwrite = function () {
                        this.session.toggleOverwrite()
                    }, this.setScrollSpeed = function (e) {
                        this.setOption("scrollSpeed", e)
                    }, this.getScrollSpeed = function () {
                        return this.getOption("scrollSpeed")
                    }, this.setDragDelay = function (e) {
                        this.setOption("dragDelay", e)
                    }, this.getDragDelay = function () {
                        return this.getOption("dragDelay")
                    }, this.setSelectionStyle = function (e) {
                        this.setOption("selectionStyle", e)
                    }, this.getSelectionStyle = function () {
                        return this.getOption("selectionStyle")
                    }, this.setHighlightActiveLine = function (e) {
                        this.setOption("highlightActiveLine", e)
                    }, this.getHighlightActiveLine = function () {
                        return this.getOption("highlightActiveLine")
                    }, this.setHighlightGutterLine = function (e) {
                        this.setOption("highlightGutterLine", e)
                    }, this.getHighlightGutterLine = function () {
                        return this.getOption("highlightGutterLine")
                    }, this.setHighlightSelectedWord = function (e) {
                        this.setOption("highlightSelectedWord", e)
                    }, this.getHighlightSelectedWord = function () {
                        return this.$highlightSelectedWord
                    }, this.setAnimatedScroll = function (e) {
                        this.renderer.setAnimatedScroll(e)
                    }, this.getAnimatedScroll = function () {
                        return this.renderer.getAnimatedScroll()
                    }, this.setShowInvisibles = function (e) {
                        this.renderer.setShowInvisibles(e)
                    }, this.getShowInvisibles = function () {
                        return this.renderer.getShowInvisibles()
                    }, this.setDisplayIndentGuides = function (e) {
                        this.renderer.setDisplayIndentGuides(e)
                    }, this.getDisplayIndentGuides = function () {
                        return this.renderer.getDisplayIndentGuides()
                    }, this.setShowPrintMargin = function (e) {
                        this.renderer.setShowPrintMargin(e)
                    }, this.getShowPrintMargin = function () {
                        return this.renderer.getShowPrintMargin()
                    }, this.setPrintMarginColumn = function (e) {
                        this.renderer.setPrintMarginColumn(e)
                    }, this.getPrintMarginColumn = function () {
                        return this.renderer.getPrintMarginColumn()
                    }, this.setReadOnly = function (e) {
                        this.setOption("readOnly", e)
                    }, this.getReadOnly = function () {
                        return this.getOption("readOnly")
                    }, this.setBehavioursEnabled = function (e) {
                        this.setOption("behavioursEnabled", e)
                    }, this.getBehavioursEnabled = function () {
                        return this.getOption("behavioursEnabled")
                    }, this.setWrapBehavioursEnabled = function (e) {
                        this.setOption("wrapBehavioursEnabled", e)
                    }, this.getWrapBehavioursEnabled = function () {
                        return this.getOption("wrapBehavioursEnabled")
                    }, this.setShowFoldWidgets = function (e) {
                        this.setOption("showFoldWidgets", e)
                    }, this.getShowFoldWidgets = function () {
                        return this.getOption("showFoldWidgets")
                    }, this.setFadeFoldWidgets = function (e) {
                        this.setOption("fadeFoldWidgets", e)
                    }, this.getFadeFoldWidgets = function () {
                        return this.getOption("fadeFoldWidgets")
                    }, this.remove = function (e) {
                        this.selection.isEmpty() && ("left" == e ? this.selection.selectLeft() : this.selection.selectRight());
                        var t, i, n = this.getSelectionRange();
                        this.getBehavioursEnabled() && (t = (i = this.session).getState(n.start.row), e = i.getMode().transformAction(t, "deletion", this, i, n), 0 !== n.end.column || "\n" == (t = i.getTextRange(n))[t.length - 1] && (i = i.getLine(n.end.row), /^\s+$/.test(i) && (n.end.column = i.length)), e && (n = e)), this.session.remove(n), this.clearSelection()
                    }, this.removeWordRight = function () {
                        this.selection.isEmpty() && this.selection.selectWordRight(), this.session.remove(this.getSelectionRange()), this.clearSelection()
                    }, this.removeWordLeft = function () {
                        this.selection.isEmpty() && this.selection.selectWordLeft(), this.session.remove(this.getSelectionRange()), this.clearSelection()
                    }, this.removeToLineStart = function () {
                        this.selection.isEmpty() && this.selection.selectLineStart(), this.selection.isEmpty() && this.selection.selectLeft(), this.session.remove(this.getSelectionRange()), this.clearSelection()
                    }, this.removeToLineEnd = function () {
                        this.selection.isEmpty() && this.selection.selectLineEnd();
                        var e = this.getSelectionRange();
                        e.start.column == e.end.column && e.start.row == e.end.row && (e.end.column = 0, e.end.row++), this.session.remove(e), this.clearSelection()
                    }, this.splitLine = function () {
                        this.selection.isEmpty() || (this.session.remove(this.getSelectionRange()), this.clearSelection());
                        var e = this.getCursorPosition();
                        this.insert("\n"), this.moveCursorToPosition(e)
                    }, this.transposeLetters = function () {
                        var e, t, i, n;
                        !this.selection.isEmpty() || 0 !== (n = (e = this.getCursorPosition()).column) && (n = n < (t = this.session.getLine(e.row)).length ? (i = t.charAt(n) + t.charAt(n - 1), new f(e.row, n - 1, e.row, n + 1)) : (i = t.charAt(n - 1) + t.charAt(n - 2), new f(e.row, n - 2, e.row, n)), this.session.replace(n, i), this.session.selection.moveToPosition(n.end))
                    }, this.toLowerCase = function () {
                        var e = this.getSelectionRange();
                        this.selection.isEmpty() && this.selection.selectWord();
                        var t = this.getSelectionRange(), i = this.session.getTextRange(t);
                        this.session.replace(t, i.toLowerCase()), this.selection.setSelectionRange(e)
                    },this.toUpperCase = function () {
                        var e = this.getSelectionRange();
                        this.selection.isEmpty() && this.selection.selectWord();
                        var t = this.getSelectionRange(), i = this.session.getTextRange(t);
                        this.session.replace(t, i.toUpperCase()), this.selection.setSelectionRange(e)
                    },this.indent = function () {
                        var e = this.session, t = this.getSelectionRange();
                        if (!(t.start.row < t.end.row)) {
                            if (t.start.column < t.end.column) {
                                var i = e.getTextRange(t);
                                if (!/^\s+$/.test(i)) {
                                    a = this.$getSelectedRows();
                                    return void e.indentRows(a.first, a.last, "\t")
                                }
                            }
                            var n = e.getLine(t.start.row), r = t.start, i = e.getTabSize(),
                                r = e.documentToScreenColumn(r.row, r.column);
                            if (this.session.getUseSoftTabs()) var o = i - r % i, s = m.stringRepeat(" ", o); else {
                                for (o = r % i; " " == n[t.start.column - 1] && o;) t.start.column--, o--;
                                this.selection.setSelectionRange(t), s = "\t"
                            }
                            return this.insert(s)
                        }
                        var a = this.$getSelectedRows();
                        e.indentRows(a.first, a.last, "\t")
                    },this.blockIndent = function () {
                        var e = this.$getSelectedRows();
                        this.session.indentRows(e.first, e.last, "\t")
                    },this.blockOutdent = function () {
                        var e = this.session.getSelection();
                        this.session.outdentRows(e.getRange())
                    },this.sortLines = function () {
                        for (var e = this.$getSelectedRows(), t = this.session, i = [], n = e.first; n <= e.last; n++) i.push(t.getLine(n));
                        i.sort(function (e, t) {
                            return e.toLowerCase() < t.toLowerCase() ? -1 : e.toLowerCase() > t.toLowerCase() ? 1 : 0
                        });
                        for (var r = new f(0, 0, 0, 0), n = e.first; n <= e.last; n++) {
                            var o = t.getLine(n);
                            r.start.row = n, r.end.row = n, r.end.column = o.length, t.replace(r, i[n - e.first])
                        }
                    },this.toggleCommentLines = function () {
                        var e = this.session.getState(this.getCursorPosition().row), t = this.$getSelectedRows();
                        this.session.getMode().toggleCommentLines(e, this.session, t.first, t.last)
                    },this.toggleBlockComment = function () {
                        var e = this.getCursorPosition(), t = this.session.getState(e.row),
                            i = this.getSelectionRange();
                        this.session.getMode().toggleBlockComment(t, this.session, i, e)
                    },this.getNumberAt = function (e, t) {
                        var i = /[\-]?[0-9]+(?:\.[0-9]+)?/g;
                        i.lastIndex = 0;
                        for (var n = this.session.getLine(e); i.lastIndex < t;) {
                            var r = i.exec(n);
                            if (r.index <= t && r.index + r[0].length >= t) return {
                                value: r[0],
                                start: r.index,
                                end: r.index + r[0].length
                            }
                        }
                        return null
                    },this.modifyNumber = function (e) {
                        var t, i, n = this.selection.getCursor().row, r = this.selection.getCursor().column,
                            o = new f(n, r - 1, n, r), s = this.session.getTextRange(o);
                        !isNaN(parseFloat(s)) && isFinite(s) ? (t = this.getNumberAt(n, r)) && (i = 0 <= t.value.indexOf(".") ? t.start + t.value.indexOf(".") + 1 : t.end, o = t.start + t.value.length - i, s = parseFloat(t.value), s *= Math.pow(10, o), i !== t.end && r < i ? e *= Math.pow(10, t.end - r - 1) : e *= Math.pow(10, t.end - r), s += e, s = (s /= Math.pow(10, o)).toFixed(o), o = new f(n, t.start, n, t.end), this.session.replace(o, s), this.moveCursorTo(n, Math.max(t.start + 1, r + s.length - t.value.length))) : this.toggleWord()
                    },this.$toggleWordPairs = [["first", "last"], ["true", "false"], ["yes", "no"], ["width", "height"], ["top", "bottom"], ["right", "left"], ["on", "off"], ["x", "y"], ["get", "set"], ["max", "min"], ["horizontal", "vertical"], ["show", "hide"], ["add", "remove"], ["up", "down"], ["before", "after"], ["even", "odd"], ["in", "out"], ["inside", "outside"], ["next", "previous"], ["increase", "decrease"], ["attach", "detach"], ["&&", "||"], ["==", "!="]],this.toggleWord = function () {
                        var i = this.selection.getCursor().row, e = this.selection.getCursor().column;
                        this.selection.selectWord();
                        var n = this.getSelectedText(), r = this.selection.getWordRange().start.column,
                            t = n.replace(/([a-z]+|[A-Z]+)(?=[A-Z_]|$)/g, "$1 ").split(/\s/), o = e - r - 1;
                        o < 0 && (o = 0);
                        var s, a = 0, l = this;
                        n.match(/[A-Za-z0-9_]+/) && t.forEach(function (e, t) {
                            s = a + e.length, a <= o && o <= s && (n = e, l.selection.clearSelection(), l.moveCursorTo(i, a + r), l.selection.selectTo(i, s + r)), a = s
                        });
                        for (var c = this.$toggleWordPairs, h = 0; h < c.length; h++) for (var d = c[h], u = 0; u <= 1; u++) {
                            var g = +!u, p = n.match(new RegExp("^\\s?_?(" + m.escapeRegExp(d[u]) + ")\\s?$", "i"));
                            p && n.match(new RegExp("([_]|^|\\s)(" + m.escapeRegExp(p[1]) + ")($|\\s)", "g")) && (p = n.replace(new RegExp(m.escapeRegExp(d[u]), "i"), function (e) {
                                var t = d[g];
                                return e.toUpperCase() == e ? t = t.toUpperCase() : e.charAt(0).toUpperCase() == e.charAt(0) && (t = t.substr(0, 0) + d[g].charAt(0).toUpperCase() + t.substr(1)), t
                            }), this.insert(p))
                        }
                    },this.removeLines = function () {
                        var e = this.$getSelectedRows();
                        this.session.removeFullLines(e.first, e.last), this.clearSelection()
                    },this.duplicateSelection = function () {
                        var e, t = this.selection, i = this.session, n = t.getRange(), r = t.isBackwards();
                        n.isEmpty() ? (e = n.start.row, i.duplicateLines(e, e)) : (e = r ? n.start : n.end, i = i.insert(e, i.getTextRange(n), !1), n.start = e, n.end = i, t.setSelectionRange(n, r))
                    },this.moveLinesDown = function () {
                        this.$moveLines(1, !1)
                    },this.moveLinesUp = function () {
                        this.$moveLines(-1, !1)
                    },this.moveText = function (e, t, i) {
                        return this.session.moveText(e, t, i)
                    },this.copyLinesUp = function () {
                        this.$moveLines(-1, !0)
                    },this.copyLinesDown = function () {
                        this.$moveLines(1, !0)
                    },this.$moveLines = function (e, t) {
                        var i = this.selection;
                        if (!i.inMultiSelectMode || this.inVirtualSelectionMode) {
                            var n = i.toOrientedRange(), r = this.$getSelectedRows(n),
                                o = this.session.$moveLines(r.first, r.last, t ? 0 : e);
                            n.moveBy(o = t && -1 == e ? 0 : o, 0), i.fromOrientedRange(n)
                        } else {
                            var s = i.rangeList.ranges;
                            i.rangeList.detach(this.session), this.inVirtualSelectionMode = !0;
                            for (var a = 0, l = 0, c = s.length, h = 0; h < c; h++) {
                                var d = h;
                                s[h].moveBy(a, 0);
                                for (var u = (r = this.$getSelectedRows(s[h])).first, g = r.last; ++h < c;) {
                                    l && s[h].moveBy(l, 0);
                                    var p = this.$getSelectedRows(s[h]);
                                    if (t && p.first != g) break;
                                    if (!t && p.first > g + 1) break;
                                    g = p.last
                                }
                                for (h--, a = this.session.$moveLines(u, g, t ? 0 : e), t && -1 == e && (d = h + 1); d <= h;) s[d].moveBy(a, 0), d++;
                                l += a = !t ? 0 : a
                            }
                            i.fromOrientedRange(i.ranges[0]), i.rangeList.attach(this.session), this.inVirtualSelectionMode = !1
                        }
                    },this.$getSelectedRows = function (e) {
                        return e = (e || this.getSelectionRange()).collapseRows(), {
                            first: this.session.getRowFoldStart(e.start.row),
                            last: this.session.getRowFoldEnd(e.end.row)
                        }
                    },this.onCompositionStart = function (e) {
                        this.renderer.showComposition(e)
                    },this.onCompositionUpdate = function (e) {
                        this.renderer.setCompositionText(e)
                    },this.onCompositionEnd = function () {
                        this.renderer.hideComposition()
                    },this.getFirstVisibleRow = function () {
                        return this.renderer.getFirstVisibleRow()
                    },this.getLastVisibleRow = function () {
                        return this.renderer.getLastVisibleRow()
                    },this.isRowVisible = function (e) {
                        return e >= this.getFirstVisibleRow() && e <= this.getLastVisibleRow()
                    },this.isRowFullyVisible = function (e) {
                        return e >= this.renderer.getFirstFullyVisibleRow() && e <= this.renderer.getLastFullyVisibleRow()
                    },this.$getVisibleRowCount = function () {
                        return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1
                    },this.$moveByPage = function (e, t) {
                        var i = this.renderer, n = this.renderer.layerConfig,
                            r = e * Math.floor(n.height / n.lineHeight);
                        !0 === t ? this.selection.$moveSelection(function () {
                            this.moveCursorBy(r, 0)
                        }) : !1 === t && (this.selection.moveCursorBy(r, 0), this.selection.clearSelection());
                        e = i.scrollTop;
                        i.scrollBy(0, r * n.lineHeight), null != t && i.scrollCursorIntoView(null, .5), i.animateScrolling(e)
                    },this.selectPageDown = function () {
                        this.$moveByPage(1, !0)
                    },this.selectPageUp = function () {
                        this.$moveByPage(-1, !0)
                    },this.gotoPageDown = function () {
                        this.$moveByPage(1, !1)
                    },this.gotoPageUp = function () {
                        this.$moveByPage(-1, !1)
                    },this.scrollPageDown = function () {
                        this.$moveByPage(1)
                    },this.scrollPageUp = function () {
                        this.$moveByPage(-1)
                    },this.scrollToRow = function (e) {
                        this.renderer.scrollToRow(e)
                    },this.scrollToLine = function (e, t, i, n) {
                        this.renderer.scrollToLine(e, t, i, n)
                    },this.centerSelection = function () {
                        var e = this.getSelectionRange(), e = {
                            row: Math.floor(e.start.row + (e.end.row - e.start.row) / 2),
                            column: Math.floor(e.start.column + (e.end.column - e.start.column) / 2)
                        };
                        this.renderer.alignCursor(e, .5)
                    },this.getCursorPosition = function () {
                        return this.selection.getCursor()
                    },this.getCursorPositionScreen = function () {
                        return this.session.documentToScreenPosition(this.getCursorPosition())
                    },this.getSelectionRange = function () {
                        return this.selection.getRange()
                    },this.selectAll = function () {
                        this.selection.selectAll()
                    },this.clearSelection = function () {
                        this.selection.clearSelection()
                    },this.moveCursorTo = function (e, t) {
                        this.selection.moveCursorTo(e, t)
                    },this.moveCursorToPosition = function (e) {
                        this.selection.moveCursorToPosition(e)
                    },this.jumpToMatching = function (e, t) {
                        var i = this.getCursorPosition(), n = new v(this.session, i.row, i.column),
                            r = n.getCurrentToken(), o = r || n.stepForward();
                        if (o) {
                            var s, a, l, c = !1, h = {}, d = i.column - o.start,
                                u = {")": "(", "(": "(", "]": "[", "[": "[", "{": "{", "}": "{"};
                            do {
                                if (o.value.match(/[{}()\[\]]/g)) {
                                    for (; d < o.value.length && !c; d++) if (u[o.value[d]]) switch (a = u[o.value[d]] + "." + o.type.replace("rparen", "lparen"), isNaN(h[a]) && (h[a] = 0), o.value[d]) {
                                        case"(":
                                        case"[":
                                        case"{":
                                            h[a]++;
                                            break;
                                        case")":
                                        case"]":
                                        case"}":
                                            h[a]--, -1 === h[a] && (s = "bracket", c = !0)
                                    }
                                } else -1 !== o.type.indexOf("tag-name") && (isNaN(h[o.value]) && (h[o.value] = 0), "<" === r.value ? h[o.value]++ : "</" === r.value && h[o.value]--, -1 === h[o.value] && (s = "tag", c = !0))
                            } while (c || (r = o, o = n.stepForward(), d = 0), o && !c);
                            if (s) {
                                if ("bracket" === s) (g = this.session.getBracketRange(i)) || (l = (g = new f(n.getCurrentTokenRow(), n.getCurrentTokenColumn() + d - 1, n.getCurrentTokenRow(), n.getCurrentTokenColumn() + d - 1)).start, (t || l.row === i.row && Math.abs(l.column - i.column) < 2) && (g = this.session.getBracketRange(l))); else if ("tag" === s) {
                                    if (!o || -1 === o.type.indexOf("tag-name")) return;
                                    var g, p = o.value;
                                    if (0 === (g = new f(n.getCurrentTokenRow(), n.getCurrentTokenColumn() - 2, n.getCurrentTokenRow(), n.getCurrentTokenColumn() - 2)).compare(i.row, i.column)) for (c = !1; o = r, (r = n.stepBackward()) && (-1 !== r.type.indexOf("tag-close") && g.setEnd(n.getCurrentTokenRow(), n.getCurrentTokenColumn() + 1), o.value === p && -1 !== o.type.indexOf("tag-name") && ("<" === r.value ? h[p]++ : "</" === r.value && h[p]--, 0 === h[p] && (c = !0))), r && !c;) ;
                                    o && o.type.indexOf("tag-name") && (l = g.start).row == i.row && Math.abs(l.column - i.column) < 2 && (l = g.end)
                                }
                                (l = g && g.cursor || l) && (e ? g && t ? this.selection.setRange(g) : g && g.isEqual(this.getSelectionRange()) ? this.clearSelection() : this.selection.selectTo(l.row, l.column) : this.selection.moveTo(l.row, l.column))
                            }
                        }
                    },this.gotoLine = function (e, t, i) {
                        this.selection.clearSelection(), this.session.unfold({
                            row: e - 1,
                            column: t || 0
                        }), this.exitMultiSelectMode && this.exitMultiSelectMode(), this.moveCursorTo(e - 1, t || 0), this.isRowFullyVisible(e - 1) || this.scrollToLine(e - 1, !0, i)
                    },this.navigateTo = function (e, t) {
                        this.selection.moveTo(e, t)
                    },this.navigateUp = function (e) {
                        if (this.selection.isMultiLine() && !this.selection.isBackwards()) {
                            var t = this.selection.anchor.getPosition();
                            return this.moveCursorToPosition(t)
                        }
                        this.selection.clearSelection(), this.selection.moveCursorBy(-e || -1, 0)
                    },this.navigateDown = function (e) {
                        if (this.selection.isMultiLine() && this.selection.isBackwards()) {
                            var t = this.selection.anchor.getPosition();
                            return this.moveCursorToPosition(t)
                        }
                        this.selection.clearSelection(), this.selection.moveCursorBy(e || 1, 0)
                    },this.navigateLeft = function (e) {
                        if (this.selection.isEmpty()) for (e = e || 1; e--;) this.selection.moveCursorLeft(); else {
                            var t = this.getSelectionRange().start;
                            this.moveCursorToPosition(t)
                        }
                        this.clearSelection()
                    },this.navigateRight = function (e) {
                        if (this.selection.isEmpty()) for (e = e || 1; e--;) this.selection.moveCursorRight(); else {
                            var t = this.getSelectionRange().end;
                            this.moveCursorToPosition(t)
                        }
                        this.clearSelection()
                    },this.navigateLineStart = function () {
                        this.selection.moveCursorLineStart(), this.clearSelection()
                    },this.navigateLineEnd = function () {
                        this.selection.moveCursorLineEnd(), this.clearSelection()
                    },this.navigateFileEnd = function () {
                        this.selection.moveCursorFileEnd(), this.clearSelection()
                    },this.navigateFileStart = function () {
                        this.selection.moveCursorFileStart(), this.clearSelection()
                    },this.navigateWordRight = function () {
                        this.selection.moveCursorWordRight(), this.clearSelection()
                    },this.navigateWordLeft = function () {
                        this.selection.moveCursorWordLeft(), this.clearSelection()
                    },this.replace = function (e, t) {
                        t && this.$search.set(t);
                        var i = this.$search.find(this.session), t = 0;
                        return i && (this.$tryReplace(i, e) && (t = 1), this.selection.setSelectionRange(i), this.renderer.scrollSelectionIntoView(i.start, i.end)), t
                    },this.replaceAll = function (e, t) {
                        t && this.$search.set(t);
                        var i = this.$search.findAll(this.session), n = 0;
                        if (!i.length) return n;
                        t = this.getSelectionRange();
                        this.selection.moveTo(0, 0);
                        for (var r = i.length - 1; 0 <= r; --r) this.$tryReplace(i[r], e) && n++;
                        return this.selection.setSelectionRange(t), n
                    },this.$tryReplace = function (e, t) {
                        var i = this.session.getTextRange(e);
                        return null !== (t = this.$search.replace(i, t)) ? (e.end = this.session.replace(e, t), e) : null
                    },this.getLastSearchOptions = function () {
                        return this.$search.getOptions()
                    },this.find = function (e, t, i) {
                        t = t || {}, "string" == typeof e || e instanceof RegExp ? t.needle = e : "object" == typeof e && o.mixin(t, e);
                        var n = this.selection.getRange();
                        null == t.needle && ((e = this.session.getTextRange(n) || this.$search.$options.needle) || (n = this.session.getWordRange(n.start.row, n.start.column), e = this.session.getTextRange(n)), this.$search.set({needle: e})), this.$search.set(t), t.start || this.$search.set({start: n});
                        e = this.$search.find(this.session);
                        return t.preventScroll ? e : e ? (this.revealRange(e, i), e) : (t.backwards ? n.start = n.end : n.end = n.start, void this.selection.setRange(n))
                    },this.findNext = function (e, t) {
                        this.find({skipCurrent: !0, backwards: !1}, e, t)
                    },this.findPrevious = function (e, t) {
                        this.find(e, {skipCurrent: !0, backwards: !0}, t)
                    },this.revealRange = function (e, t) {
                        this.session.unfold(e), this.selection.setSelectionRange(e);
                        var i = this.renderer.scrollTop;
                        this.renderer.scrollSelectionIntoView(e.start, e.end, .5), !1 !== t && this.renderer.animateScrolling(i)
                    },this.undo = function () {
                        this.session.getUndoManager().undo(this.session), this.renderer.scrollCursorIntoView(null, .5)
                    },this.redo = function () {
                        this.session.getUndoManager().redo(this.session), this.renderer.scrollCursorIntoView(null, .5)
                    },this.destroy = function () {
                        this.$toDestroy && (this.$toDestroy.forEach(function (e) {
                            e.destroy()
                        }), this.$toDestroy = null), this.$mouseHandler && this.$mouseHandler.destroy(), this.renderer.destroy(), this._signal("destroy", this), this.session && this.session.destroy(), this._$emitInputEvent && this._$emitInputEvent.cancel(), this.removeAllListeners()
                    },this.setAutoScrollEditorIntoView = function (e) {
                        var n, r, o, s, t, i, a;
                        e && (o = !1, (r = this).$scrollAnchor || (this.$scrollAnchor = document.createElement("div")), (s = this.$scrollAnchor).style.cssText = "position:absolute", this.container.insertBefore(s, this.container.firstChild), t = this.on("changeSelection", function () {
                            o = !0
                        }), i = this.renderer.on("beforeRender", function () {
                            o && (n = r.renderer.container.getBoundingClientRect())
                        }), a = this.renderer.on("afterRender", function () {
                            var e, t, i;
                            o && n && (r.isFocused() || r.searchBox && r.searchBox.isFocused()) && (e = (i = r.renderer).$cursorLayer.$pixelPos, t = i.layerConfig, i = e.top - t.offset, null != (o = 0 <= e.top && i + n.top < 0 || !(e.top < t.height && e.top + n.top + t.lineHeight > window.innerHeight) && null) && (s.style.top = i + "px", s.style.left = e.left + "px", s.style.height = t.lineHeight + "px", s.scrollIntoView(o)), o = n = null)
                        }), this.setAutoScrollEditorIntoView = function (e) {
                            e || (delete this.setAutoScrollEditorIntoView, this.off("changeSelection", t), this.renderer.off("afterRender", a), this.renderer.off("beforeRender", i))
                        })
                    },this.$resetCursorStyle = function () {
                        var e = this.$cursorStyle || "ace", t = this.renderer.$cursorLayer;
                        t && (t.setSmoothBlinking(/smooth/.test(e)), t.isBlinking = !this.$readOnly && "wide" != e, n.setCssClass(t.element, "ace_slim-cursors", /slim/.test(e)))
                    },this.prompt = function (t, i, n) {
                        var r = this;
                        I.loadModule("./ext/prompt", function (e) {
                            e.prompt(r, t, i, n)
                        })
                    }
                }.call(r.prototype), I.defineOptions(r.prototype, "editor", {
                    selectionStyle: {
                        set: function (e) {
                            this.onSelectionChange(), this._signal("changeSelectionStyle", {data: e})
                        }, initialValue: "line"
                    },
                    highlightActiveLine: {
                        set: function () {
                            this.$updateHighlightActiveLine()
                        }, initialValue: !0
                    },
                    highlightSelectedWord: {
                        set: function (e) {
                            this.$onSelectionChange()
                        }, initialValue: !0
                    },
                    readOnly: {
                        set: function (e) {
                            this.textInput.setReadOnly(e), this.$resetCursorStyle()
                        }, initialValue: !1
                    },
                    copyWithEmptySelection: {
                        set: function (e) {
                            this.textInput.setCopyWithEmptySelection(e)
                        }, initialValue: !1
                    },
                    cursorStyle: {
                        set: function (e) {
                            this.$resetCursorStyle()
                        }, values: ["ace", "slim", "smooth", "wide"], initialValue: "ace"
                    },
                    mergeUndoDeltas: {values: [!1, !0, "always"], initialValue: !0},
                    behavioursEnabled: {initialValue: !0},
                    wrapBehavioursEnabled: {initialValue: !0},
                    enableAutoIndent: {initialValue: !0},
                    autoScrollEditorIntoView: {
                        set: function (e) {
                            this.setAutoScrollEditorIntoView(e)
                        }
                    },
                    keyboardHandler: {
                        set: function (e) {
                            this.setKeyboardHandler(e)
                        }, get: function () {
                            return this.$keybindingId
                        }, handlesSet: !0
                    },
                    value: {
                        set: function (e) {
                            this.session.setValue(e)
                        }, get: function () {
                            return this.getValue()
                        }, handlesSet: !0, hidden: !0
                    },
                    session: {
                        set: function (e) {
                            this.setSession(e)
                        }, get: function () {
                            return this.session
                        }, handlesSet: !0, hidden: !0
                    },
                    showLineNumbers: {
                        set: function (e) {
                            this.renderer.$gutterLayer.setShowLineNumbers(e), this.renderer.$loop.schedule(this.renderer.CHANGE_GUTTER), e && this.$relativeLineNumbers ? b.attach(this) : b.detach(this)
                        }, initialValue: !0
                    },
                    relativeLineNumbers: {
                        set: function (e) {
                            this.$showLineNumbers && e ? b.attach(this) : b.detach(this)
                        }
                    },
                    placeholder: {
                        set: function (e) {
                            this.$updatePlaceholder || (this.$updatePlaceholder = function () {
                                var e = this.session && (this.renderer.$composition || this.getValue());
                                e && this.renderer.placeholderNode ? (this.renderer.off("afterRender", this.$updatePlaceholder), n.removeCssClass(this.container, "ace_hasPlaceholder"), this.renderer.placeholderNode.remove(), this.renderer.placeholderNode = null) : e || this.renderer.placeholderNode ? !e && this.renderer.placeholderNode && (this.renderer.placeholderNode.textContent = this.$placeholder || "") : (this.renderer.on("afterRender", this.$updatePlaceholder), n.addCssClass(this.container, "ace_hasPlaceholder"), (e = n.createElement("div")).className = "ace_placeholder", e.textContent = this.$placeholder || "", this.renderer.placeholderNode = e, this.renderer.content.appendChild(this.renderer.placeholderNode))
                            }.bind(this), this.on("input", this.$updatePlaceholder)), this.$updatePlaceholder()
                        }
                    },
                    hScrollBarAlwaysVisible: "renderer",
                    vScrollBarAlwaysVisible: "renderer",
                    highlightGutterLine: "renderer",
                    animatedScroll: "renderer",
                    showInvisibles: "renderer",
                    showPrintMargin: "renderer",
                    printMarginColumn: "renderer",
                    printMargin: "renderer",
                    fadeFoldWidgets: "renderer",
                    showFoldWidgets: "renderer",
                    displayIndentGuides: "renderer",
                    showGutter: "renderer",
                    fontSize: "renderer",
                    fontFamily: "renderer",
                    maxLines: "renderer",
                    minLines: "renderer",
                    scrollPastEnd: "renderer",
                    fixedWidthGutter: "renderer",
                    theme: "renderer",
                    hasCssTransforms: "renderer",
                    maxPixelHeight: "renderer",
                    useTextareaForIME: "renderer",
                    scrollSpeed: "$mouseHandler",
                    dragDelay: "$mouseHandler",
                    dragEnabled: "$mouseHandler",
                    focusTimeout: "$mouseHandler",
                    tooltipFollowsMouse: "$mouseHandler",
                    firstLineNumber: "session",
                    overwrite: "session",
                    newLineMode: "session",
                    useWorker: "session",
                    useSoftTabs: "session",
                    navigateWithinSoftTabs: "session",
                    tabSize: "session",
                    wrap: "session",
                    indentedSoftWrap: "session",
                    foldStyle: "session",
                    mode: "session"
                });
                var b = {
                    getText: function (e, t) {
                        return (Math.abs(e.selection.lead.row - t) || t + 1 + (t < 9 ? "·" : "")) + ""
                    }, getWidth: function (e, t, i) {
                        return Math.max(t.toString().length, (i.lastRow + 1).toString().length, 2) * i.characterWidth
                    }, update: function (e, t) {
                        t.renderer.$loop.schedule(t.renderer.CHANGE_GUTTER)
                    }, attach: function (e) {
                        e.renderer.$gutterLayer.$renderer = this, e.on("changeSelection", this.update), this.update(null, e)
                    }, detach: function (e) {
                        e.renderer.$gutterLayer.$renderer == this && (e.renderer.$gutterLayer.$renderer = null), e.off("changeSelection", this.update), this.update(null, e)
                    }
                };
                t.Editor = r
            }), ace.define("ace/undomanager", ["require", "exports", "module", "ace/range"], function (e, t, i) {
                "use strict";

                function n() {
                    this.$maxRev = 0, this.$fromUndo = !1, this.reset()
                }

                !function () {
                    this.addSession = function (e) {
                        this.$session = e
                    }, this.add = function (e, t, i) {
                        this.$fromUndo || e != this.$lastDelta && (this.$keepRedoStack || (this.$redoStack.length = 0), !1 !== t && this.lastDeltas || (this.lastDeltas = [], this.$undoStack.push(this.lastDeltas), e.id = this.$rev = ++this.$maxRev), "remove" != e.action && "insert" != e.action || (this.$lastDelta = e), this.lastDeltas.push(e))
                    }, this.addSelection = function (e, t) {
                        this.selections.push({value: e, rev: t || this.$rev})
                    }, this.startNewGroup = function () {
                        return this.lastDeltas = null, this.$rev
                    }, this.markIgnored = function (e, t) {
                        null == t && (t = this.$rev + 1);
                        for (var i = this.$undoStack, n = i.length; n--;) {
                            var r = i[n][0];
                            if (r.id <= e) break;
                            r.id < t && (r.ignore = !0)
                        }
                        this.lastDeltas = null
                    }, this.getSelection = function (e, t) {
                        for (var i = this.selections, n = i.length; n--;) {
                            var r = i[n];
                            if (r.rev < e) return r = t ? i[n + 1] : r
                        }
                    }, this.getRevision = function () {
                        return this.$rev
                    }, this.getDeltas = function (e, t) {
                        null == t && (t = this.$rev + 1);
                        for (var i = this.$undoStack, n = null, r = 0, o = i.length; o--;) {
                            var s = i[o][0];
                            if (s.id < t && !n && (n = o + 1), s.id <= e) {
                                r = o + 1;
                                break
                            }
                        }
                        return i.slice(r, n)
                    }, this.getChangedRanges = function (e, t) {
                        null == t && this.$rev
                    }, this.getChangedLines = function (e, t) {
                        null == t && this.$rev
                    }, this.undo = function (e, t) {
                        this.lastDeltas = null;
                        var i = this.$undoStack;
                        if (function (e, t) {
                            for (var i = t; i--;) {
                                var n = e[i];
                                if (n && !n[0].ignore) {
                                    for (; i < t - 1;) {
                                        var r = function (e, t) {
                                            for (var i = e.length; i--;) for (var n = 0; n < t.length; n++) if (!c(e[i], t[n])) {
                                                for (; i < e.length;) {
                                                    for (; n--;) c(t[n], e[i]);
                                                    n = t.length, i++
                                                }
                                                return [e, t]
                                            }
                                            return e.selectionBefore = t.selectionBefore = e.selectionAfter = t.selectionAfter = null, [t, e]
                                        }(e[i], e[i + 1]);
                                        e[i] = r[0], e[i + 1] = r[1], i++
                                    }
                                    return !0
                                }
                            }
                        }(i, i.length)) {
                            e = e || this.$session, this.$redoStackBaseRev !== this.$rev && this.$redoStack.length && (this.$redoStack = []), this.$fromUndo = !0;
                            var n = i.pop(), i = null;
                            return n && (i = e.undoChanges(n, t), this.$redoStack.push(n), this.$syncRev()), this.$fromUndo = !1, i
                        }
                    }, this.redo = function (e, t) {
                        this.lastDeltas = null, e = e || this.$session, this.$fromUndo = !0, this.$redoStackBaseRev != this.$rev && (n = this.getDeltas(this.$redoStackBaseRev, this.$rev + 1), function (e, t) {
                            for (var i = 0; i < t.length; i++) for (var n = t[i], r = 0; r < n.length; r++) !function (e, t) {
                                t = function (e) {
                                    return {start: l(e.start), end: l(e.end), action: e.action, lines: e.lines.slice()}
                                }(t);
                                for (var i = e.length; i--;) {
                                    for (var n = e[i], r = 0; r < n.length; r++) {
                                        var o = function (e, t) {
                                            var i, n, r = "insert" == e.action, o = "insert" == t.action;
                                            if (r && o) a(e.start, t.start) < 0 ? h(t, e, 1) : h(e, t, 1); else if (r && !o) 0 <= a(e.start, t.end) ? h(e, t, -1) : (a(e.start, t.start) <= 0 || h(e, s.fromPoints(t.start, e.start), -1), h(t, e, 1)); else if (!r && o) 0 <= a(t.start, e.end) ? h(t, e, -1) : (a(t.start, e.start) <= 0 || h(t, s.fromPoints(e.start, t.start), -1), h(e, t, 1)); else if (!r && !o) if (0 <= a(t.start, e.end)) h(t, e, -1); else {
                                                if (!(a(t.end, e.start) <= 0)) return a(e.start, t.start) < 0 && (e = u(i = e, t.start)), 0 < a(e.end, t.end) && (n = u(e, t.end)), d(t.end, e.start, e.end, -1), n && !i && (e.lines = n.lines, e.start = n.start, e.end = n.end, n = e), [t, i, n].filter(Boolean);
                                                h(e, t, -1)
                                            }
                                            return [t, e]
                                        }(n[r], t);
                                        t = o[0], 2 != o.length && (o[2] ? (n.splice(r + 1, 1, o[1], o[2]), r++) : o[1] || (n.splice(r, 1), r--))
                                    }
                                    n.length || e.splice(i, 1)
                                }
                            }(e, n[r])
                        }(this.$redoStack, n), this.$redoStackBaseRev = this.$rev, this.$redoStack.forEach(function (e) {
                            e[0].id = ++this.$maxRev
                        }, this));
                        var i = this.$redoStack.pop(), n = null;
                        return i && (n = e.redoChanges(i, t), this.$undoStack.push(i), this.$syncRev()), this.$fromUndo = !1, n
                    }, this.$syncRev = function () {
                        var e = this.$undoStack, e = e[e.length - 1], e = e && e[0].id || 0;
                        this.$redoStackBaseRev = e, this.$rev = e
                    }, this.reset = function () {
                        this.lastDeltas = null, this.$lastDelta = null, this.$undoStack = [], this.$redoStack = [], this.$rev = 0, this.mark = 0, this.$redoStackBaseRev = this.$rev, this.selections = []
                    }, this.canUndo = function () {
                        return 0 < this.$undoStack.length
                    }, this.canRedo = function () {
                        return 0 < this.$redoStack.length
                    }, this.bookmark = function (e) {
                        null == e && (e = this.$rev), this.mark = e
                    }, this.isAtBookmark = function () {
                        return this.$rev === this.mark
                    }, this.toJSON = function () {
                    }, this.fromJSON = function () {
                    }, this.hasUndo = this.canUndo, this.hasRedo = this.canRedo, this.isClean = this.isAtBookmark, this.markClean = this.bookmark, this.$prettyPrint = function (e) {
                        return e ? r(e) : r(this.$undoStack) + "\n---\n" + r(this.$redoStack)
                    }
                }.call(n.prototype);
                var s = e("./range").Range, a = s.comparePoints;
                s.comparePoints;

                function l(e) {
                    return {row: e.row, column: e.column}
                }

                function r(e) {
                    if (e = e || this, Array.isArray(e)) return e.map(r).join("\n");
                    var t = "";
                    return e.action ? (t = "insert" == e.action ? "+" : "-", t += "[" + e.lines + "]") : e.value && (t = Array.isArray(e.value) ? e.value.map(o).join("\n") : o(e.value)), e.start && (t += o(e)), (e.id || e.rev) && (t += "\t(" + (e.id || e.rev) + ")"), t
                }

                function o(e) {
                    return e.start.row + ":" + e.start.column + "=>" + e.end.row + ":" + e.end.column
                }

                function c(e, t) {
                    var i = "insert" == e.action, n = "insert" == t.action;
                    if (i && n) if (0 <= a(t.start, e.end)) h(t, e, -1); else {
                        if (!(a(t.start, e.start) <= 0)) return;
                        h(e, t, 1)
                    } else if (i && !n) if (0 <= a(t.start, e.end)) h(t, e, -1); else {
                        if (!(a(t.end, e.start) <= 0)) return;
                        h(e, t, -1)
                    } else if (!i && n) if (0 <= a(t.start, e.start)) h(t, e, 1); else {
                        if (!(a(t.start, e.start) <= 0)) return;
                        h(e, t, 1)
                    } else if (!i && !n) if (0 <= a(t.start, e.start)) h(t, e, 1); else {
                        if (!(a(t.end, e.start) <= 0)) return;
                        h(e, t, -1)
                    }
                    return 1
                }

                function h(e, t, i) {
                    d(e.start, t.start, t.end, i), d(e.end, t.start, t.end, i)
                }

                function d(e, t, i, n) {
                    e.row == (1 == n ? t : i).row && (e.column += n * (i.column - t.column)), e.row += n * (i.row - t.row)
                }

                function u(e, t) {
                    var i = e.lines, n = e.end;
                    e.end = l(t);
                    var r = e.end.row - e.start.row, o = i.splice(r, i.length),
                        r = r ? t.column : t.column - e.start.column;
                    return i.push(o[0].substring(0, r)), o[0] = o[0].substr(r), {
                        start: l(t),
                        end: n,
                        lines: o,
                        action: e.action
                    }
                }

                t.UndoManager = n
            }), ace.define("ace/layer/lines", ["require", "exports", "module", "ace/lib/dom"], function (e, t, i) {
                "use strict";
                var s = e("../lib/dom"), e = function (e, t) {
                    this.element = e, this.canvasHeight = t || 5e5, this.element.style.height = 2 * this.canvasHeight + "px", this.cells = [], this.cellCache = [], this.$offsetCoefficient = 0
                };
                !function () {
                    this.moveContainer = function (e) {
                        s.translate(this.element, 0, -(e.firstRowScreen * e.lineHeight % this.canvasHeight) - e.offset * this.$offsetCoefficient)
                    }, this.pageChanged = function (e, t) {
                        return Math.floor(e.firstRowScreen * e.lineHeight / this.canvasHeight) !== Math.floor(t.firstRowScreen * t.lineHeight / this.canvasHeight)
                    }, this.computeLineTop = function (e, t, i) {
                        var n = t.firstRowScreen * t.lineHeight, n = Math.floor(n / this.canvasHeight);
                        return i.documentToScreenRow(e, 0) * t.lineHeight - n * this.canvasHeight
                    }, this.computeLineHeight = function (e, t, i) {
                        return t.lineHeight * i.getRowLineCount(e)
                    }, this.getLength = function () {
                        return this.cells.length
                    }, this.get = function (e) {
                        return this.cells[e]
                    }, this.shift = function () {
                        this.$cacheCell(this.cells.shift())
                    }, this.pop = function () {
                        this.$cacheCell(this.cells.pop())
                    }, this.push = function (e) {
                        if (Array.isArray(e)) {
                            this.cells.push.apply(this.cells, e);
                            for (var t = s.createFragment(this.element), i = 0; i < e.length; i++) t.appendChild(e[i].element);
                            this.element.appendChild(t)
                        } else this.cells.push(e), this.element.appendChild(e.element)
                    }, this.unshift = function (e) {
                        if (Array.isArray(e)) {
                            this.cells.unshift.apply(this.cells, e);
                            for (var t = s.createFragment(this.element), i = 0; i < e.length; i++) t.appendChild(e[i].element);
                            this.element.firstChild ? this.element.insertBefore(t, this.element.firstChild) : this.element.appendChild(t)
                        } else this.cells.unshift(e), this.element.insertAdjacentElement("afterbegin", e.element)
                    }, this.last = function () {
                        return this.cells.length ? this.cells[this.cells.length - 1] : null
                    }, this.$cacheCell = function (e) {
                        e && (e.element.remove(), this.cellCache.push(e))
                    }, this.createCell = function (e, t, i, n) {
                        var r, o = this.cellCache.pop();
                        return o || (r = s.createElement("div"), n && n(r), this.element.appendChild(r), o = {
                            element: r,
                            text: "",
                            row: e
                        }), o.row = e, o
                    }
                }.call(e.prototype), t.Lines = e
            }), ace.define("ace/layer/gutter", ["require", "exports", "module", "ace/lib/dom", "ace/lib/oop", "ace/lib/lang", "ace/lib/event_emitter", "ace/layer/lines"], function (e, t, i) {
                "use strict";
                var f = e("../lib/dom"), n = e("../lib/oop"), o = e("../lib/lang"),
                    r = e("../lib/event_emitter").EventEmitter, s = e("./lines").Lines, e = function (e) {
                        this.element = f.createElement("div"), this.element.className = "ace_layer ace_gutter-layer", e.appendChild(this.element), this.setShowFoldWidgets(this.$showFoldWidgets), this.gutterWidth = 0, this.$annotations = [], this.$updateAnnotations = this.$updateAnnotations.bind(this), this.$lines = new s(this.element), this.$lines.$offsetCoefficient = 1
                    };

                function c(e) {
                    var t = document.createTextNode("");
                    e.appendChild(t);
                    t = f.createElement("span");
                    return e.appendChild(t), e
                }

                !function () {
                    n.implement(this, r), this.setSession = function (e) {
                        this.session && this.session.off("change", this.$updateAnnotations), (this.session = e) && e.on("change", this.$updateAnnotations)
                    }, this.addGutterDecoration = function (e, t) {
                        window.console && console.warn && console.warn("deprecated use session.addGutterDecoration"), this.session.addGutterDecoration(e, t)
                    }, this.removeGutterDecoration = function (e, t) {
                        window.console && console.warn && console.warn("deprecated use session.removeGutterDecoration"), this.session.removeGutterDecoration(e, t)
                    }, this.setAnnotations = function (e) {
                        this.$annotations = [];
                        for (var t = 0; t < e.length; t++) {
                            var i = e[t], n = i.row,
                                r = (r = this.$annotations[n]) || (this.$annotations[n] = {text: []}),
                                n = (n = i.text) ? o.escapeHTML(n) : i.html || "";
                            -1 === r.text.indexOf(n) && r.text.push(n);
                            i = i.type;
                            "error" == i ? r.className = " ace_error" : "warning" == i && " ace_error" != r.className ? r.className = " ace_warning" : "info" != i || r.className || (r.className = " ace_info")
                        }
                    }, this.$updateAnnotations = function (e) {
                        var t, i;
                        this.$annotations.length && (t = e.start.row, 0 == (i = e.end.row - t) || ("remove" == e.action ? this.$annotations.splice(t, 1 + i, null) : ((i = new Array(1 + i)).unshift(t, 1), this.$annotations.splice.apply(this.$annotations, i))))
                    }, this.update = function (e) {
                        this.config = e;
                        var t = this.session, i = e.firstRow,
                            n = Math.min(e.lastRow + e.gutterOffset, t.getLength() - 1);
                        this.oldLastRow = n, this.config = e, this.$lines.moveContainer(e), this.$updateCursorRow();
                        for (var r = t.getNextFoldLine(i), o = r ? r.start.row : 1 / 0, s = null, a = -1, l = i; ;) {
                            if (o < l && (l = r.end.row + 1, o = (r = t.getNextFoldLine(l, r)) ? r.start.row : 1 / 0), n < l) {
                                for (; this.$lines.getLength() > a + 1;) this.$lines.pop();
                                break
                            }
                            (s = this.$lines.get(++a)) ? s.row = l : (s = this.$lines.createCell(l, e, this.session, c), this.$lines.push(s)), this.$renderCell(s, e, r, l), l++
                        }
                        this._signal("afterRender"), this.$updateGutterWidth(e)
                    }, this.$updateGutterWidth = function (e) {
                        var t = this.session, i = t.gutterRenderer || this.$renderer, n = t.$firstLineNumber,
                            r = this.$lines.last() ? this.$lines.last().text : "";
                        (this.$fixedWidth || t.$useWrapMode) && (r = t.getLength() + n - 1);
                        r = i ? i.getWidth(t, r, e) : r.toString().length * e.characterWidth, e = this.$padding || this.$computePadding();
                        (r += e.left + e.right) === this.gutterWidth || isNaN(r) || (this.gutterWidth = r, this.element.parentNode.style.width = this.element.style.width = Math.ceil(this.gutterWidth) + "px", this._signal("changeGutterWidth", r))
                    }, this.$updateCursorRow = function () {
                        var e;
                        this.$highlightGutterLine && (e = this.session.selection.getCursor(), this.$cursorRow !== e.row && (this.$cursorRow = e.row))
                    }, this.updateLineHighlight = function () {
                        if (this.$highlightGutterLine) {
                            var e = this.session.selection.cursor.row;
                            if (this.$cursorRow = e, !this.$cursorCell || this.$cursorCell.row != e) {
                                this.$cursorCell && (this.$cursorCell.element.className = this.$cursorCell.element.className.replace("ace_gutter-active-line ", ""));
                                var t = this.$lines.cells;
                                this.$cursorCell = null;
                                for (var i = 0; i < t.length; i++) {
                                    var n = t[i];
                                    if (n.row >= this.$cursorRow) {
                                        if (n.row > this.$cursorRow) {
                                            var r = this.session.getFoldLine(this.$cursorRow);
                                            if (!(0 < i && r && r.start.row == t[i - 1].row)) break;
                                            n = t[i - 1]
                                        }
                                        n.element.className = "ace_gutter-active-line " + n.element.className, this.$cursorCell = n;
                                        break
                                    }
                                }
                            }
                        }
                    }, this.scrollLines = function (e) {
                        var t = this.config;
                        if (this.config = e, this.$updateCursorRow(), this.$lines.pageChanged(t, e)) return this.update(e);
                        this.$lines.moveContainer(e);
                        var i = Math.min(e.lastRow + e.gutterOffset, this.session.getLength() - 1), n = this.oldLastRow;
                        if (this.oldLastRow = i, !t || n < e.firstRow) return this.update(e);
                        if (i < t.firstRow) return this.update(e);
                        if (t.firstRow < e.firstRow) for (var r = this.session.getFoldedRowCount(t.firstRow, e.firstRow - 1); 0 < r; r--) this.$lines.shift();
                        if (i < n) for (r = this.session.getFoldedRowCount(i + 1, n); 0 < r; r--) this.$lines.pop();
                        e.firstRow < t.firstRow && this.$lines.unshift(this.$renderLines(e, e.firstRow, t.firstRow - 1)), n < i && this.$lines.push(this.$renderLines(e, n + 1, i)), this.updateLineHighlight(), this._signal("afterRender"), this.$updateGutterWidth(e)
                    }, this.$renderLines = function (e, t, i) {
                        for (var n = [], r = t, o = this.session.getNextFoldLine(r), s = o ? o.start.row : 1 / 0; ;) {
                            if (s < r && (r = o.end.row + 1, s = (o = this.session.getNextFoldLine(r, o)) ? o.start.row : 1 / 0), i < r) break;
                            var a = this.$lines.createCell(r, e, this.session, c);
                            this.$renderCell(a, e, o, r), n.push(a), r++
                        }
                        return n
                    }, this.$renderCell = function (e, t, i, n) {
                        var r, o = e.element, s = this.session, a = o.childNodes[0], l = o.childNodes[1],
                            c = s.$firstLineNumber, h = s.$breakpoints, d = s.$decorations,
                            u = s.gutterRenderer || this.$renderer, g = this.$showFoldWidgets && s.foldWidgets,
                            p = i ? i.start.row : Number.MAX_VALUE, m = "ace_gutter-cell ";
                        this.$highlightGutterLine && (n == this.$cursorRow || i && n < this.$cursorRow && p <= n && this.$cursorRow <= i.end.row) && (m += "ace_gutter-active-line ", this.$cursorCell != e && (this.$cursorCell && (this.$cursorCell.element.className = this.$cursorCell.element.className.replace("ace_gutter-active-line ", "")), this.$cursorCell = e)), h[n] && (m += h[n]), d[n] && (m += d[n]), this.$annotations[n] && (m += this.$annotations[n].className), o.className != m && (o.className = m), !g || null == (r = g[n]) && (r = g[n] = s.getFoldWidget(n)), r ? (m = "ace_fold-widget ace_" + r, "start" == r && n == p && n < i.end.row ? m += " ace_closed" : m += " ace_open", l.className != m && (l.className = m), m = t.lineHeight + "px", f.setStyle(l.style, "height", m), f.setStyle(l.style, "display", "inline-block")) : l && f.setStyle(l.style, "display", "none");
                        c = (u ? u.getText(s, n) : n + c).toString();
                        return c !== a.data && (a.data = c), f.setStyle(e.element.style, "height", this.$lines.computeLineHeight(n, t, s) + "px"), f.setStyle(e.element.style, "top", this.$lines.computeLineTop(n, t, s) + "px"), e.text = c, e
                    }, this.$fixedWidth = !1, this.$highlightGutterLine = !0, this.$renderer = "", this.setHighlightGutterLine = function (e) {
                        this.$highlightGutterLine = e
                    }, this.$showLineNumbers = !0, this.$renderer = "", this.setShowLineNumbers = function (e) {
                        this.$renderer = !e && {
                            getWidth: function () {
                                return 0
                            }, getText: function () {
                                return ""
                            }
                        }
                    }, this.getShowLineNumbers = function () {
                        return this.$showLineNumbers
                    }, this.$showFoldWidgets = !0, this.setShowFoldWidgets = function (e) {
                        e ? f.addCssClass(this.element, "ace_folding-enabled") : f.removeCssClass(this.element, "ace_folding-enabled"), this.$showFoldWidgets = e, this.$padding = null
                    }, this.getShowFoldWidgets = function () {
                        return this.$showFoldWidgets
                    }, this.$computePadding = function () {
                        if (!this.element.firstChild) return {left: 0, right: 0};
                        var e = f.computedStyle(this.element.firstChild);
                        return this.$padding = {}, this.$padding.left = (parseInt(e.borderLeftWidth) || 0) + (parseInt(e.paddingLeft) || 0) + 1, this.$padding.right = (parseInt(e.borderRightWidth) || 0) + (parseInt(e.paddingRight) || 0), this.$padding
                    }, this.getRegion = function (e) {
                        var t = this.$padding || this.$computePadding(), i = this.element.getBoundingClientRect();
                        return e.x < t.left + i.left ? "markers" : this.$showFoldWidgets && e.x > i.right - t.right ? "foldWidgets" : void 0
                    }
                }.call(e.prototype), t.Gutter = e
            }), ace.define("ace/layer/marker", ["require", "exports", "module", "ace/range", "ace/lib/dom"], function (e, t, i) {
                "use strict";
                var g = e("../range").Range, n = e("../lib/dom"), e = function (e) {
                    this.element = n.createElement("div"), this.element.className = "ace_layer ace_marker-layer", e.appendChild(this.element)
                };
                !function () {
                    this.$padding = 0, this.setPadding = function (e) {
                        this.$padding = e
                    }, this.setSession = function (e) {
                        this.session = e
                    }, this.setMarkers = function (e) {
                        this.markers = e
                    }, this.elt = function (e, t) {
                        var i = -1 != this.i && this.element.childNodes[this.i];
                        i ? this.i++ : (i = document.createElement("div"), this.element.appendChild(i), this.i = -1), i.style.cssText = t, i.className = e
                    }, this.update = function (e) {
                        if (e) {
                            var t, i;
                            for (i in this.config = e, this.i = 0, this.markers) {
                                var n, r, o, s = this.markers[i];
                                s.range ? (o = s.range.clipRows(e.firstRow, e.lastRow)).isEmpty() || (o = o.toScreenRange(this.session), s.renderer ? (n = this.$getTop(o.start.row, e), r = this.$padding + o.start.column * e.characterWidth, s.renderer(t, o, r, n, e)) : "fullLine" == s.type ? this.drawFullLineMarker(t, o, s.clazz, e) : "screenLine" == s.type ? this.drawScreenLineMarker(t, o, s.clazz, e) : o.isMultiLine() ? "text" == s.type ? this.drawTextMarker(t, o, s.clazz, e) : this.drawMultiLineMarker(t, o, s.clazz, e) : this.drawSingleLineMarker(t, o, s.clazz + " ace_start ace_br15", e)) : s.update(t, this, this.session, e)
                            }
                            if (-1 != this.i) for (; this.i < this.element.childElementCount;) this.element.removeChild(this.element.lastChild)
                        }
                    }, this.$getTop = function (e, t) {
                        return (e - t.firstRowScreen) * t.lineHeight
                    }, this.drawTextMarker = function (e, t, i, n, r) {
                        for (var o, s = this.session, a = t.start.row, l = t.end.row, c = a, h = 0, d = s.getScreenLastRowColumn(c), u = new g(c, t.start.column, c, h); c <= l; c++) u.start.row = u.end.row = c, u.start.column = c == a ? t.start.column : s.getRowWrapIndent(c), o = h, h = u.end.column = d, d = c + 1 < l ? s.getScreenLastRowColumn(c + 1) : c == l ? 0 : t.end.column, this.drawSingleLineMarker(e, u, i + (c == a ? " ace_start" : "") + " ace_br" + ((c == a || c == a + 1 && t.start.column ? 1 : 0) | (o < h ? 2 : 0) | (d < h ? 4 : 0) | (c == l ? 8 : 0)), n, c == l ? 0 : 1, r)
                    }, this.drawMultiLineMarker = function (e, t, i, n, r) {
                        var o, s = this.$padding, a = n.lineHeight, l = this.$getTop(t.start.row, n),
                            c = s + t.start.column * n.characterWidth;
                        r = r || "", this.session.$bidiHandler.isBidiRow(t.start.row) ? ((o = t.clone()).end.row = o.start.row, o.end.column = this.session.getLine(o.start.row).length, this.drawBidiSingleLineMarker(e, o, i + " ace_br1 ace_start", n, null, r)) : this.elt(i + " ace_br1 ace_start", "height:" + a + "px;right:0;top:" + l + "px;left:" + c + "px;" + (r || "")), this.session.$bidiHandler.isBidiRow(t.end.row) ? ((o = t.clone()).start.row = o.end.row, o.start.column = 0, this.drawBidiSingleLineMarker(e, o, i + " ace_br12", n, null, r)) : (l = this.$getTop(t.end.row, n), o = t.end.column * n.characterWidth, this.elt(i + " ace_br12", "height:" + a + "px;width:" + o + "px;top:" + l + "px;left:" + s + "px;" + (r || ""))), (a = (t.end.row - t.start.row - 1) * n.lineHeight) <= 0 || (l = this.$getTop(t.start.row + 1, n), t = (t.start.column ? 1 : 0) | (t.end.column ? 0 : 8), this.elt(i + (t ? " ace_br" + t : ""), "height:" + a + "px;right:0;top:" + l + "px;left:" + s + "px;" + (r || "")))
                    }, this.drawSingleLineMarker = function (e, t, i, n, r, o) {
                        if (this.session.$bidiHandler.isBidiRow(t.start.row)) return this.drawBidiSingleLineMarker(e, t, i, n, r, o);
                        var s = n.lineHeight, e = (t.end.column + (r || 0) - t.start.column) * n.characterWidth,
                            r = this.$getTop(t.start.row, n), n = this.$padding + t.start.column * n.characterWidth;
                        this.elt(i, "height:" + s + "px;width:" + e + "px;top:" + r + "px;left:" + n + "px;" + (o || ""))
                    }, this.drawBidiSingleLineMarker = function (e, t, i, n, r, o) {
                        var s = n.lineHeight, a = this.$getTop(t.start.row, n), l = this.$padding;
                        this.session.$bidiHandler.getSelections(t.start.column, t.end.column).forEach(function (e) {
                            this.elt(i, "height:" + s + "px;width:" + e.width + (r || 0) + "px;top:" + a + "px;left:" + (l + e.left) + "px;" + (o || ""))
                        }, this)
                    }, this.drawFullLineMarker = function (e, t, i, n, r) {
                        var o = this.$getTop(t.start.row, n), s = n.lineHeight;
                        t.start.row != t.end.row && (s += this.$getTop(t.end.row, n) - o), this.elt(i, "height:" + s + "px;top:" + o + "px;left:0;right:0;" + (r || ""))
                    }, this.drawScreenLineMarker = function (e, t, i, n, r) {
                        t = this.$getTop(t.start.row, n), n = n.lineHeight;
                        this.elt(i, "height:" + n + "px;top:" + t + "px;left:0;right:0;" + (r || ""))
                    }
                }.call(e.prototype), t.Marker = e
            }), ace.define("ace/layer/text", ["require", "exports", "module", "ace/lib/oop", "ace/lib/dom", "ace/lib/lang", "ace/layer/lines", "ace/lib/event_emitter"], function (e, t, i) {
                "use strict";
                var n = e("../lib/oop"), c = e("../lib/dom"), C = e("../lib/lang"), r = e("./lines").Lines,
                    o = e("../lib/event_emitter").EventEmitter, e = function (e) {
                        this.dom = c, this.element = this.dom.createElement("div"), this.element.className = "ace_layer ace_text-layer", e.appendChild(this.element), this.$updateEolChar = this.$updateEolChar.bind(this), this.$lines = new r(this.element)
                    };
                !function () {
                    n.implement(this, o), this.EOF_CHAR = "¶", this.EOL_CHAR_LF = "¬", this.EOL_CHAR_CRLF = "¤", this.EOL_CHAR = this.EOL_CHAR_LF, this.TAB_CHAR = "—", this.SPACE_CHAR = "·", this.$padding = 0, this.MAX_LINE_LENGTH = 1e4, this.$updateEolChar = function () {
                        var e = this.session.doc,
                            e = "\n" == e.getNewLineCharacter() && "windows" != e.getNewLineMode() ? this.EOL_CHAR_LF : this.EOL_CHAR_CRLF;
                        if (this.EOL_CHAR != e) return this.EOL_CHAR = e, !0
                    }, this.setPadding = function (e) {
                        this.$padding = e, this.element.style.margin = "0 " + e + "px"
                    }, this.getLineHeight = function () {
                        return this.$fontMetrics.$characterSize.height || 0
                    }, this.getCharacterWidth = function () {
                        return this.$fontMetrics.$characterSize.width || 0
                    }, this.$setFontMetrics = function (e) {
                        this.$fontMetrics = e, this.$fontMetrics.on("changeCharacterSize", function (e) {
                            this._signal("changeCharacterSize", e)
                        }.bind(this)), this.$pollSizeChanges()
                    }, this.checkForSizeChanges = function () {
                        this.$fontMetrics.checkForSizeChanges()
                    }, this.$pollSizeChanges = function () {
                        return this.$pollSizeChangesTimer = this.$fontMetrics.$pollSizeChanges()
                    }, this.setSession = function (e) {
                        (this.session = e) && this.$computeTabString()
                    }, this.showInvisibles = !1, this.showSpaces = !1, this.showTabs = !1, this.showEOL = !1, this.setShowInvisibles = function (e) {
                        return this.showInvisibles != e && ("string" == typeof (this.showInvisibles = e) ? (this.showSpaces = /tab/i.test(e), this.showTabs = /space/i.test(e), this.showEOL = /eol/i.test(e)) : this.showSpaces = this.showTabs = this.showEOL = e, this.$computeTabString(), !0)
                    }, this.displayIndentGuides = !0, this.setDisplayIndentGuides = function (e) {
                        return this.displayIndentGuides != e && (this.displayIndentGuides = e, this.$computeTabString(), !0)
                    }, this.$tabStrings = [], this.onChangeTabSize = this.$computeTabString = function () {
                        var e = this.session.getTabSize();
                        this.tabSize = e;
                        for (var t, i, n, r, o, s, a = this.$tabStrings = [0], l = 1; l < e + 1; l++) this.showTabs ? ((s = this.dom.createElement("span")).className = "ace_invisible ace_invisible_tab", s.textContent = C.stringRepeat(this.TAB_CHAR, l), a.push(s)) : a.push(this.dom.createTextNode(C.stringRepeat(" ", l), this.element));
                        this.displayIndentGuides && (this.$indentGuideRe = /\s\S| \t|\t |\s$/, t = "ace_indent-guide", i = this.showSpaces ? " ace_invisible ace_invisible_space" : "", n = this.showSpaces ? C.stringRepeat(this.SPACE_CHAR, this.tabSize) : C.stringRepeat(" ", this.tabSize), r = this.showTabs ? " ace_invisible ace_invisible_tab" : "", o = this.showTabs ? C.stringRepeat(this.TAB_CHAR, this.tabSize) : n, (s = this.dom.createElement("span")).className = t + i, s.textContent = n, this.$tabStrings[" "] = s, (s = this.dom.createElement("span")).className = t + r, s.textContent = o, this.$tabStrings["\t"] = s)
                    }, this.updateLines = function (e, t, i) {
                        if (this.config.lastRow != e.lastRow || this.config.firstRow != e.firstRow) return this.update(e);
                        this.config = e;
                        for (var n = Math.max(t, e.firstRow), r = Math.min(i, e.lastRow), o = this.element.childNodes, s = 0, a = e.firstRow; a < n; a++) {
                            if (l = this.session.getFoldLine(a)) {
                                if (l.containsRow(n)) {
                                    n = l.start.row;
                                    break
                                }
                                a = l.end.row
                            }
                            s++
                        }
                        for (var l, c = !1, a = n, h = (l = this.session.getNextFoldLine(a)) ? l.start.row : 1 / 0; ;) {
                            if (h < a && (a = l.end.row + 1, h = (l = this.session.getNextFoldLine(a, l)) ? l.start.row : 1 / 0), r < a) break;
                            var d, u = o[s++];
                            u && (this.dom.removeChildren(u), this.$renderLine(u, a, a == h && l), c && (u.style.top = this.$lines.computeLineTop(a, e, this.session) + "px"), d = e.lineHeight * this.session.getRowLength(a) + "px", u.style.height != d && (c = !0, u.style.height = d)), a++
                        }
                        if (c) for (; s < this.$lines.cells.length;) {
                            var g = this.$lines.cells[s++];
                            g.element.style.top = this.$lines.computeLineTop(g.row, e, this.session) + "px"
                        }
                    }, this.scrollLines = function (e) {
                        var t = this.config;
                        if (this.config = e, this.$lines.pageChanged(t, e)) return this.update(e);
                        this.$lines.moveContainer(e);
                        var i = e.lastRow, n = t ? t.lastRow : -1;
                        if (!t || n < e.firstRow) return this.update(e);
                        if (i < t.firstRow) return this.update(e);
                        if (!t || t.lastRow < e.firstRow) return this.update(e);
                        if (e.lastRow < t.firstRow) return this.update(e);
                        if (t.firstRow < e.firstRow) for (var r = this.session.getFoldedRowCount(t.firstRow, e.firstRow - 1); 0 < r; r--) this.$lines.shift();
                        if (t.lastRow > e.lastRow) for (r = this.session.getFoldedRowCount(e.lastRow + 1, t.lastRow); 0 < r; r--) this.$lines.pop();
                        e.firstRow < t.firstRow && this.$lines.unshift(this.$renderLinesFragment(e, e.firstRow, t.firstRow - 1)), e.lastRow > t.lastRow && this.$lines.push(this.$renderLinesFragment(e, t.lastRow + 1, e.lastRow))
                    }, this.$renderLinesFragment = function (e, t, i) {
                        for (var n = [], r = t, o = this.session.getNextFoldLine(r), s = o ? o.start.row : 1 / 0; ;) {
                            if (s < r && (r = o.end.row + 1, s = (o = this.session.getNextFoldLine(r, o)) ? o.start.row : 1 / 0), i < r) break;
                            var a = this.$lines.createCell(r, e, this.session), l = a.element;
                            this.dom.removeChildren(l), c.setStyle(l.style, "height", this.$lines.computeLineHeight(r, e, this.session) + "px"), c.setStyle(l.style, "top", this.$lines.computeLineTop(r, e, this.session) + "px"), this.$renderLine(l, r, r == s && o), this.$useLineGroups() ? l.className = "ace_line_group" : l.className = "ace_line", n.push(a), r++
                        }
                        return n
                    }, this.update = function (e) {
                        this.$lines.moveContainer(e);
                        for (var t = (this.config = e).firstRow, i = e.lastRow, n = this.$lines; n.getLength();) n.pop();
                        n.push(this.$renderLinesFragment(e, t, i))
                    }, this.$textToken = {text: !0, rparen: !0, lparen: !0}, this.$renderToken = function (e, t, i, n) {
                        for (var r, o = this, s = /(\t)|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\uFEFF\uFFF9-\uFFFC]+)|(\u3000)|([\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3001-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]|[\uD800-\uDBFF][\uDC00-\uDFFF])/g, a = this.dom.createFragment(this.element), l = 0; h = s.exec(n);) {
                            var c, h, d, u = h[1], g = h[2], p = h[3], m = h[4], f = h[5];
                            !o.showSpaces && g || (c = l != h.index ? n.slice(l, h.index) : "", l = h.index + h[0].length, c && a.appendChild(this.dom.createTextNode(c, this.element)), u ? (h = o.session.getScreenTabSize(t + h.index), a.appendChild(o.$tabStrings[h].cloneNode(!0)), t += h - 1) : g ? o.showSpaces ? ((d = this.dom.createElement("span")).className = "ace_invisible ace_invisible_space", d.textContent = C.stringRepeat(o.SPACE_CHAR, g.length), a.appendChild(d)) : a.appendChild(this.com.createTextNode(g, this.element)) : p ? ((d = this.dom.createElement("span")).className = "ace_invisible ace_invisible_space ace_invalid", d.textContent = C.stringRepeat(o.SPACE_CHAR, p.length), a.appendChild(d)) : m ? (t += 1, (d = this.dom.createElement("span")).style.width = 2 * o.config.characterWidth + "px", d.className = o.showSpaces ? "ace_cjk ace_invisible ace_invisible_space" : "ace_cjk", d.textContent = o.showSpaces ? o.SPACE_CHAR : m, a.appendChild(d)) : f && (t += 1, (d = this.dom.createElement("span")).style.width = 2 * o.config.characterWidth + "px", d.className = "ace_cjk", d.textContent = f, a.appendChild(d)))
                        }
                        return a.appendChild(this.dom.createTextNode(l ? n.slice(l) : n, this.element)), this.$textToken[i.type] ? e.appendChild(a) : (r = "ace_" + i.type.replace(/\./g, " ace_"), d = this.dom.createElement("span"), "fold" == i.type && (d.style.width = i.value.length * this.config.characterWidth + "px"), d.className = r, d.appendChild(a), e.appendChild(d)), t + n.length
                    }, this.renderIndentGuide = function (e, t, i) {
                        var n = t.search(this.$indentGuideRe);
                        if (n <= 0 || i <= n) return t;
                        if (" " == t[0]) {
                            for (var r = (n -= n % this.tabSize) / this.tabSize, o = 0; o < r; o++) e.appendChild(this.$tabStrings[" "].cloneNode(!0));
                            return t.substr(n)
                        }
                        if ("\t" != t[0]) return t;
                        for (o = 0; o < n; o++) e.appendChild(this.$tabStrings["\t"].cloneNode(!0));
                        return t.substr(n)
                    }, this.$createLineElement = function (e) {
                        var t = this.dom.createElement("div");
                        return t.className = "ace_line", t.style.height = this.config.lineHeight + "px", t
                    }, this.$renderWrappedLine = function (e, t, i) {
                        var n = 0, r = 0, o = i[0], s = 0, a = this.$createLineElement();
                        e.appendChild(a);
                        for (var l = 0; l < t.length; l++) {
                            var c = t[l], h = c.value;
                            if (0 == l && this.displayIndentGuides) {
                                if (n = h.length, !(h = this.renderIndentGuide(a, h, o))) continue;
                                n -= h.length
                            }
                            if (n + h.length < o) s = this.$renderToken(a, s, c, h), n += h.length; else {
                                for (; n + h.length >= o;) s = this.$renderToken(a, s, c, h.substring(0, o - n)), h = h.substring(o - n), n = o, a = this.$createLineElement(), e.appendChild(a), a.appendChild(this.dom.createTextNode(C.stringRepeat(" ", i.indent), this.element)), s = 0, o = i[++r] || Number.MAX_VALUE;
                                0 != h.length && (n += h.length, s = this.$renderToken(a, s, c, h))
                            }
                        }
                        i[i.length - 1] > this.MAX_LINE_LENGTH && this.$renderOverflowMessage(a, s, null, "", !0)
                    }, this.$renderSimpleLine = function (e, t) {
                        var i = 0, n = t[0], r = n.value;
                        (r = this.displayIndentGuides ? this.renderIndentGuide(e, r) : r) && (i = this.$renderToken(e, i, n, r));
                        for (var o = 1; o < t.length; o++) {
                            if (i + (r = (n = t[o]).value).length > this.MAX_LINE_LENGTH) return this.$renderOverflowMessage(e, i, n, r);
                            i = this.$renderToken(e, i, n, r)
                        }
                    }, this.$renderOverflowMessage = function (e, t, i, n, r) {
                        i && this.$renderToken(e, t, i, n.slice(0, this.MAX_LINE_LENGTH - t));
                        t = this.dom.createElement("span");
                        t.className = "ace_inline_button ace_keyword ace_toggle_wrap", t.textContent = r ? "<hide>" : "<click to see more...>", e.appendChild(t)
                    }, this.$renderLine = function (e, t, i) {
                        var n, r, o = e;
                        (n = (i = !i && 0 != i ? this.session.getFoldLine(t) : i) ? this.$getFoldLineTokens(t, i) : this.session.getTokens(t)).length ? (r = this.session.getRowSplitData(t)) && r.length ? (this.$renderWrappedLine(e, n, r), o = e.lastChild) : (o = e, this.$useLineGroups() && (o = this.$createLineElement(), e.appendChild(o)), this.$renderSimpleLine(o, n)) : this.$useLineGroups() && (o = this.$createLineElement(), e.appendChild(o)), this.showEOL && o && (i && (t = i.end.row), (i = this.dom.createElement("span")).className = "ace_invisible ace_invisible_eol", i.textContent = t == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR, o.appendChild(i))
                    }, this.$getFoldLineTokens = function (e, t) {
                        var o = this.session, s = [];
                        var a = o.getTokens(e);
                        return t.walk(function (e, t, i, n, r) {
                            null != e ? s.push({
                                type: "fold",
                                value: e
                            }) : (a = r ? o.getTokens(t) : a).length && function (e, t, i) {
                                for (var n, r = 0, o = 0; o + e[r].value.length < t;) if (o += e[r].value.length, ++r == e.length) return;
                                for (o != t && ((n = e[r].value.substring(t - o)).length > i - t && (n = n.substring(0, i - t)), s.push({
                                    type: e[r].type,
                                    value: n
                                }), o = t + n.length, r += 1); o < i && r < e.length;) (n = e[r].value).length + o > i ? s.push({
                                    type: e[r].type,
                                    value: n.substring(0, i - o)
                                }) : s.push(e[r]), o += n.length, r += 1
                            }(a, n, i)
                        }, t.end.row, this.session.getLine(t.end.row).length), s
                    }, this.$useLineGroups = function () {
                        return this.session.getUseWrapMode()
                    }, this.destroy = function () {
                    }
                }.call(e.prototype), t.Text = e
            }), ace.define("ace/layer/cursor", ["require", "exports", "module", "ace/lib/dom"], function (e, t, i) {
                "use strict";
                var c = e("../lib/dom"), e = function (e) {
                    this.element = c.createElement("div"), this.element.className = "ace_layer ace_cursor-layer", e.appendChild(this.element), this.isVisible = !1, this.isBlinking = !0, this.blinkInterval = 1e3, this.smoothBlinking = !1, this.cursors = [], this.cursor = this.addCursor(), c.addCssClass(this.element, "ace_hidden-cursors"), this.$updateCursors = this.$updateOpacity.bind(this)
                };
                !function () {
                    this.$updateOpacity = function (e) {
                        for (var t = this.cursors, i = t.length; i--;) c.setStyle(t[i].style, "opacity", e ? "" : "0")
                    }, this.$startCssAnimation = function () {
                        for (var e = this.cursors, t = e.length; t--;) e[t].style.animationDuration = this.blinkInterval + "ms";
                        setTimeout(function () {
                            c.addCssClass(this.element, "ace_animate-blinking")
                        }.bind(this))
                    }, this.$stopCssAnimation = function () {
                        c.removeCssClass(this.element, "ace_animate-blinking")
                    }, this.$padding = 0, this.setPadding = function (e) {
                        this.$padding = e
                    }, this.setSession = function (e) {
                        this.session = e
                    }, this.setBlinking = function (e) {
                        e != this.isBlinking && (this.isBlinking = e, this.restartTimer())
                    }, this.setBlinkInterval = function (e) {
                        e != this.blinkInterval && (this.blinkInterval = e, this.restartTimer())
                    }, this.setSmoothBlinking = function (e) {
                        e != this.smoothBlinking && (this.smoothBlinking = e, c.setCssClass(this.element, "ace_smooth-blinking", e), this.$updateCursors(!0), this.restartTimer())
                    }, this.addCursor = function () {
                        var e = c.createElement("div");
                        return e.className = "ace_cursor", this.element.appendChild(e), this.cursors.push(e), e
                    }, this.removeCursor = function () {
                        if (1 < this.cursors.length) {
                            var e = this.cursors.pop();
                            return e.parentNode.removeChild(e), e
                        }
                    }, this.hideCursor = function () {
                        this.isVisible = !1, c.addCssClass(this.element, "ace_hidden-cursors"), this.restartTimer()
                    }, this.showCursor = function () {
                        this.isVisible = !0, c.removeCssClass(this.element, "ace_hidden-cursors"), this.restartTimer()
                    }, this.restartTimer = function () {
                        var e, t = this.$updateCursors;
                        clearInterval(this.intervalId), clearTimeout(this.timeoutId), this.$stopCssAnimation(), this.smoothBlinking && c.removeCssClass(this.element, "ace_smooth-blinking"), t(!0), this.isBlinking && this.blinkInterval && this.isVisible ? (this.smoothBlinking && setTimeout(function () {
                            c.addCssClass(this.element, "ace_smooth-blinking")
                        }.bind(this)), c.HAS_CSS_ANIMATION ? this.$startCssAnimation() : (e = function () {
                            this.timeoutId = setTimeout(function () {
                                t(!1)
                            }, .6 * this.blinkInterval)
                        }.bind(this), this.intervalId = setInterval(function () {
                            t(!0), e()
                        }, this.blinkInterval), e())) : this.$stopCssAnimation()
                    }, this.getPixelPosition = function (e, t) {
                        if (!this.config || !this.session) return {left: 0, top: 0};
                        e = e || this.session.selection.getCursor();
                        var i = this.session.documentToScreenPosition(e);
                        return {
                            left: this.$padding + (this.session.$bidiHandler.isBidiRow(i.row, e.row) ? this.session.$bidiHandler.getPosLeft(i.column) : i.column * this.config.characterWidth),
                            top: (i.row - (t ? this.config.firstRowScreen : 0)) * this.config.lineHeight
                        }
                    }, this.isCursorInView = function (e, t) {
                        return 0 <= e.top && e.top < t.maxHeight
                    }, this.update = function (e) {
                        this.config = e;
                        for (var t = this.session.$selectionMarkers, i = 0, n = 0, i = 0, r = (t = void 0 === t || 0 === t.length ? [{cursor: null}] : t).length; i < r; i++) {
                            var o, s, a = this.getPixelPosition(t[i].cursor, !0);
                            (a.top > e.height + e.offset || a.top < 0) && 1 < i || (s = (o = this.cursors[n++] || this.addCursor()).style, this.drawCursor ? this.drawCursor(o, a, e, t[i], this.session) : this.isCursorInView(a, e) ? (c.setStyle(s, "display", "block"), c.translate(o, a.left, a.top), c.setStyle(s, "width", Math.round(e.characterWidth) + "px"), c.setStyle(s, "height", e.lineHeight + "px")) : c.setStyle(s, "display", "none"))
                        }
                        for (; this.cursors.length > n;) this.removeCursor();
                        var l = this.session.getOverwrite();
                        this.$setOverwrite(l), this.$pixelPos = a, this.restartTimer()
                    }, this.drawCursor = null, this.$setOverwrite = function (e) {
                        e != this.overwrite && ((this.overwrite = e) ? c.addCssClass(this.element, "ace_overwrite-cursors") : c.removeCssClass(this.element, "ace_overwrite-cursors"))
                    }, this.destroy = function () {
                        clearInterval(this.intervalId), clearTimeout(this.timeoutId)
                    }
                }.call(e.prototype), t.Cursor = e
            }), ace.define("ace/scrollbar", ["require", "exports", "module", "ace/lib/oop", "ace/lib/dom", "ace/lib/event", "ace/lib/event_emitter"], function (e, t, i) {
                "use strict";

                function n(e) {
                    this.element = o.createElement("div"), this.element.className = "ace_scrollbar ace_scrollbar" + this.classSuffix, this.inner = o.createElement("div"), this.inner.className = "ace_scrollbar-inner", this.inner.textContent = " ", this.element.appendChild(this.inner), e.appendChild(this.element), this.setVisible(!1), this.skipEvent = !1, s.addListener(this.element, "scroll", this.onScroll.bind(this)), s.addListener(this.element, "mousedown", s.preventDefault)
                }

                var r = e("./lib/oop"), o = e("./lib/dom"), s = e("./lib/event"),
                    a = e("./lib/event_emitter").EventEmitter;
                !function () {
                    r.implement(this, a), this.setVisible = function (e) {
                        this.element.style.display = e ? "" : "none", this.isVisible = e, this.coeff = 1
                    }
                }.call(n.prototype);

                function l(e, t) {
                    n.call(this, e), this.scrollTop = 0, this.scrollHeight = 0, t.$scrollbarWidth = this.width = o.scrollbarWidth(e.ownerDocument), this.inner.style.width = this.element.style.width = (this.width || 15) + 5 + "px", this.$minWidth = 0
                }

                r.inherits(l, n), function () {
                    this.classSuffix = "-v", this.onScroll = function () {
                        var e;
                        this.skipEvent || (this.scrollTop = this.element.scrollTop, 1 != this.coeff && (e = this.element.clientHeight / this.scrollHeight, this.scrollTop = this.scrollTop * (1 - e) / (this.coeff - e)), this._emit("scroll", {data: this.scrollTop})), this.skipEvent = !1
                    }, this.getWidth = function () {
                        return Math.max(this.isVisible ? this.width : 0, this.$minWidth || 0)
                    }, this.setHeight = function (e) {
                        this.element.style.height = e + "px"
                    }, this.setInnerHeight = this.setScrollHeight = function (e) {
                        32768 < (this.scrollHeight = e) ? (this.coeff = 32768 / e, e = 32768) : 1 != this.coeff && (this.coeff = 1), this.inner.style.height = e + "px"
                    }, this.setScrollTop = function (e) {
                        this.scrollTop != e && (this.skipEvent = !0, this.scrollTop = e, this.element.scrollTop = e * this.coeff)
                    }
                }.call(l.prototype);
                e = function (e, t) {
                    n.call(this, e), this.scrollLeft = 0, this.height = t.$scrollbarWidth, this.inner.style.height = this.element.style.height = (this.height || 15) + 5 + "px"
                };
                r.inherits(e, n), function () {
                    this.classSuffix = "-h", this.onScroll = function () {
                        this.skipEvent || (this.scrollLeft = this.element.scrollLeft, this._emit("scroll", {data: this.scrollLeft})), this.skipEvent = !1
                    }, this.getHeight = function () {
                        return this.isVisible ? this.height : 0
                    }, this.setWidth = function (e) {
                        this.element.style.width = e + "px"
                    }, this.setInnerWidth = function (e) {
                        this.inner.style.width = e + "px"
                    }, this.setScrollWidth = function (e) {
                        this.inner.style.width = e + "px"
                    }, this.setScrollLeft = function (e) {
                        this.scrollLeft != e && (this.skipEvent = !0, this.scrollLeft = this.element.scrollLeft = e)
                    }
                }.call(e.prototype), t.ScrollBar = l, t.ScrollBarV = l, t.ScrollBarH = e, t.VScrollBar = l, t.HScrollBar = e
            }), ace.define("ace/renderloop", ["require", "exports", "module", "ace/lib/event"], function (e, t, i) {
                "use strict";
                var n = e("./lib/event"), e = function (e, t) {
                    this.onRender = e, this.pending = !1, this.changes = 0, this.$recursionLimit = 2, this.window = t || window;
                    var i = this;
                    this._flush = function (e) {
                        i.pending = !1;
                        var t = i.changes;
                        t && (n.blockIdle(100), i.changes = 0, i.onRender(t)), i.changes ? i.$recursionLimit-- < 0 || i.schedule() : i.$recursionLimit = 2
                    }
                };
                !function () {
                    this.schedule = function (e) {
                        this.changes = this.changes | e, this.changes && !this.pending && (n.nextFrame(this._flush), this.pending = !0)
                    }, this.clear = function (e) {
                        var t = this.changes;
                        return this.changes = 0, t
                    }
                }.call(e.prototype), t.RenderLoop = e
            }), ace.define("ace/layer/font_metrics", ["require", "exports", "module", "ace/lib/oop", "ace/lib/dom", "ace/lib/lang", "ace/lib/event", "ace/lib/useragent", "ace/lib/event_emitter"], function (e, t, i) {
                var n = e("../lib/oop"), r = e("../lib/dom"), o = e("../lib/lang"), s = e("../lib/event"),
                    a = e("../lib/useragent"), l = e("../lib/event_emitter").EventEmitter,
                    c = "function" == typeof ResizeObserver, t = t.FontMetrics = function (e) {
                        this.el = r.createElement("div"), this.$setMeasureNodeStyles(this.el.style, !0), this.$main = r.createElement("div"), this.$setMeasureNodeStyles(this.$main.style), this.$measureNode = r.createElement("div"), this.$setMeasureNodeStyles(this.$measureNode.style), this.el.appendChild(this.$main), this.el.appendChild(this.$measureNode), e.appendChild(this.el), this.$measureNode.textContent = o.stringRepeat("X", 256), this.$characterSize = {
                            width: 0,
                            height: 0
                        }, c ? this.$addObserver() : this.checkForSizeChanges()
                    };
                !function () {
                    n.implement(this, l), this.$characterSize = {
                        width: 0,
                        height: 0
                    }, this.$setMeasureNodeStyles = function (e, t) {
                        e.width = e.height = "auto", e.left = e.top = "0px", e.visibility = "hidden", e.position = "absolute", e.whiteSpace = "pre", a.isIE < 8 ? e["font-family"] = "inherit" : e.font = "inherit", e.overflow = t ? "hidden" : "visible"
                    }, this.checkForSizeChanges = function (e) {
                        var t;
                        !(e = void 0 === e ? this.$measureSizes() : e) || this.$characterSize.width === e.width && this.$characterSize.height === e.height || (this.$measureNode.style.fontWeight = "bold", t = this.$measureSizes(), this.$measureNode.style.fontWeight = "", this.$characterSize = e, this.charSizes = Object.create(null), this.allowBoldFonts = t && t.width === e.width && t.height === e.height, this._emit("changeCharacterSize", {data: e}))
                    }, this.$addObserver = function () {
                        var t = this;
                        this.$observer = new window.ResizeObserver(function (e) {
                            t.checkForSizeChanges()
                        }), this.$observer.observe(this.$measureNode)
                    }, this.$pollSizeChanges = function () {
                        if (this.$pollSizeChangesTimer || this.$observer) return this.$pollSizeChangesTimer;
                        var t = this;
                        return this.$pollSizeChangesTimer = s.onIdle(function e() {
                            t.checkForSizeChanges(), s.onIdle(e, 500)
                        }, 500)
                    }, this.setPolling = function (e) {
                        e ? this.$pollSizeChanges() : this.$pollSizeChangesTimer && (clearInterval(this.$pollSizeChangesTimer), this.$pollSizeChangesTimer = 0)
                    }, this.$measureSizes = function (e) {
                        e = {
                            height: (e || this.$measureNode).clientHeight,
                            width: (e || this.$measureNode).clientWidth / 256
                        };
                        return 0 === e.width || 0 === e.height ? null : e
                    }, this.$measureCharWidth = function (e) {
                        return this.$main.textContent = o.stringRepeat(e, 256), this.$main.getBoundingClientRect().width / 256
                    }, this.getCharacterWidth = function (e) {
                        var t = this.charSizes[e];
                        return t = void 0 === t ? this.charSizes[e] = this.$measureCharWidth(e) / this.$characterSize.width : t
                    }, this.destroy = function () {
                        clearInterval(this.$pollSizeChangesTimer), this.$observer && this.$observer.disconnect(), this.el && this.el.parentNode && this.el.parentNode.removeChild(this.el)
                    }, this.$getZoom = function e(t) {
                        return t && t.parentElement ? (window.getComputedStyle(t).zoom || 1) * e(t.parentElement) : 1
                    }, this.$initTransformMeasureNodes = function () {
                        function e(e, t) {
                            return ["div", {style: "position: absolute;top:" + e + "px;left:" + t + "px;"}]
                        }

                        this.els = r.buildDom([e(0, 0), e(200, 0), e(0, 200), e(200, 200)], this.el)
                    }, this.transformCoordinates = function (e, t) {
                        function i(e, t, i) {
                            var n = e[1] * t[0] - e[0] * t[1];
                            return [(-t[1] * i[0] + t[0] * i[1]) / n, (+e[1] * i[0] - e[0] * i[1]) / n]
                        }

                        function n(e, t) {
                            return [e[0] - t[0], e[1] - t[1]]
                        }

                        function r(e, t) {
                            return [e[0] + t[0], e[1] + t[1]]
                        }

                        function o(e, t) {
                            return [e * t[0], e * t[1]]
                        }

                        function s(e) {
                            e = e.getBoundingClientRect();
                            return [e.left, e.top]
                        }

                        e = e && o(1 / this.$getZoom(this.el), e), this.els || this.$initTransformMeasureNodes();
                        var a = s(this.els[0]), l = s(this.els[1]), c = s(this.els[2]), h = s(this.els[3]),
                            d = i(n(h, l), n(h, c), n(r(l, c), r(h, a))), h = o(1 + d[0], n(l, a)),
                            l = o(1 + d[1], n(c, a));
                        if (t) {
                            c = d[0] * t[0] / 200 + d[1] * t[1] / 200 + 1, t = r(o(t[0], h), o(t[1], l));
                            return r(o(1 / c / 200, t), a)
                        }
                        a = n(e, a), a = i(n(h, o(d[0], a)), n(l, o(d[1], a)), a);
                        return o(200, a)
                    }
                }.call(t.prototype)
            }), ace.define("ace/virtual_renderer", ["require", "exports", "module", "ace/lib/oop", "ace/lib/dom", "ace/config", "ace/layer/gutter", "ace/layer/marker", "ace/layer/text", "ace/layer/cursor", "ace/scrollbar", "ace/scrollbar", "ace/renderloop", "ace/layer/font_metrics", "ace/lib/event_emitter", "ace/lib/useragent"], function (e, t, i) {
                "use strict";
                var n = e("./lib/oop"), a = e("./lib/dom"), o = e("./config"), r = e("./layer/gutter").Gutter,
                    s = e("./layer/marker").Marker, l = e("./layer/text").Text, c = e("./layer/cursor").Cursor,
                    h = e("./scrollbar").HScrollBar, d = e("./scrollbar").VScrollBar, u = e("./renderloop").RenderLoop,
                    g = e("./layer/font_metrics").FontMetrics, p = e("./lib/event_emitter").EventEmitter,
                    m = '.ace_br1 {border-top-left-radius    : 3px;}.ace_br2 {border-top-right-radius   : 3px;}.ace_br3 {border-top-left-radius    : 3px; border-top-right-radius:    3px;}.ace_br4 {border-bottom-right-radius: 3px;}.ace_br5 {border-top-left-radius    : 3px; border-bottom-right-radius: 3px;}.ace_br6 {border-top-right-radius   : 3px; border-bottom-right-radius: 3px;}.ace_br7 {border-top-left-radius    : 3px; border-top-right-radius:    3px; border-bottom-right-radius: 3px;}.ace_br8 {border-bottom-left-radius : 3px;}.ace_br9 {border-top-left-radius    : 3px; border-bottom-left-radius:  3px;}.ace_br10{border-top-right-radius   : 3px; border-bottom-left-radius:  3px;}.ace_br11{border-top-left-radius    : 3px; border-top-right-radius:    3px; border-bottom-left-radius:  3px;}.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius:  3px;}.ace_br13{border-top-left-radius    : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius:  3px;}.ace_br14{border-top-right-radius   : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius:  3px;}.ace_br15{border-top-left-radius    : 3px; border-top-right-radius:    3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_editor {position: relative;overflow: hidden;padding: 0;font: 12px/normal \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace;direction: ltr;text-align: left;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;cursor: text;}.ace_content {position: absolute;box-sizing: border-box;min-width: 100%;contain: style size layout;font-variant-ligatures: no-common-ligatures;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: \'\';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;contain: style size layout;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {position: absolute;top: 0;left: 0;right: 0;padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");}.ace_scrollbar {contain: strict;position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;contain: strict;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;white-space: pre!important;}.ace_text-input.ace_composition {background: transparent;color: inherit;z-index: 1000;opacity: 1;}.ace_composition_placeholder { color: transparent }.ace_composition_marker { border-bottom: 1px solid;position: absolute;border-radius: 0;margin-top: 1px;}[ace_nocontext=true] {transform: none!important;filter: none!important;clip-path: none!important;mask : none!important;contain: none!important;perspective: none!important;mix-blend-mode: initial!important;z-index: auto;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;word-wrap: normal;white-space: pre;height: 100%;width: 100%;box-sizing: border-box;pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;height: 1000000px;contain: style size layout;}.ace_text-layer {font: inherit !important;position: absolute;height: 1000000px;width: 1000000px;contain: style size layout;}.ace_text-layer > .ace_line, .ace_text-layer > .ace_line_group {contain: style size layout;position: absolute;top: 0;left: 0;right: 0;}.ace_hidpi .ace_text-layer,.ace_hidpi .ace_gutter-layer,.ace_hidpi .ace_content,.ace_hidpi .ace_gutter {contain: strict;will-change: transform;}.ace_hidpi .ace_text-layer > .ace_line, .ace_hidpi .ace_text-layer > .ace_line_group {contain: strict;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;box-sizing: border-box;border-left: 2px solid;transform: translatez(0);}.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_hasPlaceholder .ace_hidden-cursors .ace_cursor {opacity: 0;}.ace_smooth-blinking .ace_cursor {transition: opacity 0.18s;}.ace_animate-blinking .ace_cursor {animation-duration: 1000ms;animation-timing-function: step-end;animation-name: blink-ace-animate;animation-iteration-count: infinite;}.ace_animate-blinking.ace_smooth-blinking .ace_cursor {animation-duration: 1000ms;animation-timing-function: ease-in-out;animation-name: blink-ace-animate-smooth;}@keyframes blink-ace-animate {from, to { opacity: 1; }60% { opacity: 0; }}@keyframes blink-ace-animate-smooth {from, to { opacity: 1; }45% { opacity: 1; }60% { opacity: 0; }85% { opacity: 0; }}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_error_bracket {position: absolute;border-bottom: 1px solid #DE5555;border-radius: 0;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;box-sizing: border-box;}.ace_line .ace_fold {box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");}.ace_tooltip {background-color: #FFF;background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block;   }.ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");}.ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}.ace_dark .ace_fold-widget {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");}.ace_dark .ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_inline_button {border: 1px solid lightgray;display: inline-block;margin: -1px 8px;padding: 0 5px;pointer-events: auto;cursor: pointer;}.ace_inline_button:hover {border-color: gray;background: rgba(200,200,200,0.2);display: inline-block;pointer-events: auto;}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}.ace_mobile-menu {position: absolute;line-height: 1.5;border-radius: 4px;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;background: white;box-shadow: 1px 3px 2px grey;border: 1px solid #dcdcdc;color: black;}.ace_dark > .ace_mobile-menu {background: #333;color: #ccc;box-shadow: 1px 3px 2px grey;border: 1px solid #444;}.ace_mobile-button {padding: 2px;cursor: pointer;overflow: hidden;}.ace_mobile-button:hover {background-color: #eee;opacity:1;}.ace_mobile-button:active {background-color: #ddd;}.ace_placeholder {font-family: arial;transform: scale(0.9);transform-origin: left;white-space: pre;opacity: 0.7;margin: 0 10px;}',
                    f = e("./lib/useragent"), C = f.isIE;
                a.importCssString(m, "ace_editor.css");
                e = function (e, t) {
                    var i = this;
                    this.container = e || a.createElement("div"), a.addCssClass(this.container, "ace_editor"), a.HI_DPI && a.addCssClass(this.container, "ace_hidpi"), this.setTheme(t), this.$gutter = a.createElement("div"), this.$gutter.className = "ace_gutter", this.container.appendChild(this.$gutter), this.$gutter.setAttribute("aria-hidden", !0), this.scroller = a.createElement("div"), this.scroller.className = "ace_scroller", this.container.appendChild(this.scroller), this.content = a.createElement("div"), this.content.className = "ace_content", this.scroller.appendChild(this.content), this.$gutterLayer = new r(this.$gutter), this.$gutterLayer.on("changeGutterWidth", this.onGutterResize.bind(this)), this.$markerBack = new s(this.content);
                    t = this.$textLayer = new l(this.content);
                    this.canvas = t.element, this.$markerFront = new s(this.content), this.$cursorLayer = new c(this.content), this.$horizScroll = !1, this.$vScroll = !1, this.scrollBar = this.scrollBarV = new d(this.container, this), this.scrollBarH = new h(this.container, this), this.scrollBarV.on("scroll", function (e) {
                        i.$scrollAnimation || i.session.setScrollTop(e.data - i.scrollMargin.top)
                    }), this.scrollBarH.on("scroll", function (e) {
                        i.$scrollAnimation || i.session.setScrollLeft(e.data - i.scrollMargin.left)
                    }), this.scrollTop = 0, this.scrollLeft = 0, this.cursorPos = {
                        row: 0,
                        column: 0
                    }, this.$fontMetrics = new g(this.container), this.$textLayer.$setFontMetrics(this.$fontMetrics), this.$textLayer.on("changeCharacterSize", function (e) {
                        i.updateCharacterSize(), i.onResize(!0, i.gutterWidth, i.$size.width, i.$size.height), i._signal("changeCharacterSize", e)
                    }), this.$size = {
                        width: 0,
                        height: 0,
                        scrollerHeight: 0,
                        scrollerWidth: 0,
                        $dirty: !0
                    }, this.layerConfig = {
                        width: 1,
                        padding: 0,
                        firstRow: 0,
                        firstRowScreen: 0,
                        lastRow: 0,
                        lineHeight: 0,
                        characterWidth: 0,
                        minHeight: 1,
                        maxHeight: 1,
                        offset: 0,
                        height: 1,
                        gutterOffset: 1
                    }, this.scrollMargin = {left: 0, right: 0, top: 0, bottom: 0, v: 0, h: 0}, this.margin = {
                        left: 0,
                        right: 0,
                        top: 0,
                        bottom: 0,
                        v: 0,
                        h: 0
                    }, this.$keepTextAreaAtCursor = !f.isIOS, this.$loop = new u(this.$renderChanges.bind(this), this.container.ownerDocument.defaultView), this.$loop.schedule(this.CHANGE_FULL), this.updateCharacterSize(), this.setPadding(4), o.resetOptions(this), o._signal("renderer", this)
                };
                !function () {
                    this.CHANGE_CURSOR = 1, this.CHANGE_MARKER = 2, this.CHANGE_GUTTER = 4, this.CHANGE_SCROLL = 8, this.CHANGE_LINES = 16, this.CHANGE_TEXT = 32, this.CHANGE_SIZE = 64, this.CHANGE_MARKER_BACK = 128, this.CHANGE_MARKER_FRONT = 256, this.CHANGE_FULL = 512, this.CHANGE_H_SCROLL = 1024, n.implement(this, p), this.updateCharacterSize = function () {
                        this.$textLayer.allowBoldFonts != this.$allowBoldFonts && (this.$allowBoldFonts = this.$textLayer.allowBoldFonts, this.setStyle("ace_nobold", !this.$allowBoldFonts)), this.layerConfig.characterWidth = this.characterWidth = this.$textLayer.getCharacterWidth(), this.layerConfig.lineHeight = this.lineHeight = this.$textLayer.getLineHeight(), this.$updatePrintMargin(), a.setStyle(this.scroller.style, "line-height", this.lineHeight + "px")
                    }, this.setSession = function (e) {
                        this.session && this.session.doc.off("changeNewLineMode", this.onChangeNewLineMode), (this.session = e) && this.scrollMargin.top && e.getScrollTop() <= 0 && e.setScrollTop(-this.scrollMargin.top), this.$cursorLayer.setSession(e), this.$markerBack.setSession(e), this.$markerFront.setSession(e), this.$gutterLayer.setSession(e), this.$textLayer.setSession(e), e && (this.$loop.schedule(this.CHANGE_FULL), this.session.$setFontMetrics(this.$fontMetrics), this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null, this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this), this.onChangeNewLineMode(), this.session.doc.on("changeNewLineMode", this.onChangeNewLineMode))
                    }, this.updateLines = function (e, t, i) {
                        if (void 0 === t && (t = 1 / 0), this.$changedLines ? (this.$changedLines.firstRow > e && (this.$changedLines.firstRow = e), this.$changedLines.lastRow < t && (this.$changedLines.lastRow = t)) : this.$changedLines = {
                            firstRow: e,
                            lastRow: t
                        }, this.$changedLines.lastRow < this.layerConfig.firstRow) {
                            if (!i) return;
                            this.$changedLines.lastRow = this.layerConfig.lastRow
                        }
                        this.$changedLines.firstRow > this.layerConfig.lastRow || this.$loop.schedule(this.CHANGE_LINES)
                    }, this.onChangeNewLineMode = function () {
                        this.$loop.schedule(this.CHANGE_TEXT), this.$textLayer.$updateEolChar(), this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR)
                    }, this.onChangeTabSize = function () {
                        this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER), this.$textLayer.onChangeTabSize()
                    }, this.updateText = function () {
                        this.$loop.schedule(this.CHANGE_TEXT)
                    }, this.updateFull = function (e) {
                        e ? this.$renderChanges(this.CHANGE_FULL, !0) : this.$loop.schedule(this.CHANGE_FULL)
                    }, this.updateFontSize = function () {
                        this.$textLayer.checkForSizeChanges()
                    }, this.$changes = 0, this.$updateSizeAsync = function () {
                        this.$loop.pending ? this.$size.$dirty = !0 : this.onResize()
                    }, this.onResize = function (e, t, i, n) {
                        if (!(2 < this.resizing)) {
                            0 < this.resizing ? this.resizing++ : this.resizing = e ? 1 : 0;
                            var r = this.container;
                            n = n || (r.clientHeight || r.scrollHeight), i = i || (r.clientWidth || r.scrollWidth);
                            t = this.$updateCachedSize(e, t, i, n);
                            if (!this.$size.scrollerHeight || !i && !n) return this.resizing = 0;
                            e && (this.$gutterLayer.$padding = null), e ? this.$renderChanges(t | this.$changes, !0) : this.$loop.schedule(t | this.$changes), this.resizing && (this.resizing = 0), this.scrollBarV.scrollLeft = this.scrollBarV.scrollTop = null
                        }
                    }, this.$updateCachedSize = function (e, t, i, n) {
                        n -= this.$extraHeight || 0;
                        var r = 0, o = this.$size, s = {
                            width: o.width,
                            height: o.height,
                            scrollerHeight: o.scrollerHeight,
                            scrollerWidth: o.scrollerWidth
                        };
                        return n && (e || o.height != n) && (o.height = n, r |= this.CHANGE_SIZE, o.scrollerHeight = o.height, this.$horizScroll && (o.scrollerHeight -= this.scrollBarH.getHeight()), this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + "px", r |= this.CHANGE_SCROLL), i && (e || o.width != i) && (r |= this.CHANGE_SIZE, o.width = i, null == t && (t = this.$showGutter ? this.$gutter.offsetWidth : 0), this.gutterWidth = t, a.setStyle(this.scrollBarH.element.style, "left", t + "px"), a.setStyle(this.scroller.style, "left", t + this.margin.left + "px"), o.scrollerWidth = Math.max(0, i - t - this.scrollBarV.getWidth() - this.margin.h), a.setStyle(this.$gutter.style, "left", this.margin.left + "px"), t = this.scrollBarV.getWidth() + "px", a.setStyle(this.scrollBarH.element.style, "right", t), a.setStyle(this.scroller.style, "right", t), a.setStyle(this.scroller.style, "bottom", this.scrollBarH.getHeight()), (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || e) && (r |= this.CHANGE_FULL)), o.$dirty = !i || !n, r && this._signal("resize", s), r
                    }, this.onGutterResize = function (e) {
                        e = this.$showGutter ? e : 0;
                        e != this.gutterWidth && (this.$changes |= this.$updateCachedSize(!0, e, this.$size.width, this.$size.height)), this.session.getUseWrapMode() && this.adjustWrapLimit() || this.$size.$dirty ? this.$loop.schedule(this.CHANGE_FULL) : this.$computeLayerConfig()
                    }, this.adjustWrapLimit = function () {
                        var e = this.$size.scrollerWidth - 2 * this.$padding, e = Math.floor(e / this.characterWidth);
                        return this.session.adjustWrapLimit(e, this.$showPrintMargin && this.$printMarginColumn)
                    }, this.setAnimatedScroll = function (e) {
                        this.setOption("animatedScroll", e)
                    }, this.getAnimatedScroll = function () {
                        return this.$animatedScroll
                    }, this.setShowInvisibles = function (e) {
                        this.setOption("showInvisibles", e), this.session.$bidiHandler.setShowInvisibles(e)
                    }, this.getShowInvisibles = function () {
                        return this.getOption("showInvisibles")
                    }, this.getDisplayIndentGuides = function () {
                        return this.getOption("displayIndentGuides")
                    }, this.setDisplayIndentGuides = function (e) {
                        this.setOption("displayIndentGuides", e)
                    }, this.setShowPrintMargin = function (e) {
                        this.setOption("showPrintMargin", e)
                    }, this.getShowPrintMargin = function () {
                        return this.getOption("showPrintMargin")
                    }, this.setPrintMarginColumn = function (e) {
                        this.setOption("printMarginColumn", e)
                    }, this.getPrintMarginColumn = function () {
                        return this.getOption("printMarginColumn")
                    }, this.getShowGutter = function () {
                        return this.getOption("showGutter")
                    }, this.setShowGutter = function (e) {
                        return this.setOption("showGutter", e)
                    }, this.getFadeFoldWidgets = function () {
                        return this.getOption("fadeFoldWidgets")
                    }, this.setFadeFoldWidgets = function (e) {
                        this.setOption("fadeFoldWidgets", e)
                    }, this.setHighlightGutterLine = function (e) {
                        this.setOption("highlightGutterLine", e)
                    }, this.getHighlightGutterLine = function () {
                        return this.getOption("highlightGutterLine")
                    }, this.$updatePrintMargin = function () {
                        var e;
                        (this.$showPrintMargin || this.$printMarginEl) && (this.$printMarginEl || ((e = a.createElement("div")).className = "ace_layer ace_print-margin-layer", this.$printMarginEl = a.createElement("div"), this.$printMarginEl.className = "ace_print-margin", e.appendChild(this.$printMarginEl), this.content.insertBefore(e, this.content.firstChild)), (e = this.$printMarginEl.style).left = Math.round(this.characterWidth * this.$printMarginColumn + this.$padding) + "px", e.visibility = this.$showPrintMargin ? "visible" : "hidden", this.session && -1 == this.session.$wrap && this.adjustWrapLimit())
                    }, this.getContainerElement = function () {
                        return this.container
                    }, this.getMouseEventTarget = function () {
                        return this.scroller
                    }, this.getTextAreaContainer = function () {
                        return this.container
                    }, this.$moveTextAreaToCursor = function () {
                        var e, t, i, n, r, o, s;
                        this.$isMousePressed || (e = this.textarea.style, o = this.$composition, this.$keepTextAreaAtCursor || o ? (s = this.$cursorLayer.$pixelPos) && (o && o.markerRange && (s = this.$cursorLayer.getPixelPosition(o.markerRange.start, !0)), r = this.layerConfig, t = s.top, i = s.left, t -= r.offset, n = o && o.useTextareaForIME ? this.lineHeight : C ? 0 : 1, t < 0 || t > r.height - n ? a.translate(this.textarea, 0, 0) : (s = 1, r = this.$size.height - n, o ? o.useTextareaForIME ? (o = this.textarea.value, s = this.characterWidth * this.session.$getStringScreenWidth(o)[0]) : t += this.lineHeight + 2 : t += this.lineHeight, (i -= this.scrollLeft) > this.$size.scrollerWidth - s && (i = this.$size.scrollerWidth - s), i += this.gutterWidth + this.margin.left, a.setStyle(e, "height", n + "px"), a.setStyle(e, "width", s + "px"), a.translate(this.textarea, Math.min(i, this.$size.scrollerWidth - s), Math.min(t, r)))) : a.translate(this.textarea, -100, 0))
                    }, this.getFirstVisibleRow = function () {
                        return this.layerConfig.firstRow
                    }, this.getFirstFullyVisibleRow = function () {
                        return this.layerConfig.firstRow + (0 === this.layerConfig.offset ? 0 : 1)
                    }, this.getLastFullyVisibleRow = function () {
                        var e = this.layerConfig, t = e.lastRow;
                        return this.session.documentToScreenRow(t, 0) * e.lineHeight - this.session.getScrollTop() > e.height - e.lineHeight ? t - 1 : t
                    }, this.getLastVisibleRow = function () {
                        return this.layerConfig.lastRow
                    }, this.$padding = null, this.setPadding = function (e) {
                        this.$padding = e, this.$textLayer.setPadding(e), this.$cursorLayer.setPadding(e), this.$markerFront.setPadding(e), this.$markerBack.setPadding(e), this.$loop.schedule(this.CHANGE_FULL), this.$updatePrintMargin()
                    }, this.setScrollMargin = function (e, t, i, n) {
                        var r = this.scrollMargin;
                        r.top = 0 | e, r.bottom = 0 | t, r.right = 0 | n, r.left = 0 | i, r.v = r.top + r.bottom, r.h = r.left + r.right, r.top && this.scrollTop <= 0 && this.session && this.session.setScrollTop(-r.top), this.updateFull()
                    }, this.setMargin = function (e, t, i, n) {
                        var r = this.margin;
                        r.top = 0 | e, r.bottom = 0 | t, r.right = 0 | n, r.left = 0 | i, r.v = r.top + r.bottom, r.h = r.left + r.right, this.$updateCachedSize(!0, this.gutterWidth, this.$size.width, this.$size.height), this.updateFull()
                    }, this.getHScrollBarAlwaysVisible = function () {
                        return this.$hScrollBarAlwaysVisible
                    }, this.setHScrollBarAlwaysVisible = function (e) {
                        this.setOption("hScrollBarAlwaysVisible", e)
                    }, this.getVScrollBarAlwaysVisible = function () {
                        return this.$vScrollBarAlwaysVisible
                    }, this.setVScrollBarAlwaysVisible = function (e) {
                        this.setOption("vScrollBarAlwaysVisible", e)
                    }, this.$updateScrollBarV = function () {
                        var e = this.layerConfig.maxHeight, t = this.$size.scrollerHeight;
                        !this.$maxLines && this.$scrollPastEnd && (e -= (t - this.lineHeight) * this.$scrollPastEnd, this.scrollTop > e - t && (e = this.scrollTop + t, this.scrollBarV.scrollTop = null)), this.scrollBarV.setScrollHeight(e + this.scrollMargin.v), this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top)
                    }, this.$updateScrollBarH = function () {
                        this.scrollBarH.setScrollWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h), this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left)
                    }, this.$frozen = !1, this.freeze = function () {
                        this.$frozen = !0
                    }, this.unfreeze = function () {
                        this.$frozen = !1
                    }, this.$renderChanges = function (e, t) {
                        if (this.$changes && (e |= this.$changes, this.$changes = 0), this.session && this.container.offsetWidth && !this.$frozen && (e || t)) {
                            if (this.$size.$dirty) return this.$changes |= e, this.onResize(!0);
                            this.lineHeight || this.$textLayer.checkForSizeChanges(), this._signal("beforeRender", e), this.session && this.session.$bidiHandler && this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics);
                            var i, n = this.layerConfig;
                            return ((e & this.CHANGE_FULL || e & this.CHANGE_SIZE || e & this.CHANGE_TEXT || e & this.CHANGE_LINES || e & this.CHANGE_SCROLL || e & this.CHANGE_H_SCROLL) && (e |= this.$computeLayerConfig() | this.$loop.clear(), n.firstRow == this.layerConfig.firstRow || n.firstRowScreen != this.layerConfig.firstRowScreen || 0 < (i = this.scrollTop + (n.firstRow - this.layerConfig.firstRow) * this.lineHeight) && (this.scrollTop = i, e |= this.CHANGE_SCROLL, e |= this.$computeLayerConfig() | this.$loop.clear()), n = this.layerConfig, this.$updateScrollBarV(), e & this.CHANGE_H_SCROLL && this.$updateScrollBarH(), a.translate(this.content, -this.scrollLeft, -n.offset), t = n.width + 2 * this.$padding + "px", i = n.minHeight + "px", a.setStyle(this.content.style, "width", t), a.setStyle(this.content.style, "height", i)), e & this.CHANGE_H_SCROLL && (a.translate(this.content, -this.scrollLeft, -n.offset), this.scroller.className = this.scrollLeft <= 0 ? "ace_scroller" : "ace_scroller ace_scroll-left"), e & this.CHANGE_FULL) ? (this.$changedLines = null, this.$textLayer.update(n), this.$showGutter && this.$gutterLayer.update(n), this.$markerBack.update(n), this.$markerFront.update(n), this.$cursorLayer.update(n), this.$moveTextAreaToCursor(), void this._signal("afterRender", e)) : (e & this.CHANGE_SCROLL ? (this.$changedLines = null, e & this.CHANGE_TEXT || e & this.CHANGE_LINES ? this.$textLayer.update(n) : this.$textLayer.scrollLines(n), this.$showGutter && (e & this.CHANGE_GUTTER || e & this.CHANGE_LINES ? this.$gutterLayer.update(n) : this.$gutterLayer.scrollLines(n)), this.$markerBack.update(n), this.$markerFront.update(n), this.$cursorLayer.update(n), this.$moveTextAreaToCursor()) : (e & this.CHANGE_TEXT ? (this.$changedLines = null, this.$textLayer.update(n), this.$showGutter && this.$gutterLayer.update(n)) : e & this.CHANGE_LINES ? (this.$updateLines() || e & this.CHANGE_GUTTER && this.$showGutter) && this.$gutterLayer.update(n) : e & this.CHANGE_TEXT || e & this.CHANGE_GUTTER ? this.$showGutter && this.$gutterLayer.update(n) : e & this.CHANGE_CURSOR && this.$highlightGutterLine && this.$gutterLayer.updateLineHighlight(n), e & this.CHANGE_CURSOR && (this.$cursorLayer.update(n), this.$moveTextAreaToCursor()), e & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT) && this.$markerFront.update(n), e & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK) && this.$markerBack.update(n)), void this._signal("afterRender", e))
                        }
                        this.$changes |= e
                    }, this.$autosize = function () {
                        var e = this.session.getScreenLength() * this.lineHeight, t = this.$maxLines * this.lineHeight,
                            i = Math.min(t, Math.max((this.$minLines || 1) * this.lineHeight, e)) + this.scrollMargin.v + (this.$extraHeight || 0);
                        this.$horizScroll && (i += this.scrollBarH.getHeight());
                        e = !((i = this.$maxPixelHeight && i > this.$maxPixelHeight ? this.$maxPixelHeight : i) <= 2 * this.lineHeight) && t < e;
                        i == this.desiredHeight && this.$size.height == this.desiredHeight && e == this.$vScroll || (e != this.$vScroll && (this.$vScroll = e, this.scrollBarV.setVisible(e)), e = this.container.clientWidth, this.container.style.height = i + "px", this.$updateCachedSize(!0, this.$gutterWidth, e, i), this.desiredHeight = i, this._signal("autosize"))
                    }, this.$computeLayerConfig = function () {
                        var e = this.session, t = this.$size, i = t.height <= 2 * this.lineHeight,
                            n = this.session.getScreenLength() * this.lineHeight, r = this.$getLongestLine(),
                            o = !i && (this.$hScrollBarAlwaysVisible || t.scrollerWidth - r - 2 * this.$padding < 0),
                            s = this.$horizScroll !== o;
                        s && (this.$horizScroll = o, this.scrollBarH.setVisible(o));
                        var a = this.$vScroll;
                        this.$maxLines && 1 < this.lineHeight && this.$autosize();
                        var l = t.scrollerHeight + this.lineHeight,
                            c = !this.$maxLines && this.$scrollPastEnd ? (t.scrollerHeight - this.lineHeight) * this.$scrollPastEnd : 0;
                        n += c;
                        var h = this.scrollMargin;
                        this.session.setScrollTop(Math.max(-h.top, Math.min(this.scrollTop, n - t.scrollerHeight + h.bottom))), this.session.setScrollLeft(Math.max(-h.left, Math.min(this.scrollLeft, r + 2 * this.$padding - t.scrollerWidth + h.right)));
                        var d = !i && (this.$vScrollBarAlwaysVisible || t.scrollerHeight - n + c < 0 || this.scrollTop > h.top),
                            u = a !== d;
                        u && (this.$vScroll = d, this.scrollBarV.setVisible(d));
                        var o = this.scrollTop % this.lineHeight, i = Math.ceil(l / this.lineHeight) - 1,
                            h = (c = Math.max(0, Math.round((this.scrollTop - o) / this.lineHeight))) + i,
                            a = this.lineHeight, c = e.screenToDocumentRow(c, 0), d = e.getFoldLine(c);
                        d && (c = d.start.row);
                        i = e.documentToScreenRow(c, 0), d = e.getRowLength(c) * a, h = Math.min(e.screenToDocumentRow(h, 0), e.getLength() - 1), l = t.scrollerHeight + e.getRowLength(h) * a + d, o = this.scrollTop - i * a, d = 0;
                        return this.layerConfig.width == r && !s || (d = this.CHANGE_H_SCROLL), (s || u) && (d |= this.$updateCachedSize(!0, this.gutterWidth, t.width, t.height), this._signal("scrollbarVisibilityChanged"), u && (r = this.$getLongestLine())), this.layerConfig = {
                            width: r,
                            padding: this.$padding,
                            firstRow: c,
                            firstRowScreen: i,
                            lastRow: h,
                            lineHeight: a,
                            characterWidth: this.characterWidth,
                            minHeight: l,
                            maxHeight: n,
                            offset: o,
                            gutterOffset: a ? Math.max(0, Math.ceil((o + t.height - t.scrollerHeight) / a)) : 0,
                            height: this.$size.scrollerHeight
                        }, this.session.$bidiHandler && this.session.$bidiHandler.setContentWidth(r - this.$padding), d
                    }, this.$updateLines = function () {
                        if (this.$changedLines) {
                            var e = this.$changedLines.firstRow, t = this.$changedLines.lastRow;
                            this.$changedLines = null;
                            var i = this.layerConfig;
                            if (!(e > i.lastRow + 1 || t < i.firstRow)) return t === 1 / 0 ? (this.$showGutter && this.$gutterLayer.update(i), void this.$textLayer.update(i)) : (this.$textLayer.updateLines(i, e, t), !0)
                        }
                    }, this.$getLongestLine = function () {
                        var e = this.session.getScreenWidth();
                        return this.showInvisibles && !this.session.$useWrapMode && (e += 1), this.$textLayer && e > this.$textLayer.MAX_LINE_LENGTH && (e = this.$textLayer.MAX_LINE_LENGTH + 30), Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(e * this.characterWidth))
                    }, this.updateFrontMarkers = function () {
                        this.$markerFront.setMarkers(this.session.getMarkers(!0)), this.$loop.schedule(this.CHANGE_MARKER_FRONT)
                    }, this.updateBackMarkers = function () {
                        this.$markerBack.setMarkers(this.session.getMarkers()), this.$loop.schedule(this.CHANGE_MARKER_BACK)
                    }, this.addGutterDecoration = function (e, t) {
                        this.$gutterLayer.addGutterDecoration(e, t)
                    }, this.removeGutterDecoration = function (e, t) {
                        this.$gutterLayer.removeGutterDecoration(e, t)
                    }, this.updateBreakpoints = function (e) {
                        this.$loop.schedule(this.CHANGE_GUTTER)
                    }, this.setAnnotations = function (e) {
                        this.$gutterLayer.setAnnotations(e), this.$loop.schedule(this.CHANGE_GUTTER)
                    }, this.updateCursor = function () {
                        this.$loop.schedule(this.CHANGE_CURSOR)
                    }, this.hideCursor = function () {
                        this.$cursorLayer.hideCursor()
                    }, this.showCursor = function () {
                        this.$cursorLayer.showCursor()
                    }, this.scrollSelectionIntoView = function (e, t, i) {
                        this.scrollCursorIntoView(e, i), this.scrollCursorIntoView(t, i)
                    }, this.scrollCursorIntoView = function (e, t, i) {
                        var n, r, o;
                        0 !== this.$size.scrollerHeight && (n = (o = this.$cursorLayer.getPixelPosition(e)).left, r = o.top, e = i && i.top || 0, o = i && i.bottom || 0, r < (i = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop) + e ? (t && i + e > r + this.lineHeight && (r -= t * this.$size.scrollerHeight), 0 === r && (r = -this.scrollMargin.top), this.session.setScrollTop(r)) : i + this.$size.scrollerHeight - o < r + this.lineHeight && (t && i + this.$size.scrollerHeight - o < r - this.lineHeight && (r += t * this.$size.scrollerHeight), this.session.setScrollTop(r + this.lineHeight + o - this.$size.scrollerHeight)), n < (o = this.scrollLeft) ? (n < this.$padding + 2 * this.layerConfig.characterWidth && (n = -this.scrollMargin.left), this.session.setScrollLeft(n)) : o + this.$size.scrollerWidth < n + this.characterWidth ? this.session.setScrollLeft(Math.round(n + this.characterWidth - this.$size.scrollerWidth)) : o <= this.$padding && n - o < this.characterWidth && this.session.setScrollLeft(0))
                    }, this.getScrollTop = function () {
                        return this.session.getScrollTop()
                    }, this.getScrollLeft = function () {
                        return this.session.getScrollLeft()
                    }, this.getScrollTopRow = function () {
                        return this.scrollTop / this.lineHeight
                    }, this.getScrollBottomRow = function () {
                        return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1)
                    }, this.scrollToRow = function (e) {
                        this.session.setScrollTop(e * this.lineHeight)
                    }, this.alignCursor = function (e, t) {
                        var i = this.$cursorLayer.getPixelPosition(e = "number" == typeof e ? {row: e, column: 0} : e),
                            e = this.$size.scrollerHeight - this.lineHeight, t = i.top - e * (t || 0);
                        return this.session.setScrollTop(t), t
                    }, this.STEPS = 8, this.$calcSteps = function (e, t) {
                        for (var i, n, r = 0, o = this.STEPS, s = [], r = 0; r < o; ++r) s.push((i = r / this.STEPS, (t - (n = e)) * (Math.pow(i - 1, 3) + 1) + n));
                        return s
                    }, this.scrollToLine = function (e, t, i, n) {
                        e = this.$cursorLayer.getPixelPosition({row: e, column: 0}).top;
                        t && (e -= this.$size.scrollerHeight / 2);
                        t = this.scrollTop;
                        this.session.setScrollTop(e), !1 !== i && this.animateScrolling(t, n)
                    }, this.animateScrolling = function (e, t) {
                        var i = this.scrollTop;
                        if (this.$animatedScroll) {
                            var n = this;
                            if (e != i) {
                                if (this.$scrollAnimation) {
                                    var r = this.$scrollAnimation.steps;
                                    if (r.length && (e = r[0]) == i) return
                                }
                                var o = n.$calcSteps(e, i);
                                this.$scrollAnimation = {
                                    from: e,
                                    to: i,
                                    steps: o
                                }, clearInterval(this.$timer), n.session.setScrollTop(o.shift()), n.session.$scrollTop = i, this.$timer = setInterval(function () {
                                    return n.session ? void (o.length ? (n.session.setScrollTop(o.shift()), n.session.$scrollTop = i) : null != i ? (n.session.$scrollTop = -1, n.session.setScrollTop(i), i = null) : (n.$timer = clearInterval(n.$timer), n.$scrollAnimation = null, t && t())) : clearInterval(n.$timer)
                                }, 10)
                            }
                        }
                    }, this.scrollToY = function (e) {
                        this.scrollTop !== e && (this.$loop.schedule(this.CHANGE_SCROLL), this.scrollTop = e)
                    }, this.scrollToX = function (e) {
                        this.scrollLeft !== e && (this.scrollLeft = e), this.$loop.schedule(this.CHANGE_H_SCROLL)
                    }, this.scrollTo = function (e, t) {
                        this.session.setScrollTop(t), this.session.setScrollLeft(t)
                    }, this.scrollBy = function (e, t) {
                        t && this.session.setScrollTop(this.session.getScrollTop() + t), e && this.session.setScrollLeft(this.session.getScrollLeft() + e)
                    }, this.isScrollableBy = function (e, t) {
                        return t < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top || (0 < t && this.session.getScrollTop() + this.$size.scrollerHeight - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom || (e < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left || (0 < e && this.session.getScrollLeft() + this.$size.scrollerWidth - this.layerConfig.width < -1 + this.scrollMargin.right || void 0)))
                    }, this.pixelToScreenCoordinates = function (e, t) {
                        this.$hasCssTransforms ? (n = {
                            top: 0,
                            left: 0
                        }, e = (i = this.$fontMetrics.transformCoordinates([e, t]))[1] - this.gutterWidth - this.margin.left, t = i[0]) : n = this.scroller.getBoundingClientRect();
                        var i = e + this.scrollLeft - n.left - this.$padding, e = i / this.characterWidth,
                            t = Math.floor((t + this.scrollTop - n.top) / this.lineHeight),
                            n = this.$blockCursor ? Math.floor(e) : Math.round(e);
                        return {row: t, column: n, side: 0 < e - n ? 1 : -1, offsetX: i}
                    }, this.screenToTextCoordinates = function (e, t) {
                        this.$hasCssTransforms ? (n = {
                            top: 0,
                            left: 0
                        }, e = (i = this.$fontMetrics.transformCoordinates([e, t]))[1] - this.gutterWidth - this.margin.left, t = i[0]) : n = this.scroller.getBoundingClientRect();
                        var i = e + this.scrollLeft - n.left - this.$padding, e = i / this.characterWidth,
                            e = this.$blockCursor ? Math.floor(e) : Math.round(e),
                            n = Math.floor((t + this.scrollTop - n.top) / this.lineHeight);
                        return this.session.screenToDocumentPosition(n, Math.max(e, 0), i)
                    }, this.textToScreenCoordinates = function (e, t) {
                        var i = this.scroller.getBoundingClientRect(), t = this.session.documentToScreenPosition(e, t),
                            e = this.$padding + (this.session.$bidiHandler.isBidiRow(t.row, e) ? this.session.$bidiHandler.getPosLeft(t.column) : Math.round(t.column * this.characterWidth)),
                            t = t.row * this.lineHeight;
                        return {pageX: i.left + e - this.scrollLeft, pageY: i.top + t - this.scrollTop}
                    }, this.visualizeFocus = function () {
                        a.addCssClass(this.container, "ace_focus")
                    }, this.visualizeBlur = function () {
                        a.removeCssClass(this.container, "ace_focus")
                    }, this.showComposition = function (e) {
                        (this.$composition = e).cssText || (e.cssText = this.textarea.style.cssText), null == e.useTextareaForIME && (e.useTextareaForIME = this.$useTextareaForIME), this.$useTextareaForIME ? (a.addCssClass(this.textarea, "ace_composition"), this.textarea.style.cssText = "", this.$moveTextAreaToCursor(), this.$cursorLayer.element.style.display = "none") : e.markerId = this.session.addMarker(e.markerRange, "ace_composition_marker", "text")
                    },this.setCompositionText = function (e) {
                        var t = this.session.selection.cursor;
                        this.addToken(e, "composition_placeholder", t.row, t.column), this.$moveTextAreaToCursor()
                    },this.hideComposition = function () {
                        var e;
                        this.$composition && (this.$composition.markerId && this.session.removeMarker(this.$composition.markerId), a.removeCssClass(this.textarea, "ace_composition"), this.textarea.style.cssText = this.$composition.cssText, e = this.session.selection.cursor, this.removeExtraToken(e.row, e.column), this.$composition = null, this.$cursorLayer.element.style.display = "")
                    },this.addToken = function (e, t, i, n) {
                        var r = this.session;
                        r.bgTokenizer.lines[i] = null;
                        var o = {type: t, value: e}, s = r.getTokens(i);
                        if (null == n) s.push(o); else for (var a = 0, l = 0; l < s.length; l++) {
                            var c = s[l];
                            if (n <= (a += c.value.length)) {
                                var h = c.value.length - (a - n), d = c.value.slice(0, h), h = c.value.slice(h);
                                s.splice(l, 1, {type: c.type, value: d}, o, {type: c.type, value: h});
                                break
                            }
                        }
                        this.updateLines(i, i)
                    },this.removeExtraToken = function (e, t) {
                        this.updateLines(e, e)
                    },this.setTheme = function (i, n) {
                        var e, r = this;

                        function t(e) {
                            if (r.$themeId != i) return n && n();
                            if (!e || !e.cssClass) throw new Error("couldn't load module " + i + " or it didn't call define");
                            e.$id && (r.$themeId = e.$id), a.importCssString(e.cssText, e.cssClass, r.container), r.theme && a.removeCssClass(r.container, r.theme.cssClass);
                            var t = "padding" in e ? e.padding : "padding" in (r.theme || {}) ? 4 : r.$padding;
                            r.$padding && t != r.$padding && r.setPadding(t), r.$theme = e.cssClass, r.theme = e, a.addCssClass(r.container, e.cssClass), a.setCssClass(r.container, "ace_dark", e.isDark), r.$size && (r.$size.width = 0, r.$updateSizeAsync()), r._dispatchEvent("themeLoaded", {theme: e}), n && n()
                        }

                        this.$themeId = i, r._dispatchEvent("themeChange", {theme: i}), i && "string" != typeof i ? t(i) : (e = i || this.$options.theme.initialValue, o.loadModule(["theme", e], t))
                    },this.getTheme = function () {
                        return this.$themeId
                    },this.setStyle = function (e, t) {
                        a.setCssClass(this.container, e, !1 !== t)
                    },this.unsetStyle = function (e) {
                        a.removeCssClass(this.container, e)
                    },this.setCursorStyle = function (e) {
                        a.setStyle(this.scroller.style, "cursor", e)
                    },this.setMouseCursor = function (e) {
                        a.setStyle(this.scroller.style, "cursor", e)
                    },this.attachToShadowRoot = function () {
                        a.importCssString(m, "ace_editor.css", this.container)
                    },this.destroy = function () {
                        this.freeze(), this.$fontMetrics.destroy(), this.$cursorLayer.destroy(), this.removeAllListeners(), this.container.textContent = ""
                    }
                }.call(e.prototype), o.defineOptions(e.prototype, "renderer", {
                    animatedScroll: {initialValue: !1}, showInvisibles: {
                        set: function (e) {
                            this.$textLayer.setShowInvisibles(e) && this.$loop.schedule(this.CHANGE_TEXT)
                        }, initialValue: !1
                    }, showPrintMargin: {
                        set: function () {
                            this.$updatePrintMargin()
                        }, initialValue: !0
                    }, printMarginColumn: {
                        set: function () {
                            this.$updatePrintMargin()
                        }, initialValue: 80
                    }, printMargin: {
                        set: function (e) {
                            "number" == typeof e && (this.$printMarginColumn = e), this.$showPrintMargin = !!e, this.$updatePrintMargin()
                        }, get: function () {
                            return this.$showPrintMargin && this.$printMarginColumn
                        }
                    }, showGutter: {
                        set: function (e) {
                            this.$gutter.style.display = e ? "block" : "none", this.$loop.schedule(this.CHANGE_FULL), this.onGutterResize()
                        }, initialValue: !0
                    }, fadeFoldWidgets: {
                        set: function (e) {
                            a.setCssClass(this.$gutter, "ace_fade-fold-widgets", e)
                        }, initialValue: !1
                    }, showFoldWidgets: {
                        set: function (e) {
                            this.$gutterLayer.setShowFoldWidgets(e), this.$loop.schedule(this.CHANGE_GUTTER)
                        }, initialValue: !0
                    }, displayIndentGuides: {
                        set: function (e) {
                            this.$textLayer.setDisplayIndentGuides(e) && this.$loop.schedule(this.CHANGE_TEXT)
                        }, initialValue: !0
                    }, highlightGutterLine: {
                        set: function (e) {
                            this.$gutterLayer.setHighlightGutterLine(e), this.$loop.schedule(this.CHANGE_GUTTER)
                        }, initialValue: !0
                    }, hScrollBarAlwaysVisible: {
                        set: function (e) {
                            this.$hScrollBarAlwaysVisible && this.$horizScroll || this.$loop.schedule(this.CHANGE_SCROLL)
                        }, initialValue: !1
                    }, vScrollBarAlwaysVisible: {
                        set: function (e) {
                            this.$vScrollBarAlwaysVisible && this.$vScroll || this.$loop.schedule(this.CHANGE_SCROLL)
                        }, initialValue: !1
                    }, fontSize: {
                        set: function (e) {
                            "number" == typeof e && (e += "px"), this.container.style.fontSize = e, this.updateFontSize()
                        }, initialValue: 12
                    }, fontFamily: {
                        set: function (e) {
                            this.container.style.fontFamily = e, this.updateFontSize()
                        }
                    }, maxLines: {
                        set: function (e) {
                            this.updateFull()
                        }
                    }, minLines: {
                        set: function (e) {
                            this.$minLines < 562949953421311 || (this.$minLines = 0), this.updateFull()
                        }
                    }, maxPixelHeight: {
                        set: function (e) {
                            this.updateFull()
                        }, initialValue: 0
                    }, scrollPastEnd: {
                        set: function (e) {
                            this.$scrollPastEnd != (e = +e || 0) && (this.$scrollPastEnd = e, this.$loop.schedule(this.CHANGE_SCROLL))
                        }, initialValue: 0, handlesSet: !0
                    }, fixedWidthGutter: {
                        set: function (
                            e) {
                            this.$gutterLayer.$fixedWidth = !!e, this.$loop.schedule(this.CHANGE_GUTTER)
                        }
                    }, theme: {
                        set: function (e) {
                            this.setTheme(e)
                        }, get: function () {
                            return this.$themeId || this.theme
                        }, initialValue: "./theme/textmate", handlesSet: !0
                    }, hasCssTransforms: {}, useTextareaForIME: {initialValue: !f.isMobile && !f.isIE}
                }), t.VirtualRenderer = e
            }), ace.define("ace/worker/worker_client", ["require", "exports", "module", "ace/lib/oop", "ace/lib/net", "ace/lib/event_emitter", "ace/config"], function (a, e, t) {
                "use strict";
                var i = a("../lib/oop"), n = a("../lib/net"), c = a("../lib/event_emitter").EventEmitter,
                    h = a("../config");

                function l(e) {
                    if ("undefined" == typeof Worker) return {
                        postMessage: function () {
                        }, terminate: function () {
                        }
                    };
                    if (h.get("loadWorkerFromBlob")) {
                        var t = function (t) {
                            var i = "importScripts('" + n.qualifyURL(t) + "');";
                            try {
                                return new Blob([i], {type: "application/javascript"})
                            } catch (e) {
                                t = new (window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder);
                                return t.append(i), t.getBlob("application/javascript")
                            }
                        }(e), t = (window.URL || window.webkitURL).createObjectURL(t);
                        return new Worker(t)
                    }
                    return new Worker(e)
                }

                function d(e) {
                    e.postMessage || (e = this.$createWorkerFromOldConfig.apply(this, arguments)), this.$worker = e, this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this), this.changeListener = this.changeListener.bind(this), this.onMessage = this.onMessage.bind(this), this.callbackId = 1, this.callbacks = {}, this.$worker.onmessage = this.onMessage
                }

                !function () {
                    i.implement(this, c), this.$createWorkerFromOldConfig = function (e, t, i, n, r) {
                        var o, s;
                        return a.nameToUrl && !a.toUrl && (a.toUrl = a.nameToUrl), h.get("packaged") || !a.toUrl ? n = n || h.moduleUrl(t, "worker") : (o = this.$normalizePath, n = n || o(a.toUrl("ace/worker/worker.js", null, "_")), s = {}, e.forEach(function (e) {
                            s[e] = o(a.toUrl(e, null, "_").replace(/(\.js)?(\?.*)?$/, ""))
                        })), this.$worker = l(n), r && this.send("importScripts", r), this.$worker.postMessage({
                            init: !0,
                            tlns: s,
                            module: t,
                            classname: i
                        }), this.$worker
                    }, this.onMessage = function (e) {
                        var t = e.data;
                        switch (t.type) {
                            case"event":
                                this._signal(t.name, {data: t.data});
                                break;
                            case"call":
                                var i = this.callbacks[t.id];
                                i && (i(t.data), delete this.callbacks[t.id]);
                                break;
                            case"error":
                                this.reportError(t.data);
                                break;
                            case"log":
                                window.console && console.log && console.log.apply(console, t.data)
                        }
                    }, this.reportError = function (e) {
                        window.console && console.error && console.error(e)
                    }, this.$normalizePath = function (e) {
                        return n.qualifyURL(e)
                    }, this.terminate = function () {
                        this._signal("terminate", {}), this.deltaQueue = null, this.$worker.terminate(), this.$worker = null, this.$doc && this.$doc.off("change", this.changeListener), this.$doc = null
                    }, this.send = function (e, t) {
                        this.$worker.postMessage({command: e, args: t})
                    }, this.call = function (e, t, i) {
                        var n;
                        i && (n = this.callbackId++, this.callbacks[n] = i, t.push(n)), this.send(e, t)
                    }, this.emit = function (e, t) {
                        try {
                            t.data && t.data.err && (t.data.err = {
                                message: t.data.err.message,
                                stack: t.data.err.stack,
                                code: t.data.err.code
                            }), this.$worker.postMessage({event: e, data: {data: t.data}})
                        } catch (e) {
                            console.error(e.stack)
                        }
                    }, this.attachToDocument = function (e) {
                        this.$doc && this.terminate(), this.$doc = e, this.call("setValue", [e.getValue()]), e.on("change", this.changeListener)
                    }, this.changeListener = function (e) {
                        this.deltaQueue || (this.deltaQueue = [], setTimeout(this.$sendDeltaQueue, 0)), "insert" == e.action ? this.deltaQueue.push(e.start, e.lines) : this.deltaQueue.push(e.start, e.end)
                    }, this.$sendDeltaQueue = function () {
                        var e = this.deltaQueue;
                        e && (this.deltaQueue = null, 50 < e.length && e.length > this.$doc.getLength() >> 1 ? this.call("setValue", [this.$doc.getValue()]) : this.emit("change", {data: e}))
                    }
                }.call(d.prototype);
                e.UIWorkerClient = function (e, t, i) {
                    var n = null, r = !1, o = Object.create(c), s = [], a = new d({
                        messageBuffer: s, terminate: function () {
                        }, postMessage: function (e) {
                            s.push(e), n && (r ? setTimeout(l) : l())
                        }
                    });
                    a.setEmitSync = function (e) {
                        r = e
                    };
                    var l = function () {
                        var e = s.shift();
                        e.command ? n[e.command].apply(n, e.args) : e.event && o._signal(e.event, e.data)
                    };
                    return o.postMessage = function (e) {
                        a.onMessage({data: e})
                    }, o.callback = function (e, t) {
                        this.postMessage({type: "call", id: t, data: e})
                    }, o.emit = function (e, t) {
                        this.postMessage({type: "event", name: e, data: t})
                    }, h.loadModule(["worker", t], function (e) {
                        for (n = new e[i](o); s.length;) l()
                    }), a
                }, e.WorkerClient = d, e.createWorker = l
            }), ace.define("ace/placeholder", ["require", "exports", "module", "ace/range", "ace/lib/event_emitter", "ace/lib/oop"], function (e, t, i) {
                "use strict";
                var l = e("./range").Range, n = e("./lib/event_emitter").EventEmitter, r = e("./lib/oop"),
                    e = function (e, t, i, n, r, o) {
                        var s = this;
                        this.length = t, this.session = e, this.doc = e.getDocument(), this.mainClass = r, this.othersClass = o, this.$onUpdate = this.onUpdate.bind(this), this.doc.on("change", this.$onUpdate), this.$others = n, this.$onCursorChange = function () {
                            setTimeout(function () {
                                s.onCursorChange()
                            })
                        }, this.$pos = i;
                        i = e.getUndoManager().$undoStack || e.getUndoManager().$undostack || {length: -1};
                        this.$undoStackDepth = i.length, this.setup(), e.selection.on("changeCursor", this.$onCursorChange)
                    };
                !function () {
                    r.implement(this, n), this.setup = function () {
                        var t = this, i = this.doc, e = this.session;
                        this.selectionBefore = e.selection.toJSON(), e.selection.inMultiSelectMode && e.selection.toSingleRange(), this.pos = i.createAnchor(this.$pos.row, this.$pos.column);
                        var n = this.pos;
                        n.$insertRight = !0, n.detach(), n.markerId = e.addMarker(new l(n.row, n.column, n.row, n.column + this.length), this.mainClass, null, !1), this.others = [], this.$others.forEach(function (e) {
                            e = i.createAnchor(e.row, e.column);
                            e.$insertRight = !0, e.detach(), t.others.push(e)
                        }), e.setUndoSelect(!1)
                    }, this.showOtherMarkers = function () {
                        var t, i;
                        this.othersActive || (t = this.session, (i = this).othersActive = !0, this.others.forEach(function (e) {
                            e.markerId = t.addMarker(new l(e.row, e.column, e.row, e.column + i.length), i.othersClass, null, !1)
                        }))
                    }, this.hideOtherMarkers = function () {
                        if (this.othersActive) {
                            this.othersActive = !1;
                            for (var e = 0; e < this.others.length; e++) this.session.removeMarker(this.others[e].markerId)
                        }
                    }, this.onUpdate = function (e) {
                        if (this.$updating) return this.updateAnchors(e);
                        var t = e;
                        if (t.start.row === t.end.row && t.start.row === this.pos.row) {
                            this.$updating = !0;
                            var i = "insert" === e.action ? t.end.column - t.start.column : t.start.column - t.end.column,
                                n = t.start.column >= this.pos.column && t.start.column <= this.pos.column + this.length + 1,
                                r = t.start.column - this.pos.column;
                            if (this.updateAnchors(e), n && (this.length += i), n && !this.session.$fromUndo) if ("insert" === e.action) for (var o = this.others.length - 1; 0 <= o; o--) {
                                var s = {row: (a = this.others[o]).row, column: a.column + r};
                                this.doc.insertMergedLines(s, e.lines)
                            } else if ("remove" === e.action) for (o = this.others.length - 1; 0 <= o; o--) {
                                var a, s = {row: (a = this.others[o]).row, column: a.column + r};
                                this.doc.remove(new l(s.row, s.column, s.row, s.column - i))
                            }
                            this.$updating = !1, this.updateMarkers()
                        }
                    }, this.updateAnchors = function (e) {
                        this.pos.onChange(e);
                        for (var t = this.others.length; t--;) this.others[t].onChange(e);
                        this.updateMarkers()
                    }, this.updateMarkers = function () {
                        if (!this.$updating) {
                            var i = this, n = this.session, e = function (e, t) {
                                n.removeMarker(e.markerId), e.markerId = n.addMarker(new l(e.row, e.column, e.row, e.column + i.length), t, null, !1)
                            };
                            e(this.pos, this.mainClass);
                            for (var t = this.others.length; t--;) e(this.others[t], this.othersClass)
                        }
                    }, this.onCursorChange = function (e) {
                        var t;
                        !this.$updating && this.session && ((t = this.session.selection.getCursor()).row === this.pos.row && t.column >= this.pos.column && t.column <= this.pos.column + this.length ? (this.showOtherMarkers(), this._emit("cursorEnter", e)) : (this.hideOtherMarkers(), this._emit("cursorLeave", e)))
                    }, this.detach = function () {
                        this.session.removeMarker(this.pos && this.pos.markerId), this.hideOtherMarkers(), this.doc.off("change", this.$onUpdate), this.session.selection.off("changeCursor", this.$onCursorChange), this.session.setUndoSelect(!0), this.session = null
                    }, this.cancel = function () {
                        if (-1 !== this.$undoStackDepth) {
                            for (var e = this.session.getUndoManager(), t = (e.$undoStack || e.$undostack).length - this.$undoStackDepth, i = 0; i < t; i++) e.undo(this.session, !0);
                            this.selectionBefore && this.session.selection.fromJSON(this.selectionBefore)
                        }
                    }
                }.call(e.prototype), t.PlaceHolder = e
            }), ace.define("ace/mouse/multi_select_handler", ["require", "exports", "module", "ace/lib/event", "ace/lib/useragent"], function (e, t, i) {
                var x = e("../lib/event"), k = e("../lib/useragent");

                function E(e, t) {
                    return e.row == t.row && e.column == t.column
                }

                t.onMouseDown = function (e) {
                    var t = e.domEvent, i = t.altKey, n = t.shiftKey, r = t.ctrlKey, o = e.getAccelKey(),
                        s = e.getButton();
                    if (r && k.isMac && (s = t.button), e.editor.inMultiSelectMode && 2 == s) e.editor.textInput.onContextMenu(e.domEvent); else if (r || i || o) {
                        if (0 === s) {
                            var a, l, c, h, d = e.editor, u = d.selection, g = d.inMultiSelectMode,
                                p = e.getDocumentPosition(), m = u.getCursor(),
                                m = e.inSelection() || u.isEmpty() && E(p, m), f = e.x, C = e.y, I = d.session,
                                v = d.renderer.pixelToScreenCoordinates(f, C), A = v;
                            if (d.$mouseHandler.$enableJumpToDef) r && i || o && i ? a = n ? "block" : "add" : i && d.$blockSelectEnabled && (a = "block"); else if (o && !i) {
                                if (a = "add", !g && n) return
                            } else i && d.$blockSelectEnabled && (a = "block");
                            if (a && k.isMac && t.ctrlKey && d.$mouseHandler.cancelContextMenu(), "add" == a) !g && m || (g || (l = u.toOrientedRange(), d.addSelectionMarker(l)), c = u.rangeList.rangeAtPoint(p), d.inVirtualSelectionMode = !0, n && (c = null, l = u.ranges[0] || l, d.removeSelectionMarker(l)), d.once("mouseup", function () {
                                var e = u.toOrientedRange();
                                c && e.isEmpty() && E(c.cursor, e.cursor) ? u.substractPoint(e.cursor) : (n ? u.substractPoint(l.cursor) : l && (d.removeSelectionMarker(l), u.addRange(l)), u.addRange(e)), d.inVirtualSelectionMode = !1
                            })); else if ("block" == a) {
                                e.stop(), d.inVirtualSelectionMode = !0;

                                function b() {
                                    var e = d.renderer.pixelToScreenCoordinates(f, C),
                                        t = I.screenToDocumentPosition(e.row, e.column, e.offsetX);
                                    E(A, e) && E(t, u.lead) || (A = e, d.selection.moveToPosition(t), d.renderer.scrollCursorIntoView(), d.removeSelectionMarkers(y), y = u.rectangularRangeBlock(A, v), d.$mouseHandler.$clickSelection && 1 == y.length && y[0].isEmpty() && (y[0] = d.$mouseHandler.$clickSelection.clone()), y.forEach(d.addSelectionMarker, d), d.updateSelectionMarkers())
                                }

                                var y = [];
                                g && !o ? u.toSingleRange() : !g && o && (h = u.toOrientedRange(), d.addSelectionMarker(h)), n ? v = I.documentToScreenPosition(u.lead) : u.moveToPosition(p);
                                var A = {row: -1, column: -1}, w = b;
                                x.capture(d.container, function (e) {
                                    f = e.clientX, C = e.clientY
                                }, function (e) {
                                    b(), clearInterval(S), d.removeSelectionMarkers(y), y.length || (y = [u.toOrientedRange()]), h && (d.removeSelectionMarker(h), u.toSingleRange(h));
                                    for (var t = 0; t < y.length; t++) u.addRange(y[t]);
                                    d.inVirtualSelectionMode = !1, d.$mouseHandler.$clickSelection = null
                                });
                                var S = setInterval(function () {
                                    w()
                                }, 20);
                                return e.preventDefault()
                            }
                        }
                    } else 0 === s && e.editor.inMultiSelectMode && e.editor.exitMultiSelectMode()
                }
            }), ace.define("ace/commands/multi_select_commands", ["require", "exports", "module", "ace/keyboard/hash_handler"], function (e, t, i) {
                t.defaultCommands = [{
                    name: "addCursorAbove", description: "Add cursor above", exec: function (e) {
                        e.selectMoreLines(-1)
                    }, bindKey: {win: "Ctrl-Alt-Up", mac: "Ctrl-Alt-Up"}, scrollIntoView: "cursor", readOnly: !0
                }, {
                    name: "addCursorBelow", description: "Add cursor below", exec: function (e) {
                        e.selectMoreLines(1)
                    }, bindKey: {win: "Ctrl-Alt-Down", mac: "Ctrl-Alt-Down"}, scrollIntoView: "cursor", readOnly: !0
                }, {
                    name: "addCursorAboveSkipCurrent",
                    description: "Add cursor above (skip current)",
                    exec: function (e) {
                        e.selectMoreLines(-1, !0)
                    },
                    bindKey: {win: "Ctrl-Alt-Shift-Up", mac: "Ctrl-Alt-Shift-Up"},
                    scrollIntoView: "cursor",
                    readOnly: !0
                }, {
                    name: "addCursorBelowSkipCurrent",
                    description: "Add cursor below (skip current)",
                    exec: function (e) {
                        e.selectMoreLines(1, !0)
                    },
                    bindKey: {win: "Ctrl-Alt-Shift-Down", mac: "Ctrl-Alt-Shift-Down"},
                    scrollIntoView: "cursor",
                    readOnly: !0
                }, {
                    name: "selectMoreBefore", description: "Select more before", exec: function (e) {
                        e.selectMore(-1)
                    }, bindKey: {win: "Ctrl-Alt-Left", mac: "Ctrl-Alt-Left"}, scrollIntoView: "cursor", readOnly: !0
                }, {
                    name: "selectMoreAfter", description: "Select more after", exec: function (e) {
                        e.selectMore(1)
                    }, bindKey: {win: "Ctrl-Alt-Right", mac: "Ctrl-Alt-Right"}, scrollIntoView: "cursor", readOnly: !0
                }, {
                    name: "selectNextBefore",
                    description: "Select next before",
                    exec: function (e) {
                        e.selectMore(-1, !0)
                    },
                    bindKey: {win: "Ctrl-Alt-Shift-Left", mac: "Ctrl-Alt-Shift-Left"},
                    scrollIntoView: "cursor",
                    readOnly: !0
                }, {
                    name: "selectNextAfter",
                    description: "Select next after",
                    exec: function (e) {
                        e.selectMore(1, !0)
                    },
                    bindKey: {win: "Ctrl-Alt-Shift-Right", mac: "Ctrl-Alt-Shift-Right"},
                    scrollIntoView: "cursor",
                    readOnly: !0
                }, {
                    name: "toggleSplitSelectionIntoLines", description: "Split into lines", exec: function (e) {
                        1 < e.multiSelect.rangeCount ? e.multiSelect.joinSelections() : e.multiSelect.splitIntoLines()
                    }, bindKey: {win: "Ctrl-Alt-L", mac: "Ctrl-Alt-L"}, readOnly: !0
                }, {
                    name: "splitSelectionIntoLines", description: "Split into lines", exec: function (e) {
                        e.multiSelect.splitIntoLines()
                    }, readOnly: !0
                }, {
                    name: "alignCursors", description: "Align cursors", exec: function (e) {
                        e.alignCursors()
                    }, bindKey: {win: "Ctrl-Alt-A", mac: "Ctrl-Alt-A"}, scrollIntoView: "cursor"
                }, {
                    name: "findAll", description: "Find all", exec: function (e) {
                        e.findAll()
                    }, bindKey: {win: "Ctrl-Alt-K", mac: "Ctrl-Alt-G"}, scrollIntoView: "cursor", readOnly: !0
                }], t.multiSelectCommands = [{
                    name: "singleSelection",
                    description: "Single selection",
                    bindKey: "esc",
                    exec: function (e) {
                        e.exitMultiSelectMode()
                    },
                    scrollIntoView: "cursor",
                    readOnly: !0,
                    isAvailable: function (e) {
                        return e && e.inMultiSelectMode
                    }
                }];
                e = e("../keyboard/hash_handler").HashHandler;
                t.keyboardHandler = new e(t.multiSelectCommands)
            }), ace.define("ace/multi_select", ["require", "exports", "module", "ace/range_list", "ace/range", "ace/selection", "ace/mouse/multi_select_handler", "ace/lib/event", "ace/lib/lang", "ace/commands/multi_select_commands", "ace/search", "ace/edit_session", "ace/editor", "ace/config"], function (e, r, t) {
                var i = e("./range_list").RangeList, A = e("./range").Range, u = e("./selection").Selection,
                    o = e("./mouse/multi_select_handler").onMouseDown, s = e("./lib/event"), g = e("./lib/lang"),
                    a = e("./commands/multi_select_commands");
                r.commands = a.defaultCommands.concat(a.multiSelectCommands);
                var l = new (e("./search").Search);
                var n = e("./edit_session").EditSession;
                !function () {
                    this.getSelectionMarkers = function () {
                        return this.$selectionMarkers
                    }
                }.call(n.prototype), function () {
                    this.ranges = null, this.rangeList = null, this.addRange = function (e, t) {
                        if (e) {
                            if (!this.inMultiSelectMode && 0 === this.rangeCount) {
                                var i = this.toOrientedRange();
                                if (this.rangeList.add(i), this.rangeList.add(e), 2 != this.rangeList.ranges.length) return this.rangeList.removeAll(), t || this.fromOrientedRange(e);
                                this.rangeList.removeAll(), this.rangeList.add(i), this.$onAddRange(i)
                            }
                            e.cursor || (e.cursor = e.end);
                            i = this.rangeList.add(e);
                            return this.$onAddRange(e), i.length && this.$onRemoveRange(i), 1 < this.rangeCount && !this.inMultiSelectMode && (this._signal("multiSelect"), this.inMultiSelectMode = !0, this.session.$undoSelect = !1, this.rangeList.attach(this.session)), t || this.fromOrientedRange(e)
                        }
                    }, this.toSingleRange = function (e) {
                        e = e || this.ranges[0];
                        var t = this.rangeList.removeAll();
                        t.length && this.$onRemoveRange(t), e && this.fromOrientedRange(e)
                    }, this.substractPoint = function (e) {
                        e = this.rangeList.substractPoint(e);
                        if (e) return this.$onRemoveRange(e), e[0]
                    }, this.mergeOverlappingRanges = function () {
                        var e = this.rangeList.merge();
                        e.length && this.$onRemoveRange(e)
                    }, this.$onAddRange = function (e) {
                        this.rangeCount = this.rangeList.ranges.length, this.ranges.unshift(e), this._signal("addRange", {range: e})
                    }, this.$onRemoveRange = function (e) {
                        var t;
                        this.rangeCount = this.rangeList.ranges.length, 1 == this.rangeCount && this.inMultiSelectMode && (t = this.rangeList.ranges.pop(), e.push(t), this.rangeCount = 0);
                        for (var i = e.length; i--;) {
                            var n = this.ranges.indexOf(e[i]);
                            this.ranges.splice(n, 1)
                        }
                        this._signal("removeRange", {ranges: e}), 0 === this.rangeCount && this.inMultiSelectMode && (this.inMultiSelectMode = !1, this._signal("singleSelect"), this.session.$undoSelect = !0, this.rangeList.detach(this.session)), (t = t || this.ranges[0]) && !t.isEqual(this.getRange()) && this.fromOrientedRange(t)
                    }, this.$initRangeList = function () {
                        this.rangeList || (this.rangeList = new i, this.ranges = [], this.rangeCount = 0)
                    }, this.getAllRanges = function () {
                        return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()]
                    }, this.splitIntoLines = function () {
                        for (var e = this.ranges.length ? this.ranges : [this.getRange()], t = [], i = 0; i < e.length; i++) {
                            var n = e[i], r = n.start.row, o = n.end.row;
                            if (r === o) t.push(n.clone()); else {
                                for (t.push(new A(r, n.start.column, r, this.session.getLine(r).length)); ++r < o;) t.push(this.getLineRange(r, !0));
                                t.push(new A(o, 0, o, n.end.column))
                            }
                            0 != i || this.isBackwards() || (t = t.reverse())
                        }
                        this.toSingleRange();
                        for (i = t.length; i--;) this.addRange(t[i])
                    }, this.joinSelections = function () {
                        var e = this.rangeList.ranges, t = e[e.length - 1], e = A.fromPoints(e[0].start, t.end);
                        this.toSingleRange(), this.setSelectionRange(e, t.cursor == t.start)
                    }, this.toggleBlockSelection = function () {
                        var e, t;
                        1 < this.rangeCount ? (t = (e = this.rangeList.ranges)[e.length - 1], e = A.fromPoints(e[0].start, t.end), this.toSingleRange(), this.setSelectionRange(e, t.cursor == t.start)) : (e = this.session.documentToScreenPosition(this.cursor), t = this.session.documentToScreenPosition(this.anchor), this.rectangularRangeBlock(e, t).forEach(this.addRange, this))
                    }, this.rectangularRangeBlock = function (e, t, i) {
                        var n, r, o, s, a = [], l = e.column < t.column;
                        s = l ? (n = e.column, r = t.column, o = e.offsetX, t.offsetX) : (n = t.column, r = e.column, o = t.offsetX, e.offsetX);
                        var c, h, d, u = e.row < t.row;
                        h = u ? (c = e.row, t.row) : (c = t.row, e.row), n < 0 && (n = 0), (c = c < 0 ? 0 : c) == h && (i = !0);
                        for (var g, p, m = c; m <= h; m++) {
                            var f = A.fromPoints(this.session.screenToDocumentPosition(m, n, o), this.session.screenToDocumentPosition(m, r, s));
                            if (f.isEmpty()) {
                                if (d && (g = f.end, p = d, g.row == p.row && g.column == p.column)) break;
                                d = f.end
                            }
                            f.cursor = l ? f.start : f.end, a.push(f)
                        }
                        if (u && a.reverse(), !i) {
                            for (var C = a.length - 1; a[C].isEmpty() && 0 < C;) C--;
                            if (0 < C) for (var I = 0; a[I].isEmpty();) I++;
                            for (var v = C; I <= v; v--) a[v].isEmpty() && a.splice(v, 1)
                        }
                        return a
                    }
                }.call(u.prototype);
                n = e("./editor").Editor;

                function c(e) {
                    var t, i;

                    function n(e) {
                        i && (t.renderer.setMouseCursor(""), i = !1)
                    }

                    e.$multiselectOnSessionChange || (e.$onAddRange = e.$onAddRange.bind(e), e.$onRemoveRange = e.$onRemoveRange.bind(e), e.$onMultiSelect = e.$onMultiSelect.bind(e), e.$onSingleSelect = e.$onSingleSelect.bind(e), e.$multiselectOnSessionChange = r.onSessionChange.bind(e), e.$checkMultiselectChange = e.$checkMultiselectChange.bind(e), e.$multiselectOnSessionChange(e), e.on("changeSession", e.$multiselectOnSessionChange), e.on("mousedown", o), e.commands.addCommands(a.defaultCommands), (t = e).textInput && (e = t.textInput.getElement(), i = !1, s.addListener(e, "keydown", function (e) {
                        e = 18 == e.keyCode && !(e.ctrlKey || e.shiftKey || e.metaKey);
                        t.$blockSelectEnabled && e ? i || (t.renderer.setMouseCursor("crosshair"), i = !0) : i && n()
                    }, t), s.addListener(e, "keyup", n, t), s.addListener(e, "blur", n, t)))
                }

                !function () {
                    this.updateSelectionMarkers = function () {
                        this.renderer.updateCursor(), this.renderer.updateBackMarkers()
                    }, this.addSelectionMarker = function (e) {
                        e.cursor || (e.cursor = e.end);
                        var t = this.getSelectionStyle();
                        return e.marker = this.session.addMarker(e, "ace_selection", t), this.session.$selectionMarkers.push(e), this.session.selectionMarkerCount = this.session.$selectionMarkers.length, e
                    }, this.removeSelectionMarker = function (e) {
                        e.marker && (this.session.removeMarker(e.marker), -1 != (e = this.session.$selectionMarkers.indexOf(e)) && this.session.$selectionMarkers.splice(e, 1), this.session.selectionMarkerCount = this.session.$selectionMarkers.length)
                    }, this.removeSelectionMarkers = function (e) {
                        for (var t = this.session.$selectionMarkers, i = e.length; i--;) {
                            var n = e[i];
                            n.marker && (this.session.removeMarker(n.marker), -1 != (n = t.indexOf(n)) && t.splice(n, 1))
                        }
                        this.session.selectionMarkerCount = t.length
                    }, this.$onAddRange = function (e) {
                        this.addSelectionMarker(e.range), this.renderer.updateCursor(), this.renderer.updateBackMarkers()
                    }, this.$onRemoveRange = function (e) {
                        this.removeSelectionMarkers(e.ranges), this.renderer.updateCursor(), this.renderer.updateBackMarkers()
                    }, this.$onMultiSelect = function (e) {
                        this.inMultiSelectMode || (this.inMultiSelectMode = !0, this.setStyle("ace_multiselect"), this.keyBinding.addKeyboardHandler(a.keyboardHandler), this.commands.setDefaultHandler("exec", this.$onMultiSelectExec), this.renderer.updateCursor(), this.renderer.updateBackMarkers())
                    }, this.$onSingleSelect = function (e) {
                        this.session.multiSelect.inVirtualMode || (this.inMultiSelectMode = !1, this.unsetStyle("ace_multiselect"), this.keyBinding.removeKeyboardHandler(a.keyboardHandler), this.commands.removeDefaultHandler("exec", this.$onMultiSelectExec), this.renderer.updateCursor(), this.renderer.updateBackMarkers(), this._emit("changeSelection"))
                    }, this.$onMultiSelectExec = function (e) {
                        var t, i = e.command, n = e.editor;
                        if (n.multiSelect) return i.multiSelectAction ? t = "forEach" == i.multiSelectAction ? n.forEachSelection(i, e.args) : "forEachLine" == i.multiSelectAction ? n.forEachSelection(i, e.args, !0) : "single" == i.multiSelectAction ? (n.exitMultiSelectMode(), i.exec(n, e.args || {})) : i.multiSelectAction(n, e.args || {}) : (t = i.exec(n, e.args || {}), n.multiSelect.addRange(n.multiSelect.toOrientedRange()), n.multiSelect.mergeOverlappingRanges()), t
                    }, this.forEachSelection = function (e, t, i) {
                        if (!this.inVirtualSelectionMode) {
                            var n, r = i && i.keepOrder, o = 1 == i || i && i.$byLines, s = this.session,
                                a = this.selection, i = a.rangeList, l = (r ? a : i).ranges;
                            if (!l.length) return e.exec ? e.exec(this, t || {}) : e(this, t || {});
                            i = a._eventRegistry;
                            a._eventRegistry = {};
                            var c = new u(s);
                            this.inVirtualSelectionMode = !0;
                            for (var h = l.length; h--;) {
                                if (o) for (; 0 < h && l[h].start.row == l[h - 1].end.row;) h--;
                                c.fromOrientedRange(l[h]), c.index = h, this.selection = s.selection = c;
                                var d = e.exec ? e.exec(this, t || {}) : e(this, t || {});
                                n || void 0 === d || (n = d), c.toOrientedRange(l[h])
                            }
                            c.detach(), this.selection = s.selection = a, this.inVirtualSelectionMode = !1, a._eventRegistry = i, a.mergeOverlappingRanges(), a.ranges[0] && a.fromOrientedRange(a.ranges[0]);
                            a = this.renderer.$scrollAnimation;
                            return this.onCursorChange(), this.onSelectionChange(), a && a.from == a.to && this.renderer.animateScrolling(a.from), n
                        }
                    }, this.exitMultiSelectMode = function () {
                        this.inMultiSelectMode && !this.inVirtualSelectionMode && this.multiSelect.toSingleRange()
                    }, this.getSelectedText = function () {
                        var e = "";
                        if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {
                            for (var t = this.multiSelect.rangeList.ranges, i = [], n = 0; n < t.length; n++) i.push(this.session.getTextRange(t[n]));
                            var r = this.session.getDocument().getNewLineCharacter();
                            (e = i.join(r)).length == (i.length - 1) * r.length && (e = "")
                        } else this.selection.isEmpty() || (e = this.session.getTextRange(this.getSelectionRange()));
                        return e
                    }, this.$checkMultiselectChange = function (e, t) {
                        var i;
                        this.inMultiSelectMode && !this.inVirtualSelectionMode && (i = this.multiSelect.ranges[0], this.multiSelect.isEmpty() && t == this.multiSelect.anchor || ((i = t == this.multiSelect.anchor ? i.cursor == i.start ? i.end : i.start : i.cursor).row != t.row || this.session.$clipPositionToDocument(i.row, i.column).column != t.column ? this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange()) : this.multiSelect.mergeOverlappingRanges()))
                    }, this.findAll = function (e, t, i) {
                        var n;
                        (t = t || {}).needle = e || t.needle, null == t.needle && (n = this.selection.isEmpty() ? this.selection.getWordRange() : this.selection.getRange(), t.needle = this.session.getTextRange(n)), this.$search.set(t);
                        var r = this.$search.findAll(this.session);
                        if (!r.length) return 0;
                        var o = this.multiSelect;
                        i || o.toSingleRange(r[0]);
                        for (var s = r.length; s--;) o.addRange(r[s], !0);
                        return n && o.rangeList.rangeAtPoint(n.start) && o.addRange(n, !0), r.length
                    }, this.selectMoreLines = function (e, t) {
                        var i = this.selection.toOrientedRange(), n = i.cursor == i.end,
                            r = this.session.documentToScreenPosition(i.cursor);
                        this.selection.$desiredColumn && (r.column = this.selection.$desiredColumn);
                        var o, s, a, l = this.session.screenToDocumentPosition(r.row + e, r.column);
                        o = i.isEmpty() ? l : (o = this.session.documentToScreenPosition(n ? i.end : i.start), this.session.screenToDocumentPosition(o.row + e, o.column)), n ? (s = A.fromPoints(l, o)).cursor = s.start : (s = A.fromPoints(o, l)).cursor = s.end, s.desiredColumn = r.column, this.selection.inMultiSelectMode ? t && (a = i.cursor) : this.selection.addRange(i), this.selection.addRange(s), a && this.selection.substractPoint(a)
                    }, this.transposeSelections = function (e) {
                        for (var t = this.session, i = t.multiSelect, n = i.ranges, r = n.length; r--;) (s = n[r]).isEmpty() && (a = t.getWordRange(s.start.row, s.start.column), s.start.row = a.start.row, s.start.column = a.start.column, s.end.row = a.end.row, s.end.column = a.end.column);
                        i.mergeOverlappingRanges();
                        for (var o = [], r = n.length; r--;) {
                            var s = n[r];
                            o.unshift(t.getTextRange(s))
                        }
                        e < 0 ? o.unshift(o.pop()) : o.push(o.shift());
                        for (r = n.length; r--;) {
                            var a = (s = n[r]).clone();
                            t.replace(s, o[r]), s.start.row = a.start.row, s.start.column = a.start.column
                        }
                        i.fromOrientedRange(i.ranges[0])
                    }, this.selectMore = function (e, t, i) {
                        var n, r = this.session, o = r.multiSelect.toOrientedRange();
                        o.isEmpty() && ((o = r.getWordRange(o.start.row, o.start.column)).cursor = -1 == e ? o.start : o.end, this.multiSelect.addRange(o), i) || (n = r.getTextRange(o), i = r, r = n, n = e, l.$options.wrap = !0, l.$options.needle = r, l.$options.backwards = -1 == n, (i = l.find(i)) && (i.cursor = -1 == e ? i.start : i.end, this.session.unfold(i), this.multiSelect.addRange(i), this.renderer.scrollCursorIntoView(null, .5)), t && this.multiSelect.substractPoint(o.cursor))
                    }, this.alignCursors = function () {
                        var r = this.session, t = r.multiSelect, e = t.ranges, i = -1, n = e.filter(function (e) {
                            return e.cursor.row == i || void (i = e.cursor.row)
                        });
                        if (e.length && n.length != e.length - 1) {
                            n.forEach(function (e) {
                                t.substractPoint(e.cursor)
                            });
                            var o = 0, s = 1 / 0, a = e.map(function (e) {
                                var t = e.cursor, e = r.getLine(t.row).substr(t.column).search(/\S/g);
                                return t.column > o && (o = t.column), (e = -1 == e ? 0 : e) < s && (s = e), e
                            });
                            e.forEach(function (e, t) {
                                var i = e.cursor, n = o - i.column, t = a[t] - s;
                                t < n ? r.insert(i, g.stringRepeat(" ", n - t)) : r.remove(new A(i.row, i.column, i.row, i.column - n + t)), e.start.column = e.end.column = o, e.start.row = e.end.row = i.row, e.cursor = e.end
                            }), t.fromOrientedRange(e[0]), this.renderer.updateCursor(), this.renderer.updateBackMarkers()
                        } else {
                            var l = this.selection.getRange(), c = l.start.row, h = l.end.row, n = c == h;
                            if (n) {
                                for (var d, u = this.session.getLength(); d = this.session.getLine(h), /[=:]/.test(d) && ++h < u;) ;
                                for (; d = this.session.getLine(c), /[=:]/.test(d) && 0 < --c;) ;
                                c < 0 && (c = 0), u <= h && (h = u - 1)
                            }
                            e = this.session.removeFullLines(c, h), e = this.$reAlignText(e, n);
                            this.session.insert({
                                row: c,
                                column: 0
                            }, e.join("\n") + "\n"), n || (l.start.column = 0, l.end.column = e[e.length - 1].length), this.selection.setRange(l)
                        }
                    }, this.$reAlignText = function (e, t) {
                        var i, n, r, o = !0, s = !0;
                        return e.map(function (e) {
                            var t = e.match(/(\s*)(.*?)(\s*)([=:].*)/);
                            return t ? (null == i ? (i = t[1].length, n = t[2].length, r = t[3].length) : (i + n + r != t[1].length + t[2].length + t[3].length && (s = !1), i != t[1].length && (o = !1), i > t[1].length && (i = t[1].length), n < t[2].length && (n = t[2].length), r > t[3].length && (r = t[3].length)), t) : [e]
                        }).map(t ? l : o ? s ? function (e) {
                            return e[2] ? a(i + n - e[2].length) + e[2] + a(r) + e[4].replace(/^([=:])\s+/, "$1 ") : e[0]
                        } : l : function (e) {
                            return e[2] ? a(i) + e[2] + a(r) + e[4].replace(/^([=:])\s+/, "$1 ") : e[0]
                        });

                        function a(e) {
                            return g.stringRepeat(" ", e)
                        }

                        function l(e) {
                            return e[2] ? a(i) + e[2] + a(n - e[2].length + r) + e[4].replace(/^([=:])\s+/, "$1 ") : e[0]
                        }
                    }
                }.call(n.prototype), r.onSessionChange = function (e) {
                    var t = e.session;
                    t && !t.multiSelect && (t.$selectionMarkers = [], t.selection.$initRangeList(), t.multiSelect = t.selection), this.multiSelect = t && t.multiSelect;
                    e = e.oldSession;
                    e && (e.multiSelect.off("addRange", this.$onAddRange), e.multiSelect.off("removeRange", this.$onRemoveRange), e.multiSelect.off("multiSelect", this.$onMultiSelect), e.multiSelect.off("singleSelect", this.$onSingleSelect), e.multiSelect.lead.off("change", this.$checkMultiselectChange), e.multiSelect.anchor.off("change", this.$checkMultiselectChange)), t && (t.multiSelect.on("addRange", this.$onAddRange), t.multiSelect.on("removeRange", this.$onRemoveRange), t.multiSelect.on("multiSelect", this.$onMultiSelect), t.multiSelect.on("singleSelect", this.$onSingleSelect), t.multiSelect.lead.on("change", this.$checkMultiselectChange), t.multiSelect.anchor.on("change", this.$checkMultiselectChange)), t && this.inMultiSelectMode != t.selection.inMultiSelectMode && (t.selection.inMultiSelectMode ? this.$onMultiSelect() : this.$onSingleSelect())
                }, r.MultiSelect = c, e("./config").defineOptions(n.prototype, "editor", {
                    enableMultiselect: {
                        set: function (e) {
                            c(this), e ? (this.on("changeSession", this.$multiselectOnSessionChange), this.on("mousedown", o)) : (this.off("changeSession", this.$multiselectOnSessionChange), this.off("mousedown", o))
                        }, value: !0
                    }, enableBlockSelect: {
                        set: function (e) {
                            this.$blockSelectEnabled = e
                        }, value: !0
                    }
                })
            }), ace.define("ace/mode/folding/fold_mode", ["require", "exports", "module", "ace/range"], function (e, t, i) {
                "use strict";
                var h = e("../../range").Range, t = t.FoldMode = function () {
                };
                !function () {
                    this.foldingStartMarker = null, this.foldingStopMarker = null, this.getFoldWidget = function (e, t, i) {
                        i = e.getLine(i);
                        return this.foldingStartMarker.test(i) ? "start" : "markbeginend" == t && this.foldingStopMarker && this.foldingStopMarker.test(i) ? "end" : ""
                    }, this.getFoldWidgetRange = function (e, t, i) {
                        return null
                    }, this.indentationBlock = function (e, t, i) {
                        var n = /\S/, r = e.getLine(t), o = r.search(n);
                        if (-1 != o) {
                            for (var s = i || r.length, a = e.getLength(), i = t, l = t; ++t < a;) {
                                var c = e.getLine(t).search(n);
                                if (-1 != c) {
                                    if (c <= o) {
                                        c = e.getTokenAt(t, 0);
                                        if (!c || "string" !== c.type) break
                                    }
                                    l = t
                                }
                            }
                            if (i < l) {
                                r = e.getLine(l).length;
                                return new h(i, s, l, r)
                            }
                        }
                    }, this.openingBracketBlock = function (e, t, i, n, r) {
                        n = {row: i, column: n + 1}, t = e.$findClosingBracket(t, n, r);
                        if (t) {
                            r = e.foldWidgets[t.row];
                            return "start" == (r = null == r ? e.getFoldWidget(t.row) : r) && t.row > n.row && (t.row--, t.column = e.getLine(t.row).length), h.fromPoints(n, t)
                        }
                    }, this.closingBracketBlock = function (e, t, i, n, r) {
                        n = {row: i, column: n}, t = e.$findOpeningBracket(t, n);
                        if (t) return t.column++, n.column--, h.fromPoints(t, n)
                    }
                }.call(t.prototype)
            }), ace.define("ace/theme/textmate", ["require", "exports", "module", "ace/lib/dom"], function (e, t, i) {
                "use strict";
                t.isDark = !1, t.cssClass = "ace-tm", t.cssText = '.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}', t.$id = "ace/theme/textmate", e("../lib/dom").importCssString(t.cssText, t.cssClass)
            }), ace.define("ace/line_widgets", ["require", "exports", "module", "ace/lib/dom"], function (e, t, i) {
                "use strict";
                var r = e("./lib/dom");

                function n(e) {
                    this.session = e, (this.session.widgetManager = this).session.getRowLength = this.getRowLength, this.session.$getWidgetScreenLength = this.$getWidgetScreenLength, this.updateOnChange = this.updateOnChange.bind(this), this.renderWidgets = this.renderWidgets.bind(this), this.measureWidgets = this.measureWidgets.bind(this), this.session._changedWidgets = [], this.$onChangeEditor = this.$onChangeEditor.bind(this), this.session.on("change", this.updateOnChange), this.session.on("changeFold", this.updateOnFold), this.session.on("changeEditor", this.$onChangeEditor)
                }

                !function () {
                    this.getRowLength = function (e) {
                        var t = this.lineWidgets && this.lineWidgets[e] && this.lineWidgets[e].rowCount || 0;
                        return this.$useWrapMode && this.$wrapData[e] ? this.$wrapData[e].length + 1 + t : 1 + t
                    }, this.$getWidgetScreenLength = function () {
                        var t = 0;
                        return this.lineWidgets.forEach(function (e) {
                            e && e.rowCount && !e.hidden && (t += e.rowCount)
                        }), t
                    }, this.$onChangeEditor = function (e) {
                        this.attach(e.editor)
                    }, this.attach = function (e) {
                        e && e.widgetManager && e.widgetManager != this && e.widgetManager.detach(), this.editor != e && (this.detach(), (this.editor = e) && (e.widgetManager = this, e.renderer.on("beforeRender", this.measureWidgets), e.renderer.on("afterRender", this.renderWidgets)))
                    }, this.detach = function (e) {
                        var t = this.editor;
                        t && (this.editor = null, t.widgetManager = null, t.renderer.off("beforeRender", this.measureWidgets), t.renderer.off("afterRender", this.renderWidgets), (t = this.session.lineWidgets) && t.forEach(function (e) {
                            e && e.el && e.el.parentNode && (e._inDocument = !1, e.el.parentNode.removeChild(e.el))
                        }))
                    }, this.updateOnFold = function (e, t) {
                        var i = t.lineWidgets;
                        if (i && e.action) {
                            for (var n = e.data, t = n.start.row, r = n.end.row, o = "add" == e.action, s = t + 1; s < r; s++) i[s] && (i[s].hidden = o);
                            i[r] && (o ? i[t] ? i[r].hidden = o : i[t] = i[r] : (i[t] == i[r] && (i[t] = void 0), i[r].hidden = o))
                        }
                    }, this.updateOnChange = function (e) {
                        var t, i, n, r = this.session.lineWidgets;
                        r && (t = e.start.row, 0 == (n = e.end.row - t) || ("remove" == e.action ? (i = r.splice(t + 1, n), !r[t] && i[i.length - 1] && (r[t] = i.pop()), i.forEach(function (e) {
                            e && this.removeLineWidget(e)
                        }, this)) : (n = new Array(n), r[t] && null != r[t].column && e.start.column > r[t].column && t++, n.unshift(t, 0), r.splice.apply(r, n)), this.$updateRows()))
                    }, this.$updateRows = function () {
                        var i, e = this.session.lineWidgets;
                        e && (i = !0, e.forEach(function (e, t) {
                            if (e) for (i = !1, e.row = t; e.$oldWidget;) e.$oldWidget.row = t, e = e.$oldWidget
                        }), i && (this.session.lineWidgets = null))
                    }, this.$registerLineWidget = function (e) {
                        this.session.lineWidgets || (this.session.lineWidgets = new Array(this.session.getLength()));
                        var t = this.session.lineWidgets[e.row];
                        return t && (e.$oldWidget = t).el && t.el.parentNode && (t.el.parentNode.removeChild(t.el), t._inDocument = !1), this.session.lineWidgets[e.row] = e
                    }, this.addLineWidget = function (e) {
                        if (this.$registerLineWidget(e), e.session = this.session, !this.editor) return e;
                        var t = this.editor.renderer;
                        e.html && !e.el && (e.el = r.createElement("div"), e.el.innerHTML = e.html), e.el && (r.addCssClass(e.el, "ace_lineWidgetContainer"), e.el.style.position = "absolute", e.el.style.zIndex = 5, t.container.appendChild(e.el), e._inDocument = !0, e.coverGutter || (e.el.style.zIndex = 3), null == e.pixelHeight && (e.pixelHeight = e.el.offsetHeight)), null == e.rowCount && (e.rowCount = e.pixelHeight / t.layerConfig.lineHeight);
                        var i, n = this.session.getFoldAt(e.row, 0);
                        return (e.$fold = n) && (i = this.session.lineWidgets, e.row != n.end.row || i[n.start.row] ? e.hidden = !0 : i[n.start.row] = e), this.session._emit("changeFold", {data: {start: {row: e.row}}}), this.$updateRows(), this.renderWidgets(null, t), this.onWidgetChanged(e), e
                    }, this.removeLineWidget = function (e) {
                        if (e._inDocument = !1, e.session = null, e.el && e.el.parentNode && e.el.parentNode.removeChild(e.el), e.editor && e.editor.destroy) try {
                            e.editor.destroy()
                        } catch (e) {
                        }
                        if (this.session.lineWidgets) {
                            var t = this.session.lineWidgets[e.row];
                            if (t == e) this.session.lineWidgets[e.row] = e.$oldWidget, e.$oldWidget && this.onWidgetChanged(e.$oldWidget); else for (; t;) {
                                if (t.$oldWidget == e) {
                                    t.$oldWidget = e.$oldWidget;
                                    break
                                }
                                t = t.$oldWidget
                            }
                        }
                        this.session._emit("changeFold", {data: {start: {row: e.row}}}), this.$updateRows()
                    }, this.getWidgetsAtRow = function (e) {
                        for (var t = this.session.lineWidgets, i = t && t[e], n = []; i;) n.push(i), i = i.$oldWidget;
                        return n
                    }, this.onWidgetChanged = function (e) {
                        this.session._changedWidgets.push(e), this.editor && this.editor.renderer.updateFull()
                    }, this.measureWidgets = function (e, t) {
                        var i = this.session._changedWidgets, n = t.layerConfig;
                        if (i && i.length) {
                            for (var r = 1 / 0, o = 0; o < i.length; o++) {
                                var s = i[o];
                                if (s && s.el && s.session == this.session) {
                                    if (!s._inDocument) {
                                        if (this.session.lineWidgets[s.row] != s) continue;
                                        s._inDocument = !0, t.container.appendChild(s.el)
                                    }
                                    s.h = s.el.offsetHeight, s.fixedWidth || (s.w = s.el.offsetWidth, s.screenWidth = Math.ceil(s.w / n.characterWidth));
                                    var a = s.h / n.lineHeight;
                                    s.coverLine && (a -= this.session.getRowLineCount(s.row)) < 0 && (a = 0), s.rowCount != a && (s.rowCount = a, s.row < r && (r = s.row))
                                }
                            }
                            r != 1 / 0 && (this.session._emit("changeFold", {data: {start: {row: r}}}), this.session.lineWidgetWidth = null), this.session._changedWidgets = []
                        }
                    }, this.renderWidgets = function (e, t) {
                        var i = t.layerConfig, n = this.session.lineWidgets;
                        if (n) {
                            for (var r = Math.min(this.firstRow, i.firstRow), o = Math.max(this.lastRow, i.lastRow, n.length); 0 < r && !n[r];) r--;
                            this.firstRow = i.firstRow, this.lastRow = i.lastRow, t.$cursorLayer.config = i;
                            for (var s = r; s <= o; s++) {
                                var a, l = n[s];
                                l && l.el && (l.hidden ? l.el.style.top = -100 - (l.pixelHeight || 0) + "px" : (l._inDocument || (l._inDocument = !0, t.container.appendChild(l.el)), a = t.$cursorLayer.getPixelPosition({
                                    row: s,
                                    column: 0
                                }, !0).top, l.coverLine || (a += i.lineHeight * this.session.getRowLineCount(l.row)), l.el.style.top = a - i.offset + "px", a = l.coverGutter ? 0 : t.gutterWidth, l.fixedWidth || (a -= t.scrollLeft), l.el.style.left = a + "px", l.fullWidth && l.screenWidth && (l.el.style.minWidth = i.width + 2 * i.padding + "px"), l.fixedWidth ? l.el.style.right = t.scrollBar.getWidth() + "px" : l.el.style.right = ""))
                            }
                        }
                    }
                }.call(n.prototype), t.LineWidgets = n
            }), ace.define("ace/ext/error_marker", ["require", "exports", "module", "ace/line_widgets", "ace/lib/dom", "ace/range"], function (e, t, i) {
                "use strict";
                var h = e("../line_widgets").LineWidgets, d = e("../lib/dom"), a = e("../range").Range;

                function u(e, t, i) {
                    var n = e.getAnnotations().sort(a.comparePoints);
                    if (n.length) {
                        var r = function (e, t, i) {
                            for (var n = 0, r = e.length - 1; n <= r;) {
                                var o = n + r >> 1, s = i(t, e[o]);
                                if (0 < s) n = 1 + o; else {
                                    if (!(s < 0)) return o;
                                    r = o - 1
                                }
                            }
                            return -(n + 1)
                        }(n, {row: t, column: -1}, a.comparePoints);
                        (r = r < 0 ? -r - 1 : r) >= n.length ? r = 0 < i ? 0 : n.length - 1 : 0 === r && i < 0 && (r = n.length - 1);
                        var o = n[r];
                        if (o && i) {
                            if (o.row === t) {
                                for (; (o = n[r += i]) && o.row === t;) ;
                                if (!o) return n.slice()
                            }
                            var s = [];
                            for (t = o.row; s[i < 0 ? "unshift" : "push"](o), (o = n[r += i]) && o.row == t;) ;
                            return s.length && s
                        }
                    }
                }

                t.showErrorMarker = function (e, t) {
                    var i = e.session;
                    i.widgetManager || (i.widgetManager = new h(i), i.widgetManager.attach(e));
                    var n = e.getCursorPosition(), r = n.row,
                        o = i.widgetManager.getWidgetsAtRow(r).filter(function (e) {
                            return "errorMarker" == e.type
                        })[0];
                    o ? o.destroy() : r -= t;
                    var s, t = u(i, r, t);
                    if (t) {
                        var a = t[0];
                        n.column = (a.pos && "number" != typeof a.column ? a.pos.sc : a.column) || 0, n.row = a.row, s = e.renderer.$gutterLayer.$annotations[n.row]
                    } else {
                        if (o) return;
                        s = {text: ["Looks good!"], className: "ace_ok"}
                    }
                    e.session.unfold(n.row), e.selection.moveToPosition(n);
                    var l = {
                        row: n.row,
                        fixedWidth: !0,
                        coverGutter: !0,
                        el: d.createElement("div"),
                        type: "errorMarker"
                    }, a = l.el.appendChild(d.createElement("div")), o = l.el.appendChild(d.createElement("div"));
                    o.className = "error_widget_arrow " + s.className;
                    n = e.renderer.$cursorLayer.getPixelPosition(n).left;
                    o.style.left = n + e.renderer.gutterWidth - 5 + "px", l.el.className = "error_widget_wrapper", a.className = "error_widget " + s.className, a.innerHTML = s.text.join("<br>"), a.appendChild(d.createElement("div"));

                    function c(e, t, i) {
                        if (0 === t && ("esc" === i || "return" === i)) return l.destroy(), {command: "null"}
                    }

                    l.destroy = function () {
                        e.$mouseHandler.isMousePressed || (e.keyBinding.removeKeyboardHandler(c), i.widgetManager.removeLineWidget(l), e.off("changeSelection", l.destroy), e.off("changeSession", l.destroy), e.off("mouseup", l.destroy), e.off("change", l.destroy))
                    }, e.keyBinding.addKeyboardHandler(c), e.on("changeSelection", l.destroy), e.on("changeSession", l.destroy), e.on("mouseup", l.destroy), e.on("change", l.destroy), e.session.widgetManager.addLineWidget(l), l.el.onmousedown = e.focus.bind(e), e.renderer.scrollCursorIntoView(null, .5, {bottom: l.el.offsetHeight})
                }, d.importCssString("    .error_widget_wrapper {        background: inherit;        color: inherit;        border:none    }    .error_widget {        border-top: solid 2px;        border-bottom: solid 2px;        margin: 5px 0;        padding: 10px 40px;        white-space: pre-wrap;    }    .error_widget.ace_error, .error_widget_arrow.ace_error{        border-color: #ff5a5a    }    .error_widget.ace_warning, .error_widget_arrow.ace_warning{        border-color: #F1D817    }    .error_widget.ace_info, .error_widget_arrow.ace_info{        border-color: #5a5a5a    }    .error_widget.ace_ok, .error_widget_arrow.ace_ok{        border-color: #5aaa5a    }    .error_widget_arrow {        position: absolute;        border: solid 5px;        border-top-color: transparent!important;        border-right-color: transparent!important;        border-left-color: transparent!important;        top: -5px;    }", "")
            }), ace.define("ace/ace", ["require", "exports", "module", "ace/lib/fixoldbrowsers", "ace/lib/dom", "ace/lib/event", "ace/range", "ace/editor", "ace/edit_session", "ace/undomanager", "ace/virtual_renderer", "ace/worker/worker_client", "ace/keyboard/hash_handler", "ace/placeholder", "ace/multi_select", "ace/mode/folding/fold_mode", "ace/theme/textmate", "ace/ext/error_marker", "ace/config"], function (e, o, t) {
                "use strict";
                e("./lib/fixoldbrowsers");
                var s = e("./lib/dom"), a = e("./lib/event"), i = e("./range").Range, l = e("./editor").Editor,
                    n = e("./edit_session").EditSession, r = e("./undomanager").UndoManager,
                    c = e("./virtual_renderer").VirtualRenderer;
                e("./worker/worker_client"), e("./keyboard/hash_handler"), e("./placeholder"), e("./multi_select"), e("./mode/folding/fold_mode"), e("./theme/textmate"), e("./ext/error_marker"), o.config = e("./config"), o.require = e, o.define = C.amdD, o.edit = function (e, t) {
                    if ("string" == typeof e) {
                        var i = e;
                        if (!(e = document.getElementById(i))) throw new Error("ace.edit can't find div #" + i)
                    }
                    if (e && e.env && e.env.editor instanceof l) return e.env.editor;
                    var n, i = "";
                    e && /input|textarea/i.test(e.tagName) ? (i = (n = e).value, e = s.createElement("pre"), n.parentNode.replaceChild(e, n)) : e && (i = e.textContent, e.innerHTML = "");
                    var i = o.createEditSession(i), t = new l(new c(e), i, t),
                        r = {document: i, editor: t, onResize: t.resize.bind(t, null)};
                    return n && (r.textarea = n), a.addListener(window, "resize", r.onResize), t.on("destroy", function () {
                        a.removeListener(window, "resize", r.onResize), r.editor.container.env = null
                    }), t.container.env = t.env = r, t
                }, o.createEditSession = function (e, t) {
                    t = new n(e, t);
                    return t.setUndoManager(new r), t
                }, o.Range = i, o.Editor = l, o.EditSession = n, o.UndoManager = r, o.VirtualRenderer = c, o.version = o.config.version
            }), ace.require(["ace/ace"], function (e) {
                for (var t in e && (e.config.init(!0), e.define = ace.define), window.ace || (window.ace = e), e) e.hasOwnProperty(t) && (window.ace[t] = e[t]);
                window.ace.default = window.ace, i && (i.exports = window.ace)
            })
        }, 3330: function (t, e, i) {
            t = i.nmd(t), ace.define("ace/ext/searchbox", ["require", "exports", "module", "ace/lib/dom", "ace/lib/lang", "ace/lib/event", "ace/keyboard/hash_handler", "ace/lib/keys"], function (e, t, i) {
                "use strict";
                var r = e("../lib/dom"), o = e("../lib/lang"), s = e("../lib/event"),
                    a = '.ace_search {background-color: #ddd;color: #666;border: 1px solid #cbcbcb;border-top: 0 none;overflow: hidden;margin: 0;padding: 4px 6px 0 4px;position: absolute;top: 0;z-index: 99;white-space: normal;}.ace_search.left {border-left: 0 none;border-radius: 0px 0px 5px 0px;left: 0;}.ace_search.right {border-radius: 0px 0px 0px 5px;border-right: 0 none;right: 0;}.ace_search_form, .ace_replace_form {margin: 0 20px 4px 0;overflow: hidden;line-height: 1.9;}.ace_replace_form {margin-right: 0;}.ace_search_form.ace_nomatch {outline: 1px solid red;}.ace_search_field {border-radius: 3px 0 0 3px;background-color: white;color: black;border: 1px solid #cbcbcb;border-right: 0 none;outline: 0;padding: 0;font-size: inherit;margin: 0;line-height: inherit;padding: 0 6px;min-width: 17em;vertical-align: top;min-height: 1.8em;box-sizing: content-box;}.ace_searchbtn {border: 1px solid #cbcbcb;line-height: inherit;display: inline-block;padding: 0 6px;background: #fff;border-right: 0 none;border-left: 1px solid #dcdcdc;cursor: pointer;margin: 0;position: relative;color: #666;}.ace_searchbtn:last-child {border-radius: 0 3px 3px 0;border-right: 1px solid #cbcbcb;}.ace_searchbtn:disabled {background: none;cursor: default;}.ace_searchbtn:hover {background-color: #eef1f6;}.ace_searchbtn.prev, .ace_searchbtn.next {padding: 0px 0.7em}.ace_searchbtn.prev:after, .ace_searchbtn.next:after {content: "";border: solid 2px #888;width: 0.5em;height: 0.5em;border-width:  2px 0 0 2px;display:inline-block;transform: rotate(-45deg);}.ace_searchbtn.next:after {border-width: 0 2px 2px 0 ;}.ace_searchbtn_close {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;border-radius: 50%;border: 0 none;color: #656565;cursor: pointer;font: 16px/16px Arial;padding: 0;height: 14px;width: 14px;top: 9px;right: 7px;position: absolute;}.ace_searchbtn_close:hover {background-color: #656565;background-position: 50% 100%;color: white;}.ace_button {margin-left: 2px;cursor: pointer;-webkit-user-select: none;-moz-user-select: none;-o-user-select: none;-ms-user-select: none;user-select: none;overflow: hidden;opacity: 0.7;border: 1px solid rgba(100,100,100,0.23);padding: 1px;box-sizing:    border-box!important;color: black;}.ace_button:hover {background-color: #eee;opacity:1;}.ace_button:active {background-color: #ddd;}.ace_button.checked {border-color: #3399ff;opacity:1;}.ace_search_options{margin-bottom: 3px;text-align: right;-webkit-user-select: none;-moz-user-select: none;-o-user-select: none;-ms-user-select: none;user-select: none;clear: both;}.ace_search_counter {float: left;font-family: arial;padding: 0 8px;}',
                    n = e("../keyboard/hash_handler").HashHandler, l = e("../lib/keys");
                r.importCssString(a, "ace_searchbox");

                function c(e, t, i) {
                    var n = r.createElement("div");
                    r.buildDom(["div", {class: "ace_search right"}, ["span", {
                        action: "hide",
                        class: "ace_searchbtn_close"
                    }], ["div", {class: "ace_search_form"}, ["input", {
                        class: "ace_search_field",
                        placeholder: "Search for",
                        spellcheck: "false"
                    }], ["span", {action: "findPrev", class: "ace_searchbtn prev"}, "​"], ["span", {
                        action: "findNext",
                        class: "ace_searchbtn next"
                    }, "​"], ["span", {
                        action: "findAll",
                        class: "ace_searchbtn",
                        title: "Alt-Enter"
                    }, "All"]], ["div", {class: "ace_replace_form"}, ["input", {
                        class: "ace_search_field",
                        placeholder: "Replace with",
                        spellcheck: "false"
                    }], ["span", {
                        action: "replaceAndFindNext",
                        class: "ace_searchbtn"
                    }, "Replace"], ["span", {
                        action: "replaceAll",
                        class: "ace_searchbtn"
                    }, "All"]], ["div", {class: "ace_search_options"}, ["span", {
                        action: "toggleReplace",
                        class: "ace_button",
                        title: "Toggle Replace mode",
                        style: "float:left;margin-top:-2px;padding:0 5px;"
                    }, "+"], ["span", {class: "ace_search_counter"}], ["span", {
                        action: "toggleRegexpMode",
                        class: "ace_button",
                        title: "RegExp Search"
                    }, ".*"], ["span", {
                        action: "toggleCaseSensitive",
                        class: "ace_button",
                        title: "CaseSensitive Search"
                    }, "Aa"], ["span", {
                        action: "toggleWholeWords",
                        class: "ace_button",
                        title: "Whole Word Search"
                    }, "\\b"], ["span", {
                        action: "searchInSelection",
                        class: "ace_button",
                        title: "Search In Selection"
                    }, "S"]]], n), this.element = n.firstChild, this.setSession = this.setSession.bind(this), this.$init(), this.setEditor(e), r.importCssString(a, "ace_searchbox", e.container)
                }

                !function () {
                    this.setEditor = function (e) {
                        e.searchBox = this, e.renderer.scroller.appendChild(this.element), this.editor = e
                    }, this.setSession = function (e) {
                        this.searchRange = null, this.$syncOptions(!0)
                    }, this.$initElements = function (e) {
                        this.searchBox = e.querySelector(".ace_search_form"), this.replaceBox = e.querySelector(".ace_replace_form"), this.searchOption = e.querySelector("[action=searchInSelection]"), this.replaceOption = e.querySelector("[action=toggleReplace]"), this.regExpOption = e.querySelector("[action=toggleRegexpMode]"), this.caseSensitiveOption = e.querySelector("[action=toggleCaseSensitive]"), this.wholeWordOption = e.querySelector("[action=toggleWholeWords]"), this.searchInput = this.searchBox.querySelector(".ace_search_field"), this.replaceInput = this.replaceBox.querySelector(".ace_search_field"), this.searchCounter = e.querySelector(".ace_search_counter")
                    }, this.$init = function () {
                        var e = this.element;
                        this.$initElements(e);
                        var n = this;
                        s.addListener(e, "mousedown", function (e) {
                            setTimeout(function () {
                                n.activeInput.focus()
                            }, 0), s.stopPropagation(e)
                        }), s.addListener(e, "click", function (e) {
                            var t = (e.target || e.srcElement).getAttribute("action");
                            t && n[t] ? n[t]() : n.$searchBarKb.commands[t] && n.$searchBarKb.commands[t].exec(n), s.stopPropagation(e)
                        }), s.addCommandKeyListener(e, function (e, t, i) {
                            i = l.keyCodeToString(i), i = n.$searchBarKb.findKeyCommand(t, i);
                            i && i.exec && (i.exec(n), s.stopEvent(e))
                        }), this.$onChange = o.delayedCall(function () {
                            n.find(!1, !1)
                        }), s.addListener(this.searchInput, "input", function () {
                            n.$onChange.schedule(20)
                        }), s.addListener(this.searchInput, "focus", function () {
                            n.activeInput = n.searchInput, n.searchInput.value && n.highlight()
                        }), s.addListener(this.replaceInput, "focus", function () {
                            n.activeInput = n.replaceInput, n.searchInput.value && n.highlight()
                        })
                    }, this.$closeSearchBarKb = new n([{
                        bindKey: "Esc", name: "closeSearchBar", exec: function (e) {
                            e.searchBox.hide()
                        }
                    }]), this.$searchBarKb = new n, this.$searchBarKb.bindKeys({
                        "Ctrl-f|Command-f": function (e) {
                            var t = e.isReplace = !e.isReplace;
                            e.replaceBox.style.display = t ? "" : "none", e.replaceOption.checked = !1, e.$syncOptions(), e.searchInput.focus()
                        }, "Ctrl-H|Command-Option-F": function (e) {
                            e.editor.getReadOnly() || (e.replaceOption.checked = !0, e.$syncOptions(), e.replaceInput.focus())
                        }, "Ctrl-G|Command-G": function (e) {
                            e.findNext()
                        }, "Ctrl-Shift-G|Command-Shift-G": function (e) {
                            e.findPrev()
                        }, esc: function (e) {
                            setTimeout(function () {
                                e.hide()
                            })
                        }, Return: function (e) {
                            e.activeInput == e.replaceInput && e.replace(), e.findNext()
                        }, "Shift-Return": function (e) {
                            e.activeInput == e.replaceInput && e.replace(), e.findPrev()
                        }, "Alt-Return": function (e) {
                            e.activeInput == e.replaceInput && e.replaceAll(), e.findAll()
                        }, Tab: function (e) {
                            (e.activeInput == e.replaceInput ? e.searchInput : e.replaceInput).focus()
                        }
                    }), this.$searchBarKb.addCommands([{
                        name: "toggleRegexpMode",
                        bindKey: {win: "Alt-R|Alt-/", mac: "Ctrl-Alt-R|Ctrl-Alt-/"},
                        exec: function (e) {
                            e.regExpOption.checked = !e.regExpOption.checked, e.$syncOptions()
                        }
                    }, {
                        name: "toggleCaseSensitive",
                        bindKey: {win: "Alt-C|Alt-I", mac: "Ctrl-Alt-R|Ctrl-Alt-I"},
                        exec: function (e) {
                            e.caseSensitiveOption.checked = !e.caseSensitiveOption.checked, e.$syncOptions()
                        }
                    }, {
                        name: "toggleWholeWords",
                        bindKey: {win: "Alt-B|Alt-W", mac: "Ctrl-Alt-B|Ctrl-Alt-W"},
                        exec: function (e) {
                            e.wholeWordOption.checked = !e.wholeWordOption.checked, e.$syncOptions()
                        }
                    }, {
                        name: "toggleReplace", exec: function (e) {
                            e.replaceOption.checked = !e.replaceOption.checked, e.$syncOptions()
                        }
                    }, {
                        name: "searchInSelection", exec: function (e) {
                            e.searchOption.checked = !e.searchRange, e.setSearchRange(e.searchOption.checked && e.editor.getSelectionRange()), e.$syncOptions()
                        }
                    }]), this.setSearchRange = function (e) {
                        (this.searchRange = e) ? this.searchRangeMarker = this.editor.session.addMarker(e, "ace_active-line") : this.searchRangeMarker && (this.editor.session.removeMarker(this.searchRangeMarker), this.searchRangeMarker = null)
                    }, this.$syncOptions = function (e) {
                        r.setCssClass(this.replaceOption, "checked", this.searchRange), r.setCssClass(this.searchOption, "checked", this.searchOption.checked), this.replaceOption.textContent = this.replaceOption.checked ? "-" : "+", r.setCssClass(this.regExpOption, "checked", this.regExpOption.checked), r.setCssClass(this.wholeWordOption, "checked", this.wholeWordOption.checked), r.setCssClass(this.caseSensitiveOption, "checked", this.caseSensitiveOption.checked);
                        var t = this.editor.getReadOnly();
                        this.replaceOption.style.display = t ? "none" : "", this.replaceBox.style.display = this.replaceOption.checked && !t ? "" : "none", this.find(!1, !1, e)
                    }, this.highlight = function (e) {
                        this.editor.session.highlight(e || this.editor.$search.$options.re), this.editor.renderer.updateBackMarkers()
                    }, this.find = function (e, t, i) {
                        i = !this.editor.find(this.searchInput.value, {
                            skipCurrent: e,
                            backwards: t,
                            wrap: !0,
                            regExp: this.regExpOption.checked,
                            caseSensitive: this.caseSensitiveOption.checked,
                            wholeWord: this.wholeWordOption.checked,
                            preventScroll: i,
                            range: this.searchRange
                        }) && this.searchInput.value;
                        r.setCssClass(this.searchBox, "ace_nomatch", i), this.editor._emit("findSearchBox", {match: !i}), this.highlight(), this.updateCounter()
                    }, this.updateCounter = function () {
                        var e = this.editor, t = e.$search.$options.re, i = 0, n = 0;
                        if (t) {
                            var r = this.searchRange ? e.session.getTextRange(this.searchRange) : e.getValue(),
                                o = e.session.doc.positionToIndex(e.selection.anchor);
                            this.searchRange && (o -= e.session.doc.positionToIndex(this.searchRange.start));
                            var s, a;
                            for (t.lastIndex = 0; (a = t.exec(r)) && ((s = a.index) <= o && n++, !(999 < ++i)) && (a[0] || (t.lastIndex = s += 1, !(s >= r.length)));) ;
                        }
                        this.searchCounter.textContent = n + " of " + (999 < i ? "999+" : i)
                    }, this.findNext = function () {
                        this.find(!0, !1)
                    }, this.findPrev = function () {
                        this.find(!0, !0)
                    }, this.findAll = function () {
                        var e = !this.editor.findAll(this.searchInput.value, {
                            regExp: this.regExpOption.checked,
                            caseSensitive: this.caseSensitiveOption.checked,
                            wholeWord: this.wholeWordOption.checked
                        }) && this.searchInput.value;
                        r.setCssClass(this.searchBox, "ace_nomatch", e), this.editor._emit("findSearchBox", {match: !e}), this.highlight(), this.hide()
                    }, this.replace = function () {
                        this.editor.getReadOnly() || this.editor.replace(this.replaceInput.value)
                    }, this.replaceAndFindNext = function () {
                        this.editor.getReadOnly() || (this.editor.replace(this.replaceInput.value), this.findNext())
                    }, this.replaceAll = function () {
                        this.editor.getReadOnly() || this.editor.replaceAll(this.replaceInput.value)
                    }, this.hide = function () {
                        this.active = !1, this.setSearchRange(null), this.editor.off("changeSession", this.setSession), this.element.style.display = "none", this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb), this.editor.focus()
                    }, this.show = function (e, t) {
                        this.active = !0, this.editor.on("changeSession", this.setSession), this.element.style.display = "", this.replaceOption.checked = t, e && (this.searchInput.value = e), this.searchInput.focus(), this.searchInput.select(), this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb), this.$syncOptions(!0)
                    }, this.isFocused = function () {
                        var e = document.activeElement;
                        return e == this.searchInput || e == this.replaceInput
                    }
                }.call(c.prototype), t.SearchBox = c, t.Search = function (e, t) {
                    (e.searchBox || new c(e)).show(e.session.getTextRange(), t)
                }
            }), ace.require(["ace/ext/searchbox"], function (e) {
                t && (t.exports = e)
            })
        }, 4091: function (t, e, i) {
            t = i.nmd(t), ace.define("ace/mode/json_highlight_rules", ["require", "exports", "module", "ace/lib/oop", "ace/mode/text_highlight_rules"], function (e, t, i) {
                "use strict";
                var n = e("../lib/oop"), r = e("./text_highlight_rules").TextHighlightRules, e = function () {
                    this.$rules = {
                        start: [{
                            token: "variable",
                            regex: '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]\\s*(?=:)'
                        }, {token: "string", regex: '"', next: "string"}, {
                            token: "constant.numeric",
                            regex: "0[xX][0-9a-fA-F]+\\b"
                        }, {
                            token: "constant.numeric",
                            regex: "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"
                        }, {token: "constant.language.boolean", regex: "(?:true|false)\\b"}, {
                            token: "text",
                            regex: "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"
                        }, {token: "comment", regex: "\\/\\/.*$"}, {
                            token: "comment.start",
                            regex: "\\/\\*",
                            next: "comment"
                        }, {token: "paren.lparen", regex: "[[({]"}, {
                            token: "paren.rparen",
                            regex: "[\\])}]"
                        }, {token: "text", regex: "\\s+"}],
                        string: [{
                            token: "constant.language.escape",
                            regex: /\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|["\\\/bfnrt])/
                        }, {token: "string", regex: '"|$', next: "start"}, {defaultToken: "string"}],
                        comment: [{token: "comment.end", regex: "\\*\\/", next: "start"}, {defaultToken: "comment"}]
                    }
                };
                n.inherits(e, r), t.JsonHighlightRules = e
            }), ace.define("ace/mode/matching_brace_outdent", ["require", "exports", "module", "ace/range"], function (e, t, i) {
                "use strict";
                var r = e("../range").Range, e = function () {
                };
                !function () {
                    this.checkOutdent = function (e, t) {
                        return !!/^\s+$/.test(e) && /^\s*\}/.test(t)
                    }, this.autoOutdent = function (e, t) {
                        var i = e.getLine(t).match(/^(\s*\})/);
                        if (!i) return 0;
                        var n = i[1].length, i = e.findMatchingBracket({row: t, column: n});
                        if (!i || i.row == t) return 0;
                        i = this.$getIndent(e.getLine(i.row));
                        e.replace(new r(t, 0, t, n - 1), i)
                    }, this.$getIndent = function (e) {
                        return e.match(/^\s*/)[0]
                    }
                }.call(e.prototype), t.MatchingBraceOutdent = e
            }), ace.define("ace/mode/folding/cstyle", ["require", "exports", "module", "ace/lib/oop", "ace/range", "ace/mode/folding/fold_mode"], function (e, t, i) {
                "use strict";
                var n = e("../../lib/oop"), h = e("../../range").Range, e = e("./fold_mode").FoldMode,
                    t = t.FoldMode = function (e) {
                        e && (this.foldingStartMarker = new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + e.start)), this.foldingStopMarker = new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + e.end)))
                    };
                n.inherits(t, e), function () {
                    this.foldingStartMarker = /([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/, this.foldingStopMarker = /^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/, this.singleLineBlockCommentRe = /^\s*(\/\*).*\*\/\s*$/, this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/, this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/, this._getFoldWidgetBase = this.getFoldWidget, this.getFoldWidget = function (e, t, i) {
                        var n = e.getLine(i);
                        if (this.singleLineBlockCommentRe.test(n) && !this.startRegionRe.test(n) && !this.tripleStarBlockCommentRe.test(n)) return "";
                        i = this._getFoldWidgetBase(e, t, i);
                        return !i && this.startRegionRe.test(n) ? "start" : i
                    }, this.getFoldWidgetRange = function (e, t, i, n) {
                        var r = e.getLine(i);
                        if (this.startRegionRe.test(r)) return this.getCommentRegionBlock(e, r, i);
                        var o = r.match(this.foldingStartMarker);
                        if (o) {
                            var s = o.index;
                            if (o[1]) return this.openingBracketBlock(e, o[1], i, s);
                            var a = e.getCommentFoldRange(i, s + o[0].length, 1);
                            return a && !a.isMultiLine() && (n ? a = this.getSectionRange(e, i) : "all" != t && (a = null)), a
                        }
                        if ("markbegin" !== t && (o = r.match(this.foldingStopMarker))) {
                            s = o.index + o[0].length;
                            return o[1] ? this.closingBracketBlock(e, o[1], i, s) : e.getCommentFoldRange(i, s, -1)
                        }
                    }, this.getSectionRange = function (e, t) {
                        for (var i = (a = e.getLine(t)).search(/\S/), n = t, r = a.length, o = t += 1, s = e.getLength(); ++t < s;) {
                            var a, l = (a = e.getLine(t)).search(/\S/);
                            if (-1 !== l) {
                                if (l < i) break;
                                var c = this.getFoldWidgetRange(e, "all", t);
                                if (c) {
                                    if (c.start.row <= n) break;
                                    if (c.isMultiLine()) t = c.end.row; else if (i == l) break
                                }
                                o = t
                            }
                        }
                        return new h(n, r, o, e.getLine(o).length)
                    }, this.getCommentRegionBlock = function (e, t, i) {
                        for (var n = t.search(/\s*$/), r = e.getLength(), o = i, s = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/, a = 1; ++i < r;) {
                            t = e.getLine(i);
                            var l = s.exec(t);
                            if (l && (l[1] ? a-- : a++, !a)) break
                        }
                        if (o < i) return new h(o, n, i, t.length)
                    }
                }.call(t.prototype)
            }), ace.define("ace/mode/json", ["require", "exports", "module", "ace/lib/oop", "ace/mode/text", "ace/mode/json_highlight_rules", "ace/mode/matching_brace_outdent", "ace/mode/behaviour/cstyle", "ace/mode/folding/cstyle", "ace/worker/worker_client"], function (e, t, i) {
                "use strict";
                var n = e("../lib/oop"), r = e("./text").Mode, o = e("./json_highlight_rules").JsonHighlightRules,
                    s = e("./matching_brace_outdent").MatchingBraceOutdent, a = e("./behaviour/cstyle").CstyleBehaviour,
                    l = e("./folding/cstyle").FoldMode, c = e("../worker/worker_client").WorkerClient, e = function () {
                        this.HighlightRules = o, this.$outdent = new s, this.$behaviour = new a, this.foldingRules = new l
                    };
                n.inherits(e, r), function () {
                    this.lineCommentStart = "//", this.blockComment = {
                        start: "/*",
                        end: "*/"
                    }, this.getNextLineIndent = function (e, t, i) {
                        var n = this.$getIndent(t);
                        return "start" == e && t.match(/^.*[\{\(\[]\s*$/) && (n += i), n
                    }, this.checkOutdent = function (e, t, i) {
                        return this.$outdent.checkOutdent(t, i)
                    }, this.autoOutdent = function (e, t, i) {
                        this.$outdent.autoOutdent(t, i)
                    }, this.createWorker = function (t) {
                        var e = new c(["ace"], "ace/mode/json_worker", "JsonWorker");
                        return e.attachToDocument(t.getDocument()), e.on("annotate", function (e) {
                            t.setAnnotations(e.data)
                        }), e.on("terminate", function () {
                            t.clearAnnotations()
                        }), e
                    }, this.$id = "ace/mode/json"
                }.call(e.prototype), t.Mode = e
            }), ace.require(["ace/mode/json"], function (e) {
                t && (t.exports = e)
            })
        }, 8903: function (e, t, i) {
            "use strict";
            var s = i(5689), l = i(3969), n = i(5255), c = i(4293), r = i(3508), o = i(3368), a = i(742), h = i(9394),
                d = i(3724);
            (e.exports = m).prototype.validate = function (e, t) {
                var i;
                if ("string" == typeof e) {
                    if (!(i = this.getSchema(e))) throw new Error('no schema with key or ref "' + e + '"')
                } else {
                    e = this._addSchema(e);
                    i = e.validate || this._compile(e)
                }
                t = i(t);
                !0 !== i.$async && (this.errors = i.errors);
                return t
            }, m.prototype.compile = function (e, t) {
                t = this._addSchema(e, void 0, t);
                return t.validate || this._compile(t)
            }, m.prototype.addSchema = function (e, t, i, n) {
                if (Array.isArray(e)) {
                    for (var r = 0; r < e.length; r++) this.addSchema(e[r], void 0, i, n);
                    return this
                }
                var o = this._getId(e);
                if (void 0 !== o && "string" != typeof o) throw new Error("schema id must be string");
                return b(this, t = l.normalizeId(t || o)), this._schemas[t] = this._addSchema(e, i, n, !0), this
            }, m.prototype.addMetaSchema = function (e, t, i) {
                return this.addSchema(e, t, i, !0), this
            }, m.prototype.validateSchema = function (e, t) {
                var i = e.$schema;
                if (void 0 !== i && "string" != typeof i) throw new Error("$schema must be a string");
                if (!(i = i || this._opts.defaultMeta || function (e) {
                    var t = e._opts.meta;
                    return e._opts.defaultMeta = "object" == typeof t ? e._getId(t) || t : e.getSchema(u) ? u : void 0, e._opts.defaultMeta
                }(this))) return this.logger.warn("meta-schema not available"), !(this.errors = null);
                e = this.validate(i, e);
                if (!e && t) {
                    t = "schema is invalid: " + this.errorsText();
                    if ("log" != this._opts.validateSchema) throw new Error(t);
                    this.logger.error(t)
                }
                return e
            }, m.prototype.getSchema = function (e) {
                var t = f(this, e);
                switch (typeof t) {
                    case"object":
                        return t.validate || this._compile(t);
                    case"string":
                        return this.getSchema(t);
                    case"undefined":
                        return function (e, t) {
                            var i = l.schema.call(e, {schema: {}}, t);
                            if (i) {
                                var n = i.schema, r = i.root, o = i.baseId, i = s.call(e, n, r, void 0, o);
                                return e._fragments[t] = new c({
                                    ref: t,
                                    fragment: !0,
                                    schema: n,
                                    root: r,
                                    baseId: o,
                                    validate: i
                                }), i
                            }
                        }(this, e)
                }
            }, m.prototype.removeSchema = function (e) {
                if (e instanceof RegExp) return C(this, this._schemas, e), C(this, this._refs, e), this;
                switch (typeof e) {
                    case"undefined":
                        return C(this, this._schemas), C(this, this._refs), this._cache.clear(), this;
                    case"string":
                        var t = f(this, e);
                        return t && this._cache.del(t.cacheKey), delete this._schemas[e], delete this._refs[e], this;
                    case"object":
                        t = this._opts.serialize, t = t ? t(e) : e;
                        this._cache.del(t);
                        t = this._getId(e);
                        t && (t = l.normalizeId(t), delete this._schemas[t], delete this._refs[t])
                }
                return this
            }, m.prototype.addFormat = function (e, t) {
                "string" == typeof t && (t = new RegExp(t));
                return this._formats[e] = t, this
            }, m.prototype.errorsText = function (e, t) {
                if (!(e = e || this.errors)) return "No errors";
                for (var i = void 0 === (t = t || {}).separator ? ", " : t.separator, n = void 0 === t.dataVar ? "data" : t.dataVar, r = "", o = 0; o < e.length; o++) {
                    var s = e[o];
                    s && (r += n + s.dataPath + " " + s.message + i)
                }
                return r.slice(0, -i.length)
            }, m.prototype._addSchema = function (e, t, i, n) {
                if ("object" != typeof e && "boolean" != typeof e) throw new Error("schema should be object or boolean");
                var r = this._opts.serialize, o = r ? r(e) : e, s = this._cache.get(o);
                if (s) return s;
                n = n || !1 !== this._opts.addUsedSchema;
                r = l.normalizeId(this._getId(e));
                r && n && b(this, r);
                var a, s = !1 !== this._opts.validateSchema && !t;
                s && !(a = r && r == l.normalizeId(e.$schema)) && this.validateSchema(e, !0);
                t = l.ids.call(this, e), i = new c({id: r, schema: e, localRefs: t, cacheKey: o, meta: i});
                "#" != r[0] && n && (this._refs[r] = i);
                this._cache.put(o, i), s && a && this.validateSchema(e, !0);
                return i
            }, m.prototype._compile = function (i, e) {
                if (i.compiling) return (i.validate = r).schema = i.schema, r.errors = null, r.root = e || r, !0 === i.schema.$async && (r.$async = !0), r;
                var t, n;
                i.compiling = !0, i.meta && (t = this._opts, this._opts = this._metaOpts);
                try {
                    n = s.call(this, i.schema, e, i.localRefs)
                } catch (e) {
                    throw delete i.validate, e
                } finally {
                    i.compiling = !1, i.meta && (this._opts = t)
                }
                return i.validate = n, i.refs = n.refs, i.refVal = n.refVal, i.root = n.root, n;

                function r() {
                    var e = i.validate, t = e.apply(this, arguments);
                    return r.errors = e.errors, t
                }
            }, m.prototype.compileAsync = i(9677);
            e = i(7931);
            m.prototype.addKeyword = e.add, m.prototype.getKeyword = e.get, m.prototype.removeKeyword = e.remove, m.prototype.validateKeyword = e.validate;
            e = i(5359);
            m.ValidationError = e.Validation, m.MissingRefError = e.MissingRef, m.$dataMetaSchema = h;
            var u = "http://json-schema.org/draft-07/schema",
                g = ["removeAdditional", "useDefaults", "coerceTypes", "strictDefaults"], p = ["/properties"];

            function m(e) {
                if (!(this instanceof m)) return new m(e);
                e = this._opts = d.copy(e) || {}, function (e) {
                    var t = e._opts.logger;
                    if (!1 === t) e.logger = {log: y, warn: y, error: y}; else {
                        if (!("object" == typeof (t = void 0 === t ? console : t) && t.log && t.warn && t.error)) throw new Error("logger must implement log, warn and error methods");
                        e.logger = t
                    }
                }(this), this._schemas = {}, this._refs = {}, this._fragments = {}, this._formats = o(e.format), this._cache = e.cache || new n, this._loadingSchemas = {}, this._compilations = [], this.RULES = a(),
                    this._getId = function (e) {
                        switch (e.schemaId) {
                            case"auto":
                                return A;
                            case"id":
                                return I;
                            default:
                                return v
                        }
                    }(e), e.loopRequired = e.loopRequired || 1 / 0, "property" == e.errorDataPath && (e._errorDataPathProperty = !0), void 0 === e.serialize && (e.serialize = r), this._metaOpts = function (e) {
                    for (var t = d.copy(e._opts), i = 0; i < g.length; i++) delete t[g[i]];
                    return t
                }(this), e.formats && function (e) {
                    for (var t in e._opts.formats) {
                        var i = e._opts.formats[t];
                        e.addFormat(t, i)
                    }
                }(this), e.keywords && function (e) {
                    for (var t in e._opts.keywords) {
                        var i = e._opts.keywords[t];
                        e.addKeyword(t, i)
                    }
                }(this), function (e) {
                    var t;
                    e._opts.$data && (t = i(894), e.addMetaSchema(t, t.$id, !0));
                    !1 !== e._opts.meta && (t = i(6680), e._opts.$data && (t = h(t, p)), e.addMetaSchema(t, u, !0), e._refs["http://json-schema.org/schema"] = u)
                }(this), "object" == typeof e.meta && this.addMetaSchema(e.meta), e.nullable && this.addKeyword("nullable", {metaSchema: {type: "boolean"}}), function (e) {
                    var t = e._opts.schemas;
                    if (t) if (Array.isArray(t)) e.addSchema(t); else for (var i in t) e.addSchema(t[i], i)
                }(this)
            }

            function f(e, t) {
                return t = l.normalizeId(t), e._schemas[t] || e._refs[t] || e._fragments[t]
            }

            function C(e, t, i) {
                for (var n in t) {
                    var r = t[n];
                    r.meta || i && !i.test(n) || (e._cache.del(r.cacheKey), delete t[n])
                }
            }

            function I(e) {
                return e.$id && this.logger.warn("schema $id ignored", e.$id), e.id
            }

            function v(e) {
                return e.id && this.logger.warn("schema id ignored", e.id), e.$id
            }

            function A(e) {
                if (e.$id && e.id && e.$id != e.id) throw new Error("schema $id is different from id");
                return e.$id || e.id
            }

            function b(e, t) {
                if (e._schemas[t] || e._refs[t]) throw new Error('schema with key or id "' + t + '" already exists')
            }

            function y() {
            }
        }, 5255: function (e) {
            "use strict";
            e = e.exports = function () {
                this._cache = {}
            };
            e.prototype.put = function (e, t) {
                this._cache[e] = t
            }, e.prototype.get = function (e) {
                return this._cache[e]
            }, e.prototype.del = function (e) {
                delete this._cache[e]
            }, e.prototype.clear = function () {
                this._cache = {}
            }
        }, 9677: function (e, t, i) {
            "use strict";
            var n = i(5359).MissingRef;

            function r(t, s, i) {
                var a = this;
                if ("function" != typeof this._opts.loadSchema) throw new Error("options.loadSchema should be a function");
                "function" == typeof s && (i = s, s = void 0);
                var e = l(t).then(function () {
                    var e = a._addSchema(t, void 0, s);
                    return e.validate || function r(o) {
                        try {
                            return a._compile(o)
                        } catch (e) {
                            if (e instanceof n) return t(e);
                            throw e
                        }

                        function t(e) {
                            var t = e.missingSchema;
                            if (n(t)) throw new Error("Schema " + t + " is loaded but " + e.missingRef + " cannot be resolved");
                            e = a._loadingSchemas[t];
                            return e || (e = a._loadingSchemas[t] = a._opts.loadSchema(t)).then(i, i), e.then(function (e) {
                                if (!n(t)) return l(e).then(function () {
                                    n(t) || a.addSchema(e, t, void 0, s)
                                })
                            }).then(function () {
                                return r(o)
                            });

                            function i() {
                                delete a._loadingSchemas[t]
                            }

                            function n(e) {
                                return a._refs[e] || a._schemas[e]
                            }
                        }
                    }(e)
                });
                return i && e.then(function (e) {
                    i(null, e)
                }, i), e;

                function l(e) {
                    e = e.$schema;
                    return e && !a.getSchema(e) ? r.call(a, {$ref: e}, !0) : Promise.resolve()
                }
            }

            e.exports = r
        }, 5359: function (e, t, i) {
            "use strict";
            var n = i(3969);

            function r(e, t, i) {
                this.message = i || r.message(e, t), this.missingRef = n.url(e, t), this.missingSchema = n.normalizeId(n.fullPath(this.missingRef))
            }

            function o(e) {
                return e.prototype = Object.create(Error.prototype), e.prototype.constructor = e
            }

            e.exports = {
                Validation: o(function (e) {
                    this.message = "validation failed", this.errors = e, this.ajv = this.validation = !0
                }), MissingRef: o(r)
            }, r.message = function (e, t) {
                return "can't resolve reference " + t + " from id " + e
            }
        }, 3368: function (e, t, i) {
            "use strict";
            var n = i(3724), r = /^(\d\d\d\d)-(\d\d)-(\d\d)$/, o = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
                s = /^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d(?::?\d\d)?)?$/i,
                a = /^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i,
                l = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,
                c = /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i,
                h = /^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i,
                d = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i, u = /^(?:\/(?:[^~/]|~0|~1)*)*$/,
                g = /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i,
                i = /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/;

            function p(e) {
                return n.copy(p[e = "full" == e ? "full" : "fast"])
            }

            function m(e) {
                var t = e.match(r);
                if (!t) return !1;
                var i = +t[1], e = +t[2], t = +t[3];
                return 1 <= e && e <= 12 && 1 <= t && t <= (2 != e || ((i = i) % 4 != 0 || i % 100 == 0 && i % 400 != 0) ? o[e] : 29)
            }

            function f(e, t) {
                var i = e.match(s);
                if (!i) return !1;
                var n = i[1], r = i[2], e = i[3], i = i[5];
                return (n <= 23 && r <= 59 && e <= 59 || 23 == n && 59 == r && 60 == e) && (!t || i)
            }

            (e.exports = p).fast = {
                date: /^\d\d\d\d-[0-1]\d-[0-3]\d$/,
                time: /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i,
                "date-time": /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i,
                uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i,
                "uri-reference": /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i,
                "uri-template": c,
                url: h,
                email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,
                hostname: a,
                ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,
                ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,
                regex: A,
                uuid: d,
                "json-pointer": u,
                "json-pointer-uri-fragment": g,
                "relative-json-pointer": i
            }, p.full = {
                date: m,
                time: f,
                "date-time": function (e) {
                    e = e.split(C);
                    return 2 == e.length && m(e[0]) && f(e[1], !0)
                },
                uri: function (e) {
                    return I.test(e) && l.test(e)
                },
                "uri-reference": /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,
                "uri-template": c,
                url: h,
                email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,
                hostname: a,
                ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,
                ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,
                regex: A,
                uuid: d,
                "json-pointer": u,
                "json-pointer-uri-fragment": g,
                "relative-json-pointer": i
            };
            var C = /t|\s/i;
            var I = /\/|:/;
            var v = /[^\\]\\Z/;

            function A(e) {
                if (v.test(e)) return !1;
                try {
                    return new RegExp(e), !0
                } catch (e) {
                    return !1
                }
            }
        }, 5689: function (e, t, i) {
            "use strict";
            var E = i(3969), R = i(3724), T = i(5359), _ = i(3508), $ = i(1869), L = R.ucs2length, B = i(2303),
                W = T.Validation;

            function N(e, a, l, t) {
                var c = this, h = this._opts, d = [void 0], u = {}, s = [], i = {}, g = [], n = {}, p = [];
                a = a || {schema: e, refVal: d, refs: u};
                var r = function (e, t, i) {
                    var n = G.call(this, e, t, i);
                    return 0 <= n ? {
                        index: n,
                        compiling: !0
                    } : (n = this._compilations.length, this._compilations[n] = {
                        schema: e,
                        root: t,
                        baseId: i
                    }, {index: n, compiling: !1})
                }.call(this, e, a, t), o = this._compilations[r.index];
                if (r.compiling) return o.callValidate = v;
                var m = this._formats, f = this.RULES;
                try {
                    var C = A(e, a, l, t);
                    o.validate = C;
                    var I = o.callValidate;
                    return I && (I.schema = C.schema, I.errors = null, I.refs = C.refs, I.refVal = C.refVal, I.root = C.root, I.$async = C.$async, h.sourceCode && (I.source = C.source)), C
                } finally {
                    !function (e, t, i) {
                        i = G.call(this, e, t, i);
                        0 <= i && this._compilations.splice(i, 1)
                    }.call(this, e, a, t)
                }

                function v() {
                    var e = o.validate, t = e.apply(this, arguments);
                    return v.errors = e.errors, t
                }

                function A(e, t, i, n) {
                    var r = !t || t.schema == e;
                    if (t.schema != a.schema) return N.call(c, e, t, i, n);
                    i = !0 === e.$async, n = $({
                        isTop: !0,
                        schema: e,
                        isRoot: r,
                        baseId: n,
                        root: t,
                        schemaPath: "",
                        errSchemaPath: "#",
                        errorPath: '""',
                        MissingRefError: T.MissingRef,
                        RULES: f,
                        validate: $,
                        util: R,
                        resolve: E,
                        resolveRef: b,
                        usePattern: S,
                        useDefault: x,
                        useCustomRule: k,
                        opts: h,
                        formats: m,
                        logger: c.logger,
                        self: c
                    }), n = Z(d, H) + Z(s, F) + Z(g, P) + Z(p, V) + n;
                    h.processCode && (n = h.processCode(n, e));
                    try {
                        var o = new Function("self", "RULES", "formats", "root", "refVal", "defaults", "customRules", "equal", "ucs2length", "ValidationError", n)(c, f, m, a, d, g, p, B, L, W);
                        d[0] = o
                    } catch (e) {
                        throw c.logger.error("Error compiling schema, function code:", n), e
                    }
                    return o.schema = e, o.errors = null, o.refs = u, o.refVal = d, o.root = r ? o : t, i && (o.$async = !0), !0 === h.sourceCode && (o.source = {
                        code: n,
                        patterns: s,
                        defaults: g
                    }), o
                }

                function b(e, t, i) {
                    t = E.url(e, t);
                    var n = u[t];
                    if (void 0 !== n) return w(o = d[n], s = "refVal[" + n + "]");
                    if (!i && a.refs) {
                        var r = a.refs[t];
                        if (void 0 !== r) return w(o = a.refVal[r], s = y(t, o))
                    }
                    var o, s = y(t), r = E.call(c, A, a, t);
                    if (void 0 !== r || (o = l && l[t]) && (r = E.inlineRef(o, h.inlineRefs) ? o : N.call(c, o, a, l, e)), void 0 !== r) return function (e, t) {
                        e = u[e];
                        d[e] = t
                    }(t, r), w(r, s);
                    delete u[t]
                }

                function y(e, t) {
                    var i = d.length;
                    return d[i] = t, "refVal" + (u[e] = i)
                }

                function w(e, t) {
                    return "object" == typeof e || "boolean" == typeof e ? {code: t, schema: e, inline: !0} : {
                        code: t,
                        $async: e && !!e.$async
                    }
                }

                function S(e) {
                    var t = i[e];
                    return void 0 === t && (t = i[e] = s.length, s[t] = e), "pattern" + t
                }

                function x(e) {
                    switch (typeof e) {
                        case"boolean":
                        case"number":
                            return "" + e;
                        case"string":
                            return R.toQuotedString(e);
                        case"object":
                            if (null === e) return "null";
                            var t = _(e), i = n[t];
                            return void 0 === i && (i = n[t] = g.length, g[i] = e), "default" + i
                    }
                }

                function k(e, t, i, n) {
                    if (!1 !== c._opts.validateSchema) {
                        var r = e.definition.dependencies;
                        if (r && !r.every(function (e) {
                            return Object.prototype.hasOwnProperty.call(i, e)
                        })) throw new Error("parent schema must have all required keywords: " + r.join(","));
                        var o = e.definition.validateSchema;
                        if (o) if (!o(t)) {
                            var s = "keyword schema is invalid: " + c.errorsText(o.errors);
                            if ("log" != c._opts.validateSchema) throw new Error(s);
                            c.logger.error(s)
                        }
                    }
                    var a, r = e.definition.compile, o = e.definition.inline, s = e.definition.macro;
                    if (r) a = r.call(c, t, i, n); else if (s) a = s.call(c, t, i, n), !1 !== h.validateSchema && c.validateSchema(a, !0); else if (o) a = o.call(c, n, e.keyword, t, i); else if (!(a = e.definition.validate)) return;
                    if (void 0 === a) throw new Error('custom keyword "' + e.keyword + '"failed to compile');
                    e = p.length;
                    return {code: "customRule" + e, validate: p[e] = a}
                }
            }

            function G(e, t, i) {
                for (var n = 0; n < this._compilations.length; n++) {
                    var r = this._compilations[n];
                    if (r.schema == e && r.root == t && r.baseId == i) return n
                }
                return -1
            }

            function F(e, t) {
                return "var pattern" + e + " = new RegExp(" + R.toQuotedString(t[e]) + ");"
            }

            function P(e) {
                return "var default" + e + " = defaults[" + e + "];"
            }

            function H(e, t) {
                return void 0 === t[e] ? "" : "var refVal" + e + " = refVal[" + e + "];"
            }

            function V(e) {
                return "var customRule" + e + " = customRules[" + e + "];"
            }

            function Z(e, t) {
                if (!e.length) return "";
                for (var i = "", n = 0; n < e.length; n++) i += t(n, e);
                return i
            }

            e.exports = N
        }, 3969: function (e, t, i) {
            "use strict";
            var g = i(7533), p = i(2303), m = i(3724), a = i(4293), n = i(500);

            function l(e, t, i) {
                var n = this._refs[i];
                if ("string" == typeof n) {
                    if (!this._refs[n]) return l.call(this, e, t, n);
                    n = this._refs[n]
                }
                if ((n = n || this._schemas[i]) instanceof a) return u(n.schema, this._opts.inlineRefs) ? n.schema : n.validate || this._compile(n);
                var r, o, s, i = c.call(this, t, i);
                return i && (r = i.schema, t = i.root, s = i.baseId), r instanceof a ? o = r.validate || e.call(this, r.schema, t, void 0, s) : void 0 !== r && (o = u(r, this._opts.inlineRefs) ? r : e.call(this, r, t, void 0, s)), o
            }

            function c(e, t) {
                var i = g.parse(t), n = C(i), r = f(this._getId(e.schema));
                if (0 === Object.keys(e.schema).length || n !== r) {
                    var o = I(n), n = this._refs[o];
                    if ("string" == typeof n) return function (e, t, i) {
                        var n = c.call(this, e, t);
                        if (n) {
                            var r = n.schema, t = n.baseId;
                            e = n.root;
                            n = this._getId(r);
                            return n && (t = v(t, n)), s.call(this, i, t, r, e)
                        }
                    }.call(this, e, n, i);
                    if (n instanceof a) n.validate || this._compile(n), e = n; else {
                        if (!((n = this._schemas[o]) instanceof a)) return;
                        if (n.validate || this._compile(n), o == I(t)) return {schema: n, root: e, baseId: r};
                        e = n
                    }
                    if (!e.schema) return;
                    r = f(this._getId(e.schema))
                }
                return s.call(this, i, r, e.schema, e)
            }

            (e.exports = l).normalizeId = I, l.fullPath = f, l.url = v, l.ids = function (e) {
                var t = I(this._getId(e)), c = {"": t}, h = {"": f(t, !1)}, d = {}, u = this;
                return n(e, {allKeys: !0}, function (e, t, i, n, r, o, s) {
                    if ("" !== t) {
                        var a = u._getId(e), l = c[n], r = h[n] + "/" + r;
                        if (void 0 !== s && (r += "/" + ("number" == typeof s ? s : m.escapeFragment(s))), "string" == typeof a) {
                            a = l = I(l ? g.resolve(l, a) : a), s = u._refs[a];
                            if ((s = "string" == typeof s ? u._refs[s] : s) && s.schema) {
                                if (!p(e, s.schema)) throw new Error('id "' + a + '" resolves to more than one schema')
                            } else if (a != I(r)) if ("#" == a[0]) {
                                if (d[a] && !p(e, d[a])) throw new Error('id "' + a + '" resolves to more than one schema');
                                d[a] = e
                            } else u._refs[a] = r
                        }
                        c[t] = l, h[t] = r
                    }
                }), d
            }, l.inlineRef = u, l.schema = c;
            var h = m.toHash(["properties", "patternProperties", "enum", "dependencies", "definitions"]);

            function s(e, t, i, n) {
                if (e.fragment = e.fragment || "", "/" == e.fragment.slice(0, 1)) {
                    for (var r = e.fragment.split("/"), o = 1; o < r.length; o++) {
                        var s = r[o];
                        if (s) {
                            if (void 0 === (i = i[s = m.unescapeFragment(s)])) break;
                            h[s] || ((s = this._getId(i)) && (t = v(t, s)), i.$ref && (s = v(t, i.$ref), (s = c.call(this, n, s)) && (i = s.schema, n = s.root, t = s.baseId)))
                        }
                    }
                    return void 0 !== i && i !== n.schema ? {schema: i, root: n, baseId: t} : void 0
                }
            }

            var d = m.toHash(["type", "format", "pattern", "maxLength", "minLength", "maxProperties", "minProperties", "maxItems", "minItems", "maximum", "minimum", "uniqueItems", "multipleOf", "required", "enum"]);

            function u(e, t) {
                return !1 !== t && (void 0 === t || !0 === t ? function e(t) {
                    var i;
                    if (Array.isArray(t)) {
                        for (var n = 0; n < t.length; n++) if ("object" == typeof (i = t[n]) && !e(i)) return !1
                    } else for (var r in t) {
                        if ("$ref" == r) return !1;
                        if ("object" == typeof (i = t[r]) && !e(i)) return !1
                    }
                    return !0
                }(e) : t ? function e(t) {
                    var i, n = 0;
                    if (Array.isArray(t)) {
                        for (var r = 0; r < t.length; r++) if ("object" == typeof (i = t[r]) && (n += e(i)), n == 1 / 0) return 1 / 0
                    } else for (var o in t) {
                        if ("$ref" == o) return 1 / 0;
                        if (d[o]) n++; else if ("object" == typeof (i = t[o]) && (n += e(i) + 1), n == 1 / 0) return 1 / 0
                    }
                    return n
                }(e) <= t : void 0)
            }

            function f(e, t) {
                return !1 !== t && (e = I(e)), C(g.parse(e))
            }

            function C(e) {
                return g.serialize(e).split("#")[0] + "#"
            }

            var r = /#\/?$/;

            function I(e) {
                return e ? e.replace(r, "") : ""
            }

            function v(e, t) {
                return t = I(t), g.resolve(e, t)
            }
        }, 742: function (e, t, i) {
            "use strict";
            var o = i(9646), s = i(3724).toHash;
            e.exports = function () {
                var n = [{
                        type: "number",
                        rules: [{maximum: ["exclusiveMaximum"]}, {minimum: ["exclusiveMinimum"]}, "multipleOf", "format"]
                    }, {type: "string", rules: ["maxLength", "minLength", "pattern", "format"]}, {
                        type: "array",
                        rules: ["maxItems", "minItems", "items", "contains", "uniqueItems"]
                    }, {
                        type: "object",
                        rules: ["maxProperties", "minProperties", "required", "dependencies", "propertyNames", {properties: ["additionalProperties", "patternProperties"]}]
                    }, {rules: ["$ref", "const", "enum", "not", "anyOf", "oneOf", "allOf", "if"]}],
                    r = ["type", "$comment"];
                return n.all = s(r), n.types = s(["number", "integer", "string", "array", "object", "boolean", "null"]), n.forEach(function (e) {
                    e.rules = e.rules.map(function (e) {
                        var t, i;
                        return "object" == typeof e && (i = e[t = Object.keys(e)[0]], e = t, i.forEach(function (e) {
                            r.push(e), n.all[e] = !0
                        })), r.push(e), n.all[e] = {keyword: e, code: o[e], implements: i}
                    }), n.all.$comment = {keyword: "$comment", code: o.$comment}, e.type && (n.types[e.type] = e)
                }), n.keywords = s(r.concat(["$schema", "$id", "id", "$data", "$async", "title", "description", "default", "definitions", "examples", "readOnly", "writeOnly", "contentMediaType", "contentEncoding", "additionalItems", "then", "else"])), n.custom = {}, n
            }
        }, 4293: function (e, t, i) {
            "use strict";
            var n = i(3724);
            e.exports = function (e) {
                n.copy(e, this)
            }
        }, 6887: function (e) {
            "use strict";
            e.exports = function (e) {
                for (var t, i = 0, n = e.length, r = 0; r < n;) i++, 55296 <= (t = e.charCodeAt(r++)) && t <= 56319 && r < n && 56320 == (64512 & (t = e.charCodeAt(r))) && r++;
                return i
            }
        }, 3724: function (e, t, i) {
            "use strict";

            function o(e, t, i, n) {
                var r = n ? " !== " : " === ", o = n ? " || " : " && ", s = n ? "!" : "", a = n ? "" : "!";
                switch (e) {
                    case"null":
                        return t + r + "null";
                    case"array":
                        return s + "Array.isArray(" + t + ")";
                    case"object":
                        return "(" + s + t + o + "typeof " + t + r + '"object"' + o + a + "Array.isArray(" + t + "))";
                    case"integer":
                        return "(typeof " + t + r + '"number"' + o + a + "(" + t + " % 1)" + o + t + r + t + (i ? o + s + "isFinite(" + t + ")" : "") + ")";
                    case"number":
                        return "(typeof " + t + r + '"' + e + '"' + (i ? o + s + "isFinite(" + t + ")" : "") + ")";
                    default:
                        return "typeof " + t + r + '"' + e + '"'
                }
            }

            e.exports = {
                copy: function (e, t) {
                    for (var i in t = t || {}, e) t[i] = e[i];
                    return t
                },
                checkDataType: o,
                checkDataTypes: function (e, t, i) {
                    {
                        if (1 === e.length) return o(e[0], t, i, !0);
                        var n, r = "", e = a(e);
                        for (n in e.array && e.object && (r = e.null ? "(" : "(!" + t + " || ", r += "typeof " + t + ' !== "object")', delete e.null, delete e.array, delete e.object), e.number && delete e.integer, e) r += (r ? " && " : "") + o(n, t, i, !0);
                        return r
                    }
                },
                coerceToTypes: function (e, t) {
                    {
                        if (!Array.isArray(t)) return s[t] ? [t] : "array" === e && "array" === t ? ["array"] : void 0;
                        for (var i = [], n = 0; n < t.length; n++) {
                            var r = t[n];
                            (s[r] || "array" === e && "array" === r) && (i[i.length] = r)
                        }
                        if (i.length) return i
                    }
                },
                toHash: a,
                getProperty: h,
                escapeQuotes: l,
                equal: i(2303),
                ucs2length: i(6887),
                varOccurences: function (e, t) {
                    t += "[^0-9]";
                    t = e.match(new RegExp(t, "g"));
                    return t ? t.length : 0
                },
                varReplace: function (e, t, i) {
                    return t += "([^0-9])", i = i.replace(/\$/g, "$$$$"), e.replace(new RegExp(t, "g"), i + "$1")
                },
                schemaHasRules: function (e, t) {
                    if ("boolean" == typeof e) return !e;
                    for (var i in e) if (t[i]) return !0
                },
                schemaHasRulesExcept: function (e, t, i) {
                    if ("boolean" == typeof e) return !e && "not" != i;
                    for (var n in e) if (n != i && t[n]) return !0
                },
                schemaUnknownRules: function (e, t) {
                    if ("boolean" != typeof e) for (var i in e) if (!t[i]) return i
                },
                toQuotedString: c,
                getPathExpr: function (e, t, i, n) {
                    return g(e, i ? "'/' + " + t + (n ? "" : ".replace(/~/g, '~0').replace(/\\//g, '~1')") : n ? "'[' + " + t + " + ']'" : "'[\\'' + " + t + " + '\\']'")
                },
                getPath: function (e, t, i) {
                    t = c(i ? "/" + p(t) : h(t));
                    return g(e, t)
                },
                getData: function (e, t, i) {
                    var n, r, o;
                    if ("" === e) return "rootData";
                    if ("/" == e[0]) {
                        if (!d.test(e)) throw new Error("Invalid JSON-pointer: " + e);
                        n = e, r = "rootData"
                    } else {
                        if (!(o = e.match(u))) throw new Error("Invalid JSON-pointer: " + e);
                        if (e = +o[1], "#" == (n = o[2])) {
                            if (t <= e) throw new Error("Cannot access property/index " + e + " levels up, current level is " + t);
                            return i[t - e]
                        }
                        if (t < e) throw new Error("Cannot access data " + e + " levels up, current level is " + t);
                        if (r = "data" + (t - e || ""), !n) return r
                    }
                    for (var s = r, a = n.split("/"), l = 0; l < a.length; l++) {
                        var c = a[l];
                        c && (r += h(m(c)), s += " && " + r)
                    }
                    return s
                },
                unescapeFragment: function (e) {
                    return m(decodeURIComponent(e))
                },
                unescapeJsonPointer: m,
                escapeFragment: function (e) {
                    return encodeURIComponent(p(e))
                },
                escapeJsonPointer: p
            };
            var s = a(["string", "number", "integer", "boolean", "null"]);

            function a(e) {
                for (var t = {}, i = 0; i < e.length; i++) t[e[i]] = !0;
                return t
            }

            var n = /^[a-z$_][a-z$_0-9]*$/i, r = /'|\\/g;

            function h(e) {
                return "number" == typeof e ? "[" + e + "]" : n.test(e) ? "." + e : "['" + l(e) + "']"
            }

            function l(e) {
                return e.replace(r, "\\$&").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\f/g, "\\f").replace(/\t/g, "\\t")
            }

            function c(e) {
                return "'" + l(e) + "'"
            }

            var d = /^\/(?:[^~]|~0|~1)*$/, u = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;

            function g(e, t) {
                return '""' == e ? t : (e + " + " + t).replace(/([^\\])' \+ '/g, "$1")
            }

            function p(e) {
                return e.replace(/~/g, "~0").replace(/\//g, "~1")
            }

            function m(e) {
                return e.replace(/~1/g, "/").replace(/~0/g, "~")
            }
        }, 9394: function (e) {
            "use strict";
            var l = ["multipleOf", "maximum", "exclusiveMaximum", "minimum", "exclusiveMinimum", "maxLength", "minLength", "pattern", "additionalItems", "maxItems", "minItems", "uniqueItems", "maxProperties", "minProperties", "required", "additionalProperties", "enum", "format", "const"];
            e.exports = function (e, t) {
                for (var i = 0; i < t.length; i++) {
                    e = JSON.parse(JSON.stringify(e));
                    for (var n = t[i].split("/"), r = e, o = 1; o < n.length; o++) r = r[n[o]];
                    for (o = 0; o < l.length; o++) {
                        var s = l[o], a = r[s];
                        a && (r[s] = {anyOf: [a, {$ref: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#"}]})
                    }
                }
                return e
            }
        }, 5868: function (e, t, i) {
            "use strict";
            i = i(6680);
            e.exports = {
                $id: "https://github.com/ajv-validator/ajv/blob/master/lib/definition_schema.js",
                definitions: {simpleTypes: i.definitions.simpleTypes},
                type: "object",
                dependencies: {
                    schema: ["validate"],
                    $data: ["validate"],
                    statements: ["inline"],
                    valid: {not: {required: ["macro"]}}
                },
                properties: {
                    type: i.properties.type,
                    schema: {type: "boolean"},
                    statements: {type: "boolean"},
                    dependencies: {type: "array", items: {type: "string"}},
                    metaSchema: {type: "object"},
                    modifying: {type: "boolean"},
                    valid: {type: "boolean"},
                    $data: {type: "boolean"},
                    async: {type: "boolean"},
                    errors: {anyOf: [{type: "boolean"}, {const: "full"}]}
                }
            }
        }, 1796: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n, r, o, s, a, l, c = " ", h = e.level, d = e.dataLevel, u = e.schema[t],
                    g = e.schemaPath + e.util.getProperty(t), p = e.errSchemaPath + "/" + t, m = !e.opts.allErrors,
                    f = "data" + (d || ""), C = e.opts.$data && u && u.$data,
                    I = C ? (c += " var schema" + h + " = " + e.util.getData(u.$data, d, e.dataPathArr) + "; ", "schema" + h) : u,
                    v = "maximum" == t, A = v ? "exclusiveMaximum" : "exclusiveMinimum", b = e.schema[A],
                    y = e.opts.$data && b && b.$data, w = v ? "<" : ">", S = v ? ">" : "<", x = void 0;
                if (!C && "number" != typeof u && void 0 !== u) throw new Error(t + " must be number");
                if (!y && void 0 !== b && "number" != typeof b && "boolean" != typeof b) throw new Error(A + " must be number or boolean");
                y ? (n = "exclusive" + h, r = "exclType" + h, o = "exclIsNumber" + h, s = "' + " + (a = "op" + h) + " + '", c += " var schemaExcl" + h + " = " + (d = e.util.getData(b.$data, d, e.dataPathArr)) + "; ", x = A, (l = l || []).push(c += " var " + n + "; var " + r + " = typeof " + (d = "schemaExcl" + h) + "; if (" + r + " != 'boolean' && " + r + " != 'undefined' && " + r + " != 'number') { "), c = "", !1 !== e.createErrors ? (c += " { keyword: '" + (x || "_exclusiveLimit") + "' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(p) + " , params: {} ", !1 !== e.opts.messages && (c += " , message: '" + A + " should be boolean' "), e.opts.verbose && (c += " , schema: validate.schema" + g + " , parentSchema: validate.schema" + e.schemaPath + " , data: " + f + " "), c += " } ") : c += " {} ", k = c, c = l.pop(), !e.compositeRule && m ? e.async ? c += " throw new ValidationError([" + k + "]); " : c += " validate.errors = [" + k + "]; return false; " : c += " var err = " + k + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", c += " } else if ( ", C && (c += " (" + I + " !== undefined && typeof " + I + " != 'number') || "), c += " " + r + " == 'number' ? ( (" + n + " = " + I + " === undefined || " + d + " " + w + "= " + I + ") ? " + f + " " + S + "= " + d + " : " + f + " " + S + " " + I + " ) : ( (" + n + " = " + d + " === true) ? " + f + " " + S + "= " + I + " : " + f + " " + S + " " + I + " ) || " + f + " !== " + f + ") { var op" + h + " = " + n + " ? '" + w + "' : '" + w + "='; ", void 0 === u && (p = e.errSchemaPath + "/" + (x = A), I = d, C = y)) : (s = w, (o = "number" == typeof b) && C ? (a = "'" + s + "'", c += " if ( ", C && (c += " (" + I + " !== undefined && typeof " + I + " != 'number') || "), c += " ( " + I + " === undefined || " + b + " " + w + "= " + I + " ? " + f + " " + S + "= " + b + " : " + f + " " + S + " " + I + " ) || " + f + " !== " + f + ") { ") : (o && void 0 === u ? (n = !0, p = e.errSchemaPath + "/" + (x = A), I = b, S += "=") : (o && (I = Math[v ? "min" : "max"](b, u)), b === (!o || I) ? (n = !0, p = e.errSchemaPath + "/" + (x = A), S += "=") : (n = !1, s += "=")), a = "'" + s + "'", c += " if ( ", C && (c += " (" + I + " !== undefined && typeof " + I + " != 'number') || "), c += " " + f + " " + S + " " + I + " || " + f + " !== " + f + ") { ")), x = x || t, (l = l || []).push(c), c = "", !1 !== e.createErrors ? (c += " { keyword: '" + (x || "_limit") + "' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(p) + " , params: { comparison: " + a + ", limit: " + I + ", exclusive: " + n + " } ", !1 !== e.opts.messages && (c += " , message: 'should be " + s + " ", c += C ? "' + " + I : I + "'"), e.opts.verbose && (c += " , schema:  ", c += C ? "validate.schema" + g : "" + u, c += "         , parentSchema: validate.schema" + e.schemaPath + " , data: " + f + " "), c += " } ") : c += " {} ";
                var k = c;
                return c = l.pop(), !e.compositeRule && m ? e.async ? c += " throw new ValidationError([" + k + "]); " : c += " validate.errors = [" + k + "]; return false; " : c += " var err = " + k + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", c += " } ", m && (c += " else { "), c
            }
        }, 2407: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n = " ", r = e.level, o = e.dataLevel, s = e.schema[t], a = e.schemaPath + e.util.getProperty(t),
                    l = e.errSchemaPath + "/" + t, c = !e.opts.allErrors, h = "data" + (o || ""),
                    d = e.opts.$data && s && s.$data,
                    o = d ? (n += " var schema" + r + " = " + e.util.getData(s.$data, o, e.dataPathArr) + "; ", "schema" + r) : s;
                if (!d && "number" != typeof s) throw new Error(t + " must be number");
                n += "if ( ", d && (n += " (" + o + " !== undefined && typeof " + o + " != 'number') || ");
                var r = t, u = u || [];
                u.push(n += " " + h + ".length " + ("maxItems" == t ? ">" : "<") + " " + o + ") { "), n = "", !1 !== e.createErrors ? (n += " { keyword: '" + (r || "_limitItems") + "' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: { limit: " + o + " } ", !1 !== e.opts.messages && (n += " , message: 'should NOT have ", n += "maxItems" == t ? "more" : "fewer", n += " than ", n += d ? "' + " + o + " + '" : "" + s, n += " items' "), e.opts.verbose && (n += " , schema:  ", n += d ? "validate.schema" + a : "" + s, n += "         , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ";
                h = n, n = u.pop();
                return !e.compositeRule && c ? e.async ? n += " throw new ValidationError([" + h + "]); " : n += " validate.errors = [" + h + "]; return false; " : n += " var err = " + h + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", n += "} ", c && (n += " else { "), n
            }
        }, 1250: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n = " ", r = e.level, o = e.dataLevel, s = e.schema[t], a = e.schemaPath + e.util.getProperty(t),
                    l = e.errSchemaPath + "/" + t, c = !e.opts.allErrors, h = "data" + (o || ""),
                    d = e.opts.$data && s && s.$data,
                    o = d ? (n += " var schema" + r + " = " + e.util.getData(s.$data, o, e.dataPathArr) + "; ", "schema" + r) : s;
                if (!d && "number" != typeof s) throw new Error(t + " must be number");
                n += "if ( ", d && (n += " (" + o + " !== undefined && typeof " + o + " != 'number') || "), !1 === e.opts.unicode ? n += " " + h + ".length " : n += " ucs2length(" + h + ") ";
                var r = t, u = u || [];
                u.push(n += " " + ("maxLength" == t ? ">" : "<") + " " + o + ") { "), n = "", !1 !== e.createErrors ? (n += " { keyword: '" + (r || "_limitLength") + "' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: { limit: " + o + " } ", !1 !== e.opts.messages && (n += " , message: 'should NOT be ", n += "maxLength" == t ? "longer" : "shorter", n += " than ", n += d ? "' + " + o + " + '" : "" + s, n += " characters' "), e.opts.verbose && (n += " , schema:  ", n += d ? "validate.schema" + a : "" + s, n += "         , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ";
                h = n, n = u.pop();
                return !e.compositeRule && c ? e.async ? n += " throw new ValidationError([" + h + "]); " : n += " validate.errors = [" + h + "]; return false; " : n += " var err = " + h + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", n += "} ", c && (n += " else { "), n
            }
        }, 2596: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n = " ", r = e.level, o = e.dataLevel, s = e.schema[t], a = e.schemaPath + e.util.getProperty(t),
                    l = e.errSchemaPath + "/" + t, c = !e.opts.allErrors, h = "data" + (o || ""),
                    d = e.opts.$data && s && s.$data,
                    o = d ? (n += " var schema" + r + " = " + e.util.getData(s.$data, o, e.dataPathArr) + "; ", "schema" + r) : s;
                if (!d && "number" != typeof s) throw new Error(t + " must be number");
                n += "if ( ", d && (n += " (" + o + " !== undefined && typeof " + o + " != 'number') || ");
                var r = t, u = u || [];
                u.push(n += " Object.keys(" + h + ").length " + ("maxProperties" == t ? ">" : "<") + " " + o + ") { "), n = "", !1 !== e.createErrors ? (n += " { keyword: '" + (r || "_limitProperties") + "' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: { limit: " + o + " } ", !1 !== e.opts.messages && (n += " , message: 'should NOT have ", n += "maxProperties" == t ? "more" : "fewer", n += " than ", n += d ? "' + " + o + " + '" : "" + s, n += " properties' "), e.opts.verbose && (n += " , schema:  ", n += d ? "validate.schema" + a : "" + s, n += "         , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ";
                h = n, n = u.pop();
                return !e.compositeRule && c ? e.async ? n += " throw new ValidationError([" + h + "]); " : n += " validate.errors = [" + h + "]; return false; " : n += " var err = " + h + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", n += "} ", c && (n += " else { "), n
            }
        }, 9486: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n = " ", r = e.schema[t], o = e.schemaPath + e.util.getProperty(t), s = e.errSchemaPath + "/" + t,
                    a = !e.opts.allErrors, l = e.util.copy(e), c = "";
                l.level++;
                var h = "valid" + l.level, d = l.baseId, u = !0, g = r;
                if (g) for (var p, m = -1, f = g.length - 1; m < f;) p = g[m += 1], (e.opts.strictKeywords ? "object" == typeof p && 0 < Object.keys(p).length || !1 === p : e.util.schemaHasRules(p, e.RULES.all)) && (u = !1, l.schema = p, l.schemaPath = o + "[" + m + "]", l.errSchemaPath = s + "/" + m, n += "  " + e.validate(l) + " ", l.baseId = d, a && (n += " if (" + h + ") { ", c += "}"));
                return a && (n += u ? " if (true) { " : " " + c.slice(0, -1) + " "), n
            }
        }, 5347: function (e) {
            "use strict";
            e.exports = function (t, e, i) {
                var n = " ", r = t.level, o = t.dataLevel, s = t.schema[e], a = t.schemaPath + t.util.getProperty(e),
                    l = t.errSchemaPath + "/" + e, c = !t.opts.allErrors, e = "data" + (o || ""), h = "valid" + r,
                    o = "errs__" + r, d = t.util.copy(t), u = "";
                d.level++;
                var g = "valid" + d.level;
                if (s.every(function (e) {
                    return t.opts.strictKeywords ? "object" == typeof e && 0 < Object.keys(e).length || !1 === e : t.util.schemaHasRules(e, t.RULES.all)
                })) {
                    var p = d.baseId;
                    n += " var " + o + " = errors; var " + h + " = false;  ";
                    r = t.compositeRule;
                    t.compositeRule = d.compositeRule = !0;
                    var m = s;
                    if (m) for (var f, C = -1, I = m.length - 1; C < I;) f = m[C += 1], d.schema = f, d.schemaPath = a + "[" + C + "]", d.errSchemaPath = l + "/" + C, n += "  " + t.validate(d) + " ", d.baseId = p, n += " " + h + " = " + h + " || " + g + "; if (!" + h + ") { ", u += "}";
                    t.compositeRule = d.compositeRule = r, n += " " + u + " if (!" + h + ") {   var err =   ", !1 !== t.createErrors ? (n += " { keyword: 'anyOf' , dataPath: (dataPath || '') + " + t.errorPath + " , schemaPath: " + t.util.toQuotedString(l) + " , params: {} ", !1 !== t.opts.messages && (n += " , message: 'should match some schema in anyOf' "), t.opts.verbose && (n += " , schema: validate.schema" + a + " , parentSchema: validate.schema" + t.schemaPath + " , data: " + e + " "), n += " } ") : n += " {} ", n += ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", !t.compositeRule && c && (t.async ? n += " throw new ValidationError(vErrors); " : n += " validate.errors = vErrors; return false; "), n += " } else {  errors = " + o + "; if (vErrors !== null) { if (" + o + ") vErrors.length = " + o + "; else vErrors = null; } ", t.opts.allErrors && (n += " } ")
                } else c && (n += " if (true) { ");
                return n
            }
        }, 923: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n = " ", r = e.schema[t], t = e.errSchemaPath + "/" + t,
                    r = (e.opts.allErrors, e.util.toQuotedString(r));
                return !0 === e.opts.$comment ? n += " console.log(" + r + ");" : "function" == typeof e.opts.$comment && (n += " self._opts.$comment(" + r + ", " + e.util.toQuotedString(t) + ", validate.root.schema);"), n
            }
        }, 2617: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n = " ", r = e.level, o = e.dataLevel, s = e.schema[t], a = e.schemaPath + e.util.getProperty(t),
                    l = e.errSchemaPath + "/" + t, c = !e.opts.allErrors, h = "data" + (o || ""), d = "valid" + r,
                    t = e.opts.$data && s && s.$data;
                t && (n += " var schema" + r + " = " + e.util.getData(s.$data, o, e.dataPathArr) + "; ");
                t || (n += " var schema" + r + " = validate.schema" + a + ";");
                var u = u || [];
                u.push(n += "var " + d + " = equal(" + h + ", schema" + r + "); if (!" + d + ") {   "), n = "", !1 !== e.createErrors ? (n += " { keyword: 'const' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: { allowedValue: schema" + r + " } ", !1 !== e.opts.messages && (n += " , message: 'should be equal to constant' "), e.opts.verbose && (n += " , schema: validate.schema" + a + " , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ";
                h = n, n = u.pop();
                return !e.compositeRule && c ? e.async ? n += " throw new ValidationError([" + h + "]); " : n += " validate.errors = [" + h + "]; return false; " : n += " var err = " + h + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", n += " }", c && (n += " else { "), n
            }
        }, 2119: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n = " ", r = e.level, o = e.dataLevel, s = e.schema[t], a = e.schemaPath + e.util.getProperty(t),
                    l = e.errSchemaPath + "/" + t, c = !e.opts.allErrors, h = "data" + (o || ""), d = "valid" + r,
                    u = "errs__" + r, g = e.util.copy(e);
                g.level++;
                var p = "valid" + g.level, m = "i" + r, f = g.dataLevel = e.dataLevel + 1, t = "data" + f, o = e.baseId,
                    r = e.opts.strictKeywords ? "object" == typeof s && 0 < Object.keys(s).length || !1 === s : e.util.schemaHasRules(s, e.RULES.all);
                n += "var " + u + " = errors;var " + d + ";", r ? (d = e.compositeRule, e.compositeRule = g.compositeRule = !0, g.schema = s, g.schemaPath = a, g.errSchemaPath = l, n += " var " + p + " = false; for (var " + m + " = 0; " + m + " < " + h + ".length; " + m + "++) { ", g.errorPath = e.util.getPathExpr(e.errorPath, m, e.opts.jsonPointers, !0), s = h + "[" + m + "]", g.dataPathArr[f] = m, m = e.validate(g), g.baseId = o, e.util.varOccurences(m, t) < 2 ? n += " " + e.util.varReplace(m, t, s) + " " : n += " var " + t + " = " + s + "; " + m + " ", n += " if (" + p + ") break; }  ", e.compositeRule = g.compositeRule = d, n += "  if (!" + p + ") {") : n += " if (" + h + ".length == 0) {";
                var C = C || [];
                C.push(n), n = "", !1 !== e.createErrors ? (n += " { keyword: 'contains' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: {} ", !1 !== e.opts.messages && (n += " , message: 'should contain a valid item' "), e.opts.verbose && (n += " , schema: validate.schema" + a + " , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ";
                h = n, n = C.pop();
                return !e.compositeRule && c ? e.async ? n += " throw new ValidationError([" + h + "]); " : n += " validate.errors = [" + h + "]; return false; " : n += " var err = " + h + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", n += " } else { ", r && (n += "  errors = " + u + "; if (vErrors !== null) { if (" + u + ") vErrors.length = " + u + "; else vErrors = null; } "), e.opts.allErrors && (n += " } "), n
            }
        }, 1793: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n, r, o, s = " ", a = e.level, l = e.dataLevel, c = e.schema[t],
                    h = e.schemaPath + e.util.getProperty(t), d = e.errSchemaPath + "/" + t, u = !e.opts.allErrors,
                    g = "data" + (l || ""), p = "valid" + a, m = "errs__" + a, f = e.opts.$data && c && c.$data,
                    C = f ? (s += " var schema" + a + " = " + e.util.getData(c.$data, l, e.dataPathArr) + "; ", "schema" + a) : c,
                    I = "definition" + a, v = this.definition, A = "";
                if (f && v.$data) {
                    var b = "keywordValidate" + a, y = v.validateSchema;
                    s += " var " + I + " = RULES.custom['" + t + "'].definition; var " + b + " = " + I + ".validate;"
                } else {
                    if (!(w = e.useCustomRule(this, c, e.schema, e))) return;
                    C = "validate.schema" + h, b = w.code, n = v.compile, r = v.inline, o = v.macro
                }
                var w, S, x, k, E, R = b + ".errors", T = "i" + a, t = "ruleErr" + a, c = v.async;
                if (c && !e.async) throw new Error("async keyword in sync schema");
                return r || o || (s += R + " = null;"), s += "var " + m + " = errors;var " + p + ";", f && v.$data && (A += "}", s += " if (" + C + " === undefined) { " + p + " = true; } else { ", y && (A += "}", s += " " + p + " = " + I + ".validateSchema(" + C + "); if (" + p + ") { ")), r ? v.statements ? s += " " + w.validate + " " : s += " " + p + " = " + w.validate + "; " : o ? (A = "", (y = e.util.copy(e)).level++, k = "valid" + y.level, y.schema = w.validate, y.schemaPath = "", I = e.compositeRule, e.compositeRule = y.compositeRule = !0, w = e.validate(y).replace(/validate\.schema/g, b), e.compositeRule = y.compositeRule = I, s += " " + w) : ((E = E || []).push(s), s = "", s += "  " + b + ".call( ", e.opts.passContext ? s += "this" : s += "self", n || !1 === v.schema ? s += " , " + g + " " : s += " , " + C + " , " + g + " , validate.schema" + e.schemaPath + " ", s += " , (dataPath || '')", '""' != e.errorPath && (s += " + " + e.errorPath), l = s += " , " + (S = l ? "data" + (l - 1 || "") : "parentData") + " , " + (x = l ? e.dataPathArr[l] : "parentDataProperty") + " , rootData )  ", s = E.pop(), !1 === v.errors ? (s += " " + p + " = ", c && (s += "await "), s += l + "; ") : s += c ? " var " + (R = "customErrors" + a) + " = null; try { " + p + " = await " + l + "; } catch (e) { " + p + " = false; if (e instanceof ValidationError) " + R + " = e.errors; else throw e; } " : " " + R + " = null; " + p + " = " + l + "; "), v.modifying && (s += " if (" + S + ") " + g + " = " + S + "[" + x + "];"), s += "" + A, v.valid ? u && (s += " if (true) { ") : (s += " if ( ", void 0 === v.valid ? (s += " !", s += o ? "" + k : p) : s += " " + !v.valid + " ", k = this.keyword, (E = E || []).push(s += ") { "), (E = E || []).push(s = ""), s = "", !1 !== e.createErrors ? (s += " { keyword: '" + (k || "custom") + "' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(d) + " , params: { keyword: '" + this.keyword + "' } ", !1 !== e.opts.messages && (s += " , message: 'should pass \"" + this.keyword + "\" keyword validation' "), e.opts.verbose && (s += " , schema: validate.schema" + h + " , parentSchema: validate.schema" + e.schemaPath + " , data: " + g + " "), s += " } ") : s += " {} ", p = s, s = E.pop(), !e.compositeRule && u ? e.async ? s += " throw new ValidationError([" + p + "]); " : s += " validate.errors = [" + p + "]; return false; " : s += " var err = " + p + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", p = s, s = E.pop(), r ? v.errors ? "full" != v.errors && (s += "  for (var " + T + "=" + m + "; " + T + "<errors; " + T + "++) { var " + t + " = vErrors[" + T + "]; if (" + t + ".dataPath === undefined) " + t + ".dataPath = (dataPath || '') + " + e.errorPath + "; if (" + t + ".schemaPath === undefined) { " + t + '.schemaPath = "' + d + '"; } ', e.opts.verbose && (s += " " + t + ".schema = " + C + "; " + t + ".data = " + g + "; "), s += " } ") : !1 === v.errors ? s += " " + p + " " : (s += " if (" + m + " == errors) { " + p + " } else {  for (var " + T + "=" + m + "; " + T + "<errors; " + T + "++) { var " + t + " = vErrors[" + T + "]; if (" + t + ".dataPath === undefined) " + t + ".dataPath = (dataPath || '') + " + e.errorPath + "; if (" + t + ".schemaPath === undefined) { " + t + '.schemaPath = "' + d + '"; } ', e.opts.verbose && (s += " " + t + ".schema = " + C + "; " + t + ".data = " + g + "; "), s += " } } ") : o ? (s += "   var err =   ", !1 !== e.createErrors ? (s += " { keyword: '" + (k || "custom") + "' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(d) + " , params: { keyword: '" + this.keyword + "' } ", !1 !== e.opts.messages && (s += " , message: 'should pass \"" + this.keyword + "\" keyword validation' "), e.opts.verbose && (s += " , schema: validate.schema" + h + " , parentSchema: validate.schema" + e.schemaPath + " , data: " + g + " "), s += " } ") : s += " {} ", s += ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", !e.compositeRule && u && (e.async ? s += " throw new ValidationError(vErrors); " : s += " validate.errors = vErrors; return false; ")) : !1 === v.errors ? s += " " + p + " " : (s += " if (Array.isArray(" + R + ")) { if (vErrors === null) vErrors = " + R + "; else vErrors = vErrors.concat(" + R + "); errors = vErrors.length;  for (var " + T + "=" + m + "; " + T + "<errors; " + T + "++) { var " + t + " = vErrors[" + T + "]; if (" + t + ".dataPath === undefined) " + t + ".dataPath = (dataPath || '') + " + e.errorPath + ";  " + t + '.schemaPath = "' + d + '";  ', e.opts.verbose && (s += " " + t + ".schema = " + C + "; " + t + ".data = " + g + "; "), s += " } } else { " + p + " } "), s += " } ", u && (s += " else { ")), s
            }
        }, 9115: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n = " ", r = e.level, o = e.dataLevel, s = e.schema[t], a = e.schemaPath + e.util.getProperty(t),
                    l = e.errSchemaPath + "/" + t, c = !e.opts.allErrors, h = "data" + (o || ""), o = "errs__" + r,
                    d = e.util.copy(e), u = "";
                d.level++;
                var g, p = "valid" + d.level, m = {}, f = {}, C = e.opts.ownProperties;
                for ($ in s) "__proto__" != $ && (B = s[$], (g = Array.isArray(B) ? f : m)[$] = B);
                n += "var " + o + " = errors;";
                var I = e.errorPath;
                for ($ in n += "var missing" + r + ";", f) if ((g = f[$]).length) {
                    if (n += " if ( " + h + e.util.getProperty($) + " !== undefined ", C && (n += " && Object.prototype.hasOwnProperty.call(" + h + ", '" + e.util.escapeQuotes($) + "') "), c) {
                        n += " && ( ";
                        var v = g;
                        if (v) for (var A = -1, b = v.length - 1; A < b;) k = v[A += 1], A && (n += " || "), n += " ( ( " + (_ = h + (T = e.util.getProperty(k))) + " === undefined ", C && (n += " || ! Object.prototype.hasOwnProperty.call(" + h + ", '" + e.util.escapeQuotes(k) + "') "), n += ") && (missing" + r + " = " + e.util.toQuotedString(e.opts.jsonPointers ? k : T) + ") ) ";
                        n += ")) {  ";
                        var y = "missing" + r, w = "' + " + y + " + '";
                        e.opts._errorDataPathProperty && (e.errorPath = e.opts.jsonPointers ? e.util.getPathExpr(I, y, !0) : I + " + " + y);
                        var S = S || [];
                        S.push(n), n = "", !1 !== e.createErrors ? (n += " { keyword: 'dependencies' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: { property: '" + e.util.escapeQuotes($) + "', missingProperty: '" + w + "', depsCount: " + g.length + ", deps: '" + e.util.escapeQuotes(1 == g.length ? g[0] : g.join(", ")) + "' } ", !1 !== e.opts.messages && (n += " , message: 'should have ", 1 == g.length ? n += "property " + e.util.escapeQuotes(g[0]) : n += "properties " + e.util.escapeQuotes(g.join(", ")), n += " when property " + e.util.escapeQuotes($) + " is present' "), e.opts.verbose && (n += " , schema: validate.schema" + a + " , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ";
                        y = n, n = S.pop();
                        !e.compositeRule && c ? e.async ? n += " throw new ValidationError([" + y + "]); " : n += " validate.errors = [" + y + "]; return false; " : n += " var err = " + y + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "
                    } else {
                        n += " ) { ";
                        var x = g;
                        if (x) for (var k, E = -1, R = x.length - 1; E < R;) {
                            k = x[E += 1];
                            var T = e.util.getProperty(k), w = e.util.escapeQuotes(k), _ = h + T;
                            e.opts._errorDataPathProperty && (e.errorPath = e.util.getPath(I, k, e.opts.jsonPointers)), n += " if ( " + _ + " === undefined ", C && (n += " || ! Object.prototype.hasOwnProperty.call(" + h + ", '" + e.util.escapeQuotes(k) + "') "), n += ") {  var err =   ", !1 !== e.createErrors ? (n += " { keyword: 'dependencies' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: { property: '" + e.util.escapeQuotes($) + "', missingProperty: '" + w + "', depsCount: " + g.length + ", deps: '" + e.util.escapeQuotes(1 == g.length ? g[0] : g.join(", ")) + "' } ", !1 !== e.opts.messages && (n += " , message: 'should have ", 1 == g.length ? n += "property " + e.util.escapeQuotes(g[0]) : n += "properties " + e.util.escapeQuotes(g.join(", ")), n += " when property " + e.util.escapeQuotes($) + " is present' "), e.opts.verbose && (n += " , schema: validate.schema" + a + " , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ", n += ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } "
                        }
                    }
                    n += " }   ", c && (u += "}", n += " else { ")
                }
                e.errorPath = I;
                var $, L = d.baseId;
                for ($ in m) {
                    var B = m[$];
                    (e.opts.strictKeywords ? "object" == typeof B && 0 < Object.keys(B).length || !1 === B : e.util.schemaHasRules(B, e.RULES.all)) && (n += " " + p + " = true; if ( " + h + e.util.getProperty($) + " !== undefined ", C && (n += " && Object.prototype.hasOwnProperty.call(" + h + ", '" + e.util.escapeQuotes($) + "') "), n += ") { ", d.schema = B, d.schemaPath = a + e.util.getProperty($), d.errSchemaPath = l + "/" + e.util.escapeFragment($), n += "  " + e.validate(d) + " ", d.baseId = L, n += " }  ", c && (n += " if (" + p + ") { ", u += "}"))
                }
                return c && (n += "   " + u + " if (" + o + " == errors) {"), n
            }
        }, 9317: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n = " ", r = e.level, o = e.dataLevel, s = e.schema[t], a = e.schemaPath + e.util.getProperty(t),
                    l = e.errSchemaPath + "/" + t, c = !e.opts.allErrors, h = "data" + (o || ""), d = "valid" + r,
                    t = e.opts.$data && s && s.$data,
                    o = (t && (n += " var schema" + r + " = " + e.util.getData(s.$data, o, e.dataPathArr) + "; "), "i" + r),
                    s = "schema" + r;
                t || (n += " var " + s + " = validate.schema" + a + ";"), n += "var " + d + ";", t && (n += " if (schema" + r + " === undefined) " + d + " = true; else if (!Array.isArray(schema" + r + ")) " + d + " = false; else {"), n += d + " = false;for (var " + o + "=0; " + o + "<" + s + ".length; " + o + "++) if (equal(" + h + ", " + s + "[" + o + "])) { " + d + " = true; break; }", t && (n += "  }  ");
                var u = u || [];
                u.push(n += " if (!" + d + ") {   "), n = "", !1 !== e.createErrors ? (n += " { keyword: 'enum' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: { allowedValues: schema" + r + " } ", !1 !== e.opts.messages && (n += " , message: 'should be equal to one of the allowed values' "), e.opts.verbose && (n += " , schema: validate.schema" + a + " , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ";
                h = n, n = u.pop();
                return !e.compositeRule && c ? e.async ? n += " throw new ValidationError([" + h + "]); " : n += " validate.errors = [" + h + "]; return false; " : n += " var err = " + h + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", n += " }", c && (n += " else { "), n
            }
        }, 8327: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n = " ", r = e.level, o = e.dataLevel, s = e.schema[t], a = e.schemaPath + e.util.getProperty(t),
                    l = e.errSchemaPath + "/" + t, c = !e.opts.allErrors, h = "data" + (o || "");
                if (!1 === e.opts.format) return c && (n += " if (true) { "), n;
                var d, u = e.opts.$data && s && s.$data,
                    g = u ? (n += " var schema" + r + " = " + e.util.getData(s.$data, o, e.dataPathArr) + "; ", "schema" + r) : s,
                    t = e.opts.unknownFormats, o = Array.isArray(t);
                if (u) n += " var " + (d = "format" + r) + " = formats[" + g + "]; var " + (p = "isObject" + r) + " = typeof " + d + " == 'object' && !(" + d + " instanceof RegExp) && " + d + ".validate; var " + (f = "formatType" + r) + " = " + p + " && " + d + ".type || 'string'; if (" + p + ") { ", e.async && (n += " var async" + r + " = " + d + ".async; "), n += " " + d + " = " + d + ".validate; } if (  ", u && (n += " (" + g + " !== undefined && typeof " + g + " != 'string') || "), n += " (", "ignore" != t && (n += " (" + g + " && !" + d + " ", o && (n += " && self._opts.unknownFormats.indexOf(" + g + ") == -1 "), n += ") || "), n += " (" + d + " && " + f + " == '" + i + "' && !(typeof " + d + " == 'function' ? ", e.async ? n += " (async" + r + " ? await " + d + "(" + h + ") : " + d + "(" + h + ")) " : n += " " + d + "(" + h + ") ", n += " : " + d + ".test(" + h + "))))) {"; else {
                    if (!(d = e.formats[s])) {
                        if ("ignore" == t) return e.logger.warn('unknown format "' + s + '" ignored in schema at path "' + e.errSchemaPath + '"'), c && (n += " if (true) { "), n;
                        if (o && 0 <= t.indexOf(s)) return c && (n += " if (true) { "), n;
                        throw new Error('unknown format "' + s + '" is used in schema at path "' + e.errSchemaPath + '"')
                    }
                    var p, m,
                        f = (p = "object" == typeof d && !(d instanceof RegExp) && d.validate) && d.type || "string";
                    if (p && (m = !0 === d.async, d = d.validate), f != i) return c && (n += " if (true) { "), n;
                    if (m) {
                        if (!e.async) throw new Error("async format in sync schema");
                        n += " if (!(await " + (C = "formats" + e.util.getProperty(s) + ".validate") + "(" + h + "))) { "
                    } else {
                        n += " if (! ";
                        var C = "formats" + e.util.getProperty(s);
                        p && (C += ".validate"), n += "function" == typeof d ? " " + C + "(" + h + ") " : " " + C + ".test(" + h + ") ", n += ") { "
                    }
                }
                var I = I || [];
                I.push(n), n = "", !1 !== e.createErrors ? (n += " { keyword: 'format' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: { format:  ", n += u ? "" + g : "" + e.util.toQuotedString(s), n += "  } ", !1 !== e.opts.messages && (n += " , message: 'should match format \"", n += u ? "' + " + g + " + '" : "" + e.util.escapeQuotes(s), n += "\"' "), e.opts.verbose && (n += " , schema:  ", n += u ? "validate.schema" + a : "" + e.util.toQuotedString(s), n += "         , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ";
                h = n, n = I.pop();
                return !e.compositeRule && c ? e.async ? n += " throw new ValidationError([" + h + "]); " : n += " validate.errors = [" + h + "]; return false; " : n += " var err = " + h + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", n += " } ", c && (n += " else { "), n
            }
        }, 5926: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n = " ", r = e.level, o = e.dataLevel, s = e.schema[t], a = e.schemaPath + e.util.getProperty(t),
                    l = e.errSchemaPath + "/" + t, c = !e.opts.allErrors, h = "data" + (o || ""), d = "valid" + r,
                    u = "errs__" + r, g = e.util.copy(e);
                g.level++;
                var p, m = "valid" + g.level, f = e.schema.then, t = e.schema.else,
                    o = void 0 !== f && (e.opts.strictKeywords ? "object" == typeof f && 0 < Object.keys(f).length || !1 === f : e.util.schemaHasRules(f, e.RULES.all)),
                    f = void 0 !== t && (e.opts.strictKeywords ? "object" == typeof t && 0 < Object.keys(t).length || !1 === t : e.util.schemaHasRules(t, e.RULES.all)),
                    t = g.baseId;
                return o || f ? (g.createErrors = !1, g.schema = s, g.schemaPath = a, g.errSchemaPath = l, n += " var " + u + " = errors; var " + d + " = true;  ", s = e.compositeRule, e.compositeRule = g.compositeRule = !0, n += "  " + e.validate(g) + " ", g.baseId = t, g.createErrors = !0, n += "  errors = " + u + "; if (vErrors !== null) { if (" + u + ") vErrors.length = " + u + "; else vErrors = null; }  ", e.compositeRule = g.compositeRule = s, o ? (n += " if (" + m + ") {  ", g.schema = e.schema.then, g.schemaPath = e.schemaPath + ".then", g.errSchemaPath = e.errSchemaPath + "/then", n += "  " + e.validate(g) + " ", g.baseId = t, n += " " + d + " = " + m + "; ", o && f ? n += " var " + (p = "ifClause" + r) + " = 'then'; " : p = "'then'", n += " } ", f && (n += " else { ")) : n += " if (!" + m + ") { ", f && (g.schema = e.schema.else, g.schemaPath = e.schemaPath + ".else", g.errSchemaPath = e.errSchemaPath + "/else", n += "  " + e.validate(g) + " ", g.baseId = t, n += " " + d + " = " + m + "; ", o && f ? n += " var " + (p = "ifClause" + r) + " = 'else'; " : p = "'else'", n += " } "), n += " if (!" + d + ") {   var err =   ", !1 !== e.createErrors ? (n += " { keyword: 'if' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: { failingKeyword: " + p + " } ", !1 !== e.opts.messages && (n += " , message: 'should match \"' + " + p + " + '\" schema' "), e.opts.verbose && (n += " , schema: validate.schema" + a + " , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ", n += ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", !e.compositeRule && c && (e.async ? n += " throw new ValidationError(vErrors); " : n += " validate.errors = vErrors; return false; "), n += " }   ", c && (n += " else { ")) : c && (n += " if (true) { "), n
            }
        }, 9646: function (e, t, i) {
            "use strict";
            e.exports = {
                $ref: i(2331),
                allOf: i(9486),
                anyOf: i(5347),
                $comment: i(923),
                const: i(2617),
                contains: i(2119),
                dependencies: i(9115),
                enum: i(9317),
                format: i(8327),
                if: i(5926),
                items: i(392),
                maximum: i(1796),
                minimum: i(1796),
                maxItems: i(2407),
                minItems: i(2407),
                maxLength: i(1250),
                minLength: i(1250),
                maxProperties: i(2596),
                minProperties: i(2596),
                multipleOf: i(6039),
                not: i(7946),
                oneOf: i(9344),
                pattern: i(9737),
                properties: i(2537),
                propertyNames: i(2127),
                required: i(1204),
                uniqueItems: i(1985),
                validate: i(1869)
            }
        }, 392: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n = " ", r = e.level, o = e.dataLevel, s = e.schema[t], a = e.schemaPath + e.util.getProperty(t),
                    l = e.errSchemaPath + "/" + t, c = !e.opts.allErrors, h = "data" + (o || ""), d = "valid" + r,
                    u = "errs__" + r, g = e.util.copy(e), p = "";
                g.level++;
                var m = "valid" + g.level, t = "i" + r, f = g.dataLevel = e.dataLevel + 1, C = "data" + f, I = e.baseId;
                if (n += "var " + u + " = errors;var " + d + ";", Array.isArray(s)) {
                    var v, o = e.schema.additionalItems;
                    !1 === o && (n += " " + d + " = " + h + ".length <= " + s.length + "; ", r = l, l = e.errSchemaPath + "/additionalItems", (v = v || []).push(n += "  if (!" + d + ") {   "), n = "", !1 !== e.createErrors ? (n += " { keyword: 'additionalItems' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: { limit: " + s.length + " } ", !1 !== e.opts.messages && (n += " , message: 'should NOT have more than " + s.length + " items' "), e.opts.verbose && (n += " , schema: false , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ", d = n, n = v.pop(), !e.compositeRule && c ? e.async ? n += " throw new ValidationError([" + d + "]); " : n += " validate.errors = [" + d + "]; return false; " : n += " var err = " + d + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", n += " } ", l = r, c && (p += "}", n += " else { "));
                    var A = s;
                    if (A) for (var b = -1, y = A.length - 1; b < y;) {
                        var w, S, x = A[b += 1];
                        (e.opts.strictKeywords ? "object" == typeof x && 0 < Object.keys(x).length || !1 === x : e.util.schemaHasRules(x, e.RULES.all)) && (n += " " + m + " = true; if (" + h + ".length > " + b + ") { ", w = h + "[" + b + "]", g.schema = x, g.schemaPath = a + "[" + b + "]", g.errSchemaPath = l + "/" + b, g.errorPath = e.util.getPathExpr(e.errorPath, b, e.opts.jsonPointers, !0), g.dataPathArr[f] = b, S = e.validate(g), g.baseId = I, e.util.varOccurences(S, C) < 2 ? n += " " + e.util.varReplace(S, C, w) + " " : n += " var " + C + " = " + w + "; " + S + " ", n += " }  ", c && (n += " if (" + m + ") { ", p += "}"))
                    }
                    "object" == typeof o && (e.opts.strictKeywords ? "object" == typeof o && 0 < Object.keys(o).length || !1 === o : e.util.schemaHasRules(o, e.RULES.all)) && (g.schema = o, g.schemaPath = e.schemaPath + ".additionalItems", g.errSchemaPath = e.errSchemaPath + "/additionalItems", n += " " + m + " = true; if (" + h + ".length > " + s.length + ") {  for (var " + t + " = " + s.length + "; " + t + " < " + h + ".length; " + t + "++) { ", g.errorPath = e.util.getPathExpr(e.errorPath, t, e.opts.jsonPointers, !0), w = h + "[" + t + "]", g.dataPathArr[f] = t, S = e.validate(g), g.baseId = I, e.util.varOccurences(S, C) < 2 ? n += " " + e.util.varReplace(S, C, w) + " " : n += " var " + C + " = " + w + "; " + S + " ", c && (n += " if (!" + m + ") break; "), n += " } }  ", c && (n += " if (" + m + ") { ", p += "}"))
                } else (e.opts.strictKeywords ? "object" == typeof s && 0 < Object.keys(s).length || !1 === s : e.util.schemaHasRules(s, e.RULES.all)) && (g.schema = s, g.schemaPath = a, g.errSchemaPath = l, n += "  for (var " + t + " = 0; " + t + " < " + h + ".length; " + t + "++) { ", g.errorPath = e.util.getPathExpr(e.errorPath, t, e.opts.jsonPointers, !0), w = h + "[" + t + "]", g.dataPathArr[f] = t, S = e.validate(g), g.baseId = I, e.util.varOccurences(S, C) < 2 ? n += " " + e.util.varReplace(S, C, w) + " " : n += " var " + C + " = " + w + "; " + S + " ", c && (n += " if (!" + m + ") break; "), n += " }");
                return c && (n += " " + p + " if (" + u + " == errors) {"), n
            }
        }, 6039: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n = " ", r = e.level, o = e.dataLevel, s = e.schema[t], a = e.schemaPath + e.util.getProperty(t),
                    l = e.errSchemaPath + "/" + t, c = !e.opts.allErrors, h = "data" + (o || ""),
                    d = e.opts.$data && s && s.$data,
                    o = d ? (n += " var schema" + r + " = " + e.util.getData(s.$data, o, e.dataPathArr) + "; ", "schema" + r) : s;
                if (!d && "number" != typeof s) throw new Error(t + " must be number");
                n += "var division" + r + ";if (", d && (n += " " + o + " !== undefined && ( typeof " + o + " != 'number' || "), n += " (division" + r + " = " + h + " / " + o + ", ", e.opts.multipleOfPrecision ? n += " Math.abs(Math.round(division" + r + ") - division" + r + ") > 1e-" + e.opts.multipleOfPrecision + " " : n += " division" + r + " !== parseInt(division" + r + ") ", n += " ) ", d && (n += "  )  ");
                var u = u || [];
                u.push(n += " ) {   "), n = "", !1 !== e.createErrors ? (n += " { keyword: 'multipleOf' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: { multipleOf: " + o + " } ", !1 !== e.opts.messages && (n += " , message: 'should be multiple of ", n += d ? "' + " + o : o + "'"), e.opts.verbose && (n += " , schema:  ", n += d ? "validate.schema" + a : "" + s, n += "         , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ";
                h = n, n = u.pop();
                return !e.compositeRule && c ? e.async ? n += " throw new ValidationError([" + h + "]); " : n += " validate.errors = [" + h + "]; return false; " : n += " var err = " + h + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", n += "} ", c && (n += " else { "), n
            }
        }, 7946: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n = " ", r = e.level, o = e.dataLevel, s = e.schema[t], a = e.schemaPath + e.util.getProperty(t),
                    l = e.errSchemaPath + "/" + t, c = !e.opts.allErrors, h = "data" + (o || ""), t = "errs__" + r,
                    o = e.util.copy(e);
                o.level++;
                var d, u, r = "valid" + o.level;
                return (e.opts.strictKeywords ? "object" == typeof s && 0 < Object.keys(s).length || !1 === s : e.util.schemaHasRules(s, e.RULES.all)) ? (o.schema = s, o.schemaPath = a, o.errSchemaPath = l, n += " var " + t + " = errors;  ", s = e.compositeRule, e.compositeRule = o.compositeRule = !0, o.createErrors = !1, o.opts.allErrors && (d = o.opts.allErrors, o.opts.allErrors = !1), n += " " + e.validate(o) + " ", o.createErrors = !0, d && (o.opts.allErrors = d), e.compositeRule = o.compositeRule = s, (u = u || []).push(n += " if (" + r + ") {   "), n = "", !1 !== e.createErrors ? (n += " { keyword: 'not' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: {} ", !1 !== e.opts.messages && (n += " , message: 'should NOT be valid' "), e.opts.verbose && (n += " , schema: validate.schema" + a + " , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ", r = n, n = u.pop(), !e.compositeRule && c ? e.async ? n += " throw new ValidationError([" + r + "]); " : n += " validate.errors = [" + r + "]; return false; " : n += " var err = " + r + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", n += " } else {  errors = " + t + "; if (vErrors !== null) { if (" + t + ") vErrors.length = " + t + "; else vErrors = null; } ", e.opts.allErrors && (n += " } ")) : (n += "  var err =   ", !1 !== e.createErrors ? (n += " { keyword: 'not' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: {} ", !1 !== e.opts.messages && (n += " , message: 'should NOT be valid' "), e.opts.verbose && (n += " , schema: validate.schema" + a + " , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ", n += ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", c && (n += " if (false) { ")), n
            }
        }, 9344: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n = " ", r = e.level, o = e.dataLevel, s = e.schema[t], a = e.schemaPath + e.util.getProperty(t),
                    l = e.errSchemaPath + "/" + t, c = !e.opts.allErrors, t = "data" + (o || ""), h = "valid" + r,
                    o = "errs__" + r, d = e.util.copy(e), u = "";
                d.level++;
                var g = "valid" + d.level, p = d.baseId, m = "prevValid" + r, f = "passingSchemas" + r;
                n += "var " + o + " = errors , " + m + " = false , " + h + " = false , " + f + " = null; ";
                r = e.compositeRule;
                e.compositeRule = d.compositeRule = !0;
                var C = s;
                if (C) for (var I, v = -1, A = C.length - 1; v < A;) I = C[v += 1], (e.opts.strictKeywords ? "object" == typeof I && 0 < Object.keys(I).length || !1 === I : e.util.schemaHasRules(I, e.RULES.all)) ? (d.schema = I, d.schemaPath = a + "[" + v + "]", d.errSchemaPath = l + "/" + v, n += "  " + e.validate(d) + " ", d.baseId = p) : n += " var " + g + " = true; ", v && (n += " if (" + g + " && " + m + ") { " + h + " = false; " + f + " = [" + f + ", " + v + "]; } else { ", u += "}"), n += " if (" + g + ") { " + h + " = " + m + " = true; " + f + " = " + v + "; }";
                return e.compositeRule = d.compositeRule = r, n += u + "if (!" + h + ") {   var err =   ", !1 !== e.createErrors ? (n += " { keyword: 'oneOf' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: { passingSchemas: " + f + " } ", !1 !== e.opts.messages && (n += " , message: 'should match exactly one schema in oneOf' "), e.opts.verbose && (n += " , schema: validate.schema" + a + " , parentSchema: validate.schema" + e.schemaPath + " , data: " + t + " "), n += " } ") : n += " {} ", n += ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", !e.compositeRule && c && (e.async ? n += " throw new ValidationError(vErrors); " : n += " validate.errors = vErrors; return false; "), n += "} else {  errors = " + o + "; if (vErrors !== null) { if (" + o + ") vErrors.length = " + o + "; else vErrors = null; }", e.opts.allErrors && (n += " } "), n
            }
        }, 9737: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n = " ", r = e.level, o = e.dataLevel, s = e.schema[t], a = e.schemaPath + e.util.getProperty(t),
                    l = e.errSchemaPath + "/" + t, c = !e.opts.allErrors, h = "data" + (o || ""),
                    t = e.opts.$data && s && s.$data,
                    o = t ? (n += " var schema" + r + " = " + e.util.getData(s.$data, o, e.dataPathArr) + "; ", "schema" + r) : s,
                    r = t ? "(new RegExp(" + o + "))" : e.usePattern(s);
                n += "if ( ", t && (n += " (" + o + " !== undefined && typeof " + o + " != 'string') || ");
                var d = d || [];
                d.push(n += " !" + r + ".test(" + h + ") ) {   "), n = "", !1 !== e.createErrors ? (n += " { keyword: 'pattern' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: { pattern:  ", n += t ? "" + o : "" + e.util.toQuotedString(s), n += "  } ", !1 !== e.opts.messages && (n += " , message: 'should match pattern \"", n += t ? "' + " + o + " + '" : "" + e.util.escapeQuotes(s), n += "\"' "), e.opts.verbose && (n += " , schema:  ", n += t ? "validate.schema" + a : "" + e.util.toQuotedString(s), n += "         , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ";
                h = n, n = d.pop();
                return !e.compositeRule && c ? e.async ? n += " throw new ValidationError([" + h + "]); " : n += " validate.errors = [" + h + "]; return false; " : n += " var err = " + h + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", n += "} ", c && (n += " else { "), n
            }
        }, 2537: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n = " ", r = e.level, o = e.dataLevel, s = e.schema[t], a = e.schemaPath + e.util.getProperty(t),
                    l = e.errSchemaPath + "/" + t, c = !e.opts.allErrors, h = "data" + (o || ""), d = "errs__" + r,
                    u = e.util.copy(e), g = "";
                u.level++;
                var p, m = "valid" + u.level, f = "key" + r, C = "idx" + r, I = u.dataLevel = e.dataLevel + 1,
                    v = "data" + I, A = "dataProperties" + r, b = Object.keys(s || {}).filter($),
                    y = e.schema.patternProperties || {}, w = Object.keys(y).filter($),
                    S = e.schema.additionalProperties, x = b.length || w.length, k = !1 === S,
                    E = "object" == typeof S && Object.keys(S).length, R = e.opts.removeAdditional, t = k || E || R,
                    T = e.opts.ownProperties, _ = e.baseId, o = e.schema.required;

                function $(e) {
                    return "__proto__" !== e
                }

                if (o && (!e.opts.$data || !o.$data) && o.length < e.opts.loopRequired && (p = e.util.toHash(o)), n += "var " + d + " = errors;var " + m + " = true;", T && (n += " var " + A + " = undefined;"), t) {
                    if (n += T ? " " + A + " = " + A + " || Object.keys(" + h + "); for (var " + C + "=0; " + C + "<" + A + ".length; " + C + "++) { var " + f + " = " + A + "[" + C + "]; " : " for (var " + f + " in " + h + ") { ", x) {
                        if (n += " var isAdditional" + r + " = !(false ", b.length) if (8 < b.length) n += " || validate.schema" + a + ".hasOwnProperty(" + f + ") "; else {
                            var L = b;
                            if (L) for (var B = -1, W = L.length - 1; B < W;) V = L[B += 1], n += " || " + f + " == " + e.util.toQuotedString(V) + " "
                        }
                        if (w.length) {
                            var N = w;
                            if (N) for (var G = -1, F = N.length - 1; G < F;) Q = N[G += 1], n += " || " + e.usePattern(Q) + ".test(" + f + ") "
                        }
                        n += " ); if (isAdditional" + r + ") { "
                    }
                    "all" == R ? n += " delete " + h + "[" + f + "]; " : (K = e.errorPath, r = "' + " + f + " + '", e.opts._errorDataPathProperty && (e.errorPath = e.util.getPathExpr(e.errorPath, f, e.opts.jsonPointers)), k ? R ? n += " delete " + h + "[" + f + "]; " : (j = l, l = e.errSchemaPath + "/additionalProperties", (X = X || []).push(n += " " + m + " = false; "), n = "", !1 !== e.createErrors ? (
                        n += " { keyword: 'additionalProperties' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: { additionalProperty: '" + r + "' } ", !1 !== e.opts.messages && (n += " , message: '", e.opts._errorDataPathProperty ? n += "is an invalid additional property" : n += "should NOT have additional properties", n += "' "), e.opts.verbose && (n += " , schema: false , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ", J = n, n = X.pop(), !e.compositeRule && c ? e.async ? n += " throw new ValidationError([" + J + "]); " : n += " validate.errors = [" + J + "]; return false; " : n += " var err = " + J + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", l = j, c && (n += " break; ")) : E && ("failing" == R ? (n += " var " + d + " = errors;  ", R = e.compositeRule, e.compositeRule = u.compositeRule = !0, u.schema = S, u.schemaPath = e.schemaPath + ".additionalProperties", u.errSchemaPath = e.errSchemaPath + "/additionalProperties", u.errorPath = e.opts._errorDataPathProperty ? e.errorPath : e.util.getPathExpr(e.errorPath, f, e.opts.jsonPointers), te = h + "[" + f + "]", u.dataPathArr[I] = f, ie = e.validate(u), u.baseId = _, e.util.varOccurences(ie, v) < 2 ? n += " " + e.util.varReplace(ie, v, te) + " " : n += " var " + v + " = " + te + "; " + ie + " ", n += " if (!" + m + ") { errors = " + d + "; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete " + h + "[" + f + "]; }  ", e.compositeRule = u.compositeRule = R) : (u.schema = S, u.schemaPath = e.schemaPath + ".additionalProperties", u.errSchemaPath = e.errSchemaPath + "/additionalProperties", u.errorPath = e.opts._errorDataPathProperty ? e.errorPath : e.util.getPathExpr(e.errorPath, f, e.opts.jsonPointers), te = h + "[" + f + "]", u.dataPathArr[I] = f, ie = e.validate(u), u.baseId = _, e.util.varOccurences(ie, v) < 2 ? n += " " + e.util.varReplace(ie, v, te) + " " : n += " var " + v + " = " + te + "; " + ie + " ", c && (n += " if (!" + m + ") break; "))), e.errorPath = K), x && (n += " } "), n += " }  ", c && (n += " if (" + m + ") { ", g += "}")
                }
                var P = e.opts.useDefaults && !e.compositeRule;
                if (b.length) {
                    var H = b;
                    if (H) for (var V, Z = -1, M = H.length - 1; Z < M;) {
                        var O, D, K, j, z, X, J, Y = s[V = H[Z += 1]];
                        (e.opts.strictKeywords ? "object" == typeof Y && 0 < Object.keys(Y).length || !1 === Y : e.util.schemaHasRules(Y, e.RULES.all)) && (te = h + (O = e.util.getProperty(V)), z = P && void 0 !== Y.default, u.schema = Y, u.schemaPath = a + O, u.errSchemaPath = l + "/" + e.util.escapeFragment(V), u.errorPath = e.util.getPath(e.errorPath, V, e.opts.jsonPointers), u.dataPathArr[I] = e.util.toQuotedString(V), ie = e.validate(u), u.baseId = _, e.util.varOccurences(ie, v) < 2 ? (ie = e.util.varReplace(ie, v, te), D = te) : n += " var " + (D = v) + " = " + te + "; ", z ? n += " " + ie + " " : (p && p[V] ? (n += " if ( " + D + " === undefined ", T && (n += " || ! Object.prototype.hasOwnProperty.call(" + h + ", '" + e.util.escapeQuotes(V) + "') "), n += ") { " + m + " = false; ", K = e.errorPath, j = l, z = e.util.escapeQuotes(V), e.opts._errorDataPathProperty && (e.errorPath = e.util.getPath(K, V, e.opts.jsonPointers)), l = e.errSchemaPath + "/required", (X = X || []).push(n), n = "", !1 !== e.createErrors ? (n += " { keyword: 'required' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: { missingProperty: '" + z + "' } ", !1 !== e.opts.messages && (n += " , message: '", e.opts._errorDataPathProperty ? n += "is a required property" : n += "should have required property \\'" + z + "\\'", n += "' "), e.opts.verbose && (n += " , schema: validate.schema" + a + " , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ", J = n, n = X.pop(), !e.compositeRule && c ? e.async ? n += " throw new ValidationError([" + J + "]); " : n += " validate.errors = [" + J + "]; return false; " : n += " var err = " + J + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", l = j, e.errorPath = K, n += " } else { ") : c ? (n += " if ( " + D + " === undefined ", T && (n += " || ! Object.prototype.hasOwnProperty.call(" + h + ", '" + e.util.escapeQuotes(V) + "') "), n += ") { " + m + " = true; } else { ") : (n += " if (" + D + " !== undefined ", T && (n += " &&   Object.prototype.hasOwnProperty.call(" + h + ", '" + e.util.escapeQuotes(V) + "') "), n += " ) { "), n += " " + ie + " } ")), c && (n += " if (" + m + ") { ", g += "}")
                    }
                }
                if (w.length) {
                    var U = w;
                    if (U) for (var Q, q = -1, ee = U.length - 1; q < ee;) {
                        var te, ie, Y = y[Q = U[q += 1]];
                        (e.opts.strictKeywords ? "object" == typeof Y && 0 < Object.keys(Y).length || !1 === Y : e.util.schemaHasRules(Y, e.RULES.all)) && (u.schema = Y, u.schemaPath = e.schemaPath + ".patternProperties" + e.util.getProperty(Q), u.errSchemaPath = e.errSchemaPath + "/patternProperties/" + e.util.escapeFragment(Q), n += T ? " " + A + " = " + A + " || Object.keys(" + h + "); for (var " + C + "=0; " + C + "<" + A + ".length; " + C + "++) { var " + f + " = " + A + "[" + C + "]; " : " for (var " + f + " in " + h + ") { ", n += " if (" + e.usePattern(Q) + ".test(" + f + ")) { ", u.errorPath = e.util.getPathExpr(e.errorPath, f, e.opts.jsonPointers), te = h + "[" + f + "]", u.dataPathArr[I] = f, ie = e.validate(u), u.baseId = _, e.util.varOccurences(ie, v) < 2 ? n += " " + e.util.varReplace(ie, v, te) + " " : n += " var " + v + " = " + te + "; " + ie + " ", c && (n += " if (!" + m + ") break; "), n += " } ", c && (n += " else " + m + " = true; "), n += " }  ", c && (n += " if (" + m + ") { ", g += "}"))
                    }
                }
                return c && (n += " " + g + " if (" + d + " == errors) {"), n
            }
        }, 2127: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n = " ", r = e.level, o = e.dataLevel, s = e.schema[t], a = e.schemaPath + e.util.getProperty(t),
                    l = e.errSchemaPath + "/" + t, c = !e.opts.allErrors, h = "data" + (o || ""), d = "errs__" + r,
                    u = e.util.copy(e);
                u.level++;
                var g, p, m, f, C, I = "valid" + u.level;
                return n += "var " + d + " = errors;", (e.opts.strictKeywords ? "object" == typeof s && 0 < Object.keys(s).length || !1 === s : e.util.schemaHasRules(s, e.RULES.all)) && (u.schema = s, u.schemaPath = a, u.errSchemaPath = l, C = "idx" + r, p = "i" + r, m = "' + " + (g = "key" + r) + " + '", f = "data" + (u.dataLevel = e.dataLevel + 1), t = "dataProperties" + r, o = e.opts.ownProperties, s = e.baseId, o && (n += " var " + t + " = undefined; "), n += o ? " " + t + " = " + t + " || Object.keys(" + h + "); for (var " + C + "=0; " + C + "<" + t + ".length; " + C + "++) { var " + g + " = " + t + "[" + C + "]; " : " for (var " + g + " in " + h + ") { ", n += " var startErrs" + r + " = errors; ", o = g, t = e.compositeRule, e.compositeRule = u.compositeRule = !0, C = e.validate(u), u.baseId = s, e.util.varOccurences(C, f) < 2 ? n += " " + e.util.varReplace(C, f, o) + " " : n += " var " + f + " = " + o + "; " + C + " ", e.compositeRule = u.compositeRule = t, n += " if (!" + I + ") { for (var " + p + "=startErrs" + r + "; " + p + "<errors; " + p + "++) { vErrors[" + p + "].propertyName = " + g + "; }   var err =   ", !1 !== e.createErrors ? (n += " { keyword: 'propertyNames' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: { propertyName: '" + m + "' } ", !1 !== e.opts.messages && (n += " , message: 'property name \\'" + m + "\\' is invalid' "), e.opts.verbose && (n += " , schema: validate.schema" + a + " , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ", n += ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", !e.compositeRule && c && (e.async ? n += " throw new ValidationError(vErrors); " : n += " validate.errors = vErrors; return false; "), c && (n += " break; "), n += " } }"), c && (n += "  if (" + d + " == errors) {"), n
            }
        }, 2331: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n, r, o = " ", s = e.level, a = e.dataLevel, l = e.schema[t], c = e.errSchemaPath + "/" + t,
                    h = !e.opts.allErrors, d = "data" + (a || ""), t = "valid" + s;
                if ("#" == l || "#/" == l) r = e.isRoot ? (n = e.async, "validate") : (n = !0 === e.root.schema.$async, "root.refVal[0]"); else {
                    s = e.resolveRef(e.baseId, l, e.isRoot);
                    if (void 0 === s) {
                        var u, g = e.MissingRefError.message(e.baseId, l);
                        if ("fail" == e.opts.missingRefs) {
                            e.logger.error(g), (u = u || []).push(o), o = "", !1 !== e.createErrors ? (o += " { keyword: '$ref' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(c) + " , params: { ref: '" + e.util.escapeQuotes(l) + "' } ", !1 !== e.opts.messages && (o += " , message: 'can\\'t resolve reference " + e.util.escapeQuotes(l) + "' "), e.opts.verbose && (o += " , schema: " + e.util.toQuotedString(l) + " , parentSchema: validate.schema" + e.schemaPath + " , data: " + d + " "), o += " } ") : o += " {} ";
                            var p = o, o = u.pop();
                            !e.compositeRule && h ? e.async ? o += " throw new ValidationError([" + p + "]); " : o += " validate.errors = [" + p + "]; return false; " : o += " var err = " + p + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", h && (o += " if (false) { ")
                        } else {
                            if ("ignore" != e.opts.missingRefs) throw new e.MissingRefError(e.baseId, l, g);
                            e.logger.warn(g), h && (o += " if (true) { ")
                        }
                    } else s.inline ? ((p = e.util.copy(e)).level++, g = "valid" + p.level, p.schema = s.schema, p.schemaPath = "", p.errSchemaPath = l, o += " " + e.validate(p).replace(/validate\.schema/g, s.code) + " ", h && (o += " if (" + g + ") { ")) : (n = !0 === s.$async || e.async && !1 !== s.$async, r = s.code)
                }
                if (r) {
                    (u = u || []).push(o), o = "", e.opts.passContext ? o += " " + r + ".call(this, " : o += " " + r + "( ", o += " " + d + ", (dataPath || '')", '""' != e.errorPath && (o += " + " + e.errorPath);
                    a = o += " , " + (a ? "data" + (a - 1 || "") : "parentData") + " , " + (a ? e.dataPathArr[a] : "parentDataProperty") + ", rootData)  ";
                    if (o = u.pop(), n) {
                        if (!e.async) throw new Error("async schema referenced by sync schema");
                        h && (o += " var " + t + "; "), o += " try { await " + a + "; ", h && (o += " " + t + " = true; "), o += " } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; ", h && (o += " " + t + " = false; "), o += " } ", h && (o += " if (" + t + ") { ")
                    } else o += " if (!" + a + ") { if (vErrors === null) vErrors = " + r + ".errors; else vErrors = vErrors.concat(" + r + ".errors); errors = vErrors.length; } ", h && (o += " else { ")
                }
                return o
            }
        }, 1204: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n = " ", r = e.level, o = e.dataLevel, s = e.schema[t], a = e.schemaPath + e.util.getProperty(t),
                    l = e.errSchemaPath + "/" + t, c = !e.opts.allErrors, h = "data" + (o || ""), d = "valid" + r,
                    t = e.opts.$data && s && s.$data,
                    o = (t && (n += " var schema" + r + " = " + e.util.getData(s.$data, o, e.dataPathArr) + "; "), "schema" + r);
                if (!t) if (s.length < e.opts.loopRequired && e.schema.properties && Object.keys(e.schema.properties).length) {
                    var u = [], g = s;
                    if (g) for (var p = -1, m = g.length - 1; p < m;) {
                        var f = g[p += 1], C = e.schema.properties[f];
                        C && (e.opts.strictKeywords ? "object" == typeof C && 0 < Object.keys(C).length || !1 === C : e.util.schemaHasRules(C, e.RULES.all)) || (u[u.length] = f)
                    }
                } else u = s;
                if (t || u.length) {
                    var I = e.errorPath, s = t || u.length >= e.opts.loopRequired, v = e.opts.ownProperties;
                    if (c) if (n += " var missing" + r + "; ", s) {
                        t || (n += " var " + o + " = validate.schema" + a + "; ");
                        var A = "' + " + (k = "schema" + r + "[" + (w = "i" + r) + "]") + " + '";
                        e.opts._errorDataPathProperty && (e.errorPath = e.util.getPathExpr(I, k, e.opts.jsonPointers)), n += " var " + d + " = true; ", t && (n += " if (schema" + r + " === undefined) " + d + " = true; else if (!Array.isArray(schema" + r + ")) " + d + " = false; else {"), n += " for (var " + w + " = 0; " + w + " < " + o + ".length; " + w + "++) { " + d + " = " + h + "[" + o + "[" + w + "]] !== undefined ", v && (n += " &&   Object.prototype.hasOwnProperty.call(" + h + ", " + o + "[" + w + "]) "), n += "; if (!" + d + ") break; } ", t && (n += "  }  "), (x = x || []).push(n += "  if (!" + d + ") {   "), n = "", !1 !== e.createErrors ? (n += " { keyword: 'required' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: { missingProperty: '" + A + "' } ", !1 !== e.opts.messages && (n += " , message: '", e.opts._errorDataPathProperty ? n += "is a required property" : n += "should have required property \\'" + A + "\\'", n += "' "), e.opts.verbose && (n += " , schema: validate.schema" + a + " , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ";
                        var b = n, n = x.pop();
                        !e.compositeRule && c ? e.async ? n += " throw new ValidationError([" + b + "]); " : n += " validate.errors = [" + b + "]; return false; " : n += " var err = " + b + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", n += " } else { "
                    } else {
                        n += " if ( ";
                        var y = u;
                        if (y) for (var w = -1, S = y.length - 1; w < S;) R = y[w += 1], w && (n += " || "), n += " ( ( " + (L = h + ($ = e.util.getProperty(R))) + " === undefined ", v && (n += " || ! Object.prototype.hasOwnProperty.call(" + h + ", '" + e.util.escapeQuotes(R) + "') "), n += ") && (missing" + r + " = " + e.util.toQuotedString(e.opts.jsonPointers ? R : $) + ") ) ";
                        n += ") {  ";
                        var x, A = "' + " + (k = "missing" + r) + " + '";
                        e.opts._errorDataPathProperty && (e.errorPath = e.opts.jsonPointers ? e.util.getPathExpr(I, k, !0) : I + " + " + k), (x = x || []).push(n), n = "", !1 !== e.createErrors ? (n += " { keyword: 'required' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: { missingProperty: '" + A + "' } ", !1 !== e.opts.messages && (n += " , message: '", e.opts._errorDataPathProperty ? n += "is a required property" : n += "should have required property \\'" + A + "\\'", n += "' "), e.opts.verbose && (n += " , schema: validate.schema" + a + " , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ";
                        b = n;
                        n = x.pop(), !e.compositeRule && c ? e.async ? n += " throw new ValidationError([" + b + "]); " : n += " validate.errors = [" + b + "]; return false; " : n += " var err = " + b + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", n += " } else { "
                    } else if (s) {
                        t || (n += " var " + o + " = validate.schema" + a + "; ");
                        var k, A = "' + " + (k = "schema" + r + "[" + (w = "i" + r) + "]") + " + '";
                        e.opts._errorDataPathProperty && (e.errorPath = e.util.getPathExpr(I, k, e.opts.jsonPointers)), t && (n += " if (" + o + " && !Array.isArray(" + o + ")) {  var err =   ", !1 !== e.createErrors ? (n += " { keyword: 'required' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: { missingProperty: '" + A + "' } ", !1 !== e.opts.messages && (n += " , message: '", e.opts._errorDataPathProperty ? n += "is a required property" : n += "should have required property \\'" + A + "\\'", n += "' "), e.opts.verbose && (n += " , schema: validate.schema" + a + " , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ", n += ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (" + o + " !== undefined) { "), n += " for (var " + w + " = 0; " + w + " < " + o + ".length; " + w + "++) { if (" + h + "[" + o + "[" + w + "]] === undefined ", v && (n += " || ! Object.prototype.hasOwnProperty.call(" + h + ", " + o + "[" + w + "]) "), n += ") {  var err =   ", !1 !== e.createErrors ? (n += " { keyword: 'required' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: { missingProperty: '" + A + "' } ", !1 !== e.opts.messages && (n += " , message: '", e.opts._errorDataPathProperty ? n += "is a required property" : n += "should have required property \\'" + A + "\\'", n += "' "), e.opts.verbose && (n += " , schema: validate.schema" + a + " , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ", n += ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } ", t && (n += "  }  ")
                    } else {
                        var E = u;
                        if (E) for (var R, T = -1, _ = E.length - 1; T < _;) {
                            R = E[T += 1];
                            var $ = e.util.getProperty(R), A = e.util.escapeQuotes(R), L = h + $;
                            e.opts._errorDataPathProperty && (e.errorPath = e.util.getPath(I, R, e.opts.jsonPointers)), n += " if ( " + L + " === undefined ", v && (n += " || ! Object.prototype.hasOwnProperty.call(" + h + ", '" + e.util.escapeQuotes(R) + "') "), n += ") {  var err =   ", !1 !== e.createErrors ? (n += " { keyword: 'required' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(l) + " , params: { missingProperty: '" + A + "' } ", !1 !== e.opts.messages && (n += " , message: '", e.opts._errorDataPathProperty ? n += "is a required property" : n += "should have required property \\'" + A + "\\'", n += "' "), e.opts.verbose && (n += " , schema: validate.schema" + a + " , parentSchema: validate.schema" + e.schemaPath + " , data: " + h + " "), n += " } ") : n += " {} ", n += ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } "
                        }
                    }
                    e.errorPath = I
                } else c && (n += " if (true) {");
                return n
            }
        }, 1985: function (e) {
            "use strict";
            e.exports = function (e, t, i) {
                var n, r = " ", o = e.level, s = e.dataLevel, a = e.schema[t], l = e.schemaPath + e.util.getProperty(t),
                    c = e.errSchemaPath + "/" + t, h = !e.opts.allErrors, d = "data" + (s || ""), u = "valid" + o,
                    t = e.opts.$data && a && a.$data,
                    s = t ? (r += " var schema" + o + " = " + e.util.getData(a.$data, s, e.dataPathArr) + "; ", "schema" + o) : a;
                return (a || t) && !1 !== e.opts.uniqueItems ? (t && (r += " var " + u + "; if (" + s + " === false || " + s + " === undefined) " + u + " = true; else if (typeof " + s + " != 'boolean') " + u + " = false; else { "), r += " var i = " + d + ".length , " + u + " = true , j; if (i > 1) { ", o = e.schema.items && e.schema.items.type, s = Array.isArray(o), !o || "object" == o || "array" == o || s && (0 <= o.indexOf("object") || 0 <= o.indexOf("array")) ? r += " outer: for (;i--;) { for (j = i; j--;) { if (equal(" + d + "[i], " + d + "[j])) { " + u + " = false; break outer; } } } " : (r += " var itemIndices = {}, item; for (;i--;) { var item = " + d + "[i]; ", r += " if (" + e.util["checkDataType" + (s ? "s" : "")](o, "item", e.opts.strictNumbers, !0) + ") continue; ", s && (r += " if (typeof item == 'string') item = '\"' + item; "), r += " if (typeof itemIndices[item] == 'number') { " + u + " = false; j = itemIndices[item]; break; } itemIndices[item] = i; } "), r += " } ", t && (r += "  }  "), (n = n || []).push(r += " if (!" + u + ") {   "), r = "", !1 !== e.createErrors ? (r += " { keyword: 'uniqueItems' , dataPath: (dataPath || '') + " + e.errorPath + " , schemaPath: " + e.util.toQuotedString(c) + " , params: { i: i, j: j } ", !1 !== e.opts.messages && (r += " , message: 'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)' "), e.opts.verbose && (r += " , schema:  ", r += t ? "validate.schema" + l : "" + a, r += "         , parentSchema: validate.schema" + e.schemaPath + " , data: " + d + " "), r += " } ") : r += " {} ", d = r, r = n.pop(), !e.compositeRule && h ? e.async ? r += " throw new ValidationError([" + d + "]); " : r += " validate.errors = [" + d + "]; return false; " : r += " var err = " + d + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", r += " } ", h && (r += " else { ")) : h && (r += " if (true) { "), r
            }
        }, 1869: function (e) {
            "use strict";
            e.exports = function (n, e, t) {
                var i = "", r = !0 === n.schema.$async, o = n.util.schemaHasRulesExcept(n.schema, n.RULES.all, "$ref"),
                    s = n.self._getId(n.schema);
                if (n.opts.strictKeywords) {
                    var a = n.util.schemaUnknownRules(n.schema, n.RULES.keywords);
                    if (a) {
                        a = "unknown keyword: " + a;
                        if ("log" !== n.opts.strictKeywords) throw new Error(a);
                        n.logger.warn(a)
                    }
                }
                if (n.isTop && (i += " var validate = ", r && (n.async = !0, i += "async "), i += "function(data, dataPath, parentData, parentDataProperty, rootData) { 'use strict'; ", s && (n.opts.sourceCode || n.opts.processCode) && (i += " /*# sourceURL=" + s + " */ ")), "boolean" == typeof n.schema || !o && !n.schema.$ref) {
                    var l = n.level, c = n.dataLevel, h = n.schema[e = "false schema"],
                        d = n.schemaPath + n.util.getProperty(e), u = n.errSchemaPath + "/" + e, g = !n.opts.allErrors,
                        p = "data" + (c || ""), m = "valid" + l;
                    return !1 === n.schema ? (n.isTop ? g = !0 : i += " var " + m + " = false; ", (M = M || []).push(i), i = "", !1 !== n.createErrors ? (i += " { keyword: 'false schema' , dataPath: (dataPath || '') + " + n.errorPath + " , schemaPath: " + n.util.toQuotedString(u) + " , params: {} ", !1 !== n.opts.messages && (i += " , message: 'boolean schema is false' "), n.opts.verbose && (i += " , schema: false , parentSchema: validate.schema" + n.schemaPath + " , data: " + p + " "), i += " } ") : i += " {} ", _ = i, i = M.pop(), !n.compositeRule && g ? n.async ? i += " throw new ValidationError([" + _ + "]); " : i += " validate.errors = [" + _ + "]; return false; " : i += " var err = " + _ + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ") : n.isTop ? i += r ? " return data; " : " validate.errors = null; return true; " : i += " var " + m + " = true; ", n.isTop && (i += " }; return validate; "), i
                }
                if (n.isTop) {
                    var f = n.isTop, l = n.level = 0, c = n.dataLevel = 0, p = "data";
                    if (n.rootId = n.resolve.fullPath(n.self._getId(n.root.schema)), n.baseId = n.baseId || n.rootId, delete n.isTop, n.dataPathArr = [""], void 0 !== n.schema.default && n.opts.useDefaults && n.opts.strictDefaults) {
                        var C = "default is ignored in the schema root";
                        if ("log" !== n.opts.strictDefaults) throw new Error(C);
                        n.logger.warn(C)
                    }
                    i += " var vErrors = null; ", i += " var errors = 0;     ", i += " if (rootData === undefined) rootData = data; "
                } else {
                    l = n.level, p = "data" + ((c = n.dataLevel) || "");
                    if (s && (n.baseId = n.resolve.url(n.baseId, s)), r && !n.async) throw new Error("async schema in sync schema");
                    i += " var errs_" + l + " = errors;"
                }
                var I, m = "valid" + l, g = !n.opts.allErrors, v = "", A = "", b = n.schema.type, y = Array.isArray(b);
                if (b && n.opts.nullable && !0 === n.schema.nullable && (y ? -1 == b.indexOf("null") && (b = b.concat("null")) : "null" != b && (b = [b, "null"], y = !0)), y && 1 == b.length && (b = b[0], y = !1), n.schema.$ref && o) {
                    if ("fail" == n.opts.extendRefs) throw new Error('$ref: validation keywords used in schema at path "' + n.errSchemaPath + '" (see option extendRefs)');
                    !0 !== n.opts.extendRefs && (o = !1, n.logger.warn('$ref: keywords ignored in schema at path "' + n.errSchemaPath + '"'))
                }
                if (n.schema.$comment && n.opts.$comment && (i += " " + n.RULES.all.$comment.code(n, "$comment")), b) {
                    n.opts.coerceTypes && (I = n.util.coerceToTypes(n.opts.coerceTypes, b));
                    var w = n.RULES.types[b];
                    if (I || y || !0 === w || w && !z(w)) {
                        d = n.schemaPath + ".type", u = n.errSchemaPath + "/type", d = n.schemaPath + ".type", u = n.errSchemaPath + "/type";
                        if (i += " if (" + n.util[y ? "checkDataTypes" : "checkDataType"](b, p, n.opts.strictNumbers, !0) + ") { ", I) {
                            var S = "dataType" + l, x = "coerced" + l;
                            i += " var " + S + " = typeof " + p + "; var " + x + " = undefined; ", "array" == n.opts.coerceTypes && (i += " if (" + S + " == 'object' && Array.isArray(" + p + ") && " + p + ".length == 1) { " + p + " = " + p + "[0]; " + S + " = typeof " + p + "; if (" + n.util.checkDataType(n.schema.type, p, n.opts.strictNumbers) + ") " + x + " = " + p + "; } "), i += " if (" + x + " !== undefined) ; ";
                            var k = I;
                            if (k) for (var E, R = -1, T = k.length - 1; R < T;) "string" == (E = k[R += 1]) ? i += " else if (" + S + " == 'number' || " + S + " == 'boolean') " + x + " = '' + " + p + "; else if (" + p + " === null) " + x + " = ''; " : "number" == E || "integer" == E ? (i += " else if (" + S + " == 'boolean' || " + p + " === null || (" + S + " == 'string' && " + p + " && " + p + " == +" + p + " ", "integer" == E && (i += " && !(" + p + " % 1)"), i += ")) " + x + " = +" + p + "; ") : "boolean" == E ? i += " else if (" + p + " === 'false' || " + p + " === 0 || " + p + " === null) " + x + " = false; else if (" + p + " === 'true' || " + p + " === 1) " + x + " = true; " : "null" == E ? i += " else if (" + p + " === '' || " + p + " === 0 || " + p + " === false) " + x + " = null; " : "array" == n.opts.coerceTypes && "array" == E && (i += " else if (" + S + " == 'string' || " + S + " == 'number' || " + S + " == 'boolean' || " + p + " == null) " + x + " = [" + p + "]; ");
                            (M = M || []).push(i += " else {   "), i = "", !1 !== n.createErrors ? (i += " { keyword: 'type' , dataPath: (dataPath || '') + " + n.errorPath + " , schemaPath: " + n.util.toQuotedString(u) + " , params: { type: '", i += y ? "" + b.join(",") : "" + b, i += "' } ", !1 !== n.opts.messages && (i += " , message: 'should be ", i += y ? "" + b.join(",") : "" + b, i += "' "), n.opts.verbose && (i += " , schema: validate.schema" + d + " , parentSchema: validate.schema" + n.schemaPath + " , data: " + p + " "), i += " } ") : i += " {} ";
                            var _ = i;
                            i = M.pop(), !n.compositeRule && g ? n.async ? i += " throw new ValidationError([" + _ + "]); " : i += " validate.errors = [" + _ + "]; return false; " : i += " var err = " + _ + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", i += " } if (" + x + " !== undefined) {  ";
                            s = c ? "data" + (c - 1 || "") : "parentData";
                            i += " " + p + " = " + x + "; ", c || (i += "if (" + s + " !== undefined)"), i += " " + s + "[" + (c ? n.dataPathArr[c] : "parentDataProperty") + "] = " + x + "; } "
                        } else {
                            (M = M || []).push(i), i = "", !1 !== n.createErrors ? (i += " { keyword: 'type' , dataPath: (dataPath || '') + " + n.errorPath + " , schemaPath: " + n.util.toQuotedString(u) + " , params: { type: '", i += y ? "" + b.join(",") : "" + b, i += "' } ", !1 !== n.opts.messages && (i += " , message: 'should be ", i += y ? "" + b.join(",") : "" + b, i += "' "), n.opts.verbose && (i += " , schema: validate.schema" + d + " , parentSchema: validate.schema" + n.schemaPath + " , data: " + p + " "), i += " } ") : i += " {} ";
                            _ = i;
                            i = M.pop(), !n.compositeRule && g ? n.async ? i += " throw new ValidationError([" + _ + "]); " : i += " validate.errors = [" + _ + "]; return false; " : i += " var err = " + _ + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "
                        }
                        i += " } "
                    }
                }
                if (n.schema.$ref && !o) i += " " + n.RULES.all.$ref.code(n, "$ref") + " ", g && (i += " } if (errors === ", i += f ? "0" : "errs_" + l, i += ") { ", A += "}"); else {
                    var $ = n.RULES;
                    if ($) for (var L = -1, B = $.length - 1; L < B;) if (z(w = $[L += 1])) {
                        if (w.type && (i += " if (" + n.util.checkDataType(w.type, p, n.opts.strictNumbers) + ") { "), n.opts.useDefaults) if ("object" == w.type && n.schema.properties) {
                            var h = n.schema.properties, W = Object.keys(h);
                            if (W) for (var N, G = -1, F = W.length - 1; G < F;) if (void 0 !== (V = h[N = W[G += 1]]).default) {
                                var P = p + n.util.getProperty(N);
                                if (n.compositeRule) {
                                    if (n.opts.strictDefaults) {
                                        C = "default is ignored for: " + P;
                                        if ("log" !== n.opts.strictDefaults) throw new Error(C);
                                        n.logger.warn(C)
                                    }
                                } else i += " if (" + P + " === undefined ", "empty" == n.opts.useDefaults && (i += " || " + P + " === null || " + P + " === '' "), i += " ) " + P + " = ", "shared" == n.opts.useDefaults ? i += " " + n.useDefault(V.default) + " " : i += " " + JSON.stringify(V.default) + " ", i += "; "
                            }
                        } else if ("array" == w.type && Array.isArray(n.schema.items)) {
                            var H = n.schema.items;
                            if (H) for (var V, R = -1, Z = H.length - 1; R < Z;) if (void 0 !== (V = H[R += 1]).default) {
                                P = p + "[" + R + "]";
                                if (n.compositeRule) {
                                    if (n.opts.strictDefaults) {
                                        C = "default is ignored for: " + P;
                                        if ("log" !== n.opts.strictDefaults) throw new Error(C);
                                        n.logger.warn(C)
                                    }
                                } else i += " if (" + P + " === undefined ", "empty" == n.opts.useDefaults && (i += " || " + P + " === null || " + P + " === '' "), i += " ) " + P + " = ", "shared" == n.opts.useDefaults ? i += " " + n.useDefault(V.default) + " " : i += " " + JSON.stringify(V.default) + " ", i += "; "
                            }
                        }
                        var M, O = w.rules;
                        if (O) for (var D, K = -1, j = O.length - 1; K < j;) !X(D = O[K += 1]) || (D = D.code(n, D.keyword, w.type)) && (i += " " + D + " ", g && (v += "}"));
                        g && (i += " " + v + " ", v = ""), w.type && (i += " } ", b && b === w.type && !I && (i += " else { ", d = n.schemaPath + ".type", u = n.errSchemaPath + "/type", (M = M || []).push(i), i = "", !1 !== n.createErrors ? (i += " { keyword: 'type' , dataPath: (dataPath || '') + " + n.errorPath + " , schemaPath: " + n.util.toQuotedString(u) + " , params: { type: '", i += y ? "" + b.join(",") : "" + b, i += "' } ", !1 !== n.opts.messages && (i += " , message: 'should be ", i += y ? "" + b.join(",") : "" + b, i += "' "), n.opts.verbose && (i += " , schema: validate.schema" + d + " , parentSchema: validate.schema" + n.schemaPath + " , data: " + p + " "), i += " } ") : i += " {} ", _ = i, i = M.pop(), !n.compositeRule && g ? n.async ? i += " throw new ValidationError([" + _ + "]); " : i += " validate.errors = [" + _ + "]; return false; " : i += " var err = " + _ + ";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ", i += " } ")), g && (i += " if (errors === ", i += f ? "0" : "errs_" + l, i += ") { ", A += "}")
                    }
                }

                function z(e) {
                    for (var t = e.rules, i = 0; i < t.length; i++) if (X(t[i])) return 1
                }

                function X(e) {
                    return void 0 !== n.schema[e.keyword] || e.implements && function (e) {
                        for (var t = e.implements, i = 0; i < t.length; i++) if (void 0 !== n.schema[t[i]]) return 1
                    }(e)
                }

                return g && (i += " " + A + " "), f ? (r ? (i += " if (errors === 0) return data;           ", i += " else throw new ValidationError(vErrors); ") : (i += " validate.errors = vErrors; ", i += " return errors === 0;       "), i += " }; return validate;") : i += " var " + m + " = errors === errs_" + l + ";", i
            }
        }, 7931: function (e, t, i) {
            "use strict";
            var a = /^[a-z_$][a-z0-9_$-]*$/i, l = i(1793), n = i(5868);

            function r(e, t) {
                r.errors = null;
                var i = this._validateKeyword = this._validateKeyword || this.compile(n, !0);
                if (i(e)) return !0;
                if (r.errors = i.errors, t) throw new Error("custom keyword definition is invalid: " + this.errorsText(i.errors));
                return !1
            }

            e.exports = {
                add: function (e, t) {
                    var s = this.RULES;
                    if (s.keywords[e]) throw new Error("Keyword " + e + " is already defined");
                    if (!a.test(e)) throw new Error("Keyword " + e + " is not a valid identifier");
                    if (t) {
                        this.validateKeyword(t, !0);
                        var i = t.type;
                        if (Array.isArray(i)) for (var n = 0; n < i.length; n++) o(e, i[n], t); else o(e, i, t);
                        var r = t.metaSchema;
                        r && (t.$data && this._opts.$data && (r = {anyOf: [r, {$ref: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#"}]}), t.validateSchema = this.compile(r, !0))
                    }

                    function o(e, t, i) {
                        for (var n, r = 0; r < s.length; r++) {
                            var o = s[r];
                            if (o.type == t) {
                                n = o;
                                break
                            }
                        }
                        n || s.push(n = {type: t, rules: []});
                        i = {keyword: e, definition: i, custom: !0, code: l, implements: i.implements};
                        n.rules.push(i), s.custom[e] = i
                    }

                    return s.keywords[e] = s.all[e] = !0, this
                }, get: function (e) {
                    var t = this.RULES.custom[e];
                    return t ? t.definition : this.RULES.keywords[e] || !1
                }, remove: function (e) {
                    var t = this.RULES;
                    delete t.keywords[e], delete t.all[e], delete t.custom[e];
                    for (var i = 0; i < t.length; i++) for (var n = t[i].rules, r = 0; r < n.length; r++) if (n[r].keyword == e) {
                        n.splice(r, 1);
                        break
                    }
                    return this
                }, validate: r
            }
        }, 2303: function (e) {
            "use strict";
            e.exports = function e(t, i) {
                if (t === i) return !0;
                if (t && i && "object" == typeof t && "object" == typeof i) {
                    if (t.constructor !== i.constructor) return !1;
                    var n, r, o;
                    if (Array.isArray(t)) {
                        if ((n = t.length) != i.length) return !1;
                        for (r = n; 0 != r--;) if (!e(t[r], i[r])) return !1;
                        return !0
                    }
                    if (t.constructor === RegExp) return t.source === i.source && t.flags === i.flags;
                    if (t.valueOf !== Object.prototype.valueOf) return t.valueOf() === i.valueOf();
                    if (t.toString !== Object.prototype.toString) return t.toString() === i.toString();
                    if ((n = (o = Object.keys(t)).length) !== Object.keys(i).length) return !1;
                    for (r = n; 0 != r--;) if (!Object.prototype.hasOwnProperty.call(i, o[r])) return !1;
                    for (r = n; 0 != r--;) {
                        var s = o[r];
                        if (!e(t[s], i[s])) return !1
                    }
                    return !0
                }
                return t != t && i != i
            }
        }, 3508: function (e) {
            "use strict";
            e.exports = function (e, t) {
                var n,
                    l = "boolean" == typeof (t = "function" == typeof (t = t || {}) ? {cmp: t} : t).cycles && t.cycles,
                    c = t.cmp && (n = t.cmp, function (i) {
                        return function (e, t) {
                            e = {key: e, value: i[e]}, t = {key: t, value: i[t]};
                            return n(e, t)
                        }
                    }), h = [];
                return function e(t) {
                    if (void 0 !== (t = t && t.toJSON && "function" == typeof t.toJSON ? t.toJSON() : t)) {
                        if ("number" == typeof t) return isFinite(t) ? "" + t : "null";
                        if ("object" != typeof t) return JSON.stringify(t);
                        if (Array.isArray(t)) {
                            for (r = "[", o = 0; o < t.length; o++) o && (r += ","), r += e(t[o]) || "null";
                            return r + "]"
                        }
                        if (null === t) return "null";
                        if (-1 !== h.indexOf(t)) {
                            if (l) return JSON.stringify("__cycle__");
                            throw new TypeError("Converting circular structure to JSON")
                        }
                        for (var i = h.push(t) - 1, n = Object.keys(t).sort(c && c(t)), r = "", o = 0; o < n.length; o++) {
                            var s = n[o], a = e(t[s]);
                            a && (r && (r += ","), r += JSON.stringify(s) + ":" + a)
                        }
                        return h.splice(i, 1), "{" + r + "}"
                    }
                }(e)
            }
        }, 233: function (e) {
            e.exports = function t(e, i) {
                "use strict";

                function n(e) {
                    return t.insensitive && ("" + e).toLowerCase() || "" + e
                }

                var r, o, s = /(^([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)?$|^0x[0-9a-f]+$|\d+)/gi,
                    a = /(^[ ]*|[ ]*$)/g,
                    l = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,
                    c = /^0x[0-9a-f]+$/i, h = /^0/, e = n(e).replace(a, "") || "", a = n(i).replace(a, "") || "",
                    d = e.replace(s, "\0$1\0").replace(/\0$/, "").replace(/^\0/, "").split("\0"),
                    u = a.replace(s, "\0$1\0").replace(/\0$/, "").replace(/^\0/, "").split("\0"),
                    e = parseInt(e.match(c), 16) || 1 !== d.length && e.match(l) && Date.parse(e),
                    a = parseInt(a.match(c), 16) || e && a.match(l) && Date.parse(a) || null;
                if (a) {
                    if (e < a) return -1;
                    if (a < e) return 1
                }
                for (var g = 0, p = Math.max(d.length, u.length); g < p; g++) {
                    if (r = !(d[g] || "").match(h) && parseFloat(d[g]) || d[g] || 0, o = !(u[g] || "").match(h) && parseFloat(u[g]) || u[g] || 0, isNaN(r) !== isNaN(o)) return isNaN(r) ? 1 : -1;
                    if (typeof r != typeof o && (r += "", o += ""), r < o) return -1;
                    if (o < r) return 1
                }
                return 0
            }
        }, 5156: function (e, t) {
            !function (e) {
                "use strict";

                function w(e) {
                    return null !== e && "[object Array]" === Object.prototype.toString.call(e)
                }

                function S(e) {
                    return null !== e && "[object Object]" === Object.prototype.toString.call(e)
                }

                function x(e, t) {
                    if (e === t) return !0;
                    if (Object.prototype.toString.call(e) !== Object.prototype.toString.call(t)) return !1;
                    if (!0 === w(e)) {
                        if (e.length !== t.length) return !1;
                        for (var i = 0; i < e.length; i++) if (!1 === x(e[i], t[i])) return !1;
                        return !0
                    }
                    if (!0 !== S(e)) return !1;
                    var n, r, o = {};
                    for (n in e) if (hasOwnProperty.call(e, n)) {
                        if (!1 === x(e[n], t[n])) return !1;
                        o[n] = !0
                    }
                    for (r in t) if (hasOwnProperty.call(t, r) && !0 !== o[r]) return !1;
                    return !0
                }

                function k(e) {
                    if ("" === e || !1 === e || null === e) return !0;
                    if (w(e) && 0 === e.length) return !0;
                    if (S(e)) {
                        for (var t in e) if (e.hasOwnProperty(t)) return !1;
                        return !0
                    }
                    return !1
                }

                var r = "function" == typeof String.prototype.trimLeft ? function (e) {
                        return e.trimLeft()
                    } : function (e) {
                        return e.match(/^\s*(.*)/)[1]
                    }, c = 0, h = 2, a = "UnquotedIdentifier", l = "QuotedIdentifier", d = "Rbracket", u = "Rparen",
                    g = "Comma", p = "Colon", o = "Rbrace", m = "Number", E = "Current", R = "Expref", T = "Pipe",
                    _ = "Flatten", f = "Star", C = "Filter", s = "Lbrace", I = "Lbracket", v = "Lparen", A = "Literal",
                    b = {".": "Dot", "*": f, ",": g, ":": p, "{": s, "}": o, "]": d, "(": v, ")": u, "@": E},
                    y = {"<": !0, ">": !0, "=": !0, "!": !0}, $ = {" ": !0, "\t": !0, "\n": !0};

                function L(e) {
                    return "0" <= e && e <= "9" || "-" === e
                }

                function i() {
                }

                i.prototype = {
                    tokenize: function (e) {
                        var t, i, n, r = [];
                        for (this._current = 0; this._current < e.length;) if ("a" <= (n = e[this._current]) && n <= "z" || "A" <= n && n <= "Z" || "_" === n) o = this._current, t = this._consumeUnquotedIdentifier(e), r.push({
                            type: a,
                            value: t,
                            start: o
                        }); else if (void 0 !== b[e[this._current]]) r.push({
                            type: b[e[this._current]],
                            value: e[this._current],
                            start: this._current
                        }), this._current++; else if (L(e[this._current])) i = this._consumeNumber(e), r.push(i); else if ("[" === e[this._current]) i = this._consumeLBracket(e), r.push(i); else if ('"' === e[this._current]) o = this._current, t = this._consumeQuotedIdentifier(e), r.push({
                            type: l,
                            value: t,
                            start: o
                        }); else if ("'" === e[this._current]) o = this._current, t = this._consumeRawStringLiteral(e), r.push({
                            type: A,
                            value: t,
                            start: o
                        }); else if ("`" === e[this._current]) {
                            var o = this._current, s = this._consumeLiteral(e);
                            r.push({type: A, value: s, start: o})
                        } else if (void 0 !== y[e[this._current]]) r.push(this._consumeOperator(e)); else if (void 0 !== $[e[this._current]]) this._current++; else if ("&" === e[this._current]) o = this._current, this._current++, "&" === e[this._current] ? (this._current++, r.push({
                            type: "And",
                            value: "&&",
                            start: o
                        })) : r.push({type: R, value: "&", start: o}); else {
                            if ("|" !== e[this._current]) {
                                s = new Error("Unknown character:" + e[this._current]);
                                throw s.name = "LexerError", s
                            }
                            o = this._current, this._current++, "|" === e[this._current] ? (this._current++, r.push({
                                type: "Or",
                                value: "||",
                                start: o
                            })) : r.push({type: T, value: "|", start: o})
                        }
                        return r
                    }, _consumeUnquotedIdentifier: function (e) {
                        var t, i = this._current;
                        for (this._current++; this._current < e.length && ("a" <= (t = e[this._current]) && t <= "z" || "A" <= t && t <= "Z" || "0" <= t && t <= "9" || "_" === t);) this._current++;
                        return e.slice(i, this._current)
                    }, _consumeQuotedIdentifier: function (e) {
                        var t = this._current;
                        this._current++;
                        for (var i = e.length; '"' !== e[this._current] && this._current < i;) {
                            var n = this._current;
                            "\\" !== e[n] || "\\" !== e[n + 1] && '"' !== e[n + 1] ? n++ : n += 2, this._current = n
                        }
                        return this._current++, JSON.parse(e.slice(t, this._current))
                    }, _consumeRawStringLiteral: function (e) {
                        var t = this._current;
                        this._current++;
                        for (var i = e.length; "'" !== e[this._current] && this._current < i;) {
                            var n = this._current;
                            "\\" !== e[n] || "\\" !== e[n + 1] && "'" !== e[n + 1] ? n++ : n += 2, this._current = n
                        }
                        return this._current++, e.slice(t + 1, this._current - 1).replace("\\'", "'")
                    }, _consumeNumber: function (e) {
                        var t = this._current;
                        this._current++;
                        for (var i = e.length; L(e[this._current]) && this._current < i;) this._current++;
                        var n = parseInt(e.slice(t, this._current));
                        return {type: m, value: n, start: t}
                    }, _consumeLBracket: function (e) {
                        var t = this._current;
                        return this._current++, "?" === e[this._current] ? (this._current++, {
                            type: C,
                            value: "[?",
                            start: t
                        }) : "]" === e[this._current] ? (this._current++, {type: _, value: "[]", start: t}) : {
                            type: I,
                            value: "[",
                            start: t
                        }
                    }, _consumeOperator: function (e) {
                        var t = this._current, i = e[t];
                        return this._current++, "!" === i ? "=" === e[this._current] ? (this._current++, {
                            type: "NE",
                            value: "!=",
                            start: t
                        }) : {
                            type: "Not",
                            value: "!",
                            start: t
                        } : "<" === i ? "=" === e[this._current] ? (this._current++, {
                            type: "LTE",
                            value: "<=",
                            start: t
                        }) : {
                            type: "LT",
                            value: "<",
                            start: t
                        } : ">" === i ? "=" === e[this._current] ? (this._current++, {
                            type: "GTE",
                            value: ">=",
                            start: t
                        }) : {
                            type: "GT",
                            value: ">",
                            start: t
                        } : "=" === i && "=" === e[this._current] ? (this._current++, {
                            type: "EQ",
                            value: "==",
                            start: t
                        }) : void 0
                    }, _consumeLiteral: function (e) {
                        this._current++;
                        for (var t = this._current, i = e.length; "`" !== e[this._current] && this._current < i;) {
                            var n = this._current;
                            "\\" !== e[n] || "\\" !== e[n + 1] && "`" !== e[n + 1] ? n++ : n += 2, this._current = n
                        }
                        var t = (t = r(e.slice(t, this._current))).replace("\\`", "`"),
                            t = this._looksLikeJSON(t) ? JSON.parse(t) : JSON.parse('"' + t + '"');
                        return this._current++, t
                    }, _looksLikeJSON: function (e) {
                        if ("" === e) return !1;
                        if (0 <= '[{"'.indexOf(e[0])) return !0;
                        if (0 <= ["true", "false", "null"].indexOf(e)) return !0;
                        if (!(0 <= "-0123456789".indexOf(e[0]))) return !1;
                        try {
                            return JSON.parse(e), !0
                        } catch (e) {
                            return !1
                        }
                    }
                };
                var B = {};

                function W() {
                }

                function N(e) {
                    this.runtime = e
                }

                function G(e) {
                    this._interpreter = e, this.functionTable = {
                        abs: {_func: this._functionAbs, _signature: [{types: [c]}]},
                        avg: {_func: this._functionAvg, _signature: [{types: [8]}]},
                        ceil: {_func: this._functionCeil, _signature: [{types: [c]}]},
                        contains: {_func: this._functionContains, _signature: [{types: [h, 3]}, {types: [1]}]},
                        ends_with: {_func: this._functionEndsWith, _signature: [{types: [h]}, {types: [h]}]},
                        floor: {_func: this._functionFloor, _signature: [{types: [c]}]},
                        length: {_func: this._functionLength, _signature: [{types: [h, 3, 4]}]},
                        map: {_func: this._functionMap, _signature: [{types: [6]}, {types: [3]}]},
                        max: {_func: this._functionMax, _signature: [{types: [8, 9]}]},
                        merge: {_func: this._functionMerge, _signature: [{types: [4], variadic: !0}]},
                        max_by: {_func: this._functionMaxBy, _signature: [{types: [3]}, {types: [6]}]},
                        sum: {_func: this._functionSum, _signature: [{types: [8]}]},
                        starts_with: {_func: this._functionStartsWith, _signature: [{types: [h]}, {types: [h]}]},
                        min: {_func: this._functionMin, _signature: [{types: [8, 9]}]},
                        min_by: {_func: this._functionMinBy, _signature: [{types: [3]}, {types: [6]}]},
                        type: {_func: this._functionType, _signature: [{types: [1]}]},
                        keys: {_func: this._functionKeys, _signature: [{types: [4]}]},
                        values: {_func: this._functionValues, _signature: [{types: [4]}]},
                        sort: {_func: this._functionSort, _signature: [{types: [9, 8]}]},
                        sort_by: {_func: this._functionSortBy, _signature: [{types: [3]}, {types: [6]}]},
                        join: {_func: this._functionJoin, _signature: [{types: [h]}, {types: [9]}]},
                        reverse: {_func: this._functionReverse, _signature: [{types: [h, 3]}]},
                        to_array: {_func: this._functionToArray, _signature: [{types: [1]}]},
                        to_string: {_func: this._functionToString, _signature: [{types: [1]}]},
                        to_number: {_func: this._functionToNumber, _signature: [{types: [1]}]},
                        not_null: {_func: this._functionNotNull, _signature: [{types: [1], variadic: !0}]}
                    }
                }

                B.EOF = 0, B[a] = 0, B[l] = 0, B[d] = 0, B[u] = 0, B[g] = 0, B[o] = 0, B[m] = 0, B[E] = 0, B[R] = 0, B.Pipe = 1, B.Or = 2, B.And = 3, B.EQ = 5, B.GT = 5, B.LT = 5, B.GTE = 5, B.LTE = 5, B.NE = 5, B[_] = 9, B.Star = 20, B[C] = 21, B.Dot = 40, B.Not = 45, B[s] = 50, B[I] = 55, B[v] = 60, W.prototype = {
                    parse: function (e) {
                        this._loadTokens(e), this.index = 0;
                        e = this.expression(0);
                        if ("EOF" === this._lookahead(0)) return e;
                        e = this._lookaheadToken(0), e = new Error("Unexpected token type: " + e.type + ", value: " + e.value);
                        throw e.name = "ParserError", e
                    }, _loadTokens: function (e) {
                        var t = (new i).tokenize(e);
                        t.push({type: "EOF", value: "", start: e.length}), this.tokens = t
                    }, expression: function (e) {
                        var t = this._lookaheadToken(0);
                        this._advance();
                        for (var i = this.nud(t), n = this._lookahead(0); e < B[n];) this._advance(), i = this.led(n, i), n = this._lookahead(0);
                        return i
                    }, _lookahead: function (e) {
                        return this.tokens[this.index + e].type
                    }, _lookaheadToken: function (e) {
                        return this.tokens[this.index + e]
                    }, _advance: function () {
                        this.index++
                    }, nud: function (e) {
                        var t, i;
                        switch (e.type) {
                            case A:
                                return {type: "Literal", value: e.value};
                            case a:
                                return {type: "Field", name: e.value};
                            case l:
                                var n = {type: "Field", name: e.value};
                                if (this._lookahead(0) === v) throw new Error("Quoted identifier not allowed for function names.");
                                return n;
                            case"Not":
                                return {type: "NotExpression", children: [t = this.expression(B.Not)]};
                            case f:
                                return t = null, {
                                    type: "ValueProjection",
                                    children: [{type: "Identity"}, t = this._lookahead(0) === d ? {type: "Identity"} : this._parseProjectionRHS(B.Star)]
                                };
                            case C:
                                return this.led(e.type, {type: "Identity"});
                            case s:
                                return this._parseMultiselectHash();
                            case _:
                                return {
                                    type: "Projection",
                                    children: [{
                                        type: _,
                                        children: [{type: "Identity"}]
                                    }, t = this._parseProjectionRHS(B.Flatten)]
                                };
                            case I:
                                return this._lookahead(0) === m || this._lookahead(0) === p ? (t = this._parseIndexExpression(), this._projectIfSlice({type: "Identity"}, t)) : this._lookahead(0) === f && this._lookahead(1) === d ? (this._advance(), this._advance(), {
                                    type: "Projection",
                                    children: [{type: "Identity"}, t = this._parseProjectionRHS(B.Star)]
                                }) : this._parseMultiselectList();
                            case E:
                                return {type: E};
                            case R:
                                return {type: "ExpressionReference", children: [i = this.expression(B.Expref)]};
                            case v:
                                for (var r = []; this._lookahead(0) !== u;) this._lookahead(0) === E ? (i = {type: E}, this._advance()) : i = this.expression(0), r.push(i);
                                return this._match(u), r[0];
                            default:
                                this._errorToken(e)
                        }
                    }, led: function (e, t) {
                        var i;
                        switch (e) {
                            case"Dot":
                                var n = B.Dot;
                                return this._lookahead(0) !== f ? {
                                    type: "Subexpression",
                                    children: [t, i = this._parseDotRHS(n)]
                                } : (this._advance(), {
                                    type: "ValueProjection",
                                    children: [t, i = this._parseProjectionRHS(n)]
                                });
                            case T:
                                return i = this.expression(B.Pipe), {type: T, children: [t, i]};
                            case"Or":
                                return {type: "OrExpression", children: [t, i = this.expression(B.Or)]};
                            case"And":
                                return {type: "AndExpression", children: [t, i = this.expression(B.And)]};
                            case v:
                                for (var r, n = t.name, o = []; this._lookahead(0) !== u;) this._lookahead(0) === E ? (r = {type: E}, this._advance()) : r = this.expression(0), this._lookahead(0) === g && this._match(g), o.push(r);
                                return this._match(u), {type: "Function", name: n, children: o};
                            case C:
                                var s = this.expression(0);
                                return this._match(d), {
                                    type: "FilterProjection",
                                    children: [t, i = this._lookahead(0) === _ ? {type: "Identity"} : this._parseProjectionRHS(B.Filter), s]
                                };
                            case _:
                                return {
                                    type: "Projection",
                                    children: [{type: _, children: [t]}, this._parseProjectionRHS(B.Flatten)]
                                };
                            case"EQ":
                            case"NE":
                            case"GT":
                            case"GTE":
                            case"LT":
                            case"LTE":
                                return this._parseComparator(t, e);
                            case I:
                                s = this._lookaheadToken(0);
                                return s.type === m || s.type === p ? (i = this._parseIndexExpression(), this._projectIfSlice(t, i)) : (this._match(f), this._match(d), {
                                    type: "Projection",
                                    children: [t, i = this._parseProjectionRHS(B.Star)]
                                });
                            default:
                                this._errorToken(this._lookaheadToken(0))
                        }
                    }, _match: function (e) {
                        if (this._lookahead(0) !== e) {
                            var t = this._lookaheadToken(0), t = new Error("Expected " + e + ", got: " + t.type);
                            throw t.name = "ParserError", t
                        }
                        this._advance()
                    }, _errorToken: function (e) {
                        e = new Error("Invalid token (" + e.type + '): "' + e.value + '"');
                        throw e.name = "ParserError", e
                    }, _parseIndexExpression: function () {
                        if (this._lookahead(0) === p || this._lookahead(1) === p) return this._parseSliceExpression();
                        var e = {type: "Index", value: this._lookaheadToken(0).value};
                        return this._advance(), this._match(d), e
                    }, _projectIfSlice: function (e, t) {
                        e = {type: "IndexExpression", children: [e, t]};
                        return "Slice" === t.type ? {
                            type: "Projection",
                            children: [e, this._parseProjectionRHS(B.Star)]
                        } : e
                    }, _parseSliceExpression: function () {
                        for (var e = [null, null, null], t = 0, i = this._lookahead(0); i !== d && t < 3;) {
                            if (i === p) t++, this._advance(); else {
                                if (i !== m) {
                                    var n = this._lookahead(0),
                                        n = new Error("Syntax error, unexpected token: " + n.value + "(" + n.type + ")");
                                    throw n.name = "Parsererror", n
                                }
                                e[t] = this._lookaheadToken(0).value, this._advance()
                            }
                            i = this._lookahead(0)
                        }
                        return this._match(d), {type: "Slice", children: e}
                    }, _parseComparator: function (e, t) {
                        return {type: "Comparator", name: t, children: [e, this.expression(B[t])]}
                    }, _parseDotRHS: function (e) {
                        var t = this._lookahead(0);
                        return 0 <= [a, l, f].indexOf(t) ? this.expression(e) : t === I ? (this._match(I), this._parseMultiselectList()) : t === s ? (this._match(s), this._parseMultiselectHash()) : void 0
                    }, _parseProjectionRHS: function (e) {
                        var t;
                        if (B[this._lookahead(0)] < 10) t = {type: "Identity"}; else if (this._lookahead(0) === I) t = this.expression(e); else if (this._lookahead(0) === C) t = this.expression(e); else {
                            if ("Dot" !== this._lookahead(0)) {
                                var i = this._lookaheadToken(0),
                                    i = new Error("Sytanx error, unexpected token: " + i.value + "(" + i.type + ")");
                                throw i.name = "ParserError", i
                            }
                            this._match("Dot"), t = this._parseDotRHS(e)
                        }
                        return t
                    }, _parseMultiselectList: function () {
                        for (var e = []; this._lookahead(0) !== d;) {
                            var t = this.expression(0);
                            if (e.push(t), this._lookahead(0) === g && (this._match(g), this._lookahead(0) === d)) throw new Error("Unexpected token Rbracket")
                        }
                        return this._match(d), {type: "MultiSelectList", children: e}
                    }, _parseMultiselectHash: function () {
                        for (var e, t, i = [], n = [a, l]; ;) {
                            if (t = this._lookaheadToken(0), n.indexOf(t.type) < 0) throw new Error("Expecting an identifier token, got: " + t.type);
                            if (e = t.value, this._advance(), this._match(p), t = this.expression(0), i.push({
                                type: "KeyValuePair",
                                name: e,
                                value: t
                            }), this._lookahead(0) === g) this._match(g); else if (this._lookahead(0) === o) {
                                this._match(o);
                                break
                            }
                        }
                        return {type: "MultiSelectHash", children: i}
                    }
                }, N.prototype = {
                    search: function (e, t) {
                        return this.visit(e, t)
                    }, visit: function (e, t) {
                        var i, n, r, o, s;
                        switch (e.type) {
                            case"Field":
                                return null === t || !S(t) || void 0 === (l = t[e.name]) ? null : l;
                            case"Subexpression":
                                for (d = this.visit(e.children[0], t), m = 1; m < e.children.length; m++) if (null === (d = this.visit(e.children[1], d))) return null;
                                return d;
                            case"IndexExpression":
                                return y = this.visit(e.children[0], t), this.visit(e.children[1], y);
                            case"Index":
                                if (!w(t)) return null;
                                var a = e.value;
                                return d = void 0 === (d = t[a = a < 0 ? t.length + a : a]) ? null : d;
                            case"Slice":
                                if (!w(t)) return null;
                                var l = e.children.slice(0), a = this.computeSliceParams(t.length, l), l = a[0],
                                    c = a[1], h = a[2], d = [];
                                if (0 < h) for (m = l; m < c; m += h) d.push(t[m]); else for (m = l; c < m; m += h) d.push(t[m]);
                                return d;
                            case"Projection":
                                var u = this.visit(e.children[0], t);
                                if (!w(u)) return null;
                                for (g = [], m = 0; m < u.length; m++) null !== (n = this.visit(e.children[1], u[m])) && g.push(n);
                                return g;
                            case"ValueProjection":
                                if (!S(u = this.visit(e.children[0], t))) return null;
                                for (var g = [], p = function (e) {
                                    for (var t = Object.keys(e), i = [], n = 0; n < t.length; n++) i.push(e[t[n]]);
                                    return i
                                }(u), m = 0; m < p.length; m++) null !== (n = this.visit(e.children[1], p[m])) && g.push(n);
                                return g;
                            case"FilterProjection":
                                if (!w(u = this.visit(e.children[0], t))) return null;
                                var f = [], C = [];
                                for (m = 0; m < u.length; m++) k(i = this.visit(e.children[2], u[m])) || f.push(u[m]);
                                for (var I = 0; I < f.length; I++) null !== (n = this.visit(e.children[1], f[I])) && C.push(n);
                                return C;
                            case"Comparator":
                                switch (r = this.visit(e.children[0], t), o = this.visit(e.children[1], t), e.name) {
                                    case"EQ":
                                        d = x(r, o);
                                        break;
                                    case"NE":
                                        d = !x(r, o);
                                        break;
                                    case"GT":
                                        d = o < r;
                                        break;
                                    case"GTE":
                                        d = o <= r;
                                        break;
                                    case"LT":
                                        d = r < o;
                                        break;
                                    case"LTE":
                                        d = r <= o;
                                        break;
                                    default:
                                        throw new Error("Unknown comparator: " + e.name)
                                }
                                return d;
                            case _:
                                var v = this.visit(e.children[0], t);
                                if (!w(v)) return null;
                                var A = [];
                                for (m = 0; m < v.length; m++) w(n = v[m]) ? A.push.apply(A, n) : A.push(n);
                                return A;
                            case"Identity":
                                return t;
                            case"MultiSelectList":
                                if (null === t) return null;
                                for (g = [], m = 0; m < e.children.length; m++) g.push(this.visit(e.children[m], t));
                                return g;
                            case"MultiSelectHash":
                                if (null === t) return null;
                                for (g = {}, m = 0; m < e.children.length; m++) g[(s = e.children[m]).name] = this.visit(s.value, t);
                                return g;
                            case"OrExpression":
                                return i = k(i = this.visit(e.children[0], t)) ? this.visit(e.children[1], t) : i;
                            case"AndExpression":
                                return !0 === k(r = this.visit(e.children[0], t)) ? r : this.visit(e.children[1], t);
                            case"NotExpression":
                                return k(r = this.visit(e.children[0], t));
                            case"Literal":
                                return e.value;
                            case T:
                                return y = this.visit(e.children[0], t), this.visit(e.children[1], y);
                            case E:
                                return t;
                            case"Function":
                                var b = [];
                                for (m = 0; m < e.children.length; m++) b.push(this.visit(e.children[m], t));
                                return this.runtime.callFunction(e.name, b);
                            case"ExpressionReference":
                                var y = e.children[0];
                                return y.jmespathType = R, y;
                            default:
                                throw new Error("Unknown node type: " + e.type)
                        }
                    }, computeSliceParams: function (e, t) {
                        var i = t[0], n = t[1], r = t[2], t = [null, null, null];
                        if (null === r) r = 1; else if (0 === r) {
                            var o = new Error("Invalid slice, step cannot be 0");
                            throw o.name = "RuntimeError", o
                        }
                        o = r < 0, i = null === i ? o ? e - 1 : 0 : this.capSliceRange(e, i, r), n = null === n ? o ? -1 : e : this.capSliceRange(e, n, r);
                        return t[0] = i, t[1] = n, t[2] = r, t
                    }, capSliceRange: function (e, t, i) {
                        return t < 0 ? (t += e) < 0 && (t = i < 0 ? -1 : 0) : e <= t && (t = i < 0 ? e - 1 : e), t
                    }
                }, G.prototype = {
                    callFunction: function (e, t) {
                        var i = this.functionTable[e];
                        if (void 0 === i) throw new Error("Unknown function: " + e + "()");
                        return this._validateArgs(e, t, i._signature), i._func.call(this, t)
                    }, _validateArgs: function (e, t, i) {
                        var n;
                        if (i[i.length - 1].variadic) {
                            if (t.length < i.length) throw n = 1 === i.length ? " argument" : " arguments", new Error("ArgumentError: " + e + "() takes at least" + i.length + n + " but received " + t.length)
                        } else if (t.length !== i.length) throw n = 1 === i.length ? " argument" : " arguments", new Error("ArgumentError: " + e + "() takes " + i.length + n + " but received " + t.length);
                        for (var r = 0; r < i.length; r++) {
                            for (var o = !1, s = i[r].types, a = this._getTypeName(t[r]), l = 0; l < s.length; l++) if (this._typeMatches(a, s[l], t[r])) {
                                o = !0;
                                break
                            }
                            if (!o) throw new Error("TypeError: " + e + "() expected argument " + (r + 1) + " to be type " + s + " but received type " + a + " instead.")
                        }
                    }, _typeMatches: function (e, t, i) {
                        if (1 === t) return !0;
                        if (9 !== t && 8 !== t && 3 !== t) return e === t;
                        if (3 === t) return 3 === e;
                        if (3 === e) {
                            var n;
                            8 === t ? n = c : 9 === t && (n = h);
                            for (var r = 0; r < i.length; r++) if (!this._typeMatches(this._getTypeName(i[r]), n, i[r])) return !1;
                            return !0
                        }
                    }, _getTypeName: function (e) {
                        switch (Object.prototype.toString.call(e)) {
                            case"[object String]":
                                return h;
                            case"[object Number]":
                                return c;
                            case"[object Array]":
                                return 3;
                            case"[object Boolean]":
                                return 5;
                            case"[object Null]":
                                return 7;
                            case"[object Object]":
                                return e.jmespathType === R ? 6 : 4
                        }
                    }, _functionStartsWith: function (e) {
                        return 0 === e[0].lastIndexOf(e[1])
                    }, _functionEndsWith: function (e) {
                        var t = e[0], e = e[1];
                        return -1 !== t.indexOf(e, t.length - e.length)
                    }, _functionReverse: function (e) {
                        if (this._getTypeName(e[0]) === h) {
                            for (var t = e[0], i = "", n = t.length - 1; 0 <= n; n--) i += t[n];
                            return i
                        }
                        e = e[0].slice(0);
                        return e.reverse(), e
                    }, _functionAbs: function (e) {
                        return Math.abs(e[0])
                    }, _functionCeil: function (e) {
                        return Math.ceil(e[0])
                    }, _functionAvg: function (e) {
                        for (var t = 0, i = e[0], n = 0; n < i.length; n++) t += i[n];
                        return t / i.length
                    }, _functionContains: function (e) {
                        return 0 <= e[0].indexOf(e[1])
                    }, _functionFloor: function (e) {
                        return Math.floor(e[0])
                    }, _functionLength: function (e) {
                        return (S(e[0]) ? Object.keys(e[0]) : e[0]).length
                    }, _functionMap: function (e) {
                        for (var t = [], i = this._interpreter, n = e[0], r = e[1], o = 0; o < r.length; o++) t.push(i.visit(n, r[o]));
                        return t
                    }, _functionMerge: function (e) {
                        for (var t = {}, i = 0; i < e.length; i++) {
                            var n, r = e[i];
                            for (n in r) t[n] = r[n]
                        }
                        return t
                    }, _functionMax: function (e) {
                        if (0 < e[0].length) {
                            if (this._getTypeName(e[0][0]) === c) return Math.max.apply(Math, e[0]);
                            for (var t = e[0], i = t[0], n = 1; n < t.length; n++) i.localeCompare(t[n]) < 0 && (i = t[n]);
                            return i
                        }
                        return null
                    }, _functionMin: function (e) {
                        if (0 < e[0].length) {
                            if (this._getTypeName(e[0][0]) === c) return Math.min.apply(Math, e[0]);
                            for (var t = e[0], i = t[0], n = 1; n < t.length; n++) t[n].localeCompare(i) < 0 && (i = t[n]);
                            return i
                        }
                        return null
                    }, _functionSum: function (e) {
                        for (var t = 0, i = e[0], n = 0; n < i.length; n++) t += i[n];
                        return t
                    }, _functionType: function (e) {
                        switch (this._getTypeName(e[0])) {
                            case c:
                                return "number";
                            case h:
                                return "string";
                            case 3:
                                return "array";
                            case 4:
                                return "object";
                            case 5:
                                return "boolean";
                            case 6:
                                return "expref";
                            case 7:
                                return "null"
                        }
                    }, _functionKeys: function (e) {
                        return Object.keys(e[0])
                    }, _functionValues: function (e) {
                        for (var t = e[0], i = Object.keys(t), n = [], r = 0; r < i.length; r++) n.push(t[i[r]]);
                        return n
                    }, _functionJoin: function (e) {
                        var t = e[0];
                        return e[1].join(t)
                    }, _functionToArray: function (e) {
                        return 3 === this._getTypeName(e[0]) ? e[0] : [e[0]]
                    }, _functionToString: function (e) {
                        return this._getTypeName(e[0]) === h ? e[0] : JSON.stringify(e[0])
                    }, _functionToNumber: function (e) {
                        var t, i = this._getTypeName(e[0]);
                        return i === c ? e[0] : i !== h || (t = +e[0], isNaN(t)) ? null : t
                    }, _functionNotNull: function (e) {
                        for (var t = 0; t < e.length; t++) if (7 !== this._getTypeName(e[t])) return e[t];
                        return null
                    }, _functionSort: function (e) {
                        e = e[0].slice(0);
                        return e.sort(), e
                    }, _functionSortBy: function (e) {
                        var t = e[0].slice(0);
                        if (0 === t.length) return t;
                        var r = this._interpreter, o = e[1], s = this._getTypeName(r.visit(o, t[0]));
                        if ([c, h].indexOf(s) < 0) throw new Error("TypeError");
                        for (var a = this, i = [], n = 0; n < t.length; n++) i.push([n, t[n]]);
                        i.sort(function (e, t) {
                            var i = r.visit(o, e[1]), n = r.visit(o, t[1]);
                            if (a._getTypeName(i) !== s) throw new Error("TypeError: expected " + s + ", received " + a._getTypeName(i));
                            if (a._getTypeName(n) !== s) throw new Error("TypeError: expected " + s + ", received " + a._getTypeName(n));
                            return n < i ? 1 : i < n ? -1 : e[0] - t[0]
                        });
                        for (var l = 0; l < i.length; l++) t[l] = i[l][1];
                        return t
                    }, _functionMaxBy: function (e) {
                        for (var t, i, n = e[1], r = e[0], o = this.createKeyFunction(n, [c, h]), s = -1 / 0, a = 0; a < r.length; a++) s < (i = o(r[a])) && (s = i, t = r[a]);
                        return t
                    }, _functionMinBy: function (e) {
                        for (var t, i, n = e[1], r = e[0], o = this.createKeyFunction(n, [c, h]), s = 1 / 0, a = 0; a < r.length; a++) (i = o(r[a])) < s && (s = i, t = r[a]);
                        return t
                    }, createKeyFunction: function (i, n) {
                        var r = this, o = this._interpreter;
                        return function (e) {
                            var t = o.visit(i, e);
                            if (n.indexOf(r._getTypeName(t)) < 0) {
                                e = "TypeError: expected one of " + n + ", received " + r._getTypeName(t);
                                throw new Error(e)
                            }
                            return t
                        }
                    }
                }, e.tokenize = function (e) {
                    return (new i).tokenize(e)
                }, e.compile = function (e) {
                    return (new W).parse(e)
                }, e.search = function (e, t) {
                    var i = new W, n = new G, r = new N(n);
                    return n._interpreter = r, t = i.parse(t), r.search(t, e)
                }, e.strictDeepEqual = x
            }(t)
        }, 500: function (e) {
            "use strict";
            var m = e.exports = function (e, t, i) {
                "function" == typeof t && (i = t, t = {}), function e(t, i, n, r, o, s, a, l, c, h) {
                    if (r && "object" == typeof r && !Array.isArray(r)) {
                        for (var d in i(r, o, s, a, l, c, h), r) {
                            var u = r[d];
                            if (Array.isArray(u)) {
                                if (d in m.arrayKeywords) for (var g = 0; g < u.length; g++) e(t, i, n, u[g], o + "/" + d + "/" + g, s, o, d, r, g)
                            } else if (d in m.propsKeywords) {
                                if (u && "object" == typeof u) for (var p in u) e(t, i, n, u[p], o + "/" + d + "/" + f(p), s, o, d, r, p)
                            } else (d in m.keywords || t.allKeys && !(d in m.skipKeywords)) && e(t, i, n, u, o + "/" + d, s, o, d, r)
                        }
                        n(r, o, s, a, l, c, h)
                    }
                }(t, "function" == typeof (i = t.cb || i) ? i : i.pre || function () {
                }, i.post || function () {
                }, e, "", e)
            };

            function f(e) {
                return e.replace(/~/g, "~0").replace(/\//g, "~1")
            }

            m.keywords = {
                additionalItems: !0,
                items: !0,
                contains: !0,
                additionalProperties: !0,
                propertyNames: !0,
                not: !0
            }, m.arrayKeywords = {items: !0, allOf: !0, anyOf: !0, oneOf: !0}, m.propsKeywords = {
                definitions: !0,
                properties: !0,
                patternProperties: !0,
                dependencies: !0
            }, m.skipKeywords = {
                default: !0,
                enum: !0,
                const: !0,
                required: !0,
                maximum: !0,
                minimum: !0,
                exclusiveMaximum: !0,
                exclusiveMinimum: !0,
                multipleOf: !0,
                maxLength: !0,
                minLength: !0,
                pattern: !0,
                format: !0,
                maxItems: !0,
                minItems: !0,
                uniqueItems: !0,
                maxProperties: !0,
                minProperties: !0
            }
        }, 7026: function (e, t) {
            "use strict";
            var b = {b: "\b", f: "\f", n: "\n", r: "\r", t: "\t", '"': '"', "/": "/", "\\": "\\"}, y = "a".charCodeAt();
            t.parse = function (r, e, t) {
                var n = {}, i = 0, o = 0, s = 0, a = t && t.bigint && "undefined" != typeof BigInt;
                return {data: l("", !0), pointers: n};

                function l(e, t) {
                    var i;
                    c(), m(e, "value");
                    var n = u();
                    switch (n) {
                        case"t":
                            d("rue"), i = !0;
                            break;
                        case"f":
                            d("alse"), i = !1;
                            break;
                        case"n":
                            d("ull"), i = null;
                            break;
                        case'"':
                            i = h();
                            break;
                        case"[":
                            i = function (e) {
                                c();
                                var t = [], i = 0;
                                if ("]" == u()) return t;
                                g();
                                for (; ;) {
                                    var n = e + "/" + i;
                                    t.push(l(n)), c();
                                    n = u();
                                    if ("]" == n) break;
                                    "," != n && v(), c(), i++
                                }
                                return t
                            }(e);
                            break;
                        case"{":
                            i = function (e) {
                                c();
                                var t = {};
                                if ("}" == u()) return t;
                                g();
                                for (; ;) {
                                    var i = C();
                                    '"' != u() && v();
                                    var n = h(), r = e + "/" + w(n);
                                    f(r, "key", i), m(r, "keyEnd"), c(), ":" != u() && v(), c(), t[n] = l(r), c();
                                    r = u();
                                    if ("}" == r) break;
                                    "," != r && v(), c()
                                }
                                return t
                            }(e);
                            break;
                        default:
                            g(), 0 <= "-0123456789".indexOf(n) ? i = function () {
                                var e = "", t = !0;
                                "-" == r[s] && (e += u());
                                e += ("0" == r[s] ? u : p)(), "." == r[s] && (e += u() + p(), t = !1);
                                "e" != r[s] && "E" != r[s] || (e += u(), "+" != r[s] && "-" != r[s] || (e += u()), e += p(), t = !1);
                                var i = +e;
                                return a && t && (i > Number.MAX_SAFE_INTEGER || i < Number.MIN_SAFE_INTEGER) ? BigInt(e) : i
                            }() : I()
                    }
                    return m(e, "valueEnd"), c(), t && s < r.length && I(), i
                }

                function c() {
                    e:for (; s < r.length;) {
                        switch (r[s]) {
                            case" ":
                                o++;
                                break;
                            case"\t":
                                o += 4;
                                break;
                            case"\r":
                                o = 0;
                                break;
                            case"\n":
                                o = 0, i++;
                                break;
                            default:
                                break e
                        }
                        s++
                    }
                }

                function h() {
                    for (var e, t = ""; ;) {
                        if ('"' == (e = u())) break;
                        "\\" == e ? (e = u()) in b ? t += b[e] : "u" == e ? t += function () {
                            var e = 4, t = 0;
                            for (; e--;) {
                                t <<= 4;
                                var i = u().toLowerCase();
                                "a" <= i && i <= "f" ? t += i.charCodeAt() - y + 10 : "0" <= i && i <= "9" ? t += +i : v()
                            }
                            return String.fromCharCode(t)
                        }() : v() : t += e
                    }
                    return t
                }

                function d(e) {
                    for (var t = 0; t < e.length; t++) u() !== e[t] && v()
                }

                function u() {
                    A();
                    var e = r[s];
                    return s++, o++, e
                }

                function g() {
                    s--, o--
                }

                function p() {
                    for (var e = ""; "0" <= r[s] && r[s] <= "9";) e += u();
                    if (e.length) return e;
                    A(), I()
                }

                function m(e, t) {
                    f(e, t, C())
                }

                function f(e, t, i) {
                    n[e] = n[e] || {}, n[e][t] = i
                }

                function C() {
                    return {line: i, column: o, pos: s}
                }

                function I() {
                    throw new SyntaxError("Unexpected token " + r[s] + " in JSON at position " + s)
                }

                function v() {
                    g(), I()
                }

                function A() {
                    if (s >= r.length) throw new SyntaxError("Unexpected end of JSON input")
                }
            }, t.stringify = function (e, t, i) {
                if (v(e)) {
                    var n = 0;
                    switch (typeof (u = "object" == typeof i ? i.space : i)) {
                        case"number":
                            var r = 10 < u ? 10 : u < 0 ? 0 : Math.floor(u), u = r && I(r, " "), o = r, s = r;
                            break;
                        case"string":
                            u = u.slice(0, 10);
                            for (var a = s = o = 0; a < u.length; a++) {
                                switch (u[a]) {
                                    case" ":
                                        s++;
                                        break;
                                    case"\t":
                                        s += 4;
                                        break;
                                    case"\r":
                                        s = 0;
                                        break;
                                    case"\n":
                                        s = 0, n++;
                                        break;
                                    default:
                                        throw new Error("whitespace characters not allowed in JSON")
                                }
                                o++
                            }
                            break;
                        default:
                            u = void 0
                    }
                    var l = "", c = {}, h = 0, d = 0, g = 0, p = i && i.es6 && "function" == typeof Map;
                    return function l(c, h, d) {
                        C(d, "value");
                        switch (typeof c) {
                            case"number":
                            case"bigint":
                            case"boolean":
                                m("" + c);
                                break;
                            case"string":
                                m(A(c));
                                break;
                            case"object":
                                null === c ? m("null") : "function" == typeof c.toJSON ? m(A(c.toJSON())) : Array.isArray(c) ? e() : p ? c.constructor.BYTES_PER_ELEMENT ? e() : c instanceof Map ? i() : c instanceof Set ? i(!0) : t() : t()
                        }
                        C(d, "valueEnd");

                        function e() {
                            if (c.length) {
                                m("[");
                                for (var e = h + 1, t = 0; t < c.length; t++) {
                                    t && m(","), f(e);
                                    var i = v(c[t]) ? c[t] : null, n = d + "/" + t;
                                    l(i, e, n)
                                }
                                f(h), m("]")
                            } else m("[]")
                        }

                        function t() {
                            var e = Object.keys(c);
                            if (e.length) {
                                m("{");
                                for (var t = h + 1, i = 0; i < e.length; i++) {
                                    var n, r = e[i], o = c[r];
                                    v(o) && (i && m(","), n = d + "/" + w(r), f(t), C(n, "key"), m(A(r)), C(n, "keyEnd"), m(":"), u && m(" "), l(o, t, n))
                                }
                                f(h), m("}")
                            } else m("{}")
                        }

                        function i(e) {
                            if (c.size) {
                                m("{");
                                for (var t = h + 1, i = !0, n = c.entries(), r = n.next(); !r.done;) {
                                    var o = r.value, s = o[0], a = !!e || o[1];
                                    v(a) && (i || m(","), i = !1, o = d + "/" + w(s), f(t), C(o, "key"), m(A(s)), C(o, "keyEnd"), m(":"), u && m(" "), l(a, t, o)), r = n.next()
                                }
                                f(h), m("}")
                            } else m("{}")
                        }
                    }(e, 0, ""), {json: l, pointers: c}
                }

                function m(e) {
                    d += e.length, g += e.length, l += e
                }

                function f(e) {
                    if (u) {
                        for (l += "\n" + I(e, u), h++, d = 0; e--;) n ? (h += n, d = s) : d += s, g += o;
                        g += 1
                    }
                }

                function C(e, t) {
                    c[e] = c[e] || {}, c[e][t] = {line: h, column: d, pos: g}
                }

                function I(e, t) {
                    return Array(e + 1).join(t)
                }
            };
            var i = ["number", "bigint", "boolean", "string", "object"];

            function v(e) {
                return 0 <= i.indexOf(typeof e)
            }

            var n = /"|\\/g, r = /[\b]/g, o = /\f/g, s = /\n/g, a = /\r/g, l = /\t/g;

            function A(e) {
                return '"' + (e = e.replace(n, "\\$&").replace(o, "\\f").replace(r, "\\b").replace(s, "\\n").replace(a, "\\r").replace(l, "\\t")) + '"'
            }

            var c = /~/g, h = /\//g;

            function w(e) {
                return e.replace(c, "~0").replace(h, "~1")
            }
        }, 483: function (e, t) {
            var i, n;
            !function () {
                "use strict";
                i = [], void 0 === (n = "function" == typeof (n = function () {
                    "use strict";

                    function C(e) {
                        if (typeof Node === "object") return e instanceof Node; else return e && typeof e === "object" && typeof e.nodeType === "number"
                    }

                    function I(e) {
                        return typeof e === "string"
                    }

                    function v() {
                        var o = [];
                        return {
                            watch: o.push.bind(o), trigger: function (e, t) {
                                var i = true;
                                var n = {
                                    detail: t, preventDefault: function e() {
                                        i = false
                                    }
                                };
                                for (var r = 0; r < o.length; r++) o[r](e, n);
                                return i
                            }
                        }
                    }

                    function r(e) {
                        return window.getComputedStyle(e).display === "none"
                    }

                    function o(e) {
                        this.elem = e
                    }

                    function A(e, t) {
                        return o.make(e("parent")).clazz("pico-overlay").clazz(e("overlayClass", "")).stylize({
                            display: "none",
                            position: "fixed",
                            top: "0px",
                            left: "0px",
                            height: "100%",
                            width: "100%",
                            zIndex: 1e4
                        }).stylize(e("overlayStyles", {opacity: .5, background: "#000"})).onClick(function () {
                            if (e("overlayClose", true)) t()
                        })
                    }

                    o.make = function (e, t) {
                        if (typeof e === "string") e = document.querySelector(e);
                        var i = document.createElement(t || "div");
                        (e || document.body).appendChild(i);
                        return new o(i)
                    }, o.prototype = {
                        child: function (e) {
                            return o.make(this.elem, e)
                        }, stylize: function (e) {
                            e = e || {};
                            if (typeof e.opacity !== "undefined") e.filter = "alpha(opacity=" + e.opacity * 100 + ")";
                            for (var t in e) if (e.hasOwnProperty(t)) this.elem.style[t] = e[t];
                            return this
                        }, clazz: function (e) {
                            this.elem.className += " " + e;
                            return this
                        }, html: function (e) {
                            if (C(e)) this.elem.appendChild(e); else this.elem.innerHTML = e;
                            return this
                        }, onClick: function (e) {
                            this.elem.addEventListener("click", e);
                            return this
                        }, destroy: function () {
                            this.elem.parentNode.removeChild(this.elem)
                        }, hide: function () {
                            this.elem.style.display = "none"
                        }, show: function () {
                            this.elem.style.display = "block"
                        }, attr: function (e, t) {
                            if (t !== undefined) this.elem.setAttribute(e, t);
                            return this
                        }, anyAncestor: function (e) {
                            var t = this.elem;
                            while (t) if (e(new o(t))) return true; else t = t.parentNode;
                            return false
                        }, isVisible: function () {
                            return !r(this.elem)
                        }
                    };
                    var s = 1;

                    function b(e, i) {
                        var t = e("width", "auto");
                        if (typeof t === "number") t = "" + t + "px";
                        var n = e("modalId", "pico-" + s++);
                        var r = o.make(e("parent")).clazz("pico-content").clazz(e("modalClass", "")).stylize({
                            display: "none",
                            position: "fixed",
                            zIndex: 10001,
                            left: "50%",
                            top: "38.1966%",
                            maxHeight: "90%",
                            boxSizing: "border-box",
                            width: t,
                            "-ms-transform": "translate(-50%,-38.1966%)",
                            "-moz-transform": "translate(-50%,-38.1966%)",
                            "-webkit-transform": "translate(-50%,-38.1966%)",
                            "-o-transform": "translate(-50%,-38.1966%)",
                            transform: "translate(-50%,-38.1966%)"
                        }).stylize(e("modalStyles", {
                            overflow: "auto",
                            backgroundColor: "white",
                            padding: "20px",
                            borderRadius: "5px"
                        })).html(e("content")).attr("id", n).attr("role", "dialog").attr("aria-labelledby", e("ariaLabelledBy")).attr("aria-describedby", e("ariaDescribedBy", n)).onClick(function (e) {
                            var t = new o(e.target).anyAncestor(function (e) {
                                return /\bpico-close\b/.test(e.elem.className)
                            });
                            if (t) i()
                        });
                        return r
                    }

                    function y(e, t) {
                        if (t("closeButton", true)) return e.child("button").html(t("closeHtml", "&#xD7;")).clazz("pico-close").clazz(t("closeClass", "")).stylize(t("closeStyles", {
                            borderRadius: "2px",
                            border: 0,
                            padding: 0,
                            cursor: "pointer",
                            height: "15px",
                            width: "15px",
                            position: "absolute",
                            top: "5px",
                            right: "5px",
                            fontSize: "16px",
                            textAlign: "center",
                            lineHeight: "15px",
                            background: "#CCC"
                        })).attr("aria-label", t("close-label", "Close"))
                    }

                    function w(e) {
                        return function () {
                            return e().elem
                        }
                    }

                    var S = v(), c = v();

                    function x(o, s) {
                        function t(e, t) {
                            var i = e.msMatchesSelector || e.webkitMatchesSelector || e.matches;
                            return i.call(e, t)
                        }

                        function n(e) {
                            if (r(e) || t(e, ":disabled") || e.hasAttribute("contenteditable")) return false; else return e.hasAttribute("tabindex") || t(e, "input,select,textarea,button,a[href],area[href],iframe")
                        }

                        function a(e) {
                            var t = e.getElementsByTagName("*");
                            for (var i = 0; i < t.length; i++) if (n(t[i])) return t[i]
                        }

                        function l(e) {
                            var t = e.getElementsByTagName("*");
                            for (var i = t.length; i--;) if (n(t[i])) return t[i]
                        }

                        var i;
                        o.beforeShow(function e() {
                            i = document.activeElement
                        });
                        o.afterShow(function e() {
                            if (s()) {
                                var t = a(o.modalElem());
                                if (t) t.focus()
                            }
                        });
                        o.afterClose(function e() {
                            if (s() && i) i.focus();
                            i = null
                        });
                        c.watch(function e(t) {
                            if (s() && o.isVisible()) {
                                var i = a(o.modalElem());
                                var n = l(o.modalElem());
                                var r = t.shiftKey ? i : n;
                                if (r === document.activeElement) {
                                    (t.shiftKey ? n : i).focus();
                                    t.preventDefault()
                                }
                            }
                        })
                    }

                    function k(e, t) {
                        var i;
                        var n = new o(document.body);
                        e.beforeShow(function () {
                            i = n.elem.style.overflow;
                            if (t()) n.stylize({overflow: "hidden"})
                        });
                        e.afterClose(function () {
                            n.stylize({overflow: i})
                        })
                    }

                    return document.documentElement.addEventListener("keydown", function e(t) {
                        var i = t.which || t.keyCode;
                        if (i === 27) S.trigger(); else if (i === 9) c.trigger(t)
                    }), function e(n) {
                        if (I(n) || C(n)) n = {content: n};
                        var r = v();
                        var t = v();
                        var i = v();
                        var o = v();
                        var s = v();

                        function a(e, t) {
                            var i = n[e];
                            if (typeof i === "function") i = i(t);
                            return i === undefined ? t : i
                        }

                        var l = f.bind(window, "modal");
                        var c = f.bind(window, "overlay");
                        var h = f.bind(window, "close");
                        var d;

                        function u(e) {
                            c().hide();
                            l().hide();
                            s.trigger(d, e)
                        }

                        function g(e) {
                            if (o.trigger(d, e)) u(e)
                        }

                        function p(e) {
                            return function () {
                                e.apply(this, arguments);
                                return d
                            }
                        }

                        var m;

                        function f(e, t) {
                            if (!m) {
                                var i = b(a, g);
                                m = {modal: i, overlay: A(a, g), close: y(i, a)};
                                r.trigger(d, t)
                            }
                            return m[e]
                        }

                        d = {
                            modalElem: w(l),
                            closeElem: w(h),
                            overlayElem: w(c),
                            buildDom: p(f.bind(null, null)),
                            isVisible: function () {
                                return !!(m && l && l().isVisible())
                            },
                            show: function (e) {
                                if (t.trigger(d, e)) {
                                    c().show();
                                    h();
                                    l().show();
                                    i.trigger(d, e)
                                }
                                return this
                            },
                            close: p(g),
                            forceClose: p(u),
                            destroy: function () {
                                l().destroy();
                                c().destroy();
                                c = l = h = undefined
                            },
                            options: function (t) {
                                Object.keys(t).map(function (e) {
                                    n[e] = t[e]
                                })
                            },
                            afterCreate: p(r.watch),
                            beforeShow: p(t.watch),
                            afterShow: p(i.watch),
                            beforeClose: p(o.watch),
                            afterClose: p(s.watch)
                        };
                        x(d, a.bind(null, "focus", true));
                        k(d, a.bind(null, "bodyOverflow", true));
                        S.watch(function e() {
                            if (a("escCloses", true) && d.isVisible()) d.close()
                        });
                        return d
                    }
                }) ? n.apply(t, i) : n) || (e.exports = n)
            }()
        }, 7533: function (e, t) {
            /** @license URI.js v4.4.1 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js */
            !function (e) {
                "use strict";

                function he() {
                    for (var e = arguments.length, t = Array(e), i = 0; i < e; i++) t[i] = arguments[i];
                    if (t.length > 1) {
                        t[0] = t[0].slice(0, -1);
                        var n = t.length - 1;
                        for (var r = 1; r < n; ++r) t[r] = t[r].slice(1, -1);
                        t[n] = t[n].slice(1);
                        return t.join("")
                    } else return t[0]
                }

                function de(e) {
                    return "(?:" + e + ")"
                }

                function n(e) {
                    return e === undefined ? "undefined" : e === null ? "null" : Object.prototype.toString.call(e).split(" ").pop().split("]").shift().toLowerCase()
                }

                function p(e) {
                    return e.toUpperCase()
                }

                function m(e) {
                    return e !== undefined && e !== null ? e instanceof Array ? e : typeof e.length !== "number" || e.split || e.setInterval || e.call ? [e] : Array.prototype.slice.call(e) : []
                }

                function r(e, t) {
                    var i = e;
                    if (t) for (var n in t) i[n] = t[n];
                    return i
                }

                function t(e) {
                    var t = "[A-Za-z]", i = "[\\x0D]", n = "[0-9]", r = "[\\x22]", o = he(n, "[A-Fa-f]"), s = "[\\x0A]",
                        a = "[\\x20]",
                        l = de(de("%[EFef]" + o + "%" + o + o + "%" + o + o) + "|" + de("%[89A-Fa-f]" + o + "%" + o + o) + "|" + de("%" + o + o)),
                        c = "[\\:\\/\\?\\#\\[\\]\\@]", h = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]", d = he(c, h),
                        u = e ? "[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]" : "[]",
                        g = e ? "[\\uE000-\\uF8FF]" : "[]", p = he(t, n, "[\\-\\.\\_\\~]", u),
                        m = de(t + he(t, n, "[\\+\\-\\.]") + "*"), f = de(de(l + "|" + he(p, h, "[\\:]")) + "*"),
                        C = de(de("25[0-5]") + "|" + de("2[0-4]" + n) + "|" + de("1" + n + n) + "|" + de("[1-9]" + n) + "|" + n),
                        I = de(de("25[0-5]") + "|" + de("2[0-4]" + n) + "|" + de("1" + n + n) + "|" + de("0?[1-9]" + n) + "|0?0?" + n),
                        v = de(I + "\\." + I + "\\." + I + "\\." + I), A = de(o + "{1,4}"),
                        b = de(de(A + "\\:" + A) + "|" + v), y = de(de(A + "\\:") + "{6}" + b),
                        w = de("\\:\\:" + de(A + "\\:") + "{5}" + b),
                        S = de(de(A) + "?\\:\\:" + de(A + "\\:") + "{4}" + b),
                        x = de(de(de(A + "\\:") + "{0,1}" + A) + "?\\:\\:" + de(A + "\\:") + "{3}" + b),
                        k = de(de(de(A + "\\:") + "{0,2}" + A) + "?\\:\\:" + de(A + "\\:") + "{2}" + b),
                        E = de(de(de(A + "\\:") + "{0,3}" + A) + "?\\:\\:" + A + "\\:" + b),
                        R = de(de(de(A + "\\:") + "{0,4}" + A) + "?\\:\\:" + b),
                        T = de(de(de(A + "\\:") + "{0,5}" + A) + "?\\:\\:" + A),
                        _ = de(de(de(A + "\\:") + "{0,6}" + A) + "?\\:\\:"),
                        $ = de([y, w, S, x, k, E, R, T, _].join("|")), L = de(de(p + "|" + l) + "+"),
                        B = de($ + "\\%25" + L), W = de($ + de("\\%25|\\%(?!" + o + "{2})") + L),
                        N = de("[vV]" + o + "+\\." + he(p, h, "[\\:]") + "+"),
                        G = de("\\[" + de(W + "|" + $ + "|" + N) + "\\]"), F = de(de(l + "|" + he(p, h)) + "*"),
                        P = de(G + "|" + v + "(?!" + F + ")" + "|" + F), H = de(n + "*"),
                        V = de(de(f + "@") + "?" + P + de("\\:" + H) + "?"), Z = de(l + "|" + he(p, h, "[\\:\\@]")),
                        M = de(Z + "*"), O = de(Z + "+"), D = de(de(l + "|" + he(p, h, "[\\@]")) + "+"),
                        K = de(de("\\/" + M) + "*"), j = de("\\/" + de(O + K) + "?"), z = de(D + K), X = de(O + K),
                        J = "(?!" + Z + ")", Y = de(K + "|" + j + "|" + z + "|" + X + "|" + J),
                        U = de(de(Z + "|" + he("[\\/\\?]", g)) + "*"), Q = de(de(Z + "|[\\/\\?]") + "*"),
                        q = de(de("\\/\\/" + V + K) + "|" + j + "|" + X + "|" + J),
                        ee = de(m + "\\:" + q + de("\\?" + U) + "?" + de("\\#" + Q) + "?"),
                        te = de(de("\\/\\/" + V + K) + "|" + j + "|" + z + "|" + J),
                        ie = de(te + de("\\?" + U) + "?" + de("\\#" + Q) + "?"), ne = de(ee + "|" + ie),
                        re = de(m + "\\:" + q + de("\\?" + U) + "?"),
                        oe = "^(" + m + ")\\:" + de(de("\\/\\/(" + de("(" + f + ")@") + "?(" + P + ")" + de("\\:(" + H + ")") + "?)") + "?(" + K + "|" + j + "|" + X + "|" + J + ")") + de("\\?(" + U + ")") + "?" + de("\\#(" + Q + ")") + "?$",
                        se = "^(){0}" + de(de("\\/\\/(" + de("(" + f + ")@") + "?(" + P + ")" + de("\\:(" + H + ")") + "?)") + "?(" + K + "|" + j + "|" + z + "|" + J + ")") + de("\\?(" + U + ")") + "?" + de("\\#(" + Q + ")") + "?$",
                        ae = "^(" + m + ")\\:" + de(de("\\/\\/(" + de("(" + f + ")@") + "?(" + P + ")" + de("\\:(" + H + ")") + "?)") + "?(" + K + "|" + j + "|" + X + "|" + J + ")") + de("\\?(" + U + ")") + "?$",
                        le = "^" + de("\\#(" + Q + ")") + "?$",
                        ce = "^" + de("(" + f + ")@") + "?(" + P + ")" + de("\\:(" + H + ")") + "?$";
                    return {
                        NOT_SCHEME: new RegExp(he("[^]", t, n, "[\\+\\-\\.]"), "g"),
                        NOT_USERINFO: new RegExp(he("[^\\%\\:]", p, h), "g"),
                        NOT_HOST: new RegExp(he("[^\\%\\[\\]\\:]", p, h), "g"),
                        NOT_PATH: new RegExp(he("[^\\%\\/\\:\\@]", p, h), "g"),
                        NOT_PATH_NOSCHEME: new RegExp(he("[^\\%\\/\\@]", p, h), "g"),
                        NOT_QUERY: new RegExp(he("[^\\%]", p, h, "[\\:\\@\\/\\?]", g), "g"),
                        NOT_FRAGMENT: new RegExp(he("[^\\%]", p, h, "[\\:\\@\\/\\?]"), "g"),
                        ESCAPE: new RegExp(he("[^]", p, h), "g"),
                        UNRESERVED: new RegExp(p, "g"),
                        OTHER_CHARS: new RegExp(he("[^\\%]", p, d), "g"),
                        PCT_ENCODED: new RegExp(l, "g"),
                        IPV4ADDRESS: new RegExp("^(" + v + ")$"),
                        IPV6ADDRESS: new RegExp("^\\[?(" + $ + ")" + de(de("\\%25|\\%(?!" + o + "{2})") + "(" + L + ")") + "?\\]?$")
                    }
                }

                var a = t(false), l = t(true), y = function () {
                        function i(e, t) {
                            var i = [];
                            var n = true;
                            var r = false;
                            var o = undefined;
                            try {
                                for (var s = e[Symbol.iterator](), a; !(n = (a = s.next()).done); n = true) {
                                    i.push(a.value);
                                    if (t && i.length === t) break
                                }
                            } catch (e) {
                                r = true;
                                o = e
                            } finally {
                                try {
                                    if (!n && s["return"]) s["return"]()
                                } finally {
                                    if (r) throw o
                                }
                            }
                            return i
                        }

                        return function (e, t) {
                            if (Array.isArray(e)) return e; else if (Symbol.iterator in Object(e)) return i(e, t); else throw new TypeError("Invalid attempt to destructure non-iterable instance")
                        }
                    }(), i = function (e) {
                        if (Array.isArray(e)) {
                            for (var t = 0, i = Array(e.length); t < e.length; t++) i[t] = e[t];
                            return i
                        } else return Array.from(e)
                    }, W = 2147483647, N = 36, G = 1, F = 26, o = 38, s = 700, P = 72, H = 128, V = "-", c = /^xn--/,
                    h = /[^\0-\x7E]/, d = /[\x2E\u3002\uFF0E\uFF61]/g, u = {
                        overflow: "Overflow: input needs wider integers to process",
                        "not-basic": "Illegal input >= 0x80 (not a basic code point)",
                        "invalid-input": "Invalid input"
                    }, g = N - G, Z = Math.floor, M = String.fromCharCode;

                function O(e) {
                    throw new RangeError(u[e])
                }

                function f(e, t) {
                    var i = [];
                    var n = e.length;
                    while (n--) i[n] = t(e[n]);
                    return i
                }

                function C(e, t) {
                    var i = e.split("@");
                    var n = "";
                    if (i.length > 1) {
                        n = i[0] + "@";
                        e = i[1]
                    }
                    e = e.replace(d, ".");
                    var r = e.split(".");
                    var o = f(r, t).join(".");
                    return n + o
                }

                function D(e) {
                    var t = [];
                    var i = 0;
                    var n = e.length;
                    while (i < n) {
                        var r = e.charCodeAt(i++);
                        if (r >= 55296 && r <= 56319 && i < n) {
                            var o = e.charCodeAt(i++);
                            if ((o & 64512) == 56320) t.push(((r & 1023) << 10) + (o & 1023) + 65536); else {
                                t.push(r);
                                i--
                            }
                        } else t.push(r)
                    }
                    return t
                }

                var I, v = function e(t) {
                    if (t - 48 < 10) return t - 22;
                    if (t - 65 < 26) return t - 65;
                    if (t - 97 < 26) return t - 97;
                    return N
                }, K = function e(t, i) {
                    return t + 22 + 75 * (t < 26) - ((i != 0) << 5)
                }, j = function e(t, i, n) {
                    var r = 0;
                    t = n ? Z(t / s) : t >> 1;
                    t += Z(t / i);
                    for (; t > g * F >> 1; r += N) t = Z(t / g);
                    return Z(r + (g + 1) * t / (t + o))
                }, A = function e(t) {
                    var i = [];
                    var n = t.length;
                    var r = 0;
                    var o = H;
                    var s = P;
                    var a = t.lastIndexOf(V);
                    if (a < 0) a = 0;
                    for (var l = 0; l < a; ++l) {
                        if (t.charCodeAt(l) >= 128) O("not-basic");
                        i.push(t.charCodeAt(l))
                    }
                    for (var c = a > 0 ? a + 1 : 0; c < n;) {
                        var h = r;
                        for (var d = 1, u = N; ; u += N) {
                            if (c >= n) O("invalid-input");
                            var g = v(t.charCodeAt(c++));
                            if (g >= N || g > Z((W - r) / d)) O("overflow");
                            r += g * d;
                            var p = u <= s ? G : u >= s + F ? F : u - s;
                            if (g < p) break;
                            var m = N - p;
                            if (d > Z(W / m)) O("overflow");
                            d *= m
                        }
                        var f = i.length + 1;
                        s = j(r - h, f, h == 0);
                        if (Z(r / f) > W - o) O("overflow");
                        o += Z(r / f);
                        r %= f;
                        i.splice(r++, 0, o)
                    }
                    return String.fromCodePoint.apply(String, i)
                }, b = function e(t) {
                    var i = [];
                    t = D(t);
                    var n = t.length;
                    var r = H;
                    var o = 0;
                    var s = P;
                    var a = true;
                    var l = false;
                    var c = undefined;
                    try {
                        for (var h = t[Symbol.iterator](), d; !(a = (d = h.next()).done); a = true) {
                            var u = d.value;
                            if (u < 128) i.push(M(u))
                        }
                    } catch (e) {
                        l = true;
                        c = e
                    } finally {
                        try {
                            if (!a && h.return) h.return()
                        } finally {
                            if (l) throw c
                        }
                    }
                    var g = i.length;
                    var p = g;
                    if (g) i.push(V);
                    while (p < n) {
                        var m = W;
                        var f = true;
                        var C = false;
                        var I = undefined;
                        try {
                            for (var v = t[Symbol.iterator](), A; !(f = (A = v.next()).done); f = true) {
                                var b = A.value;
                                if (b >= r && b < m) m = b
                            }
                        } catch (e) {
                            C = true;
                            I = e
                        } finally {
                            try {
                                if (!f && v.return) v.return()
                            } finally {
                                if (C) throw I
                            }
                        }
                        var y = p + 1;
                        if (m - r > Z((W - o) / y)) O("overflow");
                        o += (m - r) * y;
                        r = m;
                        var w = true;
                        var S = false;
                        var x = undefined;
                        try {
                            for (var k = t[Symbol.iterator](), E; !(w = (E = k.next()).done); w = true) {
                                var R = E.value;
                                if (R < r && ++o > W) O("overflow");
                                if (R == r) {
                                    var T = o;
                                    for (var _ = N; ; _ += N) {
                                        var $ = _ <= s ? G : _ >= s + F ? F : _ - s;
                                        if (T < $) break;
                                        var L = T - $;
                                        var B = N - $;
                                        i.push(M(K($ + L % B, 0)));
                                        T = Z(L / B)
                                    }
                                    i.push(M(K(T, 0)));
                                    s = j(o, y, p == g);
                                    o = 0;
                                    ++p
                                }
                            }
                        } catch (e) {
                            S = true;
                            x = e
                        } finally {
                            try {
                                if (!w && k.return) k.return()
                            } finally {
                                if (S) throw x
                            }
                        }
                        ++o;
                        ++r
                    }
                    return i.join("")
                }, w, S, x = {
                    version: "2.1.0", ucs2: {
                        decode: D, encode: function e(t) {
                            return String.fromCodePoint.apply(String, i(t))
                        }
                    }, decode: A, encode: b, toASCII: function e(t) {
                        return C(t, function (e) {
                            return h.test(e) ? "xn--" + b(e) : e
                        })
                    }, toUnicode: function e(t) {
                        return C(t, function (e) {
                            return c.test(e) ? A(e.slice(4).toLowerCase()) : e
                        })
                    }
                }, k = {};

                function E(e) {
                    var t = e.charCodeAt(0);
                    var i = void 0;
                    if (t < 16) i = "%0" + t.toString(16).toUpperCase(); else if (t < 128) i = "%" + t.toString(16).toUpperCase(); else if (t < 2048) i = "%" + (t >> 6 | 192).toString(16).toUpperCase() + "%" + (t & 63 | 128).toString(16).toUpperCase(); else i = "%" + (t >> 12 | 224).toString(16).toUpperCase() + "%" + (t >> 6 & 63 | 128).toString(16).toUpperCase() + "%" + (t & 63 | 128).toString(16).toUpperCase();
                    return i
                }

                function R(e) {
                    var t = "";
                    var i = 0;
                    var n = e.length;
                    while (i < n) {
                        var r = parseInt(e.substr(i + 1, 2), 16);
                        if (r < 128) {
                            t += String.fromCharCode(r);
                            i += 3
                        } else if (r >= 194 && r < 224) {
                            if (n - i >= 6) {
                                var o = parseInt(e.substr(i + 4, 2), 16);
                                t += String.fromCharCode((r & 31) << 6 | o & 63)
                            } else t += e.substr(i, 6);
                            i += 6
                        } else if (r >= 224) {
                            if (n - i >= 9) {
                                var s = parseInt(e.substr(i + 4, 2), 16);
                                var a = parseInt(e.substr(i + 7, 2), 16);
                                t += String.fromCharCode((r & 15) << 12 | (s & 63) << 6 | a & 63)
                            } else t += e.substr(i, 9);
                            i += 9
                        } else {
                            t += e.substr(i, 3);
                            i += 3
                        }
                    }
                    return t
                }

                function T(e, i) {
                    function t(e) {
                        var t = R(e);
                        return !t.match(i.UNRESERVED) ? e : t
                    }

                    if (e.scheme) e.scheme = String(e.scheme).replace(i.PCT_ENCODED, t).toLowerCase().replace(i.NOT_SCHEME, "");
                    if (e.userinfo !== undefined) e.userinfo = String(e.userinfo).replace(i.PCT_ENCODED, t).replace(i.NOT_USERINFO, E).replace(i.PCT_ENCODED, p);
                    if (e.host !== undefined) e.host = String(e.host).replace(i.PCT_ENCODED, t).toLowerCase().replace(i.NOT_HOST, E).replace(i.PCT_ENCODED, p);
                    if (e.path !== undefined) e.path = String(e.path).replace(i.PCT_ENCODED, t).replace(e.scheme ? i.NOT_PATH : i.NOT_PATH_NOSCHEME, E).replace(i.PCT_ENCODED, p);
                    if (e.query !== undefined) e.query = String(e.query).replace(i.PCT_ENCODED, t).replace(i.NOT_QUERY, E).replace(i.PCT_ENCODED, p);
                    if (e.fragment !== undefined) e.fragment = String(e.fragment).replace(i.PCT_ENCODED, t).replace(i.NOT_FRAGMENT, E).replace(i.PCT_ENCODED, p);
                    return e
                }

                function _(e) {
                    return e.replace(/^0*(.*)/, "$1") || "0"
                }

                function $(e, t) {
                    var i = e.match(t.IPV4ADDRESS) || [];
                    var n = y(i, 2), r = n[1];
                    if (r) return r.split(".").map(_).join("."); else return e
                }

                function L(e, t) {
                    var i = e.match(t.IPV6ADDRESS) || [];
                    var n = y(i, 3), r = n[1], o = n[2];
                    if (r) {
                        var s = r.toLowerCase().split("::").reverse(), a = y(s, 2), l = a[0], c = a[1];
                        var h = c ? c.split(":").map(_) : [];
                        var d = l.split(":").map(_);
                        var u = t.IPV4ADDRESS.test(d[d.length - 1]);
                        var g = u ? 7 : 8;
                        var p = d.length - g;
                        var m = Array(g);
                        for (var f = 0; f < g; ++f) m[f] = h[f] || d[p + f] || "";
                        if (u) m[g - 1] = $(m[g - 1], t);
                        var C = m.reduce(function (e, t, i) {
                            if (!t || t === "0") {
                                var n = e[e.length - 1];
                                if (n && n.index + n.length === i) n.length++; else e.push({index: i, length: 1})
                            }
                            return e
                        }, []);
                        var I = C.sort(function (e, t) {
                            return t.length - e.length
                        })[0];
                        var v = void 0;
                        if (I && I.length > 1) {
                            var A = m.slice(0, I.index);
                            var b = m.slice(I.index + I.length);
                            v = A.join(":") + "::" + b.join(":")
                        } else v = m.join(":");
                        if (o) v += "%" + o;
                        return v
                    } else return e
                }

                var B = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i,
                    z = "".match(/(){0}/)[1] === undefined;

                function X(e) {
                    var t = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
                    var i = {};
                    var n = t.iri !== false ? l : a;
                    if (t.reference === "suffix") e = (t.scheme ? t.scheme + ":" : "") + "//" + e;
                    var r = e.match(B);
                    if (r) {
                        if (z) {
                            i.scheme = r[1];
                            i.userinfo = r[3];
                            i.host = r[4];
                            i.port = parseInt(r[5], 10);
                            i.path = r[6] || "";
                            i.query = r[7];
                            i.fragment = r[8];
                            if (isNaN(i.port)) i.port = r[5]
                        } else {
                            i.scheme = r[1] || undefined;
                            i.userinfo = e.indexOf("@") !== -1 ? r[3] : undefined;
                            i.host = e.indexOf("//") !== -1 ? r[4] : undefined;
                            i.port = parseInt(r[5], 10);
                            i.path = r[6] || "";
                            i.query = e.indexOf("?") !== -1 ? r[7] : undefined;
                            i.fragment = e.indexOf("#") !== -1 ? r[8] : undefined;
                            if (isNaN(i.port)) i.port = e.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/) ? r[4] : undefined
                        }
                        if (i.host) i.host = L($(i.host, n), n);
                        if (i.scheme === undefined && i.userinfo === undefined && i.host === undefined && i.port === undefined && !i.path && i.query === undefined) i.reference = "same-document"; else if (i.scheme === undefined) i.reference = "relative"; else if (i.fragment === undefined) i.reference = "absolute"; else i.reference = "uri";
                        if (t.reference && t.reference !== "suffix" && t.reference !== i.reference) i.error = i.error || "URI is not a " + t.reference + " reference.";
                        var o = k[(t.scheme || i.scheme || "").toLowerCase()];
                        if (!t.unicodeSupport && (!o || !o.unicodeSupport)) {
                            if (i.host && (t.domainHost || o && o.domainHost)) try {
                                i.host = x.toASCII(i.host.replace(n.PCT_ENCODED, R).toLowerCase())
                            } catch (e) {
                                i.error = i.error || "Host's domain name can not be converted to ASCII via punycode: " + e
                            }
                            T(i, a)
                        } else T(i, n);
                        if (o && o.parse) o.parse(i, t)
                    } else i.error = i.error || "URI can not be parsed.";
                    return i
                }

                function J(e, t) {
                    var i = t.iri !== false ? l : a;
                    var n = [];
                    if (e.userinfo !== undefined) {
                        n.push(e.userinfo);
                        n.push("@")
                    }
                    if (e.host !== undefined) n.push(L($(String(e.host), i), i).replace(i.IPV6ADDRESS, function (e, t, i) {
                        return "[" + t + (i ? "%25" + i : "") + "]"
                    }));
                    if (typeof e.port === "number" || typeof e.port === "string") {
                        n.push(":");
                        n.push(String(e.port))
                    }
                    return n.length ? n.join("") : undefined
                }

                var Y = /^\.\.?\//, U = /^\/\.(\/|$)/, Q = /^\/\.\.(\/|$)/, q = /^\/?(?:.|\n)*?(?=\/|$)/;

                function ee(e) {
                    var t = [];
                    while (e.length) if (e.match(Y)) e = e.replace(Y, ""); else if (e.match(U)) e = e.replace(U, "/"); else if (e.match(Q)) {
                        e = e.replace(Q, "/");
                        t.pop()
                    } else if (e === "." || e === "..") e = ""; else {
                        var i = e.match(q);
                        if (i) {
                            var n = i[0];
                            e = e.slice(n.length);
                            t.push(n)
                        } else throw new Error("Unexpected dot segment condition")
                    }
                    return t.join("")
                }

                function te(t) {
                    var i = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
                    var e = i.iri ? l : a;
                    var n = [];
                    var r = k[(i.scheme || t.scheme || "").toLowerCase()];
                    if (r && r.serialize) r.serialize(t, i);
                    if (t.host) if (e.IPV6ADDRESS.test(t.host)) ; else if (i.domainHost || r && r.domainHost) try {
                        t.host = !i.iri ? x.toASCII(t.host.replace(e.PCT_ENCODED, R).toLowerCase()) : x.toUnicode(t.host)
                    } catch (e) {
                        t.error = t.error || "Host's domain name can not be converted to " + (!i.iri ? "ASCII" : "Unicode") + " via punycode: " + e
                    }
                    T(t, e);
                    if (i.reference !== "suffix" && t.scheme) {
                        n.push(t.scheme);
                        n.push(":")
                    }
                    var o = J(t, i);
                    if (o !== undefined) {
                        if (i.reference !== "suffix") n.push("//");
                        n.push(o);
                        if (t.path && t.path.charAt(0) !== "/") n.push("/")
                    }
                    if (t.path !== undefined) {
                        var s = t.path;
                        if (!i.absolutePath && (!r || !r.absolutePath)) s = ee(s);
                        if (o === undefined) s = s.replace(/^\/\//, "/%2F");
                        n.push(s)
                    }
                    if (t.query !== undefined) {
                        n.push("?");
                        n.push(t.query)
                    }
                    if (t.fragment !== undefined) {
                        n.push("#");
                        n.push(t.fragment)
                    }
                    return n.join("")
                }

                function ie(e, t) {
                    var i = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
                    var n = arguments[3];
                    var r = {};
                    if (!n) {
                        e = X(te(e, i), i);
                        t = X(te(t, i), i)
                    }
                    i = i || {};
                    if (!i.tolerant && t.scheme) {
                        r.scheme = t.scheme;
                        r.userinfo = t.userinfo;
                        r.host = t.host;
                        r.port = t.port;
                        r.path = ee(t.path || "");
                        r.query = t.query
                    } else {
                        if (t.userinfo !== undefined || t.host !== undefined || t.port !== undefined) {
                            r.userinfo = t.userinfo;
                            r.host = t.host;
                            r.port = t.port;
                            r.path = ee(t.path || "");
                            r.query = t.query
                        } else {
                            if (!t.path) {
                                r.path = e.path;
                                if (t.query !== undefined) r.query = t.query; else r.query = e.query
                            } else {
                                if (t.path.charAt(0) === "/") r.path = ee(t.path); else {
                                    if ((e.userinfo !== undefined || e.host !== undefined || e.port !== undefined) && !e.path) r.path = "/" + t.path; else if (!e.path) r.path = t.path; else r.path = e.path.slice(0, e.path.lastIndexOf("/") + 1) + t.path;
                                    r.path = ee(r.path)
                                }
                                r.query = t.query
                            }
                            r.userinfo = e.userinfo;
                            r.host = e.host;
                            r.port = e.port
                        }
                        r.scheme = e.scheme
                    }
                    r.fragment = t.fragment;
                    return r
                }

                function ne(e, t, i) {
                    var n = r({scheme: "null"}, i);
                    return te(ie(X(e, n), X(t, n), n, true), n)
                }

                function re(e, t) {
                    if (typeof e === "string") e = te(X(e, t), t); else if (n(e) === "object") e = X(te(e, t), t);
                    return e
                }

                function oe(e, t, i) {
                    if (typeof e === "string") e = te(X(e, i), i); else if (n(e) === "object") e = te(e, i);
                    if (typeof t === "string") t = te(X(t, i), i); else if (n(t) === "object") t = te(t, i);
                    return e === t
                }

                function se(e, t) {
                    return e && e.toString().replace(!t || !t.iri ? a.ESCAPE : l.ESCAPE, E)
                }

                function ae(e, t) {
                    return e && e.toString().replace(!t || !t.iri ? a.PCT_ENCODED : l.PCT_ENCODED, R)
                }

                var le = {
                    scheme: "http", domainHost: true, parse: function e(t, i) {
                        if (!t.host) t.error = t.error || "HTTP URIs must have a host.";
                        return t
                    }, serialize: function e(t, i) {
                        var n = String(t.scheme).toLowerCase() === "https";
                        if (t.port === (n ? 443 : 80) || t.port === "") t.port = undefined;
                        if (!t.path) t.path = "/";
                        return t
                    }
                }, ce = {scheme: "https", domainHost: le.domainHost, parse: le.parse, serialize: le.serialize};

                function ue(e) {
                    return typeof e.secure === "boolean" ? e.secure : String(e.scheme).toLowerCase() === "wss"
                }

                var ge = {
                        scheme: "ws", domainHost: true, parse: function e(t, i) {
                            var n = t;
                            n.secure = ue(n);
                            n.resourceName = (n.path || "/") + (n.query ? "?" + n.query : "");
                            n.path = undefined;
                            n.query = undefined;
                            return n
                        }, serialize: function e(t, i) {
                            if (t.port === (ue(t) ? 443 : 80) || t.port === "") t.port = undefined;
                            if (typeof t.secure === "boolean") {
                                t.scheme = t.secure ? "wss" : "ws";
                                t.secure = undefined
                            }
                            if (t.resourceName) {
                                var n = t.resourceName.split("?"), r = y(n, 2), o = r[0], s = r[1];
                                t.path = o && o !== "/" ? o : undefined;
                                t.query = s;
                                t.resourceName = undefined
                            }
                            t.fragment = undefined;
                            return t
                        }
                    }, pe = {scheme: "wss", domainHost: ge.domainHost, parse: ge.parse, serialize: ge.serialize}, me = {},
                    fe,
                    Ce = "[A-Za-z0-9\\-\\.\\_\\~" + (true ? "\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF" : "") + "]",
                    Ie = "[0-9A-Fa-f]",
                    ve = de(de("%[EFef]" + Ie + "%" + Ie + Ie + "%" + Ie + Ie) + "|" + de("%[89A-Fa-f]" + Ie + "%" + Ie + Ie) + "|" + de("%" + Ie + Ie)),
                    Ae = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]", be,
                    ye = he("[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]", '[\\"\\\\]'),
                    we = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]", Se = new RegExp(Ce, "g"), xe = new RegExp(ve, "g"),
                    ke = new RegExp(he("[^]", Ae, "[\\.]", '[\\"]', ye), "g"), Ee = new RegExp(he("[^]", Ce, we), "g"),
                    Re = Ee;

                function Te(e) {
                    var t = R(e);
                    return !t.match(Se) ? e : t
                }

                var _e = {
                    scheme: "mailto", parse: function e(t, i) {
                        var n = t;
                        var r = n.to = n.path ? n.path.split(",") : [];
                        n.path = undefined;
                        if (n.query) {
                            var o = false;
                            var s = {};
                            var a = n.query.split("&");
                            for (var l = 0, c = a.length; l < c; ++l) {
                                var h = a[l].split("=");
                                switch (h[0]) {
                                    case"to":
                                        var d = h[1].split(",");
                                        for (var u = 0, g = d.length; u < g; ++u) r.push(d[u]);
                                        break;
                                    case"subject":
                                        n.subject = ae(h[1], i);
                                        break;
                                    case"body":
                                        n.body = ae(h[1], i);
                                        break;
                                    default:
                                        o = true;
                                        s[ae(h[0], i)] = ae(h[1], i);
                                        break
                                }
                            }
                            if (o) n.headers = s
                        }
                        n.query = undefined;
                        for (var p = 0, m = r.length; p < m; ++p) {
                            var f = r[p].split("@");
                            f[0] = ae(f[0]);
                            if (!i.unicodeSupport) try {
                                f[1] = x.toASCII(ae(f[1], i).toLowerCase())
                            } catch (e) {
                                n.error = n.error || "Email address's domain name can not be converted to ASCII via punycode: " + e
                            } else f[1] = ae(f[1], i).toLowerCase();
                            r[p] = f.join("@")
                        }
                        return n
                    }, serialize: function e(t, i) {
                        var n = t;
                        var r = m(t.to);
                        if (r) {
                            for (var o = 0, s = r.length; o < s; ++o) {
                                var a = String(r[o]);
                                var l = a.lastIndexOf("@");
                                var c = a.slice(0, l).replace(xe, Te).replace(xe, p).replace(ke, E);
                                var h = a.slice(l + 1);
                                try {
                                    h = !i.iri ? x.toASCII(ae(h, i).toLowerCase()) : x.toUnicode(h)
                                } catch (e) {
                                    n.error = n.error || "Email address's domain name can not be converted to " + (!i.iri ? "ASCII" : "Unicode") + " via punycode: " + e
                                }
                                r[o] = c + "@" + h
                            }
                            n.path = r.join(",")
                        }
                        var d = t.headers = t.headers || {};
                        if (t.subject) d["subject"] = t.subject;
                        if (t.body) d["body"] = t.body;
                        var u = [];
                        for (var g in d) if (d[g] !== me[g]) u.push(g.replace(xe, Te).replace(xe, p).replace(Ee, E) + "=" + d[g].replace(xe, Te).replace(xe, p).replace(Re, E));
                        if (u.length) n.query = u.join("&");
                        return n
                    }
                }, $e = /^([^\:]+)\:(.*)/, Le = {
                    scheme: "urn", parse: function e(t, i) {
                        var n = t.path && t.path.match($e);
                        var r = t;
                        if (n) {
                            var o = i.scheme || r.scheme || "urn";
                            var s = n[1].toLowerCase();
                            var a = n[2];
                            var l = o + ":" + (i.nid || s);
                            var c = k[l];
                            r.nid = s;
                            r.nss = a;
                            r.path = undefined;
                            if (c) r = c.parse(r, i)
                        } else r.error = r.error || "URN can not be parsed.";
                        return r
                    }, serialize: function e(t, i) {
                        var n = i.scheme || t.scheme || "urn";
                        var r = t.nid;
                        var o = n + ":" + (i.nid || r);
                        var s = k[o];
                        if (s) t = s.serialize(t, i);
                        var a = t;
                        var l = t.nss;
                        a.path = (r || i.nid) + ":" + l;
                        return a
                    }
                }, Be = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/, We = {
                    scheme: "urn:uuid", parse: function e(t, i) {
                        var n = t;
                        n.uuid = n.nss;
                        n.nss = undefined;
                        if (!i.tolerant && (!n.uuid || !n.uuid.match(Be))) n.error = n.error || "UUID is not valid.";
                        return n
                    }, serialize: function e(t, i) {
                        var n = t;
                        n.nss = (t.uuid || "").toLowerCase();
                        return n
                    }
                };
                k[le.scheme] = le, k[ce.scheme] = ce, k[ge.scheme] = ge, k[pe.scheme] = pe, k[_e.scheme] = _e, k[Le.scheme] = Le, k[We.scheme] = We, e.SCHEMES = k, e.pctEncChar = E, e.pctDecChars = R, e.parse = X, e.removeDotSegments = ee, e.serialize = te, e.resolveComponents = ie, e.resolve = ne, e.normalize = re, e.equal = oe, e.escapeComponent = se, e.unescapeComponent = ae, Object.defineProperty(e, "__esModule", {value: true})
            }(t)
        }, 4049: function (e) {
            e.exports = function () {
                "use strict";
                var s = function (e, t) {
                    if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function")
                }, e = function () {
                    function n(e, t) {
                        for (var i = 0; i < t.length; i++) {
                            var n = t[i];
                            n.enumerable = n.enumerable || false;
                            n.configurable = true;
                            if ("value" in n) n.writable = true;
                            Object.defineProperty(e, n.key, n)
                        }
                    }

                    return function (e, t, i) {
                        if (t) n(e.prototype, t);
                        if (i) n(e, i);
                        return e
                    }
                }(), m = function () {
                    function i(e, t) {
                        var i = [];
                        var n = true;
                        var r = false;
                        var o = undefined;
                        try {
                            for (var s = e[Symbol.iterator](), a; !(n = (a = s.next()).done); n = true) {
                                i.push(a.value);
                                if (t && i.length === t) break
                            }
                        } catch (e) {
                            r = true;
                            o = e
                        } finally {
                            try {
                                if (!n && s["return"]) s["return"]()
                            } finally {
                                if (r) throw o
                            }
                        }
                        return i
                    }

                    return function (e, t) {
                        if (Array.isArray(e)) return e; else if (Symbol.iterator in Object(e)) return i(e, t); else throw new TypeError("Invalid attempt to destructure non-iterable instance")
                    }
                }();
                String.prototype.startsWith = String.prototype.startsWith || function (e) {
                    return this.indexOf(e) === 0
                }, String.prototype.padStart = String.prototype.padStart || function (e, t) {
                    var i = this;
                    while (i.length < e) i = t + i;
                    return i
                };
                var r = {
                    cb: "0f8ff",
                    tqw: "aebd7",
                    q: "-ffff",
                    qmrn: "7fffd4",
                    zr: "0ffff",
                    bg: "5f5dc",
                    bsq: "e4c4",
                    bck: "---",
                    nch: "ebcd",
                    b: "--ff",
                    bvt: "8a2be2",
                    brwn: "a52a2a",
                    brw: "deb887",
                    ctb: "5f9ea0",
                    hrt: "7fff-",
                    chcT: "d2691e",
                    cr: "7f50",
                    rnw: "6495ed",
                    crns: "8dc",
                    crms: "dc143c",
                    cn: "-ffff",
                    Db: "--8b",
                    Dcn: "-8b8b",
                    Dgnr: "b8860b",
                    Dgr: "a9a9a9",
                    Dgrn: "-64-",
                    Dkhk: "bdb76b",
                    Dmgn: "8b-8b",
                    Dvgr: "556b2f",
                    Drng: "8c-",
                    Drch: "9932cc",
                    Dr: "8b--",
                    Dsmn: "e9967a",
                    Dsgr: "8fbc8f",
                    DsTb: "483d8b",
                    DsTg: "2f4f4f",
                    Dtrq: "-ced1",
                    Dvt: "94-d3",
                    ppnk: "1493",
                    pskb: "-bfff",
                    mgr: "696969",
                    grb: "1e90ff",
                    rbrc: "b22222",
                    rwht: "af0",
                    stg: "228b22",
                    chs: "-ff",
                    gnsb: "dcdcdc",
                    st: "8f8ff",
                    g: "d7-",
                    gnr: "daa520",
                    gr: "808080",
                    grn: "-8-0",
                    grnw: "adff2f",
                    hnw: "0fff0",
                    htpn: "69b4",
                    nnr: "cd5c5c",
                    ng: "4b-82",
                    vr: "0",
                    khk: "0e68c",
                    vnr: "e6e6fa",
                    nrb: "0f5",
                    wngr: "7cfc-",
                    mnch: "acd",
                    Lb: "add8e6",
                    Lcr: "08080",
                    Lcn: "e0ffff",
                    Lgnr: "afad2",
                    Lgr: "d3d3d3",
                    Lgrn: "90ee90",
                    Lpnk: "b6c1",
                    Lsmn: "a07a",
                    Lsgr: "20b2aa",
                    Lskb: "87cefa",
                    LsTg: "778899",
                    Lstb: "b0c4de",
                    Lw: "e0",
                    m: "-ff-",
                    mgrn: "32cd32",
                    nn: "af0e6",
                    mgnt: "-ff",
                    mrn: "8--0",
                    mqm: "66cdaa",
                    mmb: "--cd",
                    mmrc: "ba55d3",
                    mmpr: "9370db",
                    msg: "3cb371",
                    mmsT: "7b68ee",
                    "": "-fa9a",
                    mtr: "48d1cc",
                    mmvt: "c71585",
                    mnLb: "191970",
                    ntc: "5fffa",
                    mstr: "e4e1",
                    mccs: "e4b5",
                    vjw: "dead",
                    nv: "--80",
                    c: "df5e6",
                    v: "808-0",
                    vrb: "6b8e23",
                    rng: "a5-",
                    rngr: "45-",
                    rch: "da70d6",
                    pgnr: "eee8aa",
                    pgrn: "98fb98",
                    ptrq: "afeeee",
                    pvtr: "db7093",
                    ppwh: "efd5",
                    pchp: "dab9",
                    pr: "cd853f",
                    pnk: "c0cb",
                    pm: "dda0dd",
                    pwrb: "b0e0e6",
                    prp: "8-080",
                    cc: "663399",
                    r: "--",
                    sbr: "bc8f8f",
                    rb: "4169e1",
                    sbrw: "8b4513",
                    smn: "a8072",
                    nbr: "4a460",
                    sgrn: "2e8b57",
                    ssh: "5ee",
                    snn: "a0522d",
                    svr: "c0c0c0",
                    skb: "87ceeb",
                    sTb: "6a5acd",
                    sTgr: "708090",
                    snw: "afa",
                    n: "-ff7f",
                    stb: "4682b4",
                    tn: "d2b48c",
                    t: "-8080",
                    thst: "d8bfd8",
                    tmT: "6347",
                    trqs: "40e0d0",
                    vt: "ee82ee",
                    whT: "5deb3",
                    wht: "",
                    hts: "5f5f5",
                    w: "-",
                    wgrn: "9acd32"
                };

                function a(e) {
                    var t = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
                    var i = t > 0 ? e.toFixed(t).replace(/0+$/, "").replace(/\.$/, "") : e.toString();
                    return i || "0"
                }

                var o = function () {
                    function p(e, t, i, n) {
                        s(this, p);
                        var g = this;

                        function r(e) {
                            if (e.startsWith("hsl")) {
                                var t = e.match(/([\-\d\.e]+)/g).map(Number), i = m(t, 4), n = i[0], r = i[1], o = i[2],
                                    s = i[3];
                                if (s === undefined) s = 1;
                                n /= 360;
                                r /= 100;
                                o /= 100;
                                g.hsla = [n, r, o, s]
                            } else if (e.startsWith("rgb")) {
                                var a = e.match(/([\-\d\.e]+)/g).map(Number), l = m(a, 4), c = l[0], h = l[1], d = l[2],
                                    u = l[3];
                                if (u === undefined) u = 1;
                                g.rgba = [c, h, d, u]
                            } else if (e.startsWith("#")) g.rgba = p.hexToRgb(e); else g.rgba = p.nameToRgb(e) || p.hexToRgb(e)
                        }

                        if (e === undefined) ; else if (Array.isArray(e)) this.rgba = e; else if (i === undefined) {
                            var o = e && "" + e;
                            if (o) r(o.toLowerCase())
                        } else this.rgba = [e, t, i, n === undefined ? 1 : n]
                    }

                    e(p, [{
                        key: "printRGB", value: function e(t) {
                            var i = t ? this.rgba : this.rgba.slice(0, 3), n = i.map(function (e, t) {
                                return a(e, t === 3 ? 3 : 0)
                            });
                            return t ? "rgba(" + n + ")" : "rgb(" + n + ")"
                        }
                    }, {
                        key: "printHSL", value: function e(t) {
                            var i = [360, 100, 100, 1], n = ["", "%", "%", ""];
                            var r = t ? this.hsla : this.hsla.slice(0, 3), o = r.map(function (e, t) {
                                return a(e * i[t], t === 3 ? 3 : 1) + n[t]
                            });
                            return t ? "hsla(" + o + ")" : "hsl(" + o + ")"
                        }
                    }, {
                        key: "printHex", value: function e(t) {
                            var i = this.hex;
                            return t ? i : i.substring(0, 7)
                        }
                    }, {
                        key: "rgba", get: function e() {
                            if (this._rgba) return this._rgba;
                            if (!this._hsla) throw new Error("No color is set");
                            return this._rgba = p.hslToRgb(this._hsla)
                        }, set: function e(t) {
                            if (t.length === 3) t[3] = 1;
                            this._rgba = t;
                            this._hsla = null
                        }
                    }, {
                        key: "rgbString", get: function e() {
                            return this.printRGB()
                        }
                    }, {
                        key: "rgbaString", get: function e() {
                            return this.printRGB(true)
                        }
                    }, {
                        key: "hsla", get: function e() {
                            if (this._hsla) return this._hsla;
                            if (!this._rgba) throw new Error("No color is set");
                            return this._hsla = p.rgbToHsl(this._rgba)
                        }, set: function e(t) {
                            if (t.length === 3) t[3] = 1;
                            this._hsla = t;
                            this._rgba = null
                        }
                    }, {
                        key: "hslString", get: function e() {
                            return this.printHSL()
                        }
                    }, {
                        key: "hslaString", get: function e() {
                            return this.printHSL(true)
                        }
                    }, {
                        key: "hex", get: function e() {
                            var t = this.rgba, i = t.map(function (e, t) {
                                return t < 3 ? e.toString(16) : Math.round(e * 255).toString(16)
                            });
                            return "#" + i.map(function (e) {
                                return e.padStart(2, "0")
                            }).join("")
                        }, set: function e(t) {
                            this.rgba = p.hexToRgb(t)
                        }
                    }], [{
                        key: "hexToRgb", value: function e(t) {
                            var i = (t.startsWith("#") ? t.slice(1) : t).replace(/^(\w{3})$/, "$1F").replace(/^(\w)(\w)(\w)(\w)$/, "$1$1$2$2$3$3$4$4").replace(/^(\w{6})$/, "$1FF");
                            if (!i.match(/^([0-9a-fA-F]{8})$/)) throw new Error("Unknown hex color; " + t);
                            var n = i.match(/^(\w\w)(\w\w)(\w\w)(\w\w)$/).slice(1).map(function (e) {
                                return parseInt(e, 16)
                            });
                            n[3] = n[3] / 255;
                            return n
                        }
                    }, {
                        key: "nameToRgb", value: function e(t) {
                            var i = t.toLowerCase().replace("at", "T").replace(/[aeiouyldf]/g, "").replace("ght", "L").replace("rk", "D").slice(-5, 4),
                                n = r[i];
                            return n === undefined ? n : p.hexToRgb(n.replace(/\-/g, "00").padStart(6, "f"))
                        }
                    }, {
                        key: "rgbToHsl", value: function e(t) {
                            var i = m(t, 4), n = i[0], r = i[1], o = i[2], s = i[3];
                            n /= 255;
                            r /= 255;
                            o /= 255;
                            var a = Math.max(n, r, o), l = Math.min(n, r, o);
                            var c = void 0, h = void 0, d = (a + l) / 2;
                            if (a === l) c = h = 0; else {
                                var u = a - l;
                                h = d > .5 ? u / (2 - a - l) : u / (a + l);
                                switch (a) {
                                    case n:
                                        c = (r - o) / u + (r < o ? 6 : 0);
                                        break;
                                    case r:
                                        c = (o - n) / u + 2;
                                        break;
                                    case o:
                                        c = (n - r) / u + 4;
                                        break
                                }
                                c /= 6
                            }
                            return [c, h, d, s]
                        }
                    }, {
                        key: "hslToRgb", value: function e(t) {
                            var i = m(t, 4), n = i[0], r = i[1], o = i[2], s = i[3];
                            var a = void 0, l = void 0, c = void 0;
                            if (r === 0) a = l = c = o; else {
                                var h = function e(t, i, n) {
                                    if (n < 0) n += 1;
                                    if (n > 1) n -= 1;
                                    if (n < 1 / 6) return t + (i - t) * 6 * n;
                                    if (n < 1 / 2) return i;
                                    if (n < 2 / 3) return t + (i - t) * (2 / 3 - n) * 6;
                                    return t
                                };
                                var d = o < .5 ? o * (1 + r) : o + r - o * r, u = 2 * o - d;
                                a = h(u, d, n + 1 / 3);
                                l = h(u, d, n);
                                c = h(u, d, n - 1 / 3)
                            }
                            var g = [a * 255, l * 255, c * 255].map(Math.round);
                            g[3] = s;
                            return g
                        }
                    }]);
                    return p
                }(), i = function () {
                    function o() {
                        s(this, o);
                        this._events = []
                    }

                    e(o, [{
                        key: "add", value: function e(t, i, n) {
                            t.addEventListener(i, n, false);
                            this._events.push({target: t, type: i, handler: n})
                        }
                    }, {
                        key: "remove", value: function e(i, n, r) {
                            this._events = this._events.filter(function (e) {
                                var t = true;
                                if (i && i !== e.target) t = false;
                                if (n && n !== e.type) t = false;
                                if (r && r !== e.handler) t = false;
                                if (t) o._doRemove(e.target, e.type, e.handler);
                                return !t
                            })
                        }
                    }, {
                        key: "destroy", value: function e() {
                            this._events.forEach(function (e) {
                                return o._doRemove(e.target, e.type, e.handler)
                            });
                            this._events = []
                        }
                    }], [{
                        key: "_doRemove", value: function e(t, i, n) {
                            t.removeEventListener(i, n, false)
                        }
                    }]);
                    return o
                }();

                function l(e) {
                    var t = document.createElement("div");
                    t.innerHTML = e;
                    return t.firstElementChild
                }

                function c(e, h, d) {
                    var u = false;

                    function g(e, t, i) {
                        return Math.max(t, Math.min(e, i))
                    }

                    function n(e, t, i) {
                        if (i) u = true;
                        if (!u) return;
                        e.preventDefault();
                        var n = h.getBoundingClientRect(), r = n.width, o = n.height, s = t.clientX, a = t.clientY;
                        var l = g(s - n.left, 0, r), c = g(a - n.top, 0, o);
                        d(l / r, c / o)
                    }

                    function t(e, t) {
                        var i = e.buttons === undefined ? e.which : e.buttons;
                        if (i === 1) n(e, e, t); else u = false
                    }

                    function i(e, t) {
                        if (e.touches.length === 1) n(e, e.touches[0], t); else u = false
                    }

                    e.add(h, "mousedown", function (e) {
                        t(e, true)
                    });
                    e.add(h, "touchstart", function (e) {
                        i(e, true)
                    });
                    e.add(window, "mousemove", t);
                    e.add(h, "touchmove", i);
                    e.add(window, "mouseup", function (e) {
                        u = false
                    });
                    e.add(h, "touchend", function (e) {
                        u = false
                    });
                    e.add(h, "touchcancel", function (e) {
                        u = false
                    })
                }

                var b = "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2' height='2'%3E%3Cpath d='M1,0H0V1H2V2H1' fill='lightgrey'/%3E%3C/svg%3E\")",
                    y = 360, h = "keydown", d = "mousedown", u = "focusin";

                function w(e, t) {
                    return (t || document).querySelector(e)
                }

                function g(e) {
                    e.preventDefault();
                    e.stopPropagation()
                }

                function p(e, t, i, n, r) {
                    e.add(t, h, function (e) {
                        if (i.indexOf(e.key) >= 0) {
                            if (r) g(e);
                            n(e)
                        }
                    })
                }

                var n = document.createElement("style"), t;
                return n.textContent = ".picker_wrapper.no_alpha .picker_alpha{display:none}.picker_wrapper.no_editor .picker_editor{position:absolute;z-index:-1;opacity:0}.picker_wrapper.no_cancel .picker_cancel{display:none}.layout_default.picker_wrapper{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row wrap;-webkit-box-pack:justify;justify-content:space-between;-webkit-box-align:stretch;align-items:stretch;font-size:10px;width:25em;padding:.5em}.layout_default.picker_wrapper input,.layout_default.picker_wrapper button{font-size:1rem}.layout_default.picker_wrapper>*{margin:.5em}.layout_default.picker_wrapper::before{content:'';display:block;width:100%;height:0;-webkit-box-ordinal-group:2;order:1}.layout_default .picker_slider,.layout_default .picker_selector{padding:1em}.layout_default .picker_hue{width:100%}.layout_default .picker_sl{-webkit-box-flex:1;flex:1 1 auto}.layout_default .picker_sl::before{content:'';display:block;padding-bottom:100%}.layout_default .picker_editor{-webkit-box-ordinal-group:2;order:1;width:6.5rem}.layout_default .picker_editor input{width:100%;height:100%}.layout_default .picker_sample{-webkit-box-ordinal-group:2;order:1;-webkit-box-flex:1;flex:1 1 auto}.layout_default .picker_done,.layout_default .picker_cancel{-webkit-box-ordinal-group:2;order:1}.picker_wrapper{box-sizing:border-box;background:#f2f2f2;box-shadow:0 0 0 1px silver;cursor:default;font-family:sans-serif;color:#444;pointer-events:auto}.picker_wrapper:focus{outline:none}.picker_wrapper button,.picker_wrapper input{box-sizing:border-box;border:none;box-shadow:0 0 0 1px silver;outline:none}.picker_wrapper button:focus,.picker_wrapper button:active,.picker_wrapper input:focus,.picker_wrapper input:active{box-shadow:0 0 2px 1px dodgerblue}.picker_wrapper button{padding:.4em .6em;cursor:pointer;background-color:whitesmoke;background-image:-webkit-gradient(linear, left bottom, left top, from(gainsboro), to(transparent));background-image:linear-gradient(0deg, gainsboro, transparent)}.picker_wrapper button:active{background-image:-webkit-gradient(linear, left bottom, left top, from(transparent), to(gainsboro));background-image:linear-gradient(0deg, transparent, gainsboro)}.picker_wrapper button:hover{background-color:white}.picker_selector{position:absolute;z-index:1;display:block;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);border:2px solid white;border-radius:100%;box-shadow:0 0 3px 1px #67b9ff;background:currentColor;cursor:pointer}.picker_slider .picker_selector{border-radius:2px}.picker_hue{position:relative;background-image:-webkit-gradient(linear, left top, right top, from(red), color-stop(yellow), color-stop(lime), color-stop(cyan), color-stop(blue), color-stop(magenta), to(red));background-image:linear-gradient(90deg, red, yellow, lime, cyan, blue, magenta, red);box-shadow:0 0 0 1px silver}.picker_sl{position:relative;box-shadow:0 0 0 1px silver;background-image:-webkit-gradient(linear, left top, left bottom, from(white), color-stop(50%, rgba(255,255,255,0))),-webkit-gradient(linear, left bottom, left top, from(black), color-stop(50%, rgba(0,0,0,0))),-webkit-gradient(linear, left top, right top, from(gray), to(rgba(128,128,128,0)));background-image:linear-gradient(180deg, white, rgba(255,255,255,0) 50%),linear-gradient(0deg, black, rgba(0,0,0,0) 50%),linear-gradient(90deg, gray, rgba(128,128,128,0))}.picker_alpha,.picker_sample{position:relative;background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2' height='2'%3E%3Cpath d='M1,0H0V1H2V2H1' fill='lightgrey'/%3E%3C/svg%3E\") left top/contain white;box-shadow:0 0 0 1px silver}.picker_alpha .picker_selector,.picker_sample .picker_selector{background:none}.picker_editor input{font-family:monospace;padding:.2em .4em}.picker_sample::before{content:'';position:absolute;display:block;width:100%;height:100%;background:currentColor}.picker_arrow{position:absolute;z-index:-1}.picker_wrapper.popup{position:absolute;z-index:2;margin:1.5em}.picker_wrapper.popup,.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{background:#f2f2f2;box-shadow:0 0 10px 1px rgba(0,0,0,0.4)}.picker_wrapper.popup .picker_arrow{width:3em;height:3em;margin:0}.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{content:\"\";display:block;position:absolute;top:0;left:0;z-index:-99}.picker_wrapper.popup .picker_arrow::before{width:100%;height:100%;-webkit-transform:skew(45deg);transform:skew(45deg);-webkit-transform-origin:0 100%;transform-origin:0 100%}.picker_wrapper.popup .picker_arrow::after{width:150%;height:150%;box-shadow:none}.popup.popup_top{bottom:100%;left:0}.popup.popup_top .picker_arrow{bottom:0;left:0;-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.popup.popup_bottom{top:100%;left:0}.popup.popup_bottom .picker_arrow{top:0;left:0;-webkit-transform:rotate(90deg) scale(1, -1);transform:rotate(90deg) scale(1, -1)}.popup.popup_left{top:0;right:100%}.popup.popup_left .picker_arrow{top:0;right:0;-webkit-transform:scale(-1, 1);transform:scale(-1, 1)}.popup.popup_right{top:0;left:100%}.popup.popup_right .picker_arrow{top:0;left:0}", document.documentElement.firstElementChild.appendChild(n), function () {
                    function t(e) {
                        s(this, t);
                        this.settings = {
                            popup: "right",
                            layout: "default",
                            alpha: true,
                            editor: true,
                            editorFormat: "hex",
                            cancelButton: false,
                            defaultColor: "#0cf"
                        };
                        this._events = new i;
                        this.onChange = null;
                        this.onDone = null;
                        this.onOpen = null;
                        this.onClose = null;
                        this.setOptions(e)
                    }

                    e(t, [{
                        key: "setOptions", value: function e(t) {
                            var i = this;
                            if (!t) return;
                            var n = this.settings;

                            function r(e, t, i) {
                                for (var n in e) {
                                    if (i && i.indexOf(n) >= 0) continue;
                                    t[n] = e[n]
                                }
                            }

                            if (t instanceof HTMLElement) n.parent = t; else {
                                if (n.parent && t.parent && n.parent !== t.parent) {
                                    this._events.remove(n.parent);
                                    this._popupInited = false
                                }
                                r(t, n);
                                if (t.onChange) this.onChange = t.onChange;
                                if (t.onDone) this.onDone = t.onDone;
                                if (t.onOpen) this.onOpen = t.onOpen;
                                if (t.onClose) this.onClose = t.onClose;
                                var o = t.color || t.colour;
                                if (o) this._setColor(o)
                            }
                            var s = n.parent;
                            if (s && n.popup && !this._popupInited) {
                                var a = function e(t) {
                                    return i.openHandler(t)
                                };
                                this._events.add(s, "click", a);
                                p(this._events, s, [" ", "Spacebar", "Enter"], a);
                                this._popupInited = true
                            } else if (t.parent && !n.popup) this.show()
                        }
                    }, {
                        key: "openHandler", value: function e(t) {
                            if (this.show()) {
                                t && t.preventDefault();
                                this.settings.parent.style.pointerEvents = "none";
                                var i = t && t.type === h ? this._domEdit : this.domElement;
                                setTimeout(function () {
                                    return i.focus()
                                }, 100);
                                if (this.onOpen) this.onOpen(this.colour)
                            }
                        }
                    }, {
                        key: "closeHandler", value: function e(t) {
                            var i = t && t.type;
                            var n = false;
                            if (!t) n = true; else if (i === d || i === u) {
                                var r = (this.__containedEvent || 0) + 100;
                                if (t.timeStamp > r) n = true
                            } else {
                                g(t);
                                n = true
                            }
                            if (n && this.hide()) {
                                this.settings.parent.style.pointerEvents = "";
                                if (i !== d) this.settings.parent.focus();
                                if (this.onClose) this.onClose(this.colour)
                            }
                        }
                    }, {
                        key: "movePopup", value: function e(t, i) {
                            this.closeHandler();
                            this.setOptions(t);
                            if (i) this.openHandler()
                        }
                    }, {
                        key: "setColor", value: function e(t, i) {
                            this._setColor(t, {silent: i})
                        }
                    }, {
                        key: "_setColor", value: function e(t, i) {
                            if (typeof t === "string") t = t.trim();
                            if (!t) return;
                            i = i || {};
                            var n = void 0;
                            try {
                                n = new o(t)
                            } catch (e) {
                                if (i.failSilently) return;
                                throw e
                            }
                            if (!this.settings.alpha) {
                                var r = n.hsla;
                                r[3] = 1;
                                n.hsla = r
                            }
                            this.colour = this.color = n;
                            this._setHSLA(null, null, null, null, i)
                        }
                    }, {
                        key: "setColour", value: function e(t, i) {
                            this.setColor(t, i)
                        }
                    }, {
                        key: "show", value: function e() {
                            var t = this.settings.parent;
                            if (!t) return false;
                            if (this.domElement) {
                                var i = this._toggleDOM(true);
                                this._setPosition();
                                return i
                            }
                            var n = this.settings.template || '<div class="picker_wrapper" tabindex="-1"><div class="picker_arrow"></div><div class="picker_hue picker_slider"><div class="picker_selector"></div></div><div class="picker_sl"><div class="picker_selector"></div></div><div class="picker_alpha picker_slider"><div class="picker_selector"></div></div><div class="picker_editor"><input aria-label="Type a color name or hex value"/></div><div class="picker_sample"></div><div class="picker_done"><button>Ok</button></div><div class="picker_cancel"><button>Cancel</button></div></div>';
                            var r = l(n);
                            this.domElement = r;
                            this._domH = w(".picker_hue", r);
                            this._domSL = w(".picker_sl", r);
                            this._domA = w(".picker_alpha", r);
                            this._domEdit = w(".picker_editor input", r);
                            this._domSample = w(".picker_sample", r);
                            this._domOkay = w(".picker_done button", r);
                            this._domCancel = w(".picker_cancel button", r);
                            r.classList.add("layout_" + this.settings.layout);
                            if (!this.settings.alpha) r.classList.add("no_alpha");
                            if (!this.settings.editor) r.classList.add("no_editor");
                            if (!this.settings.cancelButton) r.classList.add("no_cancel");
                            this._ifPopup(function () {
                                return r.classList.add("popup")
                            });
                            this._setPosition();
                            if (this.colour) this._updateUI(); else this._setColor(this.settings.defaultColor);
                            this._bindEvents();
                            return true
                        }
                    }, {
                        key: "hide", value: function e() {
                            return this._toggleDOM(false)
                        }
                    }, {
                        key: "destroy", value: function e() {
                            this._events.destroy();
                            if (this.domElement) this.settings.parent.removeChild(this.domElement)
                        }
                    }, {
                        key: "_bindEvents", value: function e() {
                            var i = this;
                            var n = this, r = this.domElement, o = this._events;

                            function s(e, t, i) {
                                o.add(e, t, i)
                            }

                            s(r, "click", function (e) {
                                return e.preventDefault()
                            });
                            c(o, this._domH, function (e, t) {
                                return n._setHSLA(e)
                            });
                            c(o, this._domSL, function (e, t) {
                                return n._setHSLA(null, e, 1 - t)
                            });
                            if (this.settings.alpha) c(o, this._domA, function (e, t) {
                                return n._setHSLA(null, null, null, 1 - t)
                            });
                            var t = this._domEdit;
                            {
                                s(t, "input", function (e) {
                                    n._setColor(this.value, {fromEditor: true, failSilently: true})
                                });
                                s(t, "focus", function (e) {
                                    var t = this;
                                    if (t.selectionStart === t.selectionEnd) t.select()
                                })
                            }
                            this._ifPopup(function () {
                                var e = function e(t) {
                                    return i.closeHandler(t)
                                };
                                s(window, d, e);
                                s(window, u, e);
                                p(o, r, ["Esc", "Escape"], e);
                                var t = function e(t) {
                                    i.__containedEvent = t.timeStamp
                                };
                                s(r, d, t);
                                s(r, u, t);
                                s(i._domCancel, "click", e)
                            });
                            var a = function e(t) {
                                i._ifPopup(function () {
                                    return i.closeHandler(t)
                                });
                                if (i.onDone) i.onDone(i.colour)
                            };
                            s(this._domOkay, "click", a);
                            p(o, r, ["Enter"], a)
                        }
                    }, {
                        key: "_setPosition", value: function e() {
                            var i = this.settings.parent, n = this.domElement;
                            if (i !== n.parentNode) i.appendChild(n);
                            this._ifPopup(function (e) {
                                if (getComputedStyle(i).position === "static") i.style.position = "relative";
                                var t = e === true ? "popup_right" : "popup_" + e;
                                ["popup_top", "popup_bottom", "popup_left", "popup_right"].forEach(function (e) {
                                    if (e === t) n.classList.add(e); else n.classList.remove(e)
                                });
                                n.classList.add(t)
                            })
                        }
                    }, {
                        key: "_setHSLA", value: function e(t, i, n, r, o) {
                            o = o || {};
                            var s = this.colour, a = s.hsla;
                            [t, i, n, r].forEach(function (e, t) {
                                if (e || e === 0) a[t] = e
                            });
                            s.hsla = a;
                            this._updateUI(o);
                            if (this.onChange && !o.silent) this.onChange(s)
                        }
                    }, {
                        key: "_updateUI", value: function e(t) {
                            if (!this.domElement) return;
                            t = t || {};
                            var i = this.colour, n = i.hsla, r = "hsl(" + n[0] * y + ", 100%, 50%)", o = i.hslString,
                                s = i.hslaString;
                            var a = this._domH, l = this._domSL, c = this._domA, h = w(".picker_selector", a),
                                d = w(".picker_selector", l), u = w(".picker_selector", c);

                            function g(e, t, i) {
                                t.style.left = i * 100 + "%"
                            }

                            function p(e, t, i) {
                                t.style.top = i * 100 + "%"
                            }

                            g(a, h, n[0]);
                            this._domSL.style.backgroundColor = this._domH.style.color = r;
                            g(l, d, n[1]);
                            p(l, d, 1 - n[2]);
                            l.style.color = o;
                            p(c, u, 1 - n[3]);
                            var m = o, f = m.replace("hsl", "hsla").replace(")", ", 0)"),
                                C = "linear-gradient(" + [m, f] + ")";
                            this._domA.style.backgroundImage = C + ", " + b;
                            if (!t.fromEditor) {
                                var I = this.settings.editorFormat, v = this.settings.alpha;
                                var A = void 0;
                                switch (I) {
                                    case"rgb":
                                        A = i.printRGB(v);
                                        break;
                                    case"hsl":
                                        A = i.printHSL(v);
                                        break;
                                    default:
                                        A = i.printHex(v)
                                }
                                this._domEdit.value = A
                            }
                            this._domSample.style.color = s
                        }
                    }, {
                        key: "_ifPopup", value: function e(t, i) {
                            if (this.settings.parent && this.settings.popup) t && t(this.settings.popup); else i && i()
                        }
                    }, {
                        key: "_toggleDOM", value: function e(t) {
                            var i = this.domElement;
                            if (!i) return false;
                            var n = t ? "" : "none", r = i.style.display !== n;
                            if (r) i.style.display = n;
                            return r
                        }
                    }], [{
                        key: "StyleElement", get: function e() {
                            return n
                        }
                    }]);
                    return t
                }()
            }()
        }, 402: function (e, t) {
            "use strict";

            function i(e, t) {
                if (!(this instanceof i)) throw new SyntaxError("Constructor must be called with the new operator");
                this.message = e + " (char " + t + ")", this.char = t, this.stack = (new Error).stack
            }

            Object.defineProperty(t, "__esModule", {value: !0}), ((t.default = i).prototype = new Error).constructor = Error
        }, 3860: function (e, t, i) {
            e.exports = i(7490).default
        }, 7490: function (e, t, i) {
            "use strict";
            t.default = function (e) {
                v = "", A = 0, b = (I = e).charAt(0), y = "", w = u, E();
                var t = w;
                if (_(), R(), "" === y) return v;
                if (t === w && k()) {
                    for (var i = ""; t === w && k();) v = (0, o.insertBeforeLastWhitespace)(v, ","), i += v, v = "", _(), R();
                    return "[\n".concat(i).concat(v, "\n]")
                }
                throw new r.default("Unexpected characters", A - y.length)
            };
            var n, r = (n = i(402)) && n.__esModule ? n : {default: n}, o = i(9422);
            var s = 0, a = 1, l = 2, c = 3, h = 4, d = 5, u = 6,
                g = {"": !0, "{": !0, "}": !0, "[": !0, "]": !0, ":": !0, ",": !0, "(": !0, ")": !0, ";": !0, "+": !0},
                p = {'"': '"', "\\": "\\", "/": "/", b: "\b", f: "\f", n: "\n", r: "\r", t: "\t"},
                m = {"\b": "\\b", "\f": "\\f", "\n": "\\n", "\r": "\\r", "\t": "\\t"},
                f = {null: "null", true: "true", false: "false"}, C = {None: "null", True: "true", False: "false"},
                I = "", v = "", A = 0, b = "", y = "", w = u;

            function S() {
                A++, b = I.charAt(A)
            }

            function x() {
                S(), "\\" === b && S()
            }

            function k() {
                return w === s && ("[" === y || "{" === y) || w === l || w === a || w === c
            }

            function E() {
                v += y, w = u, y = "", g[b] ? (w = s, y = b, S()) : function () {
                    if ((0, o.isDigit)(b) || "-" === b) {
                        if (w = a, "-" === b) {
                            if (y += b, S(), !(0, o.isDigit)(b)) throw new r.default("Invalid number, digit expected", A)
                        } else "0" === b && (y += b, S());
                        for (; (0, o.isDigit)(b);) y += b, S();
                        if ("." === b) {
                            if (y += b, S(), !(0, o.isDigit)(b)) throw new r.default("Invalid number, digit expected", A);
                            for (; (0, o.isDigit)(b);) y += b, S()
                        }
                        if ("e" === b || "E" === b) {
                            if (y += b, S(), "+" !== b && "-" !== b || (y += b, S()), !(0, o.isDigit)(b)) throw new r.default("Invalid number, digit expected", A);
                            for (; (0, o.isDigit)(b);) y += b, S()
                        }
                    } else "\\" === b && '"' === I.charAt(A + 1) ? (S(), T(x)) : T(S)
                }(), w === h && (y = (0, o.normalizeWhitespace)(y), E()), w === d && (w = u, y = "", E())
            }

            function R() {
                "," === y && (y = "", w = u, E())
            }

            function T(e) {
                if ((0, o.isQuote)(b)) {
                    var t = (0, o.normalizeQuote)(b), i = (0, o.isSingleQuote)(b) ? o.isSingleQuote : o.isDoubleQuote;
                    for (y += '"', w = l, e(); "" !== b && !i(b);) if ("\\" === b) if (e(), void 0 !== p[b]) y += "\\" + b, e(); else if ("u" === b) {
                        y += "\\u", e();
                        for (var n = 0; n < 4; n++) {
                            if (!(0, o.isHex)(b)) throw new r.default("Invalid unicode character", A - y.length);
                            y += b, e()
                        }
                    } else {
                        if ("'" !== b) throw new r.default('Invalid escape character "\\' + b + '"', A);
                        y += "'", e()
                    } else m[b] ? y += m[b] : y += '"' === b ? '\\"' : b, e();
                    if ((0, o.normalizeQuote)(b) !== t) throw new r.default("End of string expected", A - y.length);
                    return y += '"', void e()
                }
                !function () {
                    if ((0, o.isAlpha)(b)) for (w = c; (0, o.isAlpha)(b) || (0, o.isDigit)(b) || "$" === b;) y += b, S(); else !function () {
                        if ((0, o.isWhitespace)(b) || (0, o.isSpecialWhitespace)(b)) for (w = h; (0, o.isWhitespace)(b) || (0, o.isSpecialWhitespace)(b);) y += b, S(); else !function () {
                            if ("/" !== b || "*" !== I[A + 1]) if ("/" !== b || "/" !== I[A + 1]) !function () {
                                w = u;
                                for (; "" !== b;) y += b, S();
                                throw new r.default('Syntax error in part "' + y + '"', A - y.length)
                            }(); else for (w = d; "" !== b && "\n" !== b;) y += b, S(); else {
                                for (w = d; "" !== b && ("*" !== b || "*" === b && "/" !== I[A + 1]);) y += b, S();
                                "*" === b && "/" === I[A + 1] && (y += b, S(), y += b, S())
                            }
                        }()
                    }()
                }()
            }

            function _() {
                if (w !== s || "{" !== y) !function () {
                    if (w !== s || "[" !== y) !function () {
                        if (w !== l) (w !== a ? function () {
                            if (w !== c) !function () {
                                throw"" === y ? new r.default("Unexpected end of json string", A - y.length) : new r.default("Value expected", A - y.length)
                            }(); else if (f[y]) E(); else {
                                if (C[y]) return y = C[y], E();
                                var e = y, t = v.length;
                                if (y = "", E(), w === s && "(" === y) return y = "", E(), _(), w === s && ")" === y && (y = "", E(), w === s && ";" === y && (y = "", E()));
                                for (v = (0, o.insertAtIndex)(v, '"'.concat(e), t); w === c || w === a;) E();
                                v += '"'
                            }
                        } : E)(); else for (E(); w === s && "+" === y;) {
                            var e;
                            y = "", E(), w === l && (e = v.lastIndexOf('"'), v = v.substring(0, e) + y.substring(1), y = "", E())
                        }
                    }(); else if (E(), w !== s || "]" !== y) {
                        for (; ;) if (_(), w === s && "," === y) {
                            if (E(), w === s && "]" === y) {
                                v = (0, o.stripLastOccurrence)(v, ",");
                                break
                            }
                            if ("" === y) {
                                v = (0, o.stripLastOccurrence)(v, ",");
                                break
                            }
                        } else {
                            if (!k()) break;
                            v = (0, o.insertBeforeLastWhitespace)(v, ",")
                        }
                        w === s && "]" === y ? E() : v = (0, o.insertBeforeLastWhitespace)(v, "]")
                    } else E()
                }(); else if (E(), w !== s || "}" !== y) {
                    for (; ;) {
                        if (w !== c && w !== a || (w = l, y = '"'.concat(y, '"')), w !== l) throw new r.default("Object key expected", A - y.length);
                        if (E(), w === s && ":" === y) E(); else {
                            if (!k()) throw new r.default("Colon expected", A - y.length);
                            v = (0, o.insertBeforeLastWhitespace)(v, ":")
                        }
                        if (_(), w === s && "," === y) {
                            if (E(), w === s && "}" === y) {
                                v = (0, o.stripLastOccurrence)(v, ",");
                                break
                            }
                            if ("" === y) {
                                v = (0, o.stripLastOccurrence)(v, ",");
                                break
                            }
                        } else {
                            if (w !== l && w !== a && w !== c) break;
                            v = (0, o.insertBeforeLastWhitespace)(v, ",")
                        }
                    }
                    w === s && "}" === y ? E() : v = (0, o.insertBeforeLastWhitespace)(v, "}")
                } else E()
            }
        }, 9422: function (e, t) {
            "use strict";
            Object.defineProperty(t, "__esModule", {value: !0}), t.isAlpha = function (e) {
                return r.test(e)
            }, t.isHex = function (e) {
                return o.test(e)
            }, t.isDigit = function (e) {
                return s.test(e)
            }, t.isWhitespace = a, t.isSpecialWhitespace = l, t.normalizeWhitespace = function (e) {
                for (var t = "", i = 0; i < e.length; i++) {
                    var n = e[i];
                    t += l(n) ? " " : n
                }
                return t
            }, t.isQuote = function (e) {
                return !0 === i[e] || !0 === n[e]
            }, t.isSingleQuote = function (e) {
                return !0 === i[e]
            }, t.isDoubleQuote = function (e) {
                return !0 === n[e]
            }, t.normalizeQuote = function (e) {
                return !0 !== i[e] ? !0 !== n[e] ? e : '"' : "'"
            }, t.stripLastOccurrence = function (e, t) {
                t = e.lastIndexOf(t);
                return -1 !== t ? e.substring(0, t) + e.substring(t + 1) : e
            }, t.insertBeforeLastWhitespace = function (e, t) {
                var i = e.length;
                if (!a(e[i - 1])) return e + t;
                for (; a(e[i - 1]);) i--;
                return e.substring(0, i) + t + e.substring(i)
            }, t.insertAtIndex = function (e, t, i) {
                return e.substring(0, i) + t + e.substring(i)
            };
            var i = {"'": !0, "‘": !0, "’": !0, "`": !0, "´": !0}, n = {'"': !0, "“": !0, "”": !0};
            var r = /^[a-zA-Z_]$/;
            var o = /^[0-9a-fA-F]$/;
            var s = /^[0-9]$/;

            function a(e) {
                return " " === e || "\t" === e || "\n" === e || "\r" === e
            }

            function l(e) {
                return " " === e || " " <= e && e <= " " || " " === e || " " === e || " " === e
            }
        }, 894: function (e) {
            "use strict";
            e.exports = JSON.parse('{"$schema":"http://json-schema.org/draft-07/schema#","$id":"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#","description":"Meta-schema for $data reference (JSON Schema extension proposal)","type":"object","required":["$data"],"properties":{"$data":{"type":"string","anyOf":[{"format":"relative-json-pointer"},{"format":"json-pointer"}]}},"additionalProperties":false}')
        }, 7171: function (e) {
            "use strict";
            e.exports = JSON.parse('{"id":"http://json-schema.org/draft-04/schema#","$schema":"http://json-schema.org/draft-04/schema#","description":"Core schema meta-schema","definitions":{"schemaArray":{"type":"array","minItems":1,"items":{"$ref":"#"}},"positiveInteger":{"type":"integer","minimum":0},"positiveIntegerDefault0":{"allOf":[{"$ref":"#/definitions/positiveInteger"},{"default":0}]},"simpleTypes":{"enum":["array","boolean","integer","null","number","object","string"]},"stringArray":{"type":"array","items":{"type":"string"},"minItems":1,"uniqueItems":true}},"type":"object","properties":{"id":{"type":"string"},"$schema":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"default":{},"multipleOf":{"type":"number","minimum":0,"exclusiveMinimum":true},"maximum":{"type":"number"},"exclusiveMaximum":{"type":"boolean","default":false},"minimum":{"type":"number"},"exclusiveMinimum":{"type":"boolean","default":false},"maxLength":{"$ref":"#/definitions/positiveInteger"},"minLength":{"$ref":"#/definitions/positiveIntegerDefault0"},"pattern":{"type":"string","format":"regex"},"additionalItems":{"anyOf":[{"type":"boolean"},{"$ref":"#"}],"default":{}},"items":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/schemaArray"}],"default":{}},"maxItems":{"$ref":"#/definitions/positiveInteger"},"minItems":{"$ref":"#/definitions/positiveIntegerDefault0"},"uniqueItems":{"type":"boolean","default":false},"maxProperties":{"$ref":"#/definitions/positiveInteger"},"minProperties":{"$ref":"#/definitions/positiveIntegerDefault0"},"required":{"$ref":"#/definitions/stringArray"},"additionalProperties":{"anyOf":[{"type":"boolean"},{"$ref":"#"}],"default":{}},"definitions":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"properties":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"patternProperties":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"dependencies":{"type":"object","additionalProperties":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/stringArray"}]}},"enum":{"type":"array","minItems":1,"uniqueItems":true},"type":{"anyOf":[{"$ref":"#/definitions/simpleTypes"},{"type":"array","items":{"$ref":"#/definitions/simpleTypes"},"minItems":1,"uniqueItems":true}]},"format":{"type":"string"},"allOf":{"$ref":"#/definitions/schemaArray"},"anyOf":{"$ref":"#/definitions/schemaArray"},"oneOf":{"$ref":"#/definitions/schemaArray"},"not":{"$ref":"#"}},"dependencies":{"exclusiveMaximum":["maximum"],"exclusiveMinimum":["minimum"]},"default":{}}')
        }, 6273: function (e) {
            "use strict";
            e.exports = JSON.parse('{"$schema":"http://json-schema.org/draft-06/schema#","$id":"http://json-schema.org/draft-06/schema#","title":"Core schema meta-schema","definitions":{"schemaArray":{"type":"array","minItems":1,"items":{"$ref":"#"}},"nonNegativeInteger":{"type":"integer","minimum":0},"nonNegativeIntegerDefault0":{"allOf":[{"$ref":"#/definitions/nonNegativeInteger"},{"default":0}]},"simpleTypes":{"enum":["array","boolean","integer","null","number","object","string"]},"stringArray":{"type":"array","items":{"type":"string"},"uniqueItems":true,"default":[]}},"type":["object","boolean"],"properties":{"$id":{"type":"string","format":"uri-reference"},"$schema":{"type":"string","format":"uri"},"$ref":{"type":"string","format":"uri-reference"},"title":{"type":"string"},"description":{"type":"string"},"default":{},"examples":{"type":"array","items":{}},"multipleOf":{"type":"number","exclusiveMinimum":0},"maximum":{"type":"number"},"exclusiveMaximum":{"type":"number"},"minimum":{"type":"number"},"exclusiveMinimum":{"type":"number"},"maxLength":{"$ref":"#/definitions/nonNegativeInteger"},"minLength":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"pattern":{"type":"string","format":"regex"},"additionalItems":{"$ref":"#"},"items":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/schemaArray"}],"default":{}},"maxItems":{"$ref":"#/definitions/nonNegativeInteger"},"minItems":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"uniqueItems":{"type":"boolean","default":false},"contains":{"$ref":"#"},"maxProperties":{"$ref":"#/definitions/nonNegativeInteger"},"minProperties":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"required":{"$ref":"#/definitions/stringArray"},"additionalProperties":{"$ref":"#"},"definitions":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"properties":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"patternProperties":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"dependencies":{"type":"object","additionalProperties":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/stringArray"}]}},"propertyNames":{"$ref":"#"},"const":{},"enum":{"type":"array","minItems":1,"uniqueItems":true},"type":{"anyOf":[{"$ref":"#/definitions/simpleTypes"},{"type":"array","items":{"$ref":"#/definitions/simpleTypes"},"minItems":1,"uniqueItems":true}]},"format":{"type":"string"},"allOf":{"$ref":"#/definitions/schemaArray"},"anyOf":{"$ref":"#/definitions/schemaArray"},"oneOf":{"$ref":"#/definitions/schemaArray"},"not":{"$ref":"#"}},"default":{}}')
        }, 6680: function (e) {
            "use strict";
            e.exports = JSON.parse('{"$schema":"http://json-schema.org/draft-07/schema#","$id":"http://json-schema.org/draft-07/schema#","title":"Core schema meta-schema","definitions":{"schemaArray":{"type":"array","minItems":1,"items":{"$ref":"#"}},"nonNegativeInteger":{"type":"integer","minimum":0},"nonNegativeIntegerDefault0":{"allOf":[{"$ref":"#/definitions/nonNegativeInteger"},{"default":0}]},"simpleTypes":{"enum":["array","boolean","integer","null","number","object","string"]},"stringArray":{"type":"array","items":{"type":"string"},"uniqueItems":true,"default":[]}},"type":["object","boolean"],"properties":{"$id":{"type":"string","format":"uri-reference"},"$schema":{"type":"string","format":"uri"},"$ref":{"type":"string","format":"uri-reference"},"$comment":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"default":true,"readOnly":{"type":"boolean","default":false},"examples":{"type":"array","items":true},"multipleOf":{"type":"number","exclusiveMinimum":0},"maximum":{"type":"number"},"exclusiveMaximum":{"type":"number"},"minimum":{"type":"number"},"exclusiveMinimum":{"type":"number"},"maxLength":{"$ref":"#/definitions/nonNegativeInteger"},"minLength":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"pattern":{"type":"string","format":"regex"},"additionalItems":{"$ref":"#"},"items":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/schemaArray"}],"default":true},"maxItems":{"$ref":"#/definitions/nonNegativeInteger"},"minItems":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"uniqueItems":{"type":"boolean","default":false},"contains":{"$ref":"#"},"maxProperties":{"$ref":"#/definitions/nonNegativeInteger"},"minProperties":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"required":{"$ref":"#/definitions/stringArray"},"additionalProperties":{"$ref":"#"},"definitions":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"properties":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"patternProperties":{"type":"object","additionalProperties":{"$ref":"#"},"propertyNames":{"format":"regex"},"default":{}},"dependencies":{"type":"object","additionalProperties":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/stringArray"}]}},"propertyNames":{"$ref":"#"},"const":true,"enum":{"type":"array","items":true,"minItems":1,"uniqueItems":true},"type":{"anyOf":[{"$ref":"#/definitions/simpleTypes"},{"type":"array","items":{"$ref":"#/definitions/simpleTypes"},"minItems":1,"uniqueItems":true}]},"format":{"type":"string"},"contentMediaType":{"type":"string"},"contentEncoding":{"type":"string"},"if":{"$ref":"#"},"then":{"$ref":"#"},"else":{"$ref":"#"},"allOf":{"$ref":"#/definitions/schemaArray"},"anyOf":{"$ref":"#/definitions/schemaArray"},"oneOf":{"$ref":"#/definitions/schemaArray"},"not":{"$ref":"#"}},"default":true}')
        }
    }, r = {}, n.amdD = function () {
        throw new Error("define cannot be used indirect")
    }, n.n = function (e) {
        var t = e && e.__esModule ? function () {
            return e.default
        } : function () {
            return e
        };
        return n.d(t, {a: t}), t
    }, n.d = function (e, t) {
        for (var i in t) n.o(t, i) && !n.o(e, i) && Object.defineProperty(e, i, {enumerable: !0, get: t[i]})
    }, n.o = function (e, t) {
        return Object.prototype.hasOwnProperty.call(e, t)
    }, n.r = function (e) {
        "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {value: "Module"}), Object.defineProperty(e, "__esModule", {value: !0})
    }, n.nmd = function (e) {
        return e.paths = [], e.children || (e.children = []), e
    }, n(3161);

    function n(e) {
        var t = r[e];
        if (void 0 !== t) return t.exports;
        t = r[e] = {id: e, loaded: !1, exports: {}};
        return i[e].call(t.exports, t, t.exports, n), t.loaded = !0, t.exports
    }

    var i, r
});
//# sourceMappingURL=jsoneditor.map